diff --git a/.cspell.json b/.cspell.json new file mode 100644 index 000000000..7c0484186 --- /dev/null +++ b/.cspell.json @@ -0,0 +1,25 @@ +{ + // Enable your dictionary by adding it to the list of `dictionaries` + "dictionaries": [ + "core-glossary" + ], + "ignoreWords": [ + "skip-list" + ], + // Tell CSpell about your dictionary + "dictionaryDefinitions": [ + { + "name": "core-glossary", + // Path to the custom word file. Relative to this `cspell.json` file. + "path": "./.style/core-glossary.txt", + // Some editor extensions will use `addWords` for adding words to your + // personal dictionary. + "addWords": true + }, + { + "name": "skip-list", //these aren't glossary words, but shouldn't be spell checked away + "path": "./.style/skip-list.txt", + "addWords": true + } + ] +} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..f7bcb7978 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "extends": ["plugin:mdx/recommended"], + // optional, if you want to lint code blocks at the same time + "settings": { + "mdx/code-blocks": true, + // optional, if you want to disable language mapper, set it to `false` + // if you want to override the default language mapper inside, you can provide your own + "mdx/language-mapper": {} + } +} diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..bc5fb189f --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,8 @@ +# These owners will be the default owners for everything in the repo. Unless a later match takes precedence, @global-owner1 and @global-owner2 will be requested for review when someone opens a pull request. + +@slsriehl @bigcommerce/dev-docs-team @markcmurphy + +# Teams can be specified as code owners as well. Teams should +# be identified in the format @org/team-name. Teams must have +# explicit write access to the repository. In this example, +# the octocats team in the octo-org organization owns all .md files. diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 000000000..9c93afdc7 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,25 @@ +name: Deploy + +on: + push: + branches: + - main + workflow_dispatch: + inputs: + buildWithCache: + description: 'Build with cache' + default: true + required: false + type: boolean + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Trigger Vercel Deploy Hook + run: | + curl -X POST ${{ secrets.VERCEL_DEPLOY_HOOK_URL }}?buildCache=${{ inputs.buildWithCache }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..a5116758f --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,16 @@ +name: lint-valid-mdx +on: + - pull_request + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js v18.x + uses: actions/setup-node@v3 + with: + node-version: 18.x + - run: npm ci + - run: npm run lint diff --git a/.github/workflows/retext-style-guide.yml b/.github/workflows/retext-style-guide.yml new file mode 100644 index 000000000..acc49ea33 --- /dev/null +++ b/.github/workflows/retext-style-guide.yml @@ -0,0 +1,15 @@ +name: remark +on: [pull_request] +jobs: + remark: + name: runner / retext-style-guide + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: quality-docs-github-check + uses: bigcommerce/dev-docs-style-guide-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + reporter: github-pr-review + level: warning + filter_mode: added diff --git a/.github/workflows/spectral.yml b/.github/workflows/spectral.yml new file mode 100644 index 000000000..35223438c --- /dev/null +++ b/.github/workflows/spectral.yml @@ -0,0 +1,17 @@ +name: Run Spectral on Pull Requests +on: + - pull_request +jobs: + build: + name: Run Spectral + runs-on: ubuntu-latest + steps: + # Check out the repository + - uses: actions/checkout@v2 + + # Run Spectral + - uses: stoplightio/spectral-action@latest + with: + file_glob: 'reference/*.yml' + spectral_ruleset: '.spectral.yaml' + \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..13566b81b --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/api-specs.iml b/.idea/api-specs.iml new file mode 100644 index 000000000..c956989b2 --- /dev/null +++ b/.idea/api-specs.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..3c032078a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +18 diff --git a/.spectral.yaml b/.spectral.yaml new file mode 100644 index 000000000..ca464d46e --- /dev/null +++ b/.spectral.yaml @@ -0,0 +1,114 @@ +extends: spectral:oas +rules: + info-contact: off + oas3-unused-component: off + oas2-unused-definition: off +except: + 'reference/tax_provider.yml': + - oas3-schema + 'reference/carts.v3.yml': + - oas2-oneOf + - oas2-valid-schema-example + - operation-tag-defined + 'reference/catalog.v3.yml': + - oas2-operation-security-defined + - oas3-schema + - oas2-schema + - oas2-valid-media-example + - oas2-valid-schema-example + 'reference/channels.v3.yml': + - operation-operationId + - oas3-schema + - oas3-valid-media-example + 'reference/current_customer.yml': + - operation-success-response + 'reference/custom-template-associations.v3.yml': + - openapi-tags + - operation-tag-defined + 'reference/customer_login.yml': + - operation-operationId + - operation-success-response + 'reference/email_templates.v3.yml': + - oas3-schema + - operation-tag-defined + - openapi-tags + 'reference/geography.v2.yml': + - operation-operationId + - oas2-valid-media-example + 'reference/orders.v2.oas2.yml': + - oas3-valid-schema-example + - oas3-valid-media-example + - oas3-schema + 'reference/orders.v3.yml': + - oas2-valid-schema-example + - oas2-valid-media-example + - oas2-anyOf + 'reference/settings.v3.yml': + - oas3-valid-media-example + - operation-operationId + 'reference/sites.v3.yml': + - oas2-valid-media-example + - operation-operationId + 'reference/store_information.v2.yml': + - oas2-valid-media-example + - operation-operationId + - oas2-valid-schema-example + 'reference/themes.v3.yml': + - oas3-schema + - operation-operationId + 'reference/webhooks.v3.yml': + - oas3-valid-media-example + 'carts.v3.yml': + - oas2-oneOf + - oas2-valid-schema-example + - operation-tag-defined + 'catalog.v3.yml': + - oas2-operation-security-defined + - oas3-schema + - oas2-schema + - oas2-valid-media-example + - oas2-valid-schema-example + 'channels.v3.yml': + - operation-operationId + - oas3-schema + - oas3-valid-media-example + 'current_customer.yml': + - operation-success-response + 'custom-template-associations.v3.yml': + - openapi-tags + - operation-tag-defined + 'customer_login.yml': + - operation-success-response + 'email_templates.v3.yml': + - oas3-schema + - operation-tag-defined + - openapi-tags + 'geography.v2.yml': + - operation-operationId + - oas2-valid-media-example + 'orders.v2.oas2.yml': + - oas3-valid-schema-example + - oas3-valid-media-example + - oas3-schema + 'orders.v3.yml': + - oas2-valid-schema-example + - oas2-valid-media-example + - oas2-anyOf + 'settings.v3.yml': + - oas3-valid-media-example + - operation-operationId + 'sites.v3.yml': + - oas2-valid-media-example + - operation-operationId + 'store_information.v2.yml': + - oas2-valid-media-example + - operation-operationId + - oas2-valid-schema-example + 'themes.v3.yml': + - oas3-schema + - operation-operationId + 'webhooks.v3.yml': + - oas3-valid-media-example + 'pages.v3.yml': + - oas3-valid-media-example + - oas3-valid-schema-example diff --git a/.style/.spelling b/.style/.spelling new file mode 100644 index 000000000..3f3dd850d --- /dev/null +++ b/.style/.spelling @@ -0,0 +1,803 @@ +# markdown-spellcheck spelling configuration file +# Format - lines beginning # are comments +# global dictionary is at the start, file overrides afterwards +# one word per line, to define a file override use ' - filename' +# where filename is relative to this configuration file + +############################################################################### +# Technical +############################################################################### +page.html +ordinalize +ordinalized +Sitemap +6.x +5.x +viewport +stencil-cli +stringify +srcset +sitemap +falsy +truthy +stencil-utils +dropzones +dropzone +Dropzones +Dropzone +onReady +Xcode +BitBucket +Node.js +libsass +Browsersync +PowerShell +distro +Rebillia +Atlassian +Metadata +metadata +scss +prepended +automator +truncatedText +u-textTruncate +html + +############################################################################### +# Files +############################################################################### +categories.html +_foundation.scss + +schema.json +json.zip +theme.scss +_foundation.scss +foobar.scss +api.js +writeReview.html +sidebar.html +webpack.conf.js +app.js +CouponDrawer.js +webpack.conf.js +base.html +.js +.html +_foundation.scss +handlebars.js +handlebars.js. +checkout.js +checkout.js. +checkout.html + +############################################################################### +# Parameters and Code +############################################################################### +PageManager +delete_url +queryString +edit_url +last_4 +bigpay_token +address_line_1 +address_line_2 +country_code +country_name +postal_code +default_instrument +addressBox +addReturn +facetLabel +facetedSearch +writeReview +stencilFontFamily +stencilFontFamily +productView +stencilColor +toggleLink +quickView +socialLinks +productReviews +navUser +navPages +productCarousel +heroCarousel +Akamai +inlined +stylesheet +Stylesheet +electrongjs.org +widget_configuration +widget_template +placements +image_source +changelog +mixin +mixins +preprocessor +WordPress +Dev +Mixins +list_items +category.html +giftcertificates.php +Disqus +Analytics +analytics +uninstallation +auto_uninstall +sitemap.php +programmatically +home.html +product.html +handlebars.js +config.json +APIs +stencilString +BigCommerce +stencilFontWeight +stencilNumber +config.json. +storefronts +stencilImage +int +jQuery +CORs +storefront +OAuth +upsell +XMLHttpRequest +polyfill +eCommerce +CaaS +line_items +option_id +optionValue +variantID +modifierID +qty +order_quantity_minimum +order_quantity_maximum +Webhooks +catalog +webhooks +v2 +v3 +BigDesign +Klarna +plugin +customer_id +json +standalone +Elasticsearch +keychain +ShipperHQ +upsert +SKUs +metafields +ebooks +WebDav +multipart +callout +favor +Color +colors +color +dropdown +fulfills +purchasability +unprocessable +redirect_to +request_ip +customers_login +JWT.io +jwt.io +timestamp +timeframe +signup +whitepaper +multisite +backend +SDKs +Mastercard +SAQs +BloomReach +Sitecore +GraphQL +wishlist +wishlists +X-Auth-Client +X-Auth-Token +StackOverflow +config +Auth +hostname +store_v2_customers_login +store_v2_information +store_v2_information_read_only +tax_classes +store_v2_marketing +gift_certificates +store_v2_marketing_read_only +store_v2_orders +order_statuses +store_v2_orders_read_only +store_v2_transactions +store_v2_transactions_read_only +store_payments_access_token_create +access_tokens +store_payments_methods_read +store_v2_products +pricelists +store_v2_products_read_only +store_themes_manage +store_themes_read_only +store_cart +store_cart_read_only +store_checkout +store_checkout_read_only +store_sites +channel_id +site_id +store_sites_read_only +store_channel_settings +store_channel_settings_read_only +store_channel_listings +store_channel_listings_read_only +store_storefront_api +api-token +store_storefront_api_customer_impersonation +api-token-customer-impersonation +Limts +webhook +URIs +iFrame +client_id +AngularJS +dialog +client_secret +grant_type +authorization_code +redirect_uri +access_token +cleanup +base64 +url-encoded +signed_payload +encoded_json_string +base64url +encoded_hmac_signature +hash_equals +hello-world-app-php-silex +npm +iFrames +JitBit +ngrok +Laravel +ebook +store_id +is_active +created_at +updated_at +localhost +lowercase +webpage +sudo +previous_status_id +new_status_id +order_message_id +variant_id +cart_line_item +couponId +orderId +sellable +product_options +product_option +price_inc_tax +price_ex_tax +base_price +fulfill +honor +order_id +WebDAV +first_name +last_name +street_1 +country_iso2 +shipping_addresses +order_address_id +shipping_provider +Avalara +discount_amount +shipping_cost_ex_tax +shipping_cost_inc_tax +handling_cost_ex_tax +handling_cost_inc_tax +wrapping_cost_ex_tax +wrapping_cost_inc_tax +billing_address +Pickup +Fulfillment +onboarding +taglines +tagline +DevTools +Vimeo +enablement +devtools.bigcommerce.com +prefilling +re-pricers +express-installable +natively +installable +Braintree +repo +pre-configuring +boolean +namespace +checkbox +checkboxes +UTF-8 +preconfigured +gzip +runtime +TLS-encrypted +dev +lifecycle +i.e. +filename +repurpose +Authorize.net +CyberSource +Paymetric +CardConnect +eWAY +Payeezy +MyVirtualMerchant +Payflow +Protx +QuickBooks +SecureNet +Worldpay +WorldPay +ePay +offsite +Adyen +last_four +verfication_value +payment_method_id +cardholder_name +expiry_month +expiry_year +verification_value +permission_set +enum +resource_type +resource_id +date_created +metafieldʼs +date_modified +metafield +shipping.shipperhq +dropshipper +bigcommerce.github.io +github.com +support.bigcommerce.com +devhints.io +npmjs.com +order_confirmation +all_pages +re-useable +frontend +widget_template_uuid +image_urlimage_source +placementsentity_id +e.g. +aggregator +subfolders +footer.html +merchant-customizable +imageDimension +customizable +GeoTrust +Olark +Bluecheck +Addrexx +Rebilla +webpack +ReactJS +Quickstart +async +breakpoint +Zipfile +Zipfileʼs +substeps +spacebar +prepending +test.jpg +jpg +jpeg +png +gif +filetypes +reCAPTCHA +v1 +invoice_email.html +invoice_printable.zip +CyberDuck +prefilled +invoice.html +PrintableDetailedInvoice.html +amp.html +Platform.js +carousel.html +new.html +en.json +navigation.html +viewports +templating +templated +theming +Donʼts +SitePoint +Treehouse +chocolatey.org +debian-based +distros +Un-Descriptive +jspm-based +NVM_DIR +bash_profile +nvm +filenames +sourcemap +product.js +cart.js +goruck.com +PageManager.before +stylesheets +cookieNotification.js +datepicker +initReact +VerticalLinearStepper.js +Material-UI +jsContext +CouponDrawer +VerticalLinearStepper +cart.itemAdd +cart.getContent +U.S. +Conversio +subtags +Subtag +with_tax +without_tax +non_sale_price_with_tax +non_sale_price_without_tax +rrp_with_tax +rrp_without_tax +tax_label +price_range +retail_price_range +product.price +add_to_cart_url +date_added +pre_order +show_cart_action +has_options +stock_level +low_stock_level +qty_in_cart +custom_fields +num_reviews +out_of_stock_message +release_date +product.videos +product.videos.limit +product.images +product.images.limit +active_currency_id +active_currency_flag +active_currency_name +active_currency_code +account_new_return +account_addressbook +account_downloaditem +account_inbox +account_orderstatus +account_orders +invoice_print +account_order +account_recentitems +account_saved_return +account_returns +createaccount_thanks +createaccount +forgotpassword +getnewpassword +blog_post +giftcertificates_balance +giftcertificates +giftcertificates_redeem +page_contact_form +newsletter_subscribe +account_creation_enabled +show_product_rating +show_product_reviews +show_newsletter_box +gift_certificates_enabled +blog_enabled +data_tag_enabled +enhanced_ecommerce +show_wishlist +base_url +client_ip_address +referer +user_agent +is_crawler +absolute_path +request.path +secure_base_url +SSL-enabled +store_name +store_logo +privacy_cookie +save_new_return +update_action +send_message +add_address +recent_items +gift_certificate +check_login +create_account +save_new_account +forgot_password +send_password_email +save_new_password +post_review +single_address +multiple_address +new_atom +popular_atom +featured_atom +search_atom +blog_atom +contact_us_submit +currency_token +currency_location +decimal_token +decimal_places +thousands_token +returns_enabled +add_this +AddThis +facebook +textTruncate +Customizer +Roadmap +LinkedIn +Shortcodes +Shortcode +shortcode +AdminPrelaunchNotice +AdminMaintenanceNotice +AdminHibernationModeNotice +phone_number +rss_item_limit +password_requirements +minlength +store_time_zone +store_dst_correction +display_date_format +extended_display_date_format +show_payment_methods +payments_url +secure_host +store_hash +is_eu_ip_address +IP +show_newsletter_summary +newsletter_summary +amp_analytics_id +bulk_discount_enabled +whitelisted +StencilImage +Imgix +image.jpg +subfolder +layout.html +Stringifies +camelCases +camelcase +whitespace +Lowercases +PascalCases +snake_cases +Uppercases +un-encoded +stringified +tabs.html +compare.html +add_url +display_name +billing_fields +purchase.html +order_confirmation_content +checkout_head +header_image +getCartQuantity +itemAdd +utils.api.cart.itemAdd +getItemGiftWrappingOptions +submitItemGiftWrappingOption +getContent +refreshContent +getShippingQuotes +submitShippingQutoes +submitShippingQuote +applyCode +applyGiftCertificate +getById +getByName +optionChange +configureInCart +product.getById +postfixed +_foundation.scss. +un-optimized +Zurb +product.html. +this.page.identifier +SSO +params +headlessly +JWT +sku +SKU +sh1 +product_id +DTS +ui +pci +postData +cartItems +bigcommerce.com +developers.bigcommerce.com +JSON.stringify +variantId +optionId +optionValues +cartId +deleteCartItem +GitHub +itemId +checkoutId +lineItems +lineItem +S-2-S +https +video_id +SM-BLU +SM-MED +SM-LARG +BLACK-2L +BLACK-3L +YELLOW-2L +YELLOW-3L +YELLOW-8L +product_id +JWT.IO +IdP +customer_login +store_hash +account.php. +login.php +JWT.io. +iss +iat +jti +xml +store_v2_content +store_v2_content_read_only +store_content_checkout +store_content_checkout_read_only +store_v2_customers +customer_groups +store_v2_customers_read_only +60k +20k +storeHash +priceListId +7mil +30sec +user.id +user.email +owner.id +owner.email +900px +450px +auth +external_install +us-central1 +csv +not_in +3_xx_ +2_xx_ +index.js. +Res.send +res.send +http +statusUpdated +sku +couponApplied +lineItem +cartId +130px +200x200px +200px +158px +15-day +2xx +3xx +4xx +5xx +vnd.bc.v1 +70x70 +http +_color.scss +schema.json +100x250 +175x275 +300x300 +img +css +pre-2 +6.x +2.7.x +pre +TR-300 +Node.js. +bitbucket +Utting +Foundation-datepicker +rw-r +x21B3 +sku +url +Is_Ajax +cart_id +shippingaddressform +editaccount +rss +withBefore +withAfter +withLast +withFirst +1x +src +cdn +customcdn +_or_ +dot.cases +chooseprefix +class_name +private_id +singleline +singleselect +expires_at +Utils +utils +getPage +getCart +FormData +itemUpdate +itemRemove +itemId +params +configureCart +abcdefghijklmnop +brandname +252d +product.id diff --git a/.style/core-glossary.txt b/.style/core-glossary.txt new file mode 100644 index 000000000..5777e6ed2 --- /dev/null +++ b/.style/core-glossary.txt @@ -0,0 +1,77 @@ + +BigCommerce +bigcommerce +bodl +BODL +upsert +!above +!access +!allows +!dev key +!developer key ++application +!back-end +!front-end +!backwards compatible +!below +!blacklist +!whitelist +allowlist +denylist +!check +!click on +![here] +![click here] +!id +ID +!comprise +!cons +!console +!content type +media type +!curated roles +!cleansing +!data set +!datasource +!data store +!datatype +!deep-link* +!deselect +!desire +!dialogue +!doc +!docs +!article +!topic +!dropdown +!dummy +!easy +!easily +!e.g. +!eg +!tag +!e-mail +!end point +!file name +!filesystem +!flag +!functionality +!he +!him +!his +!she +!her +!hers +!hamburger +!hit +!hover +!host name +!i.e. +!ie +!impactful +!ingest +!in order to +!just + +via +will diff --git a/.style/skip-list.txt b/.style/skip-list.txt new file mode 100644 index 000000000..98ea16756 --- /dev/null +++ b/.style/skip-list.txt @@ -0,0 +1 @@ +usleep diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..2d626194c --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at . The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..f29836b05 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,100 @@ +# Contributing to BigCommerce Developer Documentation + +- [Making a Quick Edit](#making-a-quick-edit) +- [Editing Locally](#editing-locally) +- [Commit Messages](#commit-messages) +- [Style Guides](#style-guides) +- [Contributing to Other Projects](#contributing-to-other-projects) + +Thanks for showing interest in contributing! + +The following is a set of guidelines for contributing to BigCommerce's Developer Documentation. These are guidelines, not rules. Use your best judgment, and make proposed changes to this document in a pull request. + +## Making a Quick Edit + +The easiest way to edit a file is using GitHub's web interface: + +1. Navigate to the file in GitHub. For example, [making-requests.md](https://github.com/bigcommerce/dev-docs/blob/main/docs/api-docs/getting-started/making-requests.mdx). + +2. Click the **pencil** icon to **Edit This File**. +3. Make the edit. +4. Type a commit message. +5. Select **Create a new branch for this commit and start a pull request**. +6. Give the branch a descriptive name. +7. Click **Propose file change**. +8. Give the pull request a descriptive title. +9. Fill in the pull request description. +10. Click **Create pull request**. + +That's it! You're done. + +## Editing Locally + +For more complex changes, fork and edit locally: + +1. Fork `bigcommerce/dev-docs`. + +2. `git clone` the fork to your local machine. + +3. Make edits on a new branch in your IDE of choice. + +4. Commit and push changes to your remote repo. + +5. Create a [pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request-from-a-fork) to `bigcommerce:dev-docs/main`. + + +## Commit Messages + +- Always include subject; include body when necessary. +- Use present tense ("Add feature" not "Added feature"). +- Use imperative mood ("Fix broken link..." not "Fixes broken link..."). +- Separate subject from body with a blank line. +- Limit the subject line to 50 characters. +- Capitalize the subject line. +- Do not end the subject line with a period. +- Use the body to explain what and why versus how. + +## Style Guides + +- [Documentation Style Guide](_project/_doc_style_guide.md) +- [API Specification Style Guide](_project/_spec_style_guide.md) + +## Contributing to Other Projects + +There are many other public BigCommerce repositories accepting contributions. If you're interested in contributing to those projects, see the [full list of public source repos](https://github.com/bigcommerce?utf8=%E2%9C%93&q=is%3Apublic&type=source&language=). Also, consider joining the [BigCommerce Developer Community](https://developer.bigcommerce.com/community). + +# Contributing to BigCommerce's API Specifications + +Thanks for your interest in contributing! + +## Edit + +* **Edit:** Fork the repository and edit with your preferred editor. We recommend [VS Code](https://code.visualstudio.com/). +* **Lint:** Check for errors using [Spectral](https://stoplight.io/open-source/spectral) or another OAS linter. + +* **Commit:** Write good commit messages using the guidelines in the following section. +* **Push** to your fork to ensure that your pull request contains the most up-to-date version of your code. + +## Write descriptive commit messages + +* Describe the change using at least one verb and one noun. +* Use specific nouns to identify what you changed. +* Use the present tense ("Fix broken link to x" not "Fixed broken link to x"). +* Use the imperative mood ("Fix broken link to x" not "Fixes broken link to x"). + +## Pull request + +[What is a pull request?](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request) + +Use the included `pull_request_template.md` to tell us more about the changes you propose. + +## Tools + +The following tools might be helpful. + +| Tool | Description | +|:-----|:------------| +| [Spectral CLI](https://stoplight.io/open-source/spectral) | Node.js CLI for the Spectral OpenAPI linter | +| [Spectral Linter for VS Code](https://marketplace.visualstudio.com/items?itemName=stoplight.spectral)| The Spectral OpenAPI linter as a VS Code extension | +| [swagger2openapi](https://www.npmjs.com/package/swagger2openapi)| Node.js CLI for converting Swagger to OpenAPI 3.0 | +| [openapi.tools](https://openapi.tools/) | List of open-source OpenAPI tools | diff --git a/README.md b/README.md index bcf6ae32f..dc5ee5fe8 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,75 @@ -**Coming Soon** # BigCommerce Public Developer Documentation -On December 27th, 2023, the following public documentation repositories will be deprecated, and all documentation will move into this repository. These repositories will then become read-only: +This repo is the source of truth for the public, open source BigCommerce DevDocs and API reference at [developer.bigcommerce.com](https://developer.bigcommerce.com). It consists of **Markdown React (.mdx)**, **OpenAPI Specification (.yml)**, and **JSON Schema (.json and .yml)** files. + +The BigCommerce DX team maintains these open source docs; we welcome your [issues](https://github.com/bigcommerce/docs/issues), [discussions](https://github.com/bigcommerce/docs/discussions), and [pull requests](https://github.com/bigcommerce/docs/pulls)! + +## Contributing + +If you're interested in contributing, see our [Contribution Guide](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md). + +## History + +On December 27, 2023, the following public documentation repositories were deprecated, and all documentation moved into this repository. We retained the `git` history of each document using the `--allow-unrelated-histories` flag. The following repositories are now read-only: * `https://github.com/bigcommerce/api-specs` * `https://github.com/bigcommerce/dev-docs` * `https://github.com/bigcommerce/theme-context-object-schemas` -If you maintain API clients, this repository will be your source for the most up-to-date API specifications. +### API specifications + +If you maintain API clients, this repository is your source for the most up-to-date public API specifications. + +Please keep your fork up to date to ensure you're working with the newest source files. + +Significant dates include the following: + +* As of August 22, 2022, all API specification files are in OAS 3+ format. +* In March 2023, we made significant changes to support a new OAS parser at [developer.bigcommerce.com](https://developer.bigcommerce.com). +* In May 2023, we subdivided both the Catalog and Payments API specifications into multiple files. +* On December 27, 2023, all public docs moved into the [bigcommerce/docs](https://github.com/bigcommerce/docs) repo. + +## Directory structure -The BigCommerce DX team is excited to create a new consolidated GitHub home for our documentation. We look forward to offering a more streamlined developer experience, starting December 27th! +```shell +. +├── .github/ # github config + └── workflows/ # workflows to lint pull requests, etc. + └── ... +├── .idea/ # directory ignored by git - use for yourself +├── .style/ # CSPELL data files +├── assets/ + ├── csv/ # static files used in docs + ├── images/ # images and screenshots + ├── json/ # theme translation files + └── PO/ +├── docs # narrative documentation + ├── api-docs/ + ├── bigcommerce-for-wordpress/ + ├── legacy/ # Blueprint and V2 API docs + ├── msf/ # MSF docs + ├── partner-apps/ # docs for some partner integrations + └── stencil-docs/ +├── examples # example data for Stencil Handlebars context objects +├── models # JSON schemas in YAML + ├── _root # YAML schemas for root Stencil Handlebars context objects + ├── ... +├── reference/ # OpenAPI specification files + ├── catalog/ # catalog OAS API reference + ├── payments/ # payments OAS API reference + └── ... # other OAS API reference +├── theme-styles + ├── _root # MDX files for Stencil style configuration options +├── .cspell.json +├── .eslintrc.json # config for MDX linter +├── .gitignore # gitignore +├── .nojekyll +├── .nvmrc # config for NVM +├── .spectral.yaml # config for OAS linter +├── CODE_OF_CONDUCT.md # Code of Conduct for participants +├── CONTRIBUTING.md # guidelines for contribution +├── package-lock.json +├── package.json +├── pull_request_template.md # template for most pull requests +└── README.md +``` diff --git a/assets/PO/storefront-de-DE.po b/assets/PO/storefront-de-DE.po new file mode 100644 index 000000000..717451551 --- /dev/null +++ b/assets/PO/storefront-de-DE.po @@ -0,0 +1,615 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-11-22T23:30:49+00:00\n" +"PO-Revision-Date: 2020-11-22T23:30:49+00:00\n" +"Language: de-DE\n" + +msgid "" +"The coupon code you entered couldn't be applied to any items in your order." +msgstr "" +"Der von Ihnen eingegebene Gutscheincode konnte auf keinen Artikel Ihrer " +"Bestellung angewendet werden." + +msgid "" +"There was an error updating your billing address. Please check all fields " +"are correct and try again." +msgstr "" +"Bei der Aktualisierung Ihrer Rechnungsadresse ist ein Fehler aufgetreten. " +"Bitte überprüfen Sie, ob alle Felder korrekt sind, und versuchen Sie es " +"erneut." + +msgid "My Account" +msgstr "Mein Konto" + +msgid "You have requested an invalid product download. Please try again." +msgstr "" +"Sie haben einen ungültigen Produktdownload angefordert. Bitte versuchen Sie " +"es erneut." + +msgid "This download has expired." +msgstr "Dieser Download ist abgelaufen." + +msgid "Product Downloads" +msgstr "Produktdownloads" + +msgid "Files for %s" +msgstr "Dateien für %s" + +msgid "The files available for %s are listed below." +msgstr "Die für %s verfügbaren Dateien sind unten aufgelistet." + +msgid "Your account details have been updated." +msgstr "Ihre Kontodaten wurden aktualisiert." + +msgid "Something went wrong trying to update your details. Please try again." +msgstr "" +"Bei der Aktualisierung Ihrer Angaben ist etwas schiefgelaufen. Bitte " +"versuchen Sie es erneut." + +msgid "Please type in your current password." +msgstr "Bitte geben Sie Ihr aktuelles Passwort ein." + +msgid "Stock check error" +msgstr "Fehler bei der Lagerbestandsprüfung" + +msgid "We are facing a problem with checking inventory stock. Please try again" +msgstr "" +"Wir haben ein Problem bei der Lagerbestandsprüfung. Bitte versuchen Sie es " +"erneut." + +msgid "Invalid payload" +msgstr "Ungültige Nutzdaten" + +msgid "Invalid custom form field ID provided: {field}" +msgstr "Ungültige benutzerdefinierte Formularfeld-ID angegeben: {field}" + +msgid "All prices are in %s" +msgstr "Alle Preise sind in %s" + +msgid "" +"Your order does not meet the minimum total for this coupon code to be " +"applied. Please spend another {amountDiff} first." +msgstr "" +"Ihre Bestellung entspricht nicht der Mindestsumme, die für die Anwendung " +"dieses Gutscheincodes erforderlich ist. Bitte geben Sie zunächst weitere " +"{amountDiff} aus." + +msgid "" +"We don't have enough {product} stock on hand for the quantity you selected. " +"Please try again." +msgstr "" +"Wir haben für die von Ihnen gewählte Menge nicht genügend {product} auf " +"Lager. Bitte versuchen Sie es erneut." + +msgid "Promotion is inactive" +msgstr "Werbeangebot ist inaktiv" + +msgid "This promotion cannot be applied with the selected currency" +msgstr "" +"Dieses Werbeangebot kann bei der ausgewählten Währung nicht angewendet werden" + +msgid "You are not in the customer group the promotion targets" +msgstr "Sie gehören nicht zu der Kundengruppe, für die das Werbeangebot gilt" + +msgid "You do not meet the minimum order requirement for the promotion" +msgstr "" +"Sie erfüllen nicht die erforderliche Mindestbestellmenge für das Werbeangebot" + +msgid "Shipping address is required for the promotion" +msgstr "Für das Werbeangebot ist eine Lieferadresse erforderlich" + +msgid "The promotion can not be used in order with multiple shipping addresses" +msgstr "" +"Das Werbeangebot kann nicht in einer Bestellung mit mehreren Lieferadressen " +"verwendet werden" + +msgid "The promotion can not be applied for this shipping address" +msgstr "Das Werbeangebot kann nicht für diese Lieferadresse angewendet werden" + +msgid "Something went wrong" +msgstr "Es ist etwas schiefgegangen" + +msgid "The coupon code you entered has been disabled so it can't be used." +msgstr "" +"Der von Ihnen eingegebene Gutscheincode wurde deaktiviert und kann daher " +"nicht verwendet werden." + +msgid "The coupon code you entered expired on %s so it can't be used." +msgstr "" +"Der von Ihnen eingegebene Gutscheincode ist am %s abgelaufen und kann daher " +"nicht verwendet werden." + +msgid "The coupon code you entered has already expired so it can't be used." +msgstr "" +"Der von Ihnen eingegebene Gutscheincode ist bereits abgelaufen und kann " +"daher nicht verwendet werden." + +msgid "Coupon code can not be found" +msgstr "Gutscheincode kann nicht gefunden werden" + +msgid "This promotion can not be used in conjunction with other promotions" +msgstr "" +"Dieses Werbeangebot kann nicht in Verbindung mit anderen Werbeangeboten " +"verwendet werden" + +msgid "unknown" +msgstr "unbekannt" + +msgid "" +"Unfortunately this product is no longer for sale so it cannot be reordered." +msgstr "" +"Leider ist dieses Produkt nicht mehr erhältlich und kann daher nicht " +"nachbestellt werden." + +msgid "This product cannot be reordered because it's out of stock." +msgstr "" +"Dieses Produkt kann nicht nachbestellt werden, da es nicht vorrätig ist." + +msgid "Please select a file for the {displayName} option." +msgstr "Bitte wählen Sie eine Datei für die Option {displayName}." + +msgid "Unfortunately this product is not available for purchase." +msgstr "Leider ist dieses Produkt nicht erhältlich." + +msgid "" +"The inventory level for the following product is below what you ordered, so " +"we could not proceed with the checkout: {productName}" +msgstr "" +"Der Lagerbestand für das folgende Produkt liegt unter der von Ihnen " +"bestellten Menge, weshalb wir nicht mit dem Bezahlvorgang fortfahren " +"konnten: {productName}" + +msgid "The coupon has been removed from your cart." +msgstr "Der Gutschein wurde aus Ihrem Warenkorb entfernt." + +msgid "Forgot Password" +msgstr "Passwort vergessen" + +msgid "Create Account" +msgstr "Konto erstellen" + +msgid "Your Account Has Been Created" +msgstr "Ihr Konto wurde erstellt" + +msgid "Sign in" +msgstr "Anmelden" + +msgid "" +"If the entered email address is associated with this store, you will receive " +"a password reset email. If you don't receive this e-mail, please check your " +"junk mail folder or contact us for further assistance." +msgstr "" +"Wenn die eingegebene E-Mail-Adresse mit diesem Online-Shop verknüpft ist, " +"erhalten Sie eine E-Mail zum Zurücksetzen des Passworts. Wenn Sie diese E-" +"Mail nicht erhalten, überprüfen Sie bitte Ihren Spam-Ordner oder " +"kontaktieren Sie uns, um weitere Unterstützung zu erhalten." + +msgid "" +"The link you were given in the Request Password email is invalid. Please " +"request another new password to receive a new link." +msgstr "" +"Der Link, den Sie in der E-Mail zur Anforderung eines Passworts erhalten " +"haben, ist ungültig. Bitte fordern Sie ein weiteres neues Passwort an, um " +"einen neuen Link zu erhalten." + +msgid "" +"An internal error occurred while trying to change your password. Please try " +"again." +msgstr "" +"Bei der Änderung Ihres Passworts ist ein interner Fehler aufgetreten. Bitte " +"versuchen Sie es erneut." + +msgid "Sorry, your passwords do not match. Please try again." +msgstr "" +"Es tut uns leid, Ihre Passwörter stimmen nicht überein. Bitte versuchen Sie " +"es erneut." + +msgid "" +"Passwords must be at least 7 characters and contain both alphabetic and " +"numeric characters." +msgstr "" +"Passwörter müssen mindestens 7 Zeichen lang sein und sowohl Buchstaben als " +"auch Zahlen enthalten." + +msgid "You need to sign in to access this page." +msgstr "Sie müssen sich anmelden, um auf diese Seite zugreifen zu können." + +msgid "Your password has been successfully updated." +msgstr "Ihr Passwort wurde erfolgreich aktualisiert." + +msgid "Please provide a valid return URL" +msgstr "Bitte geben Sie eine gültige Rückgabe-URL an" + +msgid "Please type in a valid email address, such as joe@example.com" +msgstr "" +"Bitte geben Sie eine gültige E-Mail-Adresse ein, beispielsweise max@beispiel." +"de" + +msgid "" +"Too many requests made when trying to send password-less login, please try " +"again later." +msgstr "" +"Bei dem Versuch, eine passwortlose Anmeldung zu senden, wurden zu viele " +"Anfragen gestellt. Bitte versuchen Sie es später erneut." + +msgid "Email failed to send, please try again later." +msgstr "" +"E-Mail konnte nicht gesendet werden. Bitte versuchen Sie es später erneut." + +msgid "" +"You left some items from a previous cart. We have added those items to your " +"current cart." +msgstr "" +"Sie haben einige Artikel aus einem früheren Warenkorb übrig. Wir haben diese " +"Artikel zu Ihrem aktuellen Warenkorb hinzugefügt." + +msgid "The captcha you entered is incorrect. Please try again." +msgstr "" +"Das von Ihnen eingegebene Captcha ist nicht korrekt. Bitte versuchen Sie es " +"erneut." + +msgid "" +"Your email address or password is incorrect. Please try again. If you've " +"forgotten your sign in details, just click the 'Forgot your password?' link " +"below." +msgstr "" +"Ihre E-Mail-Adresse oder Ihr Passwort ist falsch. Bitte versuchen Sie es " +"erneut. Wenn Sie Ihre Anmeldedaten vergessen haben, klicken Sie einfach " +"unten auf den Link „Haben Sie Ihr Passwort vergessen?“." + +msgid "" +"Due to excessive login attempts, please wait %s seconds before attempting to " +"log in again." +msgstr "" +"Aufgrund zu vieler Anmeldeversuche müssen Sie %s Sekunden warten, bevor Sie " +"erneut versuchen können, sich anzumelden." + +msgid "" +"You must reset your password before you may log in again. Please check your " +"email at :email to reset your password" +msgstr "" +"Sie müssen Ihr Passwort zurücksetzen, bevor Sie sich wieder anmelden können. " +"Bitte überprüfen Sie Ihre E-Mails unter :email, um Ihr Passwort " +"zurückzusetzen" + +msgid "You cannot create an account at this time." +msgstr "Sie können zur Zeit kein Konto erstellen." + +msgid "Click here to continue." +msgstr "Klicken Sie hier, um fortzufahren." + +msgid "Click here to continue shopping" +msgstr "Klicken Sie hier, um mit dem Einkauf fortzufahren" + +msgid "The email address %s is already in use. Please enter a different one." +msgstr "" +"Die E-Mail-Adresse %s wird bereits verwendet. Bitte geben Sie eine andere E-" +"Mail-Adresse ein." + +msgid "" +"Please type in a valid phone number containing at least 3 numbers. The only " +"special characters allowed are: :allowedchars" +msgstr "" +"Bitte geben Sie eine gültige Telefonnummer mit mindestens 3 Ziffern ein. Die " +"einzigen zulässigen Sonderzeichen sind: :allowedchars" + +msgid "Your passwords don't match." +msgstr "Ihre Passwörter stimmen nicht überein." + +msgid "" +"An internal error occurred while trying to create your account. Please try " +"again." +msgstr "" +"Beim Erstellen Ihres Kontos ist ein interner Fehler aufgetreten. Bitte " +"versuchen Sie es erneut." + +msgid "" +"Sign in or sign out" +msgstr "" +"Anmelden oder abmelden" + +msgid "" +"Sign in or Create an account" +msgstr "" +"Anmelden oder Ein Konto erstellen" + +msgid "You've been logged out of your account successfully." +msgstr "Sie wurden von Ihrem Konto abgemeldet." + +msgid "Token is missing." +msgstr "Token fehlt." + +msgid "" +"Sign in failed. The provided token has expired or already been used. Please " +"try again." +msgstr "" +"Anmeldung fehlgeschlagen. Das bereitgestellte Token ist abgelaufen oder " +"wurde bereits verwendet. Bitte versuchen Sie es erneut." + +msgid "Please choose a valid amount for this gift certificate." +msgstr "Bitte wählen Sie einen gültigen Betrag für diesen Geschenkgutschein." + +msgid "Please enter a valid amount for this gift certificate." +msgstr "" +"Bitte geben Sie einen gültigen Betrag für diesen Geschenkgutschein ein." + +msgid "" +"Please enter an amount between the minimum and maximum gift certificate " +"value." +msgstr "" +"Bitte geben Sie einen Betrag zwischen dem minimalen und maximalen Wert des " +"Geschenkgutscheins ein." + +msgid "" +"Please enter the name of the person you wish to send this gift certificate " +"to." +msgstr "" +"Bitte geben Sie den Namen der Person ein, an die Sie diesen " +"Geschenkgutschein senden möchten." + +msgid "" +"Please enter a valid email address for the person you wish to send this gift " +"certificate to." +msgstr "" +"Bitte geben Sie eine gültige E-Mail-Adresse für die Person ein, an die Sie " +"diesen Geschenkgutschein senden möchten." + +msgid "Please enter your name." +msgstr "Bitte geben Sie Ihren Namen ein." + +msgid "Please enter your email address." +msgstr "Bitte geben Sie Ihre E-Mail-Adresse ein." + +msgid "Please enter a shorter message for your gift certificate." +msgstr "" +"Bitte geben Sie eine kürzere Nachricht für Ihren Geschenkgutschein ein." + +msgid "Please select a theme for your gift certificate." +msgstr "Bitte wählen Sie ein Design für Ihren Geschenkgutschein." + +msgid "Cannot purchase a Gift Certificate using a Gift Certificate" +msgstr "" +"Ein Geschenkgutschein kann nicht mit einem Geschenkgutschein gekauft werden" + +msgid "Your gift certificate has been updated successfully." +msgstr "Ihr Geschenkgutschein wurde aktualisiert." + +msgid "Your gift certificate has been generated and saved in your cart." +msgstr "" +"Ihr Geschenkgutschein wurde erstellt und in Ihrem Warenkorb gespeichert." + +msgid "The selected product combination doesn't exist." +msgstr "Die gewählte Produktkombination existiert nicht." + +msgid "Please enter a valid product quantity." +msgstr "Bitte geben Sie eine gültige Produktmenge ein." + +msgid "Please enter a title, text and rating for your review." +msgstr "" +"Bitte geben Sie einen Titel, einen Text und eine Bewertung für Ihre " +"Bewertung ein." + +msgid "" +"You are only allowed to post :number product review every :duration. Please " +"try again later." +msgstr "" +"Sie dürfen nur :number Produktrezensionen alle :duration veröffentlichen. " +"Bitte versuchen Sie es später erneut." + +msgid "The email you entered is incorrect. Please type it again." +msgstr "" +"Die von Ihnen eingegebene E-Mail-Adresse ist nicht korrekt. Bitte geben Sie " +"sie erneut ein." + +msgid "An internal error occurred while trying to save your review." +msgstr "Beim Speichern Ihrer Bewertung ist ein interner Fehler aufgetreten." + +msgid "Your review was saved and is shown below." +msgstr "Ihre Bewertung wurde gespeichert und wird unten angezeigt." + +msgid "Your review was saved and is pending approval." +msgstr "Ihre Bewertung wurde gespeichert und wartet auf die Genehmigung." + +msgid "Only customers who have purchased this item can review it." +msgstr "Nur Kunden, die diesen Artikel gekauft haben, können ihn bewerten." + +msgid "Oops..." +msgstr "Hoppla …" + +msgid "Please enter your name and email address before submitting this form." +msgstr "" +"Bitte geben Sie Ihren Namen und Ihre E-Mail-Adresse ein, bevor Sie dieses " +"Formular absenden." + +msgid "" +"Sorry, your request could not be processed as it contained an invalid " +"security token. Please refresh and try again." +msgstr "" +"Es tut uns leid, Ihre Anfrage konnte nicht bearbeitet werden, da sie ein " +"ungültiges Sicherheitstoken enthielt. Bitte aktualisieren Sie die Seite und " +"versuchen Sie es erneut." + +msgid "Newsletter Subscription" +msgstr "Newsletter-Abonnement" + +msgid "Please enter a valid email address, such as john@example.com." +msgstr "" +"Bitte geben Sie eine gültige E-Mail-Adresse ein, beispielsweise max@beispiel." +"de." + +msgid "The email address %s is already subscribed to receive our newsletter." +msgstr "Die E-Mail-Adresse %s ist bereits Abonnent unseres Newsletters." + +msgid "Thanks for Subscribing!" +msgstr "Vielen Dank für dein Abonnement!" + +msgid "" +"Thank you for joining our mailing list. You'll be sent the next issue of our " +"newsletter shortly." +msgstr "" +"Vielen Dank, dass Sie sich in unsere Mailingliste eingetragen haben. Sie " +"erhalten in Kürze die nächste Ausgabe unseres Newsletters." + +msgid "Continue" +msgstr "Fortfahren" + +msgid "" +"The gift certificate you entered couldn't be applied to any items in your " +"order." +msgstr "" +"Der von Ihnen eingegebene Geschenkgutschein konnte auf keinen Artikel Ihrer " +"Bestellung angewendet werden." + +msgid "The gift certificate {code} does not exist" +msgstr "Der Geschenkgutschein {code} existiert nicht" + +msgid "Please enter a valid zip code/postcode or state." +msgstr "" +"Bitte geben Sie eine gültige Postleitzahl oder ein gültiges Bundesland ein." + +msgid "Please select a valid state." +msgstr "Bitte wählen Sie ein gültiges Bundesland." + +msgid "Please enter a valid zip code/postcode." +msgstr "Bitte geben Sie eine gültige Postleitzahl ein." + +msgid "" +"Unfortunately one or more items in your cart can't be shipped to your " +"location. Please choose a different delivery address." +msgstr "" +"Leider können ein oder mehrere Artikel in Ihrem Warenkorb nicht an Ihren " +"Standort versandt werden. Bitte wählen Sie eine andere Lieferadresse." + +msgid "Unable to retrieve shipping quote. Please try again or contact support." +msgstr "" +"Ihr Versandangebot konnte nicht abgerufen werden. Bitte versuchen Sie es " +"erneut oder kontaktieren Sie den Support." + +msgid "Passwords must be at least :length characters and contain: " +msgstr "" +"Passwörter müssen mindestens :length Zeichen lang sein und Folgendes " +"enthalten: " + +msgid "lower case letters" +msgstr "Kleinbuchstaben" + +msgid "upper case letters" +msgstr "Großbuchstaben" + +msgid "at least :numbers " +msgstr "mindestens :numbers " + +msgid "at least :specialchars " +msgstr "mindestens :specialchars " + +msgid "" +"Subject to Status. Terms and Conditions Apply. {merchantName} acts as a " +"broker and offers credit from PayPal Credit.\n" +"PayPal Credit is a trading name of PayPal (Europe) .à.r.l. et Cie, S.C.A., " +"22-24 Boulevard Royal L-2449, Luxembourg." +msgstr "" +"Vorbehaltlich Status. Es gelten die Allgemeinen Geschäftsbedingungen. " +"{merchantName} agiert als Makler und bietet Kredite von PayPal Credit an.\n" +"PayPal Credit ist ein Handelsname von PayPal (Europe) .à.r.l. et Cie, S.C." +"A., 22-24 Boulevard Royal L-2449, Luxembourg." + +msgid "Add payment method" +msgstr "Zahlungsmethode hinzufügen" + +msgid "Address Book" +msgstr "Adressbuch" + +msgid "Address Form" +msgstr "Adressformular" + +msgid "Your Orders" +msgstr "Ihre Bestellungen" + +msgid "Order #{id}" +msgstr "Bestellung #{id}" + +msgid "Files" +msgstr "Dateien" + +msgid "Account Details" +msgstr "Kontodaten" + +msgid "Edit Payment Method" +msgstr "Zahlungsmethode bearbeiten" + +msgid "Your Messages" +msgstr "Ihre Nachrichten" + +msgid "Login" +msgstr "Anmelden" + +msgid "Reset Password" +msgstr "Passwort zurücksetzen" + +msgid "Create New Return" +msgstr "Neue Rückgabe erstellen" + +msgid "Your Account" +msgstr "Ihr Konto" + +msgid "Payment Methods" +msgstr "Zahlungsmethoden" + +msgid "Recently Viewed Items" +msgstr "Zuletzt angesehene Artikel" + +msgid "Your Returns" +msgstr "Ihre Rückgaben" + +msgid "Return Saved" +msgstr "Rückgabe gespeichert" + +msgid "New Wishlist" +msgstr "Neue Wunschliste" + +msgid "Edit Wishlist" +msgstr "Wunschliste bearbeiten" + +msgid "Your Wishlists" +msgstr "Ihre Wunschlisten" + +msgid "All Brands" +msgstr "Alle Marken" + +msgid "Your Cart" +msgstr "Ihr Warenkorb" + +msgid "Compare Products" +msgstr "Produkte vergleichen" + +msgid "Error" +msgstr "Fehler" + +msgid "Gift Certificates" +msgstr "Geschenkgutscheine" + +msgid "Search" +msgstr "Suchen" + +msgid "Sitemap" +msgstr "Sitemap" + +msgid "View Wishlist" +msgstr "Wunschliste anzeigen" + +msgid "View Shared Wishlist" +msgstr "Geteilte Wunschliste anzeigen" + +msgid "Home" +msgstr "Startseite" diff --git a/assets/PO/storefront-es-ES.po b/assets/PO/storefront-es-ES.po new file mode 100644 index 000000000..e7814872f --- /dev/null +++ b/assets/PO/storefront-es-ES.po @@ -0,0 +1,588 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-11-22T23:30:49+00:00\n" +"PO-Revision-Date: 2020-11-22T23:30:49+00:00\n" +"Language: es-ES\n" + +msgid "" +"The coupon code you entered couldn't be applied to any items in your order." +msgstr "" +"El código de cupón que ha introducido no pudo aplicarse a ningún artículo de " +"su pedido." + +msgid "" +"There was an error updating your billing address. Please check all fields " +"are correct and try again." +msgstr "" +"Se ha producido un error al actualizar su dirección de facturación. " +"Compruebe que todos los campos sean correctos e inténtelo de nuevo." + +msgid "My Account" +msgstr "Mi cuenta" + +msgid "You have requested an invalid product download. Please try again." +msgstr "Ha solicitado una descarga de producto no válida. Vuelva a intentarlo." + +msgid "This download has expired." +msgstr "Esta descarga ya ha caducado." + +msgid "Product Downloads" +msgstr "Descargas de productos" + +msgid "Files for %s" +msgstr "Archivos para %s" + +msgid "The files available for %s are listed below." +msgstr "Los archivos disponibles para %s se enumeran a continuación." + +msgid "Your account details have been updated." +msgstr "Se han actualizado los datos de su cuenta." + +msgid "Something went wrong trying to update your details. Please try again." +msgstr "Algo salió mal al intentar actualizar sus datos. Vuelva a intentarlo." + +msgid "Please type in your current password." +msgstr "Introduzca su contraseña actual." + +msgid "Stock check error" +msgstr "Error de verificación de existencias" + +msgid "We are facing a problem with checking inventory stock. Please try again" +msgstr "" +"Estamos teniendo un problema con la comprobación de las existencias del " +"inventario. Vuelva a intentarlo." + +msgid "Invalid payload" +msgstr "Carga útil no válida" + +msgid "Invalid custom form field ID provided: {field}" +msgstr "Se ha proporcionado un ID de campo de formulario no válido: {field}" + +msgid "All prices are in %s" +msgstr "Todos los precios están en %s" + +msgid "" +"Your order does not meet the minimum total for this coupon code to be " +"applied. Please spend another {amountDiff} first." +msgstr "" +"Su pedido no alcanza el total mínimo para que se aplique este código de " +"cupón. Primero debe gastarse otros {amountDiff}." + +msgid "" +"We don't have enough {product} stock on hand for the quantity you selected. " +"Please try again." +msgstr "" +"No tenemos suficientes existencias de {product} para la cantidad que ha " +"seleccionado. Vuelva a intentarlo." + +msgid "Promotion is inactive" +msgstr "La promoción está inactiva" + +msgid "This promotion cannot be applied with the selected currency" +msgstr "Esta promoción no puede aplicarse con la moneda seleccionada" + +msgid "You are not in the customer group the promotion targets" +msgstr "No está en el grupo de clientes que son los objetivos de la promoción" + +msgid "You do not meet the minimum order requirement for the promotion" +msgstr "No cumple con el requisito de pedido mínimo para la promoción" + +msgid "Shipping address is required for the promotion" +msgstr "Se requiere la dirección de envío para la promoción" + +msgid "The promotion can not be used in order with multiple shipping addresses" +msgstr "" +"La promoción no puede utilizarse en un pedido con varias direcciones de envío" + +msgid "The promotion can not be applied for this shipping address" +msgstr "La promoción no puede aplicarse para esta dirección de envío" + +msgid "Something went wrong" +msgstr "Algo salió mal" + +msgid "The coupon code you entered has been disabled so it can't be used." +msgstr "" +"El código de cupón que ha introducido se ha desactivado para que no pueda " +"utilizarse." + +msgid "The coupon code you entered expired on %s so it can't be used." +msgstr "" +"El código de cupón que ha introducido caducó el %s por lo que no puede " +"utilizarse." + +msgid "The coupon code you entered has already expired so it can't be used." +msgstr "" +"El código de cupón que ha introducido ya ha caducado, por lo que no puede " +"utilizarse." + +msgid "Coupon code can not be found" +msgstr "No se encuentra el código de cupón" + +msgid "This promotion can not be used in conjunction with other promotions" +msgstr "Esta promoción no puede utilizarse junto con otras promociones" + +msgid "unknown" +msgstr "desconocido" + +msgid "" +"Unfortunately this product is no longer for sale so it cannot be reordered." +msgstr "" +"Lamentablemente, este producto ya no está a la venta, por lo que no puede " +"volver a pedirse." + +msgid "This product cannot be reordered because it's out of stock." +msgstr "Este producto no se puede volver a pedir porque está agotado." + +msgid "Please select a file for the {displayName} option." +msgstr "Seleccione un archivo para la opción {displayName}." + +msgid "Unfortunately this product is not available for purchase." +msgstr "Desafortunadamente, este producto no está disponible para su compra." + +msgid "" +"The inventory level for the following product is below what you ordered, so " +"we could not proceed with the checkout: {productName}" +msgstr "" +"El nivel de inventario del siguiente producto está por debajo de la cantidad " +"que ha pedido, por lo que no pudimos iniciar el proceso de pago: " +"{productName}" + +msgid "The coupon has been removed from your cart." +msgstr "El cupón se ha eliminado de su carrito." + +msgid "Forgot Password" +msgstr "He olvidado mi contraseña" + +msgid "Create Account" +msgstr "Crear cuenta" + +msgid "Your Account Has Been Created" +msgstr "Se ha creado su cuenta" + +msgid "Sign in" +msgstr "Iniciar sesión" + +msgid "" +"If the entered email address is associated with this store, you will receive " +"a password reset email. If you don't receive this e-mail, please check your " +"junk mail folder or contact us for further assistance." +msgstr "" +"Si la dirección de correo electrónico introducida está asociada a esta " +"tienda, recibirá un correo electrónico para el restablecimiento de la " +"contraseña. Si no recibe este correo electrónico, revise su carpeta de " +"correo no deseado o contáctenos para obtener más ayuda." + +msgid "" +"The link you were given in the Request Password email is invalid. Please " +"request another new password to receive a new link." +msgstr "" +"El enlace que se le ha enviado en el correo electrónico Solicitar contraseña " +"no es válido. Solicite otra contraseña para recibir un nuevo enlace." + +msgid "" +"An internal error occurred while trying to change your password. Please try " +"again." +msgstr "" +"Se ha producido un error interno al intentar cambiar su contraseña. Vuelva a " +"intentarlo." + +msgid "Sorry, your passwords do not match. Please try again." +msgstr "Lo sentimos, pero sus contraseñas no coinciden. Vuelva a intentarlo." + +msgid "" +"Passwords must be at least 7 characters and contain both alphabetic and " +"numeric characters." +msgstr "" +"Las contraseñas deben tener al menos 7 caracteres e incluir caracteres " +"alfabéticos y numéricos." + +msgid "You need to sign in to access this page." +msgstr "Es necesario registrarse para acceder a esta página." + +msgid "Your password has been successfully updated." +msgstr "Su contraseña se ha actualizado correctamente." + +msgid "Please provide a valid return URL" +msgstr "Proporcione una URL de redireccionamiento válida" + +msgid "Please type in a valid email address, such as joe@example.com" +msgstr "" +"Introduzca una dirección de correo electrónico válida, como jose@ejemplo.com." + +msgid "" +"Too many requests made when trying to send password-less login, please try " +"again later." +msgstr "" +"Demasiadas solicitudes al intentar enviar el acceso sin contraseña; " +"inténtelo de nuevo más tarde." + +msgid "Email failed to send, please try again later." +msgstr "Error al enviar el correo electrónico. Vuelva a intentarlo más tarde." + +msgid "" +"You left some items from a previous cart. We have added those items to your " +"current cart." +msgstr "" +"Ha dejado algunos artículos en un carrito anterior. Hemos añadido esos " +"artículos a su carrito actual." + +msgid "The captcha you entered is incorrect. Please try again." +msgstr "El captcha que ha introducido es incorrecto. Vuelva a intentarlo." + +msgid "" +"Your email address or password is incorrect. Please try again. If you've " +"forgotten your sign in details, just click the 'Forgot your password?' link " +"below." +msgstr "" +"Su dirección de correo electrónico o la contraseña es incorrecta. Vuelva a " +"intentarlo. Si olvidó sus datos de inicio de sesión, haga clic en «¿Olvidó " +"su contraseña?», en el enlace de abajo." + +msgid "" +"Due to excessive login attempts, please wait %s seconds before attempting to " +"log in again." +msgstr "" +"Debido que hubo una cantidad excesiva de intentos de acceso, espere %s " +"segundos antes de intentar acceder de nuevo." + +msgid "" +"You must reset your password before you may log in again. Please check your " +"email at :email to reset your password" +msgstr "" +"Debe restablecer su contraseña antes de poder iniciar sesión de nuevo. " +"Revise su correo electrónico en :email para restablecer su contraseña." + +msgid "You cannot create an account at this time." +msgstr "No puede crear una cuenta en este momento." + +msgid "Click here to continue." +msgstr "Haga clic aquí para continuar." + +msgid "Click here to continue shopping" +msgstr "Haga clic aquí para seguir comprando" + +msgid "The email address %s is already in use. Please enter a different one." +msgstr "" +"La dirección de correo electrónico %s ya está en uso. Introduzca una " +"diferente." + +msgid "" +"Please type in a valid phone number containing at least 3 numbers. The only " +"special characters allowed are: :allowedchars" +msgstr "" +"Escriba un número de teléfono válido que contenga al menos 3 números. Los " +"únicos caracteres especiales permitidos son: :allowedchars" + +msgid "Your passwords don't match." +msgstr "Sus contraseñas no coinciden." + +msgid "" +"An internal error occurred while trying to create your account. Please try " +"again." +msgstr "" +"Se ha producido un error interno al intentar crear su cuenta. Vuelva a " +"intentarlo." + +msgid "" +"Sign in or sign out" +msgstr "" +"Iniciar sesión o cerrar sesión" + +msgid "" +"Sign in or Create an account" +msgstr "" +"Iniciar sesión o crear una cuenta" + +msgid "You've been logged out of your account successfully." +msgstr "Ha cerrado la sesión de su cuenta correctamente." + +msgid "Token is missing." +msgstr "Falta el token." + +msgid "" +"Sign in failed. The provided token has expired or already been used. Please " +"try again." +msgstr "" +"Error en el inicio de sesión. El token proporcionado ya ha caducado o se ha " +"utilizado. Vuelva a intentarlo." + +msgid "Please choose a valid amount for this gift certificate." +msgstr "Elija un importe válido para este cupón de regalo." + +msgid "Please enter a valid amount for this gift certificate." +msgstr "Introduzca un importe válido para este cupón de regalo." + +msgid "" +"Please enter an amount between the minimum and maximum gift certificate " +"value." +msgstr "" +"Introduzca un importe entre el valor mínimo y máximo del cupón de regalo." + +msgid "" +"Please enter the name of the person you wish to send this gift certificate " +"to." +msgstr "" +"Introduzca el nombre de la persona a la que desea enviar este cupón de " +"regalo." + +msgid "" +"Please enter a valid email address for the person you wish to send this gift " +"certificate to." +msgstr "" +"Introduzca una dirección de correo electrónico válida de la persona a la que " +"desea enviar este cupón de regalo." + +msgid "Please enter your name." +msgstr "Introduzca su nombre." + +msgid "Please enter your email address." +msgstr "Introduzca su dirección de correo electrónico." + +msgid "Please enter a shorter message for your gift certificate." +msgstr "Introduzca un mensaje más corto para su cupón de regalo." + +msgid "Please select a theme for your gift certificate." +msgstr "Seleccione un tema para su cupón de regalo." + +msgid "Cannot purchase a Gift Certificate using a Gift Certificate" +msgstr "No se puede comprar un cupón de regalo con un cupón de regalo" + +msgid "Your gift certificate has been updated successfully." +msgstr "Su cupón de regalo se ha actualizado correctamente." + +msgid "Your gift certificate has been generated and saved in your cart." +msgstr "Su cupón de regalo se ha generado y guardado en su carrito." + +msgid "The selected product combination doesn't exist." +msgstr "No existe la combinación de productos seleccionada." + +msgid "Please enter a valid product quantity." +msgstr "Introduzca una cantidad de producto válida." + +msgid "Please enter a title, text and rating for your review." +msgstr "Introduzca un título, texto y calificación para su reseña." + +msgid "" +"You are only allowed to post :number product review every :duration. Please " +"try again later." +msgstr "" +"Solo puede publicar :number reseñas de productos cada :duration. Vuelva a " +"intentarlo más tarde." + +msgid "The email you entered is incorrect. Please type it again." +msgstr "" +"El correo electrónico que ha introducido es incorrecto. Escríbalo de nuevo." + +msgid "An internal error occurred while trying to save your review." +msgstr "Se ha producido un error interno al tratar de guardar su reseña." + +msgid "Your review was saved and is shown below." +msgstr "Su reseña se ha guardado y se muestra a continuación." + +msgid "Your review was saved and is pending approval." +msgstr "Su reseña se ha guardado y está pendiente de aprobación." + +msgid "Only customers who have purchased this item can review it." +msgstr "" +"Solo los clientes que hayan comprado este artículo pueden hacer una reseña." + +msgid "Oops..." +msgstr "¡Vaya!" + +msgid "Please enter your name and email address before submitting this form." +msgstr "" +"Introduzca su nombre y dirección de correo electrónico antes de enviar este " +"formulario." + +msgid "" +"Sorry, your request could not be processed as it contained an invalid " +"security token. Please refresh and try again." +msgstr "" +"Lo sentimos, pero su solicitud no pudo procesarse porque contenía un token " +"de seguridad no válido. Actualice la página e inténtelo de nuevo." + +msgid "Newsletter Subscription" +msgstr "Suscripción al boletín" + +msgid "Please enter a valid email address, such as john@example.com." +msgstr "" +"Introduzca una dirección de correo electrónico válida, como por ejemplo, " +"jose@ejemplo.com." + +msgid "The email address %s is already subscribed to receive our newsletter." +msgstr "" +"La dirección de correo electrónico %s ya está inscrita para recibir nuestro " +"boletín." + +msgid "Thanks for Subscribing!" +msgstr "¡Gracias por suscribirse!" + +msgid "" +"Thank you for joining our mailing list. You'll be sent the next issue of our " +"newsletter shortly." +msgstr "" +"Gracias por unirse a nuestra lista de distribución de correo. Se le enviará " +"el próximo número de nuestro boletín en breve." + +msgid "Continue" +msgstr "Continuar" + +msgid "" +"The gift certificate you entered couldn't be applied to any items in your " +"order." +msgstr "" +"El cupón de regalo que ha introducido no pudo aplicarse a ningún artículo de " +"su pedido." + +msgid "The gift certificate {code} does not exist" +msgstr "El cupón de regalo {code} no existe" + +msgid "Please enter a valid zip code/postcode or state." +msgstr "Introduzca un código postal o estado/provincia válidos." + +msgid "Please select a valid state." +msgstr "Seleccione un estado/provincia válido." + +msgid "Please enter a valid zip code/postcode." +msgstr "Introduzca un código postal válido." + +msgid "" +"Unfortunately one or more items in your cart can't be shipped to your " +"location. Please choose a different delivery address." +msgstr "" +"Lamentablemente, uno o más artículos de su carrito no pueden enviarse a su " +"ubicación. Elija una dirección de entrega diferente." + +msgid "Unable to retrieve shipping quote. Please try again or contact support." +msgstr "" +"No se puede recuperar el presupuesto de envío. Inténtelo de nuevo o póngase " +"en contacto con el equipo de Atención al Cliente." + +msgid "Passwords must be at least :length characters and contain: " +msgstr "" +"Las contraseñas deben tener una longitud de al menos :length caracteres y " +"contener: " + +msgid "lower case letters" +msgstr "letras minúsculas" + +msgid "upper case letters" +msgstr "letras mayúsculas" + +msgid "at least :numbers " +msgstr "al menos :numbers " + +msgid "at least :specialchars " +msgstr "al menos :specialchars " + +msgid "" +"Subject to Status. Terms and Conditions Apply. {merchantName} acts as a " +"broker and offers credit from PayPal Credit.\n" +"PayPal Credit is a trading name of PayPal (Europe) .à.r.l. et Cie, S.C.A., " +"22-24 Boulevard Royal L-2449, Luxembourg." +msgstr "" +"Sujeto al estado. Se aplican Términos y condiciones. {merchantName} actúa " +"como intermediario y ofrece crédito de PayPal.\n" +"PayPal Credit es el nombre comercial de PayPal (Europa) .à.r.l. et Cie, S.C." +"A., 22-24 Boulevard Royal L-2449, Luxemburgo." + +msgid "Add payment method" +msgstr "Añadir método de pago" + +msgid "Address Book" +msgstr "Libreta de direcciones" + +msgid "Address Form" +msgstr "Formulario de dirección" + +msgid "Your Orders" +msgstr "Sus pedidos" + +msgid "Order #{id}" +msgstr "Pedido n.º {id}" + +msgid "Files" +msgstr "Archivos" + +msgid "Account Details" +msgstr "Detalles de la cuenta" + +msgid "Edit Payment Method" +msgstr "Editar método de pago" + +msgid "Your Messages" +msgstr "Sus mensajes" + +msgid "Login" +msgstr "Iniciar sesión" + +msgid "Reset Password" +msgstr "Restablecer la contraseña" + +msgid "Create New Return" +msgstr "Crear nueva devolución" + +msgid "Your Account" +msgstr "Su cuenta" + +msgid "Payment Methods" +msgstr "Métodos de pago" + +msgid "Recently Viewed Items" +msgstr "Elementos vistos recientemente" + +msgid "Your Returns" +msgstr "Sus devoluciones" + +msgid "Return Saved" +msgstr "Devolución guardada" + +msgid "New Wishlist" +msgstr "Nueva lista de deseos" + +msgid "Edit Wishlist" +msgstr "Editar lista de deseos" + +msgid "Your Wishlists" +msgstr "Sus listas de deseos" + +msgid "All Brands" +msgstr "Todas las marcas" + +msgid "Your Cart" +msgstr "Su carrito" + +msgid "Compare Products" +msgstr "Comparar productos" + +msgid "Error" +msgstr "Error" + +msgid "Gift Certificates" +msgstr "Cupones de regalo" + +msgid "Search" +msgstr "Buscar" + +msgid "Sitemap" +msgstr "Mapa del sitio" + +msgid "View Wishlist" +msgstr "Ver lista de deseos" + +msgid "View Shared Wishlist" +msgstr "Ver lista de deseos compartidos" + +msgid "Home" +msgstr "Página de inicio" diff --git a/assets/PO/storefront-es-MX.po b/assets/PO/storefront-es-MX.po new file mode 100644 index 000000000..182104fce --- /dev/null +++ b/assets/PO/storefront-es-MX.po @@ -0,0 +1,585 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-11-22T23:30:49+00:00\n" +"PO-Revision-Date: 2020-11-22T23:30:49+00:00\n" +"Language: es-MX\n" + +msgid "" +"The coupon code you entered couldn't be applied to any items in your order." +msgstr "" +"El código de cupón que ingresó no pudo aplicarse a ningún artículo de su " +"pedido." + +msgid "" +"There was an error updating your billing address. Please check all fields " +"are correct and try again." +msgstr "" +"Ocurrió un error al actualizar su dirección de facturación. Verifique que " +"todos los campos sean correctos e inténtelo de nuevo." + +msgid "My Account" +msgstr "Mi cuenta" + +msgid "You have requested an invalid product download. Please try again." +msgstr "Solicitó una descarga de producto inválida. Vuelva a intentarlo." + +msgid "This download has expired." +msgstr "Esta descarga ya venció." + +msgid "Product Downloads" +msgstr "Descargas de productos" + +msgid "Files for %s" +msgstr "Archivos para %s" + +msgid "The files available for %s are listed below." +msgstr "Los archivos disponibles para %s se enumeran a continuación." + +msgid "Your account details have been updated." +msgstr "Se actualizaron los datos de su cuenta." + +msgid "Something went wrong trying to update your details. Please try again." +msgstr "" +"Ocurrió un error al tratar de actualizar sus datos. Vuelva a intentarlo." + +msgid "Please type in your current password." +msgstr "Ingrese su contraseña actual." + +msgid "Stock check error" +msgstr "Error de verificación de existencias" + +msgid "We are facing a problem with checking inventory stock. Please try again" +msgstr "" +"Estamos teniendo un problema con la verificación de las existencias en " +"inventario. Vuelva a intentarlo" + +msgid "Invalid payload" +msgstr "Carga útil inválida" + +msgid "Invalid custom form field ID provided: {field}" +msgstr "" +"Se proporcionó una identificación de campo de formulario inválida: {field}" + +msgid "All prices are in %s" +msgstr "Todos los precios están en %s" + +msgid "" +"Your order does not meet the minimum total for this coupon code to be " +"applied. Please spend another {amountDiff} first." +msgstr "" +"Su pedido no alcanza el total mínimo para que se aplique este código de " +"cupón. Ingrese otro gasto de {amountDiff} primero." + +msgid "" +"We don't have enough {product} stock on hand for the quantity you selected. " +"Please try again." +msgstr "" +"No tenemos suficientes existencias {product} para la cantidad que " +"seleccionó. Vuelva a intentarlo." + +msgid "Promotion is inactive" +msgstr "La promoción está inactiva" + +msgid "This promotion cannot be applied with the selected currency" +msgstr "Esta promoción no puede aplicarse con la moneda seleccionada" + +msgid "You are not in the customer group the promotion targets" +msgstr "No está en el grupo de clientes que son los objetivos de la promoción" + +msgid "You do not meet the minimum order requirement for the promotion" +msgstr "No cumple con el requisito de pedido mínimo para la promoción" + +msgid "Shipping address is required for the promotion" +msgstr "Se requiere la dirección de envío para la promoción" + +msgid "The promotion can not be used in order with multiple shipping addresses" +msgstr "" +"La promoción no puede utilizarse en orden con múltiples direcciones de envío" + +msgid "The promotion can not be applied for this shipping address" +msgstr "La promoción no puede aplicarse para esta dirección de envío" + +msgid "Something went wrong" +msgstr "Algo salió mal" + +msgid "The coupon code you entered has been disabled so it can't be used." +msgstr "" +"El código de cupón que ingresó se desactivó para que no pueda utilizarse." + +msgid "The coupon code you entered expired on %s so it can't be used." +msgstr "" +"El código del cupón que introdujo venció el %s por lo que no puede " +"utilizarse." + +msgid "The coupon code you entered has already expired so it can't be used." +msgstr "" +"El código de cupón que ingresó ya venció, por lo que no puede utilizarse." + +msgid "Coupon code can not be found" +msgstr "No se encuentra el código del cupón" + +msgid "This promotion can not be used in conjunction with other promotions" +msgstr "Esta promoción no puede utilizarse junto con otras promociones" + +msgid "unknown" +msgstr "Se desconoce" + +msgid "" +"Unfortunately this product is no longer for sale so it cannot be reordered." +msgstr "" +"Lamentablemente, este producto ya no está a la venta, por lo que no puede " +"volver a pedirse." + +msgid "This product cannot be reordered because it's out of stock." +msgstr "Este producto no puede volverse a pedir porque está agotado." + +msgid "Please select a file for the {displayName} option." +msgstr "Seleccione un archivo para la opción {displayName}." + +msgid "Unfortunately this product is not available for purchase." +msgstr "Desafortunadamente, este producto no está disponible para su compra." + +msgid "" +"The inventory level for the following product is below what you ordered, so " +"we could not proceed with the checkout: {productName}" +msgstr "" +"El nivel de inventario del siguiente producto está por debajo de la cantidad " +"que solicitó, por lo que no pudimos iniciar el proceso de pago: {productName}" + +msgid "The coupon has been removed from your cart." +msgstr "El cupón se eliminó de su carrito." + +msgid "Forgot Password" +msgstr "Olvidé mi contraseña" + +msgid "Create Account" +msgstr "Crear cuenta" + +msgid "Your Account Has Been Created" +msgstr "Se creó su cuenta" + +msgid "Sign in" +msgstr "Iniciar sesión" + +msgid "" +"If the entered email address is associated with this store, you will receive " +"a password reset email. If you don't receive this e-mail, please check your " +"junk mail folder or contact us for further assistance." +msgstr "" +"Si la dirección de correo electrónico ingresada está asociada a esta tienda, " +"recibirá un correo electrónico para el restablecimiento de la contraseña. Si " +"no recibe este correo electrónico, revise su carpeta de correo no deseado o " +"contáctenos para obtener más ayuda." + +msgid "" +"The link you were given in the Request Password email is invalid. Please " +"request another new password to receive a new link." +msgstr "" +"El enlace que se le proporcionó en el correo electrónico Solicitar " +"contraseña es inválido. Solicite otra contraseña para recibir un nuevo " +"enlace." + +msgid "" +"An internal error occurred while trying to change your password. Please try " +"again." +msgstr "" +"Ocurrió un error interno al intentar cambiar su contraseña. Vuelva a " +"intentarlo." + +msgid "Sorry, your passwords do not match. Please try again." +msgstr "Lo sentimos, pero sus contraseñas no coinciden. Vuelva a intentarlo." + +msgid "" +"Passwords must be at least 7 characters and contain both alphabetic and " +"numeric characters." +msgstr "" +"Las contraseñas deben tener al menos 7 caracteres y tanto caracteres " +"alfabéticos como numéricos." + +msgid "You need to sign in to access this page." +msgstr "Es necesario registrarse para acceder a esta página." + +msgid "Your password has been successfully updated." +msgstr "Su contraseña se actualizó correctamente." + +msgid "Please provide a valid return URL" +msgstr "Proporcione una URL de redireccionamiento válido" + +msgid "Please type in a valid email address, such as joe@example.com" +msgstr "" +"Ingrese una dirección de correo electrónico válida, como jose@ejemplo.com." + +msgid "" +"Too many requests made when trying to send password-less login, please try " +"again later." +msgstr "" +"Demasiadas solicitudes al intentar enviar el acceso sin contraseña; " +"inténtelo de nuevo más tarde." + +msgid "Email failed to send, please try again later." +msgstr "Error al enviar el correo electrónico. Vuelva a intentarlo más tarde." + +msgid "" +"You left some items from a previous cart. We have added those items to your " +"current cart." +msgstr "" +"Dejó algunos artículos en un carrito anterior. Hemos añadido esos artículos " +"a su carrito actual." + +msgid "The captcha you entered is incorrect. Please try again." +msgstr "El captcha que ingresó es incorrecto. Vuelva a intentarlo." + +msgid "" +"Your email address or password is incorrect. Please try again. If you've " +"forgotten your sign in details, just click the 'Forgot your password?' link " +"below." +msgstr "" +"Su dirección de correo electrónico o la contraseña es incorrecta. Vuelva a " +"intentarlo. Si olvidó sus datos de inicio de sesión, haga clic en '¿Olvidó " +"su contraseña?', en el enlace de abajo." + +msgid "" +"Due to excessive login attempts, please wait %s seconds before attempting to " +"log in again." +msgstr "" +"Debido que hubo una cantidad excesiva de intentos de acceso, espere %s " +"segundos antes de intentar acceder de nuevo." + +msgid "" +"You must reset your password before you may log in again. Please check your " +"email at :email to reset your password" +msgstr "" +"Debe restablecer su contraseña antes de poder ingresar de nuevo. Revise su " +"correo electrónico en :email para restablecer su contraseña." + +msgid "You cannot create an account at this time." +msgstr "No puede crear una cuenta en este momento." + +msgid "Click here to continue." +msgstr "Haga clic aquí para continuar." + +msgid "Click here to continue shopping" +msgstr "Haga clic aquí para seguir comprando" + +msgid "The email address %s is already in use. Please enter a different one." +msgstr "" +"La dirección de correo electrónico %s ya está en uso. Ingrese una diferente." + +msgid "" +"Please type in a valid phone number containing at least 3 numbers. The only " +"special characters allowed are: :allowedchars" +msgstr "" +"Escriba un número de teléfono válido que contenga al menos 3 números. Los " +"únicos caracteres especiales permitidos son: :allowedchars" + +msgid "Your passwords don't match." +msgstr "Sus contraseñas no coinciden." + +msgid "" +"An internal error occurred while trying to create your account. Please try " +"again." +msgstr "" +"Ocurrió un error interno al intentar crear su cuenta. Vuelva a intentarlo." + +msgid "" +"Sign in or sign out" +msgstr "" +"Inicie la sesión o ciérrela" + +msgid "" +"Sign in or Create an account" +msgstr "" +"Inicie sesión o cree una cuenta" + +msgid "You've been logged out of your account successfully." +msgstr "Su sesión se cerró correctamente en su cuenta." + +msgid "Token is missing." +msgstr "Desapareció el token." + +msgid "" +"Sign in failed. The provided token has expired or already been used. Please " +"try again." +msgstr "" +"El inicio de sesión falló. El token proporcionado ya caducó o se utilizó. " +"Vuelva a intentarlo." + +msgid "Please choose a valid amount for this gift certificate." +msgstr "Elija un importe válido para este certificado de regalo." + +msgid "Please enter a valid amount for this gift certificate." +msgstr "Ingrese un importe válido para este certificado de regalo." + +msgid "" +"Please enter an amount between the minimum and maximum gift certificate " +"value." +msgstr "" +"Ingrese un importe entre el valor mínimo y máximo del certificado de regalo." + +msgid "" +"Please enter the name of the person you wish to send this gift certificate " +"to." +msgstr "" +"Ingrese el nombre de la persona a la que desea enviar este certificado de " +"regalo." + +msgid "" +"Please enter a valid email address for the person you wish to send this gift " +"certificate to." +msgstr "" +"Ingrese una dirección de correo electrónico válida de la persona a la que " +"desea enviar este certificado de regalo." + +msgid "Please enter your name." +msgstr "Ingrese su nombre." + +msgid "Please enter your email address." +msgstr "Ingrese su dirección de correo electrónico." + +msgid "Please enter a shorter message for your gift certificate." +msgstr "Ingrese un mensaje más corto para su certificado de regalo." + +msgid "Please select a theme for your gift certificate." +msgstr "Seleccione un tema para su certificado de regalo." + +msgid "Cannot purchase a Gift Certificate using a Gift Certificate" +msgstr "" +"No se puede comprar un certificado de regalo con un certificado de regalo" + +msgid "Your gift certificate has been updated successfully." +msgstr "Su certificado de regalo se actualizó correctamente." + +msgid "Your gift certificate has been generated and saved in your cart." +msgstr "Su certificado de regalo se generó y guardó en su carrito." + +msgid "The selected product combination doesn't exist." +msgstr "No existe la combinación de productos seleccionada." + +msgid "Please enter a valid product quantity." +msgstr "Ingrese una cantidad de producto válida." + +msgid "Please enter a title, text and rating for your review." +msgstr "Ingrese un título, texto y calificación para su reseña." + +msgid "" +"You are only allowed to post :number product review every :duration. Please " +"try again later." +msgstr "" +"Solo puede publicar :number reseña(s) de producto cada :duration. Vuelva a " +"intentarlo más tarde." + +msgid "The email you entered is incorrect. Please type it again." +msgstr "El correo electrónico que ingresó es incorrecto. Escríbalo de nuevo." + +msgid "An internal error occurred while trying to save your review." +msgstr "Ocurrió un error interno al tratar de guardar su reseña." + +msgid "Your review was saved and is shown below." +msgstr "Su reseña se guardó y se muestra a continuación." + +msgid "Your review was saved and is pending approval." +msgstr "Su reseña se guardó y está pendiente de aprobación." + +msgid "Only customers who have purchased this item can review it." +msgstr "" +"Solo los clientes que hayan comprado este artículo pueden hacer una reseña." + +msgid "Oops..." +msgstr "¡Vaya!" + +msgid "Please enter your name and email address before submitting this form." +msgstr "" +"Ingrese su nombre y dirección de correo electrónico antes de enviar este " +"formulario." + +msgid "" +"Sorry, your request could not be processed as it contained an invalid " +"security token. Please refresh and try again." +msgstr "" +"Lo sentimos, pero su solicitud no pudo procesarse porque contenía un token " +"de seguridad inválido. Actualice la página e inténtelo de nuevo." + +msgid "Newsletter Subscription" +msgstr "Suscripción al boletín de noticias" + +msgid "Please enter a valid email address, such as john@example.com." +msgstr "" +"Ingrese una dirección de correo electrónico válida, como por ejemplo, " +"joe@example.com." + +msgid "The email address %s is already subscribed to receive our newsletter." +msgstr "" +"La dirección de correo electrónico %s ya está inscrita para recibir nuestro " +"boletín." + +msgid "Thanks for Subscribing!" +msgstr "¡Gracias por suscribirse!" + +msgid "" +"Thank you for joining our mailing list. You'll be sent the next issue of our " +"newsletter shortly." +msgstr "" +"Gracias por unirse a nuestra lista de correo. Se le enviará el próximo " +"número de nuestro boletín en breve." + +msgid "Continue" +msgstr "Continuar" + +msgid "" +"The gift certificate you entered couldn't be applied to any items in your " +"order." +msgstr "" +"El certificado de regalo que ingresó no pudo aplicarse a ningún artículo de " +"su pedido." + +msgid "The gift certificate {code} does not exist" +msgstr "El certificado de regalo {code} no existe" + +msgid "Please enter a valid zip code/postcode or state." +msgstr "Ingrese un código postal o estado válido." + +msgid "Please select a valid state." +msgstr "Seleccione un estado válido." + +msgid "Please enter a valid zip code/postcode." +msgstr "Ingrese un código postal válido." + +msgid "" +"Unfortunately one or more items in your cart can't be shipped to your " +"location. Please choose a different delivery address." +msgstr "" +"Lamentablemente, uno o más artículos de su carrito no pueden enviarse a su " +"ubicación. Elija una dirección de entrega diferente." + +msgid "Unable to retrieve shipping quote. Please try again or contact support." +msgstr "" +"No se puede recuperar la cotización del envío. Inténtelo de nuevo o póngase " +"en contacto con el servicio de soporte." + +msgid "Passwords must be at least :length characters and contain: " +msgstr "" +"Las contraseñas deben tener una longitud de al menos :length y contener: " + +msgid "lower case letters" +msgstr "letras minúsculas" + +msgid "upper case letters" +msgstr "letras mayúsculas" + +msgid "at least :numbers " +msgstr "al menos :numbers " + +msgid "at least :specialchars " +msgstr "al menos :specialchars " + +msgid "" +"Subject to Status. Terms and Conditions Apply. {merchantName} acts as a " +"broker and offers credit from PayPal Credit.\n" +"PayPal Credit is a trading name of PayPal (Europe) .à.r.l. et Cie, S.C.A., " +"22-24 Boulevard Royal L-2449, Luxembourg." +msgstr "" +"Sujeto al estado. Aplican términos y condiciones. {merchantName} actúa como " +"intermediario y ofrece crédito de PayPal.\n" +"PayPal Credit es el nombre comercial de PayPal (Europa) .à.r.l. et Cie, S.C." +"A., 22-24 Boulevard Royal L-2449, Luxemburgo." + +msgid "Add payment method" +msgstr "Agregar método de pago" + +msgid "Address Book" +msgstr "Libreta de direcciones" + +msgid "Address Form" +msgstr "Formulario de dirección" + +msgid "Your Orders" +msgstr "Sus pedidos" + +msgid "Order #{id}" +msgstr "Pedido #{id}" + +msgid "Files" +msgstr "Archivos" + +msgid "Account Details" +msgstr "Detalles de la cuenta" + +msgid "Edit Payment Method" +msgstr "Editar método de pago" + +msgid "Your Messages" +msgstr "Sus mensajes" + +msgid "Login" +msgstr "Iniciar sesión" + +msgid "Reset Password" +msgstr "Restablecer la contraseña" + +msgid "Create New Return" +msgstr "Crear nueva devolución" + +msgid "Your Account" +msgstr "Su cuenta" + +msgid "Payment Methods" +msgstr "Métodos de pago" + +msgid "Recently Viewed Items" +msgstr "Elementos vistos recientemente" + +msgid "Your Returns" +msgstr "Sus devoluciones" + +msgid "Return Saved" +msgstr "Devolución guardada" + +msgid "New Wishlist" +msgstr "Nueva lista de deseos" + +msgid "Edit Wishlist" +msgstr "Editar lista de deseos" + +msgid "Your Wishlists" +msgstr "Sus listas de deseos" + +msgid "All Brands" +msgstr "Todas las marcas" + +msgid "Your Cart" +msgstr "Su carrito" + +msgid "Compare Products" +msgstr "Comparar productos" + +msgid "Error" +msgstr "Error" + +msgid "Gift Certificates" +msgstr "Certificados de regalo" + +msgid "Search" +msgstr "Buscar" + +msgid "Sitemap" +msgstr "Mapa del sitio" + +msgid "View Wishlist" +msgstr "Ver lista de deseos" + +msgid "View Shared Wishlist" +msgstr "Ver lista de deseos compartidos" + +msgid "Home" +msgstr "Inicio" diff --git a/assets/PO/storefront-fr-FR.po b/assets/PO/storefront-fr-FR.po new file mode 100644 index 000000000..103243322 --- /dev/null +++ b/assets/PO/storefront-fr-FR.po @@ -0,0 +1,578 @@ +# entity_escaping_strategy = propagate +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-10-06T16:43:04+00:00\n" +"PO-Revision-Date: 2020-10-06T16:43:04+00:00\n" +"Language: fr-FR\n" + +msgid "" +"The coupon code you entered couldn't be applied to any items in your order." +msgstr "" +"Le code promotionnel que vous avez saisi n'a pas pu être appliqué aux " +"articles de votre commande." + +msgid "" +"There was an error updating your billing address. Please check all fields " +"are correct and try again." +msgstr "" +"Une erreur est survenue lors de la mise à jour de votre adresse de " +"facturation. Veuillez vérifier que tous les champs sont corrects et " +"réessayer." + +msgid "My Account" +msgstr "Mon compte" + +msgid "You have requested an invalid product download. Please try again." +msgstr "" +"Vous avez demandé le téléchargement d'un produit non valide. Veuillez " +"réessayer." + +msgid "This download has expired." +msgstr "Ce téléchargement a expiré." + +msgid "Product Downloads" +msgstr "Téléchargements de produits" + +msgid "Files for %s" +msgstr "Documents pour %s" + +msgid "The files available for %s are listed below." +msgstr "Veuillez trouver ci-dessous les documents disponibles pour %s." + +msgid "Your account details have been updated." +msgstr "Les informations de votre compte ont été mises à jour." + +msgid "Something went wrong trying to update your details. Please try again." +msgstr "" +"Une erreur s'est produite lors de la mise à jour de vos informations. " +"Veuillez réessayer." + +msgid "Please type in your current password." +msgstr "Veuillez saisir votre mot de passe actuel." + +msgid "My Wish List" +msgstr "Ma liste d'envies" + +msgid "The item has been added to your wish list." +msgstr "L'article a été ajouté à votre liste d'envies." + +msgid "All prices are in %s" +msgstr "Tous les prix sont exprimés en %s" + +msgid "" +"Your order does not meet the minimum total for this coupon code to be " +"applied. Please spend another {amountDiff} first." +msgstr "" +"Votre commande n'atteint pas le montant total minimum pour que ce code " +"promotionnel puisse être appliqué. Il vous manque {amountDiff}." + +msgid "" +"We don't have enough {product} stock on hand for the quantity you selected. " +"Please try again." +msgstr "" +"Notre stock de {product} est inférieur à la quantité que vous avez " +"sélectionnée. Veuillez réessayer." + +msgid "Promotion is inactive" +msgstr "La promotion n'est pas active" + +msgid "This promotion cannot be applied with the selected currency" +msgstr "Cette promotion ne peut pas être appliquée avec la devise sélectionnée" + +msgid "You are not in the customer group the promotion targets" +msgstr "Vous ne faites pas partie du groupe de clients visé par la promotion" + +msgid "You do not meet the minimum order requirement for the promotion" +msgstr "" +"Vous n'avez pas atteint le minimum de commande requis pour cette promotion" + +msgid "Shipping address is required for the promotion" +msgstr "L'adresse de livraison est nécessaire pour que la promotion s'applique" + +msgid "The promotion can not be used in order with multiple shipping addresses" +msgstr "" +"La promotion ne peut pas être utilisée pour une commande avec plusieurs " +"adresses de livraison" + +msgid "The promotion can not be applied for this shipping address" +msgstr "La promotion n'est pas valable pour cette adresse de livraison" + +msgid "Something went wrong" +msgstr "Une erreur s'est produite" + +msgid "The coupon code you entered has been disabled so it can't be used." +msgstr "" +"Le code promotionnel que vous avez saisi a été désactivé et ne peut donc pas " +"être utilisé." + +msgid "The coupon code you entered expired on %s so it can't be used." +msgstr "" +"Le code promotionnel que vous avez saisi a expiré le %s et ne peut donc pas " +"être utilisé." + +msgid "The coupon code you entered has already expired so it can't be used." +msgstr "" +"Le code promotionnel que vous avez saisi a expiré et ne peut donc pas être " +"utilisé." + +msgid "Coupon code can not be found" +msgstr "Le code promotionnel est introuvable" + +msgid "This promotion can not be used in conjunction with other promotions" +msgstr "Cette promotion ne peut pas être combinée avec d'autres promotions" + +msgid "unknown" +msgstr "inconnu" + +msgid "" +"Unfortunately this product is no longer for sale so it cannot be reordered." +msgstr "" +"Ce produit n'est malheureusement plus en vente et ne peut donc pas être " +"commandé à nouveau." + +msgid "This product cannot be reordered because it's out of stock." +msgstr "" +"Ce produit ne peut pas être commandé à nouveau car il est en rupture de " +"stock." + +msgid "Please select a file for the {displayName} option." +msgstr "Veuillez sélectionner un fichier pour l'option {displayName}." + +msgid "Unfortunately this product is not available for purchase." +msgstr "Ce produit n'est malheureusement pas disponible à l'achat." + +msgid "" +"The inventory level for the following product is below what you ordered, so " +"we could not proceed with the checkout: {productName}" +msgstr "" +"Le niveau de stock de ce produit est inférieur à la quantité que vous avez " +"commandée, nous n'avons donc pas pu procéder au paiement : {productName}" + +msgid "The coupon has been removed from your cart." +msgstr "Le code promotionnel a été retiré de votre panier." + +msgid "Forgot Password" +msgstr "Mot de passe oublié" + +msgid "Create Account" +msgstr "Créer un compte" + +msgid "Your Account Has Been Created" +msgstr "Votre compte a été créé" + +msgid "Sign in" +msgstr "Se connecter" + +msgid "" +"If the entered email address is associated with this store, you will receive " +"a password reset email. If you don't receive this e-mail, please check your " +"junk mail folder or contact us for further assistance." +msgstr "" +"Si l'adresse e-mail saisie est associée à un compte sur ce site, vous " +"recevrez un e-mail de réinitialisation du mot de passe. Si vous ne recevez " +"pas cet e-mail, veuillez vérifier vos courriers indésirables ou nous " +"contacter pour obtenir de l'aide." + +msgid "" +"The link you were given in the Request Password email is invalid. Please " +"request another new password to receive a new link." +msgstr "" +"Le lien que vous avez reçu dans l'email de réinitialisation du mot de passe " +"n'est pas valide. Veuillez refaire une demande de réinitialisation du mot de " +"passe pour recevoir un nouveau lien." + +msgid "" +"An internal error occurred while trying to change your password. Please try " +"again." +msgstr "" +"Une erreur interne s'est produite lors de la modification de votre mot de " +"passe. Veuillez réessayer." + +msgid "Sorry, your passwords do not match. Please try again." +msgstr "Désolé, les mots de passe ne correspondent pas. Veuillez réessayer." + +msgid "" +"Passwords must be at least 7 characters and contain both alphabetic and " +"numeric characters." +msgstr "" +"Votre mot de passe doit comporter au moins 7 caractères et au moins un " +"chiffre et une lettre." + +msgid "You need to sign in to access this page." +msgstr "Vous devez vous connecter pour accéder à cette page." + +msgid "Your password has been successfully updated." +msgstr "Votre mot de passe a bien été mis à jour." + +msgid "Please type in a valid email address, such as joe@example.com" +msgstr "Veuillez saisir une adresse e-mail valide, telle que jean@exemple.fr" + +msgid "" +"Too many requests made when trying to send password-less login, please try " +"again later." +msgstr "" +"Vous avez effectué trop de demandes en essayant de vous connecter sans mot " +"de passe, veuillez réessayer plus tard." + +msgid "Email failed to send, please try again later." +msgstr "L'e-mail n'a pas pu être envoyé, veuillez réessayer plus tard." + +msgid "" +"You left some items from a previous cart. We have added those items to your " +"current cart." +msgstr "" +"Vous avez laissé des articles dans votre panier précédent. Nous avons ajouté " +"ces articles à votre panier actuel." + +msgid "The captcha you entered is incorrect. Please try again." +msgstr "Le captcha que vous avez saisi est incorrect. Veuillez réessayer." + +msgid "" +"Your email address or password is incorrect. Please try again. If you've " +"forgotten your sign in details, just click the 'Forgot your password?' link " +"below." +msgstr "" +"Votre adresse e-mail ou votre mot de passe est incorrect. Veuillez " +"réessayer. Si vous avez oublié vos identifiants de connexion, cliquez sur le " +"lien « Mot de passe oublié ? » ci-dessous." + +msgid "" +"You must reset your password before you may log in again. Please check your " +"email at :email to reset your password" +msgstr "" +"Vous devez réinitialiser votre mot de passe avant de pouvoir vous connecter " +"à nouveau. Veuillez consulter la boîte de réception de :email pour " +"réinitialiser votre mot de passe." + +msgid "" +"Due to excessive login attempts, please wait %s seconds before attempting to " +"log in again." +msgstr "" +"En raison d'un nombre excessif de tentatives de connexion, veuillez attendre " +"%s secondes avant de réessayer de vous connecter." + +msgid "You cannot create an account at this time." +msgstr "Vous ne pouvez pas créer de compte pour le moment." + +msgid "Click here to continue." +msgstr "Cliquez ici pour continuer." + +msgid "Click here to continue shopping" +msgstr "Cliquez ici pour continuer vos achats" + +msgid "The email address %s is already in use. Please enter a different one." +msgstr "L'adresse e-mail %s est déjà utilisée. Veuillez en saisir une autre." + +msgid "" +"Please type in a valid phone number containing at least 3 numbers. The only " +"special characters allowed are: :allowedchars" +msgstr "" +"Veuillez saisir un numéro de téléphone valide contenant au moins 3 chiffres. " +"Les seuls caractères spéciaux autorisés sont : :allowedchars" + +msgid "Your passwords don't match." +msgstr "Les mots de passe ne correspondent pas." + +msgid "" +"An internal error occurred while trying to create your account. Please try " +"again." +msgstr "" +"Une erreur interne s'est produite lors de la création de votre compte. " +"Veuillez réessayer." + +msgid "" +"Sign in or sign out" +msgstr "" +"Se connecter ou se déconnecter" + +msgid "" +"Sign in or Create an account" +msgstr "" +"Se connecter ou Créer un compte" + +msgid "You've been logged out of your account successfully." +msgstr "Vous avez bien été déconnecté(e)." + +msgid "Token is missing." +msgstr "Jeton manquant." + +msgid "" +"Sign in failed. The provided token has expired or already been used. Please " +"try again." +msgstr "" +"La tentative de connexion a échoué. Le jeton saisi a expiré ou a déjà été " +"utilisé. Veuillez réessayer." + +msgid "Please choose a valid amount for this gift certificate." +msgstr "Veuillez choisir un montant valide pour ce chèque-cadeau." + +msgid "Please enter a valid amount for this gift certificate." +msgstr "Veuillez saisir un montant valide pour ce chèque-cadeau." + +msgid "" +"Please enter an amount between the minimum and maximum gift certificate " +"value." +msgstr "" +"Veuillez indiquer un montant compris entre la valeur minimale et la valeur " +"maximale du chèque-cadeau." + +msgid "" +"Please enter the name of the person you wish to send this gift certificate " +"to." +msgstr "Veuillez saisir le nom du destinataire de ce chèque-cadeau." + +msgid "" +"Please enter a valid email address for the person you wish to send this gift " +"certificate to." +msgstr "" +"Veuillez saisir une adresse e-mail valide pour le destinataire de ce chèque-" +"cadeau." + +msgid "Please enter your name." +msgstr "Veuillez saisir votre nom." + +msgid "Please enter your email address." +msgstr "Veuillez saisir votre adresse e-mail." + +msgid "Please enter a shorter message for your gift certificate." +msgstr "Veuillez saisir un message moins long pour votre chèque-cadeau." + +msgid "Please select a theme for your gift certificate." +msgstr "Veuillez sélectionner un thème pour votre chèque-cadeau." + +msgid "Cannot purchase a Gift Certificate using a Gift Certificate" +msgstr "" +"Vous ne pouvez pas acheter de chèque-cadeau en utilisant un chèque-cadeau." + +msgid "Your gift certificate has been updated successfully." +msgstr "Votre chèque-cadeau a bien été mis à jour." + +msgid "Your gift certificate has been generated and saved in your cart." +msgstr "Votre chèque-cadeau a été créé et enregistré dans votre panier." + +msgid "The selected product combination doesn't exist." +msgstr "L'assortiment de produits sélectionné n'existe pas." + +msgid "Please enter a valid product quantity." +msgstr "Veuillez saisir une quantité valide." + +msgid "Please enter a title, text and rating for your review." +msgstr "Veuillez saisir un titre, un texte et une note pour votre avis." + +msgid "" +"You are only allowed to post :number product review every :duration. Please " +"try again later." +msgstr "" +"Vous ne pouvez publier que :number avis tous les :duration. Veuillez " +"réessayer plus tard." + +msgid "The email you entered is incorrect. Please type it again." +msgstr "" +"L'adresse e-mail que vous avez saisie est incorrect. Veuillez réessayer." + +msgid "An internal error occurred while trying to save your review." +msgstr "" +"Une erreur interne s'est produite lors de l'enregistrement de votre avis." + +msgid "Your review was saved and is shown below." +msgstr "Votre avis a été enregistré et est affiché ci-dessous." + +msgid "Your review was saved and is pending approval." +msgstr "Votre avis a été enregistré et est en attente de vérification." + +msgid "Only customers who have purchased this item can review it." +msgstr "Seuls les clients qui ont acheté cet article peuvent donner leur avis." + +msgid "Oops..." +msgstr "Oups..." + +msgid "Please enter your name and email address before submitting this form." +msgstr "" +"Veuillez saisir votre nom et votre adresse e-mail avant d'envoyer ce " +"formulaire." + +msgid "" +"Sorry, your request could not be processed as it contained an invalid " +"security token. Please refresh and try again." +msgstr "" +"Désolé, votre demande n'a pas pu être traitée car elle contenait un jeton de " +"sécurité non valide. Veuillez actualiser et réessayer." + +msgid "Newsletter Subscription" +msgstr "Abonnement à la newsletter" + +msgid "Please enter a valid email address, such as john@example.com." +msgstr "Veuillez saisir une adresse e-mail valide, telle que jean@exemple.fr." + +msgid "The email address %s is already subscribed to receive our newsletter." +msgstr "L'adresse e-mail %s est déjà abonnée à la newsletter." + +msgid "Thanks for Subscribing!" +msgstr "Merci pour votre abonnement !" + +msgid "" +"Thank you for joining our mailing list. You'll be sent the next issue of our " +"newsletter shortly." +msgstr "" +"Merci d'avoir rejoint notre liste de diffusion. Vous recevrez bientôt le " +"prochain numéro de notre newsletter." + +msgid "Continue" +msgstr "Continuer" + +msgid "" +"The gift certificate you entered couldn't be applied to any items in your " +"order." +msgstr "" +"Le chèque-cadeau que vous avez saisi n'a pas pu être appliqué aux articles " +"de votre commande." + +msgid "The gift certificate {code} does not exist" +msgstr "Le chèque-cadeau {code} n'existe pas" + +msgid "Please enter a valid zip code/postcode or state." +msgstr "Veuillez saisir un code postal ou une région valide." + +msgid "Please select a valid state." +msgstr "Veuillez sélectionner une région valide." + +msgid "Please enter a valid zip code/postcode." +msgstr "Veuillez saisir un code postal valide." + +msgid "" +"Unfortunately one or more items in your cart can't be shipped to your " +"location. Please choose a different delivery address." +msgstr "" +"Malheureusement, au moins un des articles de votre panier ne peut pas être " +"livré à votre adresse. Veuillez choisir une autre adresse de livraison." + +msgid "Unable to retrieve shipping quote. Please try again or contact support." +msgstr "" +"Impossible de récupérer le devis de livraison. Veuillez réessayer ou " +"contacter le service d'assistance." + +msgid "Passwords must be at least :length characters and contain: " +msgstr "Votre mot de passe doit comporter au moins :length caractères et : " + +msgid "lower case letters" +msgstr "des lettres minuscules" + +msgid "upper case letters" +msgstr "des lettres majuscules" + +msgid "at least :numbers " +msgstr "au moins :numbers " + +msgid "at least :specialchars " +msgstr "au moins :specialchars " + +msgid "" +"{merchantName} ACTS LIKE A BROKER AND OFFERS CREDIT FROM PAYPAL CREDIT.\n" +"PAYPAL CREDIT IS A TRADING NAME OF PAYPAL (Europe) S.À.R.L. ET CIE, S.C.A., " +"22-24 BOULEVARD ROYAL L-2449, LUXEMBOURG" +msgstr "" +"{merchantName} JOUE LE RÔLE D'INTERMÉDIAIRE ET PROPOSE DU CRÉDIT À PARTIR DE " +"PAYPAL CREDIT.\n" +"PAYPAL CREDIT EST UNE APPELLATION COMMERCIALE DE PAYPAL (Europe) S.À.R.L. ET " +"CIE, S.C.A., 22-24 BOULEVARD ROYAL L-2449, LUXEMBOURG" + +msgid "Add payment method" +msgstr "Ajouter un mode de paiement" + +msgid "Address Book" +msgstr "Carnet d'adresses" + +msgid "Address Form" +msgstr "Formulaire d'adresse" + +msgid "Your Orders" +msgstr "Vos commandes" + +msgid "Order #{id}" +msgstr "Commande n° {id}" + +msgid "Files" +msgstr "Documents" + +msgid "Account Details" +msgstr "Informations du compte" + +msgid "Edit Payment Method" +msgstr "Modifier le mode de paiement" + +msgid "Your Messages" +msgstr "Vos messages" + +msgid "Login" +msgstr "Connexion" + +msgid "Reset Password" +msgstr "Réinitialiser le mot de passe" + +msgid "Create New Return" +msgstr "Créer un nouveau retour" + +msgid "Your Account" +msgstr "Votre compte" + +msgid "Payment Methods" +msgstr "Modes de paiement" + +msgid "Recently Viewed Items" +msgstr "Articles récemment consultés" + +msgid "Your Returns" +msgstr "Vos retours" + +msgid "Return Saved" +msgstr "Retour enregistré" + +msgid "New Wishlist" +msgstr "Nouvelle liste d'envies" + +msgid "Edit Wishlist" +msgstr "Modifier la liste d'envies" + +msgid "Your Wishlists" +msgstr "Vos listes d'envies" + +msgid "All Brands" +msgstr "Toutes les marques" + +msgid "Your Cart" +msgstr "Votre panier" + +msgid "Compare Products" +msgstr "Comparer les produits" + +msgid "Error" +msgstr "Erreur" + +msgid "Gift Certificates" +msgstr "Chèques-cadeaux" + +msgid "Search" +msgstr "Rechercher" + +msgid "Sitemap" +msgstr "Plan du site" + +msgid "View Wishlist" +msgstr "Voir la liste d'envies" + +msgid "View Shared Wishlist" +msgstr "Voir la liste d'envies partagée" + +msgid "Home" +msgstr "Accueil" diff --git a/assets/PO/storefront-it-IT.po b/assets/PO/storefront-it-IT.po new file mode 100644 index 000000000..fda63420a --- /dev/null +++ b/assets/PO/storefront-it-IT.po @@ -0,0 +1,587 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-11-22T23:30:49+00:00\n" +"PO-Revision-Date: 2020-11-22T23:30:49+00:00\n" +"Language: it-IT\n" + +msgid "" +"The coupon code you entered couldn't be applied to any items in your order." +msgstr "" +"Il codice promozionale che hai inserito non può essere applicato a nessun " +"articolo del tuo ordine." + +msgid "" +"There was an error updating your billing address. Please check all fields " +"are correct and try again." +msgstr "" +"Si è verificato un errore durante l'aggiornamento del tuo indirizzo di " +"fatturazione. Verifica che tutti i campi siano corretti e prova di nuovo." + +msgid "My Account" +msgstr "Il mio account" + +msgid "You have requested an invalid product download. Please try again." +msgstr "Hai richiesto il download di un prodotto non valido. Prova di nuovo." + +msgid "This download has expired." +msgstr "Questo download è scaduto." + +msgid "Product Downloads" +msgstr "Download prodotto" + +msgid "Files for %s" +msgstr "File per %s" + +msgid "The files available for %s are listed below." +msgstr "I file disponibili per %s sono elencati di seguito." + +msgid "Your account details have been updated." +msgstr "I dettagli del tuo account sono stati aggiornati." + +msgid "Something went wrong trying to update your details. Please try again." +msgstr "" +"Si è verificato un errore durante l'aggiornamento dei tuoi dati. Prova di " +"nuovo." + +msgid "Please type in your current password." +msgstr "Inserisci la password attuale." + +msgid "Stock check error" +msgstr "Errore controllo delle scorte" + +msgid "We are facing a problem with checking inventory stock. Please try again" +msgstr "" +"Stiamo riscontrando problemi con la verifica delle scorte di magazzino. " +"Riprova" + +msgid "Invalid payload" +msgstr "Payload non valido" + +msgid "Invalid custom form field ID provided: {field}" +msgstr "ID campo modulo personalizzato specificato non valido: {field}" + +msgid "All prices are in %s" +msgstr "Tutti i prezzi sono indicati in %s" + +msgid "" +"Your order does not meet the minimum total for this coupon code to be " +"applied. Please spend another {amountDiff} first." +msgstr "" +"Il tuo ordine non soddisfa il totale minimo per applicare questo codice " +"promozionale. Ti preghiamo di spendere prima altri {amountDiff}." + +msgid "" +"We don't have enough {product} stock on hand for the quantity you selected. " +"Please try again." +msgstr "" +"Al momento non abbiamo abbastanza scorte di {product} a magazzino per " +"soddisfare la quantità selezionata. Riprova." + +msgid "Promotion is inactive" +msgstr "La promozione non è attiva" + +msgid "This promotion cannot be applied with the selected currency" +msgstr "Questa promozione non può essere applicata con la valuta selezionata" + +msgid "You are not in the customer group the promotion targets" +msgstr "Non fai parte del gruppo di clienti a cui è rivolta la promozione" + +msgid "You do not meet the minimum order requirement for the promotion" +msgstr "Non soddisfi i requisiti minimi di ordine per la promozione" + +msgid "Shipping address is required for the promotion" +msgstr "L'indirizzo di spedizione è obbligatorio per la promozione" + +msgid "The promotion can not be used in order with multiple shipping addresses" +msgstr "" +"La promozione non può essere utilizzata per un ordine con più indirizzi di " +"spedizione" + +msgid "The promotion can not be applied for this shipping address" +msgstr "" +"La promozione non può essere applicata per questo indirizzo di spedizione" + +msgid "Something went wrong" +msgstr "Si è verificato un errore" + +msgid "The coupon code you entered has been disabled so it can't be used." +msgstr "" +"Il codice promozionale che hai inserito è stato disattivato e non può essere " +"utilizzato." + +msgid "The coupon code you entered expired on %s so it can't be used." +msgstr "" +"Il codice promozionale che hai inserito è scaduto il %s e non può essere " +"utilizzato." + +msgid "The coupon code you entered has already expired so it can't be used." +msgstr "" +"Il codice promozionale che hai inserito è già scaduto e non può essere " +"utilizzato." + +msgid "Coupon code can not be found" +msgstr "Il codice promozionale non può essere trovato" + +msgid "This promotion can not be used in conjunction with other promotions" +msgstr "" +"Questa promozione non può essere utilizzata in combinazione con altre " +"promozioni" + +msgid "unknown" +msgstr "sconosciuto" + +msgid "" +"Unfortunately this product is no longer for sale so it cannot be reordered." +msgstr "" +"Purtroppo questo prodotto non è più in vendita, quindi non può essere " +"riordinato." + +msgid "This product cannot be reordered because it's out of stock." +msgstr "Questo prodotto non può essere riordinato perché è esaurito." + +msgid "Please select a file for the {displayName} option." +msgstr "Seleziona un file per l'opzione {displayName}." + +msgid "Unfortunately this product is not available for purchase." +msgstr "Purtroppo questo prodotto non è disponibile per l'acquisto." + +msgid "" +"The inventory level for the following product is below what you ordered, so " +"we could not proceed with the checkout: {productName}" +msgstr "" +"Il livello di inventario per il seguente prodotto è inferiore a quello " +"ordinato, per questo motivo non è stato possibile procedere con il checkout: " +"{productName}" + +msgid "The coupon has been removed from your cart." +msgstr "Il coupon promozionale è stato rimosso dal tuo carrello." + +msgid "Forgot Password" +msgstr "Password dimenticata" + +msgid "Create Account" +msgstr "Crea account" + +msgid "Your Account Has Been Created" +msgstr "Il tuo account è stato creato" + +msgid "Sign in" +msgstr "Accedi" + +msgid "" +"If the entered email address is associated with this store, you will receive " +"a password reset email. If you don't receive this e-mail, please check your " +"junk mail folder or contact us for further assistance." +msgstr "" +"Se l'indirizzo e-mail inserito è associato a questo negozio, riceverai un'e-" +"mail per la reimpostazione della password. Se non la ricevi, controlla la " +"cartella Posta indesiderata o contattaci per ulteriore assistenza." + +msgid "" +"The link you were given in the Request Password email is invalid. Please " +"request another new password to receive a new link." +msgstr "" +"Il link fornito nell'e-mail Richiedi password non è valido. Richiedi di " +"nuovo la password per ricevere un nuovo link." + +msgid "" +"An internal error occurred while trying to change your password. Please try " +"again." +msgstr "" +"Si è verificato un errore interno durante la modifica della tua password. " +"Prova di nuovo." + +msgid "Sorry, your passwords do not match. Please try again." +msgstr "Siamo spiacenti, le password non corrispondono. Prova di nuovo." + +msgid "" +"Passwords must be at least 7 characters and contain both alphabetic and " +"numeric characters." +msgstr "" +"Le password devono avere almeno 7 caratteri e contenere caratteri alfabetici " +"e numerici." + +msgid "You need to sign in to access this page." +msgstr "Devi effettuare l'accesso per accedere a questa pagina." + +msgid "Your password has been successfully updated." +msgstr "La password è stata aggiornata correttamente." + +msgid "Please provide a valid return URL" +msgstr "Inserisci un URL di ritorno valido" + +msgid "Please type in a valid email address, such as joe@example.com" +msgstr "Scrivi un indirizzo e-mail valido, ad esempio joe@example.com" + +msgid "" +"Too many requests made when trying to send password-less login, please try " +"again later." +msgstr "" +"Sono state realizzate troppe richieste per l'accesso senza password, prova " +"di nuovo più tardi." + +msgid "Email failed to send, please try again later." +msgstr "L'e-mail non è stata inviata, prova di nuovo più tardi." + +msgid "" +"You left some items from a previous cart. We have added those items to your " +"current cart." +msgstr "" +"Hai lasciato alcuni articoli di un carrello precedente. Abbiamo aggiunto " +"questi articoli al tuo carrello attuale." + +msgid "The captcha you entered is incorrect. Please try again." +msgstr "Il captcha inserito non è corretto. Prova di nuovo." + +msgid "" +"Your email address or password is incorrect. Please try again. If you've " +"forgotten your sign in details, just click the 'Forgot your password?' link " +"below." +msgstr "" +"L'indirizzo e-mail o la password non sono corretti. Riprova. Se hai " +"dimenticato i dati di accesso, fai clic sul link sottostante 'Hai " +"dimenticato la password?'" + +msgid "" +"Due to excessive login attempts, please wait %s seconds before attempting to " +"log in again." +msgstr "" +"A causa del numero eccessivo di tentativi, attendi %s secondi prima di " +"provare ad effettuare nuovamente l'accesso." + +msgid "" +"You must reset your password before you may log in again. Please check your " +"email at :email to reset your password" +msgstr "" +"Devi reimpostare la password prima di poter accedere nuovamente. Controlla " +"la tua e-mail :email per reimpostare la password" + +msgid "You cannot create an account at this time." +msgstr "In questo momento non è possibile creare un account." + +msgid "Click here to continue." +msgstr "Clicca qui per continuare." + +msgid "Click here to continue shopping" +msgstr "Clicca qui per continuare a fare acquisti" + +msgid "The email address %s is already in use. Please enter a different one." +msgstr "" +"L'indirizzo e-mail %s è già in uso. Per favore, inseriscine uno diverso." + +msgid "" +"Please type in a valid phone number containing at least 3 numbers. The only " +"special characters allowed are: :allowedchars" +msgstr "" +"Scrivi un numero di telefono valido contenente almeno 3 numeri. Gli unici " +"caratteri speciali consentiti sono: :allowedchars" + +msgid "Your passwords don't match." +msgstr "Le password non corrispondono." + +msgid "" +"An internal error occurred while trying to create your account. Please try " +"again." +msgstr "" +"Si è verificato un errore interno durante la creazione tuo account. Prova di " +"nuovo." + +msgid "" +"Sign in or sign out" +msgstr "" +"Accedi o esci" + +msgid "" +"Sign in or Create an account" +msgstr "" +"Accedi o crea un account" + +msgid "You've been logged out of your account successfully." +msgstr "Sei stato disconnesso correttamente dal tuo account." + +msgid "Token is missing." +msgstr "Token mancante." + +msgid "" +"Sign in failed. The provided token has expired or already been used. Please " +"try again." +msgstr "" +"Accesso non riuscito. Il token fornito è scaduto o è già stato utilizzato. " +"Prova di nuovo." + +msgid "Please choose a valid amount for this gift certificate." +msgstr "Scegli un importo valido per questo buono regalo." + +msgid "Please enter a valid amount for this gift certificate." +msgstr "Inserisci un importo valido per questo buono regalo." + +msgid "" +"Please enter an amount between the minimum and maximum gift certificate " +"value." +msgstr "" +"Inserisci un importo compreso tra il valore minimo e massimo del buono " +"regalo." + +msgid "" +"Please enter the name of the person you wish to send this gift certificate " +"to." +msgstr "" +"Inserisci il nome della persona a cui desideri inviare questo buono regalo." + +msgid "" +"Please enter a valid email address for the person you wish to send this gift " +"certificate to." +msgstr "" +"Inserisci un indirizzo e-mail valido per la persona a cui desideri inviare " +"questo buono regalo." + +msgid "Please enter your name." +msgstr "Inserisci il tuo nome." + +msgid "Please enter your email address." +msgstr "Inserisci il tuo indirizzo e-mail." + +msgid "Please enter a shorter message for your gift certificate." +msgstr "Inserisci un messaggio più breve per il tuo buono regalo." + +msgid "Please select a theme for your gift certificate." +msgstr "Scegli un tema per il tuo buono regalo." + +msgid "Cannot purchase a Gift Certificate using a Gift Certificate" +msgstr "Non è possibile acquistare un buono regalo utilizzando un buono regalo" + +msgid "Your gift certificate has been updated successfully." +msgstr "Il tuo buono regalo è stato aggiornato correttamente." + +msgid "Your gift certificate has been generated and saved in your cart." +msgstr "Il buono regalo è stato creato e salvato nel carrello." + +msgid "The selected product combination doesn't exist." +msgstr "La combinazione di prodotti selezionata non esiste." + +msgid "Please enter a valid product quantity." +msgstr "Inserisci una quantità di prodotto valida." + +msgid "Please enter a title, text and rating for your review." +msgstr "Inserisci un titolo, un testo e una valutazione per la tua recensione." + +msgid "" +"You are only allowed to post :number product review every :duration. Please " +"try again later." +msgstr "" +"Puoi pubblicare solo :number recensioni di prodotto ogni :duration. Prova di " +"nuovo più tardi." + +msgid "The email you entered is incorrect. Please type it again." +msgstr "L'e-mail che hai inserito non è corretta. Inseriscila di nuovo." + +msgid "An internal error occurred while trying to save your review." +msgstr "" +"Si è verificato un errore interno durante il salvataggio della tua " +"recensione." + +msgid "Your review was saved and is shown below." +msgstr "La tua recensione è stata salvata e viene mostrata di seguito." + +msgid "Your review was saved and is pending approval." +msgstr "La tua recensione è stata salvata ed è in attesa di approvazione." + +msgid "Only customers who have purchased this item can review it." +msgstr "" +"Solo i clienti che hanno acquistato questo articolo possono scriverne una " +"recensione." + +msgid "Oops..." +msgstr "Oops..." + +msgid "Please enter your name and email address before submitting this form." +msgstr "" +"Inserisci il tuo nome e indirizzo e-mail prima di inviare questo modulo." + +msgid "" +"Sorry, your request could not be processed as it contained an invalid " +"security token. Please refresh and try again." +msgstr "" +"Siamo spiacenti, non è stato possibile elaborare la tua richiesta in quanto " +"conteneva un token di sicurezza non valido. Aggiorna e prova di nuovo." + +msgid "Newsletter Subscription" +msgstr "Iscrizione alla newsletter" + +msgid "Please enter a valid email address, such as john@example.com." +msgstr "Inserisci un indirizzo e-mail valido, ad esempio joe@example.com." + +msgid "The email address %s is already subscribed to receive our newsletter." +msgstr "L'indirizzo e-mail %s è già iscritto alla nostra newsletter." + +msgid "Thanks for Subscribing!" +msgstr "Grazie per l'iscrizione!" + +msgid "" +"Thank you for joining our mailing list. You'll be sent the next issue of our " +"newsletter shortly." +msgstr "" +"Grazie per l'iscrizione alla nostra mailing list. A breve riceverai il " +"prossimo numero della newsletter." + +msgid "Continue" +msgstr "Continua" + +msgid "" +"The gift certificate you entered couldn't be applied to any items in your " +"order." +msgstr "" +"Il buono regalo che hai inserito non può essere applicato a nessun articolo " +"del tuo ordine." + +msgid "The gift certificate {code} does not exist" +msgstr "Il buono regalo {code} non esiste" + +msgid "Please enter a valid zip code/postcode or state." +msgstr "Inserisci un CAP o uno stato valido." + +msgid "Please select a valid state." +msgstr "Seleziona uno stato valido." + +msgid "Please enter a valid zip code/postcode." +msgstr "Inserisci un CAP valido." + +msgid "" +"Unfortunately one or more items in your cart can't be shipped to your " +"location. Please choose a different delivery address." +msgstr "" +"Purtroppo uno o più articoli del tuo carrello non possono essere spediti " +"all'indirizzo prescelto. Scegli un indirizzo di consegna diverso." + +msgid "Unable to retrieve shipping quote. Please try again or contact support." +msgstr "" +"Non è stato possibile recuperare il preventivo di spedizione. Prova di nuovo " +"o contatta il supporto tecnico." + +msgid "Passwords must be at least :length characters and contain: " +msgstr "" +"Le password devono essere lunghe almeno :length caratteri e contenere: " + +msgid "lower case letters" +msgstr "lettere minuscole" + +msgid "upper case letters" +msgstr "lettere maiuscole" + +msgid "at least :numbers " +msgstr "almeno :numbers " + +msgid "at least :specialchars " +msgstr "almeno :specialchars " + +msgid "" +"Subject to Status. Terms and Conditions Apply. {merchantName} acts as a " +"broker and offers credit from PayPal Credit.\n" +"PayPal Credit is a trading name of PayPal (Europe) .à.r.l. et Cie, S.C.A., " +"22-24 Boulevard Royal L-2449, Luxembourg." +msgstr "" +"Soggetto ad approvazione. Si applicano termini e condizioni. {merchantName} " +"agisce come intermediario e offre credito da PayPal Credit.\n" +"PayPal Credit è una denominazione commerciale di PayPal (Europe) S.à.r.l. et " +"Cie, S.C.A., 22-24 Boulevard Royal L-2449, Luxembourg." + +msgid "Add payment method" +msgstr "Aggiungi metodo di pagamento" + +msgid "Address Book" +msgstr "Rubrica indirizzi" + +msgid "Address Form" +msgstr "Modulo di indirizzo" + +msgid "Your Orders" +msgstr "I tuoi ordini" + +msgid "Order #{id}" +msgstr "Ordine n. {id}" + +msgid "Files" +msgstr "File" + +msgid "Account Details" +msgstr "Dettagli account" + +msgid "Edit Payment Method" +msgstr "Modifica metodo di pagamento" + +msgid "Your Messages" +msgstr "I tuoi messaggi" + +msgid "Login" +msgstr "Accedi" + +msgid "Reset Password" +msgstr "Reimposta password" + +msgid "Create New Return" +msgstr "Crea nuovo reso" + +msgid "Your Account" +msgstr "Il tuo account" + +msgid "Payment Methods" +msgstr "Metodi di pagamento" + +msgid "Recently Viewed Items" +msgstr "Articoli visualizzati di recente" + +msgid "Your Returns" +msgstr "I tuoi resi" + +msgid "Return Saved" +msgstr "Reso salvato" + +msgid "New Wishlist" +msgstr "Nuova Lista desideri" + +msgid "Edit Wishlist" +msgstr "Modifica Lista desideri" + +msgid "Your Wishlists" +msgstr "Le tue Liste desideri" + +msgid "All Brands" +msgstr "Tutte le marche" + +msgid "Your Cart" +msgstr "Il tuo carrello" + +msgid "Compare Products" +msgstr "Compara prodotti" + +msgid "Error" +msgstr "Errore" + +msgid "Gift Certificates" +msgstr "Buoni regalo" + +msgid "Search" +msgstr "Cerca" + +msgid "Sitemap" +msgstr "Mappa del sito" + +msgid "View Wishlist" +msgstr "Visualizza Lista desideri" + +msgid "View Shared Wishlist" +msgstr "Visualizza Lista desideri condivisa" + +msgid "Home" +msgstr "Home" diff --git a/assets/PO/storefront-nl-NL.po b/assets/PO/storefront-nl-NL.po new file mode 100644 index 000000000..6a5d82388 --- /dev/null +++ b/assets/PO/storefront-nl-NL.po @@ -0,0 +1,567 @@ +# entity_escaping_strategy = propagate +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-10-06T16:43:04+00:00\n" +"PO-Revision-Date: 2020-10-06T16:43:04+00:00\n" +"Language: nl-NL\n" + +msgid "" +"The coupon code you entered couldn't be applied to any items in your order." +msgstr "" +"De ingevoerde couponcode kan niet worden toegepast op artikelen in uw " +"bestelling." + +msgid "" +"There was an error updating your billing address. Please check all fields " +"are correct and try again." +msgstr "" +"Er is een fout opgetreden bij het bijwerken van uw factuuradres. Controleer " +"of alle velden kloppen en probeer het opnieuw." + +msgid "My Account" +msgstr "Mijn account" + +msgid "You have requested an invalid product download. Please try again." +msgstr "U hebt een ongeldige productdownload aangevraagd. Probeer het opnieuw." + +msgid "This download has expired." +msgstr "Deze download is verlopen." + +msgid "Product Downloads" +msgstr "Productdownloads" + +msgid "Files for %s" +msgstr "Bestanden voor %s" + +msgid "The files available for %s are listed below." +msgstr "De beschikbare bestanden voor %s worden hieronder weergegeven." + +msgid "Your account details have been updated." +msgstr "Uw accountgegevens zijn bijgewerkt." + +msgid "Something went wrong trying to update your details. Please try again." +msgstr "" +"Er is iets fout gegaan bij het bijwerken van uw gegevens. Probeer het " +"opnieuw." + +msgid "Please type in your current password." +msgstr "Typ uw huidige wachtwoord in." + +msgid "My Wish List" +msgstr "Mijn verlanglijstje" + +msgid "The item has been added to your wish list." +msgstr "Het artikel is toegevoegd aan uw verlanglijstje." + +msgid "All prices are in %s" +msgstr "Alle prijzen zijn in %s" + +msgid "" +"Your order does not meet the minimum total for this coupon code to be " +"applied. Please spend another {amountDiff} first." +msgstr "" +"Uw bestelling voldoet niet aan het minimale totaalbedrag voor deze " +"couponcode. Besteed eerst nog {amountDiff}." + +msgid "" +"We don't have enough {product} stock on hand for the quantity you selected. " +"Please try again." +msgstr "" +"We hebben niet voldoende voorraad van {product} voor de geselecteerde " +"hoeveelheid. Probeer het opnieuw." + +msgid "Promotion is inactive" +msgstr "Aanbieding is niet actief" + +msgid "This promotion cannot be applied with the selected currency" +msgstr "Deze aanbieding kan niet worden gebruikt met de geselecteerde valuta" + +msgid "You are not in the customer group the promotion targets" +msgstr "" +"U bevindt zich niet in de klantengroep waar de aanbieding op gericht is" + +msgid "You do not meet the minimum order requirement for the promotion" +msgstr "U voldoet niet aan de minimale bestelvereiste voor de aanbieding" + +msgid "Shipping address is required for the promotion" +msgstr "Verzendadres is vereist voor de aanbieding" + +msgid "The promotion can not be used in order with multiple shipping addresses" +msgstr "" +"De aanbieding kan niet worden gebruikt bij een bestelling met meerdere " +"verzendadressen" + +msgid "The promotion can not be applied for this shipping address" +msgstr "De aanbieding kan niet worden gebruikt voor dit verzendadres" + +msgid "Something went wrong" +msgstr "Er is iets fout gegaan" + +msgid "The coupon code you entered has been disabled so it can't be used." +msgstr "" +"De ingevoerde couponcode is uitgeschakeld en kan dus niet gebruikt worden." + +msgid "The coupon code you entered expired on %s so it can't be used." +msgstr "" +"De ingevoerde couponcode is op %s verlopen en kan dus niet gebruikt worden." + +msgid "The coupon code you entered has already expired so it can't be used." +msgstr "" +"De ingevoerde couponcode is al verlopen en kan dus niet gebruikt worden." + +msgid "Coupon code can not be found" +msgstr "Couponcode is niet gevonden" + +msgid "This promotion can not be used in conjunction with other promotions" +msgstr "" +"Deze aanbieding kan niet worden gebruikt in combinatie met andere " +"aanbiedingen" + +msgid "unknown" +msgstr "onbekend" + +msgid "" +"Unfortunately this product is no longer for sale so it cannot be reordered." +msgstr "" +"Dit product wordt helaas niet meer verkocht en kan dus niet opnieuw besteld " +"worden." + +msgid "This product cannot be reordered because it's out of stock." +msgstr "" +"Dit product kan niet opnieuw besteld worden omdat het niet op voorraad is." + +msgid "Please select a file for the {displayName} option." +msgstr "Selecteer een bestand voor de optie {displayName}." + +msgid "Unfortunately this product is not available for purchase." +msgstr "Dit product wordt helaas niet verkocht." + +msgid "" +"The inventory level for the following product is below what you ordered, so " +"we could not proceed with the checkout: {productName}" +msgstr "" +"De beschikbare voorraad van het volgende product is minder dan wat u besteld " +"hebt, dus we kunnen niet verdergaan met afrekenen: {productName}" + +msgid "The coupon has been removed from your cart." +msgstr "De coupon is verwijderd uit uw winkelmandje." + +msgid "Forgot Password" +msgstr "Wachtwoord vergeten" + +msgid "Create Account" +msgstr "Account aanmaken" + +msgid "Your Account Has Been Created" +msgstr "Uw account is aangemaakt" + +msgid "Sign in" +msgstr "Inloggen" + +msgid "" +"If the entered email address is associated with this store, you will receive " +"a password reset email. If you don't receive this e-mail, please check your " +"junk mail folder or contact us for further assistance." +msgstr "" +"Als het ingevoerde e-mailadres aan deze winkel gekoppeld is, dan ontvangt u " +"een e-mailbericht om uw wachtwoord opnieuw in te stellen. Als u dit e-" +"mailbericht niet ontvangt, kijk dan in uw map met ongewenste berichten of " +"neem voor hulp contact met ons op." + +msgid "" +"The link you were given in the Request Password email is invalid. Please " +"request another new password to receive a new link." +msgstr "" +"De link die u hebt ontvangen in het e-mailbericht om een wachtwoord op te " +"vragen, is ongeldig. Vraag een nieuw wachtwoord aan om een nieuwe link te " +"ontvangen." + +msgid "" +"An internal error occurred while trying to change your password. Please try " +"again." +msgstr "" +"Er is een interne fout opgetreden bij het wijzigen van uw wachtwoord. " +"Probeer het opnieuw." + +msgid "Sorry, your passwords do not match. Please try again." +msgstr "Uw wachtwoorden komen helaas niet overeen. Probeer het opnieuw." + +msgid "" +"Passwords must be at least 7 characters and contain both alphabetic and " +"numeric characters." +msgstr "" +"Wachtwoorden moeten minimaal 7 tekens lang zijn en zowel cijfers als letters " +"bevatten." + +msgid "You need to sign in to access this page." +msgstr "U moet inloggen om toegang te krijgen tot deze pagina." + +msgid "Your password has been successfully updated." +msgstr "Uw wachtwoord is bijgewerkt." + +msgid "Please type in a valid email address, such as joe@example.com" +msgstr "Typ een geldig e-mailadres in, zoals naam@voorbeeld.nl" + +msgid "" +"Too many requests made when trying to send password-less login, please try " +"again later." +msgstr "" +"Er zijn te veel verzoeken gedaan bij het verzenden van wachtwoordloze " +"inloggegevens. Probeer het later opnieuw." + +msgid "Email failed to send, please try again later." +msgstr "E-mail kan niet worden verzonden. Probeer het later opnieuw." + +msgid "" +"You left some items from a previous cart. We have added those items to your " +"current cart." +msgstr "" +"U hebt enkele artikelen achtergelaten in een ouder winkelmandje. We hebben " +"die artikelen toegevoegd aan uw huidige winkelmandje." + +msgid "The captcha you entered is incorrect. Please try again." +msgstr "De ingevoerde captcha is niet correct. Probeer het opnieuw." + +msgid "" +"Your email address or password is incorrect. Please try again. If you've " +"forgotten your sign in details, just click the 'Forgot your password?' link " +"below." +msgstr "" +"Uw e-mailadres of wachtwoord is niet correct. Probeer het opnieuw. Klik " +"hieronder op de link 'Wachtwoord vergeten?' als u uw inloggegevens vergeten " +"bent." + +msgid "" +"You must reset your password before you may log in again. Please check your " +"email at :email to reset your password" +msgstr "" +"U moet uw wachtwoord opnieuw instellen voordat u weer kunt inloggen. " +"Controleer uw e-mail op :email om uw wachtwoord opnieuw in te stellen." + +msgid "" +"Due to excessive login attempts, please wait %s seconds before attempting to " +"log in again." +msgstr "" +"Vanwege te veel inlogpogingen moet u %s seconden wachten voordat u opnieuw " +"probeert in te loggen." + +msgid "You cannot create an account at this time." +msgstr "U kunt op dit moment geen account aanmaken." + +msgid "Click here to continue." +msgstr "Klik hier om verder te gaan." + +msgid "Click here to continue shopping" +msgstr "Klik hier om verder te winkelen" + +msgid "The email address %s is already in use. Please enter a different one." +msgstr "Het e-mailadres %s is al in gebruik. Voer een ander adres in." + +msgid "" +"Please type in a valid phone number containing at least 3 numbers. The only " +"special characters allowed are: :allowedchars" +msgstr "" +"Typ een geldig telefoonnummer met minimaal 3 cijfers in. De enige toegestane " +"speciale tekens zijn: :allowedchars" + +msgid "Your passwords don't match." +msgstr "Uw wachtwoorden komen niet overeen." + +msgid "" +"An internal error occurred while trying to create your account. Please try " +"again." +msgstr "" +"Er is een interne fout opgetreden bij het aanmaken van uw account. Probeer " +"het opnieuw." + +msgid "" +"Sign in or sign out" +msgstr "" +"Log in of log uit" + +msgid "" +"Sign in or Create an account" +msgstr "" +"Log in of Maak een account aan" + +msgid "You've been logged out of your account successfully." +msgstr "U bent uitgelogd uit uw account." + +msgid "Token is missing." +msgstr "Token ontbreekt." + +msgid "" +"Sign in failed. The provided token has expired or already been used. Please " +"try again." +msgstr "" +"Inloggen mislukt. De verstrekte token is verlopen of al gebruikt. Probeer " +"het opnieuw." + +msgid "Please choose a valid amount for this gift certificate." +msgstr "Kies een geldig bedrag voor deze cadeaubon." + +msgid "Please enter a valid amount for this gift certificate." +msgstr "Voer een geldig bedrag in voor deze cadeaubon." + +msgid "" +"Please enter an amount between the minimum and maximum gift certificate " +"value." +msgstr "Voer een bedrag in tussen de minimale en de maximale cadeaubonwaarde." + +msgid "" +"Please enter the name of the person you wish to send this gift certificate " +"to." +msgstr "Voer de naam in van de persoon aan wie u deze cadeaubon wilt sturen." + +msgid "" +"Please enter a valid email address for the person you wish to send this gift " +"certificate to." +msgstr "" +"Voer een geldig e-mailadres in voor de persoon aan wie u deze cadeaubon wilt " +"sturen." + +msgid "Please enter your name." +msgstr "Voer uw naam in." + +msgid "Please enter your email address." +msgstr "Vul uw e-mailadres in." + +msgid "Please enter a shorter message for your gift certificate." +msgstr "Voer een kortere boodschap in voor uw cadeaubon." + +msgid "Please select a theme for your gift certificate." +msgstr "Selecteer een thema voor uw cadeaubon." + +msgid "Cannot purchase a Gift Certificate using a Gift Certificate" +msgstr "Kan geen cadeaubon kopen met een cadeaubon" + +msgid "Your gift certificate has been updated successfully." +msgstr "Uw cadeaubon is bijgewerkt." + +msgid "Your gift certificate has been generated and saved in your cart." +msgstr "Uw cadeaubon is gegenereerd en opgeslagen in uw winkelmandje." + +msgid "The selected product combination doesn't exist." +msgstr "De geselecteerde productcombinatie bestaat niet." + +msgid "Please enter a valid product quantity." +msgstr "Voer een geldige hoeveelheid in voor het product." + +msgid "Please enter a title, text and rating for your review." +msgstr "Voer een titel, tekst en score in voor uw recensie." + +msgid "" +"You are only allowed to post :number product review every :duration. Please " +"try again later." +msgstr "" +"U mag niet meer dan :number productrecensies per :duration plaatsen. Probeer " +"het later opnieuw." + +msgid "The email you entered is incorrect. Please type it again." +msgstr "Het ingevoerde e-mailadres is niet correct. Typ het opnieuw in." + +msgid "An internal error occurred while trying to save your review." +msgstr "Er is een interne fout opgetreden bij het opslaan van uw recensie." + +msgid "Your review was saved and is shown below." +msgstr "Uw recensie is opgeslagen en wordt hieronder weergegeven." + +msgid "Your review was saved and is pending approval." +msgstr "Uw recensie is opgeslagen en wacht op goedkeuring." + +msgid "Only customers who have purchased this item can review it." +msgstr "Alleen klanten die dit artikel hebben gekocht, kunnen het beoordelen." + +msgid "Oops..." +msgstr "Oeps..." + +msgid "Please enter your name and email address before submitting this form." +msgstr "Voer uw naam en e-mailadres in voordat u dit formulier verzendt." + +msgid "" +"Sorry, your request could not be processed as it contained an invalid " +"security token. Please refresh and try again." +msgstr "" +"Uw verzoek kon helaas niet worden verwerkt omdat het een ongeldig " +"beveiligingstoken bevatte. Vernieuw het en probeer het opnieuw." + +msgid "Newsletter Subscription" +msgstr "Nieuwsbriefabonnement" + +msgid "Please enter a valid email address, such as john@example.com." +msgstr "Voer een geldig e-mailadres in, zoals naam@voorbeeld.nl" + +msgid "The email address %s is already subscribed to receive our newsletter." +msgstr "Het e-mailadres %s is al geabonneerd op onze nieuwsbrief." + +msgid "Thanks for Subscribing!" +msgstr "Bedankt voor het abonneren!" + +msgid "" +"Thank you for joining our mailing list. You'll be sent the next issue of our " +"newsletter shortly." +msgstr "" +"Bedankt voor uw aanmelding voor onze mailinglijst. U ontvangt binnenkort de " +"volgende uitgave van onze nieuwsbrief." + +msgid "Continue" +msgstr "Doorgaan" + +msgid "" +"The gift certificate you entered couldn't be applied to any items in your " +"order." +msgstr "" +"De ingevoerde cadeaubon kan niet worden toegepast op artikelen in uw " +"bestelling." + +msgid "The gift certificate {code} does not exist" +msgstr "De cadeaubon {code} bestaat niet" + +msgid "Please enter a valid zip code/postcode or state." +msgstr "Voer een geldige postcode of staat in." + +msgid "Please select a valid state." +msgstr "Selecteer een geldige staat." + +msgid "Please enter a valid zip code/postcode." +msgstr "Voer een geldige postcode in." + +msgid "" +"Unfortunately one or more items in your cart can't be shipped to your " +"location. Please choose a different delivery address." +msgstr "" +"Een of meer artikelen in uw winkelmandje kunnen helaas niet worden verzonden " +"naar uw locatie. Kies een ander afleveradres." + +msgid "Unable to retrieve shipping quote. Please try again or contact support." +msgstr "" +"Kan geen verzendkosten ophalen. Probeer het opnieuw of neem contact op met " +"ondersteuning." + +msgid "Passwords must be at least :length characters and contain: " +msgstr "" +"Wachtwoorden moeten minimaal :length tekens lang zijn en het volgende " +"bevatten: " + +msgid "lower case letters" +msgstr "kleine letters" + +msgid "upper case letters" +msgstr "hoofdletters" + +msgid "at least :numbers " +msgstr "ten minste :numbers " + +msgid "at least :specialchars " +msgstr "ten minste :specialchars " + +msgid "" +"{merchantName} ACTS LIKE A BROKER AND OFFERS CREDIT FROM PAYPAL CREDIT.\n" +"PAYPAL CREDIT IS A TRADING NAME OF PAYPAL (Europe) S.À.R.L. ET CIE, S.C.A., " +"22-24 BOULEVARD ROYAL L-2449, LUXEMBOURG" +msgstr "" +"{merchantName} HANDELT ALS TUSSENPERSOON EN BIEDT KREDIET AAN VAN PAYPAL " +"CREDIT.\n" +"PAYPAL CREDIT IS EEN HANDELSNAAM VAN PAYPAL (Europe) S.À.R.L. ET CIE, S.C." +"A., 22-24 BOULEVARD ROYAL L-2449, LUXEMBURG" + +msgid "Add payment method" +msgstr "Betaalmethode toevoegen" + +msgid "Address Book" +msgstr "Adresboek" + +msgid "Address Form" +msgstr "Adresformulier" + +msgid "Your Orders" +msgstr "Uw bestellingen" + +msgid "Order #{id}" +msgstr "Bestelnummer {id}" + +msgid "Files" +msgstr "Bestanden" + +msgid "Account Details" +msgstr "Accountgegevens" + +msgid "Edit Payment Method" +msgstr "Betaalmethode bewerken" + +msgid "Your Messages" +msgstr "Uw berichten" + +msgid "Login" +msgstr "Inloggen" + +msgid "Reset Password" +msgstr "Wachtwoord opnieuw instellen" + +msgid "Create New Return" +msgstr "Nieuwe retourzending aanmaken" + +msgid "Your Account" +msgstr "Uw account" + +msgid "Payment Methods" +msgstr "Betaalmethoden" + +msgid "Recently Viewed Items" +msgstr "Onlangs bekeken artikelen" + +msgid "Your Returns" +msgstr "Uw retourzendingen" + +msgid "Return Saved" +msgstr "Retourzending opgeslagen" + +msgid "New Wishlist" +msgstr "Nieuw verlanglijstje" + +msgid "Edit Wishlist" +msgstr "Verlanglijstje bewerken" + +msgid "Your Wishlists" +msgstr "Uw verlanglijstjes" + +msgid "All Brands" +msgstr "Alle merken" + +msgid "Your Cart" +msgstr "Uw winkelmandje" + +msgid "Compare Products" +msgstr "Producten vergelijken" + +msgid "Error" +msgstr "Fout" + +msgid "Gift Certificates" +msgstr "Cadeaubonnen" + +msgid "Search" +msgstr "Zoeken" + +msgid "Sitemap" +msgstr "Sitemap" + +msgid "View Wishlist" +msgstr "Verlanglijstje bekijken" + +msgid "View Shared Wishlist" +msgstr "Gedeeld verlanglijstje bekijken" + +msgid "Home" +msgstr "Home" diff --git a/assets/PO/storefront-pt-BR.po b/assets/PO/storefront-pt-BR.po new file mode 100644 index 000000000..fe5c68ed2 --- /dev/null +++ b/assets/PO/storefront-pt-BR.po @@ -0,0 +1,571 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-11-22T23:30:49+00:00\n" +"PO-Revision-Date: 2020-11-22T23:30:49+00:00\n" +"Language: pt-BR\n" + +msgid "" +"The coupon code you entered couldn't be applied to any items in your order." +msgstr "" +"Não foi possível aplicar o código do cupom que você inseriu a nenhum item do " +"seu pedido." + +msgid "" +"There was an error updating your billing address. Please check all fields " +"are correct and try again." +msgstr "" +"Ocorreu um erro na atualização do seu endereço de faturamento. Confira se " +"todos os campos estão preenchidos corretamente e tente novamente." + +msgid "My Account" +msgstr "Minha conta" + +msgid "You have requested an invalid product download. Please try again." +msgstr "Você solicitou o download de um produto inválido. Tente novamente." + +msgid "This download has expired." +msgstr "O download expirou." + +msgid "Product Downloads" +msgstr "Downloads de produtos" + +msgid "Files for %s" +msgstr "Arquivos para %s" + +msgid "The files available for %s are listed below." +msgstr "Os arquivos disponíveis para %s estão listados abaixo." + +msgid "Your account details have been updated." +msgstr "As informações da sua conta foram atualizadas." + +msgid "Something went wrong trying to update your details. Please try again." +msgstr "" +"Encontramos um problema enquanto tentávamos atualizar suas informações. " +"Tente novamente." + +msgid "Please type in your current password." +msgstr "Digite sua senha atual." + +msgid "Stock check error" +msgstr "Erro de verificação de estoque" + +msgid "We are facing a problem with checking inventory stock. Please try again" +msgstr "" +"Estamos enfrentando um problema na verificação do estoque. Tente novamente" + +msgid "Invalid payload" +msgstr "Carga inválida" + +msgid "Invalid custom form field ID provided: {field}" +msgstr "" +"Foi informado uma ID de campo de formulário personalizada incorreta: {field}" + +msgid "All prices are in %s" +msgstr "Todos os preços estão em %s" + +msgid "" +"Your order does not meet the minimum total for this coupon code to be " +"applied. Please spend another {amountDiff} first." +msgstr "" +"Seu pedido não atende ao total mínimo para aplicação do código do cupom. " +"Gaste mais {amountDiff} primeiro." + +msgid "" +"We don't have enough {product} stock on hand for the quantity you selected. " +"Please try again." +msgstr "" +"Não temos estoque de {product} disponível suficiente para a quantidade que " +"você selecionou. Tente novamente." + +msgid "Promotion is inactive" +msgstr "A promoção está inativa" + +msgid "This promotion cannot be applied with the selected currency" +msgstr "Não é possível aplicar esta promoção com a moeda selecionada" + +msgid "You are not in the customer group the promotion targets" +msgstr "Você não faz parte do grupo de clientes a que a promoção se destina" + +msgid "You do not meet the minimum order requirement for the promotion" +msgstr "O seu pedido não atende às exigências mínimas da promoção" + +msgid "Shipping address is required for the promotion" +msgstr "O endereço de envio é obrigatório para a promoção" + +msgid "The promotion can not be used in order with multiple shipping addresses" +msgstr "" +"A promoção não pode ser utilizada em pedidos com vários endereços de envio" + +msgid "The promotion can not be applied for this shipping address" +msgstr "Não é possível aplicar a promoção neste endereço de envio" + +msgid "Something went wrong" +msgstr "Ocorreu um erro" + +msgid "The coupon code you entered has been disabled so it can't be used." +msgstr "O código do cupom inserido foi desativado e não pode ser utilizado." + +msgid "The coupon code you entered expired on %s so it can't be used." +msgstr "O código do cupom inserido expirou em %s e não pode ser utilizado." + +msgid "The coupon code you entered has already expired so it can't be used." +msgstr "O código do cupom inserido expirou e não pode ser utilizado." + +msgid "Coupon code can not be found" +msgstr "Não foi possível encontrar o código do cupom" + +msgid "This promotion can not be used in conjunction with other promotions" +msgstr "Essa promoção não pode ser usada em conjunto com outras promoções" + +msgid "unknown" +msgstr "desconhecido" + +msgid "" +"Unfortunately this product is no longer for sale so it cannot be reordered." +msgstr "" +"Infelizmente, este produto não está mais à venda e não pode ser comprado " +"novamente." + +msgid "This product cannot be reordered because it's out of stock." +msgstr "" +"Não é possível comprar este produto novamente porque não há estoque " +"disponível." + +msgid "Please select a file for the {displayName} option." +msgstr "Selecione um arquivo para a opção {displayName}." + +msgid "Unfortunately this product is not available for purchase." +msgstr "Infelizmente, este produto não está disponível para compra." + +msgid "" +"The inventory level for the following product is below what you ordered, so " +"we could not proceed with the checkout: {productName}" +msgstr "" +"O nível do inventário para o produto a seguir está abaixo do que você " +"solicitou, portanto, não foi possível dar prosseguimento à finalização da " +"compra: {productName}" + +msgid "The coupon has been removed from your cart." +msgstr "O cupom foi removido do seu carrinho." + +msgid "Forgot Password" +msgstr "Esqueci a senha" + +msgid "Create Account" +msgstr "Criar conta" + +msgid "Your Account Has Been Created" +msgstr "Sua conta foi criada" + +msgid "Sign in" +msgstr "Entrar" + +msgid "" +"If the entered email address is associated with this store, you will receive " +"a password reset email. If you don't receive this e-mail, please check your " +"junk mail folder or contact us for further assistance." +msgstr "" +"Se o endereço de email informado estiver associado a esta loja, você vai " +"receber um email de redefinição de senha. Se não receber este email, " +"verifique a pasta onde fica o lixo eletrônico ou entre em contato conosco " +"para receber mais ajuda." + +msgid "" +"The link you were given in the Request Password email is invalid. Please " +"request another new password to receive a new link." +msgstr "" +"O link que você recebeu no email de solicitação de senha é inválido. " +"Solicite outra senha nova para receber outro link." + +msgid "" +"An internal error occurred while trying to change your password. Please try " +"again." +msgstr "" +"Ocorreu um erro interno enquanto tentávamos alterar a sua senha. Tente " +"novamente." + +msgid "Sorry, your passwords do not match. Please try again." +msgstr "Desculpe, suas senhas não correspondem. Tente novamente." + +msgid "" +"Passwords must be at least 7 characters and contain both alphabetic and " +"numeric characters." +msgstr "" +"As senhas devem ter pelo menos sete caracteres e conter caracteres " +"alfabéticos e numéricos." + +msgid "You need to sign in to access this page." +msgstr "É necessário entrar na sua conta para acessar a página." + +msgid "Your password has been successfully updated." +msgstr "Sua senha foi atualizada." + +msgid "Please provide a valid return URL" +msgstr "Informe um URL de devolução válido" + +msgid "Please type in a valid email address, such as joe@example.com" +msgstr "Digite um endereço de email válido, por exemplo jose@exemplo.com" + +msgid "" +"Too many requests made when trying to send password-less login, please try " +"again later." +msgstr "" +"Houve muitas solicitações na tentativa de acesso sem senha, tente novamente " +"mais tarde." + +msgid "Email failed to send, please try again later." +msgstr "O email não foi enviado, tente novamente mais tarde." + +msgid "" +"You left some items from a previous cart. We have added those items to your " +"current cart." +msgstr "" +"Você deixou alguns itens em um carrinho anterior. Adicionamos esses itens ao " +"seu carrinho atual." + +msgid "The captcha you entered is incorrect. Please try again." +msgstr "O captcha que você inseriu está incorreto. Tente novamente." + +msgid "" +"Your email address or password is incorrect. Please try again. If you've " +"forgotten your sign in details, just click the 'Forgot your password?' link " +"below." +msgstr "" +"Seu endereço de email ou senha está incorreto. Tente novamente. Caso tenha " +"esquecido suas informações de acesso, basta clicar no link 'Esqueceu sua " +"senha?' abaixo." + +msgid "" +"Due to excessive login attempts, please wait %s seconds before attempting to " +"log in again." +msgstr "" +"Você fez muitas tentativas de acesso, aguarde %s segundos para tentar " +"novamente." + +msgid "" +"You must reset your password before you may log in again. Please check your " +"email at :email to reset your password" +msgstr "" +"É necessário redefinir a sua senha para poder entrar novamente. Verifique " +"seu email em :email para redefinir sua senha" + +msgid "You cannot create an account at this time." +msgstr "Você não pode criar uma conta no momento." + +msgid "Click here to continue." +msgstr "Clique aqui para prosseguir." + +msgid "Click here to continue shopping" +msgstr "Clique aqui para continuar comprando" + +msgid "The email address %s is already in use. Please enter a different one." +msgstr "O endereço de email %s já está sendo usado. Informe outro." + +msgid "" +"Please type in a valid phone number containing at least 3 numbers. The only " +"special characters allowed are: :allowedchars" +msgstr "" +"Digite um número de telefone válido que contenha pelo menos três números. Os " +"únicos caracteres especiais permitidos são: :allowedchars" + +msgid "Your passwords don't match." +msgstr "Suas senhas não correspondem." + +msgid "" +"An internal error occurred while trying to create your account. Please try " +"again." +msgstr "" +"Ocorreu um erro interno enquanto tentávamos criar sua conta. Tente novamente." + +msgid "" +"Sign in or sign out" +msgstr "" +"Entrar ou sair" + +msgid "" +"Sign in or Create an account" +msgstr "" +"Entre ou crie uma conta" + +msgid "You've been logged out of your account successfully." +msgstr "Você foi desconectado da sua conta." + +msgid "Token is missing." +msgstr "Falta o token." + +msgid "" +"Sign in failed. The provided token has expired or already been used. Please " +"try again." +msgstr "" +"Acesso negado. O token informado expirou ou já foi usado. Tente novamente." + +msgid "Please choose a valid amount for this gift certificate." +msgstr "Escolha um valor válido para este vale-presente." + +msgid "Please enter a valid amount for this gift certificate." +msgstr "Insira um valor válido para este vale-presente." + +msgid "" +"Please enter an amount between the minimum and maximum gift certificate " +"value." +msgstr "Insira um valor entre o valor mínimo e máximo para o vale-presente." + +msgid "" +"Please enter the name of the person you wish to send this gift certificate " +"to." +msgstr "" +"Informe o nome da pessoa para quem você deseja enviar este vale-presente." + +msgid "" +"Please enter a valid email address for the person you wish to send this gift " +"certificate to." +msgstr "" +"Informe um endereço de email válido da pessoa para quem você deseja enviar " +"este vale-presente." + +msgid "Please enter your name." +msgstr "Informe seu nome." + +msgid "Please enter your email address." +msgstr "Informe seu endereço de email." + +msgid "Please enter a shorter message for your gift certificate." +msgstr "Digite uma mensagem menor no seu vale-presente." + +msgid "Please select a theme for your gift certificate." +msgstr "Selecione um tema para o vale-presente." + +msgid "Cannot purchase a Gift Certificate using a Gift Certificate" +msgstr "Não é possível comprar vales-presentes utilizando um vale-presente" + +msgid "Your gift certificate has been updated successfully." +msgstr "Seu vale-presente foi atualizado." + +msgid "Your gift certificate has been generated and saved in your cart." +msgstr "Seu vale-presente foi gerado e salvo no seu carrinho." + +msgid "The selected product combination doesn't exist." +msgstr "A combinação de produtos selecionada não existe." + +msgid "Please enter a valid product quantity." +msgstr "Insira uma quantidade de produto válida." + +msgid "Please enter a title, text and rating for your review." +msgstr "Insira um título, um texto e uma classificação para a sua avaliação." + +msgid "" +"You are only allowed to post :number product review every :duration. Please " +"try again later." +msgstr "" +"Você tem permissão somente para publicar :number avaliações de produto a " +"cada :duration. Tente novamente mais tarde." + +msgid "The email you entered is incorrect. Please type it again." +msgstr "O email que você informou está incorreto. Digite-o novamente." + +msgid "An internal error occurred while trying to save your review." +msgstr "Ocorreu um erro interno enquanto tentávamos salvar a sua avaliação." + +msgid "Your review was saved and is shown below." +msgstr "A sua avaliação foi salva e está exibida abaixo." + +msgid "Your review was saved and is pending approval." +msgstr "A sua avaliação foi salva, mas a aprovação está pendente." + +msgid "Only customers who have purchased this item can review it." +msgstr "Somente os clientes que compraram este item podem avalia-lo." + +msgid "Oops..." +msgstr "Epa..." + +msgid "Please enter your name and email address before submitting this form." +msgstr "Informe o seu nome e endereço de email para enviar este formulário." + +msgid "" +"Sorry, your request could not be processed as it contained an invalid " +"security token. Please refresh and try again." +msgstr "" +"Não foi possível processar sua solicitação pois continha um token de " +"segurança inválido. Atualize e tente novamente." + +msgid "Newsletter Subscription" +msgstr "Assinatura do boletim informativo" + +msgid "Please enter a valid email address, such as john@example.com." +msgstr "Informe um endereço de email válido, por exemplo joao@exemplo.com." + +msgid "The email address %s is already subscribed to receive our newsletter." +msgstr "" +"O endereço de email %s já está na lista para receber nosso boletim " +"informativo." + +msgid "Thanks for Subscribing!" +msgstr "Obrigado por se inscrever!" + +msgid "" +"Thank you for joining our mailing list. You'll be sent the next issue of our " +"newsletter shortly." +msgstr "" +"Obrigado por participar da nossa mala direta. Você vai receber a próxima " +"edição do nosso boletim informativo em breve." + +msgid "Continue" +msgstr "Continuar" + +msgid "" +"The gift certificate you entered couldn't be applied to any items in your " +"order." +msgstr "" +"Não foi possível aplicar o vale-presente que você inseriu a nenhum item do " +"seu pedido." + +msgid "The gift certificate {code} does not exist" +msgstr "O vale-presente {code} não existe" + +msgid "Please enter a valid zip code/postcode or state." +msgstr "Informe um código postal ou um estado válido." + +msgid "Please select a valid state." +msgstr "Selecione um estado válido." + +msgid "Please enter a valid zip code/postcode." +msgstr "Informe um CEP/código postal válido." + +msgid "" +"Unfortunately one or more items in your cart can't be shipped to your " +"location. Please choose a different delivery address." +msgstr "" +"Infelizmente, um ou mais itens presentes no seu carrinho não podem ser " +"enviados para a sua localização. Selecione outro endereço de entrega." + +msgid "Unable to retrieve shipping quote. Please try again or contact support." +msgstr "" +"Não foi possível cotar o frete. Tente novamente ou entre em contato com o " +"suporte." + +msgid "Passwords must be at least :length characters and contain: " +msgstr "As senhas devem ter pelo menos :length caracteres e devem conter: " + +msgid "lower case letters" +msgstr "letras minúsculas" + +msgid "upper case letters" +msgstr "letras maiúsculas" + +msgid "at least :numbers " +msgstr "pelo menos :numbers " + +msgid "at least :specialchars " +msgstr "pelo menos :specialchars " + +msgid "" +"Subject to Status. Terms and Conditions Apply. {merchantName} acts as a " +"broker and offers credit from PayPal Credit.\n" +"PayPal Credit is a trading name of PayPal (Europe) .à.r.l. et Cie, S.C.A., " +"22-24 Boulevard Royal L-2449, Luxembourg." +msgstr "" +"Sujeito ao status. Os termos e condições se aplicam. {merchantName} atua " +"como corretor e oferece crédito do PayPal Credit.\n" +"PayPal Credit é um nome comercial do PayPal (Europa) .à.r.l. et Cie, S.C.A., " +"22-24 Boulevard Royal L-2449, Luxemburgo." + +msgid "Add payment method" +msgstr "Adicionar método de pagamento" + +msgid "Address Book" +msgstr "Catálogo de endereços" + +msgid "Address Form" +msgstr "Formulário de endereço" + +msgid "Your Orders" +msgstr "Seus pedidos" + +msgid "Order #{id}" +msgstr "Pedido N.º {id}" + +msgid "Files" +msgstr "Arquivos" + +msgid "Account Details" +msgstr "Detalhes da conta" + +msgid "Edit Payment Method" +msgstr "Editar método de pagamento" + +msgid "Your Messages" +msgstr "Suas mensagens" + +msgid "Login" +msgstr "Acesso" + +msgid "Reset Password" +msgstr "Redefinir senha" + +msgid "Create New Return" +msgstr "Criar nova devolução" + +msgid "Your Account" +msgstr "Sua conta" + +msgid "Payment Methods" +msgstr "Métodos de pagamento" + +msgid "Recently Viewed Items" +msgstr "Itens vistos recentemente" + +msgid "Your Returns" +msgstr "Suas devoluções" + +msgid "Return Saved" +msgstr "Devolução salva" + +msgid "New Wishlist" +msgstr "Nova lista de desejos" + +msgid "Edit Wishlist" +msgstr "Editar lista de desejos" + +msgid "Your Wishlists" +msgstr "Suas listas de desejos" + +msgid "All Brands" +msgstr "Todas as marcas" + +msgid "Your Cart" +msgstr "Seu carrinho" + +msgid "Compare Products" +msgstr "Comparar produtos" + +msgid "Error" +msgstr "Erro" + +msgid "Gift Certificates" +msgstr "Vales-presente" + +msgid "Search" +msgstr "Pesquisar" + +msgid "Sitemap" +msgstr "Mapa do site" + +msgid "View Wishlist" +msgstr "Ver lista de desejos" + +msgid "View Shared Wishlist" +msgstr "Ver lista de desejos compartilhada" + +msgid "Home" +msgstr "Página inicial" diff --git a/assets/PO/storefront-sv-SE.po b/assets/PO/storefront-sv-SE.po new file mode 100644 index 000000000..dd95526b1 --- /dev/null +++ b/assets/PO/storefront-sv-SE.po @@ -0,0 +1,560 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-22T23:30:49+00:00\n" +"PO-Revision-Date: 2020-11-22T23:30:49+00:00\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: sv-SE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.2\n" + +msgid "" +"The coupon code you entered couldn't be applied to any items in your order." +msgstr "" +"Kupongkoden du angav kunde inte tillämpas på några varor i din beställning." + +msgid "" +"There was an error updating your billing address. Please check all fields " +"are correct and try again." +msgstr "" +"Det gick inte att uppdatera din faktureringsadress. Kontrollera att alla " +"fält är korrekta och försök igen." + +msgid "My Account" +msgstr "Mitt konto" + +msgid "You have requested an invalid product download. Please try again." +msgstr "Du har begärt en ogiltig produktnedladdning. Försök igen." + +msgid "This download has expired." +msgstr "Nedladdningen har upphört att gälla." + +msgid "Product Downloads" +msgstr "Produktnedladdningar" + +msgid "Files for %s" +msgstr "Filer för %s" + +msgid "The files available for %s are listed below." +msgstr "De filer som är tillgängliga för %s listas nedan." + +msgid "Your account details have been updated." +msgstr "Dina kontouppgifter har uppdaterats." + +msgid "Something went wrong trying to update your details. Please try again." +msgstr "Något gick fel när du försökte uppdatera dina uppgifter. Försök igen." + +msgid "Please type in your current password." +msgstr "Ange ditt nuvarande lösenord." + +msgid "Stock check error" +msgstr "Lagerkontrollfel" + +msgid "We are facing a problem with checking inventory stock. Please try again" +msgstr "" +"Vi står inför ett problem med inventeringskontroll. Var god försök igen" + +msgid "Invalid payload" +msgstr "Ogiltig nyttolast" + +msgid "Invalid custom form field ID provided: {field}" +msgstr "Ogiltigt anpassat formulärfält-ID: {field}" + +msgid "All prices are in %s" +msgstr "Alla priser är i %s" + +msgid "" +"Your order does not meet the minimum total for this coupon code to be " +"applied. Please spend another {amountDiff} first." +msgstr "" +"Din beställning uppfyller inte den minsta summan för att denna kupongkod ska " +"tillämpas. Spendera ytterligare en {amountDiff} först." + +msgid "" +"We don't have enough {product} stock on hand for the quantity you selected. " +"Please try again." +msgstr "" +"Vi har inte tillräckligt med {product} lager för den kvantitet du valt. " +"Försök igen." + +msgid "Promotion is inactive" +msgstr "Kampanjen är inaktiv" + +msgid "This promotion cannot be applied with the selected currency" +msgstr "Den här kampanjen kan inte tillämpas med den valda valutan" + +msgid "You are not in the customer group the promotion targets" +msgstr "Du ingår inte i kundgruppen som marknadsföringsmålen" + +msgid "You do not meet the minimum order requirement for the promotion" +msgstr "Du uppfyller inte minimikravet för kampanjen" + +msgid "Shipping address is required for the promotion" +msgstr "Leveransadress krävs för kampanjen" + +msgid "The promotion can not be used in order with multiple shipping addresses" +msgstr "" +"Kampanjen kan inte användas till en beställning med flera leveransadresser" + +msgid "The promotion can not be applied for this shipping address" +msgstr "Kampanjen kan inte tillämpas på denna leveransadress" + +msgid "Something went wrong" +msgstr "Något gick fel" + +msgid "The coupon code you entered has been disabled so it can't be used." +msgstr "" +"Kupongkoden du har angett har inaktiverats så att den inte kan användas." + +msgid "The coupon code you entered expired on %s so it can't be used." +msgstr "Kupongkoden du angav gick ut den %s så att den inte kan användas." + +msgid "The coupon code you entered has already expired so it can't be used." +msgstr "Kupongkoden du angav har redan gått ut så att den inte kan användas." + +msgid "Coupon code can not be found" +msgstr "Kupongkoden kan inte hittas" + +msgid "This promotion can not be used in conjunction with other promotions" +msgstr "Denna kampanj kan inte användas tillsammans med andra kampanjer" + +msgid "unknown" +msgstr "Okänd" + +msgid "" +"Unfortunately this product is no longer for sale so it cannot be reordered." +msgstr "" +"Tyvärr är den här produkten inte längre till salu så den kan inte beställas " +"igen." + +msgid "This product cannot be reordered because it's out of stock." +msgstr "" +"Den här produkten kan inte beställas igen eftersom den är slut i lagret." + +msgid "Please select a file for the {displayName} option." +msgstr "Välj en fil för alternativet {displayName}." + +msgid "Unfortunately this product is not available for purchase." +msgstr "Tyvärr så är inte denna produkt tillgänglig för köp." + +msgid "" +"The inventory level for the following product is below what you ordered, so " +"we could not proceed with the checkout: {productName}" +msgstr "" +"Lagernivån för följande produkt är lägre än vad du beställde, så vi kunde " +"inte fortsätta med kassan: {productName}" + +msgid "The coupon has been removed from your cart." +msgstr "Kupongen har tagits bort från din kundvagn." + +msgid "Forgot Password" +msgstr "Glömt ditt lösenord" + +msgid "Create Account" +msgstr "Skapa konto" + +msgid "Your Account Has Been Created" +msgstr "Ditt konto har skapats" + +msgid "Sign in" +msgstr "Logga in" + +msgid "" +"If the entered email address is associated with this store, you will receive " +"a password reset email. If you don't receive this e-mail, please check your " +"junk mail folder or contact us for further assistance." +msgstr "" +"Om den angivna e-postadressen är associerad med den här butiken får du ett e-" +"postmeddelande om återställning av lösenord. Om du inte får denna e-post, " +"kontrollera din skräppost mapp eller kontakta oss för ytterligare hjälp." + +msgid "" +"The link you were given in the Request Password email is invalid. Please " +"request another new password to receive a new link." +msgstr "" +"Länken du fick i e-postadressen för begäran om lösenord är ogiltig. Begär " +"ett nytt lösenord för att få en ny länk." + +msgid "" +"An internal error occurred while trying to change your password. Please try " +"again." +msgstr "" +"Ett internt fel uppstod när du försökte ändra ditt lösenord. Försök igen." + +msgid "Sorry, your passwords do not match. Please try again." +msgstr "Tyvärr så matchar inte dina lösenord. Försök igen." + +msgid "" +"Passwords must be at least 7 characters and contain both alphabetic and " +"numeric characters." +msgstr "" +"Lösenord måste innehålla minst 7 tecken och innehålla både alfabetiska och " +"numeriska tecken." + +msgid "You need to sign in to access this page." +msgstr "Du måste logga in för att komma åt den här sidan." + +msgid "Your password has been successfully updated." +msgstr "Ditt lösenord har uppdaterats." + +msgid "Please provide a valid return URL" +msgstr "Ange en giltig returadress" + +msgid "Please type in a valid email address, such as joe@example.com" +msgstr "Vänligen skriv in en giltig e-postadress, till exempel joe@example.com" + +msgid "" +"Too many requests made when trying to send password-less login, please try " +"again later." +msgstr "" +"För många förfrågningar som görs när du försöker skicka lösenordsfri " +"inloggning, försök igen senare." + +msgid "Email failed to send, please try again later." +msgstr "E-postmeddelandet kunde inte skickas. Försök igen senare." + +msgid "" +"You left some items from a previous cart. We have added those items to your " +"current cart." +msgstr "" +"Du lämnade några artiklar från en tidigare kundvagn. Vi har lagt till dessa " +"artiklar i din nuvarande kundvagn." + +msgid "The captcha you entered is incorrect. Please try again." +msgstr "Den captcha du angav är felaktig. Försök igen." + +msgid "" +"Your email address or password is incorrect. Please try again. If you've " +"forgotten your sign in details, just click the 'Forgot your password?' link " +"below." +msgstr "" +"Din e-postadress eller ditt lösenord är felaktigt. Försök igen. Om du har " +"glömt dina inloggningsuppgifter klickar du bara på 'Har du glömt ditt " +"lösenord?' länken nedan." + +msgid "" +"Due to excessive login attempts, please wait %s seconds before attempting to " +"log in again." +msgstr "" +"På grund av alltför många inloggningsförsök, vänta %s sekunder innan du " +"försöker logga in igen." + +msgid "" +"You must reset your password before you may log in again. Please check your " +"email at :email to reset your password" +msgstr "" +"Du måste återställa ditt lösenord innan du kan logga in igen. Kontrollera " +"din e-postadress: :email för att återställa lösenordet" + +msgid "You cannot create an account at this time." +msgstr "Du kan inte skapa ett konto just nu." + +msgid "Click here to continue." +msgstr "Klicka här för att fortsätta." + +msgid "Click here to continue shopping" +msgstr "Klicka här för att fortsätta handla" + +msgid "The email address %s is already in use. Please enter a different one." +msgstr "E-postadressen %s används redan. Var god ange en annan." + +msgid "" +"Please type in a valid phone number containing at least 3 numbers. The only " +"special characters allowed are: :allowedchars" +msgstr "" +"Ange ett giltigt telefonnummer som innehåller minst tre siffror. De enda " +"specialtecken som är tillåtna är: :allowedchars" + +msgid "Your passwords don't match." +msgstr "Dina lösenord matchar inte." + +msgid "" +"An internal error occurred while trying to create your account. Please try " +"again." +msgstr "Ett internt fel uppstod när du försökte skapa ditt konto. Försök igen." + +msgid "" +"Sign in or sign out" +msgstr "" +"Logga in eller logga ut" + +msgid "" +"Sign in or Create an account" +msgstr "" +"Logga in eller skapa ett konto" + +msgid "You've been logged out of your account successfully." +msgstr "Du har loggats ut från ditt konto." + +msgid "Token is missing." +msgstr "Token saknas." + +msgid "" +"Sign in failed. The provided token has expired or already been used. Please " +"try again." +msgstr "" +"Inloggning misslyckades. Den angivna token har upphört att gälla eller har " +"redan använts. Försök igen." + +msgid "Please choose a valid amount for this gift certificate." +msgstr "Välj ett giltigt belopp för detta presentkort." + +msgid "Please enter a valid amount for this gift certificate." +msgstr "Ange ett giltigt belopp för detta presentkort." + +msgid "" +"Please enter an amount between the minimum and maximum gift certificate " +"value." +msgstr "Ange ett belopp mellan lägsta och högsta presentkortsvärde." + +msgid "" +"Please enter the name of the person you wish to send this gift certificate " +"to." +msgstr "Ange namnet på personen du vill skicka presentkortet till." + +msgid "" +"Please enter a valid email address for the person you wish to send this gift " +"certificate to." +msgstr "" +"Ange en giltig e-postadress för den person du vill skicka presentkortet till." + +msgid "Please enter your name." +msgstr "Fyll i ditt namn." + +msgid "Please enter your email address." +msgstr "Var god skriv in din e-postadress." + +msgid "Please enter a shorter message for your gift certificate." +msgstr "Ange ett kortare meddelande för ditt presentkort." + +msgid "Please select a theme for your gift certificate." +msgstr "Välj ett tema för ditt presentkort." + +msgid "Cannot purchase a Gift Certificate using a Gift Certificate" +msgstr "Det går inte att köpa ett presentkort med ett presentkort" + +msgid "Your gift certificate has been updated successfully." +msgstr "Ditt presentkort har uppdaterats." + +msgid "Your gift certificate has been generated and saved in your cart." +msgstr "Ditt presentkort har genererats och sparats i din kundvagn." + +msgid "The selected product combination doesn't exist." +msgstr "Den valda produktkombination existerar inte." + +msgid "Please enter a valid product quantity." +msgstr "Ange en giltig produktkvantitet." + +msgid "Please enter a title, text and rating for your review." +msgstr "Ange en titel, text och betyg för din recension." + +msgid "" +"You are only allowed to post :number product review every :duration. Please " +"try again later." +msgstr "" +"Du får bara publicera :number produktgranskningar var :duration. Försök igen " +"senare." + +msgid "The email you entered is incorrect. Please type it again." +msgstr "E-postmeddelandet du angav är felaktigt. Skriv det igen." + +msgid "An internal error occurred while trying to save your review." +msgstr "Ett internt fel inträffade när du försökte spara din recension." + +msgid "Your review was saved and is shown below." +msgstr "Din recension sparades och visas nedan." + +msgid "Your review was saved and is pending approval." +msgstr "Din recension sparades och väntar på godkännande." + +msgid "Only customers who have purchased this item can review it." +msgstr "Endast kunder som har köpt den här artikeln kan recensera den." + +msgid "Oops..." +msgstr "Hoppsan..." + +msgid "Please enter your name and email address before submitting this form." +msgstr "Ange ditt namn och din e-postadress innan du skickar detta formulär." + +msgid "" +"Sorry, your request could not be processed as it contained an invalid " +"security token. Please refresh and try again." +msgstr "" +"Tyvärr kunde din begäran inte behandlas eftersom den innehöll ett ogiltig " +"säkerhetstoken. Var vänlig, uppdatera och försök igen." + +msgid "Newsletter Subscription" +msgstr "Prenumeration på nyhetsbrev" + +msgid "Please enter a valid email address, such as john@example.com." +msgstr "Vänligen ange en giltig e-postadress som joe@example.com" + +msgid "The email address %s is already subscribed to receive our newsletter." +msgstr "E-postadressen %s prenumererar redan för att få vårt nyhetsbrev." + +msgid "Thanks for Subscribing!" +msgstr "Tack för att du prenumererar!" + +msgid "" +"Thank you for joining our mailing list. You'll be sent the next issue of our " +"newsletter shortly." +msgstr "" +"Tack för att du gick med i vår e-postlista. Du kommer att bli tillskickad " +"nästa nummer av vårt nyhetsbrev inom kort." + +msgid "Continue" +msgstr "Fortsätt" + +msgid "" +"The gift certificate you entered couldn't be applied to any items in your " +"order." +msgstr "" +"Presentkortet du angav kunde inte tillämpas på några artiklar i din " +"beställning." + +msgid "The gift certificate {code} does not exist" +msgstr "Presentkortet {code} finns inte" + +msgid "Please enter a valid zip code/postcode or state." +msgstr "Ange ett giltigt postnummer eller tillstånd." + +msgid "Please select a valid state." +msgstr "Välj en giltig delstat." + +msgid "Please enter a valid zip code/postcode." +msgstr "Ange ett giltigt postnummer." + +msgid "" +"Unfortunately one or more items in your cart can't be shipped to your " +"location. Please choose a different delivery address." +msgstr "" +"Tyvärr kan en eller flera artiklar i din kundvagn inte skickas till ditt " +"ställe. Välj en annan leveransadress." + +msgid "Unable to retrieve shipping quote. Please try again or contact support." +msgstr "" +"Det går inte att hämta fraktoffert. Försök igen eller kontakta support." + +msgid "Passwords must be at least :length characters and contain: " +msgstr "Lösenord måste innehålla minst :length antal tecken och innehålla: " + +msgid "lower case letters" +msgstr "gemener" + +msgid "upper case letters" +msgstr "versala bokstäver" + +msgid "at least :numbers " +msgstr "åtminstone :numbers " + +msgid "at least :specialchars " +msgstr "åtminstone :specialchars " + +msgid "" +"Subject to Status. Terms and Conditions Apply. {merchantName} acts as a " +"broker and offers credit from PayPal Credit.\n" +"PayPal Credit is a trading name of PayPal (Europe) .à.r.l. et Cie, S.C.A., " +"22-24 Boulevard Royal L-2449, Luxembourg." +msgstr "" +"Med förbehåll för status. Villkor gäller. {merchantName} fungerar som " +"mäklare och erbjuder kredit från PayPal Credit. \n" +"PayPal Credit är ett handelsnamn för PayPal (Europa) .à.r.l. et Cie, SCA, " +"22-24 Boulevard Royal L-2449, Luxemburg." + +msgid "Add payment method" +msgstr "Lägg till betalningsmetod" + +msgid "Address Book" +msgstr "Adressbok" + +msgid "Address Form" +msgstr "Adressformulär" + +msgid "Your Orders" +msgstr "Dina beställningar" + +msgid "Order #{id}" +msgstr "Beställningsnummer {id}" + +msgid "Files" +msgstr "Filer" + +msgid "Account Details" +msgstr "Kontouppgifter" + +msgid "Edit Payment Method" +msgstr "Redigera betalningsmetod" + +msgid "Your Messages" +msgstr "Dina meddelanden" + +msgid "Login" +msgstr "Logga in" + +msgid "Reset Password" +msgstr "Återställ lösenord" + +msgid "Create New Return" +msgstr "Skapa ny retur" + +msgid "Your Account" +msgstr "Ditt konto" + +msgid "Payment Methods" +msgstr "Betalningsmetoder" + +msgid "Recently Viewed Items" +msgstr "Nyligen besökta artiklar" + +msgid "Your Returns" +msgstr "Din retur" + +msgid "Return Saved" +msgstr "Retur sparad" + +msgid "New Wishlist" +msgstr "Ny önskelista" + +msgid "Edit Wishlist" +msgstr "Redigera önskelista" + +msgid "Your Wishlists" +msgstr "Dina önskelistor" + +msgid "All Brands" +msgstr "Alla märken" + +msgid "Your Cart" +msgstr "Din vagn" + +msgid "Compare Products" +msgstr "Jämför produkter" + +msgid "Error" +msgstr "Fel" + +msgid "Gift Certificates" +msgstr "Presentkort" + +msgid "Search" +msgstr "Sök" + +msgid "Sitemap" +msgstr "Sitemap" + +msgid "View Wishlist" +msgstr "Visa önskelista" + +msgid "View Shared Wishlist" +msgstr "Visa delad önskelista" + +msgid "Home" +msgstr "Hem" diff --git a/assets/csv/tracking_carrier_values.csv b/assets/csv/tracking_carrier_values.csv new file mode 100644 index 000000000..5405837f3 --- /dev/null +++ b/assets/csv/tracking_carrier_values.csv @@ -0,0 +1,914 @@ +Tracking Carrier – Company Name,Tracking Carrier – Value +17 Post Service,17postservice +2ebox,2ebox +2GO,2go +360 Lion Express,360lion +3JMS Logistics,3jmslogistics +4-72 Entregando,4-72 +4PX,4px +绿色国际速递,6ls +A1Post,a1post +A2B Express Logistics,a2b-ba +AAA Cooper,aaa-cooper +AB Custom Group,abcustom +ABF Freight,abf +ABX Express,abxexpress-my +aCommerce,acommerce +ACS Courier,acscourier +ACS Worldwide Express,acsworldwide +Adicional Logistics,adicional +ADSOne,adsone +A Duie Pyle,aduiepyle +Aeronet,aeronet +AEX Group,aex +AFL LOGISTICS,afllog-ftp +Agility,agility +AIR21,air21 +Airmee,airmee-webhook +Airpak Express,airpak-express +Airspeed International Corporation,airspeed +AlfaTrex,alfatrex +Allied Express,alliedexpress +ALLJOY SUPPLY CHAIN CO. LTD,alljoy +alphaFAST,alphafast +Always Express,always-express +Amazon Shipping,amazon-uk-api +Amazon Shipping + Amazon MCF,amazon +AMS Group,amsegroup +Amstan Logistics,amstan +An Post,an-post +ANICAM BOX EXPRESS,anicamboxexpress +Anjun,anjun +ANSERX,anserx +Anteraja,anteraja +AO Logistics,ao-courier +AO Deutschland Ltd.,ao-deutschland +APC Postal Logistics,apc +APC Overnight,apc-overnight +APC Overnight Consignment Number,apc-overnight-connum +APC Overnight Reference,apc-overnight-reference +APC Postal Logistics,apc +APG eCommerce Solutions Ltd.,apg +Aprisa Express,aprisaexpress +Aquiline,aquiline +Aramex,aramex +Aramex Australia (formerly Fastway AU),fastway-au +Arco Spedizioni SP,arco-spedizioni +Arrow XL,arrowxl +ASE KARGO,ase +Asendia Germany,asendia-de +Asendia APAC,asendia-hk +Asendia HK (LATAM),skypostal +Asendia UK,asendia-uk +Asendia USA,asendia-usa +ASIGNA,asigna +ASM(GLS Spain),asm +Au Express,auexpress +AuPost China,aupost-china +Australia Post,australia-post +Austrian Post (Express),austrian-post +Austrian Post (Registered),austrian-post-registered +Averitt Express,averitt +Axlehire,axlehire-ftp +B&H Worldwide,bh-worldwide +B2C Europe,b2ceurope +北俄国际,be +Belpost,belpost +Beone Logistics,ibeone +Bert Transport,bert-fr +Best Way Parcel,bestwayparcel +BirdSystem,birdsystem +BJS Distribution Storage & Couriers,bjshomedelivery +Blink,blinklastmile +Bluecare Express Ltd,bluecare +Bluedart,bluedart +Blue Star,bluestar +Blue Express,bluex +Bneed,bneed +Bollore Logistics,bollore-logistics +Bombino Express Pvt Ltd,bombinoexp +Bond,bond +Bonds Couriers,bondscouriers +Border Express,borderexpress +Boxberry,box-berry +BOXC,boxc +Bpost,bpost +bpost international,bpost-international +Brazil Correios,brazil-correios +Bring,bring +Brouwer Transport en Logistiek B.V.,brouwer-transport +BRT Bartolini,brt-it +BRT Bartolini(Parcel ID),brt-it-parcelid +BRT Bartolini(Sender Reference),brt-it-sender-ref +Budbee,budbee-webhook +Buylogic,buylogic +CAE Delivers,cae-delivers +Cainiao,cainiao +Cambodia Post,cambodia-post +Canada Post,canada-post +Canpar Courier,canpar +Captain Express International,cpex +Caribou,caribou +Carriers,carriers +Carry-Flap Co. Ltd.,carry-flap +CBL Logistics,cbl-logistica +CDEK,cdek +CDEK TR,cdek-tr +CDL Last Mile,cdldelivers +Celeritas Transporte S.L,celeritas +Cello Square,cello-square +Česká Pošta,ceska-posta +CEVA LOGISTICS,ceva +CFL Logistics,cfl-logistics +CGS Express,cgs-express +Champion Logistics,champion-logistics +Chile Express,chilexpress +China EMS (ePacket),china-ems +China Post,china-post +Chit Chats,chitchats +Choir Express Indonesia,choirexpress +C.H. Robinson Worldwide Inc.,chrobinson +Chronopost France,chronopost-france +Chronopost Portugal (DPD),chronopost-portugal +Chukou1,ec-firstclass +City-Link Express,citylinkexpress +CJ GLS,cj-gls +CJ Logistics International(Hong Kong),cj-hk-international +CJ Korea Express,cj-korea-thai +CJ Century,cj-malaysia +CJ Century (International),cj-malaysia-international +CJ Transnational Philippines,cj-philippines +CJ Logistics International,cjlogistics +CJ Packet,cjpacket +CL E-Logistics Solutions Limited,cle-logistics +Clevy Links,clevy-links +Cloudwish Asia,cloudwish-asia +CND Express,cndexpress +CNE Express,cnexps +cnwangtong,cnwangtong +Colis Privé,colis-prive +Colissimo,colissimo +CollectCo,collectco +Collect+,collectplus +ComOne Express,com1express +CometTech,comet-tech +Con-way Freight,con-way +Concise,concise +Continental,continental +Coordinadora,coordinadora +Copa Airlines Courier,copa-courier +Cope Sensitive Freight,cope +Corporate Couriers,corporatecouriers-webhook +Correo Argentino,correo-argentino +Correo Uruguayo,correo-uy +Correos Chile,correos-chile +Correos de Mexico,correos-de-mexico +Correos de España,spain-correos-es +Correos Express,correosexpress +Cosmetics Now,costmeticsnow +Courant Plus,courant-plus +Courier IT,courierit +Courier Plus,courier-plus +CourierPost,courierpost +Couriers Please,couriers-please +cPacket,cpacket +CRL Express,crlexpress +Croshot,croshot +CSE,cse +CTC Express,ctc-express +Cubyn,cubyn +Cuckoo Express,cuckooexpress +Cyprus Post,cyprus-post +DACHSER,dachser +Daeshin,daeshin +DAI Post,daiglobaltrack +Dawn Wing,dawnwing +Day & Ross,dayross +Daylight Transport LLC,dylt +Dayton Freight,dayton-freight +DB Schenker Sweden,dbschenker-se +DB Schenker Sweden,dbschenker-sv +DD Express Courier,ddexpress +DealerSend,dealer-send +Delcart,delcart-in +Delhivery,delhivery +Deliver-iT,deliver-it +deliverE,delivere +DELIVERYONTIME LOGISTICS PVT LTD,deliveryontime +Deliver Your Parcel,deliveryourparcel-za +Delnext,delnext +Deltec Courier,deltec-courier +DemandShip,demandship +Dependable Supply Chain Services,godependable +Designer Transport,designertransport-webhook +Destiny Transportation,destiny +Detrack,detrack +Deutsche Post DHL,dhl-germany +Deutsche Post Mail,deutsch-post +DEX-I,dex-i +DHL 2-Mann-Handling,dhl-deliverit +DHL Active Tracing,dhl-active-tracing +DHL Benelux,dhl-benelux +DHL eCommerce,dhl-global-mail +DHL Express,dhl +DHL Express (Piece ID),dhl-pieceid +DHL eCommerce Asia,dhl-global-mail-asia +DHL Hong Kong,dhl-hk +DHL Netherlands,dhl-nl +DHL Parcel NL,dhlparcel-nl +DHL Parcel Russia,dhlparcel-ru +DHL Parcel Spain,dhlparcel-es +DHL Parcel UK,dhlparcel-uk +DHL Poland Domestic,dhl-poland +DHl (Reference Number),dhl-reference +DHL Spain Domestic,dhl-es +DHL Supply Chain Australia,dhl-supply-chain-au +DHL Supply Chain APAC,dhl-supplychain-apac +Dialogo Logistica,dialogo-logistica +Diamond Eurogistics Limited,diamondcouriers +DIDADI Logistics tech,didadi +Dimerco Express Group,dimerco +Direct Couriers,directcouriers +Direct Freight Express,directfreight-au-ref +Direct Link,directlink +Directlog,directlog +Direct Parcels,directparcels +Direx,direx +DMM Network,dmm-network +DMSMatrix,dms-matrix +DobroPost,dobropost +Doora Logistics,doora +DoorDash,doordash-webhook +Dotzot,dotzot +DPD,dpd +DPD Germany,dpd-de +DPD France,dpd-fr-reference +DPD France (formerly exapaq),exapaq +DPD HK,dpd-hk +DPD Hungary,dpd-hungary +DPD Ireland,dpd-ireland +DPD Local,interlink-express +DPD Local reference,interlink-express-reference +DPD Poland,dpd-poland +DPD Romania,dpd-ro +DPD Russia,dpd-ru +DPD UK,dpd-uk +DPE Express,dpe-express +DPE South Africa,dpe-za +DPEX,dpex +DPEX China,szdpex +DSV,dsv +DTDC Australia,dtdc-au +DTDC India,dtdc +DX,dx +Dynamic Logistics,dynamic-logistics +Easy Mail,easy-mail +EC-Firstclass,ec-firstclass +Ecargo,ecargo-asecexpressia +Ensenda,ensenda +ECexpress,ecexpress +Echo,echo +ECMS International Logistics Co. Ltd.,ecms +Ecom Express,ecom-express +ECOSCOOTING,ecoscooting +eFEx (E-Commerce Fulfillment & Express),efex +EFS (E-commerce Fulfillment Service),efs +Ekart,ekart +ELTA Hellenic Post,elta-courier +Emirates Post,emirates-post +EMPS Express,empsexpress +Endeavour Delivery,endeavour-delivery +Ensenda,ensenda +Envialia,envialia +Envialia Reference,envialia-reference +EP-Box,ep-box +eParcel Korea,eparcel-kr +ePost Global,epostglobal +Equick China,equick-cn +Eshipping,eshipping +Eshun international Logistic,zes-express +Estafeta,estafeta +Estes,estes +Etomars,etomars +eTotal Solution Limited,etotal +EU Fleet Solutions,eu-fleet-solutions +Eurodifarm,edf-ftp +Eurodis,eurodis +EVRi,myhermes-uk +Exelot Ltd.,exelot-ftp +Expeditors,expeditors +Expresssale,expresssale +EZship,ezship +FAR international,far-international +FarGood,fargood +Fast & Furious,fnf-za +Fastbox,fastbox +Fastrak Services,fasttrack +Fastrak Services,fastrak-th +Fastway Australia,fastway-au +Fastway Ireland,fastway-ireland +Fastway New Zealand,fastway-nz +Fastway South Africa,fastway-za +FDSEXPRESS,fdsexpress +FedEx®,fedex +FedEx® Cross Border,fedex-crossborder +FedEx® International MailService®,fedex-fims +FedEx® Freight,fedex-freight +FedEx Poland Domestic,opek +FedEx® UK,fedex-uk +FERCAM Logistics & Transport,fercam +Fiege Logistics,fiege +Fiege Netherlands,fiege-nl +First Flight Couriers,first-flight +First Logistics,first-logistics +FirstMile,firstmile +Flash Express,flashexpress +Flyt Express,flytexpress +FMX,fmx +Fonsen Logistics,fonsen +forrun Pvt Ltd (Arpatech Venture),forrun +Forward Air,forwardair +Freightquote by C.H. Robinson,freightquote +Frete Rápido,freterapido +Fulfilla,fulfilla +Fulfillmen,fulfillmen +Furdeco,furdeco +GAC,gac-webhook +GANGBAO Supplychain,gangbao +Gati-KWE,gati-kwe +GBA Services Ltd,gba +GBS-Broker,gbs-broker +GDEX,gdex +Geis CZ,geis +Gel Express Logistik,gel-express +GEM Worldwide,gemworldwide +Geniki Taxydromiki,taxydromiki +GEODIS - Distribution & Express,geodis-calberson-fr +Geodis E-space,geodis-espace +GESWL Express,geswl +ghn,Giao hàng nhanh +Giao hàng nhanh,ghn +Gio Express,gio-express +Global Post,goglobalpost +GlobalTranz,globaltranz +Globavend,globavend +Globegistics Inc.,globegistics +Glovo,glovo +GLS,gls +GLS Croatia,gls-croatia +GLS Czech Republic,gls-cz +GLS Italy,gls-italy +GLS General Logistics Systems Slovakia s.r.o.,gls-slovakia +GLS Logistic Systems Canada Ltd./Dicom,dicom +GLS Netherlands,gls-netherlands +GLS Slovenia,gls-slovenia +Go!Express and logistics,general-overnight +GoFly,gofly +GoJavas,gojavas +Gojek,gojek-webhook +Go Rush,gorush +Grab,grab-webhook +Greyhound,greyhound +Grupo ampm,grupoampm +Grupo logistico Andreani,andreani +GSI EXPRESS,gsi-express +GSO(GLS-USA),gso +Haidaibao,hdb +HCT LOGISTICS CO.LTD.,hct-logistics +Hellmann Worldwide Logistics Inc,hellmann +Helthjem,helthjem +Heppner France,heppner-fr +Heppner Internationale Spedition GmbH & Co.,heppner +Hermes Einrichtungs Service GmbH & Co. KG,hermes-2mann-handling +Hermes Germany,hermes-de +Hermesworld,hermes +Hero Express,heroexpress +Hipshipper,hipshipper +Holisol,holisol +Home Delivery Solutions Ltd,home-delivery-solutions +Homedirect Logistics,homedirect-logistics +Hong Kong Post,hong-kong-post +Hound Express,houndexpress +HR Parcel,hrparcel +Hrvatska Pošta,hrvatska-posta +HSDEXPRESS,hsdexpress +HUAHANG EXPRESS,yycom +Hua Han Logistics,hh-exp +HuanTong,huantong +Hunter Express,hunter-express +Huodull,huodull +HX Express,hx-express +i-dika,i-dika +i-parcel,i-parcel +Iceland Post,postur-is +iCumulus,icumulus +IDEX,idexpress +iDexpress Indonesia,idexpress-id +IMEX Global Solutions,imexglobalsolutions +IML,iml +IMX Mail,imxmail +India Post Domestic,india-post +India Post International,india-post-int +INDOPAKET,indopaket +Innight Express Germany GmbH (nox NachtExpress),nox-nachtexpress +Innovel,descartes +InPost Paczkomaty,inpost-paczkomaty +Integra2,integra2-ftp +Intel-Valley Supply chain (ShenZhen) Co. Ltd,intel-valley +Interlink Express,interlink-express +Intelipost (TMS for LATAM),intelipost +International Seur,international-seur +Internet Express,intexpress +Interparcel Australia,interparcel-au +Interparcel New Zealand,interparcel-nz +Interparcel UK,interparcel-uk +INTEX Paketdienst GmbH,intex-de +Israel Post,israel-post +Israel Post Domestic,israel-post-domestic +Italy SDA,italy-sda +ITIS International,itis +Ivoy,ivoy-webhook +J-Net,j-net +J&T CARGO,jtcargo +J&T EXPRESS MALAYSIA,jtexpress +J&T Express Singapore,simplypost +J&T Express Vietnam,jtexpress-vn +Jam Express,jam-express +Janco Ecommerce,janco +Janio Asia,janio +Japan Post,japan-post +Jayon Express (JEX),jayonexpress +JCEX,jcex +JD Worldwide,jd-worldwide +Jersey Post,jersey-post +Jet-Ship Worldwide,jet-ship +金斗云物流,jindouyun +JINSUNG TRADING,jinsung +JNE,jne +Jocom,jocom +Joom Logistics,joom-logistics +Joying Box,joyingbox +JP BH Pošta,bh-posta +JS EXPRESS,js-express +JX,jx +K1 Express,k1-express +Kangaroo Worldwide Express,kangaroo-my +KargomKolay (CargoMini),kargomkolay +KEC,kec +Kerry eCommerce,kerry-ecommerce +Kerry Express Hong Kong,tgx +Kerry Express Thailand,kerry-logistics +Kerry Express (Vietnam) Co Ltd,kerryttc-vn +Kerry TJ Logistics,kerrytj +Kerry TTC Express,kerryttc-vn +KGM Hub,kgmhub +Kiala,kiala +Komon Express,komon-express +Korea Post EMS,korea-post +Korea Post,korea-post +Kuehne + Nagel,kn +Kuehne + Nagel Global,kng +KURASI,kurasi +KWE Global,kwe-global +Kua Yue Express,ky-express +Kyungdong Parcel,kdexp +La Poste,la-poste-colissimo +Lalamove,lalamove +Landmark Global,landmark-global +Landmark Global Reference,landmark-global-reference +Lao Post,lao-post +LaserShip,lasership +Latvijas Pasts,latvijas-pasts +LBC Express,lbcexpress +LBC EXPRESS INC.,lbcexpress-ftp +Leader,leader +Legion Express,legion-express +LexShip,lexship +LHT Express,lht-express +LICCARDI EXPRESS COURIER,liccardi-express +liefery,liefery +Lietuvos Paštas,lietuvos-pastas +Line Clear Express & Logistics Sdn Bhd,line +Link Bridge(BeiJing)international logistics co. ltd,linkbridge +Lion Parcel,lion-parcel +Locus,locus-webhook +Logisters,logisters +Logistic Worldwide Express,lwe-hk +Logistika,logistika +Lone Star Overnight,lonestar +Loomis Express,loomis-express +Lotte Global Logistics,lotte +LTIAN EXP,ltianexp +LTL,ltl +M Xpress Sdn Bhd,m-xpress +M3 Logistics,m3logistics +M&X cargo,mx-cargo +Magyar Posta,magyar-posta +MailAmericas,mailamericas +MailPlus,mailplus +MailPlus (Japan),mailplus-jp +Mainfreight,mainfreight +Mainway,mainway +Malaysia Post - Registered,malaysia-post-posdaftar +Malaysia Post EMS / Poslaju,malaysia-post +Mara Xpress,mara-xpress +Matdespatch,matdespatch +Matkahuolto,matkahuolto +Maxcellents Pte Ltd,maxcellents +MBW Courier Inc.,mbw +MDS Collivery Pty (Ltd),collivery +Meest,meest +Mena 360 (Fetchr),fetchr-webhook +Mexico AeroFlash,aeroflash +Mexico Redpack,mexico-redpack +Mexico Senda Express,mexico-senda-express +Mhi,mhi +Mikropakket,mikropakket +Mikropakket Belgium,mikropakket-be +Milkman,milkman +Mobi Logistica,mobi-br +Mondial Relay,mondialrelay +Moova,moova +Morelink,morelink +Morning Express,morning-express +MRW,mrw-ftp +MRW,mrw-spain +MXE Express,mxe +My DynaLogic,mydynalogic +myHermes UK,myhermes-uk +Mypostonline,mypostonline +N&M Transfer Co. Inc.,nmtransfer +NACEX,nacex +NACEX Spain,nacex-spain +NACEX Spain,nacex-spain-reference +Naeko Logistics,naeko-ftp +Nanjing Woyuan,nanjingwoyuan +National Sameday,national-sameday +Nationex,nationex +Nationwide Express,nationwide-my +NEW ZEALAND COURIERS,newzealand-couriers +New Zealand Post,new-zealand-post +Neway Transport,neway +Newegg Express,neweggexpress +Newgistics,newgistics +Nexive (TNT Post Italy),tntpost-it +Nhans Solutions,nhans-solutions +Nhat Tin Logistics,ntlogistics-vn +Nightline,nightline +Nim Express,nim-express +Ninja Van,ninjavan +Ninja Van Indonesia,ninjavan-id +Ninja Van Malaysia,ninjavan-my +Ninja Van Thailand,ninjavan-thai +Ninjavan Webhook,ninjavan-webhook +NiPost,nipost +Nippon Express,nippon-express +Norsk Global,norsk-global +Nova Poshta,nova-poshta +NuvoEx,nuvoex +NYT SUPPLY CHAIN LOGISTICS Co. LTD,nytlogistics +OCA Argentina,oca-ar +OCS ANA Group,ocs +OCS WORLDWIDE,ocs-worldwide +OkayParcel,okayparcel +Old Dominion Freight Line,old-dominion +Omni Parcel,omniparcel +Omni Returns,omnirps-webhook +Omniva,omniva +One click delivery services,oneclick +One World Express,oneworldexpress +OnTrac,ontrac +OrangeDS (Orange Distribution Solutions Inc),orangedsinc +OSM Worldwide,osm-worldwide +Overseas Express,overseas-hr +P2P TrakPak,trakpak +Paack,paack-webhook +Packlink,packlink +平安达腾飞快递,padtf +Pago Logistics,pago +PAL Express Limited,palexpress +Palletways,palletways +Pan-Asia International,pan-asia +Pandu Logistics,pandulogistics +Panther,panther +Panther Reference,panther-reference +Paper Express,paper-express +Paperfly Private Limited,paperfly +Paquetexpress,paquetexpress +Parcel2Go,parcel2go +Parcel Express,parcel-express +Parcel Force,parcel-force +Parcelink Logistics,parcelinklogistics +Parcelled.in,parcelled-in +PARCEL ONE,parcelone +ParcelPal,parcelpal-webhook +ParcelPoint Pty Ltd,parcelpoint +Parcel Post Singapore,parcelpost-sg +Parcel Right,parcelright +Parcel To Post,parceltopost +PARCLL,parcll +Park N Parcel,parknparcel +PayPal Package,ppbyb +PCF Final Mile,pcfcorp +PFC Express,pfcexpress +PFL,pflogistics +Pickrr,pickrr +Pickupp,pickup +PICK UPP,pickupp-mys +PICK UPP (Singapore),pickupp-sgp +PIL Logistics (China) Co. Ltd,pil-logistics +Pilot Freight Services,pilot-freight +Pitney Bowes,pitney-bowes +PITT OHIO,pittohio +PIXSELL LOGISTICS,pixsell +Planzer Group,planzer +Plus UK Logistics,plusuk-webhook +Poczta Polska,poczta-polska +Pony express,pony-express +Portugal CTT,portugal-ctt +Portugal Seur,portugal-seur +Pos Indonesia Domestic,pos-indonesia +Pos Indonesia Int'l,pos-indonesia-int +PostNord Denmark,danmark-post +Post Serbia,post-serbia +Post of Slovenia,post-slovenia +Post56,post56 +Poșta Română,posta-romana +Posta Plus,postaplus +Poste Italiane,poste-italiane +Poste Italiane Paccocelere,poste-italiane-paccocelere +Posten Norge / Bring,posten-norge +Posti,posti +PostNL Domestic,postnl +PostNL International,postnl-international +PostNL International 3S,postnl-3s +PostNord Logistics,postnord +PostNord Denmark,danmark-post +PostNord Sweden,sweden-posten +Post ONE,postone +PostPlus,postplus +Po_Èta Rom’¢nóÛ,posta-romana +PRESIDENT TRANSNET CORP,taqbin-taiwan +Pressio,pressiode +Professional Couriers,professional-couriers +"ProMed Delivery, Inc.",promeddelivery +PT MGLOBAL LOGISTICS INDONESIA,mglobal +PT Prima Multi Cipta,primamulticipta +PTS,pts +PTT Posta,ptt-posta +Purolator,purolator +Qingdao HKD International Logistics,hkd +Quantium,quantium +Qwintry Logistics,qwintry +Qxpress,qxpress +Raben Group,raben-group +RAF Philippines,raf +RaidereX,raiderex +RAM,ramgroup-za +Red Carpet Logistics,rcl +Red Express,red-express +Red Express Waybill,red-express-wb +Redur Spain,redur-es +RETS express,ets-express +Rivo,air-canada-global +Rincos,rincos +RL Carriers,rl-carriers +Roadbull Logistics,roadbull +Roadrunner Transport Service,roadrunner-freight +Rocket Parcel International,rocketparcel +Routific,routific-webhook +RoyalShipments,royalshipments +RPD2man Deliveries,rpd2man +RPX Indonesia,rpx +RPX Logistics,rpxlogistics +RPX Online,rpxonline +RR Donnelley,rrdonnelley +Russian Post,russian-post +Ruston,ruston +RZY Express,rzyexpress +Safexpress,safexpress +Sagawa,sagawa +Saia LTL Freight,saia-freight +SAILPOST,sailpost +SAP EXPRESS,sap-express +Saudi Post,saudi-post +Sber Logistics,sberlogistics-ru +Scudex Express,scudex-express +闪电猴,sdh-scm +Seino,seino +SEKO Logistics,sekologistics +SEKO Worldwide LLC,seko-sftp +Sending Transporte Urgente y Comunicacion S.A.U,sending +Sendit,sendit +Sendle,sendle +SENHONG INTERNATIONAL LOGISTICS,showl +Setel Express,setel +SF Express,sf-express +SF Express China,sf-express-cn +SF International,sfb2c +SFC,sfc +SFC-SendfromChina,sfcservice +SGT Corriere Espresso,sgt-it +Shadowfax,shadowfax +Shanghai Aqrum Chemical Logistics Co.Ltd,dajin +Shenzhen 1st International Logistics(Group)Co Ltd,ydex +SHENZHEN HOTSIN CARGO INTL FORWARDING CO. LTD,hotsin-cargo +Shenzhen Jinghuada Logistics Co. Ltd,kwt +Ship It Asia,ship-it-asia +ShipEntegra,shipentegra +ShipGate,shipgate +Shippit,shippit +SHIPTER,shipter +Shiptor,shiptor +ShipX,shipx +Shopee Express,spx +Shopee Xpress,spx-th +ShopfansRU LLC,shopfans +Shree Anjani Courier,shreeanjanicourier +Shree Maruti Courier Services Pvt Ltd,shree-maruti +SHREE NANDAN COURIER,shreenandancourier +SHREE TIRUPATI COURIER SERVICES PVT. LTD.,shreetirupati +Shypmax,shyplite +SimpleTire,simpletire-webhook +Singapore Post,singapore-post +Singapore Speedpost,singapore-speedpost +Sin Global Express,singlobal-express +Sinotrans,sinotrans +Siodemka,siodemka +SKYBOX,skybox +SkyNet Malaysia,skynet +SkyNet Worldwide Express,skynetworldwide +SkyNet Worldwide Express UAE,skynetworldwide-uae +Skynet Worldwide Express UK,skynetworldwide-uk +SkyPostal,sky-postal +Slovenská pošta a.s,sk-posta +SMARTCAT,smartcat +SMG Direct,smg-express +Smooth Couriers,smooth +SMSA Express,smsa-express +Sonic Transportation & Logistics,sonictl +SortHub,thenile-webhook +South African Post Office,sapo +Southeastern Freight Lines,sefl +Spanish Seur,spanish-seur +Specialised Freight,specialisedfreight-za +Speed Couriers,speedcouriers-gr +Spee-Dee Delivery,speedee +SPEEDEX,speedex +Speedex Courier,speedexcourier +SPOTON Logistics Pvt Ltd,spoton +Spreadel,spreadel +Spring GDS,spring-gds +SRE Korea,srekorea +SRT Transport,srt-transport +Stallion Express,stallionexpress +STARKEN,starken +StarTrack,star-track +Star Track Courier,star-track-courier +Star Track Express,star-track-express +StarTrack,star-track +STEP FORWARD FREIGHT SERVICE CO LTD,stepforwardfs +STO Express,sto +STONE3PL,stone3pl +Streck Transport,streck-transport +Sunyou Post,sypost +Sutton Transport,sutton +Sweden Posten,sweden-posten +Swiship,swiship +Swiship DE,amazon-fba-swiship-de +Swiship UK,amazon-fba-swiship +Swiss Post,swiss-post +Swiss Post FTP,swiss-post-ftp +SZENDEX,szendex +Tai Wan Global Business,global-express +Taiwan Post,taiwan-post +TAQBIN Hong Kong,taqbin-hk +TAQBIN Malaysia,taqbin-my +TAQBIN Singapore,taqbin-sg +Tazmanian Freight Systems,tazmanian-freight +TCK Express,tck-express +TCS,tcs +Teliway SIC Express,sic-teliway +TForce Final Mile,tforce-finalmile +TFM Xpress,tfm +TGX,tgx +Thabit Logistics,thabit-logistics +Thailand Thai Post,thailand-post +The Courier Guy,thecourierguy +TDG – The Delivery Group,thedeliverygroup +The Pallet Network,pallet-network +TIG Freight,tigfreight +Tiki,tiki +TIPSA,tipsa +TNT,tnt +TNT Australia,tnt-au +TNT-Click Italy,tnt-click +TNT France,tnt-fr +TNT Italy,tnt-it +TNT Reference,tnt-reference +TNT UK,tnt-uk +TNT UK Reference,tnt-uk-reference +TNT-Click Italy,tnt-click +Toll Group,toll-webhook +Toll IPEC,toll-ipec +Toll New Zealand,toll-nz +Toll Priority,toll-priority +Tolos,tolos +TONDA GLOBAL,tarrive +Tophatter Express,tophatterexpress +Top Ideal Express,esdex +TopYou,topyou +Total Express,total-express +tourline,tourline +TP Logistic,thaiparcels +Trackon Couriers Pvt. Ltd,trackon +TrakPak,trakpak +Transgroup,logistyx-transgroup +Trans Kargo Internasional,trans-kargo +Trans2u,trans2u +TransMission,transmission-nl +TRUMPCARD LLC,trumpcard +Trunkrs,trunkrs-webhook +Tuffnells Parcels Express,tuffnells +Tuffnells Parcels Express- Reference,tuffnells-reference +UBI Logistics Australia,ubi-logistics +ucexpress,uc56 +ó‘esk’ Pota,ceska-posta +UK Mail,uk-mail +UkrPoshta,ukrposhta +United Delivery Service Ltd,uds +UPS,ups +UPS Freight,ups-freight +UPS Mail Innovations,ups-mi +UPS Reference,ups-reference +Urbanfox,courex +USF Reddaway,usf-reddaway +uShip,uship +USPS,usps +VAMOX,vamox +Venipak,venipak +ViaEurope,viaeurope +Viaxpress,via-express +Vietnam Post,vnpost +Vietnam Post EMS,vnpost-ems +ViettelPost,viettelpost +VIR Transport,virtransport +VIWO IoT,viwo +Wahana,wahana +WanbExpress,wanbexpress +Weaship,weaship +WeDo Logistics,wedo +WePost Sdn Bhd,wepost +West Bank Courier,westbank-courier +Westgate Global,shipwestgate +Whistl,whistl +Whistl,whistl-sftp +万邑通,winit +Wise Express,wise-express +Wiseloads,wiseloads +WishPost,wishpost +Wizmo,wizmo +WMG Delivery,wmg +wnDirect,wndirect +Wyngs,wyngs-my +XDP Express,xdp-uk +XDP Express Reference,xdp-uk-reference +Xend Express,xend +Ximex Delivery Express,xde-webhook +Xingyunyi Logistics,xyy +XL Express,xl-express +Xpert Delivery,xpert-delivery +XPO logistics,xpo-logistics +Xpost.ph,xpost +XpressBees,xpressbees +Xpressen,xpressen-dk +XQ Express,xq-express +Yakit,yakit +Yanwen,yanwen +Yamato Japan,taqbin-jp +Yamato Singapore,taqbin-sg +Yanwen,yanwen +YDH express,ydh-express +YiFan Express,yifan +Yilian (Elian) Supply Chain,elian-post +英诺供应链,yingnuo-logistics +Yodel Direct,yodeldirect +Yodel Domestic,yodel +Yodel International,yodel-international +YRC,yrc +YTO Express,yto +Yun Express,yunexpress +Yunda Express,yundaex +Yurtici Kargo,yurtici-kargo +Yusen Logistics,yusen +YYEXPRESS,yyexpress +Zajil Express Company,zajil-express +Zalora 7-Eleven,zalora-7-eleven +Zeleris,zeleris +Zeek,sfplus-webhook +ZeptoExpress,zepto-express +Ziing Final Mile Inc,ziingfinalmile +Zinc,zinc +ZJS International,zjs-express +ZTO Express,zto-express +Zyllem,zyllem diff --git a/assets/images/B3-console.png b/assets/images/B3-console.png new file mode 100644 index 000000000..abb8ad748 Binary files /dev/null and b/assets/images/B3-console.png differ diff --git a/assets/images/CouponDrawer_final.png b/assets/images/CouponDrawer_final.png new file mode 100644 index 000000000..fc16f347f Binary files /dev/null and b/assets/images/CouponDrawer_final.png differ diff --git a/assets/images/WCAG-guidelines-add_links.png b/assets/images/WCAG-guidelines-add_links.png new file mode 100644 index 000000000..e3eb1e935 Binary files /dev/null and b/assets/images/WCAG-guidelines-add_links.png differ diff --git a/assets/images/WCAG_guideline_skip_to_main.png b/assets/images/WCAG_guideline_skip_to_main.png new file mode 100644 index 000000000..8685e38b0 Binary files /dev/null and b/assets/images/WCAG_guideline_skip_to_main.png differ diff --git a/assets/images/WCAG_guidelines_breadcrumbs.png b/assets/images/WCAG_guidelines_breadcrumbs.png new file mode 100644 index 000000000..e64f1f2c1 Binary files /dev/null and b/assets/images/WCAG_guidelines_breadcrumbs.png differ diff --git a/assets/images/accessibility-image-widget.png b/assets/images/accessibility-image-widget.png new file mode 100644 index 000000000..43990dd9b Binary files /dev/null and b/assets/images/accessibility-image-widget.png differ diff --git a/assets/images/accessibility_correct_text_size.png b/assets/images/accessibility_correct_text_size.png new file mode 100644 index 000000000..977b14a22 Binary files /dev/null and b/assets/images/accessibility_correct_text_size.png differ diff --git a/assets/images/accessibility_good_color_contrast.png b/assets/images/accessibility_good_color_contrast.png new file mode 100644 index 000000000..7032b5106 Binary files /dev/null and b/assets/images/accessibility_good_color_contrast.png differ diff --git a/assets/images/accessibility_incorrect_text_size.png b/assets/images/accessibility_incorrect_text_size.png new file mode 100644 index 000000000..724071801 Binary files /dev/null and b/assets/images/accessibility_incorrect_text_size.png differ diff --git a/assets/images/accessibility_poor_color_contrast.png b/assets/images/accessibility_poor_color_contrast.png new file mode 100644 index 000000000..9cdc27e01 Binary files /dev/null and b/assets/images/accessibility_poor_color_contrast.png differ diff --git a/assets/images/accessibility_text_headings.png b/assets/images/accessibility_text_headings.png new file mode 100644 index 000000000..5ae024b94 Binary files /dev/null and b/assets/images/accessibility_text_headings.png differ diff --git a/assets/images/apps-01-introduction-01.png b/assets/images/apps-01-introduction-01.png new file mode 100644 index 000000000..3a29d533a Binary files /dev/null and b/assets/images/apps-01-introduction-01.png differ diff --git a/assets/images/apps-01-introduction-02.png b/assets/images/apps-01-introduction-02.png new file mode 100644 index 000000000..f26c1da9f Binary files /dev/null and b/assets/images/apps-01-introduction-02.png differ diff --git a/assets/images/apps-01-introduction-03.png b/assets/images/apps-01-introduction-03.png new file mode 100644 index 000000000..c1de2a285 Binary files /dev/null and b/assets/images/apps-01-introduction-03.png differ diff --git a/assets/images/apps-02-types-01.png b/assets/images/apps-02-types-01.png new file mode 100644 index 000000000..19ace57a8 Binary files /dev/null and b/assets/images/apps-02-types-01.png differ diff --git a/assets/images/apps-02-types-02.png b/assets/images/apps-02-types-02.png new file mode 100644 index 000000000..2d2010403 Binary files /dev/null and b/assets/images/apps-02-types-02.png differ diff --git a/assets/images/apps-10-buttons-01.png b/assets/images/apps-10-buttons-01.png new file mode 100644 index 000000000..f50bb4fb6 Binary files /dev/null and b/assets/images/apps-10-buttons-01.png differ diff --git a/assets/images/apps-10-buttons-02.png b/assets/images/apps-10-buttons-02.png new file mode 100644 index 000000000..28572a9a6 Binary files /dev/null and b/assets/images/apps-10-buttons-02.png differ diff --git a/assets/images/apps-id-01.png b/assets/images/apps-id-01.png new file mode 100644 index 000000000..c1b58a6d8 Binary files /dev/null and b/assets/images/apps-id-01.png differ diff --git a/assets/images/apps-id-02.png b/assets/images/apps-id-02.png new file mode 100644 index 000000000..c8712806d Binary files /dev/null and b/assets/images/apps-id-02.png differ diff --git a/assets/images/becoming-a-partner-01.png b/assets/images/becoming-a-partner-01.png new file mode 100644 index 000000000..4ac2fe1c6 Binary files /dev/null and b/assets/images/becoming-a-partner-01.png differ diff --git a/assets/images/becoming-a-partner-02.png b/assets/images/becoming-a-partner-02.png new file mode 100644 index 000000000..861915348 Binary files /dev/null and b/assets/images/becoming-a-partner-02.png differ diff --git a/assets/images/catalog-price-object-examples.png b/assets/images/catalog-price-object-examples.png new file mode 100644 index 000000000..079060dae Binary files /dev/null and b/assets/images/catalog-price-object-examples.png differ diff --git a/assets/images/channels-overview-01.png b/assets/images/channels-overview-01.png new file mode 100644 index 000000000..6cda0b500 Binary files /dev/null and b/assets/images/channels-overview-01.png differ diff --git a/assets/images/channels-overview-02.png b/assets/images/channels-overview-02.png new file mode 100644 index 000000000..652712816 Binary files /dev/null and b/assets/images/channels-overview-02.png differ diff --git a/assets/images/channels-overview-03.png b/assets/images/channels-overview-03.png new file mode 100644 index 000000000..5a0adf159 Binary files /dev/null and b/assets/images/channels-overview-03.png differ diff --git a/assets/images/channels-overview-04.png b/assets/images/channels-overview-04.png new file mode 100644 index 000000000..05023a75b Binary files /dev/null and b/assets/images/channels-overview-04.png differ diff --git a/assets/images/channels-overview-05.png b/assets/images/channels-overview-05.png new file mode 100644 index 000000000..88ebe0e35 Binary files /dev/null and b/assets/images/channels-overview-05.png differ diff --git a/assets/images/channels-overview-06.png b/assets/images/channels-overview-06.png new file mode 100644 index 000000000..1098cf11b Binary files /dev/null and b/assets/images/channels-overview-06.png differ diff --git a/assets/images/channels-overview-07.png b/assets/images/channels-overview-07.png new file mode 100644 index 000000000..2212f145a Binary files /dev/null and b/assets/images/channels-overview-07.png differ diff --git a/assets/images/channels-overview-08.png b/assets/images/channels-overview-08.png new file mode 100644 index 000000000..67adda483 Binary files /dev/null and b/assets/images/channels-overview-08.png differ diff --git a/assets/images/channels-quick-start-01.png b/assets/images/channels-quick-start-01.png new file mode 100644 index 000000000..ecfbbcd8c Binary files /dev/null and b/assets/images/channels-quick-start-01.png differ diff --git a/assets/images/channels-quick-start-02.png b/assets/images/channels-quick-start-02.png new file mode 100644 index 000000000..5ba5ae150 Binary files /dev/null and b/assets/images/channels-quick-start-02.png differ diff --git a/assets/images/channels-quick-start-03.png b/assets/images/channels-quick-start-03.png new file mode 100644 index 000000000..8712b8296 Binary files /dev/null and b/assets/images/channels-quick-start-03.png differ diff --git a/assets/images/checkout-sdk-01.png b/assets/images/checkout-sdk-01.png new file mode 100644 index 000000000..544d2bc50 Binary files /dev/null and b/assets/images/checkout-sdk-01.png differ diff --git a/assets/images/checkout_options.png b/assets/images/checkout_options.png new file mode 100644 index 000000000..31107ba10 Binary files /dev/null and b/assets/images/checkout_options.png differ diff --git a/assets/images/cli-setup-instructions.png b/assets/images/cli-setup-instructions.png new file mode 100644 index 000000000..facd65e93 Binary files /dev/null and b/assets/images/cli-setup-instructions.png differ diff --git a/assets/images/confige_tax_settings.png b/assets/images/confige_tax_settings.png new file mode 100644 index 000000000..02b24abe2 Binary files /dev/null and b/assets/images/confige_tax_settings.png differ diff --git a/assets/images/content_folder_webdav.png b/assets/images/content_folder_webdav.png new file mode 100644 index 000000000..c7783ff23 Binary files /dev/null and b/assets/images/content_folder_webdav.png differ diff --git a/assets/images/contextual-filters-01.png b/assets/images/contextual-filters-01.png new file mode 100644 index 000000000..c2b3c7957 Binary files /dev/null and b/assets/images/contextual-filters-01.png differ diff --git a/assets/images/contextual-filters-02.png b/assets/images/contextual-filters-02.png new file mode 100644 index 000000000..d486056f7 Binary files /dev/null and b/assets/images/contextual-filters-02.png differ diff --git a/assets/images/contextual-filters-03.png b/assets/images/contextual-filters-03.png new file mode 100644 index 000000000..0828790e9 Binary files /dev/null and b/assets/images/contextual-filters-03.png differ diff --git a/assets/images/contextual-filters-04.png b/assets/images/contextual-filters-04.png new file mode 100644 index 000000000..0ec4ab78a Binary files /dev/null and b/assets/images/contextual-filters-04.png differ diff --git a/assets/images/coupon_drawer_example.png b/assets/images/coupon_drawer_example.png new file mode 100644 index 000000000..fc16f347f Binary files /dev/null and b/assets/images/coupon_drawer_example.png differ diff --git a/assets/images/create-api-account.png b/assets/images/create-api-account.png new file mode 100644 index 000000000..c48790af1 Binary files /dev/null and b/assets/images/create-api-account.png differ diff --git a/assets/images/create-stencil-cli-token.png b/assets/images/create-stencil-cli-token.png new file mode 100644 index 000000000..04e98621d Binary files /dev/null and b/assets/images/create-stencil-cli-token.png differ diff --git a/assets/images/currency_beta/gift_certificates_multi_currency.png b/assets/images/currency_beta/gift_certificates_multi_currency.png new file mode 100644 index 000000000..a2f9403e6 Binary files /dev/null and b/assets/images/currency_beta/gift_certificates_multi_currency.png differ diff --git a/assets/images/currency_beta/multi_currency_cart_level_discount_one.png b/assets/images/currency_beta/multi_currency_cart_level_discount_one.png new file mode 100644 index 000000000..a341fd6db Binary files /dev/null and b/assets/images/currency_beta/multi_currency_cart_level_discount_one.png differ diff --git a/assets/images/custom-checkout-0.png b/assets/images/custom-checkout-0.png new file mode 100644 index 000000000..cb684d43a Binary files /dev/null and b/assets/images/custom-checkout-0.png differ diff --git a/assets/images/custom-checkout-01.png b/assets/images/custom-checkout-01.png new file mode 100644 index 000000000..a70404ce4 Binary files /dev/null and b/assets/images/custom-checkout-01.png differ diff --git a/assets/images/customizing_invoice_print_order_invoice.png b/assets/images/customizing_invoice_print_order_invoice.png new file mode 100644 index 000000000..dd3775976 Binary files /dev/null and b/assets/images/customizing_invoice_print_order_invoice.png differ diff --git a/assets/images/details-on-how-to-debug.png b/assets/images/details-on-how-to-debug.png new file mode 100644 index 000000000..a4a63e03a Binary files /dev/null and b/assets/images/details-on-how-to-debug.png differ diff --git a/assets/images/devtools-tutorial-00.png b/assets/images/devtools-tutorial-00.png new file mode 100644 index 000000000..b364be16c Binary files /dev/null and b/assets/images/devtools-tutorial-00.png differ diff --git a/assets/images/devtools-tutorial-01.png b/assets/images/devtools-tutorial-01.png new file mode 100644 index 000000000..a4dea6053 Binary files /dev/null and b/assets/images/devtools-tutorial-01.png differ diff --git a/assets/images/devtools-tutorial-02.png b/assets/images/devtools-tutorial-02.png new file mode 100644 index 000000000..264f438ae Binary files /dev/null and b/assets/images/devtools-tutorial-02.png differ diff --git a/assets/images/devtools-tutorial-03.png b/assets/images/devtools-tutorial-03.png new file mode 100644 index 000000000..dd7d86043 Binary files /dev/null and b/assets/images/devtools-tutorial-03.png differ diff --git a/assets/images/devtools-tutorial-04.png b/assets/images/devtools-tutorial-04.png new file mode 100644 index 000000000..9ef4abc83 Binary files /dev/null and b/assets/images/devtools-tutorial-04.png differ diff --git a/assets/images/devtools-tutorial-05.png b/assets/images/devtools-tutorial-05.png new file mode 100644 index 000000000..a77dbccd8 Binary files /dev/null and b/assets/images/devtools-tutorial-05.png differ diff --git a/assets/images/devtools-tutorial-06.png b/assets/images/devtools-tutorial-06.png new file mode 100644 index 000000000..ccf84cee6 Binary files /dev/null and b/assets/images/devtools-tutorial-06.png differ diff --git a/assets/images/devtools.png b/assets/images/devtools.png new file mode 100644 index 000000000..b364be16c Binary files /dev/null and b/assets/images/devtools.png differ diff --git a/assets/images/email-templates-add-button.png b/assets/images/email-templates-add-button.png new file mode 100644 index 000000000..2ab59387c Binary files /dev/null and b/assets/images/email-templates-add-button.png differ diff --git a/assets/images/email-templates-add-template.png b/assets/images/email-templates-add-template.png new file mode 100644 index 000000000..84cf11f76 Binary files /dev/null and b/assets/images/email-templates-add-template.png differ diff --git a/assets/images/email-templates-change-logo-size.png b/assets/images/email-templates-change-logo-size.png new file mode 100644 index 000000000..ccf657682 Binary files /dev/null and b/assets/images/email-templates-change-logo-size.png differ diff --git a/assets/images/extending-screenshots-01.png b/assets/images/extending-screenshots-01.png new file mode 100644 index 000000000..5f093150b Binary files /dev/null and b/assets/images/extending-screenshots-01.png differ diff --git a/assets/images/extending-screenshots-02.png b/assets/images/extending-screenshots-02.png new file mode 100644 index 000000000..3b45e7c3a Binary files /dev/null and b/assets/images/extending-screenshots-02.png differ diff --git a/assets/images/extending-screenshots-03.png b/assets/images/extending-screenshots-03.png new file mode 100644 index 000000000..7bd051ec8 Binary files /dev/null and b/assets/images/extending-screenshots-03.png differ diff --git a/assets/images/extending-screenshots-04.png b/assets/images/extending-screenshots-04.png new file mode 100644 index 000000000..548e3805e Binary files /dev/null and b/assets/images/extending-screenshots-04.png differ diff --git a/assets/images/extending-screenshots-05.png b/assets/images/extending-screenshots-05.png new file mode 100644 index 000000000..7b832836e Binary files /dev/null and b/assets/images/extending-screenshots-05.png differ diff --git a/assets/images/external_link_icon.svg b/assets/images/external_link_icon.svg new file mode 100644 index 000000000..fac637607 --- /dev/null +++ b/assets/images/external_link_icon.svg @@ -0,0 +1,59 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/assets/images/get_all_products_postman.png b/assets/images/get_all_products_postman.png new file mode 100644 index 000000000..e9c7cabf2 Binary files /dev/null and b/assets/images/get_all_products_postman.png differ diff --git a/assets/images/gloabal-regions-tutorial-01.png b/assets/images/gloabal-regions-tutorial-01.png new file mode 100644 index 000000000..22bf430d3 Binary files /dev/null and b/assets/images/gloabal-regions-tutorial-01.png differ diff --git a/assets/images/global-regions-tutorial-01.png b/assets/images/global-regions-tutorial-01.png new file mode 100644 index 000000000..22bf430d3 Binary files /dev/null and b/assets/images/global-regions-tutorial-01.png differ diff --git a/assets/images/global-regions-tutorial-02.png b/assets/images/global-regions-tutorial-02.png new file mode 100644 index 000000000..c371dec48 Binary files /dev/null and b/assets/images/global-regions-tutorial-02.png differ diff --git a/assets/images/graphql-overview-01.png b/assets/images/graphql-overview-01.png new file mode 100644 index 000000000..1c42112d2 Binary files /dev/null and b/assets/images/graphql-overview-01.png differ diff --git a/assets/images/graphql-playground-changelog.png b/assets/images/graphql-playground-changelog.png new file mode 100644 index 000000000..580281583 Binary files /dev/null and b/assets/images/graphql-playground-changelog.png differ diff --git a/assets/images/graphql-playground-docs.png b/assets/images/graphql-playground-docs.png new file mode 100644 index 000000000..0767a402f Binary files /dev/null and b/assets/images/graphql-playground-docs.png differ diff --git a/assets/images/graphql-storefront-api-playground.png b/assets/images/graphql-storefront-api-playground.png new file mode 100644 index 000000000..b76bd8f7a Binary files /dev/null and b/assets/images/graphql-storefront-api-playground.png differ diff --git a/assets/images/graphql-storefront-api-playground2.png b/assets/images/graphql-storefront-api-playground2.png new file mode 100644 index 000000000..28d3be437 Binary files /dev/null and b/assets/images/graphql-storefront-api-playground2.png differ diff --git a/assets/images/graphql/favicon.png b/assets/images/graphql/favicon.png new file mode 100644 index 000000000..ccbd94b3b Binary files /dev/null and b/assets/images/graphql/favicon.png differ diff --git a/assets/images/graphql/logo.png b/assets/images/graphql/logo.png new file mode 100644 index 000000000..8e3159a0b Binary files /dev/null and b/assets/images/graphql/logo.png differ diff --git a/assets/images/multi-channel-capabilities-0.png b/assets/images/multi-channel-capabilities-0.png new file mode 100644 index 000000000..ed091b1bd Binary files /dev/null and b/assets/images/multi-channel-capabilities-0.png differ diff --git a/assets/images/multi-channel-capabilities-1.png b/assets/images/multi-channel-capabilities-1.png new file mode 100644 index 000000000..e0fb495c2 Binary files /dev/null and b/assets/images/multi-channel-capabilities-1.png differ diff --git a/assets/images/multi-channel-capabilities-2.png b/assets/images/multi-channel-capabilities-2.png new file mode 100644 index 000000000..4ecc798c4 Binary files /dev/null and b/assets/images/multi-channel-capabilities-2.png differ diff --git a/assets/images/multi-currency-add-currency.png b/assets/images/multi-currency-add-currency.png new file mode 100644 index 000000000..4bdb8d0a4 Binary files /dev/null and b/assets/images/multi-currency-add-currency.png differ diff --git a/assets/images/multi-currency-admin-orders.png b/assets/images/multi-currency-admin-orders.png new file mode 100644 index 000000000..756bbe876 Binary files /dev/null and b/assets/images/multi-currency-admin-orders.png differ diff --git a/assets/images/multi-currency-currencies-list.png b/assets/images/multi-currency-currencies-list.png new file mode 100644 index 000000000..6e73f08c5 Binary files /dev/null and b/assets/images/multi-currency-currencies-list.png differ diff --git a/assets/images/multi-currency-currency-display.png b/assets/images/multi-currency-currency-display.png new file mode 100644 index 000000000..f5c5cb7cf Binary files /dev/null and b/assets/images/multi-currency-currency-display.png differ diff --git a/assets/images/multi-currency-display-currency.png b/assets/images/multi-currency-display-currency.png new file mode 100644 index 000000000..bdea21825 Binary files /dev/null and b/assets/images/multi-currency-display-currency.png differ diff --git a/assets/images/multi-currency-gift-cerfiticates.png b/assets/images/multi-currency-gift-cerfiticates.png new file mode 100644 index 000000000..a2f9403e6 Binary files /dev/null and b/assets/images/multi-currency-gift-cerfiticates.png differ diff --git a/assets/images/multi-currency-invoice.png b/assets/images/multi-currency-invoice.png new file mode 100644 index 000000000..332fb127e Binary files /dev/null and b/assets/images/multi-currency-invoice.png differ diff --git a/assets/images/multi-currency-order-summary.png b/assets/images/multi-currency-order-summary.png new file mode 100644 index 000000000..cf9975d79 Binary files /dev/null and b/assets/images/multi-currency-order-summary.png differ diff --git a/assets/images/multi-currency-order-summary2.png b/assets/images/multi-currency-order-summary2.png new file mode 100644 index 000000000..cf9975d79 Binary files /dev/null and b/assets/images/multi-currency-order-summary2.png differ diff --git a/assets/images/multi-currency-orders.png b/assets/images/multi-currency-orders.png new file mode 100644 index 000000000..ccecdf730 Binary files /dev/null and b/assets/images/multi-currency-orders.png differ diff --git a/assets/images/multi-currency-price-overrides.png b/assets/images/multi-currency-price-overrides.png new file mode 100644 index 000000000..51fcf927f Binary files /dev/null and b/assets/images/multi-currency-price-overrides.png differ diff --git a/assets/images/multi-currency-transactional-currency.png b/assets/images/multi-currency-transactional-currency.png new file mode 100644 index 000000000..bdea21825 Binary files /dev/null and b/assets/images/multi-currency-transactional-currency.png differ diff --git a/assets/images/multi-currency-try-it-now.png b/assets/images/multi-currency-try-it-now.png new file mode 100644 index 000000000..2b02bf54f Binary files /dev/null and b/assets/images/multi-currency-try-it-now.png differ diff --git a/assets/images/multi_currency_cart_level_discount_one.png b/assets/images/multi_currency_cart_level_discount_one.png new file mode 100644 index 000000000..a341fd6db Binary files /dev/null and b/assets/images/multi_currency_cart_level_discount_one.png differ diff --git a/assets/images/new_customer.png b/assets/images/new_customer.png new file mode 100644 index 000000000..59fecead6 Binary files /dev/null and b/assets/images/new_customer.png differ diff --git a/assets/images/nextjs-commerce-01.png b/assets/images/nextjs-commerce-01.png new file mode 100644 index 000000000..7cd9a5f3b Binary files /dev/null and b/assets/images/nextjs-commerce-01.png differ diff --git a/assets/images/nextjs-commerce-02.png b/assets/images/nextjs-commerce-02.png new file mode 100644 index 000000000..3b57c5b29 Binary files /dev/null and b/assets/images/nextjs-commerce-02.png differ diff --git a/assets/images/nextjs-commerce-03.png b/assets/images/nextjs-commerce-03.png new file mode 100644 index 000000000..c7b307e03 Binary files /dev/null and b/assets/images/nextjs-commerce-03.png differ diff --git a/assets/images/nextjs-commerce-04.png b/assets/images/nextjs-commerce-04.png new file mode 100644 index 000000000..e60534282 Binary files /dev/null and b/assets/images/nextjs-commerce-04.png differ diff --git a/assets/images/nextjs-commerce-05.png b/assets/images/nextjs-commerce-05.png new file mode 100644 index 000000000..f88c3ca7e Binary files /dev/null and b/assets/images/nextjs-commerce-05.png differ diff --git a/assets/images/nextjs-commerce-06.png b/assets/images/nextjs-commerce-06.png new file mode 100644 index 000000000..a9f3d2093 Binary files /dev/null and b/assets/images/nextjs-commerce-06.png differ diff --git a/assets/images/nextjs-commerce-07.png b/assets/images/nextjs-commerce-07.png new file mode 100644 index 000000000..3c3ccbf4d Binary files /dev/null and b/assets/images/nextjs-commerce-07.png differ diff --git a/assets/images/nextjs-commerce-08.png b/assets/images/nextjs-commerce-08.png new file mode 100644 index 000000000..3d2283e38 Binary files /dev/null and b/assets/images/nextjs-commerce-08.png differ diff --git a/assets/images/nextjs-commerce-09.png b/assets/images/nextjs-commerce-09.png new file mode 100644 index 000000000..2e1be6706 Binary files /dev/null and b/assets/images/nextjs-commerce-09.png differ diff --git a/assets/images/nextjs-commerce-10.png b/assets/images/nextjs-commerce-10.png new file mode 100644 index 000000000..0c64093d4 Binary files /dev/null and b/assets/images/nextjs-commerce-10.png differ diff --git a/assets/images/nextjs-commerce-11.png b/assets/images/nextjs-commerce-11.png new file mode 100644 index 000000000..774850cc4 Binary files /dev/null and b/assets/images/nextjs-commerce-11.png differ diff --git a/assets/images/nextjs-commerce-12.png b/assets/images/nextjs-commerce-12.png new file mode 100644 index 000000000..d33d76df8 Binary files /dev/null and b/assets/images/nextjs-commerce-12.png differ diff --git a/assets/images/nextjs-commerce-13.png b/assets/images/nextjs-commerce-13.png new file mode 100644 index 000000000..0896007fe Binary files /dev/null and b/assets/images/nextjs-commerce-13.png differ diff --git a/assets/images/nextjs-commerce-14.png b/assets/images/nextjs-commerce-14.png new file mode 100644 index 000000000..a0ade5c96 Binary files /dev/null and b/assets/images/nextjs-commerce-14.png differ diff --git a/assets/images/nextjs-commerce-15.png b/assets/images/nextjs-commerce-15.png new file mode 100644 index 000000000..35c3ce8d1 Binary files /dev/null and b/assets/images/nextjs-commerce-15.png differ diff --git a/assets/images/order-confirmation-page.png b/assets/images/order-confirmation-page.png new file mode 100644 index 000000000..5f87d8c6c Binary files /dev/null and b/assets/images/order-confirmation-page.png differ diff --git a/assets/images/performance-example-1.png b/assets/images/performance-example-1.png new file mode 100644 index 000000000..714189a51 Binary files /dev/null and b/assets/images/performance-example-1.png differ diff --git a/assets/images/performance-example-2.png b/assets/images/performance-example-2.png new file mode 100644 index 000000000..d1e11d55c Binary files /dev/null and b/assets/images/performance-example-2.png differ diff --git a/assets/images/performance-example-3.png b/assets/images/performance-example-3.png new file mode 100644 index 000000000..81103a12b Binary files /dev/null and b/assets/images/performance-example-3.png differ diff --git a/assets/images/product-widget-01.png b/assets/images/product-widget-01.png new file mode 100644 index 000000000..d027ff59c Binary files /dev/null and b/assets/images/product-widget-01.png differ diff --git a/assets/images/product-widget-02.png b/assets/images/product-widget-02.png new file mode 100644 index 000000000..8b9553523 Binary files /dev/null and b/assets/images/product-widget-02.png differ diff --git a/assets/images/promotions_beta/merchant_view_control_panel.png b/assets/images/promotions_beta/merchant_view_control_panel.png new file mode 100644 index 000000000..61b78b498 Binary files /dev/null and b/assets/images/promotions_beta/merchant_view_control_panel.png differ diff --git a/assets/images/promotions_beta/order_level_discount.png b/assets/images/promotions_beta/order_level_discount.png new file mode 100644 index 000000000..25fcf443c Binary files /dev/null and b/assets/images/promotions_beta/order_level_discount.png differ diff --git a/assets/images/promotions_beta/product_level_discount.png b/assets/images/promotions_beta/product_level_discount.png new file mode 100644 index 000000000..4ca3ba73e Binary files /dev/null and b/assets/images/promotions_beta/product_level_discount.png differ diff --git a/assets/images/promotions_beta/promotions_set_free_item_false.png b/assets/images/promotions_beta/promotions_set_free_item_false.png new file mode 100644 index 000000000..8e87f1d0f Binary files /dev/null and b/assets/images/promotions_beta/promotions_set_free_item_false.png differ diff --git a/assets/images/promotions_beta/promotions_set_free_item_true.png b/assets/images/promotions_beta/promotions_set_free_item_true.png new file mode 100644 index 000000000..e5bbfcca7 Binary files /dev/null and b/assets/images/promotions_beta/promotions_set_free_item_true.png differ diff --git a/assets/images/request-runner.svg b/assets/images/request-runner.svg new file mode 100644 index 000000000..45f3773ea --- /dev/null +++ b/assets/images/request-runner.svg @@ -0,0 +1,9 @@ + + +► Open in Request Runner \ No newline at end of file diff --git a/assets/images/sale_price_catalog.png b/assets/images/sale_price_catalog.png new file mode 100644 index 000000000..1be413624 Binary files /dev/null and b/assets/images/sale_price_catalog.png differ diff --git a/assets/images/sale_price_defined_catalog.png b/assets/images/sale_price_defined_catalog.png new file mode 100644 index 000000000..f47dae918 Binary files /dev/null and b/assets/images/sale_price_defined_catalog.png differ diff --git a/assets/images/shipping-provider-multi-carrier-ui.png b/assets/images/shipping-provider-multi-carrier-ui.png new file mode 100644 index 000000000..ebb8b0f20 Binary files /dev/null and b/assets/images/shipping-provider-multi-carrier-ui.png differ diff --git a/assets/images/shipping-provider-single-carrier-ui.png b/assets/images/shipping-provider-single-carrier-ui.png new file mode 100644 index 000000000..8d8122e38 Binary files /dev/null and b/assets/images/shipping-provider-single-carrier-ui.png differ diff --git a/assets/images/stored-credit-card-management01.png b/assets/images/stored-credit-card-management01.png new file mode 100644 index 000000000..c8bae9b33 Binary files /dev/null and b/assets/images/stored-credit-card-management01.png differ diff --git a/assets/images/stored-credit-card-management02.png b/assets/images/stored-credit-card-management02.png new file mode 100644 index 000000000..abb6713ae Binary files /dev/null and b/assets/images/stored-credit-card-management02.png differ diff --git a/assets/images/stored-credit-card-management03.png b/assets/images/stored-credit-card-management03.png new file mode 100644 index 000000000..42ec25199 Binary files /dev/null and b/assets/images/stored-credit-card-management03.png differ diff --git a/assets/images/widget-versioning-01.png b/assets/images/widget-versioning-01.png new file mode 100644 index 000000000..b096ef464 Binary files /dev/null and b/assets/images/widget-versioning-01.png differ diff --git a/assets/images/widget-versioning-02.png b/assets/images/widget-versioning-02.png new file mode 100644 index 000000000..af49ceeb0 Binary files /dev/null and b/assets/images/widget-versioning-02.png differ diff --git a/assets/images/widget-versioning-03.png b/assets/images/widget-versioning-03.png new file mode 100644 index 000000000..dc444ae4f Binary files /dev/null and b/assets/images/widget-versioning-03.png differ diff --git a/assets/images/widgets-code-samples-01.png b/assets/images/widgets-code-samples-01.png new file mode 100644 index 000000000..a4d27f0cf Binary files /dev/null and b/assets/images/widgets-code-samples-01.png differ diff --git a/assets/images/widgets-code-samples-02.png b/assets/images/widgets-code-samples-02.png new file mode 100644 index 000000000..0059189d1 Binary files /dev/null and b/assets/images/widgets-code-samples-02.png differ diff --git a/assets/images/widgets-code-samples-03.png b/assets/images/widgets-code-samples-03.png new file mode 100644 index 000000000..8210d77d3 Binary files /dev/null and b/assets/images/widgets-code-samples-03.png differ diff --git a/assets/images/widgets-code-samples-04.png b/assets/images/widgets-code-samples-04.png new file mode 100644 index 000000000..685627bea Binary files /dev/null and b/assets/images/widgets-code-samples-04.png differ diff --git a/assets/images/widgets-code-samples-05.png b/assets/images/widgets-code-samples-05.png new file mode 100644 index 000000000..551d9aa5f Binary files /dev/null and b/assets/images/widgets-code-samples-05.png differ diff --git a/assets/images/widgets-custom-template-01.png b/assets/images/widgets-custom-template-01.png new file mode 100644 index 000000000..e0edfc143 Binary files /dev/null and b/assets/images/widgets-custom-template-01.png differ diff --git a/assets/images/widgets-overview-01.png b/assets/images/widgets-overview-01.png new file mode 100644 index 000000000..822016e87 Binary files /dev/null and b/assets/images/widgets-overview-01.png differ diff --git a/assets/images/widgets-overview-02.png b/assets/images/widgets-overview-02.png new file mode 100644 index 000000000..09ab14b08 Binary files /dev/null and b/assets/images/widgets-overview-02.png differ diff --git a/assets/images/widgets-overview-03.png b/assets/images/widgets-overview-03.png new file mode 100644 index 000000000..8bab5cfb7 Binary files /dev/null and b/assets/images/widgets-overview-03.png differ diff --git a/assets/images/widgets-tutorial-01.gif b/assets/images/widgets-tutorial-01.gif new file mode 100644 index 000000000..a742929ca Binary files /dev/null and b/assets/images/widgets-tutorial-01.gif differ diff --git a/assets/json/checkout-en.json b/assets/json/checkout-en.json new file mode 100644 index 000000000..5ccb8632e --- /dev/null +++ b/assets/json/checkout-en.json @@ -0,0 +1,344 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Address", + "address_line_1_required_error": "Address is required", + "address_line_2_label": "Apartment/Suite/Building", + "address_line_2_required_error": "Apartment/Suite/Building is required", + "address_not_recognized_heading": "We did not recognize your address", + "city_label": "City", + "city_required_error": "City is required", + "company_name_label": "Company Name", + "company_name_required_error": "Company is required", + "confirm_address_action": "Proceed with current address", + "confirm_address_text": "We could not find a match for the address you entered. Please confirm the address.", + "country_label": "Country", + "country_required_error": "Country is required", + "custom_required_error": "{label} is required", + "custom_min_error": "{label} should be bigger than {min}", + "custom_max_error": "{label} should be smaller than {max}", + "custom_valid_error": "{label} is not valid", + "edit_address_action": "Edit address", + "enter_address_action": "Enter a new address", + "first_name_label": "First Name", + "first_name_required_error": "First Name is required", + "last_name_label": "Last Name", + "last_name_required_error": "Last Name is required", + "phone_number_label": "Phone Number", + "phone_number_required_error": "Phone Number is required", + "postal_code_label": "Postal Code", + "postal_code_required_error": "Postal Code is required", + "save_in_addressbook": "Save this address in my address book.", + "select_country_action": "Select a country", + "select_state_action": "Select a state", + "state_label": "State/Province", + "state_required_error": "State/Province is required", + "select": "Select", + "select_all": "All", + "select_none": "None" + }, + "billing": { + "billing_address_heading": "Billing Address", + "billing_heading": "Billing", + "save_billing_address_error": "An error occurred while saving the billing address to your price quote. Please try again.", + "billing_address_amazon": "Same as the Billing address set by you in your Amazon account.", + "billing_address_amazonpay": "Managed by Amazon Pay", + "use_shipping_address_label": "My billing address is the same as my shipping address." + }, + "cart": { + "billed_amount_text": "*You will be charged and invoiced {total} ({code}) for this order.", + "based_on_currency_text": "Based on {total} {code}", + "cart_heading": "Order Summary", + "digital_item_text": "Digital Item", + "discount_text": "Discount", + "downloads_action": "Go to Downloads", + "edit_cart_action": "Edit Cart", + "estimated_total_text": "Estimated Total", + "free_text": "Free", + "gift_certificate_text": "Gift Certificate", + "handling_text": "Handling", + "item_count_text": "{count, plural, one{1 Item} other{# Items} }", + "print_action": "Print", + "remaining_text": "Remaining", + "remove_action": "remove", + "see_all_action": "See All", + "see_less_action": "See Less", + "shipping_text": "Shipping", + "show_details_action": "Show Details", + "store_credit_text": "Store Credit", + "subtotal_text": "Subtotal", + "taxes_text": "Taxes", + "total_text": "Total", + "empty_cart_message": "Your cart is empty, you are being redirected. Please click here if your browser does not redirect you." + }, + "common": { + "cancel_action": "Cancel", + "close_action": "Close", + "continue_action": "Continue", + "edit_action": "Edit", + "delete_action": "Delete", + "error_heading": "Something's gone wrong", + "leave_warning": "Are you sure you want to leave? Data you have entered may not be saved.", + "loading_text": "Loading", + "ok_action": "Ok", + "error_code": "Error code:", + "request_id": "Request ID:", + "optional_text": "(Optional)", + "unavailable_error": "Checkout is temporarily unavailable. Please try again later.", + "unavailable_heading": "Checkout is temporarily unavailable", + "unstable_network_error": "It looks like the server is taking too long to respond, this can be caused by either poor connectivity or an error with our servers. Please try again in a while.", + "order_loading_error": "There was an error loading your order. Please try again.", + "order_fatal_error_heading": "There was an error placing your order", + "order_fatal_error_extra": "Please choose another payment method or contact us for further assistance.", + "go_back": "Go Back", + "show_more": "Show more" + }, + "customer": { + "checkout_as_guest_text": "Checking out as a Guest? You'll be able to save your details to create an account with us later.", + "continue_as_guest_action": "Continue as guest", + "create_account_action": "Create Account", + "create_account_error": "An error occurred while creating your account. Please try again.", + "create_account_requirements_error_heading": "Password does not match requirements", + "create_account_success": "Your account has been created!", + "create_account_text": "Create an account for a faster checkout in the future", + "create_account_to_continue_text": "Don’t have an account? Create an account to continue.", + "guest_could_login": "Looks like you have an account. Sign in with {email} for a faster checkout.", + "guest_must_login": "Looks like you have an account. Please sign in to proceed with {email}, or use another email.", + "guest_temporary_disabled": "Guest checkout is temporarily disabled. Please sign in or create an account to continue.", + "customer_heading": "Customer", + "email_invalid_error": "Email address must be valid", + "email_label": "Email Address", + "email_required_error": "Email address is required", + "forgot_password_action": "Forgot password?", + "guest_customer_text": "Guest Customer", + "guest_subscribe_to_newsletter_text": "Subscribe to our newsletter.", + "guest_marketing_consent": "I would like to receive updates and offers.", + "login_action": "Sign in now", + "login_text": "Already have an account?", + "guest_could_login_change_email": "Not {email}? Change email.", + "password_confirmation_error": "Passwords do not match", + "password_confirmation_label": "Confirm Password", + "password_confirmation_required_error": "This field is required", + "password_label": "Password", + "password_letter_required_error": "Password needs to contain a letter", + "password_minimum_character_label": "character minimum, case sensitive", + "password_number_required_error": "Password needs to contain a number", + "password_over_maximum_length_error": "Password is too long", + "password_required_error": "Password is required", + "password_under_minimum_length_error": "Password is too short", + "reset_password_before_login_error": "Sign-in is currently unavailable. You will receive an e-mail in the next 5 minutes with instructions for resetting your password. If you don't receive this e-mail, please check your junk mail folder or contact us for further assistance.", + "returning_customer_text": "Returning Customer", + "sign_in_action": "Sign In", + "sign_in_error": "The email or password you entered is not valid.", + "sign_in_throttled_error": "Due to excessive login attempts, please wait 10 seconds before attempting to log in again.", + "sign_out_action": "Sign Out", + "sign_out_error": "An error occurred while signing out. Please try again.", + "subscribe_to_newsletter_text": "Yes, I'd like to receive updates." + }, + "login_email": { + "error_server": "We couldn't send you a sign-in link. Please try again.", + "error_not_found": "The entered email is not associated to an account. Please try with a different email.", + "sent_header": "Check your inbox", + "sent_text": "We’ve sent an email to {email} that contains a sign-in link. This will expire in {minutes} minutes - If you don’t see it in your inbox, check your junk folder.", + "text": "Enter the email address associated to your account. We will send you a sign-in link.", + "header": "Enter your email address", + "header_with_email": "Confirm your email address", + "link": "Send me a sign-in link instead.", + "use_another_email": "Use another email", + "send": "Send", + "error_temporary_disabled": "Sign-in link functionality is temporary unavailable. Please sign in by entering your password.", + "resend_link": "Didn't get the email? Resend the link", + "use_password_link": " or sign in using your password instead." + }, + "embedded_checkout": { + "unsupported_error": "The following payment methods are not supported by Embedded Checkout: {methods}. Please contact us for assistance." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Pay over time", + "affirm_body_text": "You will be redirected to Affirm to securely complete your purchase. Just fill out a few pieces of basic information and get a real-time decision. Checking your eligibility won't affect your credit score.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Checkout with Afterpay", + "amazon_continue_action": "Continue with Amazon", + "amazonpay_continue_action": "Continue with Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continue", + "bluesnap_v2_continue_action": "Continue", + "bolt_continue_action": "Continue with Bolt", + "braintreevisacheckout_continue_action": "Continue with Visa Checkout", + "ccavenuemars_description_text": "Checkout with CCAvenue", + "chasepay_continue_action": "Continue with Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Edit card", + "chasepay_logout": "Log out Chase Pay", + "chasepay_fail_load": "Chase Pay failed to load", + "credit_card_text": "Credit card", + "credit_card_customer_code_label": "Customer Code", + "credit_card_cvv_help_text": "For VISA and Mastercard, the CVV is a three-digit code printed on the back. For American Express it is the four-digit code printed on the front. The CVV is a security measure to ensure that you are in possession of the card.", + "credit_card_cvv_invalid_error": "CVV must be valid", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "CVV is required", + "credit_card_expiration_invalid_error": "Expiration date must be a valid future date in MM / YY format", + "credit_card_expiration_label": "Expiration", + "credit_card_expiration_date_label": "Expiration Date", + "credit_card_expiration_required_error": "Expiration Date is required", + "credit_card_expiration_placeholder_text": "MM / YY", + "credit_card_name_label": "Name on Card", + "credit_card_name_required_error": "Full name is required", + "credit_card_number_invalid_error": "Credit Card Number must be valid", + "credit_card_number_label": "Credit Card Number", + "credit_card_number_last_four": "Enter card number for {cardType} ending in {lastFour}", + "credit_card_number_required_error": "Credit Card Number is required", + "credit_card_number_mismatch_error": "The card number entered does not match the card stored in your account", + "google_pay_name_text": "Google Pay", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "orbital_continue_action": "Place Order", + "orbital_description_text": "Pay using your ChasePay Account", + "payment_cancelled": "Payment was cancelled", + "payment_error": "An error occurred while processing your payment. Please try again.", + "payment_error_heading": "Payment Failed", + "payment_heading": "Payment", + "payment_invalid_error_heading": "Payment Unavailable", + "payment_method_disabled_error": "The selected payment method is no longer valid. Click OK to see the most up-to-date payment methods.", + "payment_method_error": "Response from payment provider: {message}", + "payment_method_invalid_error": "There's a problem processing your payment. Please contact us for assistance or choose another payment method.", + "payment_method_label": "Payment Method", + "payment_method_unavailable_error": "This payment provider is temporarily unavailable. Please try again later.", + "payment_not_required_text": "Payment is not required for this order.", + "paypal_continue_action": "Continue with PayPal", + "paypal_credit_continue_action": "Continue with PayPal Credit", + "paypal_credit_description_text": "Buy Now, Pay Over Time", + "paypal_description_text": "Pay using your PayPal account", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "PayPal Credit", + "place_order_action": "Place Order", + "place_order_error": "There was an error placing your order. Please contact us.", + "place_order_error_heading": "Failed to place order", + "postal_code_label": "Postal Code", + "instrument_text": "Stored credit cards", + "instrument_add_card_action": "Use a different card", + "instrument_default_ending_in_text": "Card ending in {endingIn}", + "instrument_ending_in_text": "{cardTitle} ending in {endingIn}", + "instrument_expired_text": "Expired {expiryDate}", + "instrument_expires_text": "Expires {expiryDate}", + "instrument_manage_button": "Manage", + "instrument_manage_modal_confirmation_action": "Yes, delete", + "instrument_manage_modal_confirmation_label": "Are you sure you want to delete this stored payment method?", + "instrument_manage_modal_title_text": "Manage stored payment methods", + "instrument_manage_modal_empty_text": "You do not have any stored payment methods.", + "instrument_manage_table_header_ending_in_text": "Ending in", + "instrument_manage_table_header_expiry_date_text": "Expiry date", + "instrument_manage_table_header_payment_method_text": "Payment method", + "instrument_manage_delete_server_error": "There was an error when attempting to delete that stored payment method, please try again.", + "instrument_manage_delete_auth_error": "There was a problem authorizing your request. Please try signing in again", + "instrument_manage_delete_client_error": "There was an error when attempting to delete the stored payment method: payment method no longer exists or cannot be deleted.", + "instrument_save_payment_method_label": "Save this card for future transactions", + "instrument_save_as_default_payment_method_label": "Use this card as the default payment method for future transactions", + "account_instrument_add_action": "Use a different account", + "account_instrument_save_payment_method_label": "Save this account for future transactions", + "account_instrument_save_as_default_payment_method_label": "Use this account as the default payment method for future transactions", + "account_instrument_text": "Stored accounts", + "account_instrument_new_shipping_address": "We noticed this is a new shipping address.

For security reasons, you will need to re-link your PayPal account when shipping to an address for the first time or if the shipping address was edited recently.

", + "instrument_trusted_shipping_address_text": "This additional security step is applied to your card when shipping to an address for the first time or if the shipping address was edited recently.", + "instrument_trusted_shipping_address_title_text": "Please re-enter your card number to authorize this transaction.", + "sezzle_display_name_text": "Pay Later. 0% Interest.", + "stripe_sepa_mandate_disclaimer": "By providing your IBAN and confirming this payment, you authorise (A) {storeUrl} and Stripe, our payment service provider, to send instructions to your bank to debit your account and (B) your bank to debit your account in accordance with those instructions. You are entitled to a refund from your bank under the terms and conditions of your agreement with your bank. A refund must be claimed within eight weeks starting from the date on which your account was debited.", + "vco_name_text": "Visa Checkout", + "visa_checkout_continue_action": "Continue with Visa Checkout", + "zip_continue_action": "Continue with Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Own it now, pay later" + }, + "redeemable": { + "applied_text": "Applied", + "apply_action": "Apply", + "apply_store_credit_after_action": "store credit to order", + "apply_store_credit_before_action": "Apply", + "code_invalid_error": "The gift certificate or coupon code is invalid", + "code_label": "Gift Certificate or Coupon Code", + "code_required_error": "Please enter a gift certificate or coupon code", + "coupon_location_error": "Your shipping address doesn't meet the location requirements for the coupon code you entered.", + "coupon_min_order_total": "Your order does not meet the minimum total for this coupon code to be applied.", + "coupon_text": "Coupon", + "gift_certificate_remaining_text": "Remaining", + "gift_certificate_text": "Gift Certificate", + "remove_action": "Remove", + "store_credit_available_text": "Your account currently has {storeCredit} total store credit available", + "toggle_action": "Coupon/Gift Certificate" + }, + "remote": { + "browser_unsupported": "The selected payment method requires a different web browser. Please choose another payment method.", + "connection_error": "Connection to remote checkout refused, please try later.", + "continue_with_text": "Or continue with", + "payment_method_error": "There was an error retrieving your remote payment method. Please try again.", + "select_different_card_action": "Select a different card", + "session_error": "Your remote session has expired. Please log in again.", + "shipping_address_error": "There was an error retrieving your remote shipping address. Please try again.", + "sign_in_action": "Sign in to {providerName}", + "sign_out_action": "Sign out of {providerName}", + "sign_out_after_action": "to view other payment methods", + "sign_in_required_error": "Remote sign in required before payment", + "sign_out_before_action": "" + }, + "shipping": { + "cart_change_error": "An update to your shopping cart has been detected and your available shipping costs have been updated. Please re-select a shipping method to continue.", + "enter_shipping_address_text": "Please enter a shipping address in order to see shipping quotes", + "order_comment_label": "Order Comments", + "assign_item_error": "An error occurred while assigning item to address. Please try again", + "assign_item_invalid_address_error_heading": "Invalid Address", + "assign_item_invalid_address_error": "The selected address is not valid. Please go to your account page and update it.", + "unassign_item_error": "An error occurred while unassigning item to address.", + "save_shipping_address_error": "An error occurred while saving the shipping address to your price quote. Please try again.", + "save_shipping_option_error": "An error occurred while saving the shipping quote to your order. Please try again.", + "select_shipping_address_text": "Please select a shipping address in order to see shipping quotes", + "shipping_address_heading": "Shipping Address", + "multishipping_address_heading": "Choose where to ship each item", + "multishipping_address_heading_guest": "Please sign in first", + "multishipping_guest_intro": "To ship your items to multiple addresses you need to", + "multishipping_guest_sign_in": "sign in to your account", + "multishipping_guest_create": "or create an account prior to proceeding.", + "ship_to_multi": "Ship to multiple addresses", + "ship_to_single": "Ship to a single address", + "shipping_heading": "Shipping", + "shipping_method_label": "Shipping Method", + "shipping_option_expired_error": "The shipping price you were quoted is no longer valid. Click OK to see the most up-to-date shipping prices.", + "shipping_option_expired_heading": "Your shipping price has been updated", + "view_shipping_options_action": "See Other Options" + }, + "social": { + "share_action": "Share", + "share_heading": "Tell your friends about your purchase!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Please click here to verify yourself as human before proceeding." + }, + "privacy_policy": { + "required_error": "Please agree to the Privacy Policy.", + "label": "Yes, I agree with the privacy policy.", + "heading": "Privacy Policy" + }, + "terms_and_conditions": { + "agreement_required_error": "Please agree to the terms and conditions", + "agreement_text": "Yes, I agree with the above terms and conditions.", + "agreement_with_link_text": "Yes, I agree with the terms and conditions.", + "terms_and_conditions_heading": "Terms and Conditions" + }, + "order_confirmation": { + "order_number_text": "Your order number is {orderNumber}", + "order_pending_review_text": "Your order was sent to us but is currently awaiting payment. Once we receive the payment for your order, it will be completed. If you've already provided payment details then we will process your order manually and send you an email when it's completed.", + "order_pending_status_text": "We've received your order and are processing your payment. Once the payment is verified, your order will be completed. We will send you an email when it's completed. Please note, this process may take a few minutes depending on the processing times of your chosen method. If you have any questions about your purchase, email us at {supportEmail}.", + "order_incomplete_status_text": "We’ve received your order and payment. Your order is now being processed by our system. Please note, processing may take a few minutes. If you have any questions about your purchase, email us at {supportEmail}.", + "order_with_downloadable_digital_items_text": "You can download your digital purchases by clicking the links on this page, or by logging into your account at any time. There is also a download link in your confirmation email, which should be arriving shortly.", + "order_with_support_number_text": "An email will be sent containing information about your purchase. If you have any questions about your purchase, email us at {supportEmail} or call us at {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Once we receive your payment, we’ll send a confirmation email with a link to download your digital purchases.", + "order_without_support_number_text": "An email will be sent containing information about your purchase. If you have any questions about your purchase, email us at {supportEmail}.", + "thank_you_customer_heading": "Thank you {name}!", + "thank_you_heading": "Thank you!", + "continue_shopping": "Continue Shopping »", + "order_status_update_facebook_messenger_heading": "Get instant updates of your order to Messenger", + "mandate_link_text": "{provider} Mandate" + } + } +} diff --git a/assets/json/da.json b/assets/json/da.json new file mode 100644 index 000000000..e33bdfd52 --- /dev/null +++ b/assets/json/da.json @@ -0,0 +1,487 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Adresse", + "address_line_1_required_error": "Adressen er påkrævet", + "address_line_2_label": "Lejlighed/Suite/Bygning", + "address_line_2_required_error": "Lejlighed/bygning er påkrævet", + "address_not_recognized_heading": "Vi kunne ikke genkende din adresse", + "consignment_address_updated_text": "Varen blev tildelt den nye adresse.", + "city_label": "By", + "city_required_error": "Byen er påkrævet", + "company_name_label": "Firmanavn", + "company_name_required_error": "Firma er påkrævet", + "confirm_address_action": "Fortsæt med den aktuelle adresse", + "confirm_address_text": "Vi kunne ikke finde et match til den adresse, du indtastede. Bekræft adressen.", + "country_label": "Land", + "country_required_error": "Landet er påkrævet", + "custom_required_error": "{label} er påkrævet", + "custom_min_error": "{label} skal være større end {min}", + "custom_max_error": "{label} skal være mindre end {max}", + "invalid_characters_error": "{label} indeholder ugyldige tegn", + "custom_valid_error": "{label} er ikke gyldig", + "edit_address_action": "Rediger adresse", + "enter_address_action": "Indtast en ny adresse", + "add_address_heading": "Tilføj adresse", + "save_address_action": "Gem adresse", + "first_name_label": "Fornavn", + "first_name_required_error": "Fornavnet er påkrævet", + "last_name_label": "Efternavn", + "last_name_required_error": "Efternavnet er påkrævet", + "phone_number_label": "Telefonnummer", + "phone_number_required_error": "Telefonnummeret er påkrævet", + "postal_code_label": "Postnummer", + "postal_code_required_error": "Postnummeret er påkrævet", + "save_in_addressbook": "Gem denne adresse i min adressebog.", + "select_country_action": "Vælg et land", + "select_state_action": "Vælg en stat", + "state_label": "Landsdel/kommune", + "state_required_error": "Stat/region er påkrævet", + "select": "Vælg", + "select_all": "Alle", + "select_none": "Ingen" + }, + "billing": { + "billing_address_heading": "Faktureringsadresse", + "billing_heading": "fakturering", + "save_billing_address_error": "Der opstod en fejl under lagring af faktureringsadressen i dit pristilbud. Prøv igen.", + "billing_address_amazon": "Den samme som den faktureringsadresse, du har angivet i din Amazon-konto.", + "billing_address_amazonpay": "Administreret af Amazon Pay", + "use_shipping_address_label": "Min faktureringsadresse er den samme som min leveringsadresse." + }, + "cart": { + "billed_amount_text": "* Du debiteres og faktureres {total} ({code}) for denne ordre.", + "based_on_currency_text": "Based on {total} {code}", + "cart_heading": "Ordreoversigt", + "digital_item_text": "Digital vare", + "discount_text": "Rabat", + "downloads_action": "Gå til downloads", + "edit_cart_action": "Rediger indkøbskurv", + "estimated_total_text": "Anslået samlet beløb", + "free_text": "Gratis", + "gift_certificate_text": "Gavekort", + "handling_text": "Håndtering", + "item_count_text": "{count, plural, one{1 vare} other{# varer} }", + "print_action": "Udskriv", + "remaining_text": "Resterende", + "remove_action": "Fjern", + "see_all_action": "Se alt", + "see_less_action": "Se mindre", + "shipping_text": "Forsendelse", + "gift_wrapping_text": "Gaveindpakning", + "show_details_action": "Vis detaljer", + "store_credit_text": "Butikskredit", + "subtotal_text": "Subtotal", + "taxes_text": "Moms", + "total_text": "I alt", + "empty_cart_message": "Din indkøbskurv er tom – du bliver omdirigeret. Klik her, hvis din browser ikke omdirigerer dig." + }, + "common": { + "cancel_action": "Annuller", + "close_action": "Luk", + "continue_action": "Fortsæt", + "edit_action": "Rediger", + "delete_action": "Slet", + "error_heading": "Noget gik galt", + "leave_warning": "Er du sikker på, at du vil afslutte? Data, du har indtastet, bliver muligvis ikke gemt.", + "loading_text": "Indlæser", + "ok_action": "OK", + "error_code": "Fejlkode:", + "request_id": "Anmodnings-ID:", + "optional_text": "(Valgfrit)", + "unavailable_error": "Betaling er midlertidigt utilgængelig. Prøv igen senere.", + "unavailable_heading": "Betaling er midlertidigt utilgængelig", + "unstable_network_error": "Det ser ud til, at serveren tager for lang tid at svare. Dette kan skyldes enten dårlig forbindelse eller en fejl med vores servere. Prøv igen lidt senere.", + "order_loading_error": "Der opstod en fejl under indlæsning af din ordre. Prøv igen.", + "order_fatal_error_heading": "Der opstod en fejl under afgivelsen af din ordre", + "order_fatal_error_extra": "Vælg en anden betalingsmetode, eller kontakt os for at få yderligere hjælp.", + "go_back": "Gå tilbage", + "show_more": "Vis flere" + }, + "customer": { + "checkout_as_guest_text": "Går du til kassen som gæst? Du vil kunne gemme dine oplysninger for at oprette en konto hos os senere.", + "continue_as_guest_action": "Fortsæt som gæst", + "create_account_action": "Opret konto", + "continue": "Fortsæt", + "set_password_action": "Gem adgangskode", + "required_error": "{label} er påkrævet", + "min_error": "{label} skal være større end {min}", + "max_error": "{label} skal være mindre end {max}", + "invalid_characters_error": "{label} indeholder ugyldige tegn", + "create_account_error": "Der opstod en fejl under oprettelse af din konto. Prøv igen.", + "create_address_error": "Der opstod dog en fejl under lagring af adressen i din adressebog.", + "create_account_requirements_error_heading": "Adgangskoden matcher ikke kravene", + "create_account_success": "Din konto er blevet oprettet.", + "set_password_success": "Din adgangskode er blevet gemt.", + "create_account_text": "Opret en konto for en hurtigere betaling i fremtiden", + "set_password_text": "Konfigurer en adgangskode for at betale hurtigere i fremtiden", + "account_created_text": "Der er oprettet en konto til dig, men du skal konfigurere en adgangskode for at logge på.", + "create_account_to_continue_text": "Har du ikke en konto? Opret en konto for at fortsætte.", + "guest_could_login": "Det ser ud til, at du har en konto. Log ind med {email} for en hurtigere betalingsoplevelse.", + "guest_must_login": "Det ser ud til, at du har en konto. Log på for at fortsætte med {email}, eller brug en anden e-mail.", + "guest_temporary_disabled": "Gæstebetaling er midlertidigt deaktiveret. Log på, eller opret en konto for at fortsætte.", + "customer_heading": "Kunde", + "email_invalid_error": "E-mailadressen skal være gyldig", + "email_label": "E-mailadresse", + "email_required_error": "E-mailadresse er påkrævet", + "forgot_password_action": "Har du glemt din adgangskode?", + "guest_customer_text": "Gæstekunde", + "guest_subscribe_to_newsletter_text": "Abonner på vores nyhedsbrev.", + "guest_marketing_consent": "Jeg vil gerne modtage opdateringer og tilbud.", + "login_action": "Log på nu", + "login_text": "Har du allerede en konto?", + "email_in_use_text": "Der er allerede en konto for {email}. Indtast en anden e-mailadresse, eller log på.", + "unknown_email_in_use_text": "Der er allerede en konto for den angivne e-mail. Indtast en anden e-mailadresse, eller log på.", + "guest_could_login_change_email": "Ikke {email}? Skift e-mail.", + "password_confirmation_error": "Adgangskoderne stemmer ikke overens", + "password_confirmation_label": "Bekræft adgangskode", + "password_confirmation_required_error": "Dette felt er påkrævet", + "password_label": "Adgangskode", + "password_letter_required_error": "Adgangskoden skal indeholde et bogstav", + "password_minimum_character_label": "minimum antal tegn, der skelnes mellem store og små bogstaver", + "password_number_required_error": "Adgangskoden skal indeholde et tal", + "password_over_maximum_length_error": "Adgangskoden er for lang", + "password_required_error": "Adgangskode er påkrævet", + "password_under_minimum_length_error": "Adgangskoden er for kort", + "reset_password_before_login_error": "Login er i øjeblikket ikke tilgængeligt. Du vil modtage en e-mail inden for de næste 5 minutter med vejledning til nulstilling af din adgangskode. Hvis du ikke modtager denne e-mail, bedes du tjekke din mappe med uønsket post eller kontakte os for at få mere hjælp.", + "returning_customer_text": "Tilbagevendende kunde", + "sign_in_action": "Log på", + "sign_in_error": "Den e-mail eller adgangskode, du indtastede, er ikke gyldig.", + "sign_in_throttled_error": "På grund af for mange loginforsøg skal du vente 10 sekunder, før du forsøger at logge ind igen.", + "sign_out_action": "Log af", + "sign_out_error": "Der opstod en fejl, da du forsøgte at logge af. Prøv igen.", + "subscribe_to_newsletter_text": "Ja, jeg vil gerne modtage opdateringer.", + "suggestion_text": "Det ser ud til, at du har en konto hos {provider}. For hurtig betaling skal du fortsætte med {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "Vi kunne ikke sende dig et link til logon. Prøv igen.", + "error_not_found": "Den indtastede e-mail er ikke knyttet til en konto. Prøv med en anden e-mail.", + "sent_header": "Tjek din indbakke", + "sent_text": "Vi har sendt en e-mail til {email}, der indeholder et link til logon. Dette udløber om {minutes} minutter. Hvis du ikke kan se det i din indbakke, skal du tjekke mappen Uønsket.", + "text": "Indtast den e-mailadresse, der er knyttet til din konto. Vi sender dig et link til logon.", + "header": "Indtast din e-mailadresse", + "header_with_email": "Bekræft din e-mailadresse", + "link": "Send mig et link til logon i stedet for.", + "use_another_email": "Brug en anden e-mailadresse", + "send": "Send", + "error_temporary_disabled": "Login-linkfunktionalitet er midlertidigt utilgængelig. Log ind ved at indtaste din adgangskode.", + "resend_link": "Fik du ikke mailen? Send linket igen,", + "use_password_link": " eller log på med din adgangskode i stedet." + }, + "embedded_checkout": { + "unsupported_error": "Følgende betalingsmetoder understøttes ikke af Embedded Checkout: {methods}. Kontakt os for at få hjælp." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Betal over tid", + "affirm_body_text": "Du vil blive omdirigeret til Affirm for at gennemføre dit køb på sikker vis. Du skal bare udfylde lidt grundlæggende oplysninger og få en beslutning i realtid. Det påvirker ikke din kreditværdighed, at vi kontrollerer din berettigelse.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Betal med Afterpay", + "amazon_continue_action": "Fortsæt med Amazon", + "amazonpay_continue_action": "Fortsæt med Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Fortsæt", + "bluesnap_v2_continue_action": "Fortsæt", + "bolt_benefit_1": "Køb hundredvis af mærker med et login uden adgangskode", + "bolt_benefit_2": "Gennemfør betalingen med gemte betalings- og forsendelsesoplysninger", + "bolt_benefit_3": "Drag fordel af PCI-kompatibel kontosikkerhed", + "bolt_checkbox_agreement": "Gem mine oplysninger, opret en Bolt-konto, og acceptér Bolts vilkår for brug og privatlivspolitik.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Fortsæt med Visa Checkout", + "ccavenuemars_description_text": "Betal med CCAvenue", + "chasepay_continue_action": "Fortsæt med Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Rediger kort", + "chasepay_logout": "Log ud af Chase Pay", + "chasepay_fail_load": "Chase Pay kunne ikke indlæses", + "checkoutcom_document_label_boleto": "CPF eller CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "Nationalt ID", + "checkoutcom_document_invalid_error_boleto": "CPF eller CNPJ skal være mellem 11 og 14 tegn", + "checkoutcom_document_invalid_error_oxxo": "CURP må højst indeholde 18 tegn", + "checkoutcom_document_invalid_error_qpay": "Nationalt ID må højst være på 32 tegn", + "checkoutcom_fawry_customer_mobile_invalid_error": "Mobilnummeret skal være gyldigt", + "checkoutcom_fawry_customer_mobile_label": "Mobilnummer", + "checkoutcom_fawry_customer_email_invalid_error": "E-mailadressen skal være gyldig", + "checkoutcom_fawry_customer_email_label": "E-mail", + "checkoutcom_sepa_creditor_title": "Kreditor", + "checkoutcom_sepa_creditor_id": "Kreditor-ID: {creditorId}", + "checkoutcom_sepa_debtor_title": "Debitor", + "checkoutcom_sepa_mandate_disclaimer": "Ved at acceptere denne betalingsaftale giver du {creditorName} tilladelse til at sende instruktioner til din bank om at debitere din konto, og din bank til at debitere din konto i overensstemmelse med disse instruktioner. Du er berettiget til en refusion fra din bank i henhold til betingelserne i din aftale med din bank. En refusion skal opkræves inden for 8 uger fra den dato, hvor din konto blev debiteret.", + "checkoutcom_sepa_payment_type": "Betalingstype: engangsbetaling (ikke-tilbagevendende)", + "clearpay_name_text": "Betal senere", + "credit_card_text": "Kreditkort", + "credit_card_customer_code_label": "Kundekode", + "credit_card_cvv_help_text": "For VISA og Mastercard er CVV en trecifret kode, der er trykt på bagsiden. For American Express er det den firecifrede kode, der er trykt på forsiden. CVV er en sikkerhedsforanstaltning for at sikre, at du er i besiddelse af kortet.", + "credit_card_cvv_invalid_error": "CVV skal være gyldigt", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "CVV er påkrævet", + "credit_card_expiration_invalid_error": "Udløbsdatoen skal være en gyldig fremtidig dato i MM/ÅÅ-format", + "credit_card_expiration_label": "Udløb", + "credit_card_expiration_date_label": "Udløbsdato", + "credit_card_expiration_required_error": "Udløbsdatoen er påkrævet", + "credit_card_expiration_placeholder_text": "MM/ÅÅ", + "credit_card_name_label": "Navn på kort", + "credit_card_name_required_error": "Det fulde navn er påkrævet.", + "credit_card_number_invalid_error": "Kreditkortnummeret skal være gyldigt", + "credit_card_number_label": "Kreditkortnummer", + "credit_card_number_last_four": "Indtast kortnummer for {cardType}, der ender på {lastFour}", + "credit_card_number_required_error": "Kreditkortnummeret er påkrævet", + "credit_card_number_mismatch_error": "Det indtastede kortnummer stemmer ikke overens med det kort, der er gemt på din konto", + "credit_debit_card_text": "Betalingskort", + "digitalriver_dropin_error": "Der opstod en fejl under behandlingen af din betaling. Prøv igen, eller kontakt os.", + "digitalriver_checkout_error": "Der var et problem med din betaling. Tjek dine oplysninger, og prøv igen, eller kontakt kundeservice", + "digitalriver_checkout_error_title": "Fejl under behandling af anmodningen.", + "digitalriver_display_name_text": "Vælg din betalingsmetode", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm kan ikke behandle din betaling for denne ordre. Vælg en anden betalingsmetode.", + "klarna_continue_action": "Fortsæt med Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Fortsæt med {methodName}", + "opy_widget_slogan": "Køb nu. Betal smartere.", + "opy_widget_info": "Du vil blive omdirigeret til {methodName}s websted for at fuldføre din ordre, når du klikker på \"Fortsæt med {methodName}\"", + "orbital_continue_action": "Afgiv ordre", + "orbital_description_text": "Betal med din ChasePay-konto", + "payment_cancelled": "Betalingen blev annulleret", + "payment_error": "Der opstod en fejl under behandlingen af din betaling. Prøv igen.", + "payment_error_heading": "Betalingen mislykkedes", + "payment_heading": "Betaling", + "payment_invalid_error_heading": "Betaling ikke tilgængelig", + "payment_method_disabled_error": "Den valgte betalingsmetode er ikke længere gyldig. Klik på OK for at se de mest opdaterede betalingsmetoder.", + "payment_method_error": "Svar fra betalingsudbyder: {message}", + "payment_method_invalid_error": "Der er et problem med at behandle din betaling. Kontakt os for at få hjælp, eller vælg en anden betalingsmetode.", + "payment_method_unavailable_error": "Denne betalingsudbyder er midlertidigt utilgængelig. Prøv igen senere.", + "payment_not_required_text": "Der kræves ikke betaling for denne ordre.", + "paypal_continue_action": "Fortsæt med PayPal", + "braintreevenmo_continue_action": "Fortsæt med Venmo", + "paypal_credit_continue_action": "Fortsæt med PayPal Credit", + "paypal_credit_description_text": "Køb nu, betal senere", + "paypal_description_text": "Betal med din PayPal-konto", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Betal senere", + "place_order_action": "Afgiv ordre", + "place_order_error": "Der opstod en fejl under afgivelsen af din ordre. Kontakt os.", + "place_order_error_heading": "Ordren kunne ikke afgives", + "postal_code_label": "Postnummer", + "ideal_bic_required": "Du skal vælge en udsteder for at afgive ordren", + "instrument_text": "Gemte kreditkort", + "instrument_add_card_action": "Brug et andet kort", + "instrument_default_ending_in_text": "Kort, der ender på {endingIn}", + "instrument_ending_in_text": "{cardTitle} slutter på {endingIn}", + "instrument_expired_text": "Udløb {expiryDate}", + "instrument_expires_text": "Udløber {expiryDate}", + "instrument_manage_button": "Administrer", + "instrument_manage_modal_confirmation_action": "Ja, slet", + "instrument_manage_modal_confirmation_label": "Er du sikker på, at du vil slette denne gemte betalingsmetode?", + "instrument_manage_modal_title_text": "Administrer gemte betalingsmetoder", + "instrument_manage_modal_empty_text": "Du har ingen gemte betalingsmetoder.", + "instrument_manage_table_header_ending_in_text": "Slutter på", + "instrument_manage_table_header_expiry_date_text": "Udløbsdato", + "instrument_manage_table_header_payment_method_text": "Betalingsmetode", + "instrument_manage_delete_server_error": "Der opstod en fejl under forsøget på at slette den gemte betalingsmetode. Prøv igen.", + "instrument_manage_delete_auth_error": "Der opstod et problem med at godkende din anmodning. Prøv at logge på igen", + "instrument_manage_delete_client_error": "Der opstod en fejl under forsøget på at slette den gemte betalingsmetode. Betalingsmetoden findes ikke længere eller kan ikke slettes.", + "instrument_save_payment_method_label": "Gem dette kort til fremtidige transaktioner", + "instrument_save_as_default_payment_method_label": "Brug dette kort som standardbetalingsmetode til fremtidige transaktioner", + "account_instrument_add_action": "Brug en anden konto", + "account_instrument_save_payment_method_label": "Gem denne konto til fremtidige transaktioner", + "account_instrument_save_as_default_payment_method_label": "Brug denne konto som standardbetalingsmetode for fremtidige transaktioner", + "account_instrument_text": "Gemte konti", + "account_instrument_new_shipping_address": "Vi har bemærket, at dette er en ny leveringsadresse.

Af sikkerhedsmæssige årsager skal du tilknytte din PayPal-konto igen, når du sender til en adresse for første gang, eller hvis forsendelsesadressen er blevet redigeret for nylig.

", + "instrument_trusted_shipping_address_text": "Dette ekstra sikkerhedstrin anvendes på dit kort, når du sender til en adresse for første gang, eller hvis leveringsadressen er blevet redigeret for nylig.", + "instrument_trusted_shipping_address_title_text": "Indtast dit kortnummer igen for at godkende denne transaktion.", + "quadpay_continue_action": "Fortsæt med Zip", + "quadpay_display_name_text": "Betal i 4 rater (Quadpay)", + "ppsdk_continue_action": "Fortsæt med {methodName}", + "select_your_bank": "Vælg din bank", + "sepa_account_number": "Kontonummer (IBAN)", + "sepa_account_number_required": "Du skal indtaste dit kontonummer (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "BIC skal være på 8 eller 11 tegn", + "sepa_mandate_required": "Du skal acceptere betalingsaftalen", + "sezzle_display_name_text": "Betal senere. 0 % rente.", + "stripe_sepa_display_name_text": "Sepa Direct Debit.", + "stripe_sepa_mandate_disclaimer": "Ved at tilvejebringe dit IBAN og bekræfte denne betaling, giver du (A) {storeUrl} og Stripe, vores betalingstjenesteudbyder, tilladelse til at sende instruktioner til din bank om at debitere din konto og (B) din bank tilladelse til at debitere din konto i overensstemmelse med de pågældende instruktioner . Du er berettiget til en refusion fra din bank i henhold til vilkårene og betingelserne i din aftale med din bank. Du skal gøre krav på en refusion inden for otte uger fra den dato, hvor din konto blev debiteret.", + "tax_provider_unavailable": "Moms kunne ikke beregnes. Prøv igen. Hvis det ikke lykkes, bedes du kontakte vores supportteam for at fuldføre betalingen.", + "vco_name_text": "Klik for at betale", + "visa_checkout_continue_action": "Fortsæt med Klik for at betale", + "zip_continue_action": "Fortsæt med Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Få det nu, betal senere", + "errors": { + "additional_action_required": "Fortsæt med yderligere handlinger.", + "authorization_expired": "Godkendelsen af denne transaktion er udløbet.", + "authorization_revoked": "Godkendelsen af denne transaktion er blevet tilbagekaldt.", + "call_issuer": "Der opstod et problem under behandlingen af dit kort. Kontakt din kortudsteder.", + "captured_transaction": "Betalingen for denne ordre er allerede foretaget.", + "card_declined": "Betalingen blev afvist. Prøv et andet kort.", + "card_error": "Dine kortoplysninger kunne ikke bekræftes. Dobbelttjek dem, og prøv igen.", + "card_replaced": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "connection_error": "Vi oplever problemer med at behandle din transaktion. Prøv igen senere.", + "duplicate_transaction": "Dette er en dublettransaktion. Kontakt os for at bekræfte din ordre. Forsøg ikke at betale igen.", + "expired_card": "Dit kort er udløbet. Prøv igen med et gyldigt kort.", + "gateway_error": "Noget gik galt på serveren. Prøv igen på et senere tidspunkt.", + "general_error": "Fejl under behandling af betalingsanmodningen.", + "hosted_form_error": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "incorrect_address": "Din faktureringsadresse kunne ikke bekræftes. Tjek dine faktureringsadresseoplysninger, og prøv igen.", + "incorrect_amount": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "incorrect_cvc": "Dine kortoplysninger kunne ikke bekræftes. Dobbelttjek dem, og prøv igen.", + "incorrect_number": "Dine kortoplysninger kunne ikke bekræftes. Dobbelttjek dem, og prøv igen.", + "incorrect_zip": "Din faktureringsadresse kunne ikke bekræftes. Tjek dine faktureringsadresseoplysninger, og prøv igen.", + "insufficient_funds": "Betalingen blev afvist. Kontakt din bank.", + "invalid_address": "Din faktureringsadresse kunne ikke bekræftes. Tjek dine faktureringsadresseoplysninger, og prøv igen.", + "invalid_amount": "Der opstod en fejl under behandlingen af din betaling. Prøv igen, eller kontakt os.", + "invalid_authorization_code": "Der opstod en fejl under behandlingen af din betaling. Prøv igen, eller kontakt os.", + "invalid_create_instrument_request": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "invalid_cvc": "Dine kortoplysninger kunne ikke bekræftes. Dobbelttjek dem, og prøv igen.", + "invalid_email_address": "Betalingen kunne ikke behandles, fordi der blev leveret en ugyldig e-mailadresse med transaktionen.", + "invalid_expiry_date": "Dine kortoplysninger kunne ikke bekræftes. Dobbelttjek dem, og prøv igen.", + "invalid_expiry_month": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "invalid_expiry_year": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "invalid_gateway": "Gatewayen er ugyldig.", + "invalid_gateway_options": "Gateway-indstillingerne er ugyldige.", + "invalid_instrument": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "invalid_issuer": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "invalid_number": "Dine kortoplysninger kunne ikke bekræftes. Dobbelttjek dem, og prøv igen.", + "invalid_payment_request": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "invalid_request_error": "Vi oplever problemer med at behandle din transaktion. Kontakt os, eller prøv igen senere.", + "invalid_user_authentication": "Der opstod en fejl under behandlingen af din betaling. Kontakt os.", + "invalid_zip": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "journal_error": "Noget gik galt på serveren. Prøv igen på et senere tidspunkt.", + "lost_or_stolen_card": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "missing_test_mode": "Anmodningen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "not_found": "Vi oplever problemer med at behandle din transaktion. Prøv igen senere.", + "payment_config_error": "Noget gik galt på serveren. Prøv igen på et senere tidspunkt.", + "payment_config_not_found": "Noget gik galt på serveren. Prøv igen på et senere tidspunkt.", + "pending_review": "Din transaktion blev godkendt, men tilbageholdes til gennemgang af sælgeren.", + "pickup_card": "Dit kort kan ikke bruges til at foretage denne betaling. Kontakt din kortudsteder, eller prøv at bruge et andet kort.", + "processing_error": "Vi oplever problemer med at behandle din transaktion. Prøv igen senere.", + "provider_configuration_error": "Forhandlerens betalingsudbyder er ikke konfigureret korrekt.", + "refund_timelimit_expired": "Fristen for at refundere denne transaktion er udløbet.", + "refunded_transaction": "Denne transaktion er allerede blevet refunderet.", + "request_timeout": "Din betaling kunne ikke behandles på grund af timeout. Prøv igen.", + "required_field": "Din betaling kunne ikke bekræftes. Tjek dine kortoplysninger, og prøv igen.", + "server_error": "Der opstod en fejl under behandlingen af din betaling, og din ordre kunne ikke gennemføres. Prøv igen.", + "store_instrument_failed": "Anmodningen kunne ikke behandles. Prøv igen.", + "stored_payment_instrument_not_found": "Det gemte betalingsmiddel kunne ikke findes. Prøv en anden betalingsmulighed.", + "three_d_secure_declined": "Der har været et problem med din betaling. Tjek dine betalingsoplysninger, eller kontakt din kortudsteder.", + "three_d_secure_failed": "Betalingen mislykkedes. Prøv igen, eller brug en anden betalingsmulighed.", + "three_d_secure_required": "Yderligere godkendelse er påkrævet for at behandle din betaling. Kontakt os.", + "token_error": "Vi oplever problemer med at behandle din transaktion. Prøv igen senere.", + "transaction_declined": "Din betaling blev afvist. Prøv igen.", + "transaction_rejected": "Betalingen blev afvist. Prøv igen.", + "unauthorized": "Vi oplever problemer med at behandle din transaktion. Prøv igen senere.", + "unsupported_currency": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "unsupported_instrument": "Dine kortoplysninger kunne ikke bekræftes. Dobbelttjek dem, og prøv igen.", + "unsupported_request": "Betalingen kunne ikke behandles, fordi der blev leveret ugyldige data med transaktionen.", + "user_authorization_error": "Der opstod en fejl under behandlingen af din betaling. Kontakt os.", + "vaulting_service_unavailable": "Opbevaringstjeneste er ikke tilgængelig i øjeblikket.", + "voided_transaction": "Din betaling kunne ikke behandles, fordi transaktionen allerede er blevet annulleret. Prøv igen, eller kontakt os." + } + }, + "redeemable": { + "applied_text": "Anvendt", + "apply_action": "Anvend", + "apply_store_credit_after_action": "butikskredit for at bestille", + "apply_store_credit_before_action": "Anvend", + "code_invalid_error": "Gavekortet eller kuponkoden er ugyldig", + "code_label": "Gavekort eller kuponkode", + "code_required_error": "Indtast et gavekort eller en kuponkode", + "coupon_location_error": "Din leveringsadresse opfylder ikke placeringskravene for den kuponkode, du har indtastet.", + "coupon_min_order_total": "Din ordre opfylder ikke minimumsbeløbet for, at denne kuponkode kan anvendes.", + "coupon_text": "Kupon", + "gift_certificate_remaining_text": "Resterende", + "gift_certificate_text": "Gavekort", + "remove_action": "Fjern", + "store_credit_available_text": "Din konto har i øjeblikket {storeCredit} butikskredit i alt tilgængelig", + "toggle_action": "Kupon/gavekort" + }, + "remote": { + "browser_unsupported": "Den valgte betalingsmetode kræver en anden webbrowser. Vælg en anden betalingsmetode.", + "connection_error": "Forbindelsen til fjernbetaling blev afvist. Prøv igen senere.", + "continue_with_text": "Eller fortsæt med", + "payment_method_error": "Der opstod en fejl under hentning af din fjernbetalingsmetode. Prøv igen.", + "select_different_card_action": "Vælg et andet kort", + "session_error": "Din fjernsession er udløbet. Log på igen.", + "shipping_address_error": "Der opstod en fejl under hentning af din adresse til fjernforsendelse. Prøv igen.", + "sign_in_action": "Log på {providerName}", + "sign_out_action": "Log ud af {providerName}", + "sign_out_after_action": "for at se andre betalingsmetoder", + "sign_in_required_error": "Fjernlogin påkrævet før betaling" + }, + "shipping": { + "cart_change_error": "Vi har registreret en opdatering til din indkøbskurv, og dine tilgængelige forsendelsesomkostninger er blevet opdateret. Vælg en forsendelsesmetode igen for at fortsætte.", + "enter_shipping_address_text": "Indtast en forsendelsesadresse for at se forsendelsespris", + "order_comment_label": "Kommentarer til ordren", + "assign_item_error": "Der opstod en fejl under tildeling af varen til adressen. Prøv igen", + "assign_item_invalid_address_error_heading": "Ugyldig adresse", + "assign_item_invalid_address_error": "Den valgte adresse er ikke gyldig. Gå til din kontoside, og opdater den.", + "unassign_item_error": "Der opstod en fejl under fjernelse af tildeling af varen til adressen.", + "save_shipping_address_error": "Der opstod en fejl under lagring af leveringsadressen i dit pristilbud. Prøv igen.", + "save_shipping_option_error": "Der opstod en fejl under lagring af forsendelsestilbuddet til din ordre. Prøv igen.", + "select_shipping_address_text": "Vælg en forsendelsesadresse for at se forsendelsesprisen", + "shipping_address_heading": "Leveringsadresse", + "multishipping_address_heading": "Vælg, hvor hver vare skal sendes", + "multishipping_address_heading_guest": "Log ind først", + "multishipping_guest_intro": "Hvis du vil sende dine varer til flere adresser, skal du", + "multishipping_guest_sign_in": "logge på din konto", + "multishipping_guest_create": "eller oprette en konto, før du fortsætter.", + "ship_to_multi": "Send til flere adresser", + "ship_to_single": "Send til en enkelt adresse", + "shipping_heading": "Forsendelse", + "shipping_method_label": "Forsendelsesmetode", + "shipping_option_expired_error": "Den fragtpris, du fik oplyst, er ikke længere gyldig. Klik på OK for at se de mest opdaterede forsendelsespriser.", + "shipping_option_expired_heading": "Din fragtpris er blevet opdateret", + "view_shipping_options_action": "Se andre muligheder" + }, + "social": { + "share_action": "Del", + "share_heading": "Fortæl dine venner om dit køb!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Klik her for at bekræfte, at du er et menneske, før du fortsætter." + }, + "privacy_policy": { + "required_error": "Accepter politikken om beskyttelse af personlige oplysninger.", + "label": "Ja, jeg accepterer politikken om beskyttelse af personlige oplysninger.", + "heading": "Politik om beskyttelse af personlige oplysninger" + }, + "terms_and_conditions": { + "agreement_required_error": "Accepter vilkår og betingelser", + "agreement_text": "Ja, jeg accepterer ovenstående vilkår og betingelser.", + "agreement_with_link_text": "Ja, jeg accepterer vilkårene og betingelserne.", + "terms_and_conditions_heading": "Vilkår og betingelser" + }, + "order_confirmation": { + "mandate": { + "checkoutcom": { + "boleto": "Boleto Bancário-kvittering", + "oxxo": "OXXO-kvittering", + "sepa": "SEPA Direct Debit (via Checkout.com) Mandatreference: {mandate}" + }, + "stripev3": { + "iban": "SEPA-fuldmagt til direkte debitering" + }, + "stripe_upe": { + "boleto": "Boleto Bancário-kvittering", + "oxxo": "OXXO-kvittering" + } + }, + "order_number_text": "Dit ordrenummer er {orderNumber}", + "order_pending_review_text": "Din ordre blev sendt til os, men afventer i øjeblikket betaling. Når vi modtager betalingen for din ordre, gennemføres den. Hvis du allerede har tilvejebragt betalingsoplysninger, behandler vi din ordre manuelt og sender dig en e-mail, når den er gennemført.", + "order_pending_status_text": "Vi har modtaget din ordre og behandler din betaling. Når betalingen er bekræftet, vil din ordre blive gennemført. Vi sender dig en e-mail, når den er færdig. Bemærk, at denne proces kan tage et par minutter afhængigt af behandlingstiden for din valgte metode. Hvis du har spørgsmål om dit køb, kan du sende os en e-mail på {supportEmail}.", + "order_incomplete_status_text": "Vi har modtaget din ordre og betaling. Din ordre behandles nu af vores system. Bemærk, at behandlingen kan tage et par minutter. Hvis du har spørgsmål om dit køb, kan du sende os en e-mail på {supportEmail}.", + "order_with_downloadable_digital_items_text": "Du kan til enhver tid downloade dine digitale køb ved at klikke på linkene på denne side eller ved at logge ind på din konto. Der er også et link til download i din bekræftelsesmail, som ankommer inden længe.", + "order_with_support_number_text": "Der sendes en e-mail med oplysninger om dit køb. Hvis du har spørgsmål om dit køb, kan du sende en e-mail til os på {supportEmail} eller ringe til os på {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Når vi har modtaget din betaling, sender vi en bekræftelsesmail med et link til at downloade dine digitale køb.", + "order_without_support_number_text": "Der sendes en e-mail med oplysninger om dit køb. Hvis du har spørgsmål om dit køb, kan du sende os en e-mail på {supportEmail}.", + "thank_you_customer_heading": "Tak, {name}.", + "thank_you_heading": "Tak.", + "continue_shopping": "Shop videre »", + "order_status_update_facebook_messenger_heading": "Få øjeblikkelige opdateringer af din ordre på Messenger" + } + } +} diff --git a/assets/json/de.json b/assets/json/de.json new file mode 100644 index 000000000..fee7313d4 --- /dev/null +++ b/assets/json/de.json @@ -0,0 +1,472 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Adresse", + "address_line_1_required_error": "Es muss eine Adresse angegeben werden", + "address_line_2_label": "Wohnung/Etage/Gebäude", + "address_line_2_required_error": "Wohnung/Etage/Gebäude ist erforderlich", + "address_not_recognized_heading": "Wir haben Ihre Adresse nicht erkannt", + "consignment_address_updated_text": "Die neue Adresse wurde dem Artikel zugewiesen.", + "city_label": "Ort", + "city_required_error": "Ort ist eine Pflichtangabe", + "company_name_label": "Firmenname", + "company_name_required_error": "Es muss ein Unternehmen angegeben werden", + "confirm_address_action": "Mit aktueller Adresse fortfahren", + "confirm_address_text": "Wir konnten keinen Treffer für die eingegebene Adresse finden. Bitte bestätigen Sie die Adresse.", + "country_label": "Land", + "country_required_error": "Land ist eine Pflichtangabe", + "custom_required_error": "{label} ist erforderlich", + "custom_min_error": "{label} sollte größer als {min} sein", + "custom_max_error": "{label} sollte kleiner als {max} sein", + "invalid_characters_error": "{label} enthält ungültige Zeichen", + "custom_valid_error": "{label} ist nicht gültig", + "edit_address_action": "Adresse bearbeiten", + "enter_address_action": "Eine neue Adresse eingeben", + "add_address_heading": "Adresse hinzufügen", + "save_address_action": "Adresse speichern", + "first_name_label": "Vorname", + "first_name_required_error": "Es muss ein Vorname angegeben werden", + "last_name_label": "Nachname", + "last_name_required_error": "Es muss ein Nachname angegeben werden", + "phone_number_label": "Telefonnummer", + "phone_number_required_error": "Es muss eine Telefonnummer angegeben werden", + "postal_code_label": "Postleitzahl", + "postal_code_required_error": "Postleitzahl ist erforderlich", + "save_in_addressbook": "Diese Adresse in meinem Adressbuch speichern.", + "select_country_action": "Ein Land auswählen", + "select_state_action": "Bundesstaat auswählen", + "state_label": "Bundesstaat/Provinz", + "state_required_error": "Bundesstaat/Provinz ist eine Pflichtangabe", + "select": "Auswählen", + "select_all": "Alle", + "select_none": "Keine" + }, + "billing": { + "billing_address_heading": "Rechnungsadresse", + "billing_heading": "Rechnungsstellung", + "save_billing_address_error": "Beim Speichern der Rechnungsadresse zu Ihrem Preisangebot ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "billing_address_amazon": "Entspricht der von Ihnen in Ihrem Amazon-Konto angegebenen Rechnungsadresse.", + "billing_address_amazonpay": "Verwaltet von Amazon Pay", + "use_shipping_address_label": "Meine Rechnungsadresse ist die gleiche wie meine Versandadresse." + }, + "cart": { + "billed_amount_text": "*Für diese Bestellung wird Ihnen ein Betrag von {total} ({code}) abgerechnet und in Rechnung gestellt.", + "based_on_currency_text": "Basierend auf {total} {code}", + "cart_heading": "Bestellübersicht", + "digital_item_text": "Digitaler Artikel", + "discount_text": "Rabatt", + "downloads_action": "Zu Downloads", + "edit_cart_action": "Warenkorb bearbeiten", + "estimated_total_text": "Geschätzter Gesamtbetrag", + "free_text": "Kostenlos", + "gift_certificate_text": "Geschenkgutschein", + "handling_text": "In Bearbeitung", + "item_count_text": "{count, plural, one{1 Artikel} other{# Artikel} }", + "print_action": "Drucken", + "remaining_text": "verbleiben", + "remove_action": "Entfernen", + "see_all_action": "Alle anzeigen", + "see_less_action": "Weniger anzeigen", + "shipping_text": "Versand", + "gift_wrapping_text": "Geschenkverpackung", + "show_details_action": "Details anzeigen", + "store_credit_text": "Shop-Guthaben", + "subtotal_text": "Gesamtbetrag (netto)", + "taxes_text": "Steuern", + "total_text": "Summe", + "empty_cart_message": "Ihr Warenkorb ist leer, Sie werden weitergeleitet. Bitte klicken Sie hier, wenn Ihr Browser Sie nicht weiterleitet." + }, + "common": { + "cancel_action": "Abbrechen", + "close_action": "Schließen", + "continue_action": "Fortfahren", + "edit_action": "Bearbeiten", + "delete_action": "Löschen", + "error_heading": "Es ist etwas schiefgegangen", + "leave_warning": "Wollen Sie wirklich gehen? Von Ihnen eingegebene Daten werden möglicherweise nicht gespeichert.", + "loading_text": "Wird geladen", + "ok_action": "Ok", + "error_code": "Fehlercode:", + "request_id": "Anfrage-ID:", + "optional_text": "(Optional)", + "unavailable_error": "Bezahlvorgang ist vorübergehend nicht verfügbar. Bitte versuchen Sie es später erneut.", + "unavailable_heading": "Bezahlvorgang ist vorübergehend nicht verfügbar", + "unstable_network_error": "Der Server scheint zu lange zum Antworten zu brauchen. Dies kann von einer schlechten Verbindung oder einem Fehler bei unseren Servern verursacht werden. Bitte versuchen Sie es später erneut.", + "order_loading_error": "Beim Laden Ihrer Bestellung ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "order_fatal_error_heading": "Beim Aufgeben Ihrer Bestellung ist ein Fehler aufgetreten", + "order_fatal_error_extra": "Bitte wählen Sie eine andere Zahlungsmethode oder kontaktieren Sie uns, um weitere Unterstützung zu erhalten.", + "go_back": "Zurück", + "show_more": "Mehr anzeigen" + }, + "customer": { + "checkout_as_guest_text": "Möchten Sie den Bestellvorgang als Gast abschließen? Sie können Ihre Daten speichern, um später ein Konto bei uns zu erstellen.", + "continue_as_guest_action": "Als Gast fortfahren", + "create_account_action": "Konto erstellen", + "continue": "Fortfahren", + "set_password_action": "Passwort speichern", + "required_error": "{label} ist erforderlich", + "min_error": "{label} sollte größer als {min} sein", + "max_error": "{label} sollte kleiner als {max} sein", + "invalid_characters_error": "{label} enthält ungültige Zeichen", + "create_account_error": "Beim Erstellen Ihres Kontos ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "create_address_error": "Allerdings ist beim Speichern der Adresse in Ihrem Adressbuch ein Fehler aufgetreten.", + "create_account_requirements_error_heading": "Passwort entspricht nicht den Anforderungen", + "create_account_success": "Ihr Konto wurde erstellt.", + "set_password_success": "Ihr Passwort wurde gespeichert.", + "create_account_text": "Ein Konto erstellen, um den Bezahlvorgang künftig schneller abschließen zu können", + "set_password_text": "Ein Passwort festlegen, um den Bezahlvorgang künftig schneller abschließen zu können", + "account_created_text": "Es wurde ein Konto für Sie erstellt, aber Sie müssen ein Passwort einrichten, um sich anzumelden.", + "create_account_to_continue_text": "Sie haben kein Konto? Erstellen Sie ein Konto, um fortzufahren.", + "guest_could_login": "Scheinbar haben Sie schon ein Konto. Melden Sie sich mit {email} an, um den Bezahlvorgang schneller abzuschließen.", + "guest_must_login": "Scheinbar haben Sie schon ein Konto. Bitte melden Sie sich an, um mit {email} fortzufahren, oder verwenden Sie eine andere E-Mail-Adresse.", + "guest_temporary_disabled": "Gast-Kaufabwicklung ist vorübergehend deaktiviert. Bitte melden Sie sich an oder erstellen Sie ein Konto, um fortzufahren.", + "customer_heading": "Kunde", + "email_invalid_error": "E-Mail-Adresse muss gültig sein", + "email_label": "E-Mail-Adresse", + "email_required_error": "E-Mail-Adresse ist erforderlich", + "forgot_password_action": "Passwort vergessen?", + "guest_customer_text": "Gastkunde", + "guest_subscribe_to_newsletter_text": "Abonnieren Sie unseren Newsletter.", + "guest_marketing_consent": "Ich möchte gerne aktuelle Informationen und Angebote erhalten.", + "login_action": "Jetzt anmelden", + "login_text": "Haben Sie bereits ein Konto?", + "email_in_use_text": "Es gibt bereits ein Konto für {email}. Bitte geben Sie eine andere E-Mail-Adresse oder andere Anmeldedaten ein.", + "unknown_email_in_use_text": "Es gibt bereits ein Konto für die angegebene E-Mail. Bitte geben Sie eine andere E-Mail-Adresse oder andere Anmeldedaten ein.", + "guest_could_login_change_email": "Nicht {email}? Ändern Sie die E-Mail-Adresse.", + "password_confirmation_error": "Die Passwörter stimmen nicht überein", + "password_confirmation_label": "Passwort bestätigen", + "password_confirmation_required_error": "Dieses Feld ist ein Pflichtfeld.", + "password_label": "Passwort", + "password_letter_required_error": "Das Passwort muss einen Buchstaben enthalten", + "password_minimum_character_label": "Mindestanzahl der Zeichen, unterscheidet zwischen Groß- und Kleinschreibung", + "password_number_required_error": "Das Passwort muss eine Zahl enthalten", + "password_over_maximum_length_error": "Das Passwort ist zu lang", + "password_required_error": "Es muss ein Passwort angegeben werden", + "password_under_minimum_length_error": "Das Passwort ist zu kurz", + "reset_password_before_login_error": "Die Anmeldung ist derzeit nicht verfügbar. Sie erhalten in den nächsten fünf Minuten eine E-Mail mit Anweisungen zum Zurücksetzen Ihres Passworts. Wenn Sie diese E-Mail nicht erhalten, überprüfen Sie bitte Ihren Spam-Ordner oder kontaktieren Sie uns, um weitere Unterstützung zu erhalten.", + "returning_customer_text": "Wiederkehrender Kunde", + "sign_in_action": "Anmelden", + "sign_in_error": "Die eingegebene E-Mail-Adresse oder das eingegebene Passwort sind nicht gültig.", + "sign_in_throttled_error": "Aufgrund zu vieler Anmeldeversuche müssen Sie zehn Sekunden warten, bevor Sie erneut versuchen können, sich anzumelden.", + "sign_out_action": "Abmelden", + "sign_out_error": "Beim Abmelden ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "subscribe_to_newsletter_text": "Ja, ich möchte gerne aktuelle Informationen enthalten.", + "suggestion_text": "Scheinbar haben Sie schon ein Konto bei {provider}. Fahren Sie mit {providerFlow} fort, um schneller zu bezahlen.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "Wir konnten Ihnen keinen Anmeldelink senden. Bitte versuchen Sie es erneut.", + "error_not_found": "Die eingegebene E-Mail-Adresse ist nicht mit einem Konto verknüpft. Bitte versuchen Sie es mit einer anderen E-Mail-Adresse.", + "sent_header": "Überprüfen Sie Ihren Posteingang", + "sent_text": "Wir haben eine E-Mail mit dem Anmeldelink an {email} gesendet. Dieser läuft in {minutes} Minuten ab. Wenn Sie die E-Mail nicht in Ihrem Posteingang sehen, überprüfen Sie Ihren Spam-Ordner.", + "text": "Geben Sie die mit Ihrem Konto verknüpfte E-Mail-Adresse ein. Wir senden Ihnen einen Anmeldelink.", + "header": "Geben Sie Ihre E-Mail-Adresse ein", + "header_with_email": "Bitte bestätigen Sie Ihre E-Mail-Adresse", + "link": "Senden Sie mir stattdessen einen Anmeldelink.", + "use_another_email": "Eine andere E-Mail-Adresse verwenden", + "send": "Senden", + "error_temporary_disabled": "Die Funktion für Anmeldelinks ist vorübergehend nicht verfügbar. Bitte melden Sie sich an, indem Sie Ihr Passwort eingeben.", + "resend_link": "Sie haben die E-Mail nicht erhalten? Lassen Sie den Link erneut senden", + "use_password_link": " oder melden Sie sich stattdessen mit Ihrem Passwort an." + }, + "embedded_checkout": { + "unsupported_error": "Die folgenden Zahlungsmethoden werden von Embedded Checkout nicht unterstützt: {methods}. Bitte wenden Sie sich an uns, um Hilfe zu erhalten." + }, + "payment": { + "affirm_name_text": "Bestätigen", + "affirm_display_name_text": "Im Laufe der Zeit bezahlen", + "affirm_body_text": "Sie werden zu Affirm weitergeleitet, um Ihren Kauf sicher abzuschließen. Füllen Sie einfach ein paar grundlegende Informationen aus und Sie erhalten eine Entscheidung in Echtzeit. Die Überprüfung Ihrer Berechtigung wirkt sich nicht auf Ihre Bonität aus.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Bezahlvorgang mit Afterpay abschließen", + "amazon_continue_action": "Mit Amazon fortfahren", + "amazonpay_continue_action": "Mit Amazon Pay fortfahren", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Fortfahren", + "bluesnap_v2_continue_action": "Fortfahren", + "bolt_create_account_label": "Meine Informationen von Bolt speichern", + "bolt_create_account_disclaimer": "Wenn Sie das Kästchen oben ankreuzen, erklären Sie sich damit einverstanden, gemäß den Bedingungen und der Datenschutzerklärung ein Bolt-Konto zu erstellen.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Mit Visa Checkout fortfahren", + "ccavenuemars_description_text": "Bezahlvorgang mit CCAvenue abschließen", + "chasepay_continue_action": "Mit Chase Pay fortfahren", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Karte bearbeiten", + "chasepay_logout": "Chase Pay abmelden", + "chasepay_fail_load": "Chase Pay konnte nicht geladen werden", + "checkoutcom_document_label_boleto": "CPF oder CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "Nationale ID", + "checkoutcom_document_invalid_error_boleto": "CPF oder CNPJ muss zwischen 11 und 14 Zeichen lang sein", + "checkoutcom_document_invalid_error_oxxo": "CURP darf maximal 18 Zeichen lang sein", + "checkoutcom_document_invalid_error_qpay": "Nationale ID darf maximal 32 Zeichen lang sein", + "checkoutcom_fawry_customer_mobile_invalid_error": "Mobiltelefonnummer muss gültig sein", + "checkoutcom_fawry_customer_mobile_label": "Mobiltelefonnummer", + "checkoutcom_fawry_customer_email_invalid_error": "E-Mail-Adresse muss gültig sein", + "checkoutcom_fawry_customer_email_label": "E-Mail", + "checkoutcom_sepa_creditor_title": "Kreditgeber", + "checkoutcom_sepa_creditor_id": "Kreditgeber-ID: {creditorId}", + "checkoutcom_sepa_debtor_title": "Kreditnehmer", + "checkoutcom_sepa_mandate_disclaimer": "Mit der Annahme dieses Mandatsformulars ermächtigen Sie {creditorName}, Anweisungen an Ihre Bank zu senden, Ihr Konto zu belasten, und Ihre Bank, Ihr Konto gemäß diesen Anweisungen zu belasten. Sie haben Anspruch auf eine Rückerstattung von Ihrer Bank gemäß den Bedingungen Ihrer Vereinbarung mit Ihrer Bank. Eine Rückerstattung muss innerhalb von acht Wochen, beginnend mit dem Datum der Belastung Ihres Kontos, angefordert werden.", + "checkoutcom_sepa_payment_type": "Zahlungsart: einmalig (nicht wiederkehrend)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Kreditkarte", + "credit_card_customer_code_label": "Kundencode", + "credit_card_cvv_help_text": "Bei VISA- und Mastercard-Karten ist der CVV ein dreistelliger Code, der auf der Rückseite der Karte aufgedruckt ist. Bei American Express ist es der vierstellige Code, der auf der Vorderseite der Karte aufgedruckt ist. Der CVV ist eine Sicherheitsmaßnahme, um sicherzustellen, dass Sie im Besitz der Kreditkarte sind.", + "credit_card_cvv_invalid_error": "CVV muss gültig sein", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "CVV erforderlich", + "credit_card_expiration_invalid_error": "Das Ablaufdatum muss ein gültiges Datum in der Zukunft im Format „MM/JJ“ sein", + "credit_card_expiration_label": "Ablaufdatum", + "credit_card_expiration_date_label": "Ablaufdatum", + "credit_card_expiration_required_error": "Ablaufdatum erforderlich", + "credit_card_expiration_placeholder_text": "MM/JJ", + "credit_card_name_label": "Name auf der Karte", + "credit_card_name_required_error": "Vollständiger Name erforderlich", + "credit_card_number_invalid_error": "Kreditkartennummer muss gültig sein", + "credit_card_number_label": "Kreditkartennummer", + "credit_card_number_last_four": "Geben Sie die Kartennummer für {cardType} mit den Endziffern {lastFour} ein", + "credit_card_number_required_error": "Kreditkartennummer erforderlich", + "credit_card_number_mismatch_error": "Die eingegebene Kartennummer entspricht nicht der in Ihrem Konto gespeicherten Karte", + "credit_debit_card_text": "Kredit-/Debitkarte", + "digitalriver_dropin_error": "Bei der Verarbeitung Ihrer Zahlung ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut oder nehmen Sie Kontakt zu uns auf.", + "digitalriver_checkout_error": "Es gab ein Problem mit Ihrem Bezahlvorgang, bitte prüfen Sie Ihre Details und versuchen Sie es erneut oder kontaktieren Sie den Kundendienst.", + "digitalriver_checkout_error_title": "Fehler beim Verarbeiten der Anfrage.", + "digitalriver_display_name_text": "Bitte wählen Sie Ihre Zahlungsmethode aus.", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm kann Ihre Zahlung für diese Bestellung nicht verarbeiten, bitte wählen Sie eine andere Zahlungsmethode aus.", + "klarna_continue_action": "Weiter mit Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Weiter mit Openpay", + "orbital_continue_action": "Bestellung aufgeben", + "orbital_description_text": "Mit Ihrem ChasePay-Konto bezahlen", + "payment_cancelled": "Die Zahlung wurde storniert", + "payment_error": "Bei der Verarbeitung Ihrer Zahlung ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "payment_error_heading": "Zahlung fehlgeschlagen", + "payment_heading": "Zahlung", + "payment_invalid_error_heading": "Zahlung nicht verfügbar", + "payment_method_disabled_error": "Die gewählte Zahlungsmethode ist nicht mehr gültig. Klicken Sie auf „OK“, um die aktuellsten Zahlungsmethoden anzuzeigen.", + "payment_method_error": "Antwort des Zahlungsanbieters: {message}", + "payment_method_invalid_error": "Bei der Verarbeitung Ihrer Zahlung ist ein Fehler aufgetreten. Bitte kontaktieren Sie uns, um Hilfe zu erhalten, oder wählen Sie eine andere Zahlungsmethode.", + "payment_method_unavailable_error": "Dieser Zahlungsdienstleister ist vorübergehend nicht verfügbar. Bitte versuchen Sie es später erneut.", + "payment_not_required_text": "Für diese Bestellung ist keine Zahlung erforderlich.", + "paypal_continue_action": "Mit PayPal fortfahren", + "paypal_credit_continue_action": "Mit PayPal Credit fortfahren", + "paypal_credit_description_text": "Jetzt kaufen, im Laufe der Zeit bezahlen", + "paypal_description_text": "Mit Ihrem PayPal-Konto bezahlen", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Später bezahlen", + "place_order_action": "Bestellung aufgeben", + "place_order_error": "Beim Aufgeben Ihrer Bestellung ist ein Fehler aufgetreten. Bitte nehmen Sie Kontakt zu uns auf.", + "place_order_error_heading": "Bestellung konnte nicht aufgegeben werden", + "postal_code_label": "Postleitzahl", + "ideal_bic_required": "Sie müssen einen Aussteller wählen, um die Bestellung aufzugeben", + "instrument_text": "Gespeicherte Kreditkarten", + "instrument_add_card_action": "Eine andere Karte verwenden", + "instrument_default_ending_in_text": "Karte mit den Endziffern {endingIn}", + "instrument_ending_in_text": "{cardTitle} endet mit {endingIn}", + "instrument_expired_text": "Abgelaufen am {expiryDate}", + "instrument_expires_text": "Läuft ab am {expiryDate}", + "instrument_manage_button": "verwalten", + "instrument_manage_modal_confirmation_action": "Ja, löschen", + "instrument_manage_modal_confirmation_label": "Möchten Sie diese gespeicherte Zahlungsmethode wirklich löschen?", + "instrument_manage_modal_title_text": "Gespeicherte Zahlungsmethoden verwalten", + "instrument_manage_modal_empty_text": "Sie haben keine gespeicherten Zahlungsmethoden.", + "instrument_manage_table_header_ending_in_text": "Endet auf", + "instrument_manage_table_header_expiry_date_text": "Ablaufdatum", + "instrument_manage_table_header_payment_method_text": "Zahlungsmethode", + "instrument_manage_delete_server_error": "Beim Löschen dieser gespeicherten Zahlungsmethode ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "instrument_manage_delete_auth_error": "Bei der Autorisierung Ihrer Anfrage ist ein Problem aufgetreten. Bitte versuchen Sie erneut, sich anzumelden.", + "instrument_manage_delete_client_error": "Beim Löschen der gespeicherten Zahlungsmethode ist ein Fehler aufgetreten: Die Zahlungsmethode existiert nicht mehr oder kann nicht gelöscht werden.", + "instrument_save_payment_method_label": "Diese Karte für zukünftige Transaktionen speichern", + "instrument_save_as_default_payment_method_label": "Diese Karte als Standardzahlungsmethode für zukünftige Transaktionen verwenden", + "account_instrument_add_action": "Ein anderes Konto verwenden", + "account_instrument_save_payment_method_label": "Dieses Konto für zukünftige Transaktionen speichern", + "account_instrument_save_as_default_payment_method_label": "Dieses Konto als Standardzahlungsmethode für zukünftige Transaktionen verwenden", + "account_instrument_text": "Gespeicherte Konten", + "account_instrument_new_shipping_address": "Wir haben festgestellt, dass dies eine neue Versandadresse ist.

Aus Sicherheitsgründen müssen Sie Ihr PayPal-Konto erneut verknüpfen, wenn der Versand zum ersten Mal an eine bestimmte Adresse erfolgt oder wenn die Versandadresse kürzlich bearbeitet wurde.

", + "instrument_trusted_shipping_address_text": "Dieser zusätzliche Sicherheitsschritt wird auf Ihre Karte angewendet, wenn der Versand an eine bestimmte Adresse zum ersten Mal erfolgt oder wenn die Versandadresse kürzlich bearbeitet wurde.", + "instrument_trusted_shipping_address_title_text": "Bitte geben Sie Ihre Kartennummer erneut ein, um diese Transaktion zu autorisieren.", + "quadpay_continue_action": "Mit Zip fortfahren", + "quadpay_display_name_text": "In vier Raten zahlen (Quadpay)", + "ppsdk_continue_action": "Weiter mit {methodName}", + "select_your_bank": "Wählen Sie Ihre Bank aus", + "sepa_account_number": "Kontonummer (IBAN)", + "sepa_account_number_required": "Bitte geben Sie Ihre Kontonummer (IBAN) ein", + "sepa_bic": "BIC", + "sepa_bic_length": "BIC muss 8 oder 11 Zeichen lang sein", + "sepa_mandate_required": "Sie müssen das Mandatsformular akzeptieren", + "sezzle_display_name_text": "Später bezahlen. 0 % Zinsen.", + "stripe_sepa_display_name_text": "SEPA-Lastschriftverfahren.", + "stripe_sepa_mandate_disclaimer": "Mit der Angabe Ihrer IBAN und der Bestätigung dieser Zahlung ermächtigen Sie (A) {storeUrl} und Stripe, unseren Zahlungsdienstleister, Anweisungen an Ihre Bank zu senden, Ihr Konto zu belasten, und (B) Ihre Bank, Ihr Konto gemäß diesen Anweisungen zu belasten. Sie haben Anspruch auf eine Rückerstattung von Ihrer Bank gemäß den Bedingungen Ihrer Vereinbarung mit Ihrer Bank. Eine Rückerstattung muss innerhalb von acht Wochen, beginnend mit dem Datum der Belastung Ihres Kontos, angefordert werden.", + "tax_provider_unavailable": "Die Umsatzsteuer konnte nicht berechnet werden. Bitte versuchen Sie es erneut. Wenn der Vorgang immer noch fehlschlägt, wenden Sie sich an unser Support-Team, um den Bezahlvorgang abzuschließen.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Mit Click to pay fortfahren", + "zip_continue_action": "Mit Zip fortfahren", + "zip_name_text": "Zip", + "zip_display_name_text": "Jetzt besitzen, später bezahlen", + "errors": { + "additional_action_required": "Bitte fahren Sie mit weiteren Aktionen fort.", + "authorization_expired": "Die Autorisierung für diese Transaktion ist abgelaufen.", + "authorization_revoked": "Die Autorisierung für diese Transaktion wurde widerrufen.", + "call_issuer": "Bei der Verarbeitung Ihrer Karte ist ein Fehler aufgetreten. Bitte wenden Sie sich an den Kartenaussteller.", + "captured_transaction": "Diese Bestellung wurde bereits bezahlt.", + "card_declined": "Die Zahlung wurde abgelehnt. Bitte versuchen Sie es mit einer anderen Karte.", + "card_error": "Ihre Kartendaten konnten nicht verifiziert werden. Bitte überprüfen Sie Ihre Angaben noch einmal ganz genau und versuchen Sie es erneut.", + "card_replaced": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "connection_error": "Wir haben Schwierigkeiten bei der Verarbeitung Ihrer Transaktion. Bitte versuchen Sie es später erneut.", + "duplicate_transaction": "Diese Transaktion liegt doppelt vor. Bitte nehmen Sie mit uns Kontakt auf, um Ihre Bestellung zu bestätigen. Versuchen Sie nicht, erneut zu bezahlen.", + "expired_card": "Ihre Karte ist abgelaufen. Bitte versuchen Sie es noch einmal mit einer gültigen Karte.", + "gateway_error": "Es gab ein Problem mit dem Server. Bitte versuchen Sie es später noch einmal.", + "general_error": "Fehler beim Verarbeiten der Zahlungsanfrage.", + "hosted_form_error": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "incorrect_address": "Ihre Rechnungsadresse konnte nicht verifiziert werden. Bitte überprüfen Sie die Angaben Ihrer Rechnungsadresse und versuchen Sie es erneut.", + "incorrect_amount": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "incorrect_cvc": "Ihre Kartendaten konnten nicht verifiziert werden. Bitte überprüfen Sie Ihre Angaben noch einmal ganz genau und versuchen Sie es erneut.", + "incorrect_number": "Ihre Kartendaten konnten nicht verifiziert werden. Bitte überprüfen Sie Ihre Angaben noch einmal ganz genau und versuchen Sie es erneut.", + "incorrect_zip": "Ihre Rechnungsadresse konnte nicht verifiziert werden. Bitte überprüfen Sie die Angaben Ihrer Rechnungsadresse und versuchen Sie es erneut.", + "insufficient_funds": "Die Zahlung wurde abgelehnt. Bitte wenden Sie sich an Ihre Bank.", + "invalid_address": "Ihre Rechnungsadresse konnte nicht verifiziert werden. Bitte überprüfen Sie die Angaben Ihrer Rechnungsadresse und versuchen Sie es erneut.", + "invalid_amount": "Bei der Verarbeitung Ihrer Zahlung ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut oder nehmen Sie Kontakt zu uns auf.", + "invalid_authorization_code": "Bei der Verarbeitung Ihrer Zahlung ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut oder nehmen Sie Kontakt zu uns auf.", + "invalid_create_instrument_request": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "invalid_cvc": "Ihre Kartendaten konnten nicht verifiziert werden. Bitte überprüfen Sie Ihre Angaben noch einmal ganz genau und versuchen Sie es erneut.", + "invalid_email_address": "Die Zahlung konnte nicht verarbeitet werden, da bei der Transaktion eine ungültige E-Mail-Adresse angegeben wurde.", + "invalid_expiry_date": "Ihre Kartendaten konnten nicht verifiziert werden. Bitte überprüfen Sie Ihre Angaben noch einmal ganz genau und versuchen Sie es erneut.", + "invalid_expiry_month": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "invalid_expiry_year": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "invalid_gateway": "Gateway ist ungültig.", + "invalid_gateway_options": "Gateway-Optionen sind ungültig.", + "invalid_instrument": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "invalid_issuer": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "invalid_number": "Ihre Kartendaten konnten nicht verifiziert werden. Bitte überprüfen Sie Ihre Angaben noch einmal ganz genau und versuchen Sie es erneut.", + "invalid_payment_request": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "invalid_request_error": "Wir haben Schwierigkeiten bei der Verarbeitung Ihrer Transaktion. Bitte nehmen Sie Kontakt zu uns auf oder versuchen Sie es später erneut.", + "invalid_user_authentication": "Bei der Verarbeitung Ihrer Zahlung ist ein Fehler aufgetreten. Bitte nehmen Sie Kontakt zu uns auf.", + "invalid_zip": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "journal_error": "Es gab ein Problem mit dem Server. Bitte versuchen Sie es später noch einmal.", + "lost_or_stolen_card": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "missing_test_mode": "Die Anfrage konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten eingegeben wurden.", + "not_found": "Wir haben Schwierigkeiten bei der Verarbeitung Ihrer Transaktion. Bitte versuchen Sie es später erneut.", + "payment_config_error": "Es gab ein Problem mit dem Server. Bitte versuchen Sie es später noch einmal.", + "payment_config_not_found": "Es gab ein Problem mit dem Server. Bitte versuchen Sie es später noch einmal.", + "pending_review": "Ihre Transaktion wurde autorisiert, wird aber zur Überprüfung durch den Händler zurückgehalten.", + "pickup_card": "Ihre Karte kann für diese Zahlung nicht verwendet werden. Bitte wenden Sie sich an Ihren Kartenaussteller oder versuchen Sie es mit einer anderen Karte.", + "processing_error": "Wir haben Schwierigkeiten bei der Verarbeitung Ihrer Transaktion. Bitte versuchen Sie es später erneut.", + "provider_configuration_error": "Der Zahlungsdienstleister des Händlers ist nicht richtig konfiguriert.", + "refund_timelimit_expired": "Die Frist für die Erstattung dieser Transaktion ist abgelaufen.", + "refunded_transaction": "Diese Transaktion wurde bereits erstattet.", + "request_timeout": "Ihre Zahlung hat zu lange gedauert und kann nicht verarbeitet werden. Bitte versuchen Sie es erneut.", + "required_field": "Ihre Zahlung konnte nicht verifiziert werden. Bitte überprüfen Sie Ihre Kartendaten und versuchen Sie es erneut.", + "server_error": "Bei der Verarbeitung Ihrer Zahlung ist ein Fehler aufgetreten und Ihre Bestellung konnte nicht abgeschlossen werden. Bitte versuchen Sie es erneut.", + "store_instrument_failed": "Die Anfrage kann nicht verarbeitet werden. Bitte versuchen Sie es erneut.", + "stored_payment_instrument_not_found": "Diese gespeicherte Zahlungsmethode konnte nicht gefunden werden. Bitte wählen Sie eine andere Zahlungsmethode.", + "three_d_secure_declined": "Es gab ein Problem mit Ihrer Zahlung. Bitte überprüfen Sie Ihre Zahlungsdaten oder wenden Sie sich an Ihren Kartenaussteller.", + "three_d_secure_failed": "Die Zahlung ist fehlgeschlagen. Bitte versuchen Sie es erneut oder verwenden Sie eine andere Zahlungsoption.", + "three_d_secure_required": "Eine weitere Authentifizierung ist erforderlich, um Ihre Zahlung zu verarbeiten. Bitte nehmen Sie Kontakt zu uns auf.", + "token_error": "Wir haben Schwierigkeiten bei der Verarbeitung Ihrer Transaktion. Bitte versuchen Sie es später erneut.", + "transaction_declined": "Ihre Zahlung wurde abgelehnt. Bitte versuchen Sie es erneut.", + "transaction_rejected": "Die Zahlung wurde abgelehnt. Bitte versuchen Sie es erneut.", + "unauthorized": "Wir haben Schwierigkeiten bei der Verarbeitung Ihrer Transaktion. Bitte versuchen Sie es später erneut.", + "unsupported_currency": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "unsupported_instrument": "Ihre Kartendaten konnten nicht verifiziert werden. Bitte überprüfen Sie Ihre Angaben noch einmal ganz genau und versuchen Sie es erneut.", + "unsupported_request": "Die Zahlung konnte nicht verarbeitet werden, weil bei der Transaktion ungültige Daten angegeben wurden.", + "user_authorization_error": "Bei der Verarbeitung Ihrer Zahlung ist ein Fehler aufgetreten. Bitte nehmen Sie Kontakt zu uns auf.", + "vaulting_service_unavailable": "Der Card-Vaulting-Service ist zurzeit nicht verfügbar", + "voided_transaction": "Ihre Zahlung kann nicht verarbeitet werden, da die Transaktion bereits storniert wurde. Bitte versuchen Sie es erneut oder nehmen Sie Kontakt zu uns auf." + } + }, + "redeemable": { + "applied_text": "Angewendet", + "apply_action": "Anwenden", + "apply_store_credit_after_action": "Shop-Guthaben zum Bestellen verwenden", + "apply_store_credit_before_action": "Anwenden", + "code_invalid_error": "Der Geschenkgutschein oder Coupon-Code ist ungültig", + "code_label": "Geschenkgutschein oder Coupon-Code", + "code_required_error": "Bitte geben Sie einen Geschenkgutschein- oder Coupon-Code ein", + "coupon_location_error": "Ihre Versandadresse entspricht nicht den Standortanforderungen für den von Ihnen eingegebenen Coupon-Code.", + "coupon_min_order_total": "Ihre Bestellung entspricht nicht der Mindestsumme, die für die Anwendung dieses Gutscheincodes erforderlich ist.", + "coupon_text": "Gutschein", + "gift_certificate_remaining_text": "verbleiben", + "gift_certificate_text": "Geschenkgutschein", + "remove_action": "Entfernen", + "store_credit_available_text": "Ihr Konto verfügt derzeit insgesamt über {storeCredit} Shop-Guthaben", + "toggle_action": "Coupon/Geschenkgutschein" + }, + "remote": { + "browser_unsupported": "Für die gewählte Zahlungsmethode ist ein anderer Webbrowser erforderlich. Bitte wählen Sie eine andere Zahlungsmethode.", + "connection_error": "Verbindung zum Remote-Abschluss des Bezahlvorgangs verweigert. Bitte versuchen Sie es später erneut.", + "continue_with_text": "Oder fortfahren mit", + "payment_method_error": "Beim Abrufen Ihrer Remote-Zahlungsmethode ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "select_different_card_action": "Eine andere Karte wählen", + "session_error": "Ihre Remote-Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.", + "shipping_address_error": "Beim Abrufen Ihrer Remote-Versandadresse ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "sign_in_action": "Anmelden bei {providerName}", + "sign_out_action": "Abmelden bei {providerName}", + "sign_out_after_action": "um andere Zahlungsmethoden anzuzeigen", + "sign_in_required_error": "Remote-Anmeldung vor der Zahlung erforderlich" + }, + "shipping": { + "cart_change_error": "Es wurde eine Aktualisierung Ihres Warenkorbs erkannt und Ihre verfügbaren Versandkosten wurden aktualisiert. Bitte wählen Sie erneut eine Versandmethode aus, um fortzufahren.", + "enter_shipping_address_text": "Bitte geben Sie eine Versandadresse ein, um Versandangebote anzuzeigen", + "order_comment_label": "Kommentare zur Bestellung", + "assign_item_error": "Beim Zuordnen des Artikels zur Adresse ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "assign_item_invalid_address_error_heading": "Ungültige Adresse", + "assign_item_invalid_address_error": "Die gewählte Adresse ist nicht gültig. Bitte rufen Sie Ihre Kontoseite auf und aktualisieren Sie sie.", + "unassign_item_error": "Bei der Aufhebung der Zuordnung des Artikels zur Adresse ist ein Fehler aufgetreten.", + "save_shipping_address_error": "Beim Speichern der Versandadresse zu Ihrem Preisangebot ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "save_shipping_option_error": "Beim Speichern des Versandangebots zu Ihrer Bestellung ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.", + "select_shipping_address_text": "Bitte wählen Sie eine Versandadresse, um Versandangebote anzuzeigen", + "shipping_address_heading": "Versandadresse", + "multishipping_address_heading": "Wählen Sie aus, wohin jeder Artikel versendet werden soll", + "multishipping_address_heading_guest": "Bitte melden Sie sich zuerst an", + "multishipping_guest_intro": "Um Ihre Artikel an mehrere Adressen zu versenden, müssen Sie", + "multishipping_guest_sign_in": "sich in Ihrem Konto anmelden", + "multishipping_guest_create": "oder ein Konto erstellen, bevor Sie fortfahren.", + "ship_to_multi": "An mehrere Adressen versenden", + "ship_to_single": "An eine einzelne Adresse versenden", + "shipping_heading": "Versand", + "shipping_method_label": "Versandmethode", + "shipping_option_expired_error": "Der Versandpreis, der Ihnen angeboten wurde, ist nicht mehr gültig. Klicken Sie auf „OK“, um die aktuellsten Versandpreise anzuzeigen.", + "shipping_option_expired_heading": "Ihr Versandpreis wurde aktualisiert", + "view_shipping_options_action": "Andere Optionen anzeigen" + }, + "social": { + "share_action": "Freigeben", + "share_heading": "Erzählen Sie Ihren Freunden von Ihrem Kauf!", + "tweet_action": "Twittern" + }, + "spam_protection": { + "verify_action": "Bitte klicken Sie hier, um zu bestätigen, dass Sie ein menschlicher Benutzer sind, bevor Sie fortfahren." + }, + "privacy_policy": { + "required_error": "Bitte stimmen Sie der Datenschutzerklärung zu.", + "label": "Ja, ich stimme der Datenschutzerklärung zu.", + "heading": "Datenschutzerklärung" + }, + "terms_and_conditions": { + "agreement_required_error": "Bitte stimmen Sie den Allgemeinen Geschäftsbedingungen zu", + "agreement_text": "Ja, ich stimme den obigen Allgemeinen Geschäftsbedingungen zu.", + "agreement_with_link_text": "Ja, ich stimme den Allgemeinen Geschäftsbedingungen zu.", + "terms_and_conditions_heading": "Allgemeine Geschäftsbedingungen" + }, + "order_confirmation": { + "order_number_text": "Ihre Bestellnummer lautet {orderNumber}", + "order_pending_review_text": "Ihre Bestellung wurde an uns gesendet, wartet aber derzeit auf den Eingang der Zahlung. Sobald wir die Zahlung für Ihre Bestellung erhalten haben, wird diese abgeschlossen. Wenn Sie bereits Zahlungsdaten angegeben haben, werden wir Ihre Bestellung manuell bearbeiten und Ihnen eine E-Mail senden, sobald sie abgeschlossen ist.", + "order_pending_status_text": "Wir haben Ihre Bestellung erhalten und sind dabei, Ihre Zahlung zu verarbeiten. Sobald die Zahlung verifiziert wurde, wird Ihre Bestellung abgeschlossen. Wir senden Ihnen eine E-Mail, wenn dies der Fall ist. Bitte beachten Sie, dass dieser Vorgang einige Minuten dauern kann, abhängig von den Verarbeitungszeiten der von Ihnen gewählten Methode. Wenn Sie Fragen zu Ihrem Kauf haben, senden Sie uns eine E-Mail an {supportEmail}.", + "order_incomplete_status_text": "Wir haben Ihre Bestellung und Ihre Zahlung erhalten. Ihre Bestellung wird nun von unserem System bearbeitet. Bitte beachten Sie, dass dies einige Minuten dauern kann. Wenn Sie Fragen zu Ihrem Kauf haben, senden Sie uns eine E-Mail an {supportEmail}.", + "order_with_downloadable_digital_items_text": "Sie können Ihre digitalen Käufe jederzeit herunterladen, indem Sie auf die Links auf dieser Seite klicken, oder indem Sie sich in Ihrem Konto anmelden. Außerdem befindet sich ein Download-Link in Ihrer Bestätigungs-E-Mail, die Sie in Kürze erhalten sollten.", + "order_with_support_number_text": "Sie erhalten eine E-Mail mit Informationen zu Ihrem Kauf. Wenn Sie Fragen zu Ihrem Kauf haben, senden Sie uns eine E-Mail an {supportEmail} oder rufen Sie uns unter der Nummer {supportPhoneNumber} an.", + "order_without_downloadable_digital_items_text": "Sobald wir Ihre Zahlung erhalten haben, senden wir Ihnen eine Bestätigungs-E-Mail mit einem Link zum Herunterladen Ihrer digitalen Einkäufe.", + "order_without_support_number_text": "Sie erhalten eine E-Mail mit Informationen zu Ihrem Kauf. Wenn Sie Fragen zu Ihrem Kauf haben, senden Sie uns eine E-Mail an {supportEmail}.", + "thank_you_customer_heading": "Vielen Dank, {name}!", + "thank_you_heading": "Vielen Dank.", + "continue_shopping": "Weiter einkaufen »", + "order_status_update_facebook_messenger_heading": "Sofortige Aktualisierungen Ihrer Bestellung im Messenger erhalten", + "mandate_link_text": "{provider}-Mandat", + "boleto_link_text": "Boleto Bancário-Ticket", + "oxxo_link_text": "OXXO-Ticket", + "sepa_link_text": "SEPA-Lastschriftmandat" + } + } +} diff --git a/assets/json/en.json b/assets/json/en.json new file mode 100644 index 000000000..b2cf301b7 --- /dev/null +++ b/assets/json/en.json @@ -0,0 +1,495 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Address", + "address_line_1_required_error": "Address is required", + "address_line_2_label": "Apartment/Suite/Building", + "address_line_2_required_error": "Apartment/Suite/Building is required", + "address_not_recognized_heading": "We did not recognize your address", + "consignment_address_updated_text": "The item was successfully assigned the new address.", + "city_label": "City", + "city_required_error": "City is required", + "company_name_label": "Company Name", + "company_name_required_error": "Company is required", + "confirm_address_action": "Proceed with current address", + "confirm_address_text": "We could not find a match for the address you entered. Please confirm the address.", + "country_label": "Country", + "country_required_error": "Country is required", + "custom_required_error": "{label} is required", + "custom_min_error": "{label} should be bigger than {min}", + "custom_max_error": "{label} should be smaller than {max}", + "invalid_characters_error": "{label} contains invalid characters", + "custom_valid_error": "{label} is not valid", + "edit_address_action": "Edit address", + "enter_address_action": "Enter a new address", + "enter_or_select_address_action": "Enter or select a different address", + "add_address_heading": "Add Address", + "save_address_action": "Save Address", + "first_name_label": "First Name", + "first_name_required_error": "First Name is required", + "last_name_label": "Last Name", + "last_name_required_error": "Last Name is required", + "phone_number_label": "Phone Number", + "phone_number_required_error": "Phone Number is required", + "postal_code_label": "Postal Code", + "postal_code_required_error": "Postal Code is required", + "save_in_addressbook": "Save this address in my address book.", + "select_country_action": "Select a country", + "select_state_action": "Select a state", + "state_label": "State/Province", + "state_required_error": "State/Province is required", + "select": "Select", + "select_all": "All", + "select_none": "None" + }, + "billing": { + "billing_address_heading": "Billing Address", + "billing_heading": "Billing", + "save_billing_address_error": "An error occurred while saving the billing address to your price quote. Please try again.", + "billing_address_amazon": "Same as the Billing address set by you in your Amazon account.", + "billing_address_amazonpay": "Managed by Amazon Pay", + "use_shipping_address_label": "My billing address is the same as my shipping address." + }, + "cart": { + "billed_amount_text": "*You will be charged and invoiced {total} ({code}) for this order.", + "based_on_currency_text": "Based on {total} {code}", + "cart_heading": "Order Summary", + "digital_item_text": "Digital Item", + "discount_text": "Discount", + "downloads_action": "Go to Downloads", + "edit_cart_action": "Edit Cart", + "estimated_total_text": "Estimated Total", + "free_text": "Free", + "gift_certificate_text": "Gift Certificate", + "handling_text": "Handling", + "item_count_text": "{count, plural, one{1 Item} other{# Items} }", + "print_action": "Print", + "remaining_text": "Remaining", + "remove_action": "remove", + "see_all_action": "See All", + "see_less_action": "See Less", + "shipping_text": "Shipping", + "gift_wrapping_text": "Gift Wrapping", + "show_details_action": "Show Details", + "store_credit_text": "Store Credit", + "subtotal_text": "Subtotal", + "taxes_text": "Taxes", + "total_text": "Total", + "empty_cart_message": "Your cart is empty, you are being redirected. Please click here if your browser does not redirect you." + }, + "common": { + "cancel_action": "Cancel", + "close_action": "Close", + "continue_action": "Continue", + "edit_action": "Edit", + "delete_action": "Delete", + "error_heading": "Something's gone wrong", + "leave_warning": "Are you sure you want to leave? Data you have entered may not be saved.", + "loading_text": "Loading", + "ok_action": "Ok", + "error_code": "Error code:", + "request_id": "Request ID:", + "optional_text": "(Optional)", + "unavailable_error": "Checkout is temporarily unavailable. Please try again later.", + "unavailable_heading": "Checkout is temporarily unavailable", + "unstable_network_error": "It looks like the server is taking too long to respond, this can be caused by either poor connectivity or an error with our servers. Please try again in a while.", + "order_loading_error": "There was an error loading your order. Please try again.", + "order_fatal_error_heading": "There was an error placing your order", + "order_fatal_error_extra": "Please choose another payment method or contact us for further assistance.", + "go_back": "Go Back", + "show_more": "Show more" + }, + "customer": { + "checkout_as_guest_text": "Checking out as a Guest? You'll be able to save your details to create an account with us later.", + "continue_as_guest_action": "Continue as guest", + "create_account_action": "Create Account", + "continue": "Continue", + "set_password_action": "Save Password", + "required_error": "{label} is required", + "min_error": "{label} should be bigger than {min}", + "max_error": "{label} should be smaller than {max}", + "invalid_characters_error": "{label} contains invalid characters", + "create_account_error": "An error occurred while creating your account. Please try again.", + "create_address_error": "However, an error occurred while saving the address in your address book.", + "create_account_requirements_error_heading": "Password does not match requirements", + "create_account_success": "Your account has been created.", + "set_password_success": "Your password has been saved.", + "create_account_text": "Create an account for a faster checkout in the future", + "set_password_text": "Setup a password for a faster checkout in the future", + "account_created_text": "An account has been created for you, but you'll need to setup a password to sign in.", + "create_account_to_continue_text": "Don't have an account? Create an account to continue.", + "guest_could_login": "Looks like you have an account. Sign in with {email} for a faster checkout.", + "guest_must_login": "Looks like you have an account. Please sign in to proceed with {email}, or use another email.", + "guest_temporary_disabled": "Guest checkout is temporarily disabled. Please sign in or create an account to continue.", + "customer_heading": "Customer", + "email_invalid_error": "Email address must be valid", + "email_label": "Email Address", + "email_required_error": "Email address is required", + "forgot_password_action": "Forgot password?", + "guest_customer_text": "Guest Customer", + "guest_subscribe_to_newsletter_text": "Subscribe to our newsletter.", + "guest_marketing_consent": "I would like to receive updates and offers.", + "login_action": "Sign in now", + "login_text": "Already have an account?", + "email_in_use_text": "There's already an account for {email}. Please enter a different email address or sign-in.", + "unknown_email_in_use_text": "There's already an account for the provided email. Please enter a different email address or sign-in.", + "guest_could_login_change_email": "Not {email}? Change email.", + "password_confirmation_error": "Passwords do not match", + "password_confirmation_label": "Confirm Password", + "password_confirmation_required_error": "This field is required", + "password_label": "Password", + "password_letter_required_error": "Password needs to contain a letter", + "password_minimum_character_label": "character minimum, case sensitive", + "password_number_required_error": "Password needs to contain a number", + "password_over_maximum_length_error": "Password is too long", + "password_required_error": "Password is required", + "password_under_minimum_length_error": "Password is too short", + "reset_password_before_login_error": "Sign-in is currently unavailable. You will receive an e-mail in the next 5 minutes with instructions for resetting your password. If you don't receive this e-mail, please check your junk mail folder or contact us for further assistance.", + "returning_customer_text": "Returning Customer", + "sign_in_action": "Sign In", + "sign_in_error": "The email or password you entered is not valid.", + "sign_in_throttled_error": "Due to excessive login attempts, please wait 10 seconds before attempting to log in again.", + "sign_out_action": "Sign Out", + "sign_out_error": "An error occurred while signing out. Please try again.", + "subscribe_to_newsletter_text": "Yes, I'd like to receive updates.", + "suggestion_text": "Looks like you have an account with {provider}. For fast checkout, continue with {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "We couldn't send you a sign-in link. Please try again.", + "error_not_found": "The entered email is not associated to an account. Please try with a different email.", + "sent_header": "Check your inbox", + "sent_text": "We've sent an email to {email} that contains a sign-in link. This will expire in {minutes} minutes - If you don't see it in your inbox, check your junk folder.", + "text": "Enter the email address associated to your account. We will send you a sign-in link.", + "header": "Enter your email address", + "header_with_email": "Confirm your email address", + "link": "Send me a sign-in link instead.", + "use_another_email": "Use another email", + "send": "Send", + "error_temporary_disabled": "Sign-in link functionality is temporary unavailable. Please sign in by entering your password.", + "resend_link": "Didn't get the email? Resend the link", + "use_password_link": " or sign in using your password instead." + }, + "embedded_checkout": { + "unsupported_error": "The following payment methods are not supported by Embedded Checkout: {methods}. Please contact us for assistance." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Pay over time", + "affirm_body_text": "You will be redirected to Affirm to securely complete your purchase. Just fill out a few pieces of basic information and get a real-time decision. Checking your eligibility won't affect your credit score.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Checkout with Afterpay", + "amazon_continue_action": "Continue with Amazon", + "amazonpay_continue_action": "Continue with Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continue", + "bluesnap_v2_continue_action": "Continue", + "bolt_benefit_1": "Shop hundreds of brands with a passwordless login", + "bolt_benefit_2": "Check out with saved payment and shipping details", + "bolt_benefit_3": "Benefit from PCI-compliant account security", + "bolt_checkbox_agreement": "Save my information, create a Bolt account, and agree to Bolt’s Terms of Use and Privacy Policy.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continue with Visa Checkout", + "continue_with_brand": "Continue with {brandName}", + "ccavenuemars_description_text": "Checkout with CCAvenue", + "chasepay_continue_action": "Continue with Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Edit card", + "chasepay_logout": "Log out Chase Pay", + "chasepay_fail_load": "Chase Pay failed to load", + "checkoutcom_document_label_boleto": "CPF or CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "National ID", + "checkoutcom_document_invalid_error_boleto": "CPF or CNPJ must be between 11 and 14 characters", + "checkoutcom_document_invalid_error_oxxo": "CURP must be at most 18 characters", + "checkoutcom_document_invalid_error_qpay": "National ID must be at most 32 characters", + "checkoutcom_fawry_customer_mobile_invalid_error": "Mobile Number must be valid", + "checkoutcom_fawry_customer_mobile_label": "Mobile Number", + "checkoutcom_fawry_customer_email_invalid_error": "Email address must be valid", + "checkoutcom_fawry_customer_email_label": "Email", + "checkoutcom_sepa_creditor_title": "Creditor", + "checkoutcom_sepa_creditor_id": "Creditor ID: {creditorId}", + "checkoutcom_sepa_debtor_title": "Debtor", + "checkoutcom_sepa_mandate_disclaimer": "By accepting this mandate form, you authorize {creditorName} to send instructions to your bank to debit your account, and your bank to debit your account in accordance with those instructions. You are entitled to a refund from your bank under the terms and conditions of your agreement with your bank. A refund must be claimed within 8 weeks starting from the date on which your account was debited.", + "checkoutcom_sepa_payment_type": "Payment type: one-off (non-recurring)", + "clearpay_name_text": "Clear Pay", + "credit_card_text": "Credit card", + "credit_card_customer_code_label": "Customer Code", + "credit_card_cvv_help_text": "For VISA and Mastercard, the CVV is a three-digit code printed on the back. For American Express it is the four-digit code printed on the front. The CVV is a security measure to ensure that you are in possession of the card.", + "credit_card_cvv_invalid_error": "CVV must be valid", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "CVV is required", + "credit_card_expiration_invalid_error": "Expiration date must be a valid future date in MM / YY format", + "credit_card_expiration_label": "Expiration", + "credit_card_expiration_date_label": "Expiration Date", + "credit_card_expiration_required_error": "Expiration Date is required", + "credit_card_expiration_placeholder_text": "MM / YY", + "credit_card_name_label": "Name on Card", + "credit_card_name_required_error": "Full name is required", + "credit_card_number_invalid_error": "Credit Card Number must be valid", + "credit_card_number_label": "Credit Card Number", + "credit_card_number_last_four": "Enter card number for {cardType} ending in {lastFour}", + "credit_card_number_required_error": "Credit Card Number is required", + "credit_card_number_mismatch_error": "The card number entered does not match the card stored in your account", + "credit_debit_card_text": "Credit/Debit Card", + "digitalriver_dropin_error": "There was an error while processing your payment. Please try again or contact us.", + "digitalriver_checkout_error": "There was a problem with your checkout, please check your details and try again or contact customer service", + "digitalriver_checkout_error_title": "Error while processing request.", + "digitalriver_display_name_text": "Please select your payment method", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm cannot process your payment for this order, please select another payment method.", + "klarna_continue_action": "Continue with Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continue with {methodName}", + "opy_widget_slogan": "Buy now. Pay smarter.", + "opy_widget_info": "You will be redirected to {methodName}'s website to complete your order when you click \"Continue with {methodName}\"", + "opy_invalid_cart_error": "Cart price is different to {methodName} plan amount.", + "orbital_continue_action": "Place Order", + "orbital_description_text": "Pay using your ChasePay Account", + "payment_cancelled": "Payment was cancelled", + "payment_error": "An error occurred while processing your payment. Please try again.", + "payment_error_heading": "Payment Failed", + "payment_heading": "Payment", + "payment_invalid_error_heading": "Payment Unavailable", + "payment_method_disabled_error": "The selected payment method is no longer valid. Click OK to see the most up-to-date payment methods.", + "payment_method_error": "Response from payment provider: {message}", + "payment_method_invalid_error": "There's a problem processing your payment. Please contact us for assistance or choose another payment method.", + "payment_method_unavailable_error": "This payment provider is temporarily unavailable. Please try again later.", + "payment_not_required_text": "Payment is not required for this order.", + "paypal_continue_action": "Continue with PayPal", + "paypal_pay_later_continue_action": "Continue with Pay Later", + "braintreevenmo_continue_action": "Continue with Venmo", + "paypal_credit_continue_action": "Continue with PayPal Credit", + "paypal_credit_description_text": "Buy Now, Pay Over Time", + "paypal_description_text": "Pay using your PayPal account", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pay Later", + "place_order_action": "Place Order", + "place_order_error": "There was an error placing your order. Please contact us.", + "place_order_error_heading": "Failed to place order", + "postal_code_label": "Postal Code", + "ideal_bic_required": "You must select an issuer to place the order", + "instrument_text": "Stored credit cards", + "instrument_add_card_action": "Use a different card", + "instrument_default_ending_in_text": "Card ending in {endingIn}", + "instrument_ending_in_text": "{cardTitle} ending in {endingIn}", + "instrument_expired_text": "Expired {expiryDate}", + "instrument_expires_text": "Expires {expiryDate}", + "instrument_manage_button": "Manage", + "instrument_manage_modal_confirmation_action": "Yes, delete", + "instrument_manage_modal_confirmation_label": "Are you sure you want to delete this stored payment method?", + "instrument_manage_modal_title_text": "Manage stored payment methods", + "instrument_manage_modal_empty_text": "You do not have any stored payment methods.", + "instrument_manage_table_header_ending_in_text": "Ending in", + "instrument_manage_table_header_expiry_date_text": "Expiry date", + "instrument_manage_table_header_payment_method_text": "Payment method", + "instrument_manage_delete_server_error": "There was an error when attempting to delete that stored payment method, please try again.", + "instrument_manage_delete_auth_error": "There was a problem authorizing your request. Please try signing in again", + "instrument_manage_delete_client_error": "There was an error when attempting to delete the stored payment method: payment method no longer exists or cannot be deleted.", + "instrument_save_payment_method_label": "Save this card for future transactions", + "instrument_save_as_default_payment_method_label": "Use this card as the default payment method for future transactions", + "account_instrument_add_action": "Use a different account", + "account_instrument_save_payment_method_label": "Save this account for future transactions", + "account_instrument_save_as_default_payment_method_label": "Use this account as the default payment method for future transactions", + "account_instrument_text": "Stored accounts", + "account_instrument_new_shipping_address": "We noticed this is a new shipping address.

For security reasons, you will need to re-link your PayPal account when shipping to an address for the first time or if the shipping address was edited recently.

", + "instrument_trusted_shipping_address_text": "This additional security step is applied to your card when shipping to an address for the first time or if the shipping address was edited recently.", + "instrument_trusted_shipping_address_title_text": "Please re-enter your card number to authorize this transaction.", + "quadpay_continue_action": "Continue with Zip", + "quadpay_display_name_text": "Pay in 4 installments (Quadpay)", + "ppsdk_continue_action": "Continue with {methodName}", + "select_your_bank": "Select your bank", + "sepa_account_number": "Account Number (IBAN)", + "sepa_account_number_required": "You must enter your account number (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "BIC must be 8 or 11 characters", + "sepa_mandate_required": "You must accept the mandate form", + "sezzle_display_name_text": "Pay Later. 0% Interest.", + "stripe_sepa_display_name_text": "Sepa Direct Debit.", + "stripe_sepa_mandate_disclaimer": "By providing your IBAN and confirming this payment, you authorise (A) {storeUrl} and Stripe, our payment service provider, to send instructions to your bank to debit your account and (B) your bank to debit your account in accordance with those instructions. You are entitled to a refund from your bank under the terms and conditions of your agreement with your bank. A refund must be claimed within eight weeks starting from the date on which your account was debited.", + "tax_provider_unavailable": "Sales tax could not be calculated. Please try again. If unsuccessful, please reach out to our support team to complete checkout.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continue with Click to pay", + "zip_continue_action": "Continue with Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Own it now, pay later", + "errors": { + "additional_action_required": "Please continue with additional actions.", + "authorization_expired": "The authorization for this transaction has expired.", + "authorization_revoked": "The authorization for this transaction has been revoked.", + "call_issuer": "There was a problem processing your card. Please contact your card issuer.", + "captured_transaction": "Payment for this order has already been made.", + "card_declined": "Payment was declined. Please try a different card.", + "card_error": "Your card details could not be verified. Please double check them and try again.", + "card_replaced": "Unable to process the payment because invalid data was supplied with the transaction.", + "connection_error": "We're experiencing difficulty processing your transaction. Please try again later.", + "duplicate_transaction": "This is a duplicate transaction. Please contact us to confirm your order. Do not try to pay again.", + "expired_card": "Your card has expired. Please try again with a valid card.", + "gateway_error": "Something went wrong on the server. Please try again at a later time.", + "general_error": "Error while processing payment request.", + "hosted_form_error": "Unable to process the payment because invalid data was supplied with the transaction.", + "incorrect_address": "Your billing address couldn't be verified. Please check your billing address details and try again.", + "incorrect_amount": "Unable to process the payment because invalid data was supplied with the transaction.", + "incorrect_cvc": "Your card details could not be verified. Please double check them and try again.", + "incorrect_number": "Your card details could not be verified. Please double check them and try again.", + "incorrect_zip": "Your billing address couldn't be verified. Please check your billing address details and try again.", + "insufficient_funds": "Payment was declined. Please contact your bank.", + "invalid_address": "Your billing address couldn't be verified. Please check your billing address details and try again.", + "invalid_amount": "There was an error while processing your payment. Please try again or contact us.", + "invalid_authorization_code": "There was an error while processing your payment. Please try again or contact us.", + "invalid_create_instrument_request": "Unable to process the payment because invalid data was supplied with the transaction.", + "invalid_cvc": "Your card details could not be verified. Please double check them and try again.", + "invalid_email_address": "Unable to process the payment because invalid email was supplied with the transaction.", + "invalid_expiry_date": "Your card details could not be verified. Please double check them and try again.", + "invalid_expiry_month": "Unable to process the payment because invalid data was supplied with the transaction.", + "invalid_expiry_year": "Unable to process the payment because invalid data was supplied with the transaction.", + "invalid_gateway": "Gateway is invalid.", + "invalid_gateway_options": "Gateway options are invalid.", + "invalid_instrument": "Unable to process the payment because invalid data was supplied with the transaction.", + "invalid_issuer": "Unable to process the payment because invalid data was supplied with the transaction.", + "invalid_number": "Your card details could not be verified. Please double check them and try again.", + "invalid_payment_request": "Unable to process the payment because invalid data was supplied with the transaction.", + "invalid_request_error": "We're experiencing difficulty processing your transaction. Please contact us or try again later.", + "invalid_user_authentication": "There was an error while processing your payment. Please contact us.", + "invalid_zip": "Unable to process the payment because invalid data was supplied with the transaction.", + "journal_error": "Something went wrong on the server. Please try again at a later time.", + "lost_or_stolen_card": "Unable to process the payment because invalid data was supplied with the transaction.", + "missing_test_mode": "Unable to process the request because invalid data was supplied with the transaction.", + "not_found": "We're experiencing difficulty processing your transaction. Please try again later.", + "payment_config_error": "Something went wrong on the server. Please try again at a later time.", + "payment_config_not_found": "Something went wrong on the server. Please try again at a later time.", + "pending_review": "Your transaction was authorized, but is being held for review by the merchant.", + "pickup_card": "Your card cannot be used to make this payment. Please contact your card issuer, or try using a different card.", + "processing_error": "We're experiencing difficulty processing your transaction. Please try again later.", + "provider_configuration_error": "Merchant payment provider is not correctly configured.", + "refund_timelimit_expired": "The time-limit to refund this transaction has expired.", + "refunded_transaction": "This transaction has already been refunded.", + "request_timeout": "Unable to process your payment due to timeout. Please try again.", + "required_field": "Your payment couldn't be verified. Please check your card details and try again.", + "server_error": "There was an error processing your payment and your order couldn't be completed. Please try again.", + "store_instrument_failed": "Unable to process the request. Please try again.", + "stored_payment_instrument_not_found": "That stored payment instrument could not be found. Please try a different payment option.", + "three_d_secure_declined": "There has been an issue with your payment, please check your payment details or contact your card issuer.", + "three_d_secure_failed": "The payment failed. Please try again or use a different payment option.", + "three_d_secure_required": "Further authentication is required to process your payment. Please contact us.", + "token_error": "We're experiencing difficulty processing your transaction. Please try again later.", + "transaction_declined": "Your payment was declined. Please try again.", + "transaction_rejected": "Payment was declined. Please try again.", + "unauthorized": "We're experiencing difficulty processing your transaction. Please try again later.", + "unsupported_currency": "Unable to process the payment because invalid data was supplied with the transaction.", + "unsupported_instrument": "Your card details could not be verified. Please double check them and try again.", + "unsupported_request": "Unable to process the payment because invalid data was supplied with the transaction.", + "user_authorization_error": "There was an error while processing your payment. Please contact us.", + "vaulting_service_unavailable": "Vaulting service is currently not available.", + "voided_transaction": "Unable to process your payment because the transaction has already been voided. Please try again or contact us." + } + }, + "redeemable": { + "applied_text": "Applied", + "apply_action": "Apply", + "apply_store_credit_after_action": "store credit to order", + "apply_store_credit_before_action": "Apply", + "code_invalid_error": "The gift certificate or coupon code is invalid", + "code_label": "Gift Certificate or Coupon Code", + "code_required_error": "Please enter a gift certificate or coupon code", + "coupon_location_error": "Your shipping address doesn't meet the location requirements for the coupon code you entered.", + "coupon_min_order_total": "Your order does not meet the minimum total for this coupon code to be applied.", + "coupon_text": "Coupon", + "gift_certificate_remaining_text": "Remaining", + "gift_certificate_text": "Gift Certificate", + "remove_action": "Remove", + "store_credit_available_text": "Your account currently has {storeCredit} total store credit available", + "toggle_action": "Coupon/Gift Certificate" + }, + "remote": { + "browser_unsupported": "The selected payment method requires a different web browser. Please choose another payment method.", + "connection_error": "Connection to remote checkout refused, please try later.", + "continue_with_text": "Or continue with", + "payment_method_error": "There was an error retrieving your remote payment method. Please try again.", + "select_different_card_action": "Select a different card", + "session_error": "Your remote session has expired. Please log in again.", + "shipping_address_error": "There was an error retrieving your remote shipping address. Please try again.", + "sign_in_action": "Sign in to {providerName}", + "sign_out_action": "Sign out of {providerName}", + "sign_out_after_action": "to view other payment methods", + "sign_in_required_error": "Remote sign in required before payment", + "sign_out_before_action": "" + }, + "shipping": { + "cart_change_error": "An update to your shopping cart has been detected and your available shipping costs have been updated. Please re-select a shipping method to continue.", + "enter_shipping_address_text": "Please enter a shipping address in order to see shipping quotes", + "order_comment_label": "Order Comments", + "assign_item_error": "An error occurred while assigning item to address. Please try again", + "assign_item_invalid_address_error_heading": "Invalid Address", + "assign_item_invalid_address_error": "The selected address is not valid. Please go to your account page and update it.", + "unassign_item_error": "An error occurred while unassigning item to address.", + "save_shipping_address_error": "An error occurred while saving the shipping address to your price quote. Please try again.", + "save_shipping_option_error": "An error occurred while saving the shipping quote to your order. Please try again.", + "select_shipping_address_text": "Please select a shipping address in order to see shipping quotes", + "shipping_address_heading": "Shipping Address", + "multishipping_address_heading": "Choose where to ship each item", + "multishipping_address_heading_guest": "Please sign in first", + "multishipping_guest_intro": "To ship your items to multiple addresses you need to", + "multishipping_guest_sign_in": "sign in to your account", + "multishipping_guest_create": "or create an account prior to proceeding.", + "ship_to_multi": "Ship to multiple addresses", + "ship_to_single": "Ship to a single address", + "shipping_heading": "Shipping", + "shipping_method_label": "Shipping Method", + "shipping_option_expired_error": "The shipping price you were quoted is no longer valid. Click OK to see the most up-to-date shipping prices.", + "shipping_option_expired_heading": "Your shipping price has been updated", + "view_shipping_options_action": "See Other Options" + }, + "social": { + "share_action": "Share", + "share_heading": "Tell your friends about your purchase!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Please click here to verify yourself as human before proceeding." + }, + "privacy_policy": { + "required_error": "Please agree to the Privacy Policy.", + "label": "Yes, I agree with the privacy policy.", + "heading": "Privacy Policy" + }, + "terms_and_conditions": { + "agreement_required_error": "Please agree to the terms and conditions", + "agreement_text": "Yes, I agree with the above terms and conditions.", + "agreement_with_link_text": "Yes, I agree with the terms and conditions.", + "terms_and_conditions_heading": "Terms and Conditions" + }, + "order_confirmation": { + "mandate": { + "checkoutcom": { + "boleto": "Boleto Bancário Ticket", + "oxxo": "OXXO Ticket", + "sepa": "SEPA Direct Debit (via Checkout.com) Mandate Reference: {mandate}" + }, + "stripev3": { + "iban": "SEPA Direct Debit Mandate" + }, + "stripe_upe": { + "boleto": "Boleto Bancário Ticket", + "oxxo": "OXXO Ticket" + }, + "paypalcommercealternativemethods": { + "oxxo": "OXXO Ticket" + } + }, + "order_number_text": "Your order number is {orderNumber}", + "order_pending_review_text": "Your order was sent to us but is currently awaiting payment. Once we receive the payment for your order, it will be completed. If you've already provided payment details then we will process your order manually and send you an email when it's completed.", + "order_pending_status_text": "We've received your order and are processing your payment. Once the payment is verified, your order will be completed. We will send you an email when it's completed. Please note, this process may take a few minutes depending on the processing times of your chosen method. If you have any questions about your purchase, email us at {supportEmail}.", + "order_incomplete_status_text": "We've received your order and payment. Your order is now being processed by our system. Please note, processing may take a few minutes. If you have any questions about your purchase, email us at {supportEmail}.", + "order_with_downloadable_digital_items_text": "You can download your digital purchases by clicking the links on this page, or by logging into your account at any time. There is also a download link in your confirmation email, which should be arriving shortly.", + "order_with_support_number_text": "An email will be sent containing information about your purchase. If you have any questions about your purchase, email us at {supportEmail} or call us at {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Once we receive your payment, we'll send a confirmation email with a link to download your digital purchases.", + "order_without_support_number_text": "An email will be sent containing information about your purchase. If you have any questions about your purchase, email us at {supportEmail}.", + "thank_you_customer_heading": "Thank you {name}!", + "thank_you_heading": "Thank you!", + "continue_shopping": "Continue Shopping »", + "order_status_update_facebook_messenger_heading": "Get instant updates of your order to Messenger" + } + } +} diff --git a/assets/json/es-419.json b/assets/json/es-419.json new file mode 100644 index 000000000..8f78632f9 --- /dev/null +++ b/assets/json/es-419.json @@ -0,0 +1,487 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Dirección", + "address_line_1_required_error": "La dirección es obligatoria", + "address_line_2_label": "Departamento/Interior/Edificio", + "address_line_2_required_error": "Departamento/Interior/Edificio es un campo obligatorio", + "address_not_recognized_heading": "No reconocimos tu dirección", + "consignment_address_updated_text": "El artículo se asignó correctamente a la nueva dirección.", + "city_label": "Ciudad", + "city_required_error": "La ciudad es obligatoria", + "company_name_label": "Nombre de la empresa", + "company_name_required_error": "Empresa es un campo obligatorio", + "confirm_address_action": "Continuar con la dirección actual", + "confirm_address_text": "No pudimos encontrar una coincidencia para la dirección que ingresaste. Confirma la dirección.", + "country_label": "País", + "country_required_error": "País es un campo obligatorio", + "custom_required_error": "{label} es un campo obligatorio", + "custom_min_error": "{label} debe ser mayor que {min}", + "custom_max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "custom_valid_error": "{label} no es válido", + "edit_address_action": "Editar dirección", + "enter_address_action": "Ingresa una nueva dirección", + "add_address_heading": "Agregar dirección", + "save_address_action": "Guardar dirección", + "first_name_label": "Nombre de pila", + "first_name_required_error": "El campo Nombre es obligatorio.", + "last_name_label": "Apellido", + "last_name_required_error": "El campo Apellido es obligatorio.", + "phone_number_label": "Número telefónico", + "phone_number_required_error": "El campo Número de teléfono es obligatorio.", + "postal_code_label": "Código postal", + "postal_code_required_error": "El campo Código postal es obligatorio.", + "save_in_addressbook": "Guardar esta dirección en mi libreta de direcciones.", + "select_country_action": "Seleccionar un país", + "select_state_action": "Seleccionar un estado", + "state_label": "Estado/Provincia", + "state_required_error": "Estado/Provincia es un campo obligatorio.", + "select": "Seleccionar", + "select_all": "Todos", + "select_none": "ninguna" + }, + "billing": { + "billing_address_heading": "Dirección de facturación", + "billing_heading": "Facturación", + "save_billing_address_error": "Ocurrió un error al guardar la dirección de facturación en tu cotización. Vuelve a intentarlo.", + "billing_address_amazon": "Misma que la dirección de facturación que estableciste en tu cuenta de Amazon.", + "billing_address_amazonpay": "Administrado por Amazon Pay", + "use_shipping_address_label": "Mi dirección de facturación es la misma que mi dirección de envío." + }, + "cart": { + "billed_amount_text": "*Se te cobrará y facturará {total} ({code}) por este pedido.", + "based_on_currency_text": "Con base en {total} {code}", + "cart_heading": "Resumen del pedido", + "digital_item_text": "Elemento digital", + "discount_text": "Descuento", + "downloads_action": "Ir a Descargas", + "edit_cart_action": "Editar carrito", + "estimated_total_text": "Total estimado", + "free_text": "Gratuito", + "gift_certificate_text": "Certificado de regalo", + "handling_text": "Manipulación", + "item_count_text": "{count, plural, one{1 Artículo} other{# Artículos} }", + "print_action": "Imprimir", + "remaining_text": "Restante", + "remove_action": "Quitar", + "see_all_action": "Ver todo", + "see_less_action": "Ver menos", + "shipping_text": "Envío", + "gift_wrapping_text": "Envoltura de regalo", + "show_details_action": "Mostrar detalles", + "store_credit_text": "Crédito de la tienda", + "subtotal_text": "Subtotal", + "taxes_text": "Impuestos", + "total_text": "Total", + "empty_cart_message": "Tu carrito está vacío; se te está redirigiendo. Haz clic aquí si tu navegador no te redirige." + }, + "common": { + "cancel_action": "Cancelar", + "close_action": "Cerrar", + "continue_action": "Continúa", + "edit_action": "Editar", + "delete_action": "Eliminar", + "error_heading": "Se produjo un error", + "leave_warning": "¿Estás seguro de que deseas salir? Es posible que no se guarden los datos que ingresaste.", + "loading_text": "Cargando", + "ok_action": "De acuerdo", + "error_code": "Código de error:", + "request_id": "ID de solicitud:", + "optional_text": "(Opcional)", + "unavailable_error": "El proceso de pago no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "unavailable_heading": "El proceso de pago no está disponible temporalmente", + "unstable_network_error": "Al parecer, el servidor está tardando demasiado en responder; esto puede deberse a una mala conexión o un error con nuestros servidores. Vuelve a intentarlo en un momento.", + "order_loading_error": "Ocurrió un error al cargar tu pedido. Vuelve a intentarlo.", + "order_fatal_error_heading": "Ocurrió un error al colocar tu pedido", + "order_fatal_error_extra": "Elige otro método de pago o contáctanos para obtener más ayuda.", + "go_back": "Volver", + "show_more": "Mostrar más" + }, + "customer": { + "checkout_as_guest_text": "¿Vas a realizar el pago como invitado? Podrás guardar tus datos para crear una cuenta con nosotros después.", + "continue_as_guest_action": "Continuar como invitado", + "create_account_action": "Crear cuenta", + "continue": "Continúa", + "set_password_action": "Guardar contraseña", + "required_error": "{label} es un campo obligatorio", + "min_error": "{label} debe ser mayor que {min}", + "max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "create_account_error": "Ocurrió un error al crear tu cuenta. Vuelve a intentarlo.", + "create_address_error": "Sin embargo, ocurrió un error al guardar la dirección en tu libreta de direcciones.", + "create_account_requirements_error_heading": "La contraseña no cumple con los requisitos", + "create_account_success": "Se creó tu cuenta.", + "set_password_success": "Se guardó tu contraseña.", + "create_account_text": "Crear una cuenta para pagar más rápido en futuras ocasiones", + "set_password_text": "Configurar una contraseña para pagar más rápido en futuras ocasiones", + "account_created_text": "Se creó una cuenta para ti, pero tendrás que configurar una contraseña para iniciar sesión.", + "create_account_to_continue_text": "¿No tienes una cuenta? Crea una cuenta para continuar.", + "guest_could_login": "Parece que tienes una cuenta. Inicia sesión con {email} para realizar un pago más rápido.", + "guest_must_login": "Parece que tienes una cuenta. Inicia sesión para continuar con {email} o utiliza otro correo electrónico.", + "guest_temporary_disabled": "El proceso de pago como invitado está desactivado temporalmente. Inicia sesión o crea una cuenta para continuar.", + "customer_heading": "Cliente", + "email_invalid_error": "La dirección de correo electrónico debe ser válida", + "email_label": "Dirección de correo electrónico", + "email_required_error": "La dirección de correo electrónico es obligatoria", + "forgot_password_action": "¿Olvidaste la contraseña?", + "guest_customer_text": "Cliente invitado", + "guest_subscribe_to_newsletter_text": "Suscríbete a nuestro boletín informativo.", + "guest_marketing_consent": "Me gustaría recibir novedades y ofertas.", + "login_action": "Inicia sesión ahora", + "login_text": "¿Ya tienes una cuenta?", + "email_in_use_text": "Ya existe una cuenta para {email}. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "unknown_email_in_use_text": "Ya existe una cuenta para el correo electrónico proporcionado. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "guest_could_login_change_email": "¿No es {email}? Cambiar correo electrónico.", + "password_confirmation_error": "Las contraseñas no coinciden", + "password_confirmation_label": "Confirmar contraseña", + "password_confirmation_required_error": "Este campo es obligatorio", + "password_label": "Contraseña", + "password_letter_required_error": "La contraseña debe contener una letra", + "password_minimum_character_label": "mínimo de caracteres, distingue entre mayúsculas y minúsculas", + "password_number_required_error": "La contraseña debe contener un número", + "password_over_maximum_length_error": "La contraseña es demasiado larga", + "password_required_error": "Se requiere la contraseña", + "password_under_minimum_length_error": "La contraseña es demasiado corta", + "reset_password_before_login_error": "El inicio de sesión no está disponible en este momento. Recibirás un correo electrónico en los próximos 5 minutos con instrucciones para restablecer tu contraseña. Si no recibes este correo electrónico, verifica tu carpeta de correo no deseado o contáctanos para obtener más ayuda.", + "returning_customer_text": "Cliente habitual", + "sign_in_action": "Iniciar sesión", + "sign_in_error": "El correo electrónico o la contraseña que ingresaste no son válidos.", + "sign_in_throttled_error": "Debido a que hubo muchos intentos de inicio de sesión, espera 10 segundos antes de intentar iniciar la sesión de nuevo.", + "sign_out_action": "Cerrar sesión", + "sign_out_error": "Ocurrió un error al cerrar la sesión. Vuelve a intentarlo.", + "subscribe_to_newsletter_text": "Sí, me gustaría recibir actualizaciones.", + "suggestion_text": "Al parecer, tienes una cuenta con {provider}. Para un realizar un pago rápido, continúa con {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "No pudimos enviarte un enlace de inicio de sesión. Vuelve a intentarlo.", + "error_not_found": "El correo electrónico ingresado no está asociado a una cuenta. Inténtalo con otro correo electrónico.", + "sent_header": "Revisa tu bandeja de entrada", + "sent_text": "Enviamos un correo electrónico a {email} que contiene un vínculo de inicio de sesión. Esto vencerá en {minutes} minutos. Si no lo ves en tu bandeja de entrada, revisa tu carpeta de correo no deseado.", + "text": "Ingresa la dirección de correo electrónico asociada a tu cuenta. Te enviaremos un enlace de inicio de sesión.", + "header": "Ingresa tu dirección de correo electrónico", + "header_with_email": "Confirma tu dirección de correo electrónico", + "link": "En su lugar, necesito que se me envíe un enlace de inicio de sesión.", + "use_another_email": "Usar otro correo electrónico", + "send": "Enviar", + "error_temporary_disabled": "La funcionalidad del enlace de inicio de sesión no está disponible temporalmente. Inicia sesión con tu contraseña.", + "resend_link": "¿No recibiste el correo electrónico? Volver a enviar el enlace", + "use_password_link": " o inicia sesión con tu contraseña en su lugar." + }, + "embedded_checkout": { + "unsupported_error": "Los siguientes métodos de pago no son compatibles con el pago integrado: {methods}. Comunícate con nosotros para obtener ayuda." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Paga después", + "affirm_body_text": "Se te redirigirá a Affirm para completar de forma segura tu compra. Simplemente, proporciona algunos datos básicos y obtén una decisión en tiempo real. La verificación de tu elegibilidad no afectará tu puntaje crediticio.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Pagar con Afterpay", + "amazon_continue_action": "Continuar con Amazon", + "amazonpay_continue_action": "Continuar con Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continúa", + "bluesnap_v2_continue_action": "Continúa", + "bolt_benefit_1": "Compra cientos de marcas con un inicio de sesión sin requerir una contraseña", + "bolt_benefit_2": "Procesar el pago utilizando los detalles de pago y envío guardados", + "bolt_benefit_3": "Recibe los beneficios de la seguridad de la cuenta que cumple con las PCI", + "bolt_checkbox_agreement": "Guardar mi información, crear una cuenta de Bolt y aceptar los Términos de uso y la Política de privacidad de Bolt.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continuar con Visa Checkout", + "ccavenuemars_description_text": "Pagar con CCAvenue", + "chasepay_continue_action": "Continuar con Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Editar tarjeta", + "chasepay_logout": "Cerrar sesión en Chase Pay", + "chasepay_fail_load": "No se pudo cargar Chase Pay", + "checkoutcom_document_label_boleto": "CPF o CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "ID nacional", + "checkoutcom_document_invalid_error_boleto": "El CPF o CNPJ debe tener entre 11 y 14 caracteres", + "checkoutcom_document_invalid_error_oxxo": "La CURP debe tener como máximo 18 caracteres", + "checkoutcom_document_invalid_error_qpay": "El ID nacional debe tener un máximo de 32 caracteres", + "checkoutcom_fawry_customer_mobile_invalid_error": "El número de teléfono móvil debe ser válido", + "checkoutcom_fawry_customer_mobile_label": "Número de teléfono móvil", + "checkoutcom_fawry_customer_email_invalid_error": "La dirección de correo electrónico debe ser válida", + "checkoutcom_fawry_customer_email_label": "Correo electrónico", + "checkoutcom_sepa_creditor_title": "Acreedor", + "checkoutcom_sepa_creditor_id": "ID del acreedor: {creditorId}", + "checkoutcom_sepa_debtor_title": "Deudor", + "checkoutcom_sepa_mandate_disclaimer": "Al aceptar este formulario de mandato, autorizas a {creditorName} a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y a tu banco para que realice el cargo en tu cuenta de acuerdo con dichas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "checkoutcom_sepa_payment_type": "Tipo de pago: único (no recurrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Tarjeta de crédito", + "credit_card_customer_code_label": "Código de cliente", + "credit_card_cvv_help_text": "Para VISA y Mastercard, el CVV es un código de tres dígitos impreso en el reverso. Para American Express, es el código de cuatro dígitos impreso en el anverso. El CVV es una medida de seguridad para garantizar que tienes la tarjeta en tu poder.", + "credit_card_cvv_invalid_error": "El CVV debe ser válido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "El CVV es obligatorio", + "credit_card_expiration_invalid_error": "La fecha de vencimiento debe ser una fecha futura válida en el formato MM/YY", + "credit_card_expiration_label": "Vencimiento", + "credit_card_expiration_date_label": "Fecha de vencimiento", + "credit_card_expiration_required_error": "La fecha de vencimiento es obligatoria", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nombre que aparece en la tarjeta", + "credit_card_name_required_error": "El nombre completo es obligatorio", + "credit_card_number_invalid_error": "El número de tarjeta de crédito debe ser válido", + "credit_card_number_label": "Número de tarjeta de crédito", + "credit_card_number_last_four": "Ingresa el número de la tarjeta de {cardType} con terminación en {lastFour}", + "credit_card_number_required_error": "El número de tarjeta de crédito es obligatorio", + "credit_card_number_mismatch_error": "El número de tarjeta que se ingresó no coincide con la tarjeta guardada en tu cuenta", + "credit_debit_card_text": "Tarjeta de débito/crédito", + "digitalriver_dropin_error": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "digitalriver_checkout_error": "Hubo un problema con tu proceso de pago; revisa tus datos e inténtalo de nuevo o ponte en contacto con el servicio de atención al cliente", + "digitalriver_checkout_error_title": "Error al procesar la solicitud.", + "digitalriver_display_name_text": "Selecciona tu método de pago", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm no puede procesar el pago de este pedido; selecciona otro método de pago.", + "klarna_continue_action": "Continuar con Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuar con {methodName}", + "opy_widget_slogan": "Compra ahora. Paga de manera más inteligente.", + "opy_widget_info": "Se te redirigirá al sitio web de {methodName} para que completes tu pedido cuando hagas clic en “Continuar con {methodName}“", + "orbital_continue_action": "Realizar pedido", + "orbital_description_text": "Paga con tu cuenta de ChasePay", + "payment_cancelled": "El pago fue cancelado", + "payment_error": "Ocurrió un error al procesar tu pago. Vuelve a intentarlo.", + "payment_error_heading": "Error en el pago", + "payment_heading": "Pago", + "payment_invalid_error_heading": "Pago no disponible", + "payment_method_disabled_error": "El método de pago seleccionado ya no es válido. Haz clic en Aceptar para ver los métodos de pago más actualizados.", + "payment_method_error": "Respuesta del proveedor de pagos: {message}", + "payment_method_invalid_error": "Hay un problema al procesar tu pago. Ponte en contacto con nosotros para obtener ayuda o elige otra forma de pago.", + "payment_method_unavailable_error": "Este proveedor de pagos no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "payment_not_required_text": "No se requiere el pago para este pedido.", + "paypal_continue_action": "Continuar con PayPal", + "braintreevenmo_continue_action": "Continuar con Venmo", + "paypal_credit_continue_action": "Continuar con PayPal Credit", + "paypal_credit_description_text": "Compra ahora y paga después", + "paypal_description_text": "Pagar con tu cuenta de PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pagar después", + "place_order_action": "Realizar pedido", + "place_order_error": "Ocurrió un error al colocar tu pedido. Ponte en contacto con nosotros.", + "place_order_error_heading": "No se pudo realizar el pedido", + "postal_code_label": "Código postal", + "ideal_bic_required": "Debes seleccionar un emisor para realizar el pedido", + "instrument_text": "Almacenamiento de tarjetas de crédito", + "instrument_add_card_action": "Usar una tarjeta diferente", + "instrument_default_ending_in_text": "Tarjeta con terminación en {endingIn}", + "instrument_ending_in_text": "{cardTitle} con terminación en {endingIn}", + "instrument_expired_text": "Venció el {expiryDate}", + "instrument_expires_text": "Vence el {expiryDate}", + "instrument_manage_button": "manejar", + "instrument_manage_modal_confirmation_action": "Sí, eliminar", + "instrument_manage_modal_confirmation_label": "¿Estás seguro de que deseas eliminar este método de pago guardado?", + "instrument_manage_modal_title_text": "Administrar métodos de pago guardados", + "instrument_manage_modal_empty_text": "No tienes ningún método de pago guardado.", + "instrument_manage_table_header_ending_in_text": "Con terminación en", + "instrument_manage_table_header_expiry_date_text": "Fecha de vencimiento", + "instrument_manage_table_header_payment_method_text": "Método de pago", + "instrument_manage_delete_server_error": "Ocurrió un error al intentar eliminar ese método de pago almacenado. Vuelve a intentarlo.", + "instrument_manage_delete_auth_error": "Ocurrió un problema al autorizar tu solicitud. Vuelve a intentar iniciar sesión.", + "instrument_manage_delete_client_error": "Ocurrió un error al intentar eliminar el método de pago guardado: el método de pago ya no existe o no se puede eliminar.", + "instrument_save_payment_method_label": "Guardar esta tarjeta para futuras transacciones", + "instrument_save_as_default_payment_method_label": "Utilizar esta tarjeta como método de pago predeterminado para transacciones futuras", + "account_instrument_add_action": "Usar una cuenta diferente", + "account_instrument_save_payment_method_label": "Guardar esta cuenta para transacciones futuras", + "account_instrument_save_as_default_payment_method_label": "Usar esta cuenta como forma de pago predeterminada para transacciones futuras", + "account_instrument_text": "Cuentas guardadas", + "account_instrument_new_shipping_address": "Notamos que esta es una nueva dirección de envío.

Por razones de seguridad, deberás volver a vincular tu cuenta de PayPal cuando realices un envío a una dirección por primera vez o si la dirección de envío se modificó recientemente.

", + "instrument_trusted_shipping_address_text": "Este paso de seguridad adicional se aplica a tu tarjeta cuando realizas el envío a una dirección por primera vez o si la dirección de envío se editó recientemente.", + "instrument_trusted_shipping_address_title_text": "Vuelve a ingresar tu número de tarjeta para autorizar esta transacción.", + "quadpay_continue_action": "Continuar con Zip", + "quadpay_display_name_text": "Pagar en 4 plazos (Quadpay)", + "ppsdk_continue_action": "Continuar con {methodName}", + "select_your_bank": "Selecciona tu banco", + "sepa_account_number": "Número de cuenta (IBAN)", + "sepa_account_number_required": "Debes ingresar tu número de cuenta (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "El BIC debe tener 8 u 11 caracteres", + "sepa_mandate_required": "Debes aceptar el formulario de mandato", + "sezzle_display_name_text": "Paga después. 0% de interés.", + "stripe_sepa_display_name_text": "Sepa Direct Debit.", + "stripe_sepa_mandate_disclaimer": "Al proporcionar tu IBAN y confirmar este pago, autorizas a (A) {storeUrl} y a Stripe, nuestro proveedor de servicios de pago, a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y (B) a tu banco para que realice el cargo en tu cuenta de acuerdo con esas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "tax_provider_unavailable": "No se pudo calcular el impuesto sobre las ventas. Vuelve a intentarlo. Si persiste el problema, ponte en contacto con nuestro equipo de asistencia para completar el proceso de pago.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continuar con Click to pay", + "zip_continue_action": "Continuar con Zip", + "zip_name_text": "Código postal", + "zip_display_name_text": "Compra ahora, paga después", + "errors": { + "additional_action_required": "Continúa con acciones adicionales.", + "authorization_expired": "La autorización para esta transacción ha vencido.", + "authorization_revoked": "Se revocó la autorización para esta transacción.", + "call_issuer": "Hubo un problema al procesar su tarjeta. Póngase en contacto con el emisor de su tarjeta.", + "captured_transaction": "Ya se realizó el pago de este pedido.", + "card_declined": "El pago fue rechazado. Intente con una tarjeta diferente.", + "card_error": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "card_replaced": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "connection_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "duplicate_transaction": "Ésta es una transacción duplicada. Comuníquese con nosotros para confirmar su pedido. No intente pagar de nuevo.", + "expired_card": "Su tarjeta ha vencido. Inténtelo de nuevo con una tarjeta válida.", + "gateway_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "general_error": "Error al procesar la solicitud de pago.", + "hosted_form_error": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "incorrect_amount": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_zip": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "insufficient_funds": "El pago fue rechazado. Póngase en contacto con su banco.", + "invalid_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "invalid_amount": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_authorization_code": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_create_instrument_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_email_address": "No se pudo procesar el pago porque se proporcionó un correo electrónico no válido con la transacción.", + "invalid_expiry_date": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_expiry_month": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_expiry_year": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_gateway": "El portal de pago no es válido.", + "invalid_gateway_options": "Las opciones del portal de pago no son válidas.", + "invalid_instrument": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_issuer": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_payment_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_request_error": "En este momento tenemos dificultades para procesar tu transacción. Ponte en contacto con nosotros o inténtalo de nuevo más tarde.", + "invalid_user_authentication": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "invalid_zip": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "journal_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "lost_or_stolen_card": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "missing_test_mode": "No se puede procesar la solicitud porque se proporcionaron datos no válidos con la transacción.", + "not_found": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "payment_config_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "payment_config_not_found": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "pending_review": "Su transacción fue autorizada, pero está retenida por el comerciante para su revisión.", + "pickup_card": "Su tarjeta no puede ser utilizada para hacer este pago. Póngase en contacto con el emisor de su tarjeta o inténtelo con otra tarjeta.", + "processing_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "provider_configuration_error": "El proveedor de pagos del comerciante no está configurado correctamente.", + "refund_timelimit_expired": "El límite de tiempo para reembolsar esta transacción ya venció.", + "refunded_transaction": "Esta transacción ya se reembolsó.", + "request_timeout": "Su pago no pudo ser procesado debido al tiempo de espera. Intente de nuevo.", + "required_field": "No se pudo verificar tu pago. Revisa los detalles de tu tarjeta y vuelve a intentarlo.", + "server_error": "Hubo un error al procesar tu pago y tu pedido no pudo completarse. Vuelve a intentarlo.", + "store_instrument_failed": "No se puede procesar la solicitud. Vuelve a intentarlo.", + "stored_payment_instrument_not_found": "No se pudo encontrar ese instrumento de pago guardado. Inténtalo con otra opción de pago.", + "three_d_secure_declined": "Ha habido un problema con tu pago: revisa tus detalles de pago o comunícate con el emisor de tu tarjeta.", + "three_d_secure_failed": "Error en el pago. Vuelve a intentarlo o utiliza una opción de pago diferente.", + "three_d_secure_required": "Se requiere autenticación adicional para procesar su pago. Póngase en contacto con nosotros.", + "token_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "transaction_declined": "Su pago fue rechazado. Intente de nuevo.", + "transaction_rejected": "El pago fue rechazado. Vuelva a intentarlo.", + "unauthorized": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "unsupported_currency": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "unsupported_instrument": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "unsupported_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "user_authorization_error": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "vaulting_service_unavailable": "El servicio de bóveda no está disponible actualmente.", + "voided_transaction": "Su pago no pudo ser procesado debido a que la transacción ya se anuló. Inténtelo de nuevo o póngase en contacto con nosotros." + } + }, + "redeemable": { + "applied_text": "Aplicado", + "apply_action": "Aplicar", + "apply_store_credit_after_action": "crédito de la tienda para hacer un pedido", + "apply_store_credit_before_action": "Aplicar", + "code_invalid_error": "El certificado de regalo o el código de cupón no es válido", + "code_label": "Certificado de regalo o código de cupón", + "code_required_error": "Ingresa un certificado de regalo o un código de cupón", + "coupon_location_error": "Tu dirección de envío no cumple con los requisitos de ubicación para el código de cupón que ingresaste.", + "coupon_min_order_total": "Tu pedido no alcanza el total mínimo para que se aplique este código de cupón.", + "coupon_text": "Cupón", + "gift_certificate_remaining_text": "Restante", + "gift_certificate_text": "Certificado de regalo", + "remove_action": "Quitar", + "store_credit_available_text": "Actualmente, tu cuenta tiene {storeCredit} de crédito total de la tienda disponible", + "toggle_action": "Cupón/Certificado de regalo" + }, + "remote": { + "browser_unsupported": "El método de pago seleccionado requiere un navegador web diferente. Elige otro método de pago.", + "connection_error": "Se rechazó la conexión con el proceso de pago remoto. Vuelve a intentarlo más tarde.", + "continue_with_text": "O continúa con", + "payment_method_error": "Ocurrió un error al recuperar tu método de pago remoto. Vuelve a intentarlo.", + "select_different_card_action": "Selecciona una tarjeta diferente", + "session_error": "Tu sesión remota ya venció. Vuelve a iniciar sesión.", + "shipping_address_error": "Ocurrió un error al recuperar tu dirección de envío remota. Vuelve a intentarlo.", + "sign_in_action": "Inicia sesión en {providerName}", + "sign_out_action": "Cierra sesión en {providerName}", + "sign_out_after_action": "para ver otros métodos de pago", + "sign_in_required_error": "Se requiere inicio de sesión remoto antes del pago" + }, + "shipping": { + "cart_change_error": "Se detectó una actualización en tu carrito de compras y se actualizaron tus costos de envío disponibles. Vuelve a seleccionar un método de envío para continuar.", + "enter_shipping_address_text": "Ingresa una dirección de envío para ver las cotizaciones de envío", + "order_comment_label": "Comentarios del pedido", + "assign_item_error": "Ocurrió un error al asignar el elemento a la dirección. Vuelve a intentarlo.", + "assign_item_invalid_address_error_heading": "Dirección no válida", + "assign_item_invalid_address_error": "La dirección seleccionada no es válida. Ve a la página de tu cuenta y actualízala.", + "unassign_item_error": "Ocurrió un error al cancelar la asignación del artículo a la dirección.", + "save_shipping_address_error": "Ocurrió un error al guardar la dirección de envío en tu cotización. Vuelve a intentarlo.", + "save_shipping_option_error": "Ocurrió un error al guardar la cotización de envío en tu pedido. Vuelve a intentarlo.", + "select_shipping_address_text": "Selecciona una dirección de envío para ver las cotizaciones de envío", + "shipping_address_heading": "Dirección de envío", + "multishipping_address_heading": "Elige a dónde enviar cada artículo", + "multishipping_address_heading_guest": "Inicia sesión primero", + "multishipping_guest_intro": "Para enviar tus artículos a varias direcciones, debes", + "multishipping_guest_sign_in": "iniciar sesión en tu cuenta", + "multishipping_guest_create": "o crea una cuenta antes de continuar.", + "ship_to_multi": "Enviar a varias direcciones", + "ship_to_single": "Enviar a una sola dirección", + "shipping_heading": "Envío", + "shipping_method_label": "Método de envío", + "shipping_option_expired_error": "El precio de envío que se te indicó ya no es válido. Haz clic en Aceptar para ver los precios de envío más actualizados.", + "shipping_option_expired_heading": "Se actualizó tu precio de envío", + "view_shipping_options_action": "Ver otras opciones" + }, + "social": { + "share_action": "Compartir", + "share_heading": "¡Cuéntale a tus amigos sobre tu compra!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Haz clic aquí para confirmar que eres una persona antes de continuar." + }, + "privacy_policy": { + "required_error": "Acepta la Política de Privacidad.", + "label": "Sí, acepto la Política de Privacidad.", + "heading": "Política de Privacidad" + }, + "terms_and_conditions": { + "agreement_required_error": "Acepta los términos y condiciones.", + "agreement_text": "Sí, acepto los términos y condiciones anteriores.", + "agreement_with_link_text": "Sí, acepto los términos y condiciones.", + "terms_and_conditions_heading": "Términos y condiciones" + }, + "order_confirmation": { + "mandate": { + "checkoutcom": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO", + "sepa": "SEPA Direct Debit (a través de Checkout.com) Referencia de la orden: {mandate}" + }, + "stripev3": { + "iban": "Orden de débito directo SEPA" + }, + "stripe_upe": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO" + } + }, + "order_number_text": "Tu número de pedido es {orderNumber}", + "order_pending_review_text": "Ya se nos envió tu pedido, pero actualmente estamos en espera del pago. Una vez que lo recibamos, se completará tu pedido. Si ya proporcionaste los detalles del pago, procesaremos tu pedido manualmente y te enviaremos un correo electrónico cuando esté completo.", + "order_pending_status_text": "Hemos recibido tu pedido y estamos procesando tu pago. Una vez que se haya verificado el pago, se completará tu pedido. Te enviaremos un correo electrónico cuando se haya completado. Ten en cuenta que este proceso puede tardar unos minutos, dependiendo de los tiempos de procesamiento del método elegido. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_incomplete_status_text": "Hemos recibido tu pedido y tu pago. Nuestro sistema está procesando tu pedido. Ten en cuenta que el procesamiento puede tardar unos minutos. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_with_downloadable_digital_items_text": "Puedes descargar tus compras digitales haciendo clic en los enlaces de esta página o iniciando sesión en tu cuenta en cualquier momento. También hay un enlace de descarga en tu correo electrónico de confirmación, que debería llegarte en breve.", + "order_with_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes preguntas sobre tu compra, envíanos un correo electrónico a {supportEmail} o llámanos al {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Una vez que recibamos tu pago, te enviaremos un correo electrónico de confirmación con un enlace para descargar tus compras digitales.", + "order_without_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "thank_you_customer_heading": "¡Gracias, {name}!", + "thank_you_heading": "¡Muchas gracias!", + "continue_shopping": "Seguir comprando »", + "order_status_update_facebook_messenger_heading": "Recibe actualizaciones al instante de tu pedido en Messenger" + } + } +} diff --git a/assets/json/es-AR.json b/assets/json/es-AR.json new file mode 100644 index 000000000..8f78632f9 --- /dev/null +++ b/assets/json/es-AR.json @@ -0,0 +1,487 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Dirección", + "address_line_1_required_error": "La dirección es obligatoria", + "address_line_2_label": "Departamento/Interior/Edificio", + "address_line_2_required_error": "Departamento/Interior/Edificio es un campo obligatorio", + "address_not_recognized_heading": "No reconocimos tu dirección", + "consignment_address_updated_text": "El artículo se asignó correctamente a la nueva dirección.", + "city_label": "Ciudad", + "city_required_error": "La ciudad es obligatoria", + "company_name_label": "Nombre de la empresa", + "company_name_required_error": "Empresa es un campo obligatorio", + "confirm_address_action": "Continuar con la dirección actual", + "confirm_address_text": "No pudimos encontrar una coincidencia para la dirección que ingresaste. Confirma la dirección.", + "country_label": "País", + "country_required_error": "País es un campo obligatorio", + "custom_required_error": "{label} es un campo obligatorio", + "custom_min_error": "{label} debe ser mayor que {min}", + "custom_max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "custom_valid_error": "{label} no es válido", + "edit_address_action": "Editar dirección", + "enter_address_action": "Ingresa una nueva dirección", + "add_address_heading": "Agregar dirección", + "save_address_action": "Guardar dirección", + "first_name_label": "Nombre de pila", + "first_name_required_error": "El campo Nombre es obligatorio.", + "last_name_label": "Apellido", + "last_name_required_error": "El campo Apellido es obligatorio.", + "phone_number_label": "Número telefónico", + "phone_number_required_error": "El campo Número de teléfono es obligatorio.", + "postal_code_label": "Código postal", + "postal_code_required_error": "El campo Código postal es obligatorio.", + "save_in_addressbook": "Guardar esta dirección en mi libreta de direcciones.", + "select_country_action": "Seleccionar un país", + "select_state_action": "Seleccionar un estado", + "state_label": "Estado/Provincia", + "state_required_error": "Estado/Provincia es un campo obligatorio.", + "select": "Seleccionar", + "select_all": "Todos", + "select_none": "ninguna" + }, + "billing": { + "billing_address_heading": "Dirección de facturación", + "billing_heading": "Facturación", + "save_billing_address_error": "Ocurrió un error al guardar la dirección de facturación en tu cotización. Vuelve a intentarlo.", + "billing_address_amazon": "Misma que la dirección de facturación que estableciste en tu cuenta de Amazon.", + "billing_address_amazonpay": "Administrado por Amazon Pay", + "use_shipping_address_label": "Mi dirección de facturación es la misma que mi dirección de envío." + }, + "cart": { + "billed_amount_text": "*Se te cobrará y facturará {total} ({code}) por este pedido.", + "based_on_currency_text": "Con base en {total} {code}", + "cart_heading": "Resumen del pedido", + "digital_item_text": "Elemento digital", + "discount_text": "Descuento", + "downloads_action": "Ir a Descargas", + "edit_cart_action": "Editar carrito", + "estimated_total_text": "Total estimado", + "free_text": "Gratuito", + "gift_certificate_text": "Certificado de regalo", + "handling_text": "Manipulación", + "item_count_text": "{count, plural, one{1 Artículo} other{# Artículos} }", + "print_action": "Imprimir", + "remaining_text": "Restante", + "remove_action": "Quitar", + "see_all_action": "Ver todo", + "see_less_action": "Ver menos", + "shipping_text": "Envío", + "gift_wrapping_text": "Envoltura de regalo", + "show_details_action": "Mostrar detalles", + "store_credit_text": "Crédito de la tienda", + "subtotal_text": "Subtotal", + "taxes_text": "Impuestos", + "total_text": "Total", + "empty_cart_message": "Tu carrito está vacío; se te está redirigiendo. Haz clic aquí si tu navegador no te redirige." + }, + "common": { + "cancel_action": "Cancelar", + "close_action": "Cerrar", + "continue_action": "Continúa", + "edit_action": "Editar", + "delete_action": "Eliminar", + "error_heading": "Se produjo un error", + "leave_warning": "¿Estás seguro de que deseas salir? Es posible que no se guarden los datos que ingresaste.", + "loading_text": "Cargando", + "ok_action": "De acuerdo", + "error_code": "Código de error:", + "request_id": "ID de solicitud:", + "optional_text": "(Opcional)", + "unavailable_error": "El proceso de pago no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "unavailable_heading": "El proceso de pago no está disponible temporalmente", + "unstable_network_error": "Al parecer, el servidor está tardando demasiado en responder; esto puede deberse a una mala conexión o un error con nuestros servidores. Vuelve a intentarlo en un momento.", + "order_loading_error": "Ocurrió un error al cargar tu pedido. Vuelve a intentarlo.", + "order_fatal_error_heading": "Ocurrió un error al colocar tu pedido", + "order_fatal_error_extra": "Elige otro método de pago o contáctanos para obtener más ayuda.", + "go_back": "Volver", + "show_more": "Mostrar más" + }, + "customer": { + "checkout_as_guest_text": "¿Vas a realizar el pago como invitado? Podrás guardar tus datos para crear una cuenta con nosotros después.", + "continue_as_guest_action": "Continuar como invitado", + "create_account_action": "Crear cuenta", + "continue": "Continúa", + "set_password_action": "Guardar contraseña", + "required_error": "{label} es un campo obligatorio", + "min_error": "{label} debe ser mayor que {min}", + "max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "create_account_error": "Ocurrió un error al crear tu cuenta. Vuelve a intentarlo.", + "create_address_error": "Sin embargo, ocurrió un error al guardar la dirección en tu libreta de direcciones.", + "create_account_requirements_error_heading": "La contraseña no cumple con los requisitos", + "create_account_success": "Se creó tu cuenta.", + "set_password_success": "Se guardó tu contraseña.", + "create_account_text": "Crear una cuenta para pagar más rápido en futuras ocasiones", + "set_password_text": "Configurar una contraseña para pagar más rápido en futuras ocasiones", + "account_created_text": "Se creó una cuenta para ti, pero tendrás que configurar una contraseña para iniciar sesión.", + "create_account_to_continue_text": "¿No tienes una cuenta? Crea una cuenta para continuar.", + "guest_could_login": "Parece que tienes una cuenta. Inicia sesión con {email} para realizar un pago más rápido.", + "guest_must_login": "Parece que tienes una cuenta. Inicia sesión para continuar con {email} o utiliza otro correo electrónico.", + "guest_temporary_disabled": "El proceso de pago como invitado está desactivado temporalmente. Inicia sesión o crea una cuenta para continuar.", + "customer_heading": "Cliente", + "email_invalid_error": "La dirección de correo electrónico debe ser válida", + "email_label": "Dirección de correo electrónico", + "email_required_error": "La dirección de correo electrónico es obligatoria", + "forgot_password_action": "¿Olvidaste la contraseña?", + "guest_customer_text": "Cliente invitado", + "guest_subscribe_to_newsletter_text": "Suscríbete a nuestro boletín informativo.", + "guest_marketing_consent": "Me gustaría recibir novedades y ofertas.", + "login_action": "Inicia sesión ahora", + "login_text": "¿Ya tienes una cuenta?", + "email_in_use_text": "Ya existe una cuenta para {email}. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "unknown_email_in_use_text": "Ya existe una cuenta para el correo electrónico proporcionado. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "guest_could_login_change_email": "¿No es {email}? Cambiar correo electrónico.", + "password_confirmation_error": "Las contraseñas no coinciden", + "password_confirmation_label": "Confirmar contraseña", + "password_confirmation_required_error": "Este campo es obligatorio", + "password_label": "Contraseña", + "password_letter_required_error": "La contraseña debe contener una letra", + "password_minimum_character_label": "mínimo de caracteres, distingue entre mayúsculas y minúsculas", + "password_number_required_error": "La contraseña debe contener un número", + "password_over_maximum_length_error": "La contraseña es demasiado larga", + "password_required_error": "Se requiere la contraseña", + "password_under_minimum_length_error": "La contraseña es demasiado corta", + "reset_password_before_login_error": "El inicio de sesión no está disponible en este momento. Recibirás un correo electrónico en los próximos 5 minutos con instrucciones para restablecer tu contraseña. Si no recibes este correo electrónico, verifica tu carpeta de correo no deseado o contáctanos para obtener más ayuda.", + "returning_customer_text": "Cliente habitual", + "sign_in_action": "Iniciar sesión", + "sign_in_error": "El correo electrónico o la contraseña que ingresaste no son válidos.", + "sign_in_throttled_error": "Debido a que hubo muchos intentos de inicio de sesión, espera 10 segundos antes de intentar iniciar la sesión de nuevo.", + "sign_out_action": "Cerrar sesión", + "sign_out_error": "Ocurrió un error al cerrar la sesión. Vuelve a intentarlo.", + "subscribe_to_newsletter_text": "Sí, me gustaría recibir actualizaciones.", + "suggestion_text": "Al parecer, tienes una cuenta con {provider}. Para un realizar un pago rápido, continúa con {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "No pudimos enviarte un enlace de inicio de sesión. Vuelve a intentarlo.", + "error_not_found": "El correo electrónico ingresado no está asociado a una cuenta. Inténtalo con otro correo electrónico.", + "sent_header": "Revisa tu bandeja de entrada", + "sent_text": "Enviamos un correo electrónico a {email} que contiene un vínculo de inicio de sesión. Esto vencerá en {minutes} minutos. Si no lo ves en tu bandeja de entrada, revisa tu carpeta de correo no deseado.", + "text": "Ingresa la dirección de correo electrónico asociada a tu cuenta. Te enviaremos un enlace de inicio de sesión.", + "header": "Ingresa tu dirección de correo electrónico", + "header_with_email": "Confirma tu dirección de correo electrónico", + "link": "En su lugar, necesito que se me envíe un enlace de inicio de sesión.", + "use_another_email": "Usar otro correo electrónico", + "send": "Enviar", + "error_temporary_disabled": "La funcionalidad del enlace de inicio de sesión no está disponible temporalmente. Inicia sesión con tu contraseña.", + "resend_link": "¿No recibiste el correo electrónico? Volver a enviar el enlace", + "use_password_link": " o inicia sesión con tu contraseña en su lugar." + }, + "embedded_checkout": { + "unsupported_error": "Los siguientes métodos de pago no son compatibles con el pago integrado: {methods}. Comunícate con nosotros para obtener ayuda." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Paga después", + "affirm_body_text": "Se te redirigirá a Affirm para completar de forma segura tu compra. Simplemente, proporciona algunos datos básicos y obtén una decisión en tiempo real. La verificación de tu elegibilidad no afectará tu puntaje crediticio.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Pagar con Afterpay", + "amazon_continue_action": "Continuar con Amazon", + "amazonpay_continue_action": "Continuar con Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continúa", + "bluesnap_v2_continue_action": "Continúa", + "bolt_benefit_1": "Compra cientos de marcas con un inicio de sesión sin requerir una contraseña", + "bolt_benefit_2": "Procesar el pago utilizando los detalles de pago y envío guardados", + "bolt_benefit_3": "Recibe los beneficios de la seguridad de la cuenta que cumple con las PCI", + "bolt_checkbox_agreement": "Guardar mi información, crear una cuenta de Bolt y aceptar los Términos de uso y la Política de privacidad de Bolt.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continuar con Visa Checkout", + "ccavenuemars_description_text": "Pagar con CCAvenue", + "chasepay_continue_action": "Continuar con Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Editar tarjeta", + "chasepay_logout": "Cerrar sesión en Chase Pay", + "chasepay_fail_load": "No se pudo cargar Chase Pay", + "checkoutcom_document_label_boleto": "CPF o CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "ID nacional", + "checkoutcom_document_invalid_error_boleto": "El CPF o CNPJ debe tener entre 11 y 14 caracteres", + "checkoutcom_document_invalid_error_oxxo": "La CURP debe tener como máximo 18 caracteres", + "checkoutcom_document_invalid_error_qpay": "El ID nacional debe tener un máximo de 32 caracteres", + "checkoutcom_fawry_customer_mobile_invalid_error": "El número de teléfono móvil debe ser válido", + "checkoutcom_fawry_customer_mobile_label": "Número de teléfono móvil", + "checkoutcom_fawry_customer_email_invalid_error": "La dirección de correo electrónico debe ser válida", + "checkoutcom_fawry_customer_email_label": "Correo electrónico", + "checkoutcom_sepa_creditor_title": "Acreedor", + "checkoutcom_sepa_creditor_id": "ID del acreedor: {creditorId}", + "checkoutcom_sepa_debtor_title": "Deudor", + "checkoutcom_sepa_mandate_disclaimer": "Al aceptar este formulario de mandato, autorizas a {creditorName} a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y a tu banco para que realice el cargo en tu cuenta de acuerdo con dichas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "checkoutcom_sepa_payment_type": "Tipo de pago: único (no recurrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Tarjeta de crédito", + "credit_card_customer_code_label": "Código de cliente", + "credit_card_cvv_help_text": "Para VISA y Mastercard, el CVV es un código de tres dígitos impreso en el reverso. Para American Express, es el código de cuatro dígitos impreso en el anverso. El CVV es una medida de seguridad para garantizar que tienes la tarjeta en tu poder.", + "credit_card_cvv_invalid_error": "El CVV debe ser válido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "El CVV es obligatorio", + "credit_card_expiration_invalid_error": "La fecha de vencimiento debe ser una fecha futura válida en el formato MM/YY", + "credit_card_expiration_label": "Vencimiento", + "credit_card_expiration_date_label": "Fecha de vencimiento", + "credit_card_expiration_required_error": "La fecha de vencimiento es obligatoria", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nombre que aparece en la tarjeta", + "credit_card_name_required_error": "El nombre completo es obligatorio", + "credit_card_number_invalid_error": "El número de tarjeta de crédito debe ser válido", + "credit_card_number_label": "Número de tarjeta de crédito", + "credit_card_number_last_four": "Ingresa el número de la tarjeta de {cardType} con terminación en {lastFour}", + "credit_card_number_required_error": "El número de tarjeta de crédito es obligatorio", + "credit_card_number_mismatch_error": "El número de tarjeta que se ingresó no coincide con la tarjeta guardada en tu cuenta", + "credit_debit_card_text": "Tarjeta de débito/crédito", + "digitalriver_dropin_error": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "digitalriver_checkout_error": "Hubo un problema con tu proceso de pago; revisa tus datos e inténtalo de nuevo o ponte en contacto con el servicio de atención al cliente", + "digitalriver_checkout_error_title": "Error al procesar la solicitud.", + "digitalriver_display_name_text": "Selecciona tu método de pago", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm no puede procesar el pago de este pedido; selecciona otro método de pago.", + "klarna_continue_action": "Continuar con Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuar con {methodName}", + "opy_widget_slogan": "Compra ahora. Paga de manera más inteligente.", + "opy_widget_info": "Se te redirigirá al sitio web de {methodName} para que completes tu pedido cuando hagas clic en “Continuar con {methodName}“", + "orbital_continue_action": "Realizar pedido", + "orbital_description_text": "Paga con tu cuenta de ChasePay", + "payment_cancelled": "El pago fue cancelado", + "payment_error": "Ocurrió un error al procesar tu pago. Vuelve a intentarlo.", + "payment_error_heading": "Error en el pago", + "payment_heading": "Pago", + "payment_invalid_error_heading": "Pago no disponible", + "payment_method_disabled_error": "El método de pago seleccionado ya no es válido. Haz clic en Aceptar para ver los métodos de pago más actualizados.", + "payment_method_error": "Respuesta del proveedor de pagos: {message}", + "payment_method_invalid_error": "Hay un problema al procesar tu pago. Ponte en contacto con nosotros para obtener ayuda o elige otra forma de pago.", + "payment_method_unavailable_error": "Este proveedor de pagos no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "payment_not_required_text": "No se requiere el pago para este pedido.", + "paypal_continue_action": "Continuar con PayPal", + "braintreevenmo_continue_action": "Continuar con Venmo", + "paypal_credit_continue_action": "Continuar con PayPal Credit", + "paypal_credit_description_text": "Compra ahora y paga después", + "paypal_description_text": "Pagar con tu cuenta de PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pagar después", + "place_order_action": "Realizar pedido", + "place_order_error": "Ocurrió un error al colocar tu pedido. Ponte en contacto con nosotros.", + "place_order_error_heading": "No se pudo realizar el pedido", + "postal_code_label": "Código postal", + "ideal_bic_required": "Debes seleccionar un emisor para realizar el pedido", + "instrument_text": "Almacenamiento de tarjetas de crédito", + "instrument_add_card_action": "Usar una tarjeta diferente", + "instrument_default_ending_in_text": "Tarjeta con terminación en {endingIn}", + "instrument_ending_in_text": "{cardTitle} con terminación en {endingIn}", + "instrument_expired_text": "Venció el {expiryDate}", + "instrument_expires_text": "Vence el {expiryDate}", + "instrument_manage_button": "manejar", + "instrument_manage_modal_confirmation_action": "Sí, eliminar", + "instrument_manage_modal_confirmation_label": "¿Estás seguro de que deseas eliminar este método de pago guardado?", + "instrument_manage_modal_title_text": "Administrar métodos de pago guardados", + "instrument_manage_modal_empty_text": "No tienes ningún método de pago guardado.", + "instrument_manage_table_header_ending_in_text": "Con terminación en", + "instrument_manage_table_header_expiry_date_text": "Fecha de vencimiento", + "instrument_manage_table_header_payment_method_text": "Método de pago", + "instrument_manage_delete_server_error": "Ocurrió un error al intentar eliminar ese método de pago almacenado. Vuelve a intentarlo.", + "instrument_manage_delete_auth_error": "Ocurrió un problema al autorizar tu solicitud. Vuelve a intentar iniciar sesión.", + "instrument_manage_delete_client_error": "Ocurrió un error al intentar eliminar el método de pago guardado: el método de pago ya no existe o no se puede eliminar.", + "instrument_save_payment_method_label": "Guardar esta tarjeta para futuras transacciones", + "instrument_save_as_default_payment_method_label": "Utilizar esta tarjeta como método de pago predeterminado para transacciones futuras", + "account_instrument_add_action": "Usar una cuenta diferente", + "account_instrument_save_payment_method_label": "Guardar esta cuenta para transacciones futuras", + "account_instrument_save_as_default_payment_method_label": "Usar esta cuenta como forma de pago predeterminada para transacciones futuras", + "account_instrument_text": "Cuentas guardadas", + "account_instrument_new_shipping_address": "Notamos que esta es una nueva dirección de envío.

Por razones de seguridad, deberás volver a vincular tu cuenta de PayPal cuando realices un envío a una dirección por primera vez o si la dirección de envío se modificó recientemente.

", + "instrument_trusted_shipping_address_text": "Este paso de seguridad adicional se aplica a tu tarjeta cuando realizas el envío a una dirección por primera vez o si la dirección de envío se editó recientemente.", + "instrument_trusted_shipping_address_title_text": "Vuelve a ingresar tu número de tarjeta para autorizar esta transacción.", + "quadpay_continue_action": "Continuar con Zip", + "quadpay_display_name_text": "Pagar en 4 plazos (Quadpay)", + "ppsdk_continue_action": "Continuar con {methodName}", + "select_your_bank": "Selecciona tu banco", + "sepa_account_number": "Número de cuenta (IBAN)", + "sepa_account_number_required": "Debes ingresar tu número de cuenta (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "El BIC debe tener 8 u 11 caracteres", + "sepa_mandate_required": "Debes aceptar el formulario de mandato", + "sezzle_display_name_text": "Paga después. 0% de interés.", + "stripe_sepa_display_name_text": "Sepa Direct Debit.", + "stripe_sepa_mandate_disclaimer": "Al proporcionar tu IBAN y confirmar este pago, autorizas a (A) {storeUrl} y a Stripe, nuestro proveedor de servicios de pago, a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y (B) a tu banco para que realice el cargo en tu cuenta de acuerdo con esas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "tax_provider_unavailable": "No se pudo calcular el impuesto sobre las ventas. Vuelve a intentarlo. Si persiste el problema, ponte en contacto con nuestro equipo de asistencia para completar el proceso de pago.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continuar con Click to pay", + "zip_continue_action": "Continuar con Zip", + "zip_name_text": "Código postal", + "zip_display_name_text": "Compra ahora, paga después", + "errors": { + "additional_action_required": "Continúa con acciones adicionales.", + "authorization_expired": "La autorización para esta transacción ha vencido.", + "authorization_revoked": "Se revocó la autorización para esta transacción.", + "call_issuer": "Hubo un problema al procesar su tarjeta. Póngase en contacto con el emisor de su tarjeta.", + "captured_transaction": "Ya se realizó el pago de este pedido.", + "card_declined": "El pago fue rechazado. Intente con una tarjeta diferente.", + "card_error": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "card_replaced": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "connection_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "duplicate_transaction": "Ésta es una transacción duplicada. Comuníquese con nosotros para confirmar su pedido. No intente pagar de nuevo.", + "expired_card": "Su tarjeta ha vencido. Inténtelo de nuevo con una tarjeta válida.", + "gateway_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "general_error": "Error al procesar la solicitud de pago.", + "hosted_form_error": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "incorrect_amount": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_zip": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "insufficient_funds": "El pago fue rechazado. Póngase en contacto con su banco.", + "invalid_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "invalid_amount": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_authorization_code": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_create_instrument_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_email_address": "No se pudo procesar el pago porque se proporcionó un correo electrónico no válido con la transacción.", + "invalid_expiry_date": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_expiry_month": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_expiry_year": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_gateway": "El portal de pago no es válido.", + "invalid_gateway_options": "Las opciones del portal de pago no son válidas.", + "invalid_instrument": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_issuer": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_payment_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_request_error": "En este momento tenemos dificultades para procesar tu transacción. Ponte en contacto con nosotros o inténtalo de nuevo más tarde.", + "invalid_user_authentication": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "invalid_zip": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "journal_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "lost_or_stolen_card": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "missing_test_mode": "No se puede procesar la solicitud porque se proporcionaron datos no válidos con la transacción.", + "not_found": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "payment_config_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "payment_config_not_found": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "pending_review": "Su transacción fue autorizada, pero está retenida por el comerciante para su revisión.", + "pickup_card": "Su tarjeta no puede ser utilizada para hacer este pago. Póngase en contacto con el emisor de su tarjeta o inténtelo con otra tarjeta.", + "processing_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "provider_configuration_error": "El proveedor de pagos del comerciante no está configurado correctamente.", + "refund_timelimit_expired": "El límite de tiempo para reembolsar esta transacción ya venció.", + "refunded_transaction": "Esta transacción ya se reembolsó.", + "request_timeout": "Su pago no pudo ser procesado debido al tiempo de espera. Intente de nuevo.", + "required_field": "No se pudo verificar tu pago. Revisa los detalles de tu tarjeta y vuelve a intentarlo.", + "server_error": "Hubo un error al procesar tu pago y tu pedido no pudo completarse. Vuelve a intentarlo.", + "store_instrument_failed": "No se puede procesar la solicitud. Vuelve a intentarlo.", + "stored_payment_instrument_not_found": "No se pudo encontrar ese instrumento de pago guardado. Inténtalo con otra opción de pago.", + "three_d_secure_declined": "Ha habido un problema con tu pago: revisa tus detalles de pago o comunícate con el emisor de tu tarjeta.", + "three_d_secure_failed": "Error en el pago. Vuelve a intentarlo o utiliza una opción de pago diferente.", + "three_d_secure_required": "Se requiere autenticación adicional para procesar su pago. Póngase en contacto con nosotros.", + "token_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "transaction_declined": "Su pago fue rechazado. Intente de nuevo.", + "transaction_rejected": "El pago fue rechazado. Vuelva a intentarlo.", + "unauthorized": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "unsupported_currency": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "unsupported_instrument": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "unsupported_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "user_authorization_error": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "vaulting_service_unavailable": "El servicio de bóveda no está disponible actualmente.", + "voided_transaction": "Su pago no pudo ser procesado debido a que la transacción ya se anuló. Inténtelo de nuevo o póngase en contacto con nosotros." + } + }, + "redeemable": { + "applied_text": "Aplicado", + "apply_action": "Aplicar", + "apply_store_credit_after_action": "crédito de la tienda para hacer un pedido", + "apply_store_credit_before_action": "Aplicar", + "code_invalid_error": "El certificado de regalo o el código de cupón no es válido", + "code_label": "Certificado de regalo o código de cupón", + "code_required_error": "Ingresa un certificado de regalo o un código de cupón", + "coupon_location_error": "Tu dirección de envío no cumple con los requisitos de ubicación para el código de cupón que ingresaste.", + "coupon_min_order_total": "Tu pedido no alcanza el total mínimo para que se aplique este código de cupón.", + "coupon_text": "Cupón", + "gift_certificate_remaining_text": "Restante", + "gift_certificate_text": "Certificado de regalo", + "remove_action": "Quitar", + "store_credit_available_text": "Actualmente, tu cuenta tiene {storeCredit} de crédito total de la tienda disponible", + "toggle_action": "Cupón/Certificado de regalo" + }, + "remote": { + "browser_unsupported": "El método de pago seleccionado requiere un navegador web diferente. Elige otro método de pago.", + "connection_error": "Se rechazó la conexión con el proceso de pago remoto. Vuelve a intentarlo más tarde.", + "continue_with_text": "O continúa con", + "payment_method_error": "Ocurrió un error al recuperar tu método de pago remoto. Vuelve a intentarlo.", + "select_different_card_action": "Selecciona una tarjeta diferente", + "session_error": "Tu sesión remota ya venció. Vuelve a iniciar sesión.", + "shipping_address_error": "Ocurrió un error al recuperar tu dirección de envío remota. Vuelve a intentarlo.", + "sign_in_action": "Inicia sesión en {providerName}", + "sign_out_action": "Cierra sesión en {providerName}", + "sign_out_after_action": "para ver otros métodos de pago", + "sign_in_required_error": "Se requiere inicio de sesión remoto antes del pago" + }, + "shipping": { + "cart_change_error": "Se detectó una actualización en tu carrito de compras y se actualizaron tus costos de envío disponibles. Vuelve a seleccionar un método de envío para continuar.", + "enter_shipping_address_text": "Ingresa una dirección de envío para ver las cotizaciones de envío", + "order_comment_label": "Comentarios del pedido", + "assign_item_error": "Ocurrió un error al asignar el elemento a la dirección. Vuelve a intentarlo.", + "assign_item_invalid_address_error_heading": "Dirección no válida", + "assign_item_invalid_address_error": "La dirección seleccionada no es válida. Ve a la página de tu cuenta y actualízala.", + "unassign_item_error": "Ocurrió un error al cancelar la asignación del artículo a la dirección.", + "save_shipping_address_error": "Ocurrió un error al guardar la dirección de envío en tu cotización. Vuelve a intentarlo.", + "save_shipping_option_error": "Ocurrió un error al guardar la cotización de envío en tu pedido. Vuelve a intentarlo.", + "select_shipping_address_text": "Selecciona una dirección de envío para ver las cotizaciones de envío", + "shipping_address_heading": "Dirección de envío", + "multishipping_address_heading": "Elige a dónde enviar cada artículo", + "multishipping_address_heading_guest": "Inicia sesión primero", + "multishipping_guest_intro": "Para enviar tus artículos a varias direcciones, debes", + "multishipping_guest_sign_in": "iniciar sesión en tu cuenta", + "multishipping_guest_create": "o crea una cuenta antes de continuar.", + "ship_to_multi": "Enviar a varias direcciones", + "ship_to_single": "Enviar a una sola dirección", + "shipping_heading": "Envío", + "shipping_method_label": "Método de envío", + "shipping_option_expired_error": "El precio de envío que se te indicó ya no es válido. Haz clic en Aceptar para ver los precios de envío más actualizados.", + "shipping_option_expired_heading": "Se actualizó tu precio de envío", + "view_shipping_options_action": "Ver otras opciones" + }, + "social": { + "share_action": "Compartir", + "share_heading": "¡Cuéntale a tus amigos sobre tu compra!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Haz clic aquí para confirmar que eres una persona antes de continuar." + }, + "privacy_policy": { + "required_error": "Acepta la Política de Privacidad.", + "label": "Sí, acepto la Política de Privacidad.", + "heading": "Política de Privacidad" + }, + "terms_and_conditions": { + "agreement_required_error": "Acepta los términos y condiciones.", + "agreement_text": "Sí, acepto los términos y condiciones anteriores.", + "agreement_with_link_text": "Sí, acepto los términos y condiciones.", + "terms_and_conditions_heading": "Términos y condiciones" + }, + "order_confirmation": { + "mandate": { + "checkoutcom": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO", + "sepa": "SEPA Direct Debit (a través de Checkout.com) Referencia de la orden: {mandate}" + }, + "stripev3": { + "iban": "Orden de débito directo SEPA" + }, + "stripe_upe": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO" + } + }, + "order_number_text": "Tu número de pedido es {orderNumber}", + "order_pending_review_text": "Ya se nos envió tu pedido, pero actualmente estamos en espera del pago. Una vez que lo recibamos, se completará tu pedido. Si ya proporcionaste los detalles del pago, procesaremos tu pedido manualmente y te enviaremos un correo electrónico cuando esté completo.", + "order_pending_status_text": "Hemos recibido tu pedido y estamos procesando tu pago. Una vez que se haya verificado el pago, se completará tu pedido. Te enviaremos un correo electrónico cuando se haya completado. Ten en cuenta que este proceso puede tardar unos minutos, dependiendo de los tiempos de procesamiento del método elegido. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_incomplete_status_text": "Hemos recibido tu pedido y tu pago. Nuestro sistema está procesando tu pedido. Ten en cuenta que el procesamiento puede tardar unos minutos. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_with_downloadable_digital_items_text": "Puedes descargar tus compras digitales haciendo clic en los enlaces de esta página o iniciando sesión en tu cuenta en cualquier momento. También hay un enlace de descarga en tu correo electrónico de confirmación, que debería llegarte en breve.", + "order_with_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes preguntas sobre tu compra, envíanos un correo electrónico a {supportEmail} o llámanos al {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Una vez que recibamos tu pago, te enviaremos un correo electrónico de confirmación con un enlace para descargar tus compras digitales.", + "order_without_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "thank_you_customer_heading": "¡Gracias, {name}!", + "thank_you_heading": "¡Muchas gracias!", + "continue_shopping": "Seguir comprando »", + "order_status_update_facebook_messenger_heading": "Recibe actualizaciones al instante de tu pedido en Messenger" + } + } +} diff --git a/assets/json/es-CL.json b/assets/json/es-CL.json new file mode 100644 index 000000000..8f78632f9 --- /dev/null +++ b/assets/json/es-CL.json @@ -0,0 +1,487 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Dirección", + "address_line_1_required_error": "La dirección es obligatoria", + "address_line_2_label": "Departamento/Interior/Edificio", + "address_line_2_required_error": "Departamento/Interior/Edificio es un campo obligatorio", + "address_not_recognized_heading": "No reconocimos tu dirección", + "consignment_address_updated_text": "El artículo se asignó correctamente a la nueva dirección.", + "city_label": "Ciudad", + "city_required_error": "La ciudad es obligatoria", + "company_name_label": "Nombre de la empresa", + "company_name_required_error": "Empresa es un campo obligatorio", + "confirm_address_action": "Continuar con la dirección actual", + "confirm_address_text": "No pudimos encontrar una coincidencia para la dirección que ingresaste. Confirma la dirección.", + "country_label": "País", + "country_required_error": "País es un campo obligatorio", + "custom_required_error": "{label} es un campo obligatorio", + "custom_min_error": "{label} debe ser mayor que {min}", + "custom_max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "custom_valid_error": "{label} no es válido", + "edit_address_action": "Editar dirección", + "enter_address_action": "Ingresa una nueva dirección", + "add_address_heading": "Agregar dirección", + "save_address_action": "Guardar dirección", + "first_name_label": "Nombre de pila", + "first_name_required_error": "El campo Nombre es obligatorio.", + "last_name_label": "Apellido", + "last_name_required_error": "El campo Apellido es obligatorio.", + "phone_number_label": "Número telefónico", + "phone_number_required_error": "El campo Número de teléfono es obligatorio.", + "postal_code_label": "Código postal", + "postal_code_required_error": "El campo Código postal es obligatorio.", + "save_in_addressbook": "Guardar esta dirección en mi libreta de direcciones.", + "select_country_action": "Seleccionar un país", + "select_state_action": "Seleccionar un estado", + "state_label": "Estado/Provincia", + "state_required_error": "Estado/Provincia es un campo obligatorio.", + "select": "Seleccionar", + "select_all": "Todos", + "select_none": "ninguna" + }, + "billing": { + "billing_address_heading": "Dirección de facturación", + "billing_heading": "Facturación", + "save_billing_address_error": "Ocurrió un error al guardar la dirección de facturación en tu cotización. Vuelve a intentarlo.", + "billing_address_amazon": "Misma que la dirección de facturación que estableciste en tu cuenta de Amazon.", + "billing_address_amazonpay": "Administrado por Amazon Pay", + "use_shipping_address_label": "Mi dirección de facturación es la misma que mi dirección de envío." + }, + "cart": { + "billed_amount_text": "*Se te cobrará y facturará {total} ({code}) por este pedido.", + "based_on_currency_text": "Con base en {total} {code}", + "cart_heading": "Resumen del pedido", + "digital_item_text": "Elemento digital", + "discount_text": "Descuento", + "downloads_action": "Ir a Descargas", + "edit_cart_action": "Editar carrito", + "estimated_total_text": "Total estimado", + "free_text": "Gratuito", + "gift_certificate_text": "Certificado de regalo", + "handling_text": "Manipulación", + "item_count_text": "{count, plural, one{1 Artículo} other{# Artículos} }", + "print_action": "Imprimir", + "remaining_text": "Restante", + "remove_action": "Quitar", + "see_all_action": "Ver todo", + "see_less_action": "Ver menos", + "shipping_text": "Envío", + "gift_wrapping_text": "Envoltura de regalo", + "show_details_action": "Mostrar detalles", + "store_credit_text": "Crédito de la tienda", + "subtotal_text": "Subtotal", + "taxes_text": "Impuestos", + "total_text": "Total", + "empty_cart_message": "Tu carrito está vacío; se te está redirigiendo. Haz clic aquí si tu navegador no te redirige." + }, + "common": { + "cancel_action": "Cancelar", + "close_action": "Cerrar", + "continue_action": "Continúa", + "edit_action": "Editar", + "delete_action": "Eliminar", + "error_heading": "Se produjo un error", + "leave_warning": "¿Estás seguro de que deseas salir? Es posible que no se guarden los datos que ingresaste.", + "loading_text": "Cargando", + "ok_action": "De acuerdo", + "error_code": "Código de error:", + "request_id": "ID de solicitud:", + "optional_text": "(Opcional)", + "unavailable_error": "El proceso de pago no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "unavailable_heading": "El proceso de pago no está disponible temporalmente", + "unstable_network_error": "Al parecer, el servidor está tardando demasiado en responder; esto puede deberse a una mala conexión o un error con nuestros servidores. Vuelve a intentarlo en un momento.", + "order_loading_error": "Ocurrió un error al cargar tu pedido. Vuelve a intentarlo.", + "order_fatal_error_heading": "Ocurrió un error al colocar tu pedido", + "order_fatal_error_extra": "Elige otro método de pago o contáctanos para obtener más ayuda.", + "go_back": "Volver", + "show_more": "Mostrar más" + }, + "customer": { + "checkout_as_guest_text": "¿Vas a realizar el pago como invitado? Podrás guardar tus datos para crear una cuenta con nosotros después.", + "continue_as_guest_action": "Continuar como invitado", + "create_account_action": "Crear cuenta", + "continue": "Continúa", + "set_password_action": "Guardar contraseña", + "required_error": "{label} es un campo obligatorio", + "min_error": "{label} debe ser mayor que {min}", + "max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "create_account_error": "Ocurrió un error al crear tu cuenta. Vuelve a intentarlo.", + "create_address_error": "Sin embargo, ocurrió un error al guardar la dirección en tu libreta de direcciones.", + "create_account_requirements_error_heading": "La contraseña no cumple con los requisitos", + "create_account_success": "Se creó tu cuenta.", + "set_password_success": "Se guardó tu contraseña.", + "create_account_text": "Crear una cuenta para pagar más rápido en futuras ocasiones", + "set_password_text": "Configurar una contraseña para pagar más rápido en futuras ocasiones", + "account_created_text": "Se creó una cuenta para ti, pero tendrás que configurar una contraseña para iniciar sesión.", + "create_account_to_continue_text": "¿No tienes una cuenta? Crea una cuenta para continuar.", + "guest_could_login": "Parece que tienes una cuenta. Inicia sesión con {email} para realizar un pago más rápido.", + "guest_must_login": "Parece que tienes una cuenta. Inicia sesión para continuar con {email} o utiliza otro correo electrónico.", + "guest_temporary_disabled": "El proceso de pago como invitado está desactivado temporalmente. Inicia sesión o crea una cuenta para continuar.", + "customer_heading": "Cliente", + "email_invalid_error": "La dirección de correo electrónico debe ser válida", + "email_label": "Dirección de correo electrónico", + "email_required_error": "La dirección de correo electrónico es obligatoria", + "forgot_password_action": "¿Olvidaste la contraseña?", + "guest_customer_text": "Cliente invitado", + "guest_subscribe_to_newsletter_text": "Suscríbete a nuestro boletín informativo.", + "guest_marketing_consent": "Me gustaría recibir novedades y ofertas.", + "login_action": "Inicia sesión ahora", + "login_text": "¿Ya tienes una cuenta?", + "email_in_use_text": "Ya existe una cuenta para {email}. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "unknown_email_in_use_text": "Ya existe una cuenta para el correo electrónico proporcionado. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "guest_could_login_change_email": "¿No es {email}? Cambiar correo electrónico.", + "password_confirmation_error": "Las contraseñas no coinciden", + "password_confirmation_label": "Confirmar contraseña", + "password_confirmation_required_error": "Este campo es obligatorio", + "password_label": "Contraseña", + "password_letter_required_error": "La contraseña debe contener una letra", + "password_minimum_character_label": "mínimo de caracteres, distingue entre mayúsculas y minúsculas", + "password_number_required_error": "La contraseña debe contener un número", + "password_over_maximum_length_error": "La contraseña es demasiado larga", + "password_required_error": "Se requiere la contraseña", + "password_under_minimum_length_error": "La contraseña es demasiado corta", + "reset_password_before_login_error": "El inicio de sesión no está disponible en este momento. Recibirás un correo electrónico en los próximos 5 minutos con instrucciones para restablecer tu contraseña. Si no recibes este correo electrónico, verifica tu carpeta de correo no deseado o contáctanos para obtener más ayuda.", + "returning_customer_text": "Cliente habitual", + "sign_in_action": "Iniciar sesión", + "sign_in_error": "El correo electrónico o la contraseña que ingresaste no son válidos.", + "sign_in_throttled_error": "Debido a que hubo muchos intentos de inicio de sesión, espera 10 segundos antes de intentar iniciar la sesión de nuevo.", + "sign_out_action": "Cerrar sesión", + "sign_out_error": "Ocurrió un error al cerrar la sesión. Vuelve a intentarlo.", + "subscribe_to_newsletter_text": "Sí, me gustaría recibir actualizaciones.", + "suggestion_text": "Al parecer, tienes una cuenta con {provider}. Para un realizar un pago rápido, continúa con {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "No pudimos enviarte un enlace de inicio de sesión. Vuelve a intentarlo.", + "error_not_found": "El correo electrónico ingresado no está asociado a una cuenta. Inténtalo con otro correo electrónico.", + "sent_header": "Revisa tu bandeja de entrada", + "sent_text": "Enviamos un correo electrónico a {email} que contiene un vínculo de inicio de sesión. Esto vencerá en {minutes} minutos. Si no lo ves en tu bandeja de entrada, revisa tu carpeta de correo no deseado.", + "text": "Ingresa la dirección de correo electrónico asociada a tu cuenta. Te enviaremos un enlace de inicio de sesión.", + "header": "Ingresa tu dirección de correo electrónico", + "header_with_email": "Confirma tu dirección de correo electrónico", + "link": "En su lugar, necesito que se me envíe un enlace de inicio de sesión.", + "use_another_email": "Usar otro correo electrónico", + "send": "Enviar", + "error_temporary_disabled": "La funcionalidad del enlace de inicio de sesión no está disponible temporalmente. Inicia sesión con tu contraseña.", + "resend_link": "¿No recibiste el correo electrónico? Volver a enviar el enlace", + "use_password_link": " o inicia sesión con tu contraseña en su lugar." + }, + "embedded_checkout": { + "unsupported_error": "Los siguientes métodos de pago no son compatibles con el pago integrado: {methods}. Comunícate con nosotros para obtener ayuda." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Paga después", + "affirm_body_text": "Se te redirigirá a Affirm para completar de forma segura tu compra. Simplemente, proporciona algunos datos básicos y obtén una decisión en tiempo real. La verificación de tu elegibilidad no afectará tu puntaje crediticio.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Pagar con Afterpay", + "amazon_continue_action": "Continuar con Amazon", + "amazonpay_continue_action": "Continuar con Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continúa", + "bluesnap_v2_continue_action": "Continúa", + "bolt_benefit_1": "Compra cientos de marcas con un inicio de sesión sin requerir una contraseña", + "bolt_benefit_2": "Procesar el pago utilizando los detalles de pago y envío guardados", + "bolt_benefit_3": "Recibe los beneficios de la seguridad de la cuenta que cumple con las PCI", + "bolt_checkbox_agreement": "Guardar mi información, crear una cuenta de Bolt y aceptar los Términos de uso y la Política de privacidad de Bolt.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continuar con Visa Checkout", + "ccavenuemars_description_text": "Pagar con CCAvenue", + "chasepay_continue_action": "Continuar con Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Editar tarjeta", + "chasepay_logout": "Cerrar sesión en Chase Pay", + "chasepay_fail_load": "No se pudo cargar Chase Pay", + "checkoutcom_document_label_boleto": "CPF o CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "ID nacional", + "checkoutcom_document_invalid_error_boleto": "El CPF o CNPJ debe tener entre 11 y 14 caracteres", + "checkoutcom_document_invalid_error_oxxo": "La CURP debe tener como máximo 18 caracteres", + "checkoutcom_document_invalid_error_qpay": "El ID nacional debe tener un máximo de 32 caracteres", + "checkoutcom_fawry_customer_mobile_invalid_error": "El número de teléfono móvil debe ser válido", + "checkoutcom_fawry_customer_mobile_label": "Número de teléfono móvil", + "checkoutcom_fawry_customer_email_invalid_error": "La dirección de correo electrónico debe ser válida", + "checkoutcom_fawry_customer_email_label": "Correo electrónico", + "checkoutcom_sepa_creditor_title": "Acreedor", + "checkoutcom_sepa_creditor_id": "ID del acreedor: {creditorId}", + "checkoutcom_sepa_debtor_title": "Deudor", + "checkoutcom_sepa_mandate_disclaimer": "Al aceptar este formulario de mandato, autorizas a {creditorName} a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y a tu banco para que realice el cargo en tu cuenta de acuerdo con dichas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "checkoutcom_sepa_payment_type": "Tipo de pago: único (no recurrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Tarjeta de crédito", + "credit_card_customer_code_label": "Código de cliente", + "credit_card_cvv_help_text": "Para VISA y Mastercard, el CVV es un código de tres dígitos impreso en el reverso. Para American Express, es el código de cuatro dígitos impreso en el anverso. El CVV es una medida de seguridad para garantizar que tienes la tarjeta en tu poder.", + "credit_card_cvv_invalid_error": "El CVV debe ser válido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "El CVV es obligatorio", + "credit_card_expiration_invalid_error": "La fecha de vencimiento debe ser una fecha futura válida en el formato MM/YY", + "credit_card_expiration_label": "Vencimiento", + "credit_card_expiration_date_label": "Fecha de vencimiento", + "credit_card_expiration_required_error": "La fecha de vencimiento es obligatoria", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nombre que aparece en la tarjeta", + "credit_card_name_required_error": "El nombre completo es obligatorio", + "credit_card_number_invalid_error": "El número de tarjeta de crédito debe ser válido", + "credit_card_number_label": "Número de tarjeta de crédito", + "credit_card_number_last_four": "Ingresa el número de la tarjeta de {cardType} con terminación en {lastFour}", + "credit_card_number_required_error": "El número de tarjeta de crédito es obligatorio", + "credit_card_number_mismatch_error": "El número de tarjeta que se ingresó no coincide con la tarjeta guardada en tu cuenta", + "credit_debit_card_text": "Tarjeta de débito/crédito", + "digitalriver_dropin_error": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "digitalriver_checkout_error": "Hubo un problema con tu proceso de pago; revisa tus datos e inténtalo de nuevo o ponte en contacto con el servicio de atención al cliente", + "digitalriver_checkout_error_title": "Error al procesar la solicitud.", + "digitalriver_display_name_text": "Selecciona tu método de pago", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm no puede procesar el pago de este pedido; selecciona otro método de pago.", + "klarna_continue_action": "Continuar con Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuar con {methodName}", + "opy_widget_slogan": "Compra ahora. Paga de manera más inteligente.", + "opy_widget_info": "Se te redirigirá al sitio web de {methodName} para que completes tu pedido cuando hagas clic en “Continuar con {methodName}“", + "orbital_continue_action": "Realizar pedido", + "orbital_description_text": "Paga con tu cuenta de ChasePay", + "payment_cancelled": "El pago fue cancelado", + "payment_error": "Ocurrió un error al procesar tu pago. Vuelve a intentarlo.", + "payment_error_heading": "Error en el pago", + "payment_heading": "Pago", + "payment_invalid_error_heading": "Pago no disponible", + "payment_method_disabled_error": "El método de pago seleccionado ya no es válido. Haz clic en Aceptar para ver los métodos de pago más actualizados.", + "payment_method_error": "Respuesta del proveedor de pagos: {message}", + "payment_method_invalid_error": "Hay un problema al procesar tu pago. Ponte en contacto con nosotros para obtener ayuda o elige otra forma de pago.", + "payment_method_unavailable_error": "Este proveedor de pagos no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "payment_not_required_text": "No se requiere el pago para este pedido.", + "paypal_continue_action": "Continuar con PayPal", + "braintreevenmo_continue_action": "Continuar con Venmo", + "paypal_credit_continue_action": "Continuar con PayPal Credit", + "paypal_credit_description_text": "Compra ahora y paga después", + "paypal_description_text": "Pagar con tu cuenta de PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pagar después", + "place_order_action": "Realizar pedido", + "place_order_error": "Ocurrió un error al colocar tu pedido. Ponte en contacto con nosotros.", + "place_order_error_heading": "No se pudo realizar el pedido", + "postal_code_label": "Código postal", + "ideal_bic_required": "Debes seleccionar un emisor para realizar el pedido", + "instrument_text": "Almacenamiento de tarjetas de crédito", + "instrument_add_card_action": "Usar una tarjeta diferente", + "instrument_default_ending_in_text": "Tarjeta con terminación en {endingIn}", + "instrument_ending_in_text": "{cardTitle} con terminación en {endingIn}", + "instrument_expired_text": "Venció el {expiryDate}", + "instrument_expires_text": "Vence el {expiryDate}", + "instrument_manage_button": "manejar", + "instrument_manage_modal_confirmation_action": "Sí, eliminar", + "instrument_manage_modal_confirmation_label": "¿Estás seguro de que deseas eliminar este método de pago guardado?", + "instrument_manage_modal_title_text": "Administrar métodos de pago guardados", + "instrument_manage_modal_empty_text": "No tienes ningún método de pago guardado.", + "instrument_manage_table_header_ending_in_text": "Con terminación en", + "instrument_manage_table_header_expiry_date_text": "Fecha de vencimiento", + "instrument_manage_table_header_payment_method_text": "Método de pago", + "instrument_manage_delete_server_error": "Ocurrió un error al intentar eliminar ese método de pago almacenado. Vuelve a intentarlo.", + "instrument_manage_delete_auth_error": "Ocurrió un problema al autorizar tu solicitud. Vuelve a intentar iniciar sesión.", + "instrument_manage_delete_client_error": "Ocurrió un error al intentar eliminar el método de pago guardado: el método de pago ya no existe o no se puede eliminar.", + "instrument_save_payment_method_label": "Guardar esta tarjeta para futuras transacciones", + "instrument_save_as_default_payment_method_label": "Utilizar esta tarjeta como método de pago predeterminado para transacciones futuras", + "account_instrument_add_action": "Usar una cuenta diferente", + "account_instrument_save_payment_method_label": "Guardar esta cuenta para transacciones futuras", + "account_instrument_save_as_default_payment_method_label": "Usar esta cuenta como forma de pago predeterminada para transacciones futuras", + "account_instrument_text": "Cuentas guardadas", + "account_instrument_new_shipping_address": "Notamos que esta es una nueva dirección de envío.

Por razones de seguridad, deberás volver a vincular tu cuenta de PayPal cuando realices un envío a una dirección por primera vez o si la dirección de envío se modificó recientemente.

", + "instrument_trusted_shipping_address_text": "Este paso de seguridad adicional se aplica a tu tarjeta cuando realizas el envío a una dirección por primera vez o si la dirección de envío se editó recientemente.", + "instrument_trusted_shipping_address_title_text": "Vuelve a ingresar tu número de tarjeta para autorizar esta transacción.", + "quadpay_continue_action": "Continuar con Zip", + "quadpay_display_name_text": "Pagar en 4 plazos (Quadpay)", + "ppsdk_continue_action": "Continuar con {methodName}", + "select_your_bank": "Selecciona tu banco", + "sepa_account_number": "Número de cuenta (IBAN)", + "sepa_account_number_required": "Debes ingresar tu número de cuenta (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "El BIC debe tener 8 u 11 caracteres", + "sepa_mandate_required": "Debes aceptar el formulario de mandato", + "sezzle_display_name_text": "Paga después. 0% de interés.", + "stripe_sepa_display_name_text": "Sepa Direct Debit.", + "stripe_sepa_mandate_disclaimer": "Al proporcionar tu IBAN y confirmar este pago, autorizas a (A) {storeUrl} y a Stripe, nuestro proveedor de servicios de pago, a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y (B) a tu banco para que realice el cargo en tu cuenta de acuerdo con esas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "tax_provider_unavailable": "No se pudo calcular el impuesto sobre las ventas. Vuelve a intentarlo. Si persiste el problema, ponte en contacto con nuestro equipo de asistencia para completar el proceso de pago.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continuar con Click to pay", + "zip_continue_action": "Continuar con Zip", + "zip_name_text": "Código postal", + "zip_display_name_text": "Compra ahora, paga después", + "errors": { + "additional_action_required": "Continúa con acciones adicionales.", + "authorization_expired": "La autorización para esta transacción ha vencido.", + "authorization_revoked": "Se revocó la autorización para esta transacción.", + "call_issuer": "Hubo un problema al procesar su tarjeta. Póngase en contacto con el emisor de su tarjeta.", + "captured_transaction": "Ya se realizó el pago de este pedido.", + "card_declined": "El pago fue rechazado. Intente con una tarjeta diferente.", + "card_error": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "card_replaced": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "connection_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "duplicate_transaction": "Ésta es una transacción duplicada. Comuníquese con nosotros para confirmar su pedido. No intente pagar de nuevo.", + "expired_card": "Su tarjeta ha vencido. Inténtelo de nuevo con una tarjeta válida.", + "gateway_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "general_error": "Error al procesar la solicitud de pago.", + "hosted_form_error": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "incorrect_amount": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_zip": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "insufficient_funds": "El pago fue rechazado. Póngase en contacto con su banco.", + "invalid_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "invalid_amount": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_authorization_code": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_create_instrument_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_email_address": "No se pudo procesar el pago porque se proporcionó un correo electrónico no válido con la transacción.", + "invalid_expiry_date": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_expiry_month": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_expiry_year": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_gateway": "El portal de pago no es válido.", + "invalid_gateway_options": "Las opciones del portal de pago no son válidas.", + "invalid_instrument": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_issuer": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_payment_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_request_error": "En este momento tenemos dificultades para procesar tu transacción. Ponte en contacto con nosotros o inténtalo de nuevo más tarde.", + "invalid_user_authentication": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "invalid_zip": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "journal_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "lost_or_stolen_card": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "missing_test_mode": "No se puede procesar la solicitud porque se proporcionaron datos no válidos con la transacción.", + "not_found": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "payment_config_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "payment_config_not_found": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "pending_review": "Su transacción fue autorizada, pero está retenida por el comerciante para su revisión.", + "pickup_card": "Su tarjeta no puede ser utilizada para hacer este pago. Póngase en contacto con el emisor de su tarjeta o inténtelo con otra tarjeta.", + "processing_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "provider_configuration_error": "El proveedor de pagos del comerciante no está configurado correctamente.", + "refund_timelimit_expired": "El límite de tiempo para reembolsar esta transacción ya venció.", + "refunded_transaction": "Esta transacción ya se reembolsó.", + "request_timeout": "Su pago no pudo ser procesado debido al tiempo de espera. Intente de nuevo.", + "required_field": "No se pudo verificar tu pago. Revisa los detalles de tu tarjeta y vuelve a intentarlo.", + "server_error": "Hubo un error al procesar tu pago y tu pedido no pudo completarse. Vuelve a intentarlo.", + "store_instrument_failed": "No se puede procesar la solicitud. Vuelve a intentarlo.", + "stored_payment_instrument_not_found": "No se pudo encontrar ese instrumento de pago guardado. Inténtalo con otra opción de pago.", + "three_d_secure_declined": "Ha habido un problema con tu pago: revisa tus detalles de pago o comunícate con el emisor de tu tarjeta.", + "three_d_secure_failed": "Error en el pago. Vuelve a intentarlo o utiliza una opción de pago diferente.", + "three_d_secure_required": "Se requiere autenticación adicional para procesar su pago. Póngase en contacto con nosotros.", + "token_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "transaction_declined": "Su pago fue rechazado. Intente de nuevo.", + "transaction_rejected": "El pago fue rechazado. Vuelva a intentarlo.", + "unauthorized": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "unsupported_currency": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "unsupported_instrument": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "unsupported_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "user_authorization_error": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "vaulting_service_unavailable": "El servicio de bóveda no está disponible actualmente.", + "voided_transaction": "Su pago no pudo ser procesado debido a que la transacción ya se anuló. Inténtelo de nuevo o póngase en contacto con nosotros." + } + }, + "redeemable": { + "applied_text": "Aplicado", + "apply_action": "Aplicar", + "apply_store_credit_after_action": "crédito de la tienda para hacer un pedido", + "apply_store_credit_before_action": "Aplicar", + "code_invalid_error": "El certificado de regalo o el código de cupón no es válido", + "code_label": "Certificado de regalo o código de cupón", + "code_required_error": "Ingresa un certificado de regalo o un código de cupón", + "coupon_location_error": "Tu dirección de envío no cumple con los requisitos de ubicación para el código de cupón que ingresaste.", + "coupon_min_order_total": "Tu pedido no alcanza el total mínimo para que se aplique este código de cupón.", + "coupon_text": "Cupón", + "gift_certificate_remaining_text": "Restante", + "gift_certificate_text": "Certificado de regalo", + "remove_action": "Quitar", + "store_credit_available_text": "Actualmente, tu cuenta tiene {storeCredit} de crédito total de la tienda disponible", + "toggle_action": "Cupón/Certificado de regalo" + }, + "remote": { + "browser_unsupported": "El método de pago seleccionado requiere un navegador web diferente. Elige otro método de pago.", + "connection_error": "Se rechazó la conexión con el proceso de pago remoto. Vuelve a intentarlo más tarde.", + "continue_with_text": "O continúa con", + "payment_method_error": "Ocurrió un error al recuperar tu método de pago remoto. Vuelve a intentarlo.", + "select_different_card_action": "Selecciona una tarjeta diferente", + "session_error": "Tu sesión remota ya venció. Vuelve a iniciar sesión.", + "shipping_address_error": "Ocurrió un error al recuperar tu dirección de envío remota. Vuelve a intentarlo.", + "sign_in_action": "Inicia sesión en {providerName}", + "sign_out_action": "Cierra sesión en {providerName}", + "sign_out_after_action": "para ver otros métodos de pago", + "sign_in_required_error": "Se requiere inicio de sesión remoto antes del pago" + }, + "shipping": { + "cart_change_error": "Se detectó una actualización en tu carrito de compras y se actualizaron tus costos de envío disponibles. Vuelve a seleccionar un método de envío para continuar.", + "enter_shipping_address_text": "Ingresa una dirección de envío para ver las cotizaciones de envío", + "order_comment_label": "Comentarios del pedido", + "assign_item_error": "Ocurrió un error al asignar el elemento a la dirección. Vuelve a intentarlo.", + "assign_item_invalid_address_error_heading": "Dirección no válida", + "assign_item_invalid_address_error": "La dirección seleccionada no es válida. Ve a la página de tu cuenta y actualízala.", + "unassign_item_error": "Ocurrió un error al cancelar la asignación del artículo a la dirección.", + "save_shipping_address_error": "Ocurrió un error al guardar la dirección de envío en tu cotización. Vuelve a intentarlo.", + "save_shipping_option_error": "Ocurrió un error al guardar la cotización de envío en tu pedido. Vuelve a intentarlo.", + "select_shipping_address_text": "Selecciona una dirección de envío para ver las cotizaciones de envío", + "shipping_address_heading": "Dirección de envío", + "multishipping_address_heading": "Elige a dónde enviar cada artículo", + "multishipping_address_heading_guest": "Inicia sesión primero", + "multishipping_guest_intro": "Para enviar tus artículos a varias direcciones, debes", + "multishipping_guest_sign_in": "iniciar sesión en tu cuenta", + "multishipping_guest_create": "o crea una cuenta antes de continuar.", + "ship_to_multi": "Enviar a varias direcciones", + "ship_to_single": "Enviar a una sola dirección", + "shipping_heading": "Envío", + "shipping_method_label": "Método de envío", + "shipping_option_expired_error": "El precio de envío que se te indicó ya no es válido. Haz clic en Aceptar para ver los precios de envío más actualizados.", + "shipping_option_expired_heading": "Se actualizó tu precio de envío", + "view_shipping_options_action": "Ver otras opciones" + }, + "social": { + "share_action": "Compartir", + "share_heading": "¡Cuéntale a tus amigos sobre tu compra!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Haz clic aquí para confirmar que eres una persona antes de continuar." + }, + "privacy_policy": { + "required_error": "Acepta la Política de Privacidad.", + "label": "Sí, acepto la Política de Privacidad.", + "heading": "Política de Privacidad" + }, + "terms_and_conditions": { + "agreement_required_error": "Acepta los términos y condiciones.", + "agreement_text": "Sí, acepto los términos y condiciones anteriores.", + "agreement_with_link_text": "Sí, acepto los términos y condiciones.", + "terms_and_conditions_heading": "Términos y condiciones" + }, + "order_confirmation": { + "mandate": { + "checkoutcom": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO", + "sepa": "SEPA Direct Debit (a través de Checkout.com) Referencia de la orden: {mandate}" + }, + "stripev3": { + "iban": "Orden de débito directo SEPA" + }, + "stripe_upe": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO" + } + }, + "order_number_text": "Tu número de pedido es {orderNumber}", + "order_pending_review_text": "Ya se nos envió tu pedido, pero actualmente estamos en espera del pago. Una vez que lo recibamos, se completará tu pedido. Si ya proporcionaste los detalles del pago, procesaremos tu pedido manualmente y te enviaremos un correo electrónico cuando esté completo.", + "order_pending_status_text": "Hemos recibido tu pedido y estamos procesando tu pago. Una vez que se haya verificado el pago, se completará tu pedido. Te enviaremos un correo electrónico cuando se haya completado. Ten en cuenta que este proceso puede tardar unos minutos, dependiendo de los tiempos de procesamiento del método elegido. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_incomplete_status_text": "Hemos recibido tu pedido y tu pago. Nuestro sistema está procesando tu pedido. Ten en cuenta que el procesamiento puede tardar unos minutos. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_with_downloadable_digital_items_text": "Puedes descargar tus compras digitales haciendo clic en los enlaces de esta página o iniciando sesión en tu cuenta en cualquier momento. También hay un enlace de descarga en tu correo electrónico de confirmación, que debería llegarte en breve.", + "order_with_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes preguntas sobre tu compra, envíanos un correo electrónico a {supportEmail} o llámanos al {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Una vez que recibamos tu pago, te enviaremos un correo electrónico de confirmación con un enlace para descargar tus compras digitales.", + "order_without_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "thank_you_customer_heading": "¡Gracias, {name}!", + "thank_you_heading": "¡Muchas gracias!", + "continue_shopping": "Seguir comprando »", + "order_status_update_facebook_messenger_heading": "Recibe actualizaciones al instante de tu pedido en Messenger" + } + } +} diff --git a/assets/json/es-CO.json b/assets/json/es-CO.json new file mode 100644 index 000000000..8f78632f9 --- /dev/null +++ b/assets/json/es-CO.json @@ -0,0 +1,487 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Dirección", + "address_line_1_required_error": "La dirección es obligatoria", + "address_line_2_label": "Departamento/Interior/Edificio", + "address_line_2_required_error": "Departamento/Interior/Edificio es un campo obligatorio", + "address_not_recognized_heading": "No reconocimos tu dirección", + "consignment_address_updated_text": "El artículo se asignó correctamente a la nueva dirección.", + "city_label": "Ciudad", + "city_required_error": "La ciudad es obligatoria", + "company_name_label": "Nombre de la empresa", + "company_name_required_error": "Empresa es un campo obligatorio", + "confirm_address_action": "Continuar con la dirección actual", + "confirm_address_text": "No pudimos encontrar una coincidencia para la dirección que ingresaste. Confirma la dirección.", + "country_label": "País", + "country_required_error": "País es un campo obligatorio", + "custom_required_error": "{label} es un campo obligatorio", + "custom_min_error": "{label} debe ser mayor que {min}", + "custom_max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "custom_valid_error": "{label} no es válido", + "edit_address_action": "Editar dirección", + "enter_address_action": "Ingresa una nueva dirección", + "add_address_heading": "Agregar dirección", + "save_address_action": "Guardar dirección", + "first_name_label": "Nombre de pila", + "first_name_required_error": "El campo Nombre es obligatorio.", + "last_name_label": "Apellido", + "last_name_required_error": "El campo Apellido es obligatorio.", + "phone_number_label": "Número telefónico", + "phone_number_required_error": "El campo Número de teléfono es obligatorio.", + "postal_code_label": "Código postal", + "postal_code_required_error": "El campo Código postal es obligatorio.", + "save_in_addressbook": "Guardar esta dirección en mi libreta de direcciones.", + "select_country_action": "Seleccionar un país", + "select_state_action": "Seleccionar un estado", + "state_label": "Estado/Provincia", + "state_required_error": "Estado/Provincia es un campo obligatorio.", + "select": "Seleccionar", + "select_all": "Todos", + "select_none": "ninguna" + }, + "billing": { + "billing_address_heading": "Dirección de facturación", + "billing_heading": "Facturación", + "save_billing_address_error": "Ocurrió un error al guardar la dirección de facturación en tu cotización. Vuelve a intentarlo.", + "billing_address_amazon": "Misma que la dirección de facturación que estableciste en tu cuenta de Amazon.", + "billing_address_amazonpay": "Administrado por Amazon Pay", + "use_shipping_address_label": "Mi dirección de facturación es la misma que mi dirección de envío." + }, + "cart": { + "billed_amount_text": "*Se te cobrará y facturará {total} ({code}) por este pedido.", + "based_on_currency_text": "Con base en {total} {code}", + "cart_heading": "Resumen del pedido", + "digital_item_text": "Elemento digital", + "discount_text": "Descuento", + "downloads_action": "Ir a Descargas", + "edit_cart_action": "Editar carrito", + "estimated_total_text": "Total estimado", + "free_text": "Gratuito", + "gift_certificate_text": "Certificado de regalo", + "handling_text": "Manipulación", + "item_count_text": "{count, plural, one{1 Artículo} other{# Artículos} }", + "print_action": "Imprimir", + "remaining_text": "Restante", + "remove_action": "Quitar", + "see_all_action": "Ver todo", + "see_less_action": "Ver menos", + "shipping_text": "Envío", + "gift_wrapping_text": "Envoltura de regalo", + "show_details_action": "Mostrar detalles", + "store_credit_text": "Crédito de la tienda", + "subtotal_text": "Subtotal", + "taxes_text": "Impuestos", + "total_text": "Total", + "empty_cart_message": "Tu carrito está vacío; se te está redirigiendo. Haz clic aquí si tu navegador no te redirige." + }, + "common": { + "cancel_action": "Cancelar", + "close_action": "Cerrar", + "continue_action": "Continúa", + "edit_action": "Editar", + "delete_action": "Eliminar", + "error_heading": "Se produjo un error", + "leave_warning": "¿Estás seguro de que deseas salir? Es posible que no se guarden los datos que ingresaste.", + "loading_text": "Cargando", + "ok_action": "De acuerdo", + "error_code": "Código de error:", + "request_id": "ID de solicitud:", + "optional_text": "(Opcional)", + "unavailable_error": "El proceso de pago no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "unavailable_heading": "El proceso de pago no está disponible temporalmente", + "unstable_network_error": "Al parecer, el servidor está tardando demasiado en responder; esto puede deberse a una mala conexión o un error con nuestros servidores. Vuelve a intentarlo en un momento.", + "order_loading_error": "Ocurrió un error al cargar tu pedido. Vuelve a intentarlo.", + "order_fatal_error_heading": "Ocurrió un error al colocar tu pedido", + "order_fatal_error_extra": "Elige otro método de pago o contáctanos para obtener más ayuda.", + "go_back": "Volver", + "show_more": "Mostrar más" + }, + "customer": { + "checkout_as_guest_text": "¿Vas a realizar el pago como invitado? Podrás guardar tus datos para crear una cuenta con nosotros después.", + "continue_as_guest_action": "Continuar como invitado", + "create_account_action": "Crear cuenta", + "continue": "Continúa", + "set_password_action": "Guardar contraseña", + "required_error": "{label} es un campo obligatorio", + "min_error": "{label} debe ser mayor que {min}", + "max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "create_account_error": "Ocurrió un error al crear tu cuenta. Vuelve a intentarlo.", + "create_address_error": "Sin embargo, ocurrió un error al guardar la dirección en tu libreta de direcciones.", + "create_account_requirements_error_heading": "La contraseña no cumple con los requisitos", + "create_account_success": "Se creó tu cuenta.", + "set_password_success": "Se guardó tu contraseña.", + "create_account_text": "Crear una cuenta para pagar más rápido en futuras ocasiones", + "set_password_text": "Configurar una contraseña para pagar más rápido en futuras ocasiones", + "account_created_text": "Se creó una cuenta para ti, pero tendrás que configurar una contraseña para iniciar sesión.", + "create_account_to_continue_text": "¿No tienes una cuenta? Crea una cuenta para continuar.", + "guest_could_login": "Parece que tienes una cuenta. Inicia sesión con {email} para realizar un pago más rápido.", + "guest_must_login": "Parece que tienes una cuenta. Inicia sesión para continuar con {email} o utiliza otro correo electrónico.", + "guest_temporary_disabled": "El proceso de pago como invitado está desactivado temporalmente. Inicia sesión o crea una cuenta para continuar.", + "customer_heading": "Cliente", + "email_invalid_error": "La dirección de correo electrónico debe ser válida", + "email_label": "Dirección de correo electrónico", + "email_required_error": "La dirección de correo electrónico es obligatoria", + "forgot_password_action": "¿Olvidaste la contraseña?", + "guest_customer_text": "Cliente invitado", + "guest_subscribe_to_newsletter_text": "Suscríbete a nuestro boletín informativo.", + "guest_marketing_consent": "Me gustaría recibir novedades y ofertas.", + "login_action": "Inicia sesión ahora", + "login_text": "¿Ya tienes una cuenta?", + "email_in_use_text": "Ya existe una cuenta para {email}. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "unknown_email_in_use_text": "Ya existe una cuenta para el correo electrónico proporcionado. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "guest_could_login_change_email": "¿No es {email}? Cambiar correo electrónico.", + "password_confirmation_error": "Las contraseñas no coinciden", + "password_confirmation_label": "Confirmar contraseña", + "password_confirmation_required_error": "Este campo es obligatorio", + "password_label": "Contraseña", + "password_letter_required_error": "La contraseña debe contener una letra", + "password_minimum_character_label": "mínimo de caracteres, distingue entre mayúsculas y minúsculas", + "password_number_required_error": "La contraseña debe contener un número", + "password_over_maximum_length_error": "La contraseña es demasiado larga", + "password_required_error": "Se requiere la contraseña", + "password_under_minimum_length_error": "La contraseña es demasiado corta", + "reset_password_before_login_error": "El inicio de sesión no está disponible en este momento. Recibirás un correo electrónico en los próximos 5 minutos con instrucciones para restablecer tu contraseña. Si no recibes este correo electrónico, verifica tu carpeta de correo no deseado o contáctanos para obtener más ayuda.", + "returning_customer_text": "Cliente habitual", + "sign_in_action": "Iniciar sesión", + "sign_in_error": "El correo electrónico o la contraseña que ingresaste no son válidos.", + "sign_in_throttled_error": "Debido a que hubo muchos intentos de inicio de sesión, espera 10 segundos antes de intentar iniciar la sesión de nuevo.", + "sign_out_action": "Cerrar sesión", + "sign_out_error": "Ocurrió un error al cerrar la sesión. Vuelve a intentarlo.", + "subscribe_to_newsletter_text": "Sí, me gustaría recibir actualizaciones.", + "suggestion_text": "Al parecer, tienes una cuenta con {provider}. Para un realizar un pago rápido, continúa con {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "No pudimos enviarte un enlace de inicio de sesión. Vuelve a intentarlo.", + "error_not_found": "El correo electrónico ingresado no está asociado a una cuenta. Inténtalo con otro correo electrónico.", + "sent_header": "Revisa tu bandeja de entrada", + "sent_text": "Enviamos un correo electrónico a {email} que contiene un vínculo de inicio de sesión. Esto vencerá en {minutes} minutos. Si no lo ves en tu bandeja de entrada, revisa tu carpeta de correo no deseado.", + "text": "Ingresa la dirección de correo electrónico asociada a tu cuenta. Te enviaremos un enlace de inicio de sesión.", + "header": "Ingresa tu dirección de correo electrónico", + "header_with_email": "Confirma tu dirección de correo electrónico", + "link": "En su lugar, necesito que se me envíe un enlace de inicio de sesión.", + "use_another_email": "Usar otro correo electrónico", + "send": "Enviar", + "error_temporary_disabled": "La funcionalidad del enlace de inicio de sesión no está disponible temporalmente. Inicia sesión con tu contraseña.", + "resend_link": "¿No recibiste el correo electrónico? Volver a enviar el enlace", + "use_password_link": " o inicia sesión con tu contraseña en su lugar." + }, + "embedded_checkout": { + "unsupported_error": "Los siguientes métodos de pago no son compatibles con el pago integrado: {methods}. Comunícate con nosotros para obtener ayuda." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Paga después", + "affirm_body_text": "Se te redirigirá a Affirm para completar de forma segura tu compra. Simplemente, proporciona algunos datos básicos y obtén una decisión en tiempo real. La verificación de tu elegibilidad no afectará tu puntaje crediticio.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Pagar con Afterpay", + "amazon_continue_action": "Continuar con Amazon", + "amazonpay_continue_action": "Continuar con Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continúa", + "bluesnap_v2_continue_action": "Continúa", + "bolt_benefit_1": "Compra cientos de marcas con un inicio de sesión sin requerir una contraseña", + "bolt_benefit_2": "Procesar el pago utilizando los detalles de pago y envío guardados", + "bolt_benefit_3": "Recibe los beneficios de la seguridad de la cuenta que cumple con las PCI", + "bolt_checkbox_agreement": "Guardar mi información, crear una cuenta de Bolt y aceptar los Términos de uso y la Política de privacidad de Bolt.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continuar con Visa Checkout", + "ccavenuemars_description_text": "Pagar con CCAvenue", + "chasepay_continue_action": "Continuar con Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Editar tarjeta", + "chasepay_logout": "Cerrar sesión en Chase Pay", + "chasepay_fail_load": "No se pudo cargar Chase Pay", + "checkoutcom_document_label_boleto": "CPF o CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "ID nacional", + "checkoutcom_document_invalid_error_boleto": "El CPF o CNPJ debe tener entre 11 y 14 caracteres", + "checkoutcom_document_invalid_error_oxxo": "La CURP debe tener como máximo 18 caracteres", + "checkoutcom_document_invalid_error_qpay": "El ID nacional debe tener un máximo de 32 caracteres", + "checkoutcom_fawry_customer_mobile_invalid_error": "El número de teléfono móvil debe ser válido", + "checkoutcom_fawry_customer_mobile_label": "Número de teléfono móvil", + "checkoutcom_fawry_customer_email_invalid_error": "La dirección de correo electrónico debe ser válida", + "checkoutcom_fawry_customer_email_label": "Correo electrónico", + "checkoutcom_sepa_creditor_title": "Acreedor", + "checkoutcom_sepa_creditor_id": "ID del acreedor: {creditorId}", + "checkoutcom_sepa_debtor_title": "Deudor", + "checkoutcom_sepa_mandate_disclaimer": "Al aceptar este formulario de mandato, autorizas a {creditorName} a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y a tu banco para que realice el cargo en tu cuenta de acuerdo con dichas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "checkoutcom_sepa_payment_type": "Tipo de pago: único (no recurrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Tarjeta de crédito", + "credit_card_customer_code_label": "Código de cliente", + "credit_card_cvv_help_text": "Para VISA y Mastercard, el CVV es un código de tres dígitos impreso en el reverso. Para American Express, es el código de cuatro dígitos impreso en el anverso. El CVV es una medida de seguridad para garantizar que tienes la tarjeta en tu poder.", + "credit_card_cvv_invalid_error": "El CVV debe ser válido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "El CVV es obligatorio", + "credit_card_expiration_invalid_error": "La fecha de vencimiento debe ser una fecha futura válida en el formato MM/YY", + "credit_card_expiration_label": "Vencimiento", + "credit_card_expiration_date_label": "Fecha de vencimiento", + "credit_card_expiration_required_error": "La fecha de vencimiento es obligatoria", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nombre que aparece en la tarjeta", + "credit_card_name_required_error": "El nombre completo es obligatorio", + "credit_card_number_invalid_error": "El número de tarjeta de crédito debe ser válido", + "credit_card_number_label": "Número de tarjeta de crédito", + "credit_card_number_last_four": "Ingresa el número de la tarjeta de {cardType} con terminación en {lastFour}", + "credit_card_number_required_error": "El número de tarjeta de crédito es obligatorio", + "credit_card_number_mismatch_error": "El número de tarjeta que se ingresó no coincide con la tarjeta guardada en tu cuenta", + "credit_debit_card_text": "Tarjeta de débito/crédito", + "digitalriver_dropin_error": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "digitalriver_checkout_error": "Hubo un problema con tu proceso de pago; revisa tus datos e inténtalo de nuevo o ponte en contacto con el servicio de atención al cliente", + "digitalriver_checkout_error_title": "Error al procesar la solicitud.", + "digitalriver_display_name_text": "Selecciona tu método de pago", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm no puede procesar el pago de este pedido; selecciona otro método de pago.", + "klarna_continue_action": "Continuar con Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuar con {methodName}", + "opy_widget_slogan": "Compra ahora. Paga de manera más inteligente.", + "opy_widget_info": "Se te redirigirá al sitio web de {methodName} para que completes tu pedido cuando hagas clic en “Continuar con {methodName}“", + "orbital_continue_action": "Realizar pedido", + "orbital_description_text": "Paga con tu cuenta de ChasePay", + "payment_cancelled": "El pago fue cancelado", + "payment_error": "Ocurrió un error al procesar tu pago. Vuelve a intentarlo.", + "payment_error_heading": "Error en el pago", + "payment_heading": "Pago", + "payment_invalid_error_heading": "Pago no disponible", + "payment_method_disabled_error": "El método de pago seleccionado ya no es válido. Haz clic en Aceptar para ver los métodos de pago más actualizados.", + "payment_method_error": "Respuesta del proveedor de pagos: {message}", + "payment_method_invalid_error": "Hay un problema al procesar tu pago. Ponte en contacto con nosotros para obtener ayuda o elige otra forma de pago.", + "payment_method_unavailable_error": "Este proveedor de pagos no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "payment_not_required_text": "No se requiere el pago para este pedido.", + "paypal_continue_action": "Continuar con PayPal", + "braintreevenmo_continue_action": "Continuar con Venmo", + "paypal_credit_continue_action": "Continuar con PayPal Credit", + "paypal_credit_description_text": "Compra ahora y paga después", + "paypal_description_text": "Pagar con tu cuenta de PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pagar después", + "place_order_action": "Realizar pedido", + "place_order_error": "Ocurrió un error al colocar tu pedido. Ponte en contacto con nosotros.", + "place_order_error_heading": "No se pudo realizar el pedido", + "postal_code_label": "Código postal", + "ideal_bic_required": "Debes seleccionar un emisor para realizar el pedido", + "instrument_text": "Almacenamiento de tarjetas de crédito", + "instrument_add_card_action": "Usar una tarjeta diferente", + "instrument_default_ending_in_text": "Tarjeta con terminación en {endingIn}", + "instrument_ending_in_text": "{cardTitle} con terminación en {endingIn}", + "instrument_expired_text": "Venció el {expiryDate}", + "instrument_expires_text": "Vence el {expiryDate}", + "instrument_manage_button": "manejar", + "instrument_manage_modal_confirmation_action": "Sí, eliminar", + "instrument_manage_modal_confirmation_label": "¿Estás seguro de que deseas eliminar este método de pago guardado?", + "instrument_manage_modal_title_text": "Administrar métodos de pago guardados", + "instrument_manage_modal_empty_text": "No tienes ningún método de pago guardado.", + "instrument_manage_table_header_ending_in_text": "Con terminación en", + "instrument_manage_table_header_expiry_date_text": "Fecha de vencimiento", + "instrument_manage_table_header_payment_method_text": "Método de pago", + "instrument_manage_delete_server_error": "Ocurrió un error al intentar eliminar ese método de pago almacenado. Vuelve a intentarlo.", + "instrument_manage_delete_auth_error": "Ocurrió un problema al autorizar tu solicitud. Vuelve a intentar iniciar sesión.", + "instrument_manage_delete_client_error": "Ocurrió un error al intentar eliminar el método de pago guardado: el método de pago ya no existe o no se puede eliminar.", + "instrument_save_payment_method_label": "Guardar esta tarjeta para futuras transacciones", + "instrument_save_as_default_payment_method_label": "Utilizar esta tarjeta como método de pago predeterminado para transacciones futuras", + "account_instrument_add_action": "Usar una cuenta diferente", + "account_instrument_save_payment_method_label": "Guardar esta cuenta para transacciones futuras", + "account_instrument_save_as_default_payment_method_label": "Usar esta cuenta como forma de pago predeterminada para transacciones futuras", + "account_instrument_text": "Cuentas guardadas", + "account_instrument_new_shipping_address": "Notamos que esta es una nueva dirección de envío.

Por razones de seguridad, deberás volver a vincular tu cuenta de PayPal cuando realices un envío a una dirección por primera vez o si la dirección de envío se modificó recientemente.

", + "instrument_trusted_shipping_address_text": "Este paso de seguridad adicional se aplica a tu tarjeta cuando realizas el envío a una dirección por primera vez o si la dirección de envío se editó recientemente.", + "instrument_trusted_shipping_address_title_text": "Vuelve a ingresar tu número de tarjeta para autorizar esta transacción.", + "quadpay_continue_action": "Continuar con Zip", + "quadpay_display_name_text": "Pagar en 4 plazos (Quadpay)", + "ppsdk_continue_action": "Continuar con {methodName}", + "select_your_bank": "Selecciona tu banco", + "sepa_account_number": "Número de cuenta (IBAN)", + "sepa_account_number_required": "Debes ingresar tu número de cuenta (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "El BIC debe tener 8 u 11 caracteres", + "sepa_mandate_required": "Debes aceptar el formulario de mandato", + "sezzle_display_name_text": "Paga después. 0% de interés.", + "stripe_sepa_display_name_text": "Sepa Direct Debit.", + "stripe_sepa_mandate_disclaimer": "Al proporcionar tu IBAN y confirmar este pago, autorizas a (A) {storeUrl} y a Stripe, nuestro proveedor de servicios de pago, a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y (B) a tu banco para que realice el cargo en tu cuenta de acuerdo con esas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "tax_provider_unavailable": "No se pudo calcular el impuesto sobre las ventas. Vuelve a intentarlo. Si persiste el problema, ponte en contacto con nuestro equipo de asistencia para completar el proceso de pago.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continuar con Click to pay", + "zip_continue_action": "Continuar con Zip", + "zip_name_text": "Código postal", + "zip_display_name_text": "Compra ahora, paga después", + "errors": { + "additional_action_required": "Continúa con acciones adicionales.", + "authorization_expired": "La autorización para esta transacción ha vencido.", + "authorization_revoked": "Se revocó la autorización para esta transacción.", + "call_issuer": "Hubo un problema al procesar su tarjeta. Póngase en contacto con el emisor de su tarjeta.", + "captured_transaction": "Ya se realizó el pago de este pedido.", + "card_declined": "El pago fue rechazado. Intente con una tarjeta diferente.", + "card_error": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "card_replaced": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "connection_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "duplicate_transaction": "Ésta es una transacción duplicada. Comuníquese con nosotros para confirmar su pedido. No intente pagar de nuevo.", + "expired_card": "Su tarjeta ha vencido. Inténtelo de nuevo con una tarjeta válida.", + "gateway_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "general_error": "Error al procesar la solicitud de pago.", + "hosted_form_error": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "incorrect_amount": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_zip": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "insufficient_funds": "El pago fue rechazado. Póngase en contacto con su banco.", + "invalid_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "invalid_amount": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_authorization_code": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_create_instrument_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_email_address": "No se pudo procesar el pago porque se proporcionó un correo electrónico no válido con la transacción.", + "invalid_expiry_date": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_expiry_month": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_expiry_year": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_gateway": "El portal de pago no es válido.", + "invalid_gateway_options": "Las opciones del portal de pago no son válidas.", + "invalid_instrument": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_issuer": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_payment_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_request_error": "En este momento tenemos dificultades para procesar tu transacción. Ponte en contacto con nosotros o inténtalo de nuevo más tarde.", + "invalid_user_authentication": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "invalid_zip": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "journal_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "lost_or_stolen_card": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "missing_test_mode": "No se puede procesar la solicitud porque se proporcionaron datos no válidos con la transacción.", + "not_found": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "payment_config_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "payment_config_not_found": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "pending_review": "Su transacción fue autorizada, pero está retenida por el comerciante para su revisión.", + "pickup_card": "Su tarjeta no puede ser utilizada para hacer este pago. Póngase en contacto con el emisor de su tarjeta o inténtelo con otra tarjeta.", + "processing_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "provider_configuration_error": "El proveedor de pagos del comerciante no está configurado correctamente.", + "refund_timelimit_expired": "El límite de tiempo para reembolsar esta transacción ya venció.", + "refunded_transaction": "Esta transacción ya se reembolsó.", + "request_timeout": "Su pago no pudo ser procesado debido al tiempo de espera. Intente de nuevo.", + "required_field": "No se pudo verificar tu pago. Revisa los detalles de tu tarjeta y vuelve a intentarlo.", + "server_error": "Hubo un error al procesar tu pago y tu pedido no pudo completarse. Vuelve a intentarlo.", + "store_instrument_failed": "No se puede procesar la solicitud. Vuelve a intentarlo.", + "stored_payment_instrument_not_found": "No se pudo encontrar ese instrumento de pago guardado. Inténtalo con otra opción de pago.", + "three_d_secure_declined": "Ha habido un problema con tu pago: revisa tus detalles de pago o comunícate con el emisor de tu tarjeta.", + "three_d_secure_failed": "Error en el pago. Vuelve a intentarlo o utiliza una opción de pago diferente.", + "three_d_secure_required": "Se requiere autenticación adicional para procesar su pago. Póngase en contacto con nosotros.", + "token_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "transaction_declined": "Su pago fue rechazado. Intente de nuevo.", + "transaction_rejected": "El pago fue rechazado. Vuelva a intentarlo.", + "unauthorized": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "unsupported_currency": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "unsupported_instrument": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "unsupported_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "user_authorization_error": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "vaulting_service_unavailable": "El servicio de bóveda no está disponible actualmente.", + "voided_transaction": "Su pago no pudo ser procesado debido a que la transacción ya se anuló. Inténtelo de nuevo o póngase en contacto con nosotros." + } + }, + "redeemable": { + "applied_text": "Aplicado", + "apply_action": "Aplicar", + "apply_store_credit_after_action": "crédito de la tienda para hacer un pedido", + "apply_store_credit_before_action": "Aplicar", + "code_invalid_error": "El certificado de regalo o el código de cupón no es válido", + "code_label": "Certificado de regalo o código de cupón", + "code_required_error": "Ingresa un certificado de regalo o un código de cupón", + "coupon_location_error": "Tu dirección de envío no cumple con los requisitos de ubicación para el código de cupón que ingresaste.", + "coupon_min_order_total": "Tu pedido no alcanza el total mínimo para que se aplique este código de cupón.", + "coupon_text": "Cupón", + "gift_certificate_remaining_text": "Restante", + "gift_certificate_text": "Certificado de regalo", + "remove_action": "Quitar", + "store_credit_available_text": "Actualmente, tu cuenta tiene {storeCredit} de crédito total de la tienda disponible", + "toggle_action": "Cupón/Certificado de regalo" + }, + "remote": { + "browser_unsupported": "El método de pago seleccionado requiere un navegador web diferente. Elige otro método de pago.", + "connection_error": "Se rechazó la conexión con el proceso de pago remoto. Vuelve a intentarlo más tarde.", + "continue_with_text": "O continúa con", + "payment_method_error": "Ocurrió un error al recuperar tu método de pago remoto. Vuelve a intentarlo.", + "select_different_card_action": "Selecciona una tarjeta diferente", + "session_error": "Tu sesión remota ya venció. Vuelve a iniciar sesión.", + "shipping_address_error": "Ocurrió un error al recuperar tu dirección de envío remota. Vuelve a intentarlo.", + "sign_in_action": "Inicia sesión en {providerName}", + "sign_out_action": "Cierra sesión en {providerName}", + "sign_out_after_action": "para ver otros métodos de pago", + "sign_in_required_error": "Se requiere inicio de sesión remoto antes del pago" + }, + "shipping": { + "cart_change_error": "Se detectó una actualización en tu carrito de compras y se actualizaron tus costos de envío disponibles. Vuelve a seleccionar un método de envío para continuar.", + "enter_shipping_address_text": "Ingresa una dirección de envío para ver las cotizaciones de envío", + "order_comment_label": "Comentarios del pedido", + "assign_item_error": "Ocurrió un error al asignar el elemento a la dirección. Vuelve a intentarlo.", + "assign_item_invalid_address_error_heading": "Dirección no válida", + "assign_item_invalid_address_error": "La dirección seleccionada no es válida. Ve a la página de tu cuenta y actualízala.", + "unassign_item_error": "Ocurrió un error al cancelar la asignación del artículo a la dirección.", + "save_shipping_address_error": "Ocurrió un error al guardar la dirección de envío en tu cotización. Vuelve a intentarlo.", + "save_shipping_option_error": "Ocurrió un error al guardar la cotización de envío en tu pedido. Vuelve a intentarlo.", + "select_shipping_address_text": "Selecciona una dirección de envío para ver las cotizaciones de envío", + "shipping_address_heading": "Dirección de envío", + "multishipping_address_heading": "Elige a dónde enviar cada artículo", + "multishipping_address_heading_guest": "Inicia sesión primero", + "multishipping_guest_intro": "Para enviar tus artículos a varias direcciones, debes", + "multishipping_guest_sign_in": "iniciar sesión en tu cuenta", + "multishipping_guest_create": "o crea una cuenta antes de continuar.", + "ship_to_multi": "Enviar a varias direcciones", + "ship_to_single": "Enviar a una sola dirección", + "shipping_heading": "Envío", + "shipping_method_label": "Método de envío", + "shipping_option_expired_error": "El precio de envío que se te indicó ya no es válido. Haz clic en Aceptar para ver los precios de envío más actualizados.", + "shipping_option_expired_heading": "Se actualizó tu precio de envío", + "view_shipping_options_action": "Ver otras opciones" + }, + "social": { + "share_action": "Compartir", + "share_heading": "¡Cuéntale a tus amigos sobre tu compra!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Haz clic aquí para confirmar que eres una persona antes de continuar." + }, + "privacy_policy": { + "required_error": "Acepta la Política de Privacidad.", + "label": "Sí, acepto la Política de Privacidad.", + "heading": "Política de Privacidad" + }, + "terms_and_conditions": { + "agreement_required_error": "Acepta los términos y condiciones.", + "agreement_text": "Sí, acepto los términos y condiciones anteriores.", + "agreement_with_link_text": "Sí, acepto los términos y condiciones.", + "terms_and_conditions_heading": "Términos y condiciones" + }, + "order_confirmation": { + "mandate": { + "checkoutcom": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO", + "sepa": "SEPA Direct Debit (a través de Checkout.com) Referencia de la orden: {mandate}" + }, + "stripev3": { + "iban": "Orden de débito directo SEPA" + }, + "stripe_upe": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO" + } + }, + "order_number_text": "Tu número de pedido es {orderNumber}", + "order_pending_review_text": "Ya se nos envió tu pedido, pero actualmente estamos en espera del pago. Una vez que lo recibamos, se completará tu pedido. Si ya proporcionaste los detalles del pago, procesaremos tu pedido manualmente y te enviaremos un correo electrónico cuando esté completo.", + "order_pending_status_text": "Hemos recibido tu pedido y estamos procesando tu pago. Una vez que se haya verificado el pago, se completará tu pedido. Te enviaremos un correo electrónico cuando se haya completado. Ten en cuenta que este proceso puede tardar unos minutos, dependiendo de los tiempos de procesamiento del método elegido. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_incomplete_status_text": "Hemos recibido tu pedido y tu pago. Nuestro sistema está procesando tu pedido. Ten en cuenta que el procesamiento puede tardar unos minutos. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_with_downloadable_digital_items_text": "Puedes descargar tus compras digitales haciendo clic en los enlaces de esta página o iniciando sesión en tu cuenta en cualquier momento. También hay un enlace de descarga en tu correo electrónico de confirmación, que debería llegarte en breve.", + "order_with_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes preguntas sobre tu compra, envíanos un correo electrónico a {supportEmail} o llámanos al {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Una vez que recibamos tu pago, te enviaremos un correo electrónico de confirmación con un enlace para descargar tus compras digitales.", + "order_without_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "thank_you_customer_heading": "¡Gracias, {name}!", + "thank_you_heading": "¡Muchas gracias!", + "continue_shopping": "Seguir comprando »", + "order_status_update_facebook_messenger_heading": "Recibe actualizaciones al instante de tu pedido en Messenger" + } + } +} diff --git a/assets/json/es-MX.json b/assets/json/es-MX.json new file mode 100644 index 000000000..5d048084c --- /dev/null +++ b/assets/json/es-MX.json @@ -0,0 +1,472 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Dirección", + "address_line_1_required_error": "La dirección es obligatoria", + "address_line_2_label": "Departamento/Interior/Edificio", + "address_line_2_required_error": "Departamento/Interior/Edificio es un campo obligatorio", + "address_not_recognized_heading": "No reconocimos tu dirección", + "consignment_address_updated_text": "El artículo se asignó correctamente a la nueva dirección.", + "city_label": "Ciudad", + "city_required_error": "La ciudad es obligatoria", + "company_name_label": "Nombre de la empresa", + "company_name_required_error": "Empresa es un campo obligatorio", + "confirm_address_action": "Continuar con la dirección actual", + "confirm_address_text": "No pudimos encontrar una coincidencia para la dirección que ingresaste. Confirma la dirección.", + "country_label": "País", + "country_required_error": "País es un campo obligatorio", + "custom_required_error": "{label} es un campo obligatorio", + "custom_min_error": "{label} debe ser mayor que {min}", + "custom_max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "custom_valid_error": "{label} no es válido", + "edit_address_action": "Editar dirección", + "enter_address_action": "Ingresa una nueva dirección", + "add_address_heading": "Agregar dirección", + "save_address_action": "Guardar dirección", + "first_name_label": "Nombre de pila", + "first_name_required_error": "El campo Nombre es obligatorio.", + "last_name_label": "Apellido", + "last_name_required_error": "El campo Apellido es obligatorio.", + "phone_number_label": "Número telefónico", + "phone_number_required_error": "El campo Número de teléfono es obligatorio.", + "postal_code_label": "Código postal", + "postal_code_required_error": "El campo Código postal es obligatorio.", + "save_in_addressbook": "Guardar esta dirección en mi libreta de direcciones.", + "select_country_action": "Seleccionar un país", + "select_state_action": "Seleccionar un estado", + "state_label": "Estado/Provincia", + "state_required_error": "Estado/Provincia es un campo obligatorio.", + "select": "Seleccionar", + "select_all": "Todos", + "select_none": "ninguna" + }, + "billing": { + "billing_address_heading": "Dirección de facturación", + "billing_heading": "Facturación", + "save_billing_address_error": "Ocurrió un error al guardar la dirección de facturación en tu cotización. Vuelve a intentarlo.", + "billing_address_amazon": "Misma que la dirección de facturación que estableciste en tu cuenta de Amazon.", + "billing_address_amazonpay": "Administrado por Amazon Pay", + "use_shipping_address_label": "Mi dirección de facturación es la misma que mi dirección de envío." + }, + "cart": { + "billed_amount_text": "*Se te cobrará y facturará {total} ({code}) por este pedido.", + "based_on_currency_text": "Con base en {total} {code}", + "cart_heading": "Resumen del pedido", + "digital_item_text": "Elemento digital", + "discount_text": "Descuento", + "downloads_action": "Ir a Descargas", + "edit_cart_action": "Editar carrito", + "estimated_total_text": "Total estimado", + "free_text": "Gratuito", + "gift_certificate_text": "Certificado de regalo", + "handling_text": "Manipulación", + "item_count_text": "{count, plural, one{1 Artículo} other{# Artículos} }", + "print_action": "Imprimir", + "remaining_text": "Restante", + "remove_action": "Quitar", + "see_all_action": "Ver todo", + "see_less_action": "Ver menos", + "shipping_text": "Envío", + "gift_wrapping_text": "Envoltura de regalo", + "show_details_action": "Mostrar detalles", + "store_credit_text": "Crédito de la tienda", + "subtotal_text": "Subtotal", + "taxes_text": "Impuestos", + "total_text": "Total", + "empty_cart_message": "Tu carrito está vacío; se te está redirigiendo. Haz clic aquí si tu navegador no te redirige." + }, + "common": { + "cancel_action": "Cancelar", + "close_action": "Cerrar", + "continue_action": "Continúa", + "edit_action": "Editar", + "delete_action": "Eliminar", + "error_heading": "Se produjo un error", + "leave_warning": "¿Estás seguro de que deseas salir? Es posible que no se guarden los datos que ingresaste.", + "loading_text": "Cargando", + "ok_action": "De acuerdo", + "error_code": "Código de error:", + "request_id": "ID de solicitud:", + "optional_text": "(Opcional)", + "unavailable_error": "El proceso de pago no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "unavailable_heading": "El proceso de pago no está disponible temporalmente", + "unstable_network_error": "Al parecer, el servidor está tardando demasiado en responder; esto puede deberse a una mala conexión o un error con nuestros servidores. Vuelve a intentarlo en un momento.", + "order_loading_error": "Ocurrió un error al cargar tu pedido. Vuelve a intentarlo.", + "order_fatal_error_heading": "Ocurrió un error al colocar tu pedido", + "order_fatal_error_extra": "Elige otro método de pago o contáctanos para obtener más ayuda.", + "go_back": "Volver", + "show_more": "Mostrar más" + }, + "customer": { + "checkout_as_guest_text": "¿Vas a realizar el pago como invitado? Podrás guardar tus datos para crear una cuenta con nosotros después.", + "continue_as_guest_action": "Continuar como invitado", + "create_account_action": "Crear cuenta", + "continue": "Continúa", + "set_password_action": "Guardar contraseña", + "required_error": "{label} es un campo obligatorio", + "min_error": "{label} debe ser mayor que {min}", + "max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "create_account_error": "Ocurrió un error al crear tu cuenta. Vuelve a intentarlo.", + "create_address_error": "Sin embargo, ocurrió un error al guardar la dirección en tu libreta de direcciones.", + "create_account_requirements_error_heading": "La contraseña no cumple con los requisitos", + "create_account_success": "Se creó tu cuenta.", + "set_password_success": "Se guardó tu contraseña.", + "create_account_text": "Crear una cuenta para pagar más rápido en futuras ocasiones", + "set_password_text": "Configurar una contraseña para pagar más rápido en futuras ocasiones", + "account_created_text": "Se creó una cuenta para ti, pero tendrás que configurar una contraseña para iniciar sesión.", + "create_account_to_continue_text": "¿No tienes una cuenta? Crea una cuenta para continuar.", + "guest_could_login": "Parece que tienes una cuenta. Inicia sesión con {email} para realizar un pago más rápido.", + "guest_must_login": "Parece que tienes una cuenta. Inicia sesión para continuar con {email} o utiliza otro correo electrónico.", + "guest_temporary_disabled": "El proceso de pago como invitado está desactivado temporalmente. Inicia sesión o crea una cuenta para continuar.", + "customer_heading": "Cliente", + "email_invalid_error": "La dirección de correo electrónico debe ser válida", + "email_label": "Dirección de correo electrónico", + "email_required_error": "La dirección de correo electrónico es obligatoria", + "forgot_password_action": "¿Olvidaste la contraseña?", + "guest_customer_text": "Cliente invitado", + "guest_subscribe_to_newsletter_text": "Suscríbete a nuestro boletín informativo.", + "guest_marketing_consent": "Me gustaría recibir novedades y ofertas.", + "login_action": "Inicia sesión ahora", + "login_text": "¿Ya tienes una cuenta?", + "email_in_use_text": "Ya existe una cuenta para {email}. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "unknown_email_in_use_text": "Ya existe una cuenta para el correo electrónico proporcionado. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "guest_could_login_change_email": "¿No es {email}? Cambiar correo electrónico.", + "password_confirmation_error": "Las contraseñas no coinciden", + "password_confirmation_label": "Confirmar contraseña", + "password_confirmation_required_error": "Este campo es obligatorio", + "password_label": "Contraseña", + "password_letter_required_error": "La contraseña debe contener una letra", + "password_minimum_character_label": "mínimo de caracteres, distingue entre mayúsculas y minúsculas", + "password_number_required_error": "La contraseña debe contener un número", + "password_over_maximum_length_error": "La contraseña es demasiado larga", + "password_required_error": "Se requiere la contraseña", + "password_under_minimum_length_error": "La contraseña es demasiado corta", + "reset_password_before_login_error": "El inicio de sesión no está disponible en este momento. Recibirás un correo electrónico en los próximos 5 minutos con instrucciones para restablecer tu contraseña. Si no recibes este correo electrónico, verifica tu carpeta de correo no deseado o contáctanos para obtener más ayuda.", + "returning_customer_text": "Cliente habitual", + "sign_in_action": "Iniciar sesión", + "sign_in_error": "El correo electrónico o la contraseña que ingresaste no son válidos.", + "sign_in_throttled_error": "Debido a que hubo muchos intentos de inicio de sesión, espera 10 segundos antes de intentar iniciar la sesión de nuevo.", + "sign_out_action": "Cerrar sesión", + "sign_out_error": "Ocurrió un error al cerrar la sesión. Vuelve a intentarlo.", + "subscribe_to_newsletter_text": "Sí, me gustaría recibir actualizaciones.", + "suggestion_text": "Al parecer, tienes una cuenta con {provider}. Para un realizar un pago rápido, continúa con {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "No pudimos enviarte un enlace de inicio de sesión. Vuelve a intentarlo.", + "error_not_found": "El correo electrónico ingresado no está asociado a una cuenta. Inténtalo con otro correo electrónico.", + "sent_header": "Revisa tu bandeja de entrada", + "sent_text": "Enviamos un correo electrónico a {email} que contiene un vínculo de inicio de sesión. Esto vencerá en {minutes} minutos. Si no lo ves en tu bandeja de entrada, revisa tu carpeta de correo no deseado.", + "text": "Ingresa la dirección de correo electrónico asociada a tu cuenta. Te enviaremos un enlace de inicio de sesión.", + "header": "Ingresa tu dirección de correo electrónico", + "header_with_email": "Confirma tu dirección de correo electrónico", + "link": "En su lugar, necesito que se me envíe un enlace de inicio de sesión.", + "use_another_email": "Usar otro correo electrónico", + "send": "Enviar", + "error_temporary_disabled": "La funcionalidad del enlace de inicio de sesión no está disponible temporalmente. Inicia sesión con tu contraseña.", + "resend_link": "¿No recibiste el correo electrónico? Volver a enviar el enlace", + "use_password_link": " o inicia sesión con tu contraseña en su lugar." + }, + "embedded_checkout": { + "unsupported_error": "Los siguientes métodos de pago no son compatibles con el pago integrado: {methods}. Comunícate con nosotros para obtener ayuda." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Paga después", + "affirm_body_text": "Se te redirigirá a Affirm para completar de forma segura tu compra. Simplemente, proporciona algunos datos básicos y obtén una decisión en tiempo real. La verificación de tu elegibilidad no afectará tu puntaje crediticio.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Pagar con Afterpay", + "amazon_continue_action": "Continuar con Amazon", + "amazonpay_continue_action": "Continuar con Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continúa", + "bluesnap_v2_continue_action": "Continúa", + "bolt_create_account_label": "Recordar mi información con Bolt", + "bolt_create_account_disclaimer": "Al marcar la casilla de arriba, aceptas crear una cuenta de Bolt conforme a las condiciones y la política de privacidad.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continuar con Visa Checkout", + "ccavenuemars_description_text": "Pagar con CCAvenue", + "chasepay_continue_action": "Continuar con Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Editar tarjeta", + "chasepay_logout": "Cerrar sesión en Chase Pay", + "chasepay_fail_load": "No se pudo cargar Chase Pay", + "checkoutcom_document_label_boleto": "CPF o CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "ID nacional", + "checkoutcom_document_invalid_error_boleto": "El CPF o CNPJ debe tener entre 11 y 14 caracteres", + "checkoutcom_document_invalid_error_oxxo": "La CURP debe tener como máximo 18 caracteres", + "checkoutcom_document_invalid_error_qpay": "El ID nacional debe tener un máximo de 32 caracteres", + "checkoutcom_fawry_customer_mobile_invalid_error": "El número de teléfono móvil debe ser válido", + "checkoutcom_fawry_customer_mobile_label": "Número de teléfono móvil", + "checkoutcom_fawry_customer_email_invalid_error": "La dirección de correo electrónico debe ser válida", + "checkoutcom_fawry_customer_email_label": "Correo electrónico", + "checkoutcom_sepa_creditor_title": "Acreedor", + "checkoutcom_sepa_creditor_id": "ID del acreedor: {creditorId}", + "checkoutcom_sepa_debtor_title": "Deudor", + "checkoutcom_sepa_mandate_disclaimer": "Al aceptar este formulario de mandato, autorizas a {creditorName} a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y a tu banco para que realice el cargo en tu cuenta de acuerdo con dichas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "checkoutcom_sepa_payment_type": "Tipo de pago: único (no recurrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Tarjeta de crédito", + "credit_card_customer_code_label": "Código de cliente", + "credit_card_cvv_help_text": "Para VISA y Mastercard, el CVV es un código de tres dígitos impreso en el reverso. Para American Express, es el código de cuatro dígitos impreso en el anverso. El CVV es una medida de seguridad para garantizar que tienes la tarjeta en tu poder.", + "credit_card_cvv_invalid_error": "El CVV debe ser válido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "El CVV es obligatorio", + "credit_card_expiration_invalid_error": "La fecha de vencimiento debe ser una fecha futura válida en el formato MM/YY", + "credit_card_expiration_label": "Vencimiento", + "credit_card_expiration_date_label": "Fecha de vencimiento", + "credit_card_expiration_required_error": "La fecha de vencimiento es obligatoria", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nombre que aparece en la tarjeta", + "credit_card_name_required_error": "El nombre completo es obligatorio", + "credit_card_number_invalid_error": "El número de tarjeta de crédito debe ser válido", + "credit_card_number_label": "Número de tarjeta de crédito", + "credit_card_number_last_four": "Ingresa el número de la tarjeta de {cardType} con terminación en {lastFour}", + "credit_card_number_required_error": "El número de tarjeta de crédito es obligatorio", + "credit_card_number_mismatch_error": "El número de tarjeta que se ingresó no coincide con la tarjeta guardada en tu cuenta", + "credit_debit_card_text": "Tarjeta de débito/crédito", + "digitalriver_dropin_error": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "digitalriver_checkout_error": "Hubo un problema con tu proceso de pago; revisa tus datos e inténtalo de nuevo o ponte en contacto con el servicio de atención al cliente", + "digitalriver_checkout_error_title": "Error al procesar la solicitud.", + "digitalriver_display_name_text": "Selecciona tu método de pago", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm no puede procesar el pago de este pedido; selecciona otro método de pago.", + "klarna_continue_action": "Continuar con Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuar con Openpay", + "orbital_continue_action": "Realizar pedido", + "orbital_description_text": "Paga con tu cuenta de ChasePay", + "payment_cancelled": "El pago fue cancelado", + "payment_error": "Ocurrió un error al procesar tu pago. Vuelve a intentarlo.", + "payment_error_heading": "Error en el pago", + "payment_heading": "Pago", + "payment_invalid_error_heading": "Pago no disponible", + "payment_method_disabled_error": "El método de pago seleccionado ya no es válido. Haz clic en Aceptar para ver los métodos de pago más actualizados.", + "payment_method_error": "Respuesta del proveedor de pagos: {message}", + "payment_method_invalid_error": "Hay un problema al procesar tu pago. Ponte en contacto con nosotros para obtener ayuda o elige otra forma de pago.", + "payment_method_unavailable_error": "Este proveedor de pagos no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "payment_not_required_text": "No se requiere el pago para este pedido.", + "paypal_continue_action": "Continuar con PayPal", + "paypal_credit_continue_action": "Continuar con PayPal Credit", + "paypal_credit_description_text": "Compra ahora y paga después", + "paypal_description_text": "Pagar con tu cuenta de PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pagar después", + "place_order_action": "Realizar pedido", + "place_order_error": "Ocurrió un error al colocar tu pedido. Ponte en contacto con nosotros.", + "place_order_error_heading": "No se pudo realizar el pedido", + "postal_code_label": "Código postal", + "ideal_bic_required": "Debes seleccionar un emisor para realizar el pedido", + "instrument_text": "Almacenamiento de tarjetas de crédito", + "instrument_add_card_action": "Usar una tarjeta diferente", + "instrument_default_ending_in_text": "Tarjeta con terminación en {endingIn}", + "instrument_ending_in_text": "{cardTitle} con terminación en {endingIn}", + "instrument_expired_text": "Venció el {expiryDate}", + "instrument_expires_text": "Vence el {expiryDate}", + "instrument_manage_button": "manejar", + "instrument_manage_modal_confirmation_action": "Sí, eliminar", + "instrument_manage_modal_confirmation_label": "¿Estás seguro de que deseas eliminar este método de pago guardado?", + "instrument_manage_modal_title_text": "Administrar métodos de pago guardados", + "instrument_manage_modal_empty_text": "No tienes ningún método de pago guardado.", + "instrument_manage_table_header_ending_in_text": "Con terminación en", + "instrument_manage_table_header_expiry_date_text": "Fecha de vencimiento", + "instrument_manage_table_header_payment_method_text": "Método de pago", + "instrument_manage_delete_server_error": "Ocurrió un error al intentar eliminar ese método de pago almacenado. Vuelve a intentarlo.", + "instrument_manage_delete_auth_error": "Ocurrió un problema al autorizar tu solicitud. Vuelve a intentar iniciar sesión.", + "instrument_manage_delete_client_error": "Ocurrió un error al intentar eliminar el método de pago guardado: el método de pago ya no existe o no se puede eliminar.", + "instrument_save_payment_method_label": "Guardar esta tarjeta para futuras transacciones", + "instrument_save_as_default_payment_method_label": "Utilizar esta tarjeta como método de pago predeterminado para transacciones futuras", + "account_instrument_add_action": "Usar una cuenta diferente", + "account_instrument_save_payment_method_label": "Guardar esta cuenta para transacciones futuras", + "account_instrument_save_as_default_payment_method_label": "Usar esta cuenta como forma de pago predeterminada para transacciones futuras", + "account_instrument_text": "Cuentas guardadas", + "account_instrument_new_shipping_address": "Notamos que esta es una nueva dirección de envío.

Por razones de seguridad, deberás volver a vincular tu cuenta de PayPal cuando realices un envío a una dirección por primera vez o si la dirección de envío se modificó recientemente.

", + "instrument_trusted_shipping_address_text": "Este paso de seguridad adicional se aplica a tu tarjeta cuando realizas el envío a una dirección por primera vez o si la dirección de envío se editó recientemente.", + "instrument_trusted_shipping_address_title_text": "Vuelve a ingresar tu número de tarjeta para autorizar esta transacción.", + "quadpay_continue_action": "Continuar con Zip", + "quadpay_display_name_text": "Pagar en 4 plazos (Quadpay)", + "ppsdk_continue_action": "Continuar con {methodName}", + "select_your_bank": "Selecciona tu banco", + "sepa_account_number": "Número de cuenta (IBAN)", + "sepa_account_number_required": "Debes ingresar tu número de cuenta (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "El BIC debe tener 8 u 11 caracteres", + "sepa_mandate_required": "Debes aceptar el formulario de mandato", + "sezzle_display_name_text": "Paga después. 0% de interés.", + "stripe_sepa_display_name_text": "Sepa Direct Debit.", + "stripe_sepa_mandate_disclaimer": "Al proporcionar tu IBAN y confirmar este pago, autorizas a (A) {storeUrl} y a Stripe, nuestro proveedor de servicios de pago, a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y (B) a tu banco para que realice el cargo en tu cuenta de acuerdo con esas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "tax_provider_unavailable": "No se pudo calcular el impuesto sobre las ventas. Vuelve a intentarlo. Si persiste el problema, ponte en contacto con nuestro equipo de asistencia para completar el proceso de pago.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continuar con Click to pay", + "zip_continue_action": "Continuar con Zip", + "zip_name_text": "Código postal", + "zip_display_name_text": "Compra ahora, paga después", + "errors": { + "additional_action_required": "Continúa con acciones adicionales.", + "authorization_expired": "La autorización para esta transacción ha vencido.", + "authorization_revoked": "Se revocó la autorización para esta transacción.", + "call_issuer": "Hubo un problema al procesar su tarjeta. Póngase en contacto con el emisor de su tarjeta.", + "captured_transaction": "Ya se realizó el pago de este pedido.", + "card_declined": "El pago fue rechazado. Intente con una tarjeta diferente.", + "card_error": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "card_replaced": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "connection_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "duplicate_transaction": "Ésta es una transacción duplicada. Comuníquese con nosotros para confirmar su pedido. No intente pagar de nuevo.", + "expired_card": "Su tarjeta ha vencido. Inténtelo de nuevo con una tarjeta válida.", + "gateway_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "general_error": "Error al procesar la solicitud de pago.", + "hosted_form_error": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "incorrect_amount": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_zip": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "insufficient_funds": "El pago fue rechazado. Póngase en contacto con su banco.", + "invalid_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "invalid_amount": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_authorization_code": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_create_instrument_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_email_address": "No se pudo procesar el pago porque se proporcionó un correo electrónico no válido con la transacción.", + "invalid_expiry_date": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_expiry_month": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_expiry_year": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_gateway": "El portal de pago no es válido.", + "invalid_gateway_options": "Las opciones del portal de pago no son válidas.", + "invalid_instrument": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_issuer": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_payment_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_request_error": "En este momento tenemos dificultades para procesar tu transacción. Ponte en contacto con nosotros o inténtalo de nuevo más tarde.", + "invalid_user_authentication": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "invalid_zip": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "journal_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "lost_or_stolen_card": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "missing_test_mode": "No se puede procesar la solicitud porque se proporcionaron datos no válidos con la transacción.", + "not_found": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "payment_config_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "payment_config_not_found": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "pending_review": "Su transacción fue autorizada, pero está retenida por el comerciante para su revisión.", + "pickup_card": "Su tarjeta no puede ser utilizada para hacer este pago. Póngase en contacto con el emisor de su tarjeta o inténtelo con otra tarjeta.", + "processing_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "provider_configuration_error": "El proveedor de pagos del comerciante no está configurado correctamente.", + "refund_timelimit_expired": "El límite de tiempo para reembolsar esta transacción ya venció.", + "refunded_transaction": "Esta transacción ya se reembolsó.", + "request_timeout": "Su pago no pudo ser procesado debido al tiempo de espera. Intente de nuevo.", + "required_field": "No se pudo verificar tu pago. Revisa los detalles de tu tarjeta y vuelve a intentarlo.", + "server_error": "Hubo un error al procesar tu pago y tu pedido no pudo completarse. Vuelve a intentarlo.", + "store_instrument_failed": "No se puede procesar la solicitud. Vuelve a intentarlo.", + "stored_payment_instrument_not_found": "No se pudo encontrar ese instrumento de pago guardado. Inténtalo con otra opción de pago.", + "three_d_secure_declined": "Ha habido un problema con tu pago: revisa tus detalles de pago o comunícate con el emisor de tu tarjeta.", + "three_d_secure_failed": "Error en el pago. Vuelve a intentarlo o utiliza una opción de pago diferente.", + "three_d_secure_required": "Se requiere autenticación adicional para procesar su pago. Póngase en contacto con nosotros.", + "token_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "transaction_declined": "Su pago fue rechazado. Intente de nuevo.", + "transaction_rejected": "El pago fue rechazado. Vuelva a intentarlo.", + "unauthorized": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "unsupported_currency": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "unsupported_instrument": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "unsupported_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "user_authorization_error": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "vaulting_service_unavailable": "El servicio de bóveda no está disponible actualmente.", + "voided_transaction": "Su pago no pudo ser procesado debido a que la transacción ya se anuló. Inténtelo de nuevo o póngase en contacto con nosotros." + } + }, + "redeemable": { + "applied_text": "Aplicado", + "apply_action": "Aplicar", + "apply_store_credit_after_action": "crédito de la tienda para hacer un pedido", + "apply_store_credit_before_action": "Aplicar", + "code_invalid_error": "El certificado de regalo o el código de cupón no es válido", + "code_label": "Certificado de regalo o código de cupón", + "code_required_error": "Ingresa un certificado de regalo o un código de cupón", + "coupon_location_error": "Tu dirección de envío no cumple con los requisitos de ubicación para el código de cupón que ingresaste.", + "coupon_min_order_total": "Tu pedido no alcanza el total mínimo para que se aplique este código de cupón.", + "coupon_text": "Cupón", + "gift_certificate_remaining_text": "Restante", + "gift_certificate_text": "Certificado de regalo", + "remove_action": "Quitar", + "store_credit_available_text": "Actualmente, tu cuenta tiene {storeCredit} de crédito total de la tienda disponible", + "toggle_action": "Cupón/Certificado de regalo" + }, + "remote": { + "browser_unsupported": "El método de pago seleccionado requiere un navegador web diferente. Elige otro método de pago.", + "connection_error": "Se rechazó la conexión con el proceso de pago remoto. Vuelve a intentarlo más tarde.", + "continue_with_text": "O continúa con", + "payment_method_error": "Ocurrió un error al recuperar tu método de pago remoto. Vuelve a intentarlo.", + "select_different_card_action": "Selecciona una tarjeta diferente", + "session_error": "Tu sesión remota ya venció. Vuelve a iniciar sesión.", + "shipping_address_error": "Ocurrió un error al recuperar tu dirección de envío remota. Vuelve a intentarlo.", + "sign_in_action": "Inicia sesión en {providerName}", + "sign_out_action": "Cierra sesión en {providerName}", + "sign_out_after_action": "para ver otros métodos de pago", + "sign_in_required_error": "Se requiere inicio de sesión remoto antes del pago" + }, + "shipping": { + "cart_change_error": "Se detectó una actualización en tu carrito de compras y se actualizaron tus costos de envío disponibles. Vuelve a seleccionar un método de envío para continuar.", + "enter_shipping_address_text": "Ingresa una dirección de envío para ver las cotizaciones de envío", + "order_comment_label": "Comentarios del pedido", + "assign_item_error": "Ocurrió un error al asignar el elemento a la dirección. Vuelve a intentarlo.", + "assign_item_invalid_address_error_heading": "Dirección no válida", + "assign_item_invalid_address_error": "La dirección seleccionada no es válida. Ve a la página de tu cuenta y actualízala.", + "unassign_item_error": "Ocurrió un error al cancelar la asignación del artículo a la dirección.", + "save_shipping_address_error": "Ocurrió un error al guardar la dirección de envío en tu cotización. Vuelve a intentarlo.", + "save_shipping_option_error": "Ocurrió un error al guardar la cotización de envío en tu pedido. Vuelve a intentarlo.", + "select_shipping_address_text": "Selecciona una dirección de envío para ver las cotizaciones de envío", + "shipping_address_heading": "Dirección de envío", + "multishipping_address_heading": "Elige a dónde enviar cada artículo", + "multishipping_address_heading_guest": "Inicia sesión primero", + "multishipping_guest_intro": "Para enviar tus artículos a varias direcciones, debes", + "multishipping_guest_sign_in": "iniciar sesión en tu cuenta", + "multishipping_guest_create": "o crea una cuenta antes de continuar.", + "ship_to_multi": "Enviar a varias direcciones", + "ship_to_single": "Enviar a una sola dirección", + "shipping_heading": "Envío", + "shipping_method_label": "Método de envío", + "shipping_option_expired_error": "El precio de envío que se te indicó ya no es válido. Haz clic en Aceptar para ver los precios de envío más actualizados.", + "shipping_option_expired_heading": "Se actualizó tu precio de envío", + "view_shipping_options_action": "Ver otras opciones" + }, + "social": { + "share_action": "Compartir", + "share_heading": "¡Cuéntale a tus amigos sobre tu compra!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Haz clic aquí para confirmar que eres una persona antes de continuar." + }, + "privacy_policy": { + "required_error": "Acepta la Política de Privacidad.", + "label": "Sí, acepto la Política de Privacidad.", + "heading": "Política de Privacidad" + }, + "terms_and_conditions": { + "agreement_required_error": "Acepta los términos y condiciones.", + "agreement_text": "Sí, acepto los términos y condiciones anteriores.", + "agreement_with_link_text": "Sí, acepto los términos y condiciones.", + "terms_and_conditions_heading": "Términos y condiciones" + }, + "order_confirmation": { + "order_number_text": "Tu número de pedido es {orderNumber}", + "order_pending_review_text": "Ya se nos envió tu pedido, pero actualmente estamos en espera del pago. Una vez que lo recibamos, se completará tu pedido. Si ya proporcionaste los detalles del pago, procesaremos tu pedido manualmente y te enviaremos un correo electrónico cuando esté completo.", + "order_pending_status_text": "Hemos recibido tu pedido y estamos procesando tu pago. Una vez que se haya verificado el pago, se completará tu pedido. Te enviaremos un correo electrónico cuando se haya completado. Ten en cuenta que este proceso puede tardar unos minutos, dependiendo de los tiempos de procesamiento del método elegido. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_incomplete_status_text": "Hemos recibido tu pedido y tu pago. Nuestro sistema está procesando tu pedido. Ten en cuenta que el procesamiento puede tardar unos minutos. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_with_downloadable_digital_items_text": "Puedes descargar tus compras digitales haciendo clic en los enlaces de esta página o iniciando sesión en tu cuenta en cualquier momento. También hay un enlace de descarga en tu correo electrónico de confirmación, que debería llegarte en breve.", + "order_with_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes preguntas sobre tu compra, envíanos un correo electrónico a {supportEmail} o llámanos al {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Una vez que recibamos tu pago, te enviaremos un correo electrónico de confirmación con un enlace para descargar tus compras digitales.", + "order_without_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "thank_you_customer_heading": "¡Gracias, {name}!", + "thank_you_heading": "¡Muchas gracias!", + "continue_shopping": "Seguir comprando »", + "order_status_update_facebook_messenger_heading": "Recibe actualizaciones al instante de tu pedido en Messenger", + "mandate_link_text": "{provider} Mandato", + "boleto_link_text": "Ticket del Boleto Bancário", + "oxxo_link_text": "Ticket de OXXO", + "sepa_link_text": "Orden de débito directo SEPA" + } + } +} diff --git a/assets/json/es-PE.json b/assets/json/es-PE.json new file mode 100644 index 000000000..8f78632f9 --- /dev/null +++ b/assets/json/es-PE.json @@ -0,0 +1,487 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Dirección", + "address_line_1_required_error": "La dirección es obligatoria", + "address_line_2_label": "Departamento/Interior/Edificio", + "address_line_2_required_error": "Departamento/Interior/Edificio es un campo obligatorio", + "address_not_recognized_heading": "No reconocimos tu dirección", + "consignment_address_updated_text": "El artículo se asignó correctamente a la nueva dirección.", + "city_label": "Ciudad", + "city_required_error": "La ciudad es obligatoria", + "company_name_label": "Nombre de la empresa", + "company_name_required_error": "Empresa es un campo obligatorio", + "confirm_address_action": "Continuar con la dirección actual", + "confirm_address_text": "No pudimos encontrar una coincidencia para la dirección que ingresaste. Confirma la dirección.", + "country_label": "País", + "country_required_error": "País es un campo obligatorio", + "custom_required_error": "{label} es un campo obligatorio", + "custom_min_error": "{label} debe ser mayor que {min}", + "custom_max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "custom_valid_error": "{label} no es válido", + "edit_address_action": "Editar dirección", + "enter_address_action": "Ingresa una nueva dirección", + "add_address_heading": "Agregar dirección", + "save_address_action": "Guardar dirección", + "first_name_label": "Nombre de pila", + "first_name_required_error": "El campo Nombre es obligatorio.", + "last_name_label": "Apellido", + "last_name_required_error": "El campo Apellido es obligatorio.", + "phone_number_label": "Número telefónico", + "phone_number_required_error": "El campo Número de teléfono es obligatorio.", + "postal_code_label": "Código postal", + "postal_code_required_error": "El campo Código postal es obligatorio.", + "save_in_addressbook": "Guardar esta dirección en mi libreta de direcciones.", + "select_country_action": "Seleccionar un país", + "select_state_action": "Seleccionar un estado", + "state_label": "Estado/Provincia", + "state_required_error": "Estado/Provincia es un campo obligatorio.", + "select": "Seleccionar", + "select_all": "Todos", + "select_none": "ninguna" + }, + "billing": { + "billing_address_heading": "Dirección de facturación", + "billing_heading": "Facturación", + "save_billing_address_error": "Ocurrió un error al guardar la dirección de facturación en tu cotización. Vuelve a intentarlo.", + "billing_address_amazon": "Misma que la dirección de facturación que estableciste en tu cuenta de Amazon.", + "billing_address_amazonpay": "Administrado por Amazon Pay", + "use_shipping_address_label": "Mi dirección de facturación es la misma que mi dirección de envío." + }, + "cart": { + "billed_amount_text": "*Se te cobrará y facturará {total} ({code}) por este pedido.", + "based_on_currency_text": "Con base en {total} {code}", + "cart_heading": "Resumen del pedido", + "digital_item_text": "Elemento digital", + "discount_text": "Descuento", + "downloads_action": "Ir a Descargas", + "edit_cart_action": "Editar carrito", + "estimated_total_text": "Total estimado", + "free_text": "Gratuito", + "gift_certificate_text": "Certificado de regalo", + "handling_text": "Manipulación", + "item_count_text": "{count, plural, one{1 Artículo} other{# Artículos} }", + "print_action": "Imprimir", + "remaining_text": "Restante", + "remove_action": "Quitar", + "see_all_action": "Ver todo", + "see_less_action": "Ver menos", + "shipping_text": "Envío", + "gift_wrapping_text": "Envoltura de regalo", + "show_details_action": "Mostrar detalles", + "store_credit_text": "Crédito de la tienda", + "subtotal_text": "Subtotal", + "taxes_text": "Impuestos", + "total_text": "Total", + "empty_cart_message": "Tu carrito está vacío; se te está redirigiendo. Haz clic aquí si tu navegador no te redirige." + }, + "common": { + "cancel_action": "Cancelar", + "close_action": "Cerrar", + "continue_action": "Continúa", + "edit_action": "Editar", + "delete_action": "Eliminar", + "error_heading": "Se produjo un error", + "leave_warning": "¿Estás seguro de que deseas salir? Es posible que no se guarden los datos que ingresaste.", + "loading_text": "Cargando", + "ok_action": "De acuerdo", + "error_code": "Código de error:", + "request_id": "ID de solicitud:", + "optional_text": "(Opcional)", + "unavailable_error": "El proceso de pago no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "unavailable_heading": "El proceso de pago no está disponible temporalmente", + "unstable_network_error": "Al parecer, el servidor está tardando demasiado en responder; esto puede deberse a una mala conexión o un error con nuestros servidores. Vuelve a intentarlo en un momento.", + "order_loading_error": "Ocurrió un error al cargar tu pedido. Vuelve a intentarlo.", + "order_fatal_error_heading": "Ocurrió un error al colocar tu pedido", + "order_fatal_error_extra": "Elige otro método de pago o contáctanos para obtener más ayuda.", + "go_back": "Volver", + "show_more": "Mostrar más" + }, + "customer": { + "checkout_as_guest_text": "¿Vas a realizar el pago como invitado? Podrás guardar tus datos para crear una cuenta con nosotros después.", + "continue_as_guest_action": "Continuar como invitado", + "create_account_action": "Crear cuenta", + "continue": "Continúa", + "set_password_action": "Guardar contraseña", + "required_error": "{label} es un campo obligatorio", + "min_error": "{label} debe ser mayor que {min}", + "max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "{label} contiene caracteres no válidos", + "create_account_error": "Ocurrió un error al crear tu cuenta. Vuelve a intentarlo.", + "create_address_error": "Sin embargo, ocurrió un error al guardar la dirección en tu libreta de direcciones.", + "create_account_requirements_error_heading": "La contraseña no cumple con los requisitos", + "create_account_success": "Se creó tu cuenta.", + "set_password_success": "Se guardó tu contraseña.", + "create_account_text": "Crear una cuenta para pagar más rápido en futuras ocasiones", + "set_password_text": "Configurar una contraseña para pagar más rápido en futuras ocasiones", + "account_created_text": "Se creó una cuenta para ti, pero tendrás que configurar una contraseña para iniciar sesión.", + "create_account_to_continue_text": "¿No tienes una cuenta? Crea una cuenta para continuar.", + "guest_could_login": "Parece que tienes una cuenta. Inicia sesión con {email} para realizar un pago más rápido.", + "guest_must_login": "Parece que tienes una cuenta. Inicia sesión para continuar con {email} o utiliza otro correo electrónico.", + "guest_temporary_disabled": "El proceso de pago como invitado está desactivado temporalmente. Inicia sesión o crea una cuenta para continuar.", + "customer_heading": "Cliente", + "email_invalid_error": "La dirección de correo electrónico debe ser válida", + "email_label": "Dirección de correo electrónico", + "email_required_error": "La dirección de correo electrónico es obligatoria", + "forgot_password_action": "¿Olvidaste la contraseña?", + "guest_customer_text": "Cliente invitado", + "guest_subscribe_to_newsletter_text": "Suscríbete a nuestro boletín informativo.", + "guest_marketing_consent": "Me gustaría recibir novedades y ofertas.", + "login_action": "Inicia sesión ahora", + "login_text": "¿Ya tienes una cuenta?", + "email_in_use_text": "Ya existe una cuenta para {email}. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "unknown_email_in_use_text": "Ya existe una cuenta para el correo electrónico proporcionado. Ingresa una dirección de correo electrónico diferente o inicia sesión.", + "guest_could_login_change_email": "¿No es {email}? Cambiar correo electrónico.", + "password_confirmation_error": "Las contraseñas no coinciden", + "password_confirmation_label": "Confirmar contraseña", + "password_confirmation_required_error": "Este campo es obligatorio", + "password_label": "Contraseña", + "password_letter_required_error": "La contraseña debe contener una letra", + "password_minimum_character_label": "mínimo de caracteres, distingue entre mayúsculas y minúsculas", + "password_number_required_error": "La contraseña debe contener un número", + "password_over_maximum_length_error": "La contraseña es demasiado larga", + "password_required_error": "Se requiere la contraseña", + "password_under_minimum_length_error": "La contraseña es demasiado corta", + "reset_password_before_login_error": "El inicio de sesión no está disponible en este momento. Recibirás un correo electrónico en los próximos 5 minutos con instrucciones para restablecer tu contraseña. Si no recibes este correo electrónico, verifica tu carpeta de correo no deseado o contáctanos para obtener más ayuda.", + "returning_customer_text": "Cliente habitual", + "sign_in_action": "Iniciar sesión", + "sign_in_error": "El correo electrónico o la contraseña que ingresaste no son válidos.", + "sign_in_throttled_error": "Debido a que hubo muchos intentos de inicio de sesión, espera 10 segundos antes de intentar iniciar la sesión de nuevo.", + "sign_out_action": "Cerrar sesión", + "sign_out_error": "Ocurrió un error al cerrar la sesión. Vuelve a intentarlo.", + "subscribe_to_newsletter_text": "Sí, me gustaría recibir actualizaciones.", + "suggestion_text": "Al parecer, tienes una cuenta con {provider}. Para un realizar un pago rápido, continúa con {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "No pudimos enviarte un enlace de inicio de sesión. Vuelve a intentarlo.", + "error_not_found": "El correo electrónico ingresado no está asociado a una cuenta. Inténtalo con otro correo electrónico.", + "sent_header": "Revisa tu bandeja de entrada", + "sent_text": "Enviamos un correo electrónico a {email} que contiene un vínculo de inicio de sesión. Esto vencerá en {minutes} minutos. Si no lo ves en tu bandeja de entrada, revisa tu carpeta de correo no deseado.", + "text": "Ingresa la dirección de correo electrónico asociada a tu cuenta. Te enviaremos un enlace de inicio de sesión.", + "header": "Ingresa tu dirección de correo electrónico", + "header_with_email": "Confirma tu dirección de correo electrónico", + "link": "En su lugar, necesito que se me envíe un enlace de inicio de sesión.", + "use_another_email": "Usar otro correo electrónico", + "send": "Enviar", + "error_temporary_disabled": "La funcionalidad del enlace de inicio de sesión no está disponible temporalmente. Inicia sesión con tu contraseña.", + "resend_link": "¿No recibiste el correo electrónico? Volver a enviar el enlace", + "use_password_link": " o inicia sesión con tu contraseña en su lugar." + }, + "embedded_checkout": { + "unsupported_error": "Los siguientes métodos de pago no son compatibles con el pago integrado: {methods}. Comunícate con nosotros para obtener ayuda." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Paga después", + "affirm_body_text": "Se te redirigirá a Affirm para completar de forma segura tu compra. Simplemente, proporciona algunos datos básicos y obtén una decisión en tiempo real. La verificación de tu elegibilidad no afectará tu puntaje crediticio.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Pagar con Afterpay", + "amazon_continue_action": "Continuar con Amazon", + "amazonpay_continue_action": "Continuar con Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continúa", + "bluesnap_v2_continue_action": "Continúa", + "bolt_benefit_1": "Compra cientos de marcas con un inicio de sesión sin requerir una contraseña", + "bolt_benefit_2": "Procesar el pago utilizando los detalles de pago y envío guardados", + "bolt_benefit_3": "Recibe los beneficios de la seguridad de la cuenta que cumple con las PCI", + "bolt_checkbox_agreement": "Guardar mi información, crear una cuenta de Bolt y aceptar los Términos de uso y la Política de privacidad de Bolt.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continuar con Visa Checkout", + "ccavenuemars_description_text": "Pagar con CCAvenue", + "chasepay_continue_action": "Continuar con Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Editar tarjeta", + "chasepay_logout": "Cerrar sesión en Chase Pay", + "chasepay_fail_load": "No se pudo cargar Chase Pay", + "checkoutcom_document_label_boleto": "CPF o CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "ID nacional", + "checkoutcom_document_invalid_error_boleto": "El CPF o CNPJ debe tener entre 11 y 14 caracteres", + "checkoutcom_document_invalid_error_oxxo": "La CURP debe tener como máximo 18 caracteres", + "checkoutcom_document_invalid_error_qpay": "El ID nacional debe tener un máximo de 32 caracteres", + "checkoutcom_fawry_customer_mobile_invalid_error": "El número de teléfono móvil debe ser válido", + "checkoutcom_fawry_customer_mobile_label": "Número de teléfono móvil", + "checkoutcom_fawry_customer_email_invalid_error": "La dirección de correo electrónico debe ser válida", + "checkoutcom_fawry_customer_email_label": "Correo electrónico", + "checkoutcom_sepa_creditor_title": "Acreedor", + "checkoutcom_sepa_creditor_id": "ID del acreedor: {creditorId}", + "checkoutcom_sepa_debtor_title": "Deudor", + "checkoutcom_sepa_mandate_disclaimer": "Al aceptar este formulario de mandato, autorizas a {creditorName} a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y a tu banco para que realice el cargo en tu cuenta de acuerdo con dichas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "checkoutcom_sepa_payment_type": "Tipo de pago: único (no recurrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Tarjeta de crédito", + "credit_card_customer_code_label": "Código de cliente", + "credit_card_cvv_help_text": "Para VISA y Mastercard, el CVV es un código de tres dígitos impreso en el reverso. Para American Express, es el código de cuatro dígitos impreso en el anverso. El CVV es una medida de seguridad para garantizar que tienes la tarjeta en tu poder.", + "credit_card_cvv_invalid_error": "El CVV debe ser válido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "El CVV es obligatorio", + "credit_card_expiration_invalid_error": "La fecha de vencimiento debe ser una fecha futura válida en el formato MM/YY", + "credit_card_expiration_label": "Vencimiento", + "credit_card_expiration_date_label": "Fecha de vencimiento", + "credit_card_expiration_required_error": "La fecha de vencimiento es obligatoria", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nombre que aparece en la tarjeta", + "credit_card_name_required_error": "El nombre completo es obligatorio", + "credit_card_number_invalid_error": "El número de tarjeta de crédito debe ser válido", + "credit_card_number_label": "Número de tarjeta de crédito", + "credit_card_number_last_four": "Ingresa el número de la tarjeta de {cardType} con terminación en {lastFour}", + "credit_card_number_required_error": "El número de tarjeta de crédito es obligatorio", + "credit_card_number_mismatch_error": "El número de tarjeta que se ingresó no coincide con la tarjeta guardada en tu cuenta", + "credit_debit_card_text": "Tarjeta de débito/crédito", + "digitalriver_dropin_error": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "digitalriver_checkout_error": "Hubo un problema con tu proceso de pago; revisa tus datos e inténtalo de nuevo o ponte en contacto con el servicio de atención al cliente", + "digitalriver_checkout_error_title": "Error al procesar la solicitud.", + "digitalriver_display_name_text": "Selecciona tu método de pago", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm no puede procesar el pago de este pedido; selecciona otro método de pago.", + "klarna_continue_action": "Continuar con Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuar con {methodName}", + "opy_widget_slogan": "Compra ahora. Paga de manera más inteligente.", + "opy_widget_info": "Se te redirigirá al sitio web de {methodName} para que completes tu pedido cuando hagas clic en “Continuar con {methodName}“", + "orbital_continue_action": "Realizar pedido", + "orbital_description_text": "Paga con tu cuenta de ChasePay", + "payment_cancelled": "El pago fue cancelado", + "payment_error": "Ocurrió un error al procesar tu pago. Vuelve a intentarlo.", + "payment_error_heading": "Error en el pago", + "payment_heading": "Pago", + "payment_invalid_error_heading": "Pago no disponible", + "payment_method_disabled_error": "El método de pago seleccionado ya no es válido. Haz clic en Aceptar para ver los métodos de pago más actualizados.", + "payment_method_error": "Respuesta del proveedor de pagos: {message}", + "payment_method_invalid_error": "Hay un problema al procesar tu pago. Ponte en contacto con nosotros para obtener ayuda o elige otra forma de pago.", + "payment_method_unavailable_error": "Este proveedor de pagos no está disponible temporalmente. Vuelve a intentarlo más tarde.", + "payment_not_required_text": "No se requiere el pago para este pedido.", + "paypal_continue_action": "Continuar con PayPal", + "braintreevenmo_continue_action": "Continuar con Venmo", + "paypal_credit_continue_action": "Continuar con PayPal Credit", + "paypal_credit_description_text": "Compra ahora y paga después", + "paypal_description_text": "Pagar con tu cuenta de PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pagar después", + "place_order_action": "Realizar pedido", + "place_order_error": "Ocurrió un error al colocar tu pedido. Ponte en contacto con nosotros.", + "place_order_error_heading": "No se pudo realizar el pedido", + "postal_code_label": "Código postal", + "ideal_bic_required": "Debes seleccionar un emisor para realizar el pedido", + "instrument_text": "Almacenamiento de tarjetas de crédito", + "instrument_add_card_action": "Usar una tarjeta diferente", + "instrument_default_ending_in_text": "Tarjeta con terminación en {endingIn}", + "instrument_ending_in_text": "{cardTitle} con terminación en {endingIn}", + "instrument_expired_text": "Venció el {expiryDate}", + "instrument_expires_text": "Vence el {expiryDate}", + "instrument_manage_button": "manejar", + "instrument_manage_modal_confirmation_action": "Sí, eliminar", + "instrument_manage_modal_confirmation_label": "¿Estás seguro de que deseas eliminar este método de pago guardado?", + "instrument_manage_modal_title_text": "Administrar métodos de pago guardados", + "instrument_manage_modal_empty_text": "No tienes ningún método de pago guardado.", + "instrument_manage_table_header_ending_in_text": "Con terminación en", + "instrument_manage_table_header_expiry_date_text": "Fecha de vencimiento", + "instrument_manage_table_header_payment_method_text": "Método de pago", + "instrument_manage_delete_server_error": "Ocurrió un error al intentar eliminar ese método de pago almacenado. Vuelve a intentarlo.", + "instrument_manage_delete_auth_error": "Ocurrió un problema al autorizar tu solicitud. Vuelve a intentar iniciar sesión.", + "instrument_manage_delete_client_error": "Ocurrió un error al intentar eliminar el método de pago guardado: el método de pago ya no existe o no se puede eliminar.", + "instrument_save_payment_method_label": "Guardar esta tarjeta para futuras transacciones", + "instrument_save_as_default_payment_method_label": "Utilizar esta tarjeta como método de pago predeterminado para transacciones futuras", + "account_instrument_add_action": "Usar una cuenta diferente", + "account_instrument_save_payment_method_label": "Guardar esta cuenta para transacciones futuras", + "account_instrument_save_as_default_payment_method_label": "Usar esta cuenta como forma de pago predeterminada para transacciones futuras", + "account_instrument_text": "Cuentas guardadas", + "account_instrument_new_shipping_address": "Notamos que esta es una nueva dirección de envío.

Por razones de seguridad, deberás volver a vincular tu cuenta de PayPal cuando realices un envío a una dirección por primera vez o si la dirección de envío se modificó recientemente.

", + "instrument_trusted_shipping_address_text": "Este paso de seguridad adicional se aplica a tu tarjeta cuando realizas el envío a una dirección por primera vez o si la dirección de envío se editó recientemente.", + "instrument_trusted_shipping_address_title_text": "Vuelve a ingresar tu número de tarjeta para autorizar esta transacción.", + "quadpay_continue_action": "Continuar con Zip", + "quadpay_display_name_text": "Pagar en 4 plazos (Quadpay)", + "ppsdk_continue_action": "Continuar con {methodName}", + "select_your_bank": "Selecciona tu banco", + "sepa_account_number": "Número de cuenta (IBAN)", + "sepa_account_number_required": "Debes ingresar tu número de cuenta (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "El BIC debe tener 8 u 11 caracteres", + "sepa_mandate_required": "Debes aceptar el formulario de mandato", + "sezzle_display_name_text": "Paga después. 0% de interés.", + "stripe_sepa_display_name_text": "Sepa Direct Debit.", + "stripe_sepa_mandate_disclaimer": "Al proporcionar tu IBAN y confirmar este pago, autorizas a (A) {storeUrl} y a Stripe, nuestro proveedor de servicios de pago, a enviar instrucciones a tu banco para que realice el cargo en tu cuenta y (B) a tu banco para que realice el cargo en tu cuenta de acuerdo con esas instrucciones. Tienes derecho a recibir un reembolso de tu banco según los términos y condiciones de tu contrato celebrado con tu banco. El reembolso deberá solicitarse dentro de un plazo de ocho semanas contadas a partir de la fecha en que se hizo el cargo a tu cuenta.", + "tax_provider_unavailable": "No se pudo calcular el impuesto sobre las ventas. Vuelve a intentarlo. Si persiste el problema, ponte en contacto con nuestro equipo de asistencia para completar el proceso de pago.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continuar con Click to pay", + "zip_continue_action": "Continuar con Zip", + "zip_name_text": "Código postal", + "zip_display_name_text": "Compra ahora, paga después", + "errors": { + "additional_action_required": "Continúa con acciones adicionales.", + "authorization_expired": "La autorización para esta transacción ha vencido.", + "authorization_revoked": "Se revocó la autorización para esta transacción.", + "call_issuer": "Hubo un problema al procesar su tarjeta. Póngase en contacto con el emisor de su tarjeta.", + "captured_transaction": "Ya se realizó el pago de este pedido.", + "card_declined": "El pago fue rechazado. Intente con una tarjeta diferente.", + "card_error": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "card_replaced": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "connection_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "duplicate_transaction": "Ésta es una transacción duplicada. Comuníquese con nosotros para confirmar su pedido. No intente pagar de nuevo.", + "expired_card": "Su tarjeta ha vencido. Inténtelo de nuevo con una tarjeta válida.", + "gateway_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "general_error": "Error al procesar la solicitud de pago.", + "hosted_form_error": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "incorrect_amount": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "incorrect_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_zip": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "insufficient_funds": "El pago fue rechazado. Póngase en contacto con su banco.", + "invalid_address": "Tu dirección de facturación no pudo verificarse. Revísala y vuelve a intentarlo.", + "invalid_amount": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_authorization_code": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_create_instrument_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_email_address": "No se pudo procesar el pago porque se proporcionó un correo electrónico no válido con la transacción.", + "invalid_expiry_date": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_expiry_month": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_expiry_year": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_gateway": "El portal de pago no es válido.", + "invalid_gateway_options": "Las opciones del portal de pago no son válidas.", + "invalid_instrument": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_issuer": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_payment_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "invalid_request_error": "En este momento tenemos dificultades para procesar tu transacción. Ponte en contacto con nosotros o inténtalo de nuevo más tarde.", + "invalid_user_authentication": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "invalid_zip": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "journal_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "lost_or_stolen_card": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "missing_test_mode": "No se puede procesar la solicitud porque se proporcionaron datos no válidos con la transacción.", + "not_found": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "payment_config_error": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "payment_config_not_found": "Algo salió mal en el servidor. Vuelve a intentarlo más tarde.", + "pending_review": "Su transacción fue autorizada, pero está retenida por el comerciante para su revisión.", + "pickup_card": "Su tarjeta no puede ser utilizada para hacer este pago. Póngase en contacto con el emisor de su tarjeta o inténtelo con otra tarjeta.", + "processing_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "provider_configuration_error": "El proveedor de pagos del comerciante no está configurado correctamente.", + "refund_timelimit_expired": "El límite de tiempo para reembolsar esta transacción ya venció.", + "refunded_transaction": "Esta transacción ya se reembolsó.", + "request_timeout": "Su pago no pudo ser procesado debido al tiempo de espera. Intente de nuevo.", + "required_field": "No se pudo verificar tu pago. Revisa los detalles de tu tarjeta y vuelve a intentarlo.", + "server_error": "Hubo un error al procesar tu pago y tu pedido no pudo completarse. Vuelve a intentarlo.", + "store_instrument_failed": "No se puede procesar la solicitud. Vuelve a intentarlo.", + "stored_payment_instrument_not_found": "No se pudo encontrar ese instrumento de pago guardado. Inténtalo con otra opción de pago.", + "three_d_secure_declined": "Ha habido un problema con tu pago: revisa tus detalles de pago o comunícate con el emisor de tu tarjeta.", + "three_d_secure_failed": "Error en el pago. Vuelve a intentarlo o utiliza una opción de pago diferente.", + "three_d_secure_required": "Se requiere autenticación adicional para procesar su pago. Póngase en contacto con nosotros.", + "token_error": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "transaction_declined": "Su pago fue rechazado. Intente de nuevo.", + "transaction_rejected": "El pago fue rechazado. Vuelva a intentarlo.", + "unauthorized": "En este momento tenemos dificultades para procesar tu transacción. Vuelve a intentarlo más tarde.", + "unsupported_currency": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "unsupported_instrument": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "unsupported_request": "No se puede procesar el pago porque se proporcionaron datos no válidos con la transacción.", + "user_authorization_error": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "vaulting_service_unavailable": "El servicio de bóveda no está disponible actualmente.", + "voided_transaction": "Su pago no pudo ser procesado debido a que la transacción ya se anuló. Inténtelo de nuevo o póngase en contacto con nosotros." + } + }, + "redeemable": { + "applied_text": "Aplicado", + "apply_action": "Aplicar", + "apply_store_credit_after_action": "crédito de la tienda para hacer un pedido", + "apply_store_credit_before_action": "Aplicar", + "code_invalid_error": "El certificado de regalo o el código de cupón no es válido", + "code_label": "Certificado de regalo o código de cupón", + "code_required_error": "Ingresa un certificado de regalo o un código de cupón", + "coupon_location_error": "Tu dirección de envío no cumple con los requisitos de ubicación para el código de cupón que ingresaste.", + "coupon_min_order_total": "Tu pedido no alcanza el total mínimo para que se aplique este código de cupón.", + "coupon_text": "Cupón", + "gift_certificate_remaining_text": "Restante", + "gift_certificate_text": "Certificado de regalo", + "remove_action": "Quitar", + "store_credit_available_text": "Actualmente, tu cuenta tiene {storeCredit} de crédito total de la tienda disponible", + "toggle_action": "Cupón/Certificado de regalo" + }, + "remote": { + "browser_unsupported": "El método de pago seleccionado requiere un navegador web diferente. Elige otro método de pago.", + "connection_error": "Se rechazó la conexión con el proceso de pago remoto. Vuelve a intentarlo más tarde.", + "continue_with_text": "O continúa con", + "payment_method_error": "Ocurrió un error al recuperar tu método de pago remoto. Vuelve a intentarlo.", + "select_different_card_action": "Selecciona una tarjeta diferente", + "session_error": "Tu sesión remota ya venció. Vuelve a iniciar sesión.", + "shipping_address_error": "Ocurrió un error al recuperar tu dirección de envío remota. Vuelve a intentarlo.", + "sign_in_action": "Inicia sesión en {providerName}", + "sign_out_action": "Cierra sesión en {providerName}", + "sign_out_after_action": "para ver otros métodos de pago", + "sign_in_required_error": "Se requiere inicio de sesión remoto antes del pago" + }, + "shipping": { + "cart_change_error": "Se detectó una actualización en tu carrito de compras y se actualizaron tus costos de envío disponibles. Vuelve a seleccionar un método de envío para continuar.", + "enter_shipping_address_text": "Ingresa una dirección de envío para ver las cotizaciones de envío", + "order_comment_label": "Comentarios del pedido", + "assign_item_error": "Ocurrió un error al asignar el elemento a la dirección. Vuelve a intentarlo.", + "assign_item_invalid_address_error_heading": "Dirección no válida", + "assign_item_invalid_address_error": "La dirección seleccionada no es válida. Ve a la página de tu cuenta y actualízala.", + "unassign_item_error": "Ocurrió un error al cancelar la asignación del artículo a la dirección.", + "save_shipping_address_error": "Ocurrió un error al guardar la dirección de envío en tu cotización. Vuelve a intentarlo.", + "save_shipping_option_error": "Ocurrió un error al guardar la cotización de envío en tu pedido. Vuelve a intentarlo.", + "select_shipping_address_text": "Selecciona una dirección de envío para ver las cotizaciones de envío", + "shipping_address_heading": "Dirección de envío", + "multishipping_address_heading": "Elige a dónde enviar cada artículo", + "multishipping_address_heading_guest": "Inicia sesión primero", + "multishipping_guest_intro": "Para enviar tus artículos a varias direcciones, debes", + "multishipping_guest_sign_in": "iniciar sesión en tu cuenta", + "multishipping_guest_create": "o crea una cuenta antes de continuar.", + "ship_to_multi": "Enviar a varias direcciones", + "ship_to_single": "Enviar a una sola dirección", + "shipping_heading": "Envío", + "shipping_method_label": "Método de envío", + "shipping_option_expired_error": "El precio de envío que se te indicó ya no es válido. Haz clic en Aceptar para ver los precios de envío más actualizados.", + "shipping_option_expired_heading": "Se actualizó tu precio de envío", + "view_shipping_options_action": "Ver otras opciones" + }, + "social": { + "share_action": "Compartir", + "share_heading": "¡Cuéntale a tus amigos sobre tu compra!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Haz clic aquí para confirmar que eres una persona antes de continuar." + }, + "privacy_policy": { + "required_error": "Acepta la Política de Privacidad.", + "label": "Sí, acepto la Política de Privacidad.", + "heading": "Política de Privacidad" + }, + "terms_and_conditions": { + "agreement_required_error": "Acepta los términos y condiciones.", + "agreement_text": "Sí, acepto los términos y condiciones anteriores.", + "agreement_with_link_text": "Sí, acepto los términos y condiciones.", + "terms_and_conditions_heading": "Términos y condiciones" + }, + "order_confirmation": { + "mandate": { + "checkoutcom": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO", + "sepa": "SEPA Direct Debit (a través de Checkout.com) Referencia de la orden: {mandate}" + }, + "stripev3": { + "iban": "Orden de débito directo SEPA" + }, + "stripe_upe": { + "boleto": "Ticket del Boleto Bancário", + "oxxo": "Ticket de OXXO" + } + }, + "order_number_text": "Tu número de pedido es {orderNumber}", + "order_pending_review_text": "Ya se nos envió tu pedido, pero actualmente estamos en espera del pago. Una vez que lo recibamos, se completará tu pedido. Si ya proporcionaste los detalles del pago, procesaremos tu pedido manualmente y te enviaremos un correo electrónico cuando esté completo.", + "order_pending_status_text": "Hemos recibido tu pedido y estamos procesando tu pago. Una vez que se haya verificado el pago, se completará tu pedido. Te enviaremos un correo electrónico cuando se haya completado. Ten en cuenta que este proceso puede tardar unos minutos, dependiendo de los tiempos de procesamiento del método elegido. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_incomplete_status_text": "Hemos recibido tu pedido y tu pago. Nuestro sistema está procesando tu pedido. Ten en cuenta que el procesamiento puede tardar unos minutos. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "order_with_downloadable_digital_items_text": "Puedes descargar tus compras digitales haciendo clic en los enlaces de esta página o iniciando sesión en tu cuenta en cualquier momento. También hay un enlace de descarga en tu correo electrónico de confirmación, que debería llegarte en breve.", + "order_with_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes preguntas sobre tu compra, envíanos un correo electrónico a {supportEmail} o llámanos al {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Una vez que recibamos tu pago, te enviaremos un correo electrónico de confirmación con un enlace para descargar tus compras digitales.", + "order_without_support_number_text": "Se enviará un correo electrónico con información sobre tu compra. Si tienes alguna pregunta sobre tu compra, envíanos un correo electrónico a {supportEmail}.", + "thank_you_customer_heading": "¡Gracias, {name}!", + "thank_you_heading": "¡Muchas gracias!", + "continue_shopping": "Seguir comprando »", + "order_status_update_facebook_messenger_heading": "Recibe actualizaciones al instante de tu pedido en Messenger" + } + } +} diff --git a/assets/json/es.json b/assets/json/es.json new file mode 100644 index 000000000..6153f968e --- /dev/null +++ b/assets/json/es.json @@ -0,0 +1,472 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Dirección", + "address_line_1_required_error": "El campo Dirección es obligatorio", + "address_line_2_label": "Apartamento/Oficina/Edificio", + "address_line_2_required_error": "El campo Apartamento/Oficina/Edificio es obligatorio", + "address_not_recognized_heading": "No hemos reconocido su dirección", + "consignment_address_updated_text": "El artículo se ha asignado correctamente a la nueva dirección.", + "city_label": "Ciudad", + "city_required_error": "El campo Ciudad es obligatorio", + "company_name_label": "Nombre de la compañía", + "company_name_required_error": "El campo Empresa es obligatorio", + "confirm_address_action": "Continuar con la dirección actual", + "confirm_address_text": "No pudimos encontrar una coincidencia con la dirección que ha introducido. Confirme la dirección.", + "country_label": "País", + "country_required_error": "El campo de país es obligatorio.", + "custom_required_error": "El campo {label} es obligatorio", + "custom_min_error": "{label} debe ser mayor que {min}", + "custom_max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "El campo {label} contiene caracteres no válidos", + "custom_valid_error": "El campo {label} no es válido", + "edit_address_action": "Editar dirección", + "enter_address_action": "Introduzca una nueva dirección", + "add_address_heading": "Añadir dirección", + "save_address_action": "Guardar dirección", + "first_name_label": "Nombre", + "first_name_required_error": "El campo Nombre es obligatorio.", + "last_name_label": "Apellido", + "last_name_required_error": "El campo Apellidos es obligatorio.", + "phone_number_label": "Número de teléfono", + "phone_number_required_error": "El campo Número de teléfono es obligatorio", + "postal_code_label": "Código postal", + "postal_code_required_error": "El campo Código postal es obligatorio.", + "save_in_addressbook": "Guardar esta dirección en mi libreta de direcciones.", + "select_country_action": "Seleccionar un país", + "select_state_action": "Seleccionar un estado", + "state_label": "Estado/Provincia", + "state_required_error": "El campo de Estado/Provincia es obligatorio", + "select": "Seleccionar", + "select_all": "Todos", + "select_none": "Ninguno" + }, + "billing": { + "billing_address_heading": "Dirección de facturación", + "billing_heading": "Facturación", + "save_billing_address_error": "Se ha producido un error al guardar la dirección de facturación en su presupuesto. Vuelva a intentarlo.", + "billing_address_amazon": "La misma que la dirección de facturación que ha introducido en su cuenta de Amazon.", + "billing_address_amazonpay": "Gestionado por Amazon Pay", + "use_shipping_address_label": "Mi dirección de facturación es la misma que mi dirección de envío." + }, + "cart": { + "billed_amount_text": "*Se le cobrará y facturará {total} ({code}) por este pedido.", + "based_on_currency_text": "Basado en {total} {code}", + "cart_heading": "Resumen del pedido", + "digital_item_text": "Artículo digital", + "discount_text": "Descuento", + "downloads_action": "Ir a descargas", + "edit_cart_action": "Editar carrito", + "estimated_total_text": "Total estimado", + "free_text": "Gratis", + "gift_certificate_text": "Cupón de regalo", + "handling_text": "Manipulación", + "item_count_text": "{count, plural, one{1 artículo} other{# artículos} }", + "print_action": "Imprimir", + "remaining_text": "resta", + "remove_action": "eliminar", + "see_all_action": "Ver todo", + "see_less_action": "Ver menos", + "shipping_text": "Envío", + "gift_wrapping_text": "Envolver para regalo", + "show_details_action": "Mostrar detalles", + "store_credit_text": "Crédito en tienda", + "subtotal_text": "Subtotal", + "taxes_text": "Impuestos", + "total_text": "Total", + "empty_cart_message": "Su carro está vacío, se le va a redireccionar. Haga clic aquí si el navegador no le redirecciona." + }, + "common": { + "cancel_action": "Cancelar", + "close_action": "Cerrar", + "continue_action": "Continuar", + "edit_action": "Editar", + "delete_action": "Eliminar", + "error_heading": "Algo ha salido mal", + "leave_warning": "¿Está seguro de que desea salir? Es posible que no se guarden los datos introducidos.", + "loading_text": "Cargando", + "ok_action": "Ok", + "error_code": "Código de error:", + "request_id": "ID de solicitud:", + "optional_text": "(Opcional)", + "unavailable_error": "El proceso de pago no está disponible temporalmente. Vuelva a intentarlo más tarde.", + "unavailable_heading": "El proceso de pago no está disponible temporalmente", + "unstable_network_error": "Parece que el servidor está tardando en responder. Esto puede deberse a una mala conectividad o a un error de nuestro servicio. Vuelva a intentarlo más tarde.", + "order_loading_error": "Se ha producido un error al cargar su pedido. Vuelva a intentarlo.", + "order_fatal_error_heading": "Se ha producido un error al realizar su pedido", + "order_fatal_error_extra": "Elija otra forma de pago o contáctenos para obtener más ayuda.", + "go_back": "Volver", + "show_more": "Mostrar más" + }, + "customer": { + "checkout_as_guest_text": "¿Va a pagar como invitado? Podrá guardar sus datos para crear una cuenta con nosotros más adelante.", + "continue_as_guest_action": "Continuar como invitado", + "create_account_action": "Crear cuenta", + "continue": "Continuar", + "set_password_action": "Guardar contraseña", + "required_error": "El campo {label} es obligatorio", + "min_error": "{label} debe ser mayor que {min}", + "max_error": "{label} debe ser menor que {max}", + "invalid_characters_error": "El campo {label} contiene caracteres no válidos", + "create_account_error": "Se ha producido un error al crear su cuenta. Vuelva a intentarlo.", + "create_address_error": "Sin embargo, se ha producido un error al guardar la dirección en su libreta de direcciones.", + "create_account_requirements_error_heading": "La contraseña no cumple con los requisitos", + "create_account_success": "Se ha creado su cuenta.", + "set_password_success": "Se ha guardado su contraseña.", + "create_account_text": "Cree una cuenta para agilizar el proceso de pago en el futuro", + "set_password_text": "Configure una contraseña para agilizar el proceso de pago en el futuro", + "account_created_text": "Se ha creado una cuenta para usted, pero tendrá que configurar una contraseña para acceder.", + "create_account_to_continue_text": "¿Aún no tiene una cuenta? Cree una cuenta para continuar.", + "guest_could_login": "Parece que tiene una cuenta. Inicie sesión con {email} para agilizar el proceso de pago.", + "guest_must_login": "Parece que tiene una cuenta. Inicie sesión para continuar con {email}, o bien utilice otro correo electrónico.", + "guest_temporary_disabled": "El proceso de pago para invitados está desactivado temporalmente. Inicie sesión o cree una cuenta para continuar.", + "customer_heading": "Cliente", + "email_invalid_error": "La dirección de correo electrónico debe ser válida", + "email_label": "Dirección de correo electrónico", + "email_required_error": "La dirección de correo electrónico es obligatoria", + "forgot_password_action": "¿Ha olvidado la contraseña?", + "guest_customer_text": "Cliente invitado", + "guest_subscribe_to_newsletter_text": "Suscríbase a nuestro boletín.", + "guest_marketing_consent": "Me gustaría recibir actualizaciones y ofertas.", + "login_action": "Iniciar sesión ahora", + "login_text": "¿Ya tiene una cuenta?", + "email_in_use_text": "Ya hay una cuenta para {email}. Introduzca una dirección de correo electrónico diferente o inicie sesión.", + "unknown_email_in_use_text": "Ya hay una cuenta para el correo electrónico proporcionado. Introduzca una dirección de correo electrónico diferente o inicie sesión.", + "guest_could_login_change_email": "¿No es {email}? Cambie el correo electrónico.", + "password_confirmation_error": "Las contraseñas no coinciden", + "password_confirmation_label": "Confirmar contraseña", + "password_confirmation_required_error": "Este campo es obligatorio", + "password_label": "Contraseña", + "password_letter_required_error": "La contraseña debe contener una letra", + "password_minimum_character_label": "caracteres como mínimo, distingue entre mayúsculas y minúsculas", + "password_number_required_error": "La contraseña debe contener un número", + "password_over_maximum_length_error": "La contraseña es demasiado larga", + "password_required_error": "Se requiere la contraseña", + "password_under_minimum_length_error": "La contraseña es demasiado corta", + "reset_password_before_login_error": "El inicio de sesión no está disponible en este momento. Recibirá un correo electrónico en los próximos 5 minutos con instrucciones para restablecer su contraseña. Si no recibe este correo electrónico, revise su carpeta de correo no deseado o contáctenos para obtener más ayuda.", + "returning_customer_text": "Cliente existente", + "sign_in_action": "Iniciar sesión", + "sign_in_error": "El correo electrónico o la contraseña que ha introducido no son válidos.", + "sign_in_throttled_error": "Debido que hubo una cantidad excesiva de intentos de acceso, espere 10 segundos antes de intentar acceder de nuevo.", + "sign_out_action": "Cerrar sesión", + "sign_out_error": "Se ha producido un error al cerrar sesión. Vuelva a intentarlo.", + "subscribe_to_newsletter_text": "Sí, me gustaría recibir actualizaciones.", + "suggestion_text": "Parece que tiene una cuenta con {provider}. Para agilizar el proceso de pago, inicie sesión con {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "No hemos podido enviarle un enlace de inicio de sesión. Vuelva a intentarlo.", + "error_not_found": "El correo electrónico introducido no está asociado a una cuenta. Pruebe con otro correo electrónico.", + "sent_header": "Compruebe su bandeja de entrada", + "sent_text": "Hemos enviado un correo electrónico a {email} que contiene un enlace de inicio de sesión. Este enlace caducará en {minutes} minutos. Si no lo ve en la bandeja de entrada, compruebe su carpeta de correo no deseado.", + "text": "Introduzca la dirección de correo electrónico asociada a su cuenta. Le enviaremos un enlace de inicio de sesión.", + "header": "Introduzca la dirección de correo electrónico", + "header_with_email": "Confirme su dirección de correo electrónico", + "link": "Prefiero que me envíen un enlace de acceso.", + "use_another_email": "Utilizar otro correo electrónico", + "send": "Enviar", + "error_temporary_disabled": "La funcionalidad del enlace de inicio de sesión no está disponible temporalmente. Inicie sesión introduciendo su contraseña.", + "resend_link": "¿No ha recibido el correo electrónico? Vuelva a enviar el enlace", + "use_password_link": " o bien inicie sesión con su contraseña." + }, + "embedded_checkout": { + "unsupported_error": "El proceso de pago integrado no admite los siguientes métodos de pago: {methods}. Póngase en contacto con nosotros para obtener ayuda." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Pago aplazado", + "affirm_body_text": "Se le redirigirá a Affirm para completar su compra de forma segura. Solo hay que rellenar unos pocos datos básicos y obtendrá una decisión en tiempo real. Verificar su elegibilidad no afectará su puntuación crediticia.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Pago con Afterpay", + "amazon_continue_action": "Continuar con Amazon", + "amazonpay_continue_action": "Continuar con Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continuar", + "bluesnap_v2_continue_action": "Continuar", + "bolt_create_account_label": "Recordar mi información con Bolt", + "bolt_create_account_disclaimer": "Al marcar la casilla anterior, acepta crear una cuenta de Bolt sujeta a los términos y la política de privacidad.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continuar con Visa Checkout", + "ccavenuemars_description_text": "Continuar con CCAvenue", + "chasepay_continue_action": "Continuar con Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Editar tarjeta", + "chasepay_logout": "Cerrar sesión en Chase Pay", + "chasepay_fail_load": "No se pudo cargar Chase Pay", + "checkoutcom_document_label_boleto": "CPF o CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "DNI", + "checkoutcom_document_invalid_error_boleto": "El CPF o CNPJ deben tener entre 11 y 14 caracteres", + "checkoutcom_document_invalid_error_oxxo": "El CURP debe tener 18 caracteres como máximo", + "checkoutcom_document_invalid_error_qpay": "El DNI debe tener 32 caracteres como máximo", + "checkoutcom_fawry_customer_mobile_invalid_error": "El número de teléfono móvil debe ser válido", + "checkoutcom_fawry_customer_mobile_label": "Número de teléfono móvil", + "checkoutcom_fawry_customer_email_invalid_error": "La dirección de correo electrónico debe ser válida", + "checkoutcom_fawry_customer_email_label": "Correo electrónico", + "checkoutcom_sepa_creditor_title": "Acreedor", + "checkoutcom_sepa_creditor_id": "ID del acreedor: {creditorId}", + "checkoutcom_sepa_debtor_title": "Deudor", + "checkoutcom_sepa_mandate_disclaimer": "Al aceptar este formulario de mandato, autoriza a {creditorName} a enviar instrucciones a su banco para que realice el cargo en su cuenta y a su banco para que realice el cargo en su cuenta de acuerdo con dichas instrucciones. Tiene derecho a que su banco le devuelva el dinero según las condiciones de su contrato con el banco. Se debe solicitar un reembolso en un plazo de 8 semanas a partir de la fecha en que se realizó el cargo en su cuenta.", + "checkoutcom_sepa_payment_type": "Tipo de pago: único (no recurrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Tarjeta de crédito", + "credit_card_customer_code_label": "Código de cliente", + "credit_card_cvv_help_text": "Para VISA y Mastercard, el CVV es un código de tres dígitos impreso en el reverso. Para American Express, es el código de cuatro dígitos impreso en la parte delantera. El CVV es una medida de seguridad para garantizar que tiene la tarjeta en su poder.", + "credit_card_cvv_invalid_error": "El CVV debe ser válido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "Se requiere el CVV", + "credit_card_expiration_invalid_error": "La fecha de vencimiento debe ser una fecha futura válida en el formato MM/YY", + "credit_card_expiration_label": "Vencimiento", + "credit_card_expiration_date_label": "Fecha de vencimiento", + "credit_card_expiration_required_error": "Se requiere la fecha de vencimiento", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nombre que aparece en la tarjeta", + "credit_card_name_required_error": "Se requiere el nombre completo", + "credit_card_number_invalid_error": "El número de la tarjeta de crédito debe ser válido", + "credit_card_number_label": "Número de tarjeta de crédito", + "credit_card_number_last_four": "Introduzca el número de la tarjeta {cardType} que termina en {lastFour}", + "credit_card_number_required_error": "Se requiere el número de tarjeta de crédito", + "credit_card_number_mismatch_error": "El número de tarjeta introducido no coincide con la tarjeta guardada en su cuenta", + "credit_debit_card_text": "Tarjeta de crédito/débito", + "digitalriver_dropin_error": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "digitalriver_checkout_error": "Ha habido un problema con su compra; compruebe sus datos e inténtelo de nuevo o póngase en contacto con el servicio de Atención al Cliente", + "digitalriver_checkout_error_title": "Error al procesar la solicitud.", + "digitalriver_display_name_text": "Seleccione su método de pago", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm no puede procesar su pago para este pedido; seleccione otro método de pago.", + "klarna_continue_action": "Continuar con Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuar con Openpay", + "orbital_continue_action": "Realizar pedido", + "orbital_description_text": "Pagar con su cuenta de ChasePay", + "payment_cancelled": "El pago se ha cancelado", + "payment_error": "Se ha producido un error al procesar tu pago. Vuelva a intentarlo.", + "payment_error_heading": "Error en el pago", + "payment_heading": "Pago", + "payment_invalid_error_heading": "Pago no disponible", + "payment_method_disabled_error": "El método de pago seleccionado ya no es válido. Haga clic en Aceptar para ver los métodos de pago más recientes.", + "payment_method_error": "Respuesta del proveedor de pagos: {message}", + "payment_method_invalid_error": "Ha habido un problema al procesar su pago. Póngase en contacto con nosotros para obtener ayuda o elija otro método de pago.", + "payment_method_unavailable_error": "Este proveedor de pagos no está disponible temporalmente. Vuelva a intentarlo más tarde.", + "payment_not_required_text": "No se requiere ningún pago para este pedido.", + "paypal_continue_action": "Continuar con PayPal", + "paypal_credit_continue_action": "Continuar con PayPal Credit", + "paypal_credit_description_text": "Compre ahora, pague a plazos", + "paypal_description_text": "Pagar con su cuenta de PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pagar más tarde", + "place_order_action": "Realizar pedido", + "place_order_error": "Se ha producido un error al realizar su pedido. Póngase en contacto con nosotros.", + "place_order_error_heading": "No se ha podido realizar el pedido", + "postal_code_label": "Código postal", + "ideal_bic_required": "Debe seleccionar un emisor para realizar el pedido", + "instrument_text": "Tarjetas de crédito guardadas", + "instrument_add_card_action": "Utilizar una tarjeta diferente", + "instrument_default_ending_in_text": "La tarjeta que termina en {endingIn}", + "instrument_ending_in_text": "{cardTitle} que acaba en {endingIn}", + "instrument_expired_text": "Ha caducado el {expiryDate}", + "instrument_expires_text": "Caduca el {expiryDate}", + "instrument_manage_button": "Gestionar", + "instrument_manage_modal_confirmation_action": "Sí, eliminar", + "instrument_manage_modal_confirmation_label": "¿Está seguro de que desea eliminar este método de pago guardado?", + "instrument_manage_modal_title_text": "Gestionar los métodos de pago guardados", + "instrument_manage_modal_empty_text": "No tiene ningún método de pago guardado.", + "instrument_manage_table_header_ending_in_text": "Termina en", + "instrument_manage_table_header_expiry_date_text": "Fecha de vencimiento", + "instrument_manage_table_header_payment_method_text": "Método de pago", + "instrument_manage_delete_server_error": "Se ha producido un error al intentar eliminar ese método de pago guardado. Vuelva a intentarlo.", + "instrument_manage_delete_auth_error": "Ha habido un problema al autorizar su solicitud. Vuelva a iniciar sesión.", + "instrument_manage_delete_client_error": "Se ha producido un error al intentar eliminar el método de pago guardado: el método de pago ya no existe o no se puede eliminar.", + "instrument_save_payment_method_label": "Guardar esta tarjeta para futuras transacciones", + "instrument_save_as_default_payment_method_label": "Utilizar esta tarjeta como método de pago por defecto para futuras transacciones", + "account_instrument_add_action": "Utilizar una cuenta diferente", + "account_instrument_save_payment_method_label": "Guardar esta cuenta para futuras transacciones", + "account_instrument_save_as_default_payment_method_label": "Utilizar esta cuenta como método de pago por defecto para futuras transacciones", + "account_instrument_text": "Cuentas guardadas", + "account_instrument_new_shipping_address": "Hemos detectado que se trata de una nueva dirección de envío.

Por razones de seguridad, tendrá que volver a vincular su cuenta de PayPal cuando realice un envío a una dirección por primera vez o si la dirección de envío se ha editado recientemente.

", + "instrument_trusted_shipping_address_text": "Este paso de seguridad adicional se aplica a su tarjeta cuando realice un envío a una dirección por primera vez o si la dirección de envío se ha editado recientemente.", + "instrument_trusted_shipping_address_title_text": "Vuelva a introducir el número de su tarjeta para autorizar esta transacción.", + "quadpay_continue_action": "Continuar con Zip", + "quadpay_display_name_text": "Pagar en 4 plazos (Quadpay)", + "ppsdk_continue_action": "Continuar con {methodName}", + "select_your_bank": "Seleccione su banco", + "sepa_account_number": "Número de cuenta (IBAN)", + "sepa_account_number_required": "Debe introducir su número de cuenta (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "El BIC debe tener 8 u 11 caracteres", + "sepa_mandate_required": "Debe aceptar el formulario de mandato", + "sezzle_display_name_text": "Pague más tarde sin intereses.", + "stripe_sepa_display_name_text": "Débito directo de SEPA.", + "stripe_sepa_mandate_disclaimer": "Al proporcionar su IBAN y confirmar este pago, autoriza (A) a {storeUrl} y a Stripe a enviar instrucciones a su banco para que realice el cargo en su cuenta y (B) a su banco para que realice el cargo en su cuenta de acuerdo con dichas instrucciones. Tiene derecho a que su banco le devuelva el dinero según las condiciones de su contrato con el banco. Se debe solicitar un reembolso en un plazo de ocho semanas a partir de la fecha en que se realizó el cargo en su cuenta.", + "tax_provider_unavailable": "No se pudo calcular el impuesto sobre las ventas. Vuelva a intentarlo. Si no lo consigue, póngase en contacto con nuestro equipo de Atención al Cliente para completar el proceso de pago.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continuar con Click to pay", + "zip_continue_action": "Continuar con Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Compre ahora y pague después", + "errors": { + "additional_action_required": "Continúe con otras acciones.", + "authorization_expired": "La autorización para esta transacción ha expirado.", + "authorization_revoked": "La autorización para esta transacción ha sido revocada.", + "call_issuer": "Hubo un problema al procesar su tarjeta. Póngase en contacto con el emisor de su tarjeta.", + "captured_transaction": "Ya se realizó el pago de este pedido.", + "card_declined": "El pago fue rechazado. Intente con una tarjeta diferente.", + "card_error": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "card_replaced": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "connection_error": "Estamos teniendo problemas para procesar su transacción. Vuelva a intentarlo más tarde.", + "duplicate_transaction": "Ésta es una transacción duplicada. Comuníquese con nosotros para confirmar su pedido. No intente pagar de nuevo.", + "expired_card": "Su tarjeta ha vencido. Inténtelo de nuevo con una tarjeta válida.", + "gateway_error": "Algo salió mal en el servidor. Vuelva a intentarlo más tarde.", + "general_error": "Se produjo un error al procesar la solicitud de pago.", + "hosted_form_error": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "incorrect_address": "No se ha podido verificar su dirección de facturación. Compruebe los datos de su dirección de facturación y vuelva a intentarlo.", + "incorrect_amount": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "incorrect_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "incorrect_zip": "No se ha podido verificar su dirección de facturación. Compruebe los datos de su dirección de facturación y vuelva a intentarlo.", + "insufficient_funds": "El pago fue rechazado. Póngase en contacto con su banco.", + "invalid_address": "No se ha podido verificar su dirección de facturación. Compruebe los datos de su dirección de facturación y vuelva a intentarlo.", + "invalid_amount": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_authorization_code": "Hubo un error al procesar su pago. Inténtelo de nuevo o póngase en contacto con nosotros.", + "invalid_create_instrument_request": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "invalid_cvc": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_email_address": "No se puede procesar el pago debido a que el correo electrónico que se proporcionó con la transacción no es válido.", + "invalid_expiry_date": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_expiry_month": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "invalid_expiry_year": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "invalid_gateway": "La puerta de enlace no es válida.", + "invalid_gateway_options": "Las opciones de pasarela de pago no son válidas.", + "invalid_instrument": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "invalid_issuer": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "invalid_number": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "invalid_payment_request": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "invalid_request_error": "Estamos teniendo problemas para procesar su transacción. Póngase en contacto con nosotros o inténtelo de nuevo más tarde.", + "invalid_user_authentication": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "invalid_zip": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "journal_error": "Algo salió mal en el servidor. Vuelva a intentarlo más tarde.", + "lost_or_stolen_card": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "missing_test_mode": "No se puede procesar la solicitud debido a que los datos que se han proporcionado con la transacción no son válidos.", + "not_found": "Estamos teniendo problemas para procesar su transacción. Vuelva a intentarlo más tarde.", + "payment_config_error": "Algo salió mal en el servidor. Vuelva a intentarlo más tarde.", + "payment_config_not_found": "Algo salió mal en el servidor. Vuelva a intentarlo más tarde.", + "pending_review": "Su transacción fue autorizada, pero está retenida por el comerciante para su revisión.", + "pickup_card": "Su tarjeta no puede ser utilizada para hacer este pago. Póngase en contacto con el emisor de su tarjeta o inténtelo con otra tarjeta.", + "processing_error": "Estamos teniendo problemas para procesar su transacción. Vuelva a intentarlo más tarde.", + "provider_configuration_error": "El proveedor de pagos del comerciante no está configurado correctamente.", + "refund_timelimit_expired": "Expiró el plazo de reembolso de esta transacción.", + "refunded_transaction": "Esta transacción ya se ha reembolsado.", + "request_timeout": "Su pago no pudo ser procesado debido al tiempo de espera. Intente de nuevo.", + "required_field": "Su pago no se pudo verificar. Verifique los datos de su tarjeta y vuelva a intentarlo.", + "server_error": "Se ha producido un error al procesar su pago y su pedido no se ha podido completar. Vuelva a intentarlo.", + "store_instrument_failed": "No se puede procesar la solicitud. Vuelva a intentarlo.", + "stored_payment_instrument_not_found": "No se pudo encontrar ese instrumento de pago almacenado. Pruebe otra opción de pago.", + "three_d_secure_declined": "Hubo un problema con su pago. Compruebe los detalles del pago o póngase en contacto con el emisor de su tarjeta.", + "three_d_secure_failed": "No se pudo procesar el pago. Vuelva a intentarlo o use una opción de pago diferente.", + "three_d_secure_required": "Se requiere autenticación adicional para procesar su pago. Póngase en contacto con nosotros.", + "token_error": "Estamos teniendo problemas para procesar su transacción. Vuelva a intentarlo más tarde.", + "transaction_declined": "Su pago fue declinado. Por favor, inténtelo de nuevo.", + "transaction_rejected": "El pago fue rechazado. Vuelva a intentarlo.", + "unauthorized": "Estamos teniendo problemas para procesar su transacción. Vuelva a intentarlo más tarde.", + "unsupported_currency": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "unsupported_instrument": "No se pudieron verificar los detalles de su tarjeta. Verifíquelos de nuevo y vuelva a intentarlo.", + "unsupported_request": "No se puede procesar el pago debido a que los datos que se han proporcionado con la transacción no son válidos.", + "user_authorization_error": "Hubo un error al procesar su pago. Póngase en contacto con nosotros.", + "vaulting_service_unavailable": "El servicio de almacenamiento no está disponible en este momento.", + "voided_transaction": "Su pago no pudo ser procesado debido a que la transacción ya se anuló. Inténtelo de nuevo o póngase en contacto con nosotros." + } + }, + "redeemable": { + "applied_text": "Aplicado", + "apply_action": "Aplicar", + "apply_store_credit_after_action": "crédito en tienda para realizar pedidos", + "apply_store_credit_before_action": "Aplicar", + "code_invalid_error": "El cupón de regalo o el código de cupón no son válidos", + "code_label": "Cupón de regalo o código de cupón", + "code_required_error": "Introduzca un cupón de regalo o un código de cupón", + "coupon_location_error": "Su dirección de envío no cumple con los requisitos de ubicación para el código de cupón que ha introducido.", + "coupon_min_order_total": "Su pedido no alcanza el total mínimo para que se aplique este código de cupón.", + "coupon_text": "Con cupón", + "gift_certificate_remaining_text": "resta", + "gift_certificate_text": "Cupón de regalo", + "remove_action": "Eliminar", + "store_credit_available_text": "Su cuenta actualmente tiene disponible un total de {storeCredit} de crédito en tienda", + "toggle_action": "Cupón de regalo" + }, + "remote": { + "browser_unsupported": "El método de pago seleccionado requiere un navegador web diferente. Elija otro método de pago.", + "connection_error": "Se ha rechazado la conexión con el proceso de pago a distancia. Inténtelo más tarde.", + "continue_with_text": "O continuar con", + "payment_method_error": "Se ha producido un error al recuperar su método de pago a distancia. Vuelva a intentarlo.", + "select_different_card_action": "Seleccionar una tarjeta diferente", + "session_error": "Su sesión a distancia ha expirado. Inicie sesión de nuevo.", + "shipping_address_error": "Se ha producido un error al recuperar su dirección de envío a distancia. Vuelva a intentarlo.", + "sign_in_action": "Iniciar sesión en {providerName}", + "sign_out_action": "Cerrar sesión de {providerName}", + "sign_out_after_action": "para ver otros métodos de pago", + "sign_in_required_error": "Es necesario iniciar sesión a distancia antes de pagar" + }, + "shipping": { + "cart_change_error": "Se ha detectado una actualización en su carrito de compras y se han actualizado sus costes de envío disponibles. Vuelva a seleccionar un método de envío para continuar.", + "enter_shipping_address_text": "Introduzca una dirección de envío para ver los presupuestos de envío", + "order_comment_label": "Comentarios sobre el pedido", + "assign_item_error": "Se ha producido un error al asignar un artículo a una dirección. Vuelva a intentarlo.", + "assign_item_invalid_address_error_heading": "Dirección no válida", + "assign_item_invalid_address_error": "La dirección seleccionada no es válida. Vaya a la página de su cuenta y actualícela.", + "unassign_item_error": "Se ha producido un error al cancelar la asignación de un artículo a una dirección.", + "save_shipping_address_error": "Se ha producido un error al guardar la dirección de envío en su presupuesto. Vuelva a intentarlo.", + "save_shipping_option_error": "Se ha producido un error al guardar el presupuesto de envío en su pedido. Vuelva a intentarlo.", + "select_shipping_address_text": "Seleccione una dirección de envío para ver los presupuestos de envío", + "shipping_address_heading": "Dirección de envío", + "multishipping_address_heading": "Elija a dónde enviar cada artículo", + "multishipping_address_heading_guest": "Inicie sesión primero", + "multishipping_guest_intro": "Para enviar sus artículos a varias direcciones, debe", + "multishipping_guest_sign_in": "iniciar sesión en su cuenta", + "multishipping_guest_create": "o crear una cuenta antes de continuar.", + "ship_to_multi": "Enviar a varias direcciones", + "ship_to_single": "Enviar a una sola dirección", + "shipping_heading": "Envío", + "shipping_method_label": "Método de envío", + "shipping_option_expired_error": "El precio de envío que se le presupuestó ya no es válido. Haga clic en Aceptar para ver los precios de envío más recientes.", + "shipping_option_expired_heading": "El precio de envío se ha actualizado", + "view_shipping_options_action": "Ver otras opciones" + }, + "social": { + "share_action": "Compartir", + "share_heading": "¡Hábleles a sus amigos de su compra!", + "tweet_action": "Tuit" + }, + "spam_protection": { + "verify_action": "Haga clic aquí para identificarse como humano antes de continuar." + }, + "privacy_policy": { + "required_error": "Acepte la Política de privacidad.", + "label": "Sí, acepto la Política de privacidad.", + "heading": "Política de privacidad" + }, + "terms_and_conditions": { + "agreement_required_error": "Acepte los Términos y condiciones", + "agreement_text": "Sí, acepto los Términos y condiciones anteriores.", + "agreement_with_link_text": "Sí, acepto los Términos y condiciones.", + "terms_and_conditions_heading": "Términos y condiciones" + }, + "order_confirmation": { + "order_number_text": "Su número de pedido es {orderNumber}", + "order_pending_review_text": "Su pedido ha sido enviado pero está en espera del pago. Una vez que recibamos el pago de su pedido, este se completará. Si ya ha proporcionado los datos de pago, procesaremos su pedido manualmente y le enviaremos un correo electrónico cuando se haya completado.", + "order_pending_status_text": "Hemos recibido su pedido y estamos procesando su pago. Una vez verificado el pago, se completará su pedido. Le enviaremos un correo electrónico cuando se haya completado. Tenga en cuenta que este proceso puede tardar unos minutos en función de los tiempos de procesamiento del método elegido. Si tiene alguna pregunta sobre su compra, envíenos un correo electrónico a {supportEmail}.", + "order_incomplete_status_text": "Hemos recibido su pedido y el pago. Nuestro sistema está procesando su pedido. Tenga en cuenta que el procesamiento puede tardar unos minutos. Si tiene alguna pregunta sobre su compra, envíenos un correo electrónico a {supportEmail}.", + "order_with_downloadable_digital_items_text": "Puede descargar sus compras digitales haciendo clic en los enlaces de esta página o accediendo a su cuenta en cualquier momento. También hay un enlace de descarga en el correo electrónico de confirmación, que debería llegar en breve.", + "order_with_support_number_text": "Se enviará un correo electrónico con información sobre su compra. Si tiene alguna pregunta sobre su compra, envíenos un correo electrónico a {supportEmail} o llámenos al {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Una vez que recibamos su pago, le enviaremos un correo electrónico de confirmación con un enlace para descargar sus compras digitales.", + "order_without_support_number_text": "Se enviará un correo electrónico con información sobre su compra. Si tiene alguna pregunta sobre su compra, envíenos un correo electrónico a {supportEmail}.", + "thank_you_customer_heading": "¡Muchas gracias, {name}!", + "thank_you_heading": "¡Gracias!", + "continue_shopping": "Seguir comprando »", + "order_status_update_facebook_messenger_heading": "Reciba actualizaciones instantáneas de su pedido en Messenger", + "mandate_link_text": "Mandato de {provider}", + "boleto_link_text": "Ticket Boleto Bancário", + "oxxo_link_text": "Ticket OXXO", + "sepa_link_text": "Mandato de adeudo directo SEPA" + } + } +} diff --git a/assets/json/fr.json b/assets/json/fr.json new file mode 100644 index 000000000..d2cf21cef --- /dev/null +++ b/assets/json/fr.json @@ -0,0 +1,472 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Adresse", + "address_line_1_required_error": "Une adresse est requise", + "address_line_2_label": "Appartement/Suite/Immeuble", + "address_line_2_required_error": "Le champ Appartement/Suite/Immeuble est requis", + "address_not_recognized_heading": "Nous n'avons pas reconnu votre adresse", + "consignment_address_updated_text": "L'article a bien été attribué à la nouvelle adresse.", + "city_label": "Ville", + "city_required_error": "La ville est requise", + "company_name_label": "Nom de l'entreprise", + "company_name_required_error": "Le champ Entreprise est requis", + "confirm_address_action": "Continuer avec l'adresse actuelle", + "confirm_address_text": "Aucune adresse ne correspond à celle que vous avez saisie. Veuillez confirmer l'adresse.", + "country_label": "Pays", + "country_required_error": "Le pays est requis", + "custom_required_error": "{label} est obligatoire", + "custom_min_error": "{label} doit être supérieur·e à {min}", + "custom_max_error": "{label} doit être inférieur·e à {max}", + "invalid_characters_error": "{label} contient des caractères non valides", + "custom_valid_error": "{label} n'est pas valide", + "edit_address_action": "Modifier l'adresse", + "enter_address_action": "Saisir une nouvelle adresse", + "add_address_heading": "Ajouter une adresse", + "save_address_action": "Enregistrer l'adresse", + "first_name_label": "Prénom", + "first_name_required_error": "Le prénom est requis", + "last_name_label": "Nom", + "last_name_required_error": "Le nom de famille est requis", + "phone_number_label": "Numéro de téléphone", + "phone_number_required_error": "Le numéro de téléphone est requis", + "postal_code_label": "Code postal", + "postal_code_required_error": "Le code postal est requis", + "save_in_addressbook": "Enregistrer cette adresse dans mon carnet d'adresses.", + "select_country_action": "Sélectionnez un pays", + "select_state_action": "Sélectionnez un État", + "state_label": "État/Province", + "state_required_error": "État/province est requis", + "select": "Sélectionner", + "select_all": "Tout", + "select_none": "Aucun" + }, + "billing": { + "billing_address_heading": "Adresse de facturation", + "billing_heading": "Facturation", + "save_billing_address_error": "Une erreur s'est produite lors de l'enregistrement de l'adresse de facturation pour le devis. Veuillez réessayer.", + "billing_address_amazon": "Identique à l'adresse de facturation que vous avez configurée sur votre compte Amazon.", + "billing_address_amazonpay": "Géré par Amazon Pay", + "use_shipping_address_label": "Mon adresse de facturation est identique à mon adresse de livraison." + }, + "cart": { + "billed_amount_text": "* {total} ({code}) vous seront facturés pour cette commande.", + "based_on_currency_text": "Basé sur {total} {code}", + "cart_heading": "Récapitulatif de la commande", + "digital_item_text": "Article numérique", + "discount_text": "Remise", + "downloads_action": "Accéder aux téléchargements", + "edit_cart_action": "Modifier le panier", + "estimated_total_text": "Total estimé", + "free_text": "Gratuit", + "gift_certificate_text": "Chèque-cadeau", + "handling_text": "Traitement", + "item_count_text": "{count, plural, one{1 article} other{# articles} }", + "print_action": "Imprimer", + "remaining_text": "restant·s", + "remove_action": "supprimer", + "see_all_action": "Tout voir", + "see_less_action": "Voir moins", + "shipping_text": "Expédition", + "gift_wrapping_text": "Emballage cadeau", + "show_details_action": "Afficher les détails", + "store_credit_text": "Avoir", + "subtotal_text": "Sous-total", + "taxes_text": "Taxes", + "total_text": "Total", + "empty_cart_message": "Votre panier est vide, vous allez être redirigé·e. Veuillez cliquer ici si rien ne se passe." + }, + "common": { + "cancel_action": "Annuler", + "close_action": "Fermer", + "continue_action": "Continuer", + "edit_action": "Modifier", + "delete_action": "Supprimer", + "error_heading": "Une erreur s'est produite", + "leave_warning": "Voulez-vous vraiment quitter ? Les données saisies ne seront peut-être pas enregistrées.", + "loading_text": "Chargement", + "ok_action": "Ok", + "error_code": "Code d'erreur :", + "request_id": "ID de la demande :", + "optional_text": "(Facultatif)", + "unavailable_error": "Le paiement est temporairement indisponible. Veuillez réessayer plus tard.", + "unavailable_heading": "Le paiement est temporairement indisponible", + "unstable_network_error": "Le temps de réponse du serveur semble trop long. Cela peut être dû à une mauvaise connectivité ou à une erreur liée à nos serveurs. Veuillez réessayer dans un instant.", + "order_loading_error": "Une erreur s'est produite lors du chargement de votre commande. Veuillez réessayer.", + "order_fatal_error_heading": "Une erreur s'est produite lors de votre commande", + "order_fatal_error_extra": "Veuillez choisir un autre mode de paiement ou nous contacter pour obtenir de l'aide.", + "go_back": "Retour", + "show_more": "Voir plus" + }, + "customer": { + "checkout_as_guest_text": "Vous procédez au paiement en tant qu'invité·e ? Vous pourrez enregistrer vos informations si vous souhaitez créer un compte à un autre moment.", + "continue_as_guest_action": "Continuer en tant qu'invité·e", + "create_account_action": "Créer un compte", + "continue": "Continuer", + "set_password_action": "Enregistrer le mot de passe", + "required_error": "{label} est obligatoire", + "min_error": "{label} doit être supérieur·e à {min}", + "max_error": "{label} doit être inférieur·e à {max}", + "invalid_characters_error": "{label} contient des caractères non valides", + "create_account_error": "Une erreur s'est produite lors de la création de votre compte. Veuillez réessayer.", + "create_address_error": "Toutefois, une erreur s'est produite lors de l'enregistrement de l'adresse dans votre carnet d'adresses.", + "create_account_requirements_error_heading": "Le mot de passe ne répond pas aux exigences définies", + "create_account_success": "Votre compte a été créé.", + "set_password_success": "Votre mot de passe a été enregistré.", + "create_account_text": "Créez un compte pour procéder plus rapidement à vos prochains paiements", + "set_password_text": "Configurez un mot de passe pour procéder plus rapidement à vos prochains paiements", + "account_created_text": "Votre compte a été créé. Pour vous y connecter, il ne vous reste plus qu'à configurer un mot de passe.", + "create_account_to_continue_text": "Vous n'avez pas de compte ? Créez-en un pour continuer.", + "guest_could_login": "Il semblerait que vous ayez déjà un compte. Connectez-vous avec {email} pour procéder plus rapidement au paiement.", + "guest_must_login": "Il semblerait que vous ayez déjà un compte. Pour continuer, connectez-vous avec {email} ou utilisez une autre adresse e-mail.", + "guest_temporary_disabled": "Le paiement en tant qu'invité·e est temporairement désactivé. Pour continuer, veuillez vous connecter ou créer un compte.", + "customer_heading": "Client", + "email_invalid_error": "L'adresse e-mail doit être valide", + "email_label": "Adresse e-mail", + "email_required_error": "L'adresse e-mail est requise", + "forgot_password_action": "Mot de passe oublié ?", + "guest_customer_text": "Client invité", + "guest_subscribe_to_newsletter_text": "Abonnez-vous à notre newsletter.", + "guest_marketing_consent": "Je souhaite recevoir des informations concernant les offres et les nouveautés.", + "login_action": "Se connecter", + "login_text": "Vous avez déjà un compte ?", + "email_in_use_text": "L'adresse {email} est déjà associée à un compte. Veuillez saisir une autre adresse e-mail ou vous connecter.", + "unknown_email_in_use_text": "L'adresse e-mail saisie est déjà associée à un compte. Veuillez saisir une autre adresse e-mail ou vous connecter.", + "guest_could_login_change_email": "Vous n'êtes pas {email} ? Modifiez l'adresse e-mail.", + "password_confirmation_error": "Les mots de passe ne correspondent pas", + "password_confirmation_label": "Confirmer le mot de passe", + "password_confirmation_required_error": "Ce champ est obligatoire", + "password_label": "Mot de passe", + "password_letter_required_error": "Le mot de passe doit contenir une lettre", + "password_minimum_character_label": "caractères minimum, sensible à la casse", + "password_number_required_error": "Le mot de passe doit contenir un nombre", + "password_over_maximum_length_error": "Le mot de passe est trop long", + "password_required_error": "Un mot de passe est requis", + "password_under_minimum_length_error": "Le mot de passe est trop court", + "reset_password_before_login_error": "Vous ne pouvez pas vous connecter pour le moment. Dans environ 5 minutes, vous devriez recevoir un e-mail vous expliquant comment réinitialiser votre mot de passe. Si vous ne recevez pas cet e-mail, veuillez vérifier vos courriers indésirables ou nous contacter pour obtenir de l'aide.", + "returning_customer_text": "Client existant", + "sign_in_action": "Se connecter", + "sign_in_error": "L'adresse e-mail ou le mot de passe que vous avez saisi n'est pas valide.", + "sign_in_throttled_error": "En raison d'un nombre excessif de tentatives de connexion, veuillez attendre 10 secondes avant de vous reconnecter.", + "sign_out_action": "Déconnexion", + "sign_out_error": "Une erreur s'est produite lors de la déconnexion. Veuillez réessayer.", + "subscribe_to_newsletter_text": "Oui, je souhaite recevoir des informations concernant les nouveautés.", + "suggestion_text": "Il semblerait que vous ayez déjà un compte {provider}. Continuez avec {providerFlow} pour procéder plus rapidement au paiement.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "Envoi du lien de connexion impossible. Veuillez réessayer.", + "error_not_found": "L'adresse e-mail saisie n'est associée à aucun compte. Veuillez saisir une autre adresse e-mail.", + "sent_header": "Vérifiez votre boîte de réception", + "sent_text": "Nous avons envoyé un e-mail à l'adresse {email} contenant un lien de connexion. Ce dernier expirera dans {minutes} minutes. Si vous ne le voyez pas apparaître dans votre boîte de réception, vérifiez vos courriers indésirables.", + "text": "Veuillez saisir l'adresse e-mail associée à votre compte. Nous vous enverrons un lien de connexion.", + "header": "Saisissez votre adresse e-mail", + "header_with_email": "Confirmez votre adresse e-mail", + "link": "Envoyez-moi plutôt un lien de connexion.", + "use_another_email": "Utiliser une autre adresse e-mail", + "send": "Envoyer", + "error_temporary_disabled": "La fonctionnalité d'envoi d'un lien de connexion est temporairement désactivée. Veuillez vous connecter en saisissant votre mot de passe.", + "resend_link": "Vous n'avez reçu aucun e-mail ? Cliquez pour recevoir un nouveau lien,", + "use_password_link": " ou connectez-vous à l'aide de votre mot de passe." + }, + "embedded_checkout": { + "unsupported_error": "Les modes de paiement suivants ne sont pas pris en charge par Embedded Checkout : {methods}. Veuillez nous contacter pour obtenir de l'aide." + }, + "payment": { + "affirm_name_text": "Confirmer", + "affirm_display_name_text": "Payer en plusieurs fois", + "affirm_body_text": "Vous allez être redirigé·e vers Affirm afin de finaliser votre achat en toute sécurité. Il vous suffira de renseigner certaines informations de base pour obtenir une réponse en temps réel. La vérification de votre éligibilité n'affectera en rien votre fiabilité.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Payer avec Afterpay", + "amazon_continue_action": "Continuer avec Amazon", + "amazonpay_continue_action": "Continuer avec Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continuer", + "bluesnap_v2_continue_action": "Continuer", + "bolt_create_account_label": "Mémoriser mes informations avec Bolt", + "bolt_create_account_disclaimer": "En cochant la case ci-dessus, vous acceptez de créer un compte Bolt selon ces conditions et cette politique de confidentialité.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continuer avec Visa Checkout", + "ccavenuemars_description_text": "Continuer avec CCAvenue", + "chasepay_continue_action": "Continuer avec Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Modifier la carte", + "chasepay_logout": "Se déconnecter de Chase Pay", + "chasepay_fail_load": "Échec du chargement de Chase Pay", + "checkoutcom_document_label_boleto": "Numéro CPF ou CNPJ", + "checkoutcom_document_label_oxxo": "Numéro CURP", + "checkoutcom_document_label_qpay": "Numéro d'identification national", + "checkoutcom_document_invalid_error_boleto": "Le numéro CPF/CNPJ doit comporter entre 11 et 14 caractères", + "checkoutcom_document_invalid_error_oxxo": "Le numéro CURP ne doit pas dépasser 18 caractères", + "checkoutcom_document_invalid_error_qpay": "Le numéro d'identification national ne doit pas dépasser 32 caractères", + "checkoutcom_fawry_customer_mobile_invalid_error": "Le numéro de téléphone portable doit être valide", + "checkoutcom_fawry_customer_mobile_label": "Numéro de téléphone portable", + "checkoutcom_fawry_customer_email_invalid_error": "L'adresse e-mail doit être valide", + "checkoutcom_fawry_customer_email_label": "E-mail", + "checkoutcom_sepa_creditor_title": "Créditeur", + "checkoutcom_sepa_creditor_id": "ID créditeur : {creditorId}", + "checkoutcom_sepa_debtor_title": "Débiteur", + "checkoutcom_sepa_mandate_disclaimer": "En acceptant ce mandat, vous autorisez {creditorName} à indiquer à votre banque de débiter votre compte. Vous autorisez également votre banque à débiter votre compte conformément auxdites instructions. Vous êtes en droit de percevoir un remboursement de la part de votre banque selon les conditions générales liées à l'accord que vous avez passé avec cette dernière. Un tel remboursement doit être demandé dans un délai de 8 semaines à compter de la date à laquelle votre compte a été débité.", + "checkoutcom_sepa_payment_type": "Type de paiement : ponctuel (non récurrent)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Carte de crédit", + "credit_card_customer_code_label": "Code client", + "credit_card_cvv_help_text": "Pour les cartes VISA et Mastercard, le CVV est un code à trois chiffres imprimé au verso. Pour les cartes American Express, il s'agit du code à quatre chiffres imprimé au recto. Le CVV est une mesure de sécurité qui permet de s'assurer que vous possédez bien la carte.", + "credit_card_cvv_invalid_error": "Le CVV doit être valide.", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "CVV requis", + "credit_card_expiration_invalid_error": "La date d'expiration doit être au format valide MM/AA et ne pas être dépassée.", + "credit_card_expiration_label": "Date d'expiration", + "credit_card_expiration_date_label": "Date d'expiration", + "credit_card_expiration_required_error": "Date d'expiration requise", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nom sur la carte", + "credit_card_name_required_error": "Nom complet requis", + "credit_card_number_invalid_error": "Le numéro de carte bancaire doit être valide.", + "credit_card_number_label": "Numéro de carte bancaire", + "credit_card_number_last_four": "Saisissez le numéro de la carte {cardType} se terminant par {lastFour}", + "credit_card_number_required_error": "Numéro de carte bancaire requis", + "credit_card_number_mismatch_error": "Le numéro de carte saisi ne correspond pas à celui de la carte enregistrée dans votre compte", + "credit_debit_card_text": "Carte de crédit/débit", + "digitalriver_dropin_error": "Une erreur s'est produite lors du traitement de votre paiement. Veuillez réessayer, ou contactez-nous.", + "digitalriver_checkout_error": "Un problème est survenu lors de votre paiement, veuillez vérifier vos informations et réessayer, ou contacter le service client", + "digitalriver_checkout_error_title": "Erreur lors du traitement de la demande.", + "digitalriver_display_name_text": "Veuillez sélectionner votre mode de paiement", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm ne peut pas traiter votre paiement pour cette commande, veuillez sélectionner un autre mode de paiement.", + "klarna_continue_action": "Poursuivre avec Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuer avec Openpay", + "orbital_continue_action": "Passer commande", + "orbital_description_text": "Payer avec mon compte Chase Pay", + "payment_cancelled": "Le paiement a été annulé", + "payment_error": "Une erreur s'est produite lors du traitement de votre paiement. Veuillez réessayer.", + "payment_error_heading": "Échec du paiement", + "payment_heading": "Paiement", + "payment_invalid_error_heading": "Paiement indisponible", + "payment_method_disabled_error": "Le mode de paiement sélectionné n'est plus valide. Cliquez sur OK pour consulter les modes de paiement actualisés.", + "payment_method_error": "Réponse du prestataire de paiement : {message}", + "payment_method_invalid_error": "Une erreur s'est produite lors du traitement de votre paiement. Veuillez choisir un autre mode de paiement ou nous contacter pour obtenir de l'aide.", + "payment_method_unavailable_error": "Ce prestataire de paiement est temporairement indisponible. Veuillez réessayer plus tard.", + "payment_not_required_text": "Aucun paiement n'est requis pour cette commande.", + "paypal_continue_action": "Continuer avec PayPal", + "paypal_credit_continue_action": "Continuer avec PayPal Credit", + "paypal_credit_description_text": "Acheter maintenant, payer en plusieurs fois", + "paypal_description_text": "Payer avec mon compte PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Payer plus tard", + "place_order_action": "Passer commande", + "place_order_error": "Une erreur s'est produite lors de votre commande. Veuillez nous contacter.", + "place_order_error_heading": "Échec de la commande", + "postal_code_label": "Code postal", + "ideal_bic_required": "Pour pouvoir passer commande, vous devez sélectionner un émetteur", + "instrument_text": "Cartes bancaires enregistrées", + "instrument_add_card_action": "Utiliser une autre carte", + "instrument_default_ending_in_text": "Carte se terminant par {endingIn}", + "instrument_ending_in_text": "{cardTitle} se terminant par {endingIn}", + "instrument_expired_text": "A expiré le {expiryDate}", + "instrument_expires_text": "Expire le {expiryDate}", + "instrument_manage_button": "Gérer", + "instrument_manage_modal_confirmation_action": "Oui, supprimer", + "instrument_manage_modal_confirmation_label": "Voulez-vous vraiment supprimer ce mode de paiement enregistré ?", + "instrument_manage_modal_title_text": "Gérer les modes de paiement enregistrés", + "instrument_manage_modal_empty_text": "Vous n'avez enregistré aucun mode de paiement.", + "instrument_manage_table_header_ending_in_text": "Se terminant par", + "instrument_manage_table_header_expiry_date_text": "Date d'expiration", + "instrument_manage_table_header_payment_method_text": "Mode de paiement", + "instrument_manage_delete_server_error": "Une erreur s'est produite lors de la tentative de suppression du mode de paiement enregistré. Veuillez réessayer.", + "instrument_manage_delete_auth_error": "Une erreur s'est produite lors du processus d'autorisation de votre demande. Veuillez essayer de vous reconnecter.", + "instrument_manage_delete_client_error": "Une erreur s'est produite lors de la tentative de suppression du mode de paiement enregistré : le mode de paiement n'existe plus ou ne peut pas être supprimé.", + "instrument_save_payment_method_label": "Enregistrer cette carte pour d'autres transactions", + "instrument_save_as_default_payment_method_label": "Utiliser cette carte comme mode de paiement par défaut pour d'autres transactions", + "account_instrument_add_action": "Utiliser un autre compte", + "account_instrument_save_payment_method_label": "Enregistrer ce compte pour d'autres transactions", + "account_instrument_save_as_default_payment_method_label": "Utiliser ce compte comme mode de paiement par défaut pour d'autres transactions", + "account_instrument_text": "Comptes enregistrés", + "account_instrument_new_shipping_address": "Nous avons remarqué qu'il s'agit d'une nouvelle adresse de livraison.

Par mesure de sécurité, vous devrez une nouvelle fois relier votre compte PayPal en cas de livraison vers une nouvelle adresse ou si l'adresse de livraison a été récemment modifiée.

", + "instrument_trusted_shipping_address_text": "Cette mesure de sécurité supplémentaire est appliquée à votre carte en cas de livraison vers une nouvelle adresse ou si l'adresse de livraison a été récemment modifiée.", + "instrument_trusted_shipping_address_title_text": "Veuillez saisir à nouveau votre numéro de carte pour autoriser cette transaction.", + "quadpay_continue_action": "Continuer avec Zip", + "quadpay_display_name_text": "Payer en 4 versements (Quadpay)", + "ppsdk_continue_action": "Continuer avec {methodName}", + "select_your_bank": "Sélectionnez votre banque", + "sepa_account_number": "Numéro de compte (IBAN)", + "sepa_account_number_required": "Vous devez saisir votre numéro de compte (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "Le code BIC doit comporter 8 ou 11 caractères", + "sepa_mandate_required": "Vous devez accepter le mandat", + "sezzle_display_name_text": "Payez plus tard. Intérêts à taux zéro.", + "stripe_sepa_display_name_text": "SEPA Direct Debit.", + "stripe_sepa_mandate_disclaimer": "En fournissant votre IBAN et en confirmant ce paiement, vous autorisez (A) {storeUrl} et Stripe, notre prestataire de services de paiement, à indiquer à votre banque de débiter votre compte et (B), votre banque à débiter votre compte conformément auxdites instructions. Vous êtes en droit de percevoir un remboursement de la part de votre banque selon les conditions générales liées à l'accord que vous avez passé avec cette dernière. Un tel remboursement doit être demandé dans un délai de huit semaines à compter de la date à laquelle votre compte a été débité.", + "tax_provider_unavailable": "La taxe de vente n'a pas pu être calculée. Veuillez réessayer. Si vous n'y parvenez pas, veuillez contacter notre équipe d'assistance pour terminer le processus de paiement.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continuer avec Click to pay", + "zip_continue_action": "Continuer avec Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Acquérez maintenant, payez plus tard", + "errors": { + "additional_action_required": "Veuillez effectuer d'autres actions.", + "authorization_expired": "L'autorisation de cette transaction a expiré.", + "authorization_revoked": "L'autorisation de cette transaction a été annulée.", + "call_issuer": "Une erreur est survenue lors du traitement de votre carte. Veuillez contacter l'émetteur de votre carte.", + "captured_transaction": "Un paiement a déjà été effectué pour cette commande.", + "card_declined": "Le paiement a été refusé. Veuillez réessayer avec une autre carte.", + "card_error": "Impossible de confirmer les informations de votre carte. Veuillez les vérifier à nouveau et réessayer.", + "card_replaced": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "connection_error": "Nous avons des difficultés à traiter votre transaction. Veuillez réessayer plus tard.", + "duplicate_transaction": "Il s'agit d'une transaction en double. Veuillez nous contacter pour confirmer votre commande. N'essayez pas de payer à nouveau.", + "expired_card": "Votre carte a expiré. Veuillez réessayer avec une carte en cours de validité.", + "gateway_error": "Une erreur s'est produite sur le serveur. Veuillez réessayer ultérieurement.", + "general_error": "Erreur lors du traitement de la demande de paiement.", + "hosted_form_error": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "incorrect_address": "Impossible de confirmer votre adresse de facturation. Veuillez vérifier votre adresse de facturation et réessayer.", + "incorrect_amount": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "incorrect_cvc": "Impossible de confirmer les informations de votre carte. Veuillez les vérifier à nouveau et réessayer.", + "incorrect_number": "Impossible de confirmer les informations de votre carte. Veuillez les vérifier à nouveau et réessayer.", + "incorrect_zip": "Impossible de confirmer votre adresse de facturation. Veuillez vérifier votre adresse de facturation et réessayer.", + "insufficient_funds": "Le paiement a été refusé. Veuillez contacter votre banque.", + "invalid_address": "Impossible de confirmer votre adresse de facturation. Veuillez vérifier votre adresse de facturation et réessayer.", + "invalid_amount": "Une erreur s'est produite lors du traitement de votre paiement. Veuillez réessayer, ou contactez-nous.", + "invalid_authorization_code": "Une erreur s'est produite lors du traitement de votre paiement. Veuillez réessayer, ou contactez-nous.", + "invalid_create_instrument_request": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "invalid_cvc": "Impossible de confirmer les informations de votre carte. Veuillez les vérifier à nouveau et réessayer.", + "invalid_email_address": "Impossible de traiter le paiement car l'adresse e-mail fournie lors de la transaction est invalide.", + "invalid_expiry_date": "Impossible de confirmer les informations de votre carte. Veuillez les vérifier à nouveau et réessayer.", + "invalid_expiry_month": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "invalid_expiry_year": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "invalid_gateway": "La passerelle est invalide.", + "invalid_gateway_options": "Les options de la passerelle sont invalides.", + "invalid_instrument": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "invalid_issuer": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "invalid_number": "Impossible de confirmer les informations de votre carte. Veuillez les vérifier à nouveau et réessayer.", + "invalid_payment_request": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "invalid_request_error": "Nous avons des difficultés à traiter votre transaction. Veuillez nous contacter ou réessayer plus tard.", + "invalid_user_authentication": "Une erreur s'est produite lors du traitement de votre paiement. Veuillez nous contacter.", + "invalid_zip": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "journal_error": "Une erreur s'est produite sur le serveur. Veuillez réessayer ultérieurement.", + "lost_or_stolen_card": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "missing_test_mode": "Impossible de traiter la demande car des données non valides ont été indiquées lors de la transaction.", + "not_found": "Nous avons des difficultés à traiter votre transaction. Veuillez réessayer plus tard.", + "payment_config_error": "Une erreur s'est produite sur le serveur. Veuillez réessayer ultérieurement.", + "payment_config_not_found": "Une erreur s'est produite sur le serveur. Veuillez réessayer ultérieurement.", + "pending_review": "Votre transaction a été autorisée, mais elle est en cours de vérification par le·la commerçant·e.", + "pickup_card": "Vous ne pouvez pas utiliser votre carte pour effectuer ce paiement. Veuillez contacter l'émetteur de votre carte, ou réessayer avec une autre carte.", + "processing_error": "Nous avons des difficultés à traiter votre transaction. Veuillez réessayer plus tard.", + "provider_configuration_error": "Le prestataire de paiement du commerçant n'est pas correctement configuré.", + "refund_timelimit_expired": "Le délai de remboursement de cette transaction a expiré.", + "refunded_transaction": "Cette transaction a déjà été remboursée.", + "request_timeout": "Impossible de traiter le paiement en raison d'un dépassement du délai d'expiration. Veuillez réessayer.", + "required_field": "Impossible de confirmer votre paiement. Veuillez vérifier les informations de votre carte et réessayer.", + "server_error": "Une erreur s'est produite lors du traitement de votre paiement et votre commande n'a pas pu aboutir. Veuillez réessayer.", + "store_instrument_failed": "Impossible de traiter cette demande. Veuillez réessayer.", + "stored_payment_instrument_not_found": "Le mode de paiement enregistré est introuvable. Veuillez utiliser un autre mode de paiement.", + "three_d_secure_declined": "Une erreur s'est produite avec votre paiement. Veuillez vérifier vos données de paiement ou contacter la banque émettrice de la carte.", + "three_d_secure_failed": "Échec du paiement. Veuillez réessayer ou utiliser un autre moyen de paiement.", + "three_d_secure_required": "Une authentification supplémentaire est requise pour traiter votre paiement. Veuillez nous contacter.", + "token_error": "Nous avons des difficultés à traiter votre transaction. Veuillez réessayer plus tard.", + "transaction_declined": "Votre paiement a été refusé. Veuillez réessayer.", + "transaction_rejected": "Le paiement a été refusé. Veuillez réessayer.", + "unauthorized": "Nous avons des difficultés à traiter votre transaction. Veuillez réessayer plus tard.", + "unsupported_currency": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "unsupported_instrument": "Impossible de confirmer les informations de votre carte. Veuillez les vérifier à nouveau et réessayer.", + "unsupported_request": "Impossible de traiter le paiement car des données invalides ont été indiquées lors de la transaction.", + "user_authorization_error": "Une erreur s'est produite lors du traitement de votre paiement. Veuillez nous contacter.", + "vaulting_service_unavailable": "Le service de sauvegarde sécurisée est actuellement indisponible.", + "voided_transaction": "Impossible de traiter votre paiement car la transaction a déjà été annulée. Veuillez réessayer, ou contactez-nous." + } + }, + "redeemable": { + "applied_text": "Appliqué", + "apply_action": "Appliquer", + "apply_store_credit_after_action": "avoir à utiliser", + "apply_store_credit_before_action": "Appliquer", + "code_invalid_error": "Le chèque-cadeau ou le code promotionnel n'est pas valide", + "code_label": "Chèque-cadeau ou code promotionnel", + "code_required_error": "Veuillez saisir le code de votre chèque-cadeau ou de l'offre promotionnelle", + "coupon_location_error": "Votre adresse de livraison ne répond pas aux exigences géographiques du code promotionnel saisi.", + "coupon_min_order_total": "Votre commande n'atteint pas le montant total minimum pour que ce code promotionnel puisse être appliqué.", + "coupon_text": "Code promotionnel", + "gift_certificate_remaining_text": "restant·s", + "gift_certificate_text": "Chèque-cadeau", + "remove_action": "Supprimer", + "store_credit_available_text": "Un avoir de {storeCredit} est actuellement disponible sur votre compte", + "toggle_action": "Code promotionnel/chèque-cadeau" + }, + "remote": { + "browser_unsupported": "Vous devez utiliser un autre navigateur Web pour le mode de paiement sélectionné. Veuillez choisir un autre mode de paiement.", + "connection_error": "Refus de la connexion au paiement à distance. Veuillez réessayer.", + "continue_with_text": "Ou continuer avec", + "payment_method_error": "Une erreur s'est produite lors de la récupération de votre mode de paiement à distance. Veuillez réessayer.", + "select_different_card_action": "Sélectionner une autre carte", + "session_error": "Votre session à distance a expiré. Veuillez vous reconnecter.", + "shipping_address_error": "Une erreur s'est produite lors de la récupération de votre adresse de livraison à distance. Veuillez réessayer.", + "sign_in_action": "Se connecter à {providerName}", + "sign_out_action": "Se déconnecter de {providerName}", + "sign_out_after_action": "pour afficher d'autres modes de paiement", + "sign_in_required_error": "Connexion à distance requise avant de procéder au paiement" + }, + "shipping": { + "cart_change_error": "Nous avons détecté une mise à jour de votre panier. Les frais de livraison disponibles ont également été mis à jour. Veuillez sélectionner à nouveau un mode de livraison pour continuer.", + "enter_shipping_address_text": "Veuillez saisir une adresse de livraison pour obtenir une estimation des frais de livraison.", + "order_comment_label": "Commentaires sur la commande", + "assign_item_error": "Une erreur s'est produite lors de l'attribution de l'article à une adresse. Veuillez réessayer.", + "assign_item_invalid_address_error_heading": "Adresse non valide", + "assign_item_invalid_address_error": "L'adresse sélectionnée n'est pas valide. Veuillez accéder à votre compte et la mettre à jour.", + "unassign_item_error": "Une erreur s'est produite lors de la dissociation de l'article et de l'adresse.", + "save_shipping_address_error": "Une erreur s'est produite lors de l'enregistrement de l'adresse de livraison pour le devis. Veuillez réessayer.", + "save_shipping_option_error": "Une erreur s'est produite lors de l'enregistrement du devis de livraison pour votre commande. Veuillez réessayer.", + "select_shipping_address_text": "Veuillez sélectionner une adresse de livraison pour obtenir une estimation des frais de livraison.", + "shipping_address_heading": "Adresse de livraison", + "multishipping_address_heading": "Choisir la destination de chaque article", + "multishipping_address_heading_guest": "Veuillez commencer par vous connecter", + "multishipping_guest_intro": "Pour expédier vos articles à plusieurs adresses, vous devez", + "multishipping_guest_sign_in": "vous connecter à votre compte", + "multishipping_guest_create": "ou créer un compte avant de continuer.", + "ship_to_multi": "Livrer à plusieurs adresses", + "ship_to_single": "Livrer à une seule adresse", + "shipping_heading": "Expédition", + "shipping_method_label": "Mode de livraison", + "shipping_option_expired_error": "Le devis de livraison que vous avez reçu n'est plus valide. Cliquez sur OK pour consulter les frais de livraison actualisés.", + "shipping_option_expired_heading": "Les frais de port ont été mis à jour", + "view_shipping_options_action": "Voir d'autres options" + }, + "social": { + "share_action": "Partager", + "share_heading": "Présentez votre achat à vos amis !", + "tweet_action": "Tweeter" + }, + "spam_protection": { + "verify_action": "Avant de continuer, veuillez cliquer ici pour confirmer que vous n'êtes pas un robot." + }, + "privacy_policy": { + "required_error": "Veuillez accepter la politique de confidentialité.", + "label": "Oui, j'accepte la politique de confidentialité.", + "heading": "Politique de confidentialité" + }, + "terms_and_conditions": { + "agreement_required_error": "Veuillez accepter les conditions générales.", + "agreement_text": "Oui, j'accepte les conditions générales ci-dessus.", + "agreement_with_link_text": "Oui, j'accepte les conditions générales.", + "terms_and_conditions_heading": "Conditions générales" + }, + "order_confirmation": { + "order_number_text": "Votre numéro de commande est {orderNumber}", + "order_pending_review_text": "Votre commande nous a été transmise. Le paiement est actuellement en attente. Dès que nous le recevrons, nous finaliserons votre commande. Si vous avez déjà renseigné vos coordonnées bancaires, nous traiterons manuellement votre commande et vous enverrons un e-mail une fois le traitement terminé.", + "order_pending_status_text": "Nous avons bien reçu votre commande et procédons au traitement du paiement. Dès que le paiement sera vérifié, nous confirmerons votre commande. Nous vous enverrons un e-mail une fois la vérification terminée. Remarque : cette procédure peut prendre quelques minutes en fonction des délais de traitement du mode de paiement sélectionné. Pour toute question concernant votre achat, veuillez nous contacter par e-mail à l'adresse {supportEmail}.", + "order_incomplete_status_text": "Nous avons reçu votre commande et votre paiement. Notre système traite actuellement votre commande. Remarque : le traitement peut prendre quelques minutes. Pour toute question concernant votre achat, veuillez nous contacter par e-mail à l'adresse {supportEmail}.", + "order_with_downloadable_digital_items_text": "Vous pouvez télécharger vos achats numériques à tout moment en cliquant sur les liens présents sur cette page ou en vous connectant à votre compte. Un lien de téléchargement se trouve également dans votre e-mail de confirmation, que vous devriez recevoir sous peu.", + "order_with_support_number_text": "Vous allez recevoir un e-mail contenant toutes les informations au sujet de votre achat. Pour toute question concernant votre achat, veuillez nous contacter par e-mail à l'adresse {supportEmail} ou par téléphone au {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "À réception de votre paiement, nous vous enverrons un e-mail de confirmation contenant un lien vous permettant de télécharger vos achats numériques.", + "order_without_support_number_text": "Vous allez recevoir un e-mail contenant toutes les informations au sujet de votre achat. Pour toute question concernant votre achat, veuillez nous contacter par e-mail à l'adresse {supportEmail}.", + "thank_you_customer_heading": "Merci {name} !", + "thank_you_heading": "Merci !", + "continue_shopping": "Continuer mes achats »", + "order_status_update_facebook_messenger_heading": "Recevez toutes les mises à jour de votre commande sur Messenger", + "mandate_link_text": "Mandat {provider}", + "boleto_link_text": "Ticket Boleto Bancário", + "oxxo_link_text": "Ticket OXXO", + "sepa_link_text": "Mandat SEPA Direct Debit" + } + } +} diff --git a/assets/json/it.json b/assets/json/it.json new file mode 100644 index 000000000..8b42312fe --- /dev/null +++ b/assets/json/it.json @@ -0,0 +1,470 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Indirizzo", + "address_line_1_required_error": "L'indirizzo è obbligatorio", + "address_line_2_label": "Appartamento/Edificio", + "address_line_2_required_error": "Appartamento/Edificio è obbligatorio", + "address_not_recognized_heading": "L'indirizzo non è stato riconosciuto", + "consignment_address_updated_text": "All'elemento è stato assegnato il nuovo indirizzo.", + "city_label": "Città", + "city_required_error": "La Città è necessaria", + "company_name_label": "Azienda", + "company_name_required_error": "L'azienda è obbligatoria", + "confirm_address_action": "Continua con l'indirizzo in uso", + "confirm_address_text": "Impossibile trovare una corrispondenza per l'indirizzo inserito. Conferma l'indirizzo.", + "country_label": "Paese", + "country_required_error": "Il paese è obbligatorio", + "custom_required_error": "{label} è obbligatoria/o", + "custom_min_error": "{label} deve essere maggiore di {min}", + "custom_max_error": "{label} deve essere minore di {max}", + "invalid_characters_error": "{label} contiene caratteri non validi", + "custom_valid_error": "{label} non è valido", + "edit_address_action": "Modifica indirizzo", + "enter_address_action": "Inserisci un nuovo indirizzo", + "add_address_heading": "Aggiungi indirizzo", + "save_address_action": "Salva indirizzo", + "first_name_label": "Nome", + "first_name_required_error": "Il nome è obbligatorio", + "last_name_label": "Cognome", + "last_name_required_error": "Il cognome è obbligatorio", + "phone_number_label": "Numero di telefono", + "phone_number_required_error": "Il numero di telefono è obbligatorio", + "postal_code_label": "Codice postale", + "postal_code_required_error": "Il CAP è necessario", + "save_in_addressbook": "Salva l'indirizzo nella mia rubrica.", + "select_country_action": "Seleziona un paese", + "select_state_action": "Seleziona uno stato", + "state_label": "Stato/provincia", + "state_required_error": "Lo Stato/Provincia è obbligatorio", + "select": "Seleziona", + "select_all": "Tutti", + "select_none": "Nessuno" + }, + "billing": { + "billing_address_heading": "Indirizzo di fatturazione", + "billing_heading": "Fatturazione", + "save_billing_address_error": "Si è verificato un errore durante il salvataggio dell'indirizzo di fatturazione nel preventivo. Riprova.", + "billing_address_amazon": "Lo stesso indirizzo di fatturazione impostato per il tuo account Amazon.", + "billing_address_amazonpay": "Gestito da Amazon Pay", + "use_shipping_address_label": "L'indirizzo di fatturazione corrisponde all'indirizzo di spedizione." + }, + "cart": { + "billed_amount_text": "*Ti verranno addebitati e fatturati {total} ({code}) per questo ordine.", + "based_on_currency_text": "In base a {total} {code}", + "cart_heading": "Riepilogo ordine", + "digital_item_text": "Articolo digitale", + "discount_text": "Sconto", + "downloads_action": "Vai su Download", + "edit_cart_action": "Modifica carrello", + "estimated_total_text": "Totale stimato", + "free_text": "Gratis", + "gift_certificate_text": "Buono regalo", + "handling_text": "Gestione", + "item_count_text": "{count, plural, one{1 articolo} other{# articoli} }", + "print_action": "Stampa", + "remaining_text": "rimanente", + "remove_action": "rimuovi", + "see_all_action": "Vedi tutto", + "see_less_action": "Mostra meno", + "shipping_text": "Spedizioni", + "gift_wrapping_text": "Confezione regalo", + "show_details_action": "Mostra dettagli", + "store_credit_text": "Credito del negozio", + "subtotal_text": "Subtotale", + "taxes_text": "Tasse", + "total_text": "Totale", + "empty_cart_message": "Il carrello è vuoto, verrai reindirizzato. Se il browser non procede automaticamente al reindirizzamento fai clic qui." + }, + "common": { + "cancel_action": "Annulla", + "close_action": "Chiudi", + "continue_action": "Continua", + "edit_action": "Modifica", + "delete_action": "Elimina", + "error_heading": "Si è verificato un errore", + "leave_warning": "Uscire dalla pagina? I dati inseriti potrebbero non essere salvati.", + "loading_text": "Caricamento in corso", + "ok_action": "Ok", + "error_code": "Codice di errore:", + "request_id": "ID richiesta:", + "optional_text": "(Facoltativo)", + "unavailable_error": "Il checkout non è al momento disponibile. Riprova più tardi.", + "unavailable_heading": "Il checkout non è al momento disponibile", + "unstable_network_error": "Sembra che il server stia impiegando troppo tempo a rispondere, forse per una scarsa connettività o per un errore dei nostri server. Riprova a breve.", + "order_loading_error": "Si è verificato un errore nel caricamento dell'ordine. Riprova.", + "order_fatal_error_heading": "Si è verificato un errore nell'effettuare l'ordine", + "order_fatal_error_extra": "Scegli un'altra modalità di pagamento o contattaci per ulteriore assistenza.", + "go_back": "Torna indietro", + "show_more": "Mostra di più" + }, + "customer": { + "checkout_as_guest_text": "Stai effettuando l'acquisto come Ospite? Puoi sempre salvare i tuoi dati per creare un account con noi in un secondo momento.", + "continue_as_guest_action": "Continua come ospite", + "create_account_action": "Crea account", + "continue": "Continua", + "set_password_action": "Salva password", + "required_error": "{label} è obbligatoria/o", + "min_error": "{label} deve essere maggiore di {min}", + "max_error": "{label} deve essere minore di {max}", + "invalid_characters_error": "{label} contiene caratteri non validi", + "create_account_error": "Si è verificato un errore durante la creazione del tuo account. Riprova.", + "create_address_error": "Tuttavia, si è verificato un errore durante il salvataggio dell'indirizzo nella rubrica.", + "create_account_requirements_error_heading": "La password non soddisfa i requisiti", + "create_account_success": "Il tuo account è stato creato.", + "set_password_success": "La password è stata salvata.", + "create_account_text": "Crea un account per un checkout più rapido in futuro", + "set_password_text": "Salva la password per un checkout più rapido in futuro", + "account_created_text": "È stato creato un account per te, ma per accedere dovrai impostare una password.", + "create_account_to_continue_text": "Non hai un account? Crea un account per continuare.", + "guest_could_login": "Sembra che tu abbia già un account. Accedi con {email} per un checkout più rapido.", + "guest_must_login": "Sembra che tu abbia già un account. Accedi per continuare con {email} o utilizza un'altra e-mail.", + "guest_temporary_disabled": "Il checkout come ospite è temporaneamente disattivato. Accedi o crea un account per continuare.", + "customer_heading": "Cliente", + "email_invalid_error": "L'indirizzo e-mail deve essere valido", + "email_label": "Indirizzo e-mail", + "email_required_error": "L'indirizzo e-mail è obbligatorio", + "forgot_password_action": "Hai dimenticato la password?", + "guest_customer_text": "Cliente ospite", + "guest_subscribe_to_newsletter_text": "Iscriviti alla nostra newsletter.", + "guest_marketing_consent": "Desidero ricevere aggiornamenti e offerte", + "login_action": "Iscriviti ora", + "login_text": "Hai già un account?", + "email_in_use_text": "Esiste già un account per {email}. Accedi o inserisci un altro indirizzo e-mail.", + "unknown_email_in_use_text": "Esiste già un account per l'e-mail indicata. Accedi o inserisci un altro indirizzo e-mail.", + "guest_could_login_change_email": "Non sei {email}? Cambia e-mail.", + "password_confirmation_error": "Le password non corrispondono", + "password_confirmation_label": "Conferma password", + "password_confirmation_required_error": "Questo campo è obbligatorio", + "password_label": "Password", + "password_letter_required_error": "La password deve contenere una lettera", + "password_minimum_character_label": "limite minimo di caratteri, distinzione tra maiuscole e minuscole", + "password_number_required_error": "La password deve contenere un numero", + "password_over_maximum_length_error": "Password troppo lunga", + "password_required_error": "La password è obbligatoria", + "password_under_minimum_length_error": "Password troppo corta", + "reset_password_before_login_error": "L'accesso non è al momento disponibile. Nei prossimi 5 minuti, riceverai un'e-mail con le istruzioni per reimpostare la password. Se non la ricevi, controlla la cartella Posta indesiderata o contattaci per ulteriore assistenza.", + "returning_customer_text": "Cliente che torna", + "sign_in_action": "Accedi", + "sign_in_error": "L'e-mail o la password inserite non sono valide.", + "sign_in_throttled_error": "Hai effettuato troppi tentativi. Attendi 10 secondi prima di provare nuovamente ad accedere.", + "sign_out_action": "Esci", + "sign_out_error": "Si è verificato un errore durante la disconnessione. Riprova.", + "subscribe_to_newsletter_text": "Sì, vorrei ricevere aggiornamenti.", + "suggestion_text": "Sembra che tu abbia un account {provider}. Accedi con {providerFlow} per un checkout più rapido.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "Non è stato possibile inviarti un link per l'accesso. Riprova.", + "error_not_found": "L'e-mail inserita non è associata a nessun account. Prova con un indirizzo diverso.", + "sent_header": "Controlla la casella di posta", + "sent_text": "Abbiamo inviato un'e-mail a {email} con un link per l'accesso. Il link scadrà tra {minutes} minuti. Se non lo vedi nella posta in arrivo, controlla la cartella della posta indesiderata.", + "text": "Inserisci l'indirizzo e-mail associato al tuo account. Ti invieremo un link per l'accesso.", + "header": "Inserisci il tuo indirizzo e-mail", + "header_with_email": "Conferma il tuo indirizzo e-mail", + "link": "Inviami un link per l'accesso.", + "use_another_email": "Usa un'altra e-mail", + "send": "Invia", + "error_temporary_disabled": "La funzionalità link per l'accesso non è al momento disponibile. Accedi inserendo la password.", + "resend_link": "Non hai ricevuto l'e-mail? Reinvia il link", + "use_password_link": " oppure accedi utilizzando la password." + }, + "embedded_checkout": { + "unsupported_error": "I seguenti metodi di pagamento non sono supportati dal Checkout incorporato: {methods}. Contattaci per ricevere assistenza." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Pagamento nel tempo", + "affirm_body_text": "Verrai reindirizzato su Affirm per completare il tuo acquisto in modo sicuro. Da lì ti basterà inserire alcune informazioni di base e prendere una decisione in tempo reale. Verificare la tua idoneità non influirà sul tuo punteggio di credito.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Checkout con Afterpay", + "amazon_continue_action": "Continua con Amazon", + "amazonpay_continue_action": "Continua con Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continua", + "bluesnap_v2_continue_action": "Continua", + "bolt_continue_action": "Continua con Bolt", + "bolt_create_account_label": "Ricorda i miei dati tramite Bolt", + "bolt_create_account_disclaimer": "Selezionando l'opzione qui sopra, accetti di creare un account Bolt in conformità con i termini e le condizioni e l'informativa sulla privacy.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Continua con Visa Checkout", + "ccavenuemars_description_text": "Checkout con CCAvenue", + "chasepay_continue_action": "Continua con Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Modifica carta", + "chasepay_logout": "Esci da Chase Pay", + "chasepay_fail_load": "Caricamento di Chase Pay non riuscito", + "checkoutcom_document_label_boleto": "CPF o CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "ID nazionale", + "checkoutcom_document_invalid_error_boleto": "Il CPF o CNPJ deve essere compreso tra 11 e 14 caratteri", + "checkoutcom_document_invalid_error_oxxo": "Il CURP deve contenere al massimo 18 caratteri", + "checkoutcom_document_invalid_error_qpay": "L'ID nazionale deve contenere al massimo 32 caratteri", + "checkoutcom_fawry_customer_mobile_invalid_error": "Il numero di cellulare deve essere valido", + "checkoutcom_fawry_customer_mobile_label": "Numero di cellulare", + "checkoutcom_fawry_customer_email_invalid_error": "L'indirizzo e-mail deve essere valido", + "checkoutcom_fawry_customer_email_label": "E-mail", + "checkoutcom_sepa_creditor_title": "Creditore", + "checkoutcom_sepa_creditor_id": "ID creditore: {creditorId}", + "checkoutcom_sepa_debtor_title": "Debitore", + "checkoutcom_sepa_mandate_disclaimer": "Tramite questo modulo, autorizzi {creditorName} a inviare istruzioni alla tua banca affinché addebiti l'importo sul tuo conto, e la tua banca ad addebitarti l'importo secondo le istruzioni ricevute. Puoi avere diritto a un rimborso dalla tua banca secondo i termini e le condizioni dell'accordo in vigore con l'istituto di credito. Il rimborso va richiesto entro 8 settimane a partire dalla data in cui l'importo viene addebitato sul conto.", + "checkoutcom_sepa_payment_type": "Tipo di pagamento: una tantum (non ricorrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Carta di credito", + "credit_card_customer_code_label": "Codice cliente", + "credit_card_cvv_help_text": "Per VISA e Mastercard, il CVV è un codice di tre cifre stampato sul retro. Per American Express, è il codice di quattro cifre stampato sul fronte. Il CVV è una misura di sicurezza per verificare che tu sia in possesso della carta.", + "credit_card_cvv_invalid_error": "Il CVV deve essere valido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "Il CVV è obbligatorio", + "credit_card_expiration_invalid_error": "La data di scadenza deve essere una data futura valida nel formato MM/AA", + "credit_card_expiration_label": "Scadenza", + "credit_card_expiration_date_label": "Data di scadenza", + "credit_card_expiration_required_error": "La data di scadenza è obbligatoria", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nome sulla carta", + "credit_card_name_required_error": "Il nome completo è obbligatorio", + "credit_card_number_invalid_error": "Il numero della carta di credito deve essere valido", + "credit_card_number_label": "Numero di carta di credito", + "credit_card_number_last_four": "Inserisci il numero di carta della {cardType} che termina con {lastFour}", + "credit_card_number_required_error": "Il numero della carta di credito è obbligatorio", + "credit_card_number_mismatch_error": "Il numero di carta inserito non corrisponde a quello memorizzato nel tuo account", + "credit_debit_card_text": "Carta di credito/debito", + "digitalriver_dropin_error": "Si è verificato un problema durante l'elaborazione del pagamento. Riprova o contattaci.", + "digitalriver_checkout_error": "Si è verificato un problema con il pagamento, controlla i tuoi dati e riprova o contatta il servizio clienti", + "digitalriver_checkout_error_title": "Errore durante l'elaborazione della richiesta.", + "google_pay_name_text": "Google Pay", + "klarna_continue_action": "Prosegui con Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continua con Openpay", + "orbital_continue_action": "Effettua ordine", + "orbital_description_text": "Paga dal tuo conto ChasePay", + "payment_cancelled": "Il pagamento è stato annullato", + "payment_error": "Si è verificato un errore durante l'elaborazione del pagamento. Riprova.", + "payment_error_heading": "Pagamento non riuscito", + "payment_heading": "Pagamento", + "payment_invalid_error_heading": "Pagamento non disponibile", + "payment_method_disabled_error": "Il metodo di pagamento selezionato non è più valido. Fai clic su OK per visualizzare i metodi di pagamento più aggiornati.", + "payment_method_error": "Risposta del gestore dei pagamenti: {message}", + "payment_method_invalid_error": "Si è verificato un problema nell'elaborazione del pagamento. Contattaci per ricevere assistenza o scegli un altro metodo di pagamento.", + "payment_method_unavailable_error": "Il gestore dei pagamenti non è al momento disponibile. Riprova più tardi.", + "payment_not_required_text": "Questo ordine non richiede alcun pagamento.", + "paypal_continue_action": "Continua con PayPal", + "paypal_credit_continue_action": "Continua con PayPal Credit", + "paypal_credit_description_text": "Acquista ora, paga nel tempo", + "paypal_description_text": "Paga dal tuo conto PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Paga più tardi", + "place_order_action": "Effettua ordine", + "place_order_error": "Si è verificato un errore nell'effettuare l'ordine. Contattaci.", + "place_order_error_heading": "Impossibile effettuare l'ordine", + "postal_code_label": "Codice postale", + "ideal_bic_required": "Devi selezionare un emittente per effettuare l'ordine", + "instrument_text": "Carte di credito memorizzate", + "instrument_add_card_action": "Usa un'altra carta", + "instrument_default_ending_in_text": "Carta che termina con {endingIn}", + "instrument_ending_in_text": "{cardTitle} che termina con {endingIn}", + "instrument_expired_text": "Scaduta il {expiryDate}", + "instrument_expires_text": "Scade il {expiryDate}", + "instrument_manage_button": "Gestisci", + "instrument_manage_modal_confirmation_action": "Sì, elimina", + "instrument_manage_modal_confirmation_label": "Vuoi davvero eliminare questo metodo di pagamento salvato?", + "instrument_manage_modal_title_text": "Gestisci i metodi di pagamento memorizzati", + "instrument_manage_modal_empty_text": "Non hai alcun metodo di pagamento memorizzato.", + "instrument_manage_table_header_ending_in_text": "Che termina con", + "instrument_manage_table_header_expiry_date_text": "Data di scadenza", + "instrument_manage_table_header_payment_method_text": "Metodo di pagamento", + "instrument_manage_delete_server_error": "Si è verificato un errore durante il tentativo di eliminare il metodo di pagamento salvato, riprova.", + "instrument_manage_delete_auth_error": "Si è verificato un problema nell'autorizzare la richiesta. Prova ad accedere di nuovo", + "instrument_manage_delete_client_error": "Si è verificato un errore nel tentativo di eliminare il metodo di pagamento salvato: il metodo di pagamento selezionato non esiste più o non può essere eliminato.", + "instrument_save_payment_method_label": "Salva questa carta per le transazioni future", + "instrument_save_as_default_payment_method_label": "Usa questa carta come metodo di pagamento predefinito per le transazioni future", + "account_instrument_add_action": "Usa un altro conto", + "account_instrument_save_payment_method_label": "Salva questo conto per le transazioni future", + "account_instrument_save_as_default_payment_method_label": "Usa questo conto come metodo di pagamento predefinito per le transazioni future", + "account_instrument_text": "Conti memorizzati", + "account_instrument_new_shipping_address": "Abbiamo notato che hai inserito un nuovo indirizzo di spedizione.

Per motivi di sicurezza, quando effettui una spedizione a un nuovo indirizzo o se l'indirizzo di spedizione è stato modificato di recente, dovrai ricollegare il tuo account PayPal.

", + "instrument_trusted_shipping_address_text": "Questo passaggio di sicurezza aggiuntivo viene applicato se spedisci a un nuovo indirizzo o se l'indirizzo di spedizione è stato modificato di recente.", + "instrument_trusted_shipping_address_title_text": "Inserisci nuovamente il numero di carta per autorizzare questa transazione.", + "quadpay_continue_action": "Continua con Zip", + "quadpay_display_name_text": "Paga in 4 rate (Quadpay)", + "ppsdk_continue_action": "Continua con {methodName}", + "select_your_bank": "Seleziona la tua banca", + "sepa_account_number": "Numero di conto (IBAN)", + "sepa_account_number_required": "Devi inserire il tuo numero di conto (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "Il BIC deve contenere 8 o 11 caratteri", + "sepa_mandate_required": "Devi accettare il modulo di autorizzazione", + "sezzle_display_name_text": "Paga più tardi. Interessi allo 0 %.", + "stripe_sepa_display_name_text": "Addebito diretto SEPA.", + "stripe_sepa_mandate_disclaimer": "Fornendo il tuo IBAN e confermando questo pagamento, autorizzi (A) {storeUrl} e Stripe, il nostro provider di servizi di pagamento, a inviare istruzioni alla tua banca affinché addebiti l'importo sul tuo conto e (B) la tua banca ad addebitare l'importo sul tuo conto in conformità con le istruzioni ricevute. Puoi avere diritto a un rimborso dalla tua banca secondo i termini e le condizioni dell'accordo in vigore con l'istituto di credito. Il rimborso va richiesto entro otto settimane a partire dalla data in cui l'importo viene addebitato sul conto.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continua con Click to pay", + "zip_continue_action": "Continua con Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Own it Now, Pay Later", + "errors": { + "additional_action_required": "Continua con azioni aggiuntive.", + "authorization_expired": "L'autorizzazione per questa transazione è scaduta.", + "authorization_revoked": "L'autorizzazione per questa transazione è stata revocata.", + "call_issuer": "Si è verificato un problema con l'elaborazione della carta. Contatta l'emittente della carta.", + "captured_transaction": "Per questo ordine è già stato effettuato il pagamento.", + "card_declined": "Pagamento rifiutato. Prova con una carta diversa.", + "card_error": "Impossibile verificare i dettagli della tua carta. Controlla i dati e riprova.", + "card_replaced": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "connection_error": "Si è verificato un problema durante l'elaborazione della transazione. Riprova più tardi.", + "duplicate_transaction": "La transazione è già stata effettuata. Contattaci per confermare l'ordine. Non cercare di effettuare un nuovo pagamento.", + "expired_card": "La carta è scaduta. Riprova con una carta valida.", + "gateway_error": "Si è verificato un errore sul server. Riprova in un secondo momento.", + "general_error": "Errore durante l'elaborazione della richiesta di pagamento.", + "hosted_form_error": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "incorrect_address": "Impossibile verificare l'indirizzo di fatturazione. Controlla i dettagli e riprova.", + "incorrect_amount": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "incorrect_cvc": "Impossibile verificare i dettagli della tua carta. Controlla i dati e riprova.", + "incorrect_number": "Impossibile verificare i dettagli della tua carta. Controlla i dati e riprova.", + "incorrect_zip": "Impossibile verificare l'indirizzo di fatturazione. Controlla i dettagli e riprova.", + "insufficient_funds": "Pagamento rifiutato. Contatta la tua banca.", + "invalid_address": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "invalid_amount": "Si è verificato un problema durante l'elaborazione del pagamento. Riprova o contattaci.", + "invalid_authorization_code": "Si è verificato un problema durante l'elaborazione del pagamento. Riprova o contattaci.", + "invalid_create_instrument_request": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "invalid_cvc": "Impossibile verificare i dettagli della tua carta. Controlla i dati e riprova.", + "invalid_email_address": "Non è stato possibile elaborare il pagamento perché l'indirizzo e-mail fornito per la transazione non è valido.", + "invalid_expiry_date": "Impossibile verificare i dettagli della tua carta. Controlla i dati e riprova.", + "invalid_expiry_month": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "invalid_expiry_year": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "invalid_gateway": "Il gateway non è valido.", + "invalid_gateway_options": "Le opzioni del gateway non sono valide.", + "invalid_instrument": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "invalid_issuer": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "invalid_number": "Impossibile verificare i dettagli della tua carta. Controlla i dati e riprova.", + "invalid_payment_request": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "invalid_request_error": "Si è verificato un problema durante l'elaborazione della transazione. Contattaci o riprova più tardi.", + "invalid_user_authentication": "Si è verificato un problema durante l'elaborazione del pagamento. Contattaci.", + "invalid_zip": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "journal_error": "Si è verificato un errore sul server. Riprova in un secondo momento.", + "lost_or_stolen_card": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "missing_test_mode": "Non è stato possibile elaborare la richiesta perché i dati forniti per la transazione non sono validi.", + "not_found": "Si è verificato un problema durante l'elaborazione della transazione. Riprova più tardi.", + "payment_config_error": "Si è verificato un errore sul server. Riprova in un secondo momento.", + "payment_config_not_found": "Si è verificato un errore sul server. Riprova in un secondo momento.", + "pending_review": "La transazione è stata autorizzata, ma è in attesa di verifica da parte dell'esercente.", + "pickup_card": "Non è possibile usare la carta per effettuare questo pagamento. Contatta l'emittente della carta o prova con una carta diversa.", + "processing_error": "Si è verificato un problema durante l'elaborazione della transazione. Riprova più tardi.", + "provider_configuration_error": "Il fornitore di pagamenti del commerciante non è configurato correttamente.", + "refund_timelimit_expired": "Il limite di tempo per rimborsare questa transazione è scaduto.", + "refunded_transaction": "Questa transazione è già stata rimborsata.", + "request_timeout": "Tempo scaduto, impossibile elaborare il pagamento. Riprova.", + "required_field": "Impossibile verificare il pagamento. Controlla i dettagli della tua carta e riprova.", + "server_error": "Si è verificato un errore durante l'elaborazione del pagamento e non è stato possibile completare l'ordine. Riprova.", + "store_instrument_failed": "Impossibile elaborare la richiesta. Riprova.", + "stored_payment_instrument_not_found": "Impossibile trovare lo strumento di pagamento memorizzato. Prova con un'altra opzione di pagamento.", + "three_d_secure_declined": "Si è verificato un problema con il pagamento, controlla i dati di pagamento o contatta l'emittente della carta.", + "three_d_secure_failed": "Pagamento non riuscito. Riprova o utilizza un'altra opzione di pagamento.", + "three_d_secure_required": "È necessaria un'ulteriore autenticazione per elaborare il pagamento. Contattaci.", + "token_error": "Si è verificato un problema durante l'elaborazione della transazione. Riprova più tardi.", + "transaction_declined": "Il pagamento è stato rifiutato. Riprova.", + "transaction_rejected": "Pagamento rifiutato. Riprova.", + "unauthorized": "Si è verificato un problema durante l'elaborazione della transazione. Riprova più tardi.", + "unsupported_currency": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "unsupported_instrument": "Impossibile verificare i dettagli della tua carta. Controlla i dati e riprova.", + "unsupported_request": "Non è stato possibile elaborare il pagamento perché i dati forniti per la transazione non sono validi.", + "user_authorization_error": "Si è verificato un problema durante l'elaborazione del pagamento. Contattaci.", + "vaulting_service_unavailable": "Il servizio di vaulting non è attualmente disponibile.", + "voided_transaction": "Impossibile elaborare il pagamento in quanto la transazione è già stata annullata. Riprova o contattaci." + } + }, + "redeemable": { + "applied_text": "Applicato", + "apply_action": "Applica", + "apply_store_credit_after_action": "credito del negozio per l'ordine", + "apply_store_credit_before_action": "Applica", + "code_invalid_error": "Il buono regalo o codice coupon inserito non è valido", + "code_label": "Buono regalo o Codice coupon", + "code_required_error": "Inserisci un buono regalo o un codice coupon", + "coupon_location_error": "L'indirizzo di spedizione specificato non soddisfa i requisiti geografici per il codice promozionale inserito.", + "coupon_min_order_total": "Il tuo ordine non soddisfa il totale minimo per applicare questo codice promozionale.", + "coupon_text": "Coupon", + "gift_certificate_remaining_text": "rimanente", + "gift_certificate_text": "Buono regalo", + "remove_action": "Rimuovi", + "store_credit_available_text": "Al momento il tuo account dispone di {storeCredit} crediti totali del negozio disponibili", + "toggle_action": "Coupon/buono regalo" + }, + "remote": { + "browser_unsupported": "Il metodo di pagamento selezionato richiede un browser diverso. Scegline un altro.", + "connection_error": "Connessione al checkout remoto rifiutata, riprova più tardi.", + "continue_with_text": "Oppure continua con", + "payment_method_error": "Si è verificato un errore nel recupero del metodo di pagamento remoto. Riprova.", + "select_different_card_action": "Seleziona un'altra carta", + "session_error": "La sessione remota è scaduta. Esegui nuovamente l'accesso.", + "shipping_address_error": "Si è verificato un errore nel recuperare l'indirizzo di spedizione da remoto. Riprova.", + "sign_in_action": "Accedi a {providerName}", + "sign_out_action": "Esci da {providerName}", + "sign_out_after_action": "per visualizzare altri metodi di pagamento", + "sign_in_required_error": "Prima del pagamento devi effettuare l'accesso da remoto" + }, + "shipping": { + "cart_change_error": "È stato rilevato un aggiornamento del carrello e i costi di spedizione disponibili sono stati aggiornati. Per continuare, seleziona di nuovo un metodo di spedizione.", + "enter_shipping_address_text": "Inserisci un indirizzo di spedizione per visualizzare i relativi costi", + "order_comment_label": "Commenti sull'ordine", + "assign_item_error": "Si è verificato un errore nell'assegnare l'articolo all'indirizzo inserito. Riprova.", + "assign_item_invalid_address_error_heading": "Indirizzo non valido", + "assign_item_invalid_address_error": "L'indirizzo selezionato non è valido. Vai sulla pagina del tuo account e aggiornalo.", + "unassign_item_error": "Si è verificato un errore nel disassegnare l'articolo all'indirizzo inserito.", + "save_shipping_address_error": "Si è verificato un errore nel salvare l'indirizzo di spedizione nel preventivo. Riprova.", + "save_shipping_option_error": "Si è verificato un errore nel salvare i costi di spedizione nell'ordine. Riprova.", + "select_shipping_address_text": "Seleziona un indirizzo di spedizione per visualizzare i relativi costi", + "shipping_address_heading": "Indirizzo di spedizione", + "multishipping_address_heading": "Scegli dove spedire ogni articolo", + "multishipping_address_heading_guest": "Prima devi eseguire l'accesso", + "multishipping_guest_intro": "Per spedire i tuoi articoli a più indirizzi devi", + "multishipping_guest_sign_in": "accedere al tuo account", + "multishipping_guest_create": "o creare un account prima di procedere.", + "ship_to_multi": "Spedisci a più indirizzi", + "ship_to_single": "Spedisci a un solo indirizzo", + "shipping_heading": "Spedizioni", + "shipping_method_label": "Metodo di spedizione", + "shipping_option_expired_error": "Il costo di spedizione che ti era stato preventivato non è più valido. Fai clic su OK per vedere i costi di spedizione più aggiornati.", + "shipping_option_expired_heading": "Il costo di spedizione è stato aggiornato", + "view_shipping_options_action": "Visualizza altre opzioni" + }, + "social": { + "share_action": "Condividi", + "share_heading": "Fai sapere ai tuoi amici dell'acquisto!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Fai clic qui per confermare che sei un essere umano prima di procedere." + }, + "privacy_policy": { + "required_error": "Accetta l'Informativa sulla privacy.", + "label": "Sì, accetto l'Informativa sulla privacy.", + "heading": "Informativa sulla privacy" + }, + "terms_and_conditions": { + "agreement_required_error": "Accetta i termini e le condizioni", + "agreement_text": "Sì, accetto i termini e le condizioni di cui sopra.", + "agreement_with_link_text": "Sì, accetto i termini e le condizioni.", + "terms_and_conditions_heading": "Termini e condizioni" + }, + "order_confirmation": { + "order_number_text": "Il tuo numero d'ordine è {orderNumber}", + "order_pending_review_text": "Abbiamo ricevuto il tuo ordine, che però è ancora in attesa di pagamento. Una volta ricevuto l'importo corrispondente, l'ordine risulterà completato. Se hai già fornito i dati per il pagamento, elaboreremo l'ordine manualmente e ti invieremo un'e-mail al termine dell'operazione.", + "order_pending_status_text": "Abbiamo ricevuto il tuo ordine e stiamo elaborando il pagamento. Una volta verificato il pagamento, l'ordine risulterà completato. Ti invieremo un'e-mail al termine dell'operazione. Nota: la procedura può richiedere qualche minuto a seconda dei tempi di elaborazione del metodo scelto. Per qualsiasi domanda sul tuo acquisto, scrivici all'indirizzo {supportEmail}.", + "order_incomplete_status_text": "Abbiamo ricevuto il tuo ordine e il relativo pagamento. L'ordine è in fase di elaborazione nel nostro sistema. L'elaborazione potrebbe richiedere alcuni minuti. Per qualsiasi domanda sul tuo acquisto, scrivici all'indirizzo {supportEmail}.", + "order_with_downloadable_digital_items_text": "Puoi scaricare i tuoi acquisti digitali facendo clic sui link presenti in questa pagina o accedendo al tuo account in qualsiasi momento. Il link per il download è riportato anche nell'e-mail di conferma, che dovrebbe arrivarti a breve.", + "order_with_support_number_text": "Riceverai un'e-mail contenente informazioni sul tuo acquisto. Per qualsiasi domanda in merito, scrivici all'indirizzo {supportEmail} o chiamaci al {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Una volta ricevuto il pagamento, ti invieremo un'e-mail di conferma con un link per scaricare i tuoi acquisti digitali.", + "order_without_support_number_text": "Riceverai un'e-mail contenente informazioni sul tuo acquisto. Per qualsiasi domanda in merito, scrivici all'indirizzo {supportEmail}.", + "thank_you_customer_heading": "Grazie {name}!", + "thank_you_heading": "Grazie!", + "continue_shopping": "Continua a fare acquisti »", + "order_status_update_facebook_messenger_heading": "Ricevi aggiornamenti istantanei sul tuo ordine su Messenger", + "mandate_link_text": "Autorizzazione per {provider}", + "boleto_link_text": "Ticket Boleto Bancário", + "oxxo_link_text": "Ticket OXXO", + "sepa_link_text": "Autorizzazione addebito diretto SEPA" + } + } +} diff --git a/assets/json/nl.json b/assets/json/nl.json new file mode 100644 index 000000000..5fb8ca8a6 --- /dev/null +++ b/assets/json/nl.json @@ -0,0 +1,472 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Adres", + "address_line_1_required_error": "Adres is vereist", + "address_line_2_label": "Appartement/suite/gebouw", + "address_line_2_required_error": "Appartement/suite/gebouw is vereist", + "address_not_recognized_heading": "We hebben uw adres niet herkend", + "consignment_address_updated_text": "Het item is toegewezen aan het nieuwe adres.", + "city_label": "Plaats", + "city_required_error": "Plaats is vereist", + "company_name_label": "Bedrijfsnaam", + "company_name_required_error": "Bedrijf is vereist", + "confirm_address_action": "Doorgaan met huidig adres", + "confirm_address_text": "Er is geen overeenkomst gevonden voor het adres dat u heeft ingevoerd. Bevestig het adres.", + "country_label": "Land", + "country_required_error": "Land is vereist", + "custom_required_error": "{label} is vereist", + "custom_min_error": "{label} moet groter zijn dan {min}", + "custom_max_error": "{label} moet kleiner zijn dan {max}", + "invalid_characters_error": "{label} bevat ongeldige tekens", + "custom_valid_error": "{label} is niet geldig", + "edit_address_action": "Adres bewerken", + "enter_address_action": "Voer een nieuw adres in", + "add_address_heading": "Voeg adres toe", + "save_address_action": "Adres opslaan", + "first_name_label": "Voornaam", + "first_name_required_error": "Voornaam is vereist", + "last_name_label": "Achternaam", + "last_name_required_error": "Achternaam is vereist", + "phone_number_label": "Telefoonnummer", + "phone_number_required_error": "Telefoonnummer is vereist", + "postal_code_label": "Postcode", + "postal_code_required_error": "Postcode is vereist", + "save_in_addressbook": "Bewaar dit adres in mijn adresboek.", + "select_country_action": "Selecteer een land", + "select_state_action": "Selecteer een staat", + "state_label": "Staat/provincie", + "state_required_error": "Staat/provincie is vereist", + "select": "Selecteren", + "select_all": "Alles", + "select_none": "Geen" + }, + "billing": { + "billing_address_heading": "Factuuradres", + "billing_heading": "Facturering", + "save_billing_address_error": "Er is een fout opgetreden bij het opslaan van het factuuradres in uw prijsopgave. Probeer het opnieuw.", + "billing_address_amazon": "Zelfde als het factuuradres dat u heeft ingesteld in uw Amazon-account.", + "billing_address_amazonpay": "Beheerd door Amazon Pay", + "use_shipping_address_label": "Mijn factuuradres is hetzelfde als mijn verzendadres." + }, + "cart": { + "billed_amount_text": "*Er word {total} ({code}) in rekening gebracht en gefactureerd voor deze bestelling.", + "based_on_currency_text": "Gebaseerd op {total} {code}", + "cart_heading": "Besteloverzicht", + "digital_item_text": "Digitaal item", + "discount_text": "Korting", + "downloads_action": "Ga naar Downloads", + "edit_cart_action": "Winkelmandje bewerken", + "estimated_total_text": "Geschat totaal", + "free_text": "Gratis", + "gift_certificate_text": "Cadeaubon", + "handling_text": "Verwerking", + "item_count_text": "{count, plural, one{1 item} other{# items} }", + "print_action": "Afdrukken", + "remaining_text": "resterend", + "remove_action": "verwijderen", + "see_all_action": "Alles weergeven", + "see_less_action": "Minder weergeven", + "shipping_text": "Verzending", + "gift_wrapping_text": "Cadeauverpakking", + "show_details_action": "Details weergeven", + "store_credit_text": "Winkeltegoed", + "subtotal_text": "Subtotaal", + "taxes_text": "Belastingen", + "total_text": "Totaal", + "empty_cart_message": "Uw winkelmandje is leeg, u wordt omgeleid. Klik hier als uw browser u niet omleidt." + }, + "common": { + "cancel_action": "Annuleren", + "close_action": "Sluiten", + "continue_action": "Doorgaan", + "edit_action": "Bewerken", + "delete_action": "Verwijderen", + "error_heading": "Er is iets misgegaan", + "leave_warning": "Weet u zeker dat u wilt afsluiten? Gegevens die u hebt ingevoerd, worden mogelijk niet opgeslagen.", + "loading_text": "Bezig met laden", + "ok_action": "OK", + "error_code": "Foutcode:", + "request_id": "Aanvraag-ID:", + "optional_text": "(Optioneel)", + "unavailable_error": "Afrekenen is tijdelijk niet mogelijk. Probeer het later opnieuw.", + "unavailable_heading": "Afrekenen is tijdelijk niet beschikbaar", + "unstable_network_error": "Het lijkt erop dat de server er te lang over doet om te reageren, dit kan worden veroorzaakt door een slechte verbinding of een fout met onze servers. Probeer het later opnieuw.", + "order_loading_error": "Er is een fout opgetreden bij het laden van uw bestelling. Probeer het opnieuw.", + "order_fatal_error_heading": "Er is een fout opgetreden bij het plaatsen van uw bestelling", + "order_fatal_error_extra": "Kies een andere betaalmethode of neem contact met ons op voor verdere hulp.", + "go_back": "Teruggaan", + "show_more": "Meer weergeven" + }, + "customer": { + "checkout_as_guest_text": "Afrekenen als gast? U kunt uw gegevens opslaan en later een account bij ons aanmaken.", + "continue_as_guest_action": "Doorgaan als gast", + "create_account_action": "Account aanmaken", + "continue": "Doorgaan", + "set_password_action": "Wachtwoord opslaan", + "required_error": "{label} is vereist", + "min_error": "{label} moet groter zijn dan {min}", + "max_error": "{label} moet kleiner zijn dan {max}", + "invalid_characters_error": "{label} bevat ongeldige tekens", + "create_account_error": "Er is een fout opgetreden bij het aanmaken van uw account. Probeer het opnieuw.", + "create_address_error": "Er is echter een fout opgetreden bij het opslaan van het adres in uw adresboek.", + "create_account_requirements_error_heading": "Wachtwoord voldoet niet aan de vereisten", + "create_account_success": "Uw account is aangemaakt.", + "set_password_success": "Uw wachtwoord is opgeslagen.", + "create_account_text": "Maak een account aan om in de toekomst sneller af te rekenen", + "set_password_text": "Stel een wachtwoord in om in de toekomst sneller af te rekenen", + "account_created_text": "Er is een account voor u aangemaakt, maar u moet een wachtwoord instellen om te kunnen inloggen.", + "create_account_to_continue_text": "Heeft u geen account? Maak een account aan om door te gaan.", + "guest_could_login": "Het lijkt erop dat u al een account hebt. Log in met {email} om sneller af te rekenen.", + "guest_must_login": "Het lijkt erop dat u al een account hebt. Log in om door te gaan met {email} of gebruik een ander e-mailadres.", + "guest_temporary_disabled": "Afrekenen voor gasten is tijdelijk uitgeschakeld. Log in of maak een account aan om door te gaan.", + "customer_heading": "Klant", + "email_invalid_error": "E-mailadres moet geldig zijn", + "email_label": "E-mailadres", + "email_required_error": "E-mailadres is vereist", + "forgot_password_action": "Wachtwoord vergeten?", + "guest_customer_text": "Gastklant", + "guest_subscribe_to_newsletter_text": "Meld u aan voor onze nieuwsbrief.", + "guest_marketing_consent": "Ik wil graag updates en aanbiedingen ontvangen.", + "login_action": "Nu inloggen", + "login_text": "Heeft u al een account?", + "email_in_use_text": "Er is al een account voor {email}. Voer een ander e-mailadres in of log in.", + "unknown_email_in_use_text": "Er is al een account voor het opgegeven e-mailadres. Voer een ander e-mailadres in of log in.", + "guest_could_login_change_email": "Bent u niet {email}? E-mail wijzigen.", + "password_confirmation_error": "De wachtwoorden komen niet overeen", + "password_confirmation_label": "Wachtwoord bevestigen", + "password_confirmation_required_error": "Dit veld is vereist", + "password_label": "Wachtwoord", + "password_letter_required_error": "Wachtwoord moet een letter bevatten", + "password_minimum_character_label": "minimaal aantal tekens, hoofdlettergevoelig", + "password_number_required_error": "Wachtwoord moet een cijfer bevatten", + "password_over_maximum_length_error": "Wachtwoord is te lang", + "password_required_error": "Wachtwoord is vereist", + "password_under_minimum_length_error": "Wachtwoord is te kort", + "reset_password_before_login_error": "Inloggen is momenteel niet beschikbaar. U ontvangt binnen 5 minuten een e-mail met instructies om uw wachtwoord opnieuw in te stellen. Als u dit e-mailbericht niet ontvangt, kijk dan in uw map met ongewenste berichten of neem voor hulp contact met ons op.", + "returning_customer_text": "Terugkerende klant", + "sign_in_action": "Inloggen", + "sign_in_error": "Het e-mailadres of wachtwoord dat u hebt ingevoerd, is niet geldig.", + "sign_in_throttled_error": "Vanwege te veel inlogpogingen moet u 10 seconden wachten voordat u opnieuw probeert in te loggen.", + "sign_out_action": "Uitloggen", + "sign_out_error": "Er is een fout opgetreden bij het uitloggen. Probeer het opnieuw.", + "subscribe_to_newsletter_text": "Ja, ik wil graag updates ontvangen.", + "suggestion_text": "Het lijkt erop dat u al een account bij {provider} heeft. Ga verder met {providerFlow} om snel af te rekenen.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "We konden u geen inloglink sturen. Probeer het opnieuw.", + "error_not_found": "Het ingevoerde e-mailadres is niet gekoppeld aan een account. Probeer het met een ander e-mailadres.", + "sent_header": "Controleer uw inbox", + "sent_text": "We hebben een e-mail met een inloglink gestuurd naar {email}. Deze verloopt over {minutes} minuten. Als u de mail niet in uw inbox ziet, controleer dan uw map met ongewenste e-mail.", + "text": "Voer het e-mailadres in dat aan uw account is gekoppeld. We sturen u een inloglink.", + "header": "Voer uw e-mailadres in", + "header_with_email": "Bevestig uw e-mailadres", + "link": "Stuur me in plaats daarvan een inloglink.", + "use_another_email": "Gebruik een ander e-mailadres", + "send": "Verzenden", + "error_temporary_disabled": "Inloglinks zijn tijdelijk niet beschikbaar. Log in door uw wachtwoord in te voeren.", + "resend_link": "Heeft u de e-mail niet ontvangen? Verstuur de link opnieuw", + "use_password_link": " of log in met uw wachtwoord." + }, + "embedded_checkout": { + "unsupported_error": "De volgende betaalmethoden worden niet ondersteund door Embedded Checkout: {methods}. Neem voor hulp contact met ons op." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Later betalen", + "affirm_body_text": "U wordt omgeleid naar Affirm om uw aankoop veilig te voltooien. Als u enkele basisgegevens invult, krijgt u in real time een beslissing. Het controleren van uw geschiktheid heeft geen invloed op uw creditscore.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Afrekenen met Afterpay", + "amazon_continue_action": "Doorgaan met Amazon", + "amazonpay_continue_action": "Doorgaan met Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Doorgaan", + "bluesnap_v2_continue_action": "Doorgaan", + "bolt_create_account_label": "Mijn gegevens voor Bolt onthouden", + "bolt_create_account_disclaimer": "Door het bovenstaande aan te vinken, gaat u akkoord met het aanmaken van een Bolt-account volgens de voorwaarden en het privacybeleid.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Doorgaan met Visa Checkout", + "ccavenuemars_description_text": "Afrekenen met CCAvenue", + "chasepay_continue_action": "Doorgaan met Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Kaart bewerken", + "chasepay_logout": "Uitloggen bij Chase Pay", + "chasepay_fail_load": "Chase Pay kan niet worden geladen", + "checkoutcom_document_label_boleto": "CPF of CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "Nationale ID", + "checkoutcom_document_invalid_error_boleto": "CPF of CNPJ moet 11 tot 14 tekens lang zijn", + "checkoutcom_document_invalid_error_oxxo": "CURP mag maximaal 18 tekens lang zijn", + "checkoutcom_document_invalid_error_qpay": "Nationale ID mag maximaal 32 tekens lang zijn", + "checkoutcom_fawry_customer_mobile_invalid_error": "Mobiel nummer moet geldig zijn", + "checkoutcom_fawry_customer_mobile_label": "Mobiel nummer", + "checkoutcom_fawry_customer_email_invalid_error": "E-mailadres moet geldig zijn", + "checkoutcom_fawry_customer_email_label": "E-mailadres", + "checkoutcom_sepa_creditor_title": "Crediteur", + "checkoutcom_sepa_creditor_id": "Crediteur-ID: {creditorId}", + "checkoutcom_sepa_debtor_title": "Debiteur", + "checkoutcom_sepa_mandate_disclaimer": "Door dit machtigingsformulier te accepteren, geeft u {creditorName} toestemming om instructies naar uw bank te sturen om het bedrag vanaf uw rekening af te schrijven en machtigt u uw bank om het bedrag volgens die instructies van uw rekening af te schrijven. U heeft recht op stornering door uw bank volgens de voorwaarden van uw overeenkomst met uw bank. Een stornering moet worden aangevraagd binnen 8 weken vanaf de datum waarop uw rekening is gedebiteerd.", + "checkoutcom_sepa_payment_type": "Betaalwijze: eenmalig (niet-terugkerend)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Creditcard", + "credit_card_customer_code_label": "Klantcode", + "credit_card_cvv_help_text": "Bij VISA en Mastercard is de CVV een driecijferige code op de achterkant van de kaart. Bij American Express is dit de viercijferige code op de voorkant van de kaart. De CVV is een beveiligingsmaatregel om te controleren of u in het bezit bent van de kaart.", + "credit_card_cvv_invalid_error": "CVV moet geldig zijn", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "CVV is vereist", + "credit_card_expiration_invalid_error": "Vervaldatum moet een geldige datum in de toekomst zijn in de indeling MM/JJ", + "credit_card_expiration_label": "Vervaldatum", + "credit_card_expiration_date_label": "Vervaldatum", + "credit_card_expiration_required_error": "Vervaldatum is vereist", + "credit_card_expiration_placeholder_text": "MM/JJ", + "credit_card_name_label": "Naam op kaart", + "credit_card_name_required_error": "Volledige naam is vereist", + "credit_card_number_invalid_error": "Creditcardnummer moet geldig zijn", + "credit_card_number_label": "Creditcardnummer", + "credit_card_number_last_four": "Voer het kaartnummer in voor {cardType} eindigend op {lastFour}", + "credit_card_number_required_error": "Creditcardnummer is vereist", + "credit_card_number_mismatch_error": "Het ingevoerde kaartnummer komt niet overeen met de kaart die in uw account is opgeslagen", + "credit_debit_card_text": "Creditcard/betaalpas", + "digitalriver_dropin_error": "Er is een fout opgetreden bij het verwerken van uw betaling. Probeer het opnieuw of neem contact met ons op.", + "digitalriver_checkout_error": "Er is iets fout gegaan bij het afrekenen: controleer uw gegevens en probeer het opnieuw, of neem contact op met de klantenservice", + "digitalriver_checkout_error_title": "Fout tijdens het verwerken van het verzoek.", + "digitalriver_display_name_text": "Selecteer uw betaalmethode", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm kan uw betaling voor deze bestelling niet verwerken. Selecteer een andere betaalmethode.", + "klarna_continue_action": "Doorgaan met Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Doorgaan met Openpay", + "orbital_continue_action": "Bestelling plaatsen", + "orbital_description_text": "Betalen met uw ChasePay-account", + "payment_cancelled": "Betaling is geannuleerd", + "payment_error": "Er is een fout opgetreden bij het verwerken van uw betaling. Probeer het opnieuw.", + "payment_error_heading": "Betaling mislukt", + "payment_heading": "Betaling", + "payment_invalid_error_heading": "Betaling niet beschikbaar", + "payment_method_disabled_error": "De geselecteerde betaalmethode is niet meer geldig. Klik op OK om de meest actuele betaalmethoden te zien.", + "payment_method_error": "Reactie van betalingsprovider: {message}", + "payment_method_invalid_error": "Er is een probleem opgetreden bij het verwerken van uw betaling. Neem voor hulp contact met ons op of kies een andere betaalmethode.", + "payment_method_unavailable_error": "Deze betalingsprovider is tijdelijk niet beschikbaar. Probeer het later opnieuw.", + "payment_not_required_text": "Voor deze bestelling is geen betaling vereist.", + "paypal_continue_action": "Doorgaan met PayPal", + "paypal_credit_continue_action": "Doorgaan met PayPal Credit", + "paypal_credit_description_text": "Koop nu, betaal later", + "paypal_description_text": "Betalen met uw PayPal-account", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Later betalen", + "place_order_action": "Bestelling plaatsen", + "place_order_error": "Er is een fout opgetreden bij het plaatsen van uw bestelling. Neem contact met ons op.", + "place_order_error_heading": "Bestelling kon niet worden geplaatst", + "postal_code_label": "Postcode", + "ideal_bic_required": "U moet een uitgever selecteren om de bestelling te plaatsen", + "instrument_text": "Opgeslagen creditcards", + "instrument_add_card_action": "Een andere kaart gebruiken", + "instrument_default_ending_in_text": "Kaart eindigend op {endingIn}", + "instrument_ending_in_text": "{cardTitle} eindigend op {endingIn}", + "instrument_expired_text": "Verlopen op {expiryDate}", + "instrument_expires_text": "Verloopt op {expiryDate}", + "instrument_manage_button": "Beheren", + "instrument_manage_modal_confirmation_action": "Ja, verwijderen", + "instrument_manage_modal_confirmation_label": "Weet u zeker dat u deze opgeslagen betaalmethode wilt verwijderen?", + "instrument_manage_modal_title_text": "Opgeslagen betaalmethoden beheren", + "instrument_manage_modal_empty_text": "U heeft geen opgeslagen betaalmethoden.", + "instrument_manage_table_header_ending_in_text": "Eindigend op", + "instrument_manage_table_header_expiry_date_text": "Vervaldatum", + "instrument_manage_table_header_payment_method_text": "Betaalmethode", + "instrument_manage_delete_server_error": "Er is een fout opgetreden bij het verwijderen van die opgeslagen betaalmethode. Probeer het opnieuw.", + "instrument_manage_delete_auth_error": "Er is een probleem opgetreden bij het autoriseren van uw verzoek. Probeer opnieuw in te loggen", + "instrument_manage_delete_client_error": "Er is een fout opgetreden bij het verwijderen van de opgeslagen betaalmethode: betaalmethode bestaat niet meer of kan niet worden verwijderd.", + "instrument_save_payment_method_label": "Bewaar deze kaart voor toekomstige transacties", + "instrument_save_as_default_payment_method_label": "Gebruik deze kaart als de standaardbetaalmethode voor toekomstige transacties", + "account_instrument_add_action": "Een ander account gebruiken", + "account_instrument_save_payment_method_label": "Bewaar dit account voor toekomstige transacties", + "account_instrument_save_as_default_payment_method_label": "Gebruik dit account als de standaardbetaalmethode voor toekomstige transacties", + "account_instrument_text": "Opgeslagen accounts", + "account_instrument_new_shipping_address": "We hebben gemerkt dat dit een nieuw verzendadres is.

Om veiligheidsredenen moet u uw PayPal-account opnieuw koppelen als u voor de eerste keer naar een adres verzendt of als het verzendadres onlangs gewijzigd is.

", + "instrument_trusted_shipping_address_text": "Deze extra beveiligingsstap wordt op uw kaart toegepast als u voor het eerst naar een adres verzendt of als het verzendadres onlangs gewijzigd is.", + "instrument_trusted_shipping_address_title_text": "Voer uw kaartnummer opnieuw in om deze transactie te autoriseren.", + "quadpay_continue_action": "Doorgaan met Zip", + "quadpay_display_name_text": "Betaal in 4 termijnen (Quadpay)", + "ppsdk_continue_action": "Doorgaan met {methodName}", + "select_your_bank": "Selecteer uw bank", + "sepa_account_number": "Rekeningnummer (IBAN)", + "sepa_account_number_required": "U moet uw rekeningnummer (IBAN) invullen", + "sepa_bic": "BIC", + "sepa_bic_length": "De BIC moet 8 of 11 tekens lang zijn", + "sepa_mandate_required": "U moet het machtigingsformulier accepteren", + "sezzle_display_name_text": "Betaal later. 0% rente.", + "stripe_sepa_display_name_text": "Sepa-incasso.", + "stripe_sepa_mandate_disclaimer": "Door uw IBAN op te geven en deze betaling te bevestigen, geeft u (A) {storeUrl} en onze betalingsdienstaanbieder Stripe toestemming om instructies naar uw bank te sturen om het bedrag vanaf uw rekening af te schrijven en (B) machtigt u uw bank om het bedrag volgens die instructies van uw rekening af te schrijven. U heeft recht op stornering door uw bank volgens de voorwaarden van uw overeenkomst met uw bank. Een stornering moet worden aangevraagd binnen acht weken vanaf de datum waarop uw rekening is gedebiteerd.", + "tax_provider_unavailable": "Omzetbelasting kon niet worden berekend. Probeer het opnieuw. Neem contact op met ons ondersteuningsteam om het afrekenen te voltooien in geval dit niet lukt.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Ga verder met Click to pay", + "zip_continue_action": "Doorgaan met Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Nu krijgen, later betalen", + "errors": { + "additional_action_required": "Ga verder met aanvullende acties.", + "authorization_expired": "De autorisatie voor deze transactie is verlopen.", + "authorization_revoked": "De autorisatie voor deze transactie is ingetrokken.", + "call_issuer": "Er is een probleem opgetreden bij het verwerken van uw kaart. Neem contact op met uw kaartuitgever.", + "captured_transaction": "De betaling voor deze bestelling is al gedaan.", + "card_declined": "Betaling is geweigerd. Probeer een andere kaart.", + "card_error": "Uw kaartgegevens kunnen niet worden geverifieerd. Controleer uw gegevens en probeer het opnieuw.", + "card_replaced": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "connection_error": "Er is een probleem opgetreden bij het verwerken van uw transactie. Probeer het later opnieuw.", + "duplicate_transaction": "Dit is een dubbele transactie. Neem contact met ons op om uw bestelling te bevestigen. Probeer niet nogmaals te betalen.", + "expired_card": "Uw kaart is verlopen. Probeer het opnieuw met een geldige kaart.", + "gateway_error": "Er is iets misgegaan op de server. Probeer het later opnieuw.", + "general_error": "Fout bij het verwerken van betalingsverzoek.", + "hosted_form_error": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "incorrect_address": "Uw factuuradres kan niet worden geverifieerd. Controleer uw factuuradresgegevens en probeer het opnieuw.", + "incorrect_amount": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "incorrect_cvc": "Uw kaartgegevens kunnen niet worden geverifieerd. Controleer uw gegevens en probeer het opnieuw.", + "incorrect_number": "Uw kaartgegevens kunnen niet worden geverifieerd. Controleer uw gegevens en probeer het opnieuw.", + "incorrect_zip": "Uw factuuradres kan niet worden geverifieerd. Controleer uw factuuradresgegevens en probeer het opnieuw.", + "insufficient_funds": "Betaling is geweigerd. Neem contact op met uw bank.", + "invalid_address": "Uw factuuradres kan niet worden geverifieerd. Controleer uw factuuradresgegevens en probeer het opnieuw.", + "invalid_amount": "Er is een fout opgetreden bij het verwerken van uw betaling. Probeer het opnieuw of neem contact met ons op.", + "invalid_authorization_code": "Er is een fout opgetreden bij het verwerken van uw betaling. Probeer het opnieuw of neem contact met ons op.", + "invalid_create_instrument_request": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "invalid_cvc": "Uw kaartgegevens kunnen niet worden geverifieerd. Controleer uw gegevens en probeer het opnieuw.", + "invalid_email_address": "Kan de betaling niet verwerken omdat er een ongeldig e-mailadres is opgegeven bij de transactie.", + "invalid_expiry_date": "Uw kaartgegevens kunnen niet worden geverifieerd. Controleer uw gegevens en probeer het opnieuw.", + "invalid_expiry_month": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "invalid_expiry_year": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "invalid_gateway": "Gateway is ongeldig.", + "invalid_gateway_options": "Gateway-opties zijn ongeldig.", + "invalid_instrument": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "invalid_issuer": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "invalid_number": "Uw kaartgegevens kunnen niet worden geverifieerd. Controleer uw gegevens en probeer het opnieuw.", + "invalid_payment_request": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "invalid_request_error": "Er is een probleem opgetreden bij het verwerken van uw transactie. Neem contact met ons op of probeer het later opnieuw.", + "invalid_user_authentication": "Er is een fout opgetreden bij het verwerken van uw betaling. Neem contact met ons op.", + "invalid_zip": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "journal_error": "Er is iets misgegaan op de server. Probeer het later opnieuw.", + "lost_or_stolen_card": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "missing_test_mode": "Kan het verzoek niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "not_found": "Er is een probleem opgetreden bij het verwerken van uw transactie. Probeer het later opnieuw.", + "payment_config_error": "Er is iets misgegaan op de server. Probeer het later opnieuw.", + "payment_config_not_found": "Er is iets misgegaan op de server. Probeer het later opnieuw.", + "pending_review": "Uw transactie is geautoriseerd, maar wordt vastgehouden ter beoordeling door de verkoper.", + "pickup_card": "Uw kaart kan niet worden gebruikt voor deze betaling. Neem contact op met uw kaartuitgever of gebruik een andere kaart.", + "processing_error": "Er is een probleem opgetreden bij het verwerken van uw transactie. Probeer het later opnieuw.", + "provider_configuration_error": "De betalingsprovider van de winkelier is niet correct geconfigureerd.", + "refund_timelimit_expired": "De tijdslimiet om deze transactie terug te betalen is verlopen.", + "refunded_transaction": "Deze transactie is al terugbetaald.", + "request_timeout": "Kan uw betaling niet verwerken vanwege een time-out. Probeer het opnieuw.", + "required_field": "Uw betaling kan niet worden geverifieerd. Controleer uw kaartgegevens en probeer het opnieuw.", + "server_error": "Er is een fout opgetreden bij het verwerken van uw betaling en uw bestelling kon niet worden voltooid. Probeer het opnieuw.", + "store_instrument_failed": "Kan het verzoek niet verwerken. Probeer het opnieuw.", + "stored_payment_instrument_not_found": "Die opgeslagen betaalmethode kan niet gevonden worden. Probeer een andere betaalmethode.", + "three_d_secure_declined": "Er is een probleem opgetreden met uw betaling, controleer uw betalingsgegevens of neem contact op met uw creditcarduitgever.", + "three_d_secure_failed": "De betaling is mislukt. Probeer het opnieuw of gebruik een andere betaalmethode.", + "three_d_secure_required": "Verdere authenticatie is vereist om uw betaling te verwerken. Neem contact met ons op.", + "token_error": "Er is een probleem opgetreden bij het verwerken van uw transactie. Probeer het later opnieuw.", + "transaction_declined": "Uw betaling is geweigerd. Probeer het opnieuw.", + "transaction_rejected": "Betaling is geweigerd. Probeer het opnieuw.", + "unauthorized": "Er is een probleem opgetreden bij het verwerken van uw transactie. Probeer het later opnieuw.", + "unsupported_currency": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "unsupported_instrument": "Uw kaartgegevens kunnen niet worden geverifieerd. Controleer uw gegevens en probeer het opnieuw.", + "unsupported_request": "Kan de betaling niet verwerken omdat er ongeldige gegevens zijn opgegeven bij de transactie.", + "user_authorization_error": "Er is een fout opgetreden bij het verwerken van uw betaling. Neem contact met ons op.", + "vaulting_service_unavailable": "Service voor beveiligde opslag is momenteel niet beschikbaar.", + "voided_transaction": "Uw betaling kan niet worden verwerkt, omdat de transactie al is geannuleerd. Probeer het opnieuw of neem contact met ons op." + } + }, + "redeemable": { + "applied_text": "Toegepast", + "apply_action": "Toepassen", + "apply_store_credit_after_action": "winkeltegoed om te bestellen", + "apply_store_credit_before_action": "Toepassen", + "code_invalid_error": "De cadeaubon of couponcode is ongeldig", + "code_label": "Cadeaubon of couponcode", + "code_required_error": "Voer een cadeaubon of couponcode in", + "coupon_location_error": "Uw verzendadres voldoet niet aan de locatievereisten voor de couponcode die u heeft ingevoerd.", + "coupon_min_order_total": "Uw bestelling voldoet niet aan het minimale totaalbedrag voor deze couponcode.", + "coupon_text": "Coupon", + "gift_certificate_remaining_text": "resterend", + "gift_certificate_text": "Cadeaubon", + "remove_action": "Verwijderen", + "store_credit_available_text": "Op uw account staat momenteel {storeCredit} totaal winkeltegoed beschikbaar", + "toggle_action": "Coupon/cadeaubon" + }, + "remote": { + "browser_unsupported": "Voor de geselecteerde betaalmethode is een andere webbrowser vereist. Kies een andere betaalmethode.", + "connection_error": "Verbinding met externe betaalmethode geweigerd, probeer het later opnieuw.", + "continue_with_text": "Of ga door met", + "payment_method_error": "Er is een fout opgetreden bij het ophalen van uw externe betaalmethode. Probeer het opnieuw.", + "select_different_card_action": "Selecteer een andere kaart", + "session_error": "Uw externe sessie is verlopen. Log opnieuw in.", + "shipping_address_error": "Er is een fout opgetreden bij het ophalen van uw externe verzendadres. Probeer het opnieuw.", + "sign_in_action": "Log in bij {providerName}", + "sign_out_action": "Log uit bij {providerName}", + "sign_out_after_action": "om andere betaalmethoden te bekijken", + "sign_in_required_error": "Extern aanmelden vereist voor betaling" + }, + "shipping": { + "cart_change_error": "Er is een update van uw winkelmandje gedetecteerd en de voor u beschikbare verzendkosten zijn bijgewerkt. Selecteer opnieuw een verzendmethode om door te gaan.", + "enter_shipping_address_text": "Voer een verzendadres in om verzendoffertes te zien", + "order_comment_label": "Opmerkingen bij bestelling", + "assign_item_error": "Er is een fout opgetreden bij het toewijzen van het artikel aan het adres. Probeer het opnieuw", + "assign_item_invalid_address_error_heading": "Ongeldig adres", + "assign_item_invalid_address_error": "Het geselecteerde adres is niet geldig. Ga naar uw accountpagina en werk het bij.", + "unassign_item_error": "Er is een fout opgetreden bij het ongedaan maken van het toewijzen van het artikel aan het adres.", + "save_shipping_address_error": "Er is een fout opgetreden bij het opslaan van het verzendadres in uw prijsopgave. Probeer het opnieuw.", + "save_shipping_option_error": "Er is een fout opgetreden bij het opslaan van de verzendofferte bij uw bestelling. Probeer het opnieuw.", + "select_shipping_address_text": "Selecteer een verzendadres om verzendoffertes te zien", + "shipping_address_heading": "Verzendadres", + "multishipping_address_heading": "Kies waar u elk artikel naartoe wilt verzenden", + "multishipping_address_heading_guest": "Log eerst in", + "multishipping_guest_intro": "Om uw artikelen naar meerdere adressen te verzenden, moet u:", + "multishipping_guest_sign_in": "inloggen in uw account", + "multishipping_guest_create": "of een account aanmaken voordat u verder gaat.", + "ship_to_multi": "Verzenden naar meerdere adressen", + "ship_to_single": "Verzenden naar een enkel adres", + "shipping_heading": "Verzending", + "shipping_method_label": "Verzendmethode", + "shipping_option_expired_error": "De aan u opgegeven verzendkosten zijn niet langer geldig. Klik op OK om de meest actuele verzendkosten te zien.", + "shipping_option_expired_heading": "Uw verzendkosten zijn bijgewerkt", + "view_shipping_options_action": "Andere opties weergeven" + }, + "social": { + "share_action": "Delen", + "share_heading": "Vertel uw vrienden over uw aankoop!", + "tweet_action": "Tweeten" + }, + "spam_protection": { + "verify_action": "Klik hier om te bevestigen dat u een mens bent voordat u verder gaat." + }, + "privacy_policy": { + "required_error": "U dient akkoord te gaan met het privacybeleid.", + "label": "Ja, ik ga akkoord met het privacybeleid.", + "heading": "Privacybeleid" + }, + "terms_and_conditions": { + "agreement_required_error": "U dienst akkoord te gaan met de algemene voorwaarden", + "agreement_text": "Ja, ik ga akkoord met bovenstaande algemene voorwaarden.", + "agreement_with_link_text": "Ja, ik ga akkoord met de algemene voorwaarden.", + "terms_and_conditions_heading": "Algemene voorwaarden" + }, + "order_confirmation": { + "order_number_text": "Uw bestelnummer is {orderNumber}", + "order_pending_review_text": "Uw bestelling is naar ons verzonden, maar moet nog betaald worden. Zodra we de betaling voor uw bestelling hebben ontvangen, wordt deze voltooid. Als u al betalingsgegevens heeft opgegeven, verwerken we uw bestelling handmatig en sturen we u een e-mail wanneer deze is voltooid.", + "order_pending_status_text": "We hebben uw bestelling ontvangen en verwerken uw betaling. Zodra de betaling is geverifieerd, wordt uw bestelling voltooid. We sturen u een e-mail als die voltooid is. Dit proces kan enkele minuten duren, afhankelijk van de verwerkingstijden van de door u gekozen methode. Als u vragen heeft over uw aankoop, kunt u ons een e-mail sturen op {supportEmail}.", + "order_incomplete_status_text": "We hebben uw bestelling en betaling ontvangen. Uw bestelling wordt nu verwerkt door ons systeem. De verwerking kan enkele minuten duren. Als u vragen heeft over uw aankoop, kunt u ons een e-mail sturen op {supportEmail}.", + "order_with_downloadable_digital_items_text": "U kunt uw digitale aankopen downloaden door op de links op deze pagina te klikken of door op elk gewenst moment in te loggen op uw account. Er staat ook een downloadlink in uw bevestigingsmail, die u binnenkort ontvangt.", + "order_with_support_number_text": "Er wordt een e-mail verzonden met informatie over uw aankoop. Als u vragen heeft over uw aankoop, kunt u ons een e-mail sturen op {supportEmail} of ons bellen op {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Zodra we uw betaling hebben ontvangen, sturen we u een bevestigingsmail met een link waarmee u uw digitale aankopen kunt downloaden.", + "order_without_support_number_text": "Er wordt een e-mail verzonden met informatie over uw aankoop. Als u vragen heeft over uw aankoop, kunt u ons een e-mail sturen op {supportEmail}.", + "thank_you_customer_heading": "Bedankt {name}!", + "thank_you_heading": "Bedankt!", + "continue_shopping": "Doorgaan met winkelen »", + "order_status_update_facebook_messenger_heading": "Ontvang directe updates over uw bestelling in Messenger", + "mandate_link_text": "Machtiging {provider}", + "boleto_link_text": "Boleto Bancário-ticket", + "oxxo_link_text": "OXXO-ticket", + "sepa_link_text": "Machtiging voor SEPA-incasso" + } + } +} diff --git a/assets/json/no.json b/assets/json/no.json new file mode 100644 index 000000000..3481d8d82 --- /dev/null +++ b/assets/json/no.json @@ -0,0 +1,487 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Adresse", + "address_line_1_required_error": "Adresse er påkrevd", + "address_line_2_label": "Leilighet/Bygg", + "address_line_2_required_error": "Leilighet/bygg er påkrevd", + "address_not_recognized_heading": "Vi gjenkjente ikke adressen din", + "consignment_address_updated_text": "Elementet ble tildelt den nye adressen.", + "city_label": "By", + "city_required_error": "By er påkrevd", + "company_name_label": "Firmanavn", + "company_name_required_error": "Firma er påkrevd", + "confirm_address_action": "Fortsett med gjeldende adresse", + "confirm_address_text": "Vi fant ingen treff for adressen du skrev inn. Vennligst bekreft adressen.", + "country_label": "Land", + "country_required_error": "Land er påkrevd", + "custom_required_error": "{label} er påkrevd", + "custom_min_error": "{label} må være større enn {min}", + "custom_max_error": "{label} må være mindre enn {max}", + "invalid_characters_error": "{label} inneholder ugyldige tegn", + "custom_valid_error": "{label} er ikke gyldig", + "edit_address_action": "Rediger adresse", + "enter_address_action": "Skriv inn en ny adresse", + "add_address_heading": "Legg til adresse", + "save_address_action": "Lagre adresse", + "first_name_label": "Fornavn", + "first_name_required_error": "Fornavn er påkrevd", + "last_name_label": "Etternavn", + "last_name_required_error": "Etternavn er påkrevd", + "phone_number_label": "Telefonnummer", + "phone_number_required_error": "Telefonnummer er påkrevd", + "postal_code_label": "Postnummer", + "postal_code_required_error": "Postnummer er påkrevd", + "save_in_addressbook": "Lagre denne adressen i adresseboken min.", + "select_country_action": "Velg et land", + "select_state_action": "Velg en delstat", + "state_label": "Delstat/provins", + "state_required_error": "Delstat/provins er påkrevd", + "select": "Velg", + "select_all": "Alle", + "select_none": "Ingen" + }, + "billing": { + "billing_address_heading": "Fakturaadresse", + "billing_heading": "Fakturering", + "save_billing_address_error": "Det oppstod en feil under lagring av faktureringsadressen i pristilbudet. Prøv igjen.", + "billing_address_amazon": "Samme som faktureringsadressen angitt av deg i Amazon-kontoen din.", + "billing_address_amazonpay": "Administrert av Amazon Pay", + "use_shipping_address_label": "Faktureringsadressen min er den samme som leveringsadressen min." + }, + "cart": { + "billed_amount_text": "*Du vil bli belastet og fakturert {total} ({code}) for denne bestillingen.", + "based_on_currency_text": "Basert på {total} {code}", + "cart_heading": "Bestillingssammendrag", + "digital_item_text": "Digitalt element", + "discount_text": "Rabatt", + "downloads_action": "Gå til nedlastinger", + "edit_cart_action": "Rediger handlekurv", + "estimated_total_text": "Estimert totalsum", + "free_text": "Kostnadsfrie", + "gift_certificate_text": "Gavekort", + "handling_text": "Håndtering", + "item_count_text": "{count, plural, one{1 element} other{# elementer} }", + "print_action": "Skriv ut", + "remaining_text": "gjenstående", + "remove_action": "Fjern", + "see_all_action": "Se alt", + "see_less_action": "Se mindre", + "shipping_text": "Frakt", + "gift_wrapping_text": "Gaveinnpakning", + "show_details_action": "Vis detaljer", + "store_credit_text": "Butikkreditt", + "subtotal_text": "Delsum", + "taxes_text": "Skatter", + "total_text": "Totalbeløp", + "empty_cart_message": "Handlekurven din er tom, du blir omdirigert. Klikk her hvis nettleseren din ikke omdirigerer deg." + }, + "common": { + "cancel_action": "Avbryt", + "close_action": "Lukk", + "continue_action": "Fortsett", + "edit_action": "Rediger", + "delete_action": "Slett", + "error_heading": "Noe gikk galt", + "leave_warning": "Er du sikker på at du vil dra? Det kan hende at data du har lagt inn ikke lagres.", + "loading_text": "Laster inn", + "ok_action": "Ok", + "error_code": "Feilkode:", + "request_id": "Forespørsels-ID:", + "optional_text": "(Valgfri)", + "unavailable_error": "Kassen er midlertidig utilgjengelig. Prøv igjen senere.", + "unavailable_heading": "Kassen er midlertidig utilgjengelig", + "unstable_network_error": "Det ser ut til at serveren bruker for lang tid på å svare, dette kan skyldes enten dårlig tilkobling eller en feil med serverne våre. Prøv igjen om en stund.", + "order_loading_error": "Det oppsto en feil ved innlasting av bestillingen din. Prøv igjen.", + "order_fatal_error_heading": "Det oppsto en feil ved plassering av bestillingen din", + "order_fatal_error_extra": "Velg en annen betalingsmåte eller kontakt oss for mer hjelp.", + "go_back": "Gå tilbake", + "show_more": "Vis mer" + }, + "customer": { + "checkout_as_guest_text": "Betaler du som gjest? Du vil kunne lagre opplysningene dine for å opprette en konto hos oss senere.", + "continue_as_guest_action": "Fortsett som gjest", + "create_account_action": "Opprett konto", + "continue": "Fortsett", + "set_password_action": "Lagre passord", + "required_error": "{label} er påkrevd", + "min_error": "{label} må være større enn {min}", + "max_error": "{label} må være mindre enn {max}", + "invalid_characters_error": "{label} inneholder ugyldige tegn", + "create_account_error": "Det oppsto en feil under opprettelsen av kontoen din. Prøv igjen.", + "create_address_error": "Det oppstod imidlertid en feil under lagring av adressen i adresseboken din.", + "create_account_requirements_error_heading": "Passordet oppfyller ikke kravene", + "create_account_success": "Kontoen din er opprettet.", + "set_password_success": "Passordet ditt er lagret.", + "create_account_text": "Opprett en konto for raskere betaling i fremtiden", + "set_password_text": "Velg et passord for raskere betaling i fremtiden", + "account_created_text": "En konto er opprettet for deg, men du må velge et passord for å logge på.", + "create_account_to_continue_text": "Har du ikke en konto? Opprett en konto for å fortsette.", + "guest_could_login": "Ser ut som du har en konto. Logg på med {email} for raskere betaling.", + "guest_must_login": "Ser ut som du har en konto. Logg på for å fortsette med {email}, eller bruk en annen e-postadresse.", + "guest_temporary_disabled": "Betaling som gjest er midlertidig deaktivert. Logg på eller opprett en konto for å fortsette.", + "customer_heading": "Kunde", + "email_invalid_error": "E-postadressen må være gyldig", + "email_label": "E-postadresse", + "email_required_error": "E-postadresse er påkrevd", + "forgot_password_action": "Har du glemt passordet?", + "guest_customer_text": "Gjestekunde", + "guest_subscribe_to_newsletter_text": "Abonner på nyhetsbrevet vårt.", + "guest_marketing_consent": "Jeg vil gjerne motta oppdateringer og tilbud.", + "login_action": "Logg på nå", + "login_text": "Har du allerede en konto?", + "email_in_use_text": "Det finnes allerede en konto for {email}. Skriv inn en annen e-postadresse eller logg på.", + "unknown_email_in_use_text": "Det finnes allerede en konto for den oppgitte e-postadressen. Skriv inn en annen e-postadresse eller logg på.", + "guest_could_login_change_email": "Ikke {email}? Bytt e-postadresse.", + "password_confirmation_error": "Passordene samsvarer ikke", + "password_confirmation_label": "Bekreft passord", + "password_confirmation_required_error": "dette feltet er obligatorisk", + "password_label": "Passord", + "password_letter_required_error": "Passord må inneholde en bokstav", + "password_minimum_character_label": "minimum antall tegn, skiller mellom store og små bokstaver", + "password_number_required_error": "Passordet må inneholde et tall", + "password_over_maximum_length_error": "Passordet er for langt", + "password_required_error": "Passord er påkrevd", + "password_under_minimum_length_error": "Passordet er for kort", + "reset_password_before_login_error": "Pålogging er for øyeblikket utilgjengelig. Du vil motta en e-post i løpet av de neste fem minuttene med instruksjoner for tilbakestilling av passordet ditt. Hvis du ikke mottar denne e-posten, bør du sjekke mappen med med søppelpost eller kontakt oss for ytterligere hjelp.", + "returning_customer_text": "Returnerende kunde", + "sign_in_action": "Registrer deg", + "sign_in_error": "E-postadressen eller passordet du skrev inn er ikke gyldig.", + "sign_in_throttled_error": "På grunn av for mange påloggingsforsøk, må du vent 10 sekunder før du prøver å logge på igjen.", + "sign_out_action": "Logg ut", + "sign_out_error": "Det oppsto en feil da vi skulle logge deg ut. Prøv igjen.", + "subscribe_to_newsletter_text": "Ja, jeg vil gjerne motta oppdateringer.", + "suggestion_text": "Det ser ut til at du har en konto hos {provider}. For rask betaling kan du fortsette med {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "Vi kunne ikke sende deg en påloggingslenke. Prøv igjen.", + "error_not_found": "Den angitte e-posten er ikke knyttet til en konto. Prøv med en annen e-post.", + "sent_header": "Sjekk innboksen din", + "sent_text": "Vi har sendt en e-post til {email} som inneholder en påloggingslenke. Denne utløper om {minutes} minutter. Hvis du ikke ser den i innboksen, sjekk søppelmappen.", + "text": "Skriv inn e-postadressen knyttet til kontoen din. Vi sender deg en påloggingslenke.", + "header": "Oppgi e-postadressen din", + "header_with_email": "Bekreft e-postadressen din", + "link": "Send meg en påloggingslenke i stedet.", + "use_another_email": "Bruk en annen e-post", + "send": "Send", + "error_temporary_disabled": "Funksjonaliteten til påloggingslenken er midlertidig utilgjengelig. Logg på ved å skrive inn passordet ditt.", + "resend_link": "Fikk du ikke e-posten? Send lenken på nytt", + "use_password_link": " eller logg på med passordet ditt i stedet." + }, + "embedded_checkout": { + "unsupported_error": "Følgende betalingsmåter støttes ikke av Embedded Checkout: {methods}. Ta kontakt med oss for å få hjelp." + }, + "payment": { + "adyen_credit_debit_card_text": "Kreditt-/debetkort", + "affirm_name_text": "Bekreft", + "affirm_display_name_text": "Betal over tid", + "affirm_body_text": "Du viderekobles til Affirm for å fullføre kjøpet på en sikker måte. Bare fyll ut noen felt med grunnleggende informasjon og få en avgjørelse i sanntid. En sjekk om du er kvalifisert påvirker ikke kredittscoren din.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Betaling med Afterpay", + "amazon_continue_action": "Fortsett med Amazon", + "amazonpay_continue_action": "Fortsett med Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Fortsett", + "bluesnap_v2_continue_action": "Fortsett", + "bolt_benefit_1": "Handle hundrevis av merker med passordløs pålogging", + "bolt_benefit_2": "Benytt deg av lagret betalings- og leveranseinformasjon i kassen", + "bolt_benefit_3": "Dra nytte av PCI-kompatibel kontosikkerhet", + "bolt_checkbox_agreement": "Lagre informasjonen min, opprett en Bolt-konto og godta Bolts vilkår for bruk og personvernerklæring.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Fortsett med Visa Checkout", + "ccavenuemars_description_text": "Betaling med CCAvenue", + "chasepay_continue_action": "Fortsett med Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Rediger kort", + "chasepay_logout": "Logg av Chase Pay", + "chasepay_fail_load": "Chase Pay kunne ikke lastes inn", + "checkoutcom_document_label_boleto": "CPF eller CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "Nasjonal ID", + "checkoutcom_document_invalid_error_boleto": "CPF eller CNPJ må være mellom 11 og 14 tegn", + "checkoutcom_document_invalid_error_oxxo": "CURP må være på maksimalt 18 tegn", + "checkoutcom_document_invalid_error_qpay": "Nasjonal ID må være på maksimalt 32 tegn", + "checkoutcom_fawry_customer_mobile_invalid_error": "Mobilnummer må være gyldig", + "checkoutcom_fawry_customer_mobile_label": "Mobilnummer", + "checkoutcom_fawry_customer_email_invalid_error": "E-postadressen må være gyldig", + "checkoutcom_fawry_customer_email_label": "E-post", + "checkoutcom_sepa_creditor_title": "Kreditor", + "checkoutcom_sepa_creditor_id": "Kreditor-ID: {creditorId}", + "checkoutcom_sepa_debtor_title": "Debitor", + "checkoutcom_sepa_mandate_disclaimer": "Ved å godta dette fullmakts skjemaet gir du {creditorName} fullmakt til å sende instruksjoner til banken din om å belaste kontoen din, og banken din til å belaste kontoen din i samsvar med disse instruksjonene. Du har rett til refusjon fra banken din i henhold til vilkårene i avtalen din med banken din. En tilbakebetaling må kreves innen 8 uker fra datoen da kontoen din ble debitert.", + "checkoutcom_sepa_payment_type": "Betalingstype: engangsbetaling (ikke-gjentakende)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Kredittkort", + "credit_card_customer_code_label": "Kundenummer", + "credit_card_cvv_help_text": "For VISA og Mastercard er CVV en tresifret kode som er trykt på baksiden. For American Express er det den firesifrede koden som er trykt på forsiden. CVV er et sikkerhetstiltak for å sikre at du er i besittelse av kortet.", + "credit_card_cvv_invalid_error": "CVV må være gyldig", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "CVV er påkrevd", + "credit_card_expiration_invalid_error": "Utløpsdatoen må være en gyldig fremtidig dato i formatet MM/ÅÅ", + "credit_card_expiration_label": "Utløp", + "credit_card_expiration_date_label": "Utløpsdato", + "credit_card_expiration_required_error": "Utløpsdato er påkrevd", + "credit_card_expiration_placeholder_text": "MM/ÅÅ", + "credit_card_name_label": "Navn på kort", + "credit_card_name_required_error": "Fullt navn er påkrevd", + "credit_card_number_invalid_error": "Kredittkortnummeret må være gyldig", + "credit_card_number_label": "Kredittkortnummer", + "credit_card_number_last_four": "Skriv inn kortnummeret for {cardType} som slutter på {lastFour}", + "credit_card_number_required_error": "Kredittkortnummer er påkrevd", + "credit_card_number_mismatch_error": "Kortnummeret som er angitt, samsvarer ikke med kortet som er lagret på kontoen din", + "digitalriver_dropin_error": "Det oppsto en feil under behandling av betalingen. Vennligst prøv igjen eller kontakt oss.", + "digitalriver_checkout_error": "Det oppsto et problem i kassen. Sjekk detaljene dine og prøv igjen, eller kontakt kundeservice", + "digitalriver_checkout_error_title": "Feil under behandling av forespørsel.", + "digitalriver_display_name_text": "Velg betalingsmåten din", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm kan ikke behandle betalingen din for denne bestillingen. Velg en annen betalingsmetode.", + "klarna_continue_action": "Fortsett med Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Fortsett med {methodName}", + "opy_widget_slogan": "Kjøp nå. Betal smartere.", + "opy_widget_info": "Du vil bli omdirigert til nettstedet til {methodName} for å fullføre bestillingen når du klikker på «Fortsett med {methodName}»", + "orbital_continue_action": "Legg inn bestilling", + "orbital_description_text": "Betal med ChasePay-kontoen din", + "payment_cancelled": "Betalingen ble kansellert", + "payment_error": "Det oppsto en feil under behandling av betalingen din. Prøv igjen.", + "payment_error_heading": "Betalingen feilet", + "payment_heading": "Betaling", + "payment_invalid_error_heading": "Betaling ikke tilgjengelig", + "payment_method_disabled_error": "Den valgte betalingsmåten er ikke lenger gyldig. Klikk på OK for å se de mest oppdaterte betalingsmåtene.", + "payment_method_error": "Svar fra betalingsleverandør: {message}", + "payment_method_invalid_error": "Det har oppstått et problem med å behandle betalingen din. Kontakt oss for å få hjelp, eller velg en annen betalingsmåte.", + "payment_method_unavailable_error": "Denne betalingsleverandøren er midlertidig utilgjengelig. Prøv igjen senere.", + "payment_not_required_text": "Betaling kreves ikke for denne bestillingen.", + "paypal_continue_action": "Fortsett med PayPal", + "braintreevenmo_continue_action": "Fortsett med Venmo", + "paypal_credit_continue_action": "Fortsett med PayPal Credit", + "paypal_credit_description_text": "Kjøp nå, betal over tid", + "paypal_description_text": "Betal med PayPal-kontoen din", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Betal senere", + "place_order_action": "Legg inn bestilling", + "place_order_error": "Det oppsto en feil ved plassering av bestillingen din. Vennligst kontakt oss.", + "place_order_error_heading": "Kunne ikke legge inn bestilling", + "postal_code_label": "Postnummer", + "ideal_bic_required": "Du må velge en utsteder for å legge inn bestillingen", + "instrument_text": "Lagrede kredittkort", + "instrument_add_card_action": "Bruk et annet kort", + "instrument_default_ending_in_text": "Kort som slutter på {endingIn}", + "instrument_ending_in_text": "{cardTitle} som slutter på {endingIn}", + "instrument_expired_text": "Utløpt {expiryDate}", + "instrument_expires_text": "Utløper {expiryDate}", + "instrument_manage_button": "Administrer", + "instrument_manage_modal_confirmation_action": "Ja, slett", + "instrument_manage_modal_confirmation_label": "Er du sikker på at du vil slette denne lagrede betalingsmåten?", + "instrument_manage_modal_title_text": "Administrer lagrede betalingsmåter", + "instrument_manage_modal_empty_text": "Du har ingen lagrede betalingsmåter.", + "instrument_manage_table_header_ending_in_text": "Slutter på", + "instrument_manage_table_header_expiry_date_text": "Utløpsdato", + "instrument_manage_table_header_payment_method_text": "Betalingsmåte", + "instrument_manage_delete_server_error": "Det oppsto en feil ved forsøk på å slette den lagrede betalingsmåten. Prøv på nytt.", + "instrument_manage_delete_auth_error": "Det oppsto et problem med å godkjenne forespørselen din. Prøv å logge på igjen", + "instrument_manage_delete_client_error": "Det oppsto en feil ved forsøk på å slette den lagrede betalingsmåten: Betalingsmåten eksisterer ikke lenger eller kan ikke slettes.", + "instrument_save_payment_method_label": "Lagre dette kortet for fremtidige transaksjoner", + "instrument_save_as_default_payment_method_label": "Bruk dette kortet som standard betalingsmåte for fremtidige transaksjoner", + "account_instrument_add_action": "Bruk en annen konto", + "account_instrument_save_payment_method_label": "Lagre denne kontoen for fremtidige transaksjoner", + "account_instrument_save_as_default_payment_method_label": "Bruk denne kontoen som standard betalingsmåte for fremtidige transaksjoner", + "account_instrument_text": "Lagrede kontoer", + "account_instrument_new_shipping_address": "Vi la merke til at dette er en ny leveringsadresse.

Av sikkerhetsmessige årsaker må du koble til PayPal-kontoen din på nytt når du sender til en adresse for første gang eller hvis leveringsadressen nylig ble redigert.

", + "instrument_trusted_shipping_address_text": "Dette ekstra sikkerhetstrinnet brukes på kortet ditt når du sender til en adresse for første gang eller hvis leveringsadressen nylig ble redigert.", + "instrument_trusted_shipping_address_title_text": "Skriv inn kortnummeret ditt på nytt for å godkjenne denne transaksjonen.", + "quadpay_continue_action": "Fortsett med Zip", + "quadpay_display_name_text": "Betal i 4 avdrag (Quadpay)", + "ppsdk_continue_action": "Fortsett med {methodName}", + "select_your_bank": "Velg din bank", + "sepa_account_number": "Kontonummer (IBAN)", + "sepa_account_number_required": "Du må oppgi kontonummeret ditt (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "BIC må være på 8 eller 11 tegn", + "sepa_mandate_required": "Du må godta fullmaktsskjemaet", + "sezzle_display_name_text": "Betal senere. 0 % rente.", + "stripe_sepa_display_name_text": "Sepa Direct Debit.", + "stripe_sepa_mandate_disclaimer": "Ved å oppgi IBAN og bekrefte denne betalingen autoriserer du (A) {storeUrl} og Stripe, vår betalingstjenesteleverandør, til å sende instruksjoner til banken din om å belaste kontoen din og (B) banken din til å belaste kontoen din i samsvar med disse instruksjonene. Du har rett til refusjon fra banken din i henhold til vilkårene i avtalen din med banken din. En tilbakebetaling må kreves innen 8 uker fra datoen da kontoen din ble debitert.", + "tax_provider_unavailable": "Omsetningsavgift kunne ikke beregnes. Prøv igjen. Hvis det ikke fungerer, kan du kontakte kundestøtteteamet vårt for å fullføre betalingen.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Fortsett med Click to pay", + "zip_continue_action": "Fortsett med Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Ei det nå, betale senere", + "errors": { + "additional_action_required": "Fortsett med ytterligere handlinger.", + "authorization_expired": "Autorisasjonen for denne transaksjonen har utløpt.", + "authorization_revoked": "Autorisasjonen for denne transaksjonen er tilbakekalt.", + "call_issuer": "Det oppsto et problem under behandlingen av kortet ditt. Ta kontakt med kortutstederen din.", + "captured_transaction": "Betaling for denne bestillingen er allerede utført.", + "card_declined": "Betalingen ble avvist. Prøv et annet kort.", + "card_error": "Kortdetaljene dine kunne ikke bekreftes. Vennligst dobbeltsjekk dem og prøv igjen.", + "card_replaced": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "connection_error": "Vi har problemer med å behandle transaksjonen. Prøv igjen senere.", + "duplicate_transaction": "Dette er en duplikattransaksjon. Vennligst kontakt oss for å bekrefte bestillingen. Ikke prøv å betale igjen.", + "expired_card": "Kortet ditt er utløpt. Prøv igjen med et gyldig kort.", + "gateway_error": "Noe gikk galt på serveren. Prøv igjen senere.", + "general_error": "Feil under behandling av betalingsforespørsel.", + "hosted_form_error": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "incorrect_address": "Faktureringsadressen din kunne ikke bekreftes. Sjekk faktureringsadressedetaljene dine og prøv på nytt.", + "incorrect_amount": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "incorrect_cvc": "Kortdetaljene dine kunne ikke bekreftes. Vennligst dobbeltsjekk dem og prøv igjen.", + "incorrect_number": "Kortdetaljene dine kunne ikke bekreftes. Vennligst dobbeltsjekk dem og prøv igjen.", + "incorrect_zip": "Faktureringsadressen din kunne ikke bekreftes. Sjekk faktureringsadressedetaljene dine og prøv på nytt.", + "insufficient_funds": "Betalingen ble avvist. Ta kontakt med banken din.", + "invalid_address": "Faktureringsadressen din kunne ikke bekreftes. Sjekk faktureringsadressedetaljene dine og prøv på nytt.", + "invalid_amount": "Det oppsto en feil under behandling av betalingen. Vennligst prøv igjen eller kontakt oss.", + "invalid_authorization_code": "Det oppsto en feil under behandling av betalingen. Vennligst prøv igjen eller kontakt oss.", + "invalid_create_instrument_request": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "invalid_cvc": "Kortdetaljene dine kunne ikke bekreftes. Vennligst dobbeltsjekk dem og prøv igjen.", + "invalid_email_address": "Kan ikke behandle betalingen fordi en ugyldig e-postadresse ble oppgitt med transaksjonen.", + "invalid_expiry_date": "Kortdetaljene dine kunne ikke bekreftes. Vennligst dobbeltsjekk dem og prøv igjen.", + "invalid_expiry_month": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "invalid_expiry_year": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "invalid_gateway": "Gateway er ugyldig.", + "invalid_gateway_options": "Gateway-alternativer er ugyldige.", + "invalid_instrument": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "invalid_issuer": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "invalid_number": "Kortdetaljene dine kunne ikke bekreftes. Vennligst dobbeltsjekk dem og prøv igjen.", + "invalid_payment_request": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "invalid_request_error": "Vi har problemer med å behandle transaksjonen. Kontakt oss eller prøv igjen senere.", + "invalid_user_authentication": "Det oppsto en feil under behandling av betalingen. Vennligst kontakt oss.", + "invalid_zip": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "journal_error": "Noe gikk galt på serveren. Prøv igjen senere.", + "lost_or_stolen_card": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "missing_test_mode": "Kan ikke behandle forespørselen fordi ugyldige data ble oppgitt med transaksjonen.", + "not_found": "Vi har problemer med å behandle transaksjonen. Prøv igjen senere.", + "payment_config_error": "Noe gikk galt på serveren. Prøv igjen senere.", + "payment_config_not_found": "Noe gikk galt på serveren. Prøv igjen senere.", + "pending_review": "Transaksjonen din ble autorisert, men blir holdt tilbake for vurdering av selgeren.", + "pickup_card": "Kortet ditt kan ikke brukes til denne betalingen. Ta kontakt med kortutstederen din.", + "processing_error": "Vi har problemer med å behandle transaksjonen. Prøv igjen senere.", + "provider_configuration_error": "Selgerbetalingsleverandør er ikke riktig konfigurert.", + "refund_timelimit_expired": "Fristen for å refundere denne transaksjonen er utløpt.", + "refunded_transaction": "Denne transaksjonen er allerede refundert.", + "request_timeout": "Kan ikke behandle betalingen på grunn av tidsavbrudd. Prøv igjen.", + "required_field": "Betalingen din kunne ikke bekreftes. Sjekk kortdetaljene dine og prøv igjen.", + "server_error": "Det oppsto en feil under behandlingen av betalingen din, og bestillingen din kunne ikke fullføres. Prøv igjen.", + "store_instrument_failed": "Kan ikke behandle forespørselen. Prøv igjen.", + "stored_payment_instrument_not_found": "Det lagrede betalingsinstrumentet ble ikke funnet. Prøv et annet betalingsalternativ.", + "three_d_secure_declined": "Det er et problem med betalingen din. Sjekk betalingsdetaljene dine, eller kontakt kortutstederen din.", + "three_d_secure_failed": "Betalingen mislyktes. Prøv igjen eller bruk et annet betalingsalternativ.", + "three_d_secure_required": "Ytterligere autentisering er nødvendig for å behandle betalingen. Vennligst kontakt oss.", + "token_error": "Vi har problemer med å behandle transaksjonen. Prøv igjen senere.", + "transaction_declined": "Betalingen ble avvist. Prøv igjen.", + "transaction_rejected": "Betalingen ble avvist. Prøv igjen.", + "unauthorized": "Vi har problemer med å behandle transaksjonen. Prøv igjen senere.", + "unsupported_currency": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "unsupported_instrument": "Kortdetaljene dine kunne ikke bekreftes. Vennligst dobbeltsjekk dem og prøv igjen.", + "unsupported_request": "Kan ikke behandle betalingen fordi ugyldige data ble oppgitt med transaksjonen.", + "user_authorization_error": "Det oppsto en feil under behandling av betalingen. Vennligst kontakt oss.", + "vaulting_service_unavailable": "Hvelvtjenesten er for øyeblikket ikke tilgjengelig.", + "voided_transaction": "Kunne ikke behandle betalingen din fordi transaksjonen allerede er annullert. Vennligst prøv igjen eller kontakt oss." + } + }, + "redeemable": { + "applied_text": "Brukt", + "apply_action": "Bruk", + "apply_store_credit_after_action": "lagre kreditt for å bestille", + "apply_store_credit_before_action": "Bruk", + "code_invalid_error": "Gavekortet eller kupongkoden er ugyldig", + "code_label": "Gavekort eller kupongkode", + "code_required_error": "Skriv inn et gavekort eller en kupongkode", + "coupon_location_error": "Leveringsadressen din oppfyller ikke lokasjonskravene for kupongkoden du skrev inn.", + "coupon_min_order_total": "Bestillingen din oppfyller ikke minimumsbeløpet for at denne kupongkoden kan brukes.", + "coupon_text": "Kupong", + "gift_certificate_remaining_text": "gjenstående", + "gift_certificate_text": "Gavekort", + "remove_action": "Fjern", + "store_credit_available_text": "Kontoen din har for øyeblikket {storeCredit} total butikkreditt tilgjengelig", + "toggle_action": "Kupong/gavekort" + }, + "remote": { + "browser_unsupported": "Den valgte betalingsmåten krever en annen nettleser. Velg en annen betalingsmåte.", + "connection_error": "Tilkobling til ekstern kasseløsning ble nektet. Prøv senere.", + "continue_with_text": "Eller fortsett med", + "payment_method_error": "Det oppsto en feil under henting av den eksterne betalingsmåten din. Prøv igjen.", + "select_different_card_action": "Velg et annet kort", + "session_error": "Den eksterne økten din er utløpt. Logg på igjen.", + "shipping_address_error": "Det oppsto en feil under henting av den eksterne leveringsadressen din. Prøv igjen.", + "sign_in_action": "Logg på {providerName}", + "sign_out_action": "Logg av {providerName}", + "sign_out_after_action": "for å se andre betalingsmåter", + "sign_in_required_error": "Fjernpålogging kreves før betaling" + }, + "shipping": { + "cart_change_error": "En oppdatering av handlekurven din har blitt oppdaget, og de tilgjengelige fraktkostnadene dine er oppdatert. Velg en fraktmetode på nytt for å fortsette.", + "enter_shipping_address_text": "Skriv inn en leveringsadresse for å se fraktpriser", + "order_comment_label": "Kommentarer til bestilling", + "assign_item_error": "Det oppsto en feil under tildeling av vare til adresse. Prøv igjen", + "assign_item_invalid_address_error_heading": "Ugyldig adresse", + "assign_item_invalid_address_error": "Den valgte adressen er ikke gyldig. Gå til kontosiden din og oppdater den.", + "unassign_item_error": "Det oppsto en feil under fjerning av tildeling av vare til adresse.", + "save_shipping_address_error": "Det oppstod en feil under lagring av leveringsadressen i pristilbudet. Prøv igjen.", + "save_shipping_option_error": "Det oppstod en feil under lagring av frakttilbudet til bestillingen din. Prøv igjen.", + "select_shipping_address_text": "Selg en leveringsadresse for å se fraktpriser", + "shipping_address_heading": "Leveringsadresse", + "multishipping_address_heading": "Velg hvor du vil sende hver vare", + "multishipping_address_heading_guest": "Logg på først", + "multishipping_guest_intro": "For å sende varene dine til flere adresser må du", + "multishipping_guest_sign_in": "logge på kontoen din", + "multishipping_guest_create": "eller opprette en konto før du fortsetter.", + "ship_to_multi": "Send til flere adresser", + "ship_to_single": "Send til én enkelt adresse", + "shipping_heading": "Frakt", + "shipping_method_label": "Forsendelsesmetode", + "shipping_option_expired_error": "Fraktprisen du fikk oppgitt, er ikke lenger gyldig. Klikk på OK for å se de mest oppdaterte fraktprisene.", + "shipping_option_expired_heading": "Fraktprisen din er oppdatert", + "view_shipping_options_action": "Se andre alternativer" + }, + "social": { + "share_action": "Del", + "share_heading": "Fortell vennene dine om kjøpet ditt!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Klikk her for å bekrefte deg selv som menneske før du fortsetter." + }, + "privacy_policy": { + "required_error": "Godta personvernreglene.", + "label": "Ja, jeg godtar personvernreglene.", + "heading": "Personvernerklæring" + }, + "terms_and_conditions": { + "agreement_required_error": "Godta vilkårene og betingelsene", + "agreement_text": "Ja, jeg godtar vilkårene ovenfor.", + "agreement_with_link_text": "Ja, jeg godtar vilkårene og betingelsene.", + "terms_and_conditions_heading": "Betingelser" + }, + "order_confirmation": { + "mandate": { + "checkoutcom": { + "boleto": "Boleto Bancário-billett", + "oxxo": "OXXO-billett", + "sepa": "SEPA Direct Debit (via Checkout.com) Fullmaktsreferanse: {mandate}" + }, + "stripev3": { + "iban": "SEPA-autorisasjon" + }, + "stripe_upe": { + "boleto": "Boleto Bancário-billett", + "oxxo": "OXXO-billett" + } + }, + "order_number_text": "Bestillingsnummeret ditt er {orderNumber}", + "order_pending_review_text": "Bestillingen din ble sendt til oss, men venter på betaling. Når vi mottar betalingen for bestillingen din, vil den bli fullført. Hvis du allerede har oppgitt betalingsinformasjon, vil vi behandle bestillingen din manuelt og sende deg en e-post når den er fullført.", + "order_pending_status_text": "Vi har mottatt bestillingen din og behandler betalingen din. Når betalingen er bekreftet, vil bestillingen bli fullført. Vi sender deg en e-post når den er fullført. Vær oppmerksom på at denne prosessen kan ta noen minutter avhengig av behandlingstiden for den valgte metoden. Hvis du har spørsmål om kjøpet, kan du sende oss en e-post på {supportEmail}.", + "order_incomplete_status_text": "Vi har mottatt din bestilling og betaling. Bestillingen din behandles nå av systemet vårt. Vær oppmerksom på at behandlingen kan ta noen minutter. Hvis du har spørsmål om kjøpet, kan du sende oss en e-post på {supportEmail}.", + "order_with_downloadable_digital_items_text": "Du kan laste ned dine digitale kjøp ved å klikke på lenkene på denne siden, eller ved å logge på kontoen din når som helst. Det er også en nedlastingslenke i bekreftelses-e-posten din, som skal komme innen kort tid.", + "order_with_support_number_text": "En e-post vil bli sendt med informasjon om kjøpet ditt. Hvis du har spørsmål om kjøpet, kan du sende oss en e-post på {supportEmail} eller ringe oss på {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Når vi mottar betalingen din, sender vi en e-postbekreftelse med en lenke for å laste ned dine digitale kjøp.", + "order_without_support_number_text": "En e-post vil bli sendt med informasjon om kjøpet ditt. Hvis du har spørsmål om kjøpet, kan du sende oss en e-post på {supportEmail}.", + "thank_you_customer_heading": "Takk, {name}!", + "thank_you_heading": "Takk!", + "continue_shopping": "Fortsett å handle »", + "order_status_update_facebook_messenger_heading": "Få umiddelbare oppdateringer om bestillingen din sendt til Messenger" + } + } +} diff --git a/assets/json/pt-BR.json b/assets/json/pt-BR.json new file mode 100644 index 000000000..237feb8ed --- /dev/null +++ b/assets/json/pt-BR.json @@ -0,0 +1,472 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Endereço", + "address_line_1_required_error": "O endereço é obrigatório", + "address_line_2_label": "Apartamento/suíte/prédio", + "address_line_2_required_error": "É obrigatório informar apartamento/suíte/prédio", + "address_not_recognized_heading": "Não reconhecemos o seu endereço", + "consignment_address_updated_text": "O novo endereço foi atribuído ao item.", + "city_label": "Cidade", + "city_required_error": "É obrigatório informar a cidade", + "company_name_label": "Nome da empresa", + "company_name_required_error": "É obrigatório informar a empresa", + "confirm_address_action": "Prosseguir com o endereço atual", + "confirm_address_text": "Não foi possível encontrar uma correspondência para o endereço que você informou. Confirme o endereço.", + "country_label": "País", + "country_required_error": "O país é obrigatório", + "custom_required_error": "É obrigatório informar {label}", + "custom_min_error": "{label} deve ser maior que {min}", + "custom_max_error": "{label} deve ser menor que {max}", + "invalid_characters_error": "{label} contém caracteres inválidos", + "custom_valid_error": "{label} não é válido", + "edit_address_action": "Editar endereço", + "enter_address_action": "Insira um novo endereço", + "add_address_heading": "Adicionar endereço", + "save_address_action": "Salvar endereço", + "first_name_label": "Primeiro nome", + "first_name_required_error": "O primeiro nome é obrigatório", + "last_name_label": "Sobrenome", + "last_name_required_error": "O sobrenome é obrigatório", + "phone_number_label": "Número de telefone", + "phone_number_required_error": "O número de telefone é obrigatório", + "postal_code_label": "Código postal", + "postal_code_required_error": "O código postal é obrigatório", + "save_in_addressbook": "Salve este endereço no meu catálogo de endereços.", + "select_country_action": "Selecione um país", + "select_state_action": "Selecione um estado", + "state_label": "Estado/Província", + "state_required_error": "Estado/Província é obrigatório", + "select": "Selecionar", + "select_all": "Todos", + "select_none": "Nenhuma" + }, + "billing": { + "billing_address_heading": "Endereço de cobrança", + "billing_heading": "Faturamento", + "save_billing_address_error": "Ocorreu um erro ao salvar o endereço de faturamento na sua cotação. Tente novamente.", + "billing_address_amazon": "Igual ao endereço de faturamento definido por você em sua conta da Amazon.", + "billing_address_amazonpay": "Gerenciado pelo Amazon Pay", + "use_shipping_address_label": "Meu endereço de faturamento é o mesmo do meu endereço de entrega." + }, + "cart": { + "billed_amount_text": "* Você receberá uma cobrança e o faturamento de {total} ({code}) referentes a este pedido.", + "based_on_currency_text": "Com base em {total} {code}", + "cart_heading": "Resumo do Pedido", + "digital_item_text": "Item digital", + "discount_text": "Desconto", + "downloads_action": "Acessar downloads", + "edit_cart_action": "Editar carrinho", + "estimated_total_text": "Total estimado", + "free_text": "Grátis", + "gift_certificate_text": "Vale-presente", + "handling_text": "Manuseio", + "item_count_text": "{count, plural, one{1 Item} other{# Itens} }", + "print_action": "Imprimir", + "remaining_text": "restante", + "remove_action": "Remover", + "see_all_action": "Ver tudo", + "see_less_action": "Ver menos", + "shipping_text": "Envio", + "gift_wrapping_text": "Embalagem de presente", + "show_details_action": "Exibir detalhes", + "store_credit_text": "Crédito na loja", + "subtotal_text": "Subtotal", + "taxes_text": "Impostos", + "total_text": "Total", + "empty_cart_message": "Seu carrinho está vazio, você está sendo redirecionado. Clique aqui se o seu navegador não redirecionar você." + }, + "common": { + "cancel_action": "Cancelar", + "close_action": "Fechar", + "continue_action": "Continuar", + "edit_action": "Editar", + "delete_action": "Excluir", + "error_heading": "Ocorreu um erro", + "leave_warning": "Deseja mesmo sair? Os dados inseridos podem não ser salvos.", + "loading_text": "Carregando", + "ok_action": "Ok", + "error_code": "Código de erro:", + "request_id": "ID da solicitação:", + "optional_text": "(Opcional)", + "unavailable_error": "A finalização de compra está temporariamente indisponível. Tente novamente mais tarde.", + "unavailable_heading": "A finalização de compra está temporariamente indisponível", + "unstable_network_error": "Parece que o servidor está demorando muito para responder, isso pode indicar que a conectividade está fraca ou que há um erro em nossos servidores. Tente novamente daqui a pouco.", + "order_loading_error": "Ocorreu um erro no carregamento do seu pedido. Tente novamente.", + "order_fatal_error_heading": "Ocorreu um erro na colocação do seu pedido", + "order_fatal_error_extra": "Selecione outra forma de pagamento ou entre em contato conosco para mais ajuda.", + "go_back": "Retornar", + "show_more": "Mostrar mais" + }, + "customer": { + "checkout_as_guest_text": "Finalizar a compra como visitante? Você poderá salvar seus dados para criar uma conta conosco depois.", + "continue_as_guest_action": "Prosseguir como visitante", + "create_account_action": "Criar conta", + "continue": "Continuar", + "set_password_action": "Salvar senha", + "required_error": "É obrigatório informar {label}", + "min_error": "{label} deve ser maior que {min}", + "max_error": "{label} deve ser menor que {max}", + "invalid_characters_error": "{label} contém caracteres inválidos", + "create_account_error": "Ocorreu um erro na criação da sua conta. Tente novamente.", + "create_address_error": "No entanto, ocorreu um erro ao salvar o endereço no seu catálogo de endereços.", + "create_account_requirements_error_heading": "A senha não atende às exigências.", + "create_account_success": "Sua conta foi criada.", + "set_password_success": "Sua senha foi salva.", + "create_account_text": "Crie uma conta para agilizar a finalização da compra no futuro", + "set_password_text": "Defina uma senha para agilizar a finalização da compra no futuro", + "account_created_text": "Criamos uma conta para você, mas você vai precisar configurar uma senha de acesso.", + "create_account_to_continue_text": "Não tem conta? Crie uma conta para prosseguir.", + "guest_could_login": "Parece que você tem uma conta. Acesse com {email} para agilizar a finalização da compra.", + "guest_must_login": "Parece que você tem uma conta. Entre com {email} para prosseguir ou use outro email.", + "guest_temporary_disabled": "A finalização de compra de visitantes está desativada. Entre ou crie uma conta para prosseguir.", + "customer_heading": "Cliente", + "email_invalid_error": "O endereço de email deve ser válido", + "email_label": "Endereço de email", + "email_required_error": "O endereço de email é obrigatório", + "forgot_password_action": "Esqueceu a senha?", + "guest_customer_text": "Cliente visitante", + "guest_subscribe_to_newsletter_text": "Inscreva-se no nosso boletim informativo.", + "guest_marketing_consent": "Quero receber atualizações e ofertas.", + "login_action": "Inscreva-se agora mesmo", + "login_text": "Já tem uma conta?", + "email_in_use_text": "Já existe uma conta com o email {email}. Informe outro endereço de email ou acesse com este.", + "unknown_email_in_use_text": "Já existe uma conta para o email informado. Informe outro endereço de email ou acesse com este.", + "guest_could_login_change_email": "Não é o email {email}? Alterar email.", + "password_confirmation_error": "As senhas não conferem", + "password_confirmation_label": "Confirmar senha", + "password_confirmation_required_error": "Este campo é obrigatório", + "password_label": "Senha", + "password_letter_required_error": "A senha precisa conter uma letra", + "password_minimum_character_label": "mínimo de caracteres, diferencia maiúsculas de minúsculas", + "password_number_required_error": "A senha precisa conter um número", + "password_over_maximum_length_error": "A senha é muito longa", + "password_required_error": "A senha é obrigatória", + "password_under_minimum_length_error": "A senha é muito curta", + "reset_password_before_login_error": "O acesso está indisponível no momento. Você vai receber um email nos próximos cinco minutos contendo as instruções para redefinir sua senha. Se não receber esse email, verifique a pasta de lixo eletrônico ou entre em contato conosco para receber mais ajuda.", + "returning_customer_text": "Cliente recorrente", + "sign_in_action": "Entrar", + "sign_in_error": "O email ou a senha que você inseriu não é válido.", + "sign_in_throttled_error": "Você fez muitas tentativas de acesso, aguarde 10 segundos para tentar novamente.", + "sign_out_action": "Sair", + "sign_out_error": "Ocorreu um erro ao sair. Tente novamente.", + "subscribe_to_newsletter_text": "Sim, quero receber atualizações.", + "suggestion_text": "Parece que você tem uma conta com {provider}. Para agilizar a finalização da compra, continue com {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "Não conseguimos enviar om link de acesso para você. Tente novamente.", + "error_not_found": "O email inserido não está associado a nenhuma conta. Experimente outro email.", + "sent_header": "Verifique sua caixa de entrada", + "sent_text": "Enviamos um email para {email} com um link para acesso. O e-mail tem validade de {minutes} minutos. Se você não o encontrar em sua caixa de entrada, verifique a pasta de lixo eletrônico.", + "text": "Insira o endereço de email associado à sua conta. Enviaremos um link de acesso para você.", + "header": "Digite seu endereço de email", + "header_with_email": "Confirme seu endereço de email.", + "link": "Envie um link de acesso para mim.", + "use_another_email": "Usar outro email", + "send": "Enviar", + "error_temporary_disabled": "O recurso do link de acesso está temporária indisponível. Acesse digitando sua senha.", + "resend_link": "Não recebeu o email? Reenviar o link", + "use_password_link": " ou acesse com a sua senha." + }, + "embedded_checkout": { + "unsupported_error": "Os métodos de pagamento a seguir não são aceitos na finalização de compra integrada: {methods}. Entre em contato conosco para receber ajuda." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Pagar ao longo do tempo", + "affirm_body_text": "Você será redirecionado para o Affirm para concluir a sua compra com segurança. Basta preencher algumas informações básicas e tomar uma decisão em tempo real. Verificar sua qualificação não afetará sua pontuação de crédito.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Finalizar a compra com o Afterpay", + "amazon_continue_action": "Prosseguir com a Amazon", + "amazonpay_continue_action": "Prosseguir com o Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continuar", + "bluesnap_v2_continue_action": "Continuar", + "bolt_create_account_label": "Lembrar minhas informações com o Bolt", + "bolt_create_account_disclaimer": "Ao marcar acima, você concorda em criar uma Conta Bolt de acordo com os termos e a política de privacidade.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Prosseguir com o Visa Checkout", + "ccavenuemars_description_text": "Finalizar a compra com o CCAvenue", + "chasepay_continue_action": "Prosseguir com o Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Editar cartão", + "chasepay_logout": "Sair do Chase Pay", + "chasepay_fail_load": "Não foi possível carregar o Chase Pay", + "checkoutcom_document_label_boleto": "CPF ou CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "Identificação nacional", + "checkoutcom_document_invalid_error_boleto": "O CPF ou CNPJ devem ter entre 11 e 14 caracteres", + "checkoutcom_document_invalid_error_oxxo": "O CURP deve ter no máximo 18 caracteres", + "checkoutcom_document_invalid_error_qpay": "A identificação nacional deve ter no máximo 32 caracteres", + "checkoutcom_fawry_customer_mobile_invalid_error": "O número do celular deve ser válido", + "checkoutcom_fawry_customer_mobile_label": "Número do celular", + "checkoutcom_fawry_customer_email_invalid_error": "O endereço de email deve ser válido", + "checkoutcom_fawry_customer_email_label": "Email", + "checkoutcom_sepa_creditor_title": "Credor", + "checkoutcom_sepa_creditor_id": "ID do credor: {creditorId}", + "checkoutcom_sepa_debtor_title": "Devedor", + "checkoutcom_sepa_mandate_disclaimer": "Ao aceitar este formulário de mandato, você autoriza {creditorName} a enviar instruções ao seu banco para debitar sua conta e o seu banco a debitar sua conta de acordo com essas instruções. Você tem direito ao reembolso do seu banco de acordo com os termos e condições do seu contrato com o seu banco. O reembolso deve ser solicitado dentro de oito semanas a partir da data em que a sua conta foi debitada.", + "checkoutcom_sepa_payment_type": "Tipo de pagamento: único (não recorrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Cartão de crédito", + "credit_card_customer_code_label": "Código do cliente", + "credit_card_cvv_help_text": "No VISA e no Mastercard, o CVV é um código de três dígitos, impresso na parte de trás. No American Express é o código de quatro dígitos, impresso na frente. O CVV é uma medida de segurança para garantir que você está em posse do cartão.", + "credit_card_cvv_invalid_error": "O CVV deve ser válido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "O CVV é obrigatório", + "credit_card_expiration_invalid_error": "A data de vencimento deve ser uma data futura válida no formato MM/YY", + "credit_card_expiration_label": "Vencimento", + "credit_card_expiration_date_label": "Data de validade", + "credit_card_expiration_required_error": "A data de vencimento é obrigatória", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nome no cartão", + "credit_card_name_required_error": "O nome completo é obrigatório", + "credit_card_number_invalid_error": "O número do cartão de crédito deve ser válido", + "credit_card_number_label": "Número do cartão de crédito", + "credit_card_number_last_four": "Insira o número do cartão {cardType} terminando em {lastFour}", + "credit_card_number_required_error": "O número de cartão de crédito é obrigatório", + "credit_card_number_mismatch_error": "O número do cartão inserido não corresponde ao cartão armazenado na sua conta", + "credit_debit_card_text": "Cartão de crédito/débito", + "digitalriver_dropin_error": "Ocorreu um erro no processamento do seu pagamento. Tente novamente ou entre em contato conosco.", + "digitalriver_checkout_error": "Ocorreu um problema na finalização da compra; confira os dados e tente novamente; ou procure o atendimento ao cliente", + "digitalriver_checkout_error_title": "Erro ao processar a solicitação.", + "digitalriver_display_name_text": "Adicione um método de pagamento", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "O Humm não pode processar o pagamento do pedido; selecione outro método de pagamento.", + "klarna_continue_action": "Continuar com o Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuar com o Openpay", + "orbital_continue_action": "Comprar", + "orbital_description_text": "Pague com a sua conta do ChasePay", + "payment_cancelled": "O pagamento foi cancelado", + "payment_error": "Ocorreu um erro no processamento do seu pagamento. Tente novamente.", + "payment_error_heading": "O pagamento não foi realizado", + "payment_heading": "Pagamento", + "payment_invalid_error_heading": "Pagamento indisponível", + "payment_method_disabled_error": "O método de pagamento selecionado não é mais válido. Clique em OK para ver os métodos de pagamento mais atuais.", + "payment_method_error": "Resposta do provedor de pagamento: {message}", + "payment_method_invalid_error": "Há um problema no processamento do seu pagamento. Entre em contato conosco para receber ajuda ou escolha outro método de pagamento.", + "payment_method_unavailable_error": "Este provedor de pagamento está temporariamente indisponível. Tente novamente mais tarde.", + "payment_not_required_text": "Não é necessário fazer o pagamento deste pedido.", + "paypal_continue_action": "Prosseguir com o PayPal", + "paypal_credit_continue_action": "Prosseguir com o PayPal Credit", + "paypal_credit_description_text": "Compre agora, pague ao longo do tempo", + "paypal_description_text": "Pague com a sua conta do PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pagar depois", + "place_order_action": "Comprar", + "place_order_error": "Ocorreu um erro ao fazer o seu pedido. Entre em contato conosco.", + "place_order_error_heading": "Não foi possível fazer o pedido", + "postal_code_label": "Código postal", + "ideal_bic_required": "É necessário selecionar um emissor para fazer o pedido", + "instrument_text": "Cartões de crédito armazenados", + "instrument_add_card_action": "Use outro cartão", + "instrument_default_ending_in_text": "Cartão terminando em {endingIn}", + "instrument_ending_in_text": "{cardTitle} terminando em {endingIn}", + "instrument_expired_text": "vencido em {expiryDate}", + "instrument_expires_text": "Vence em {expiryDate}", + "instrument_manage_button": "gerenciar", + "instrument_manage_modal_confirmation_action": "Sim, excluir", + "instrument_manage_modal_confirmation_label": "Deseja mesmo excluir essa forma de pagamento armazenada?", + "instrument_manage_modal_title_text": "Gerenciar métodos de pagamento armazenados", + "instrument_manage_modal_empty_text": "Você não tem nenhum método de pagamento armazenado.", + "instrument_manage_table_header_ending_in_text": "Terminando em", + "instrument_manage_table_header_expiry_date_text": "Data de vencimento", + "instrument_manage_table_header_payment_method_text": "Forma de pagamento", + "instrument_manage_delete_server_error": "Ocorreu um erro na tentativa de excluir esse método de pagamento armazenado, tente novamente.", + "instrument_manage_delete_auth_error": "Ocorreu um problema na autorização da sua solicitação. Tente entrar novamente", + "instrument_manage_delete_client_error": "Ocorreu um erro na tentativa de excluir o método de pagamento armazenado: o método de pagamento não existe mais ou não pode ser excluído.", + "instrument_save_payment_method_label": "Salvar este cartão para as próximas transações", + "instrument_save_as_default_payment_method_label": "Usar este cartão como método de pagamento padrão para as próximas transações", + "account_instrument_add_action": "Use outro cartão", + "account_instrument_save_payment_method_label": "Salvar esta conta para as próximas transações", + "account_instrument_save_as_default_payment_method_label": "Usar esta conta como método de pagamento padrão para as próximas transações", + "account_instrument_text": "Contas armazenadas", + "account_instrument_new_shipping_address": "Percebemos que este é um novo endereço de entrega.

Por segurança, será necessário vincular novamente a sua conta do PayPal quando enviar para um endereço pela primeira vez ou se o endereço de entrega tiver sido editado recentemente.

", + "instrument_trusted_shipping_address_text": "Esta etapa de segurança adicional é aplicada ao seu cartão quando você envia para um endereço pela primeira vez ou se o endereço de entrega tiver sido editado recentemente.", + "instrument_trusted_shipping_address_title_text": "Insira novamente o número do seu cartão para autorizar esta transação.", + "quadpay_continue_action": "Prosseguir com o Zip", + "quadpay_display_name_text": "Pagar em 4 parcelas (Quadpay)", + "ppsdk_continue_action": "Continue com o {methodName}", + "select_your_bank": "Selecione seu banco", + "sepa_account_number": "Número da conta (IBAN)", + "sepa_account_number_required": "É necessário informar o número da sua conta (IBAN).", + "sepa_bic": "BIC", + "sepa_bic_length": "O BIC deve ter 8 ou 11 caracteres", + "sepa_mandate_required": "Você deve aceitar o formulário de mandato.", + "sezzle_display_name_text": "Pagar depois 0% de juros.", + "stripe_sepa_display_name_text": "Débito direto por Sepa.", + "stripe_sepa_mandate_disclaimer": "Ao informar o IBAN e confirmar este pagamento, você autoriza (A) {storeUrl} e o Stripe, nosso prestador de serviços de pagamento, a enviar instruções ao seu banco para debitar sua conta e (B) o seu banco a debitar sua conta de acordo com essas instruções. Você tem direito ao reembolso do seu banco de acordo com os termos e condições do seu contrato com o seu banco. O reembolso deve ser solicitado dentro de oito semanas a partir da data em que a sua conta foi debitada.", + "tax_provider_unavailable": "O imposto sobre vendas não foi calculado. Tente novamente. Se não der certo, procure nossa equipe de suporte para concluir a finalização da compra.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continue com o Click to pay", + "zip_continue_action": "Prosseguir com o Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Own it Now, Pay Later", + "errors": { + "additional_action_required": "Dar prosseguimento a mais ações.", + "authorization_expired": "A autorização para esta transação expirou.", + "authorization_revoked": "A autorização para esta transação foi revogada.", + "call_issuer": "Houve um problema no processamento do cartão. Entre em contato com o emissor do seu cartão.", + "captured_transaction": "O pagamento deste pedido já foi feito.", + "card_declined": "O pagamento foi recusado. Tente outro cartão.", + "card_error": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "card_replaced": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "connection_error": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "duplicate_transaction": "Esta é uma transação em duplicidade. Entre em contato conosco para confirmar seu pedido. Não tente efetuar o pagamento novamente.", + "expired_card": "Seu cartão expirou. Tente novamente com um cartão válido.", + "gateway_error": "Ocorreu um erro no servidor. Tente novamente mais tarde.", + "general_error": "Erro no processamento da solicitação de pagamento.", + "hosted_form_error": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "incorrect_address": "Não foi possível confirmar seu endereço de cobrança. Confira o seu endereço de cobrança e tente novamente.", + "incorrect_amount": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "incorrect_cvc": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "incorrect_number": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "incorrect_zip": "Não foi possível confirmar seu endereço de cobrança. Confira o seu endereço de cobrança e tente novamente.", + "insufficient_funds": "O pagamento foi recusado. Entre em contato com o seu banco.", + "invalid_address": "Não foi possível confirmar seu endereço de cobrança. Confira o seu endereço de cobrança e tente novamente.", + "invalid_amount": "Ocorreu um erro no processamento do seu pagamento. Tente novamente ou entre em contato conosco.", + "invalid_authorization_code": "Ocorreu um erro no processamento do seu pagamento. Tente novamente ou entre em contato conosco.", + "invalid_create_instrument_request": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_cvc": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "invalid_email_address": "Não foi possível processar o pagamento porque foi informado um email inválido com a transação.", + "invalid_expiry_date": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "invalid_expiry_month": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_expiry_year": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_gateway": "O gateway não é válido.", + "invalid_gateway_options": "As opções de gateway são inválidas.", + "invalid_instrument": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_issuer": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_number": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "invalid_payment_request": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_request_error": "Estamos com dificuldades para processar a sua transação. Entre em contato conosco ou tente novamente mais tarde.", + "invalid_user_authentication": "Ocorreu um erro no processamento do seu pagamento. Entre em contato conosco.", + "invalid_zip": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "journal_error": "Ocorreu um erro no servidor. Tente novamente mais tarde.", + "lost_or_stolen_card": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "missing_test_mode": "Não foi possível processar a solicitação porque foram informados dados inválidos com a transação.", + "not_found": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "payment_config_error": "Ocorreu um erro no servidor. Tente novamente mais tarde.", + "payment_config_not_found": "Ocorreu um erro no servidor. Tente novamente mais tarde.", + "pending_review": "Sua transação foi autorizada, mas está sendo retida para revisão pelo comerciante.", + "pickup_card": "Não é possível utilizar o seu cartão para efetuar este pagamento. Entre em contato com o emissor do seu cartão ou experimente usar outro cartão.", + "processing_error": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "provider_configuration_error": "O provedor de pagamento do comerciante não está configurado corretamente.", + "refund_timelimit_expired": "O prazo para reembolso desta transação expirou.", + "refunded_transaction": "Esta transação já foi reembolsada.", + "request_timeout": "Não foi possível processar o pagamento porque o tempo expirou. Tente novamente.", + "required_field": "Não foi possível confirmar seu pagamento. Verifique as informações do seu cartão e tente novamente.", + "server_error": "Ocorreu um erro no processamento do seu pagamento e não foi possível concluir o seu pedido. Tente novamente.", + "store_instrument_failed": "Não foi possível processar a solicitação. Tente novamente.", + "stored_payment_instrument_not_found": "Não foi possível encontrar este instrumento de pagamento armazenado. Tente outra opção de pagamento.", + "three_d_secure_declined": "Houve um problema com o seu pagamento, confira seus dados de pagamento ou entre em contato com o emissor do cartão.", + "three_d_secure_failed": "O pagamento não foi realizado. Tente novamente ou utilize outra opção de pagamento.", + "three_d_secure_required": "É necessário realizar uma autenticação extra para processar seu pagamento. Entre em contato conosco.", + "token_error": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "transaction_declined": "Seu pagamento foi recusado. Tente novamente.", + "transaction_rejected": "O pagamento foi recusado. Tente novamente.", + "unauthorized": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "unsupported_currency": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "unsupported_instrument": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "unsupported_request": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "user_authorization_error": "Ocorreu um erro no processamento do seu pagamento. Entre em contato conosco.", + "vaulting_service_unavailable": "O serviço de armazenamento de dados de cartões não está disponível no momento.", + "voided_transaction": "Não foi possível processar seu pagamento porque a transação já tinha sido anulada. Tente novamente ou entre em contato conosco." + } + }, + "redeemable": { + "applied_text": "Aplicado", + "apply_action": "Aplicar", + "apply_store_credit_after_action": "crédito da loja no pedido", + "apply_store_credit_before_action": "Aplicar", + "code_invalid_error": "O vale-presente ou o código do cupom é inválido", + "code_label": "vale-presente ou código do cupom", + "code_required_error": "Digite o vale-presente ou o código do cupom", + "coupon_location_error": "O seu endereço de entrega não atende aos requisitos de localização do código de cupom que você inseriu.", + "coupon_min_order_total": "Seu pedido não atende ao total mínimo para aplicação do código do cupom.", + "coupon_text": "Cupom", + "gift_certificate_remaining_text": "restante", + "gift_certificate_text": "Vale-presente", + "remove_action": "Remover", + "store_credit_available_text": "No momento, a sua conta tem um total de {storeCredit} de crédito disponível na loja", + "toggle_action": "Cupom/vale-presente" + }, + "remote": { + "browser_unsupported": "A forma de pagamento selecionada exige o uso de outro navegador. Selecione outra forma de pagamento.", + "connection_error": "A conexão com a finalização de compra remota foi recusada, tente mais tarde.", + "continue_with_text": "Ou prossiga com", + "payment_method_error": "Ocorreu um erro na busca da sua forma de pagamento remota. Tente novamente.", + "select_different_card_action": "Selecione outro cartão", + "session_error": "Sua sessão remota expirou. Acesse novamente.", + "shipping_address_error": "Ocorreu um erro na busca do seu endereço de entrega remoto. Tente novamente.", + "sign_in_action": "Entrar em {providerName}", + "sign_out_action": "Sair de {providerName}", + "sign_out_after_action": "para ver outras formas de pagamento", + "sign_in_required_error": "Acesso remoto obrigatório antes do pagamento" + }, + "shipping": { + "cart_change_error": "Foi detectada uma atualização do seu carrinho de compras e seus custos de envio disponíveis foram atualizados. Selecione novamente uma forma de envio para prosseguir.", + "enter_shipping_address_text": "Insira um endereço de entrega para ver os preços de envio", + "order_comment_label": "Comentários sobre o pedido", + "assign_item_error": "Ocorreu um erro na atribuição do item ao endereço. Tente novamente", + "assign_item_invalid_address_error_heading": "Endereço inválido", + "assign_item_invalid_address_error": "O endereço selecionado não é válido. Acesse a página da sua conta e atualize-a.", + "unassign_item_error": "Ocorreu um erro no cancelamento da atribuição do item ao endereço.", + "save_shipping_address_error": "Ocorreu um erro ao salvar o endereço de envio na sua cotação. Tente novamente.", + "save_shipping_option_error": "Ocorreu um erro ao salvar a cotação do envio no seu pedido. Tente novamente.", + "select_shipping_address_text": "Selecione um endereço de entrega para ver os preços de envio", + "shipping_address_heading": "Endereço de entrega", + "multishipping_address_heading": "Selecione o local para onde enviar cada item", + "multishipping_address_heading_guest": "Entre primeiro", + "multishipping_guest_intro": "Para enviar seus itens para vários endereços você precisa", + "multishipping_guest_sign_in": "entrar na sua conta", + "multishipping_guest_create": "ou criar uma conta para poder prosseguir.", + "ship_to_multi": "Enviar para vários endereços", + "ship_to_single": "Enviar para um único endereço", + "shipping_heading": "Envio", + "shipping_method_label": "Método de envio:", + "shipping_option_expired_error": "O preço de envio que você cotou não é mais válido. Clique em OK para ver os preços de envio mais atualizados.", + "shipping_option_expired_heading": "Seu preço de envio foi atualizado", + "view_shipping_options_action": "Ver outras opções" + }, + "social": { + "share_action": "Compartilhar", + "share_heading": "Conte aos seus amigos sobre a sua compra!", + "tweet_action": "Tuíte" + }, + "spam_protection": { + "verify_action": "Clique aqui para confirmar que você é humano e poder prosseguir." + }, + "privacy_policy": { + "required_error": "Por gentileza, concorde com a Política de Privacidade.", + "label": "Sim, eu concordo com a política de privacidade.", + "heading": "Política de privacidade" + }, + "terms_and_conditions": { + "agreement_required_error": "Por gentileza, concorde com os termos e condições", + "agreement_text": "Sim, eu concordo com os termos e condições acima.", + "agreement_with_link_text": "Sim, eu concordo com os termos e condições.", + "terms_and_conditions_heading": "Termos e condições" + }, + "order_confirmation": { + "order_number_text": "O número do seu pedido é {orderNumber}", + "order_pending_review_text": "Seu pedido foi enviado para nós, mas está aguardando o pagamento no momento. Assim que recebermos o pagamento do seu pedido ele será concluído. Se você já tiver informado os detalhes de pagamento, processaremos o seu pedido manualmente e enviaremos um email quando ele for concluído.", + "order_pending_status_text": "Recebemos o seu pedido e estamos processando o seu pagamento. Quando o pagamento for confirmado, seu pedido será concluído. Enviaremos um email para você quando ele for concluído. Lembre-se de que este processo pode demorar alguns minutos dependendo do tempo de processamento do método que você escolheu. Se tiver alguma dúvida sobre a sua compra, envie um email para {supportEmail}.", + "order_incomplete_status_text": "Recebemos o seu pedido e o pagamento. Seu pedido está sendo processado pelo nosso sistema. Lembre-se de que o processamento pode demorar alguns minutos. Se tiver alguma dúvida sobre a sua compra, envie um e-mail para {supportEmail}.", + "order_with_downloadable_digital_items_text": "Você pode baixar suas compras digitais clicando nos links desta página ou acessando sua conta a qualquer momento. Há também um link para download no seu email de confirmação, que deve chegar em breve.", + "order_with_support_number_text": "Enviaremos um email contendo as informações sobre a sua compra. Se tiver alguma dúvida sobre a sua compra, envie um email para {supportEmail} ou ligue para nós pelo número {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Assim que recebermos o seu pagamento, enviaremos um e-mail de confirmação com um link para baixar suas compras digitais.", + "order_without_support_number_text": "Enviaremos um email contendo as informações sobre a sua compra. Se tiver alguma dúvida sobre a sua compra, envie um email para {supportEmail}.", + "thank_you_customer_heading": "Obrigado {name}!", + "thank_you_heading": "Obrigado!", + "continue_shopping": "Continuar comprando »", + "order_status_update_facebook_messenger_heading": "Receba atualizações imediatas do seu pedido no Messenger", + "mandate_link_text": "Mandato de {provider}", + "boleto_link_text": "Boleto bancário", + "oxxo_link_text": "Bilhete do OXXO", + "sepa_link_text": "Ordem de débito direto do SEPA" + } + } +} diff --git a/assets/json/pt.json b/assets/json/pt.json new file mode 100644 index 000000000..237feb8ed --- /dev/null +++ b/assets/json/pt.json @@ -0,0 +1,472 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Endereço", + "address_line_1_required_error": "O endereço é obrigatório", + "address_line_2_label": "Apartamento/suíte/prédio", + "address_line_2_required_error": "É obrigatório informar apartamento/suíte/prédio", + "address_not_recognized_heading": "Não reconhecemos o seu endereço", + "consignment_address_updated_text": "O novo endereço foi atribuído ao item.", + "city_label": "Cidade", + "city_required_error": "É obrigatório informar a cidade", + "company_name_label": "Nome da empresa", + "company_name_required_error": "É obrigatório informar a empresa", + "confirm_address_action": "Prosseguir com o endereço atual", + "confirm_address_text": "Não foi possível encontrar uma correspondência para o endereço que você informou. Confirme o endereço.", + "country_label": "País", + "country_required_error": "O país é obrigatório", + "custom_required_error": "É obrigatório informar {label}", + "custom_min_error": "{label} deve ser maior que {min}", + "custom_max_error": "{label} deve ser menor que {max}", + "invalid_characters_error": "{label} contém caracteres inválidos", + "custom_valid_error": "{label} não é válido", + "edit_address_action": "Editar endereço", + "enter_address_action": "Insira um novo endereço", + "add_address_heading": "Adicionar endereço", + "save_address_action": "Salvar endereço", + "first_name_label": "Primeiro nome", + "first_name_required_error": "O primeiro nome é obrigatório", + "last_name_label": "Sobrenome", + "last_name_required_error": "O sobrenome é obrigatório", + "phone_number_label": "Número de telefone", + "phone_number_required_error": "O número de telefone é obrigatório", + "postal_code_label": "Código postal", + "postal_code_required_error": "O código postal é obrigatório", + "save_in_addressbook": "Salve este endereço no meu catálogo de endereços.", + "select_country_action": "Selecione um país", + "select_state_action": "Selecione um estado", + "state_label": "Estado/Província", + "state_required_error": "Estado/Província é obrigatório", + "select": "Selecionar", + "select_all": "Todos", + "select_none": "Nenhuma" + }, + "billing": { + "billing_address_heading": "Endereço de cobrança", + "billing_heading": "Faturamento", + "save_billing_address_error": "Ocorreu um erro ao salvar o endereço de faturamento na sua cotação. Tente novamente.", + "billing_address_amazon": "Igual ao endereço de faturamento definido por você em sua conta da Amazon.", + "billing_address_amazonpay": "Gerenciado pelo Amazon Pay", + "use_shipping_address_label": "Meu endereço de faturamento é o mesmo do meu endereço de entrega." + }, + "cart": { + "billed_amount_text": "* Você receberá uma cobrança e o faturamento de {total} ({code}) referentes a este pedido.", + "based_on_currency_text": "Com base em {total} {code}", + "cart_heading": "Resumo do Pedido", + "digital_item_text": "Item digital", + "discount_text": "Desconto", + "downloads_action": "Acessar downloads", + "edit_cart_action": "Editar carrinho", + "estimated_total_text": "Total estimado", + "free_text": "Grátis", + "gift_certificate_text": "Vale-presente", + "handling_text": "Manuseio", + "item_count_text": "{count, plural, one{1 Item} other{# Itens} }", + "print_action": "Imprimir", + "remaining_text": "restante", + "remove_action": "Remover", + "see_all_action": "Ver tudo", + "see_less_action": "Ver menos", + "shipping_text": "Envio", + "gift_wrapping_text": "Embalagem de presente", + "show_details_action": "Exibir detalhes", + "store_credit_text": "Crédito na loja", + "subtotal_text": "Subtotal", + "taxes_text": "Impostos", + "total_text": "Total", + "empty_cart_message": "Seu carrinho está vazio, você está sendo redirecionado. Clique aqui se o seu navegador não redirecionar você." + }, + "common": { + "cancel_action": "Cancelar", + "close_action": "Fechar", + "continue_action": "Continuar", + "edit_action": "Editar", + "delete_action": "Excluir", + "error_heading": "Ocorreu um erro", + "leave_warning": "Deseja mesmo sair? Os dados inseridos podem não ser salvos.", + "loading_text": "Carregando", + "ok_action": "Ok", + "error_code": "Código de erro:", + "request_id": "ID da solicitação:", + "optional_text": "(Opcional)", + "unavailable_error": "A finalização de compra está temporariamente indisponível. Tente novamente mais tarde.", + "unavailable_heading": "A finalização de compra está temporariamente indisponível", + "unstable_network_error": "Parece que o servidor está demorando muito para responder, isso pode indicar que a conectividade está fraca ou que há um erro em nossos servidores. Tente novamente daqui a pouco.", + "order_loading_error": "Ocorreu um erro no carregamento do seu pedido. Tente novamente.", + "order_fatal_error_heading": "Ocorreu um erro na colocação do seu pedido", + "order_fatal_error_extra": "Selecione outra forma de pagamento ou entre em contato conosco para mais ajuda.", + "go_back": "Retornar", + "show_more": "Mostrar mais" + }, + "customer": { + "checkout_as_guest_text": "Finalizar a compra como visitante? Você poderá salvar seus dados para criar uma conta conosco depois.", + "continue_as_guest_action": "Prosseguir como visitante", + "create_account_action": "Criar conta", + "continue": "Continuar", + "set_password_action": "Salvar senha", + "required_error": "É obrigatório informar {label}", + "min_error": "{label} deve ser maior que {min}", + "max_error": "{label} deve ser menor que {max}", + "invalid_characters_error": "{label} contém caracteres inválidos", + "create_account_error": "Ocorreu um erro na criação da sua conta. Tente novamente.", + "create_address_error": "No entanto, ocorreu um erro ao salvar o endereço no seu catálogo de endereços.", + "create_account_requirements_error_heading": "A senha não atende às exigências.", + "create_account_success": "Sua conta foi criada.", + "set_password_success": "Sua senha foi salva.", + "create_account_text": "Crie uma conta para agilizar a finalização da compra no futuro", + "set_password_text": "Defina uma senha para agilizar a finalização da compra no futuro", + "account_created_text": "Criamos uma conta para você, mas você vai precisar configurar uma senha de acesso.", + "create_account_to_continue_text": "Não tem conta? Crie uma conta para prosseguir.", + "guest_could_login": "Parece que você tem uma conta. Acesse com {email} para agilizar a finalização da compra.", + "guest_must_login": "Parece que você tem uma conta. Entre com {email} para prosseguir ou use outro email.", + "guest_temporary_disabled": "A finalização de compra de visitantes está desativada. Entre ou crie uma conta para prosseguir.", + "customer_heading": "Cliente", + "email_invalid_error": "O endereço de email deve ser válido", + "email_label": "Endereço de email", + "email_required_error": "O endereço de email é obrigatório", + "forgot_password_action": "Esqueceu a senha?", + "guest_customer_text": "Cliente visitante", + "guest_subscribe_to_newsletter_text": "Inscreva-se no nosso boletim informativo.", + "guest_marketing_consent": "Quero receber atualizações e ofertas.", + "login_action": "Inscreva-se agora mesmo", + "login_text": "Já tem uma conta?", + "email_in_use_text": "Já existe uma conta com o email {email}. Informe outro endereço de email ou acesse com este.", + "unknown_email_in_use_text": "Já existe uma conta para o email informado. Informe outro endereço de email ou acesse com este.", + "guest_could_login_change_email": "Não é o email {email}? Alterar email.", + "password_confirmation_error": "As senhas não conferem", + "password_confirmation_label": "Confirmar senha", + "password_confirmation_required_error": "Este campo é obrigatório", + "password_label": "Senha", + "password_letter_required_error": "A senha precisa conter uma letra", + "password_minimum_character_label": "mínimo de caracteres, diferencia maiúsculas de minúsculas", + "password_number_required_error": "A senha precisa conter um número", + "password_over_maximum_length_error": "A senha é muito longa", + "password_required_error": "A senha é obrigatória", + "password_under_minimum_length_error": "A senha é muito curta", + "reset_password_before_login_error": "O acesso está indisponível no momento. Você vai receber um email nos próximos cinco minutos contendo as instruções para redefinir sua senha. Se não receber esse email, verifique a pasta de lixo eletrônico ou entre em contato conosco para receber mais ajuda.", + "returning_customer_text": "Cliente recorrente", + "sign_in_action": "Entrar", + "sign_in_error": "O email ou a senha que você inseriu não é válido.", + "sign_in_throttled_error": "Você fez muitas tentativas de acesso, aguarde 10 segundos para tentar novamente.", + "sign_out_action": "Sair", + "sign_out_error": "Ocorreu um erro ao sair. Tente novamente.", + "subscribe_to_newsletter_text": "Sim, quero receber atualizações.", + "suggestion_text": "Parece que você tem uma conta com {provider}. Para agilizar a finalização da compra, continue com {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "Não conseguimos enviar om link de acesso para você. Tente novamente.", + "error_not_found": "O email inserido não está associado a nenhuma conta. Experimente outro email.", + "sent_header": "Verifique sua caixa de entrada", + "sent_text": "Enviamos um email para {email} com um link para acesso. O e-mail tem validade de {minutes} minutos. Se você não o encontrar em sua caixa de entrada, verifique a pasta de lixo eletrônico.", + "text": "Insira o endereço de email associado à sua conta. Enviaremos um link de acesso para você.", + "header": "Digite seu endereço de email", + "header_with_email": "Confirme seu endereço de email.", + "link": "Envie um link de acesso para mim.", + "use_another_email": "Usar outro email", + "send": "Enviar", + "error_temporary_disabled": "O recurso do link de acesso está temporária indisponível. Acesse digitando sua senha.", + "resend_link": "Não recebeu o email? Reenviar o link", + "use_password_link": " ou acesse com a sua senha." + }, + "embedded_checkout": { + "unsupported_error": "Os métodos de pagamento a seguir não são aceitos na finalização de compra integrada: {methods}. Entre em contato conosco para receber ajuda." + }, + "payment": { + "affirm_name_text": "Affirm", + "affirm_display_name_text": "Pagar ao longo do tempo", + "affirm_body_text": "Você será redirecionado para o Affirm para concluir a sua compra com segurança. Basta preencher algumas informações básicas e tomar uma decisão em tempo real. Verificar sua qualificação não afetará sua pontuação de crédito.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Finalizar a compra com o Afterpay", + "amazon_continue_action": "Prosseguir com a Amazon", + "amazonpay_continue_action": "Prosseguir com o Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Continuar", + "bluesnap_v2_continue_action": "Continuar", + "bolt_create_account_label": "Lembrar minhas informações com o Bolt", + "bolt_create_account_disclaimer": "Ao marcar acima, você concorda em criar uma Conta Bolt de acordo com os termos e a política de privacidade.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Prosseguir com o Visa Checkout", + "ccavenuemars_description_text": "Finalizar a compra com o CCAvenue", + "chasepay_continue_action": "Prosseguir com o Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Editar cartão", + "chasepay_logout": "Sair do Chase Pay", + "chasepay_fail_load": "Não foi possível carregar o Chase Pay", + "checkoutcom_document_label_boleto": "CPF ou CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "Identificação nacional", + "checkoutcom_document_invalid_error_boleto": "O CPF ou CNPJ devem ter entre 11 e 14 caracteres", + "checkoutcom_document_invalid_error_oxxo": "O CURP deve ter no máximo 18 caracteres", + "checkoutcom_document_invalid_error_qpay": "A identificação nacional deve ter no máximo 32 caracteres", + "checkoutcom_fawry_customer_mobile_invalid_error": "O número do celular deve ser válido", + "checkoutcom_fawry_customer_mobile_label": "Número do celular", + "checkoutcom_fawry_customer_email_invalid_error": "O endereço de email deve ser válido", + "checkoutcom_fawry_customer_email_label": "Email", + "checkoutcom_sepa_creditor_title": "Credor", + "checkoutcom_sepa_creditor_id": "ID do credor: {creditorId}", + "checkoutcom_sepa_debtor_title": "Devedor", + "checkoutcom_sepa_mandate_disclaimer": "Ao aceitar este formulário de mandato, você autoriza {creditorName} a enviar instruções ao seu banco para debitar sua conta e o seu banco a debitar sua conta de acordo com essas instruções. Você tem direito ao reembolso do seu banco de acordo com os termos e condições do seu contrato com o seu banco. O reembolso deve ser solicitado dentro de oito semanas a partir da data em que a sua conta foi debitada.", + "checkoutcom_sepa_payment_type": "Tipo de pagamento: único (não recorrente)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Cartão de crédito", + "credit_card_customer_code_label": "Código do cliente", + "credit_card_cvv_help_text": "No VISA e no Mastercard, o CVV é um código de três dígitos, impresso na parte de trás. No American Express é o código de quatro dígitos, impresso na frente. O CVV é uma medida de segurança para garantir que você está em posse do cartão.", + "credit_card_cvv_invalid_error": "O CVV deve ser válido", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "O CVV é obrigatório", + "credit_card_expiration_invalid_error": "A data de vencimento deve ser uma data futura válida no formato MM/YY", + "credit_card_expiration_label": "Vencimento", + "credit_card_expiration_date_label": "Data de validade", + "credit_card_expiration_required_error": "A data de vencimento é obrigatória", + "credit_card_expiration_placeholder_text": "MM/AA", + "credit_card_name_label": "Nome no cartão", + "credit_card_name_required_error": "O nome completo é obrigatório", + "credit_card_number_invalid_error": "O número do cartão de crédito deve ser válido", + "credit_card_number_label": "Número do cartão de crédito", + "credit_card_number_last_four": "Insira o número do cartão {cardType} terminando em {lastFour}", + "credit_card_number_required_error": "O número de cartão de crédito é obrigatório", + "credit_card_number_mismatch_error": "O número do cartão inserido não corresponde ao cartão armazenado na sua conta", + "credit_debit_card_text": "Cartão de crédito/débito", + "digitalriver_dropin_error": "Ocorreu um erro no processamento do seu pagamento. Tente novamente ou entre em contato conosco.", + "digitalriver_checkout_error": "Ocorreu um problema na finalização da compra; confira os dados e tente novamente; ou procure o atendimento ao cliente", + "digitalriver_checkout_error_title": "Erro ao processar a solicitação.", + "digitalriver_display_name_text": "Adicione um método de pagamento", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "O Humm não pode processar o pagamento do pedido; selecione outro método de pagamento.", + "klarna_continue_action": "Continuar com o Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Continuar com o Openpay", + "orbital_continue_action": "Comprar", + "orbital_description_text": "Pague com a sua conta do ChasePay", + "payment_cancelled": "O pagamento foi cancelado", + "payment_error": "Ocorreu um erro no processamento do seu pagamento. Tente novamente.", + "payment_error_heading": "O pagamento não foi realizado", + "payment_heading": "Pagamento", + "payment_invalid_error_heading": "Pagamento indisponível", + "payment_method_disabled_error": "O método de pagamento selecionado não é mais válido. Clique em OK para ver os métodos de pagamento mais atuais.", + "payment_method_error": "Resposta do provedor de pagamento: {message}", + "payment_method_invalid_error": "Há um problema no processamento do seu pagamento. Entre em contato conosco para receber ajuda ou escolha outro método de pagamento.", + "payment_method_unavailable_error": "Este provedor de pagamento está temporariamente indisponível. Tente novamente mais tarde.", + "payment_not_required_text": "Não é necessário fazer o pagamento deste pedido.", + "paypal_continue_action": "Prosseguir com o PayPal", + "paypal_credit_continue_action": "Prosseguir com o PayPal Credit", + "paypal_credit_description_text": "Compre agora, pague ao longo do tempo", + "paypal_description_text": "Pague com a sua conta do PayPal", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Pagar depois", + "place_order_action": "Comprar", + "place_order_error": "Ocorreu um erro ao fazer o seu pedido. Entre em contato conosco.", + "place_order_error_heading": "Não foi possível fazer o pedido", + "postal_code_label": "Código postal", + "ideal_bic_required": "É necessário selecionar um emissor para fazer o pedido", + "instrument_text": "Cartões de crédito armazenados", + "instrument_add_card_action": "Use outro cartão", + "instrument_default_ending_in_text": "Cartão terminando em {endingIn}", + "instrument_ending_in_text": "{cardTitle} terminando em {endingIn}", + "instrument_expired_text": "vencido em {expiryDate}", + "instrument_expires_text": "Vence em {expiryDate}", + "instrument_manage_button": "gerenciar", + "instrument_manage_modal_confirmation_action": "Sim, excluir", + "instrument_manage_modal_confirmation_label": "Deseja mesmo excluir essa forma de pagamento armazenada?", + "instrument_manage_modal_title_text": "Gerenciar métodos de pagamento armazenados", + "instrument_manage_modal_empty_text": "Você não tem nenhum método de pagamento armazenado.", + "instrument_manage_table_header_ending_in_text": "Terminando em", + "instrument_manage_table_header_expiry_date_text": "Data de vencimento", + "instrument_manage_table_header_payment_method_text": "Forma de pagamento", + "instrument_manage_delete_server_error": "Ocorreu um erro na tentativa de excluir esse método de pagamento armazenado, tente novamente.", + "instrument_manage_delete_auth_error": "Ocorreu um problema na autorização da sua solicitação. Tente entrar novamente", + "instrument_manage_delete_client_error": "Ocorreu um erro na tentativa de excluir o método de pagamento armazenado: o método de pagamento não existe mais ou não pode ser excluído.", + "instrument_save_payment_method_label": "Salvar este cartão para as próximas transações", + "instrument_save_as_default_payment_method_label": "Usar este cartão como método de pagamento padrão para as próximas transações", + "account_instrument_add_action": "Use outro cartão", + "account_instrument_save_payment_method_label": "Salvar esta conta para as próximas transações", + "account_instrument_save_as_default_payment_method_label": "Usar esta conta como método de pagamento padrão para as próximas transações", + "account_instrument_text": "Contas armazenadas", + "account_instrument_new_shipping_address": "Percebemos que este é um novo endereço de entrega.

Por segurança, será necessário vincular novamente a sua conta do PayPal quando enviar para um endereço pela primeira vez ou se o endereço de entrega tiver sido editado recentemente.

", + "instrument_trusted_shipping_address_text": "Esta etapa de segurança adicional é aplicada ao seu cartão quando você envia para um endereço pela primeira vez ou se o endereço de entrega tiver sido editado recentemente.", + "instrument_trusted_shipping_address_title_text": "Insira novamente o número do seu cartão para autorizar esta transação.", + "quadpay_continue_action": "Prosseguir com o Zip", + "quadpay_display_name_text": "Pagar em 4 parcelas (Quadpay)", + "ppsdk_continue_action": "Continue com o {methodName}", + "select_your_bank": "Selecione seu banco", + "sepa_account_number": "Número da conta (IBAN)", + "sepa_account_number_required": "É necessário informar o número da sua conta (IBAN).", + "sepa_bic": "BIC", + "sepa_bic_length": "O BIC deve ter 8 ou 11 caracteres", + "sepa_mandate_required": "Você deve aceitar o formulário de mandato.", + "sezzle_display_name_text": "Pagar depois 0% de juros.", + "stripe_sepa_display_name_text": "Débito direto por Sepa.", + "stripe_sepa_mandate_disclaimer": "Ao informar o IBAN e confirmar este pagamento, você autoriza (A) {storeUrl} e o Stripe, nosso prestador de serviços de pagamento, a enviar instruções ao seu banco para debitar sua conta e (B) o seu banco a debitar sua conta de acordo com essas instruções. Você tem direito ao reembolso do seu banco de acordo com os termos e condições do seu contrato com o seu banco. O reembolso deve ser solicitado dentro de oito semanas a partir da data em que a sua conta foi debitada.", + "tax_provider_unavailable": "O imposto sobre vendas não foi calculado. Tente novamente. Se não der certo, procure nossa equipe de suporte para concluir a finalização da compra.", + "vco_name_text": "Click to pay", + "visa_checkout_continue_action": "Continue com o Click to pay", + "zip_continue_action": "Prosseguir com o Zip", + "zip_name_text": "Zip", + "zip_display_name_text": "Own it Now, Pay Later", + "errors": { + "additional_action_required": "Dar prosseguimento a mais ações.", + "authorization_expired": "A autorização para esta transação expirou.", + "authorization_revoked": "A autorização para esta transação foi revogada.", + "call_issuer": "Houve um problema no processamento do cartão. Entre em contato com o emissor do seu cartão.", + "captured_transaction": "O pagamento deste pedido já foi feito.", + "card_declined": "O pagamento foi recusado. Tente outro cartão.", + "card_error": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "card_replaced": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "connection_error": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "duplicate_transaction": "Esta é uma transação em duplicidade. Entre em contato conosco para confirmar seu pedido. Não tente efetuar o pagamento novamente.", + "expired_card": "Seu cartão expirou. Tente novamente com um cartão válido.", + "gateway_error": "Ocorreu um erro no servidor. Tente novamente mais tarde.", + "general_error": "Erro no processamento da solicitação de pagamento.", + "hosted_form_error": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "incorrect_address": "Não foi possível confirmar seu endereço de cobrança. Confira o seu endereço de cobrança e tente novamente.", + "incorrect_amount": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "incorrect_cvc": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "incorrect_number": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "incorrect_zip": "Não foi possível confirmar seu endereço de cobrança. Confira o seu endereço de cobrança e tente novamente.", + "insufficient_funds": "O pagamento foi recusado. Entre em contato com o seu banco.", + "invalid_address": "Não foi possível confirmar seu endereço de cobrança. Confira o seu endereço de cobrança e tente novamente.", + "invalid_amount": "Ocorreu um erro no processamento do seu pagamento. Tente novamente ou entre em contato conosco.", + "invalid_authorization_code": "Ocorreu um erro no processamento do seu pagamento. Tente novamente ou entre em contato conosco.", + "invalid_create_instrument_request": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_cvc": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "invalid_email_address": "Não foi possível processar o pagamento porque foi informado um email inválido com a transação.", + "invalid_expiry_date": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "invalid_expiry_month": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_expiry_year": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_gateway": "O gateway não é válido.", + "invalid_gateway_options": "As opções de gateway são inválidas.", + "invalid_instrument": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_issuer": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_number": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "invalid_payment_request": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "invalid_request_error": "Estamos com dificuldades para processar a sua transação. Entre em contato conosco ou tente novamente mais tarde.", + "invalid_user_authentication": "Ocorreu um erro no processamento do seu pagamento. Entre em contato conosco.", + "invalid_zip": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "journal_error": "Ocorreu um erro no servidor. Tente novamente mais tarde.", + "lost_or_stolen_card": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "missing_test_mode": "Não foi possível processar a solicitação porque foram informados dados inválidos com a transação.", + "not_found": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "payment_config_error": "Ocorreu um erro no servidor. Tente novamente mais tarde.", + "payment_config_not_found": "Ocorreu um erro no servidor. Tente novamente mais tarde.", + "pending_review": "Sua transação foi autorizada, mas está sendo retida para revisão pelo comerciante.", + "pickup_card": "Não é possível utilizar o seu cartão para efetuar este pagamento. Entre em contato com o emissor do seu cartão ou experimente usar outro cartão.", + "processing_error": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "provider_configuration_error": "O provedor de pagamento do comerciante não está configurado corretamente.", + "refund_timelimit_expired": "O prazo para reembolso desta transação expirou.", + "refunded_transaction": "Esta transação já foi reembolsada.", + "request_timeout": "Não foi possível processar o pagamento porque o tempo expirou. Tente novamente.", + "required_field": "Não foi possível confirmar seu pagamento. Verifique as informações do seu cartão e tente novamente.", + "server_error": "Ocorreu um erro no processamento do seu pagamento e não foi possível concluir o seu pedido. Tente novamente.", + "store_instrument_failed": "Não foi possível processar a solicitação. Tente novamente.", + "stored_payment_instrument_not_found": "Não foi possível encontrar este instrumento de pagamento armazenado. Tente outra opção de pagamento.", + "three_d_secure_declined": "Houve um problema com o seu pagamento, confira seus dados de pagamento ou entre em contato com o emissor do cartão.", + "three_d_secure_failed": "O pagamento não foi realizado. Tente novamente ou utilize outra opção de pagamento.", + "three_d_secure_required": "É necessário realizar uma autenticação extra para processar seu pagamento. Entre em contato conosco.", + "token_error": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "transaction_declined": "Seu pagamento foi recusado. Tente novamente.", + "transaction_rejected": "O pagamento foi recusado. Tente novamente.", + "unauthorized": "Estamos com dificuldades para processar a sua transação. Tente novamente mais tarde.", + "unsupported_currency": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "unsupported_instrument": "Não foi possível confirmar os detalhes do seu cartão. Veja se as informações dele estão corretas e tente novamente.", + "unsupported_request": "Não foi possível processar o pagamento porque foram informados dados inválidos com a transação.", + "user_authorization_error": "Ocorreu um erro no processamento do seu pagamento. Entre em contato conosco.", + "vaulting_service_unavailable": "O serviço de armazenamento de dados de cartões não está disponível no momento.", + "voided_transaction": "Não foi possível processar seu pagamento porque a transação já tinha sido anulada. Tente novamente ou entre em contato conosco." + } + }, + "redeemable": { + "applied_text": "Aplicado", + "apply_action": "Aplicar", + "apply_store_credit_after_action": "crédito da loja no pedido", + "apply_store_credit_before_action": "Aplicar", + "code_invalid_error": "O vale-presente ou o código do cupom é inválido", + "code_label": "vale-presente ou código do cupom", + "code_required_error": "Digite o vale-presente ou o código do cupom", + "coupon_location_error": "O seu endereço de entrega não atende aos requisitos de localização do código de cupom que você inseriu.", + "coupon_min_order_total": "Seu pedido não atende ao total mínimo para aplicação do código do cupom.", + "coupon_text": "Cupom", + "gift_certificate_remaining_text": "restante", + "gift_certificate_text": "Vale-presente", + "remove_action": "Remover", + "store_credit_available_text": "No momento, a sua conta tem um total de {storeCredit} de crédito disponível na loja", + "toggle_action": "Cupom/vale-presente" + }, + "remote": { + "browser_unsupported": "A forma de pagamento selecionada exige o uso de outro navegador. Selecione outra forma de pagamento.", + "connection_error": "A conexão com a finalização de compra remota foi recusada, tente mais tarde.", + "continue_with_text": "Ou prossiga com", + "payment_method_error": "Ocorreu um erro na busca da sua forma de pagamento remota. Tente novamente.", + "select_different_card_action": "Selecione outro cartão", + "session_error": "Sua sessão remota expirou. Acesse novamente.", + "shipping_address_error": "Ocorreu um erro na busca do seu endereço de entrega remoto. Tente novamente.", + "sign_in_action": "Entrar em {providerName}", + "sign_out_action": "Sair de {providerName}", + "sign_out_after_action": "para ver outras formas de pagamento", + "sign_in_required_error": "Acesso remoto obrigatório antes do pagamento" + }, + "shipping": { + "cart_change_error": "Foi detectada uma atualização do seu carrinho de compras e seus custos de envio disponíveis foram atualizados. Selecione novamente uma forma de envio para prosseguir.", + "enter_shipping_address_text": "Insira um endereço de entrega para ver os preços de envio", + "order_comment_label": "Comentários sobre o pedido", + "assign_item_error": "Ocorreu um erro na atribuição do item ao endereço. Tente novamente", + "assign_item_invalid_address_error_heading": "Endereço inválido", + "assign_item_invalid_address_error": "O endereço selecionado não é válido. Acesse a página da sua conta e atualize-a.", + "unassign_item_error": "Ocorreu um erro no cancelamento da atribuição do item ao endereço.", + "save_shipping_address_error": "Ocorreu um erro ao salvar o endereço de envio na sua cotação. Tente novamente.", + "save_shipping_option_error": "Ocorreu um erro ao salvar a cotação do envio no seu pedido. Tente novamente.", + "select_shipping_address_text": "Selecione um endereço de entrega para ver os preços de envio", + "shipping_address_heading": "Endereço de entrega", + "multishipping_address_heading": "Selecione o local para onde enviar cada item", + "multishipping_address_heading_guest": "Entre primeiro", + "multishipping_guest_intro": "Para enviar seus itens para vários endereços você precisa", + "multishipping_guest_sign_in": "entrar na sua conta", + "multishipping_guest_create": "ou criar uma conta para poder prosseguir.", + "ship_to_multi": "Enviar para vários endereços", + "ship_to_single": "Enviar para um único endereço", + "shipping_heading": "Envio", + "shipping_method_label": "Método de envio:", + "shipping_option_expired_error": "O preço de envio que você cotou não é mais válido. Clique em OK para ver os preços de envio mais atualizados.", + "shipping_option_expired_heading": "Seu preço de envio foi atualizado", + "view_shipping_options_action": "Ver outras opções" + }, + "social": { + "share_action": "Compartilhar", + "share_heading": "Conte aos seus amigos sobre a sua compra!", + "tweet_action": "Tuíte" + }, + "spam_protection": { + "verify_action": "Clique aqui para confirmar que você é humano e poder prosseguir." + }, + "privacy_policy": { + "required_error": "Por gentileza, concorde com a Política de Privacidade.", + "label": "Sim, eu concordo com a política de privacidade.", + "heading": "Política de privacidade" + }, + "terms_and_conditions": { + "agreement_required_error": "Por gentileza, concorde com os termos e condições", + "agreement_text": "Sim, eu concordo com os termos e condições acima.", + "agreement_with_link_text": "Sim, eu concordo com os termos e condições.", + "terms_and_conditions_heading": "Termos e condições" + }, + "order_confirmation": { + "order_number_text": "O número do seu pedido é {orderNumber}", + "order_pending_review_text": "Seu pedido foi enviado para nós, mas está aguardando o pagamento no momento. Assim que recebermos o pagamento do seu pedido ele será concluído. Se você já tiver informado os detalhes de pagamento, processaremos o seu pedido manualmente e enviaremos um email quando ele for concluído.", + "order_pending_status_text": "Recebemos o seu pedido e estamos processando o seu pagamento. Quando o pagamento for confirmado, seu pedido será concluído. Enviaremos um email para você quando ele for concluído. Lembre-se de que este processo pode demorar alguns minutos dependendo do tempo de processamento do método que você escolheu. Se tiver alguma dúvida sobre a sua compra, envie um email para {supportEmail}.", + "order_incomplete_status_text": "Recebemos o seu pedido e o pagamento. Seu pedido está sendo processado pelo nosso sistema. Lembre-se de que o processamento pode demorar alguns minutos. Se tiver alguma dúvida sobre a sua compra, envie um e-mail para {supportEmail}.", + "order_with_downloadable_digital_items_text": "Você pode baixar suas compras digitais clicando nos links desta página ou acessando sua conta a qualquer momento. Há também um link para download no seu email de confirmação, que deve chegar em breve.", + "order_with_support_number_text": "Enviaremos um email contendo as informações sobre a sua compra. Se tiver alguma dúvida sobre a sua compra, envie um email para {supportEmail} ou ligue para nós pelo número {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "Assim que recebermos o seu pagamento, enviaremos um e-mail de confirmação com um link para baixar suas compras digitais.", + "order_without_support_number_text": "Enviaremos um email contendo as informações sobre a sua compra. Se tiver alguma dúvida sobre a sua compra, envie um email para {supportEmail}.", + "thank_you_customer_heading": "Obrigado {name}!", + "thank_you_heading": "Obrigado!", + "continue_shopping": "Continuar comprando »", + "order_status_update_facebook_messenger_heading": "Receba atualizações imediatas do seu pedido no Messenger", + "mandate_link_text": "Mandato de {provider}", + "boleto_link_text": "Boleto bancário", + "oxxo_link_text": "Bilhete do OXXO", + "sepa_link_text": "Ordem de débito direto do SEPA" + } + } +} diff --git a/assets/json/sv.json b/assets/json/sv.json new file mode 100644 index 000000000..219121a4e --- /dev/null +++ b/assets/json/sv.json @@ -0,0 +1,472 @@ +{ + "optimized_checkout": { + "address": { + "address_line_1_label": "Adress", + "address_line_1_required_error": "Adress krävs", + "address_line_2_label": "Lägenhet/svit/byggnad", + "address_line_2_required_error": "Lägenhet/svit/byggnad måste anges", + "address_not_recognized_heading": "Vi kände inte igen din adress", + "consignment_address_updated_text": "Varan har tilldelats den nya adressen.", + "city_label": "Stad", + "city_required_error": "Stad krävs", + "company_name_label": "Företagsnamn", + "company_name_required_error": "Företag måste anges", + "confirm_address_action": "Fortsätt med aktuell adress", + "confirm_address_text": "Vi kunde inte hitta en träff för adressen du angav. Bekräfta adressen.", + "country_label": "Land", + "country_required_error": "Land krävs", + "custom_required_error": "{label} måste anges", + "custom_min_error": "{label} ska vara större än {min}", + "custom_max_error": "{label} ska vara mindre än {max}", + "invalid_characters_error": "{label} innehåller ogiltiga tecken", + "custom_valid_error": "{label} är inte giltig", + "edit_address_action": "Redigera adress", + "enter_address_action": "Ange en ny adress", + "add_address_heading": "Lägg till adress", + "save_address_action": "Spara adress", + "first_name_label": "Förnamn", + "first_name_required_error": "Förnamn krävs", + "last_name_label": "Efternamn", + "last_name_required_error": "Efternamn krävs", + "phone_number_label": "Telefonnummer", + "phone_number_required_error": "Telefonnummer krävs", + "postal_code_label": "Postnummer", + "postal_code_required_error": "Postnummer krävs", + "save_in_addressbook": "Spara den här adressen i min adressbok.", + "select_country_action": "Välj ett land", + "select_state_action": "Välj en delstat", + "state_label": "Stat/provins", + "state_required_error": "Stat/provins krävs", + "select": "Välj ", + "select_all": "Alla", + "select_none": "Inget" + }, + "billing": { + "billing_address_heading": "Fakturaadress", + "billing_heading": "fakturering", + "save_billing_address_error": "Ett fel inträffade när faktureringsadressen skulle sparas i din prisoffert. Försök igen.", + "billing_address_amazon": "Samma som den faktureringsadress som du har angett i ditt Amazon konto.", + "billing_address_amazonpay": "Hanteras av Amazon Pay", + "use_shipping_address_label": "Min faktureringsadress är densamma som min leveransadress." + }, + "cart": { + "billed_amount_text": "*Du debiteras och faktureras {total} ({code}) för denna beställning.", + "based_on_currency_text": "Baserat på {total} {code}", + "cart_heading": "Beställningssammanfattning", + "digital_item_text": "Digital vara", + "discount_text": "Rabatt", + "downloads_action": "Gå till nedladdningar", + "edit_cart_action": "Redigera kundvagn", + "estimated_total_text": "Beräknad totalsumma", + "free_text": "Gratis", + "gift_certificate_text": "Presentkort", + "handling_text": "Hantering", + "item_count_text": "{count, plural, one{1 objekt} other{# objekt} }", + "print_action": "Skriva ut", + "remaining_text": "återstående", + "remove_action": "Ta bort", + "see_all_action": "Visa alla", + "see_less_action": "Se mindre", + "shipping_text": "Frakt", + "gift_wrapping_text": "Paketomslag", + "show_details_action": "Visa detaljer", + "store_credit_text": "Butikskredit", + "subtotal_text": "Delsumma", + "taxes_text": "Moms", + "total_text": "Total", + "empty_cart_message": "Din kundvagn är tom, du omdirigeras. Klicka här om din webbläsare inte omdirigerar dig." + }, + "common": { + "cancel_action": "Annullera", + "close_action": "Stäng", + "continue_action": "Fortsätt", + "edit_action": "Redigera", + "delete_action": "Radera", + "error_heading": "Något gick fel", + "leave_warning": "Är du säker på att du vill lämna? Data som du har angett kanske inte sparas.", + "loading_text": "Laddar", + "ok_action": "Ok", + "error_code": "Felkod:", + "request_id": "Förfrågans-ID:", + "optional_text": "(Frivillig)", + "unavailable_error": "Kassan är tillfälligt otillgänglig. Försök igen senare.", + "unavailable_heading": "Kassan är tillfälligt otillgänglig", + "unstable_network_error": "Det verkar som att det tar för lång tid för servern att svara, vilket kan bero på dålig anslutning eller ett fel med våra servrar. Försök igen om en stund.", + "order_loading_error": "Det gick inte att läsa in beställningen. Försök igen.", + "order_fatal_error_heading": "Beställningen kunde inte genomföras", + "order_fatal_error_extra": "Välj en annan betalningsmetod eller kontakta oss för ytterligare hjälp.", + "go_back": "Gå tillbaka", + "show_more": "Visa mer" + }, + "customer": { + "checkout_as_guest_text": "Betalar du som gäst? Du kommer att kunna spara dina uppgifter för att skapa ett konto hos oss senare.", + "continue_as_guest_action": "Fortsätt som gäst", + "create_account_action": "Skapa konto", + "continue": "Fortsätt", + "set_password_action": "Spara lösenord", + "required_error": "{label} måste anges", + "min_error": "{label} ska vara större än {min}", + "max_error": "{label} ska vara mindre än {max}", + "invalid_characters_error": "{label} innehåller ogiltiga tecken", + "create_account_error": "Ett fel inträffade när ditt konto skulle skapas. Försök igen.", + "create_address_error": "Ett fel inträffade dock när din adress skulle sparas i din adressbok.", + "create_account_requirements_error_heading": "Lösenordet uppfyller inte kraven", + "create_account_success": "Ditt konto har skapats.", + "set_password_success": "Ditt lösenord har sparats.", + "create_account_text": "Skapa ett konto för att betala snabbare nästa gång", + "set_password_text": "Ställ in ett lösenord för att betala snabbare nästa gång", + "account_created_text": "Ett konto har skapats åt dig, men du måste ställa in ett lösenord för att logga in.", + "create_account_to_continue_text": "Har du inte ett konto? Skapa ett konto för att fortsätta.", + "guest_could_login": "Det verkar som att du har ett konto. Logga in med {email} för att betala snabbare.", + "guest_must_login": "Det verkar som att du har ett konto. Logga in för att fortsätta med {email} eller använd en annan e-postadress.", + "guest_temporary_disabled": "Gästkassan är tillfälligt inaktiverad. Logga in eller skapa ett konto för att fortsätta.", + "customer_heading": "Kund", + "email_invalid_error": "E-postadressen måste vara giltig", + "email_label": "E-postadress", + "email_required_error": "E-postadress måste anges", + "forgot_password_action": "Glömt ditt lösenord?", + "guest_customer_text": "Gästkund", + "guest_subscribe_to_newsletter_text": "Prenumerera på vårt nyhetsbrev.", + "guest_marketing_consent": "Jag vill få uppdateringar och erbjudanden.", + "login_action": "Logga in nu", + "login_text": "Har du redan ett konto?", + "email_in_use_text": "Det finns redan ett konto för {email}. Ange en annan e-postadress eller logga in.", + "unknown_email_in_use_text": "Det finns redan ett konto för den angivna e-postadressen. Ange en annan e-postadress eller logga in.", + "guest_could_login_change_email": "Är du inte {email}? Ändra e-postadressen.", + "password_confirmation_error": "Lösenorden stämmer inte överens", + "password_confirmation_label": "Bekräfta lösenord", + "password_confirmation_required_error": "Detta fält krävs", + "password_label": "Lösenord", + "password_letter_required_error": "Lösenordet måste innehålla en bokstav", + "password_minimum_character_label": "minimiteckengräns, skiftlägeskänsligt", + "password_number_required_error": "Lösenordet måste innehålla en siffra", + "password_over_maximum_length_error": "Lösenordet är för långt", + "password_required_error": "Lösenord krävs", + "password_under_minimum_length_error": "Lösenordet är för kort", + "reset_password_before_login_error": "Det går inte att logga in för tillfället. Du får ett e-postmeddelande inom fem minuter med instruktioner för att återställa ditt lösenord. Om du inte får meddelandet kan du kontrollera din skräppostmapp eller kontakta oss för ytterligare hjälp.", + "returning_customer_text": "Återvändande kund", + "sign_in_action": "Logga in", + "sign_in_error": "E-postadressen eller lösenordet som du angav är ogiltigt.", + "sign_in_throttled_error": "Du har försökt logga in för många gånger. Vänta tio sekunder innan du försöker logga in igen.", + "sign_out_action": "Logga ut", + "sign_out_error": "Ett fel inträffade vid utloggningen. Försök igen.", + "subscribe_to_newsletter_text": "Ja, jag vill få uppdateringar.", + "suggestion_text": "Det ser ut som om du har ett konto hos {provider}. För snabb utcheckning, fortsätt med {providerFlow}.", + "suggestion_action": "{providerFlow}" + }, + "login_email": { + "error_server": "Vi kunde inte skicka en inloggningslänk till dig. Försök igen.", + "error_not_found": "Den angivna e-postadressen är inte kopplad till något konto. Försök med en annan e-postadress.", + "sent_header": "Kolla din inkorg", + "sent_text": "Vi har skickat ett e-postmeddelande till {email} med en inloggningslänk. Den går ut om {minutes} minuter – kontrollera skräppostmappen om du inte ser meddelandet i inkorgen.", + "text": "Ange e-postadressen som är kopplad till ditt konto. Vi skickar en inloggningslänk till dig.", + "header": "Skriv in din e-postadress", + "header_with_email": "Bekräfta din e-postadress", + "link": "Skicka en inloggningslänk till mig i stället.", + "use_another_email": "Använd en annan e-postadress", + "send": "Skicka", + "error_temporary_disabled": "Funktionen med inloggningslänk är tillfälligt otillgänglig. Logga in genom att ange ditt lösenord.", + "resend_link": "Fick du inte e-postmeddelandet? Skicka länken igen", + "use_password_link": " eller logga in med ditt lösenord i stället." + }, + "embedded_checkout": { + "unsupported_error": "Följande betalningsmetoder stöds inte av inbyggd kassa: {methods}. Kontakta oss för att få hjälp." + }, + "payment": { + "affirm_name_text": "Bekräfta", + "affirm_display_name_text": "Betala med tiden", + "affirm_body_text": "Du kommer att omdirigeras till Affirm för att slutföra ditt köp på ett säkert sätt. Fyll i grundläggande information och få ett beslut i realtid. Din kreditvärdighet påverkas inte när du kontrollerar din behörighet.", + "afterpay_name_text": "Afterpay", + "afterpay_description": "Betala med Afterpay", + "amazon_continue_action": "Fortsätt med Amazon", + "amazonpay_continue_action": "Fortsätt med Amazon Pay", + "amazon_name_text": "Amazon Pay", + "barclaycard_continue_action": "Fortsätt", + "bluesnap_v2_continue_action": "Fortsätt", + "bolt_create_account_label": "Kom ihåg min information med Bolt", + "bolt_create_account_disclaimer": "Genom att kryssa i ovan godkänner du att skapa ett Bolt-konto enligt vilkoren och integritetspolicy.", + "bolt_name_text": "Bolt", + "braintreevisacheckout_continue_action": "Fortsätt med Visa Checkout", + "ccavenuemars_description_text": "Fortsätt med CCAvenue", + "chasepay_continue_action": "Fortsätt med Chase Pay", + "chasepay_name_text": "Chase Pay", + "chasepay_edit_card": "Redigera kort", + "chasepay_logout": "Logga ut från Chase Pay", + "chasepay_fail_load": "Chase Pay kunde inte läsas in", + "checkoutcom_document_label_boleto": "CPF eller CNPJ", + "checkoutcom_document_label_oxxo": "CURP", + "checkoutcom_document_label_qpay": "Nationellt ID", + "checkoutcom_document_invalid_error_boleto": "CPF eller CNPJ måste bestå av mellan 11 och 14 tecken", + "checkoutcom_document_invalid_error_oxxo": "CURP får bestå av högst 18 tecken", + "checkoutcom_document_invalid_error_qpay": "Nationellt ID får bestå av högst 32 tecken", + "checkoutcom_fawry_customer_mobile_invalid_error": "Mobilnumret måste vara giltigt", + "checkoutcom_fawry_customer_mobile_label": "Mobilnummer", + "checkoutcom_fawry_customer_email_invalid_error": "E-postadressen måste vara giltig", + "checkoutcom_fawry_customer_email_label": "E-post", + "checkoutcom_sepa_creditor_title": "Borgenär", + "checkoutcom_sepa_creditor_id": "Borgenärens ID: {creditorId}", + "checkoutcom_sepa_debtor_title": "Gäldenär", + "checkoutcom_sepa_mandate_disclaimer": "Genom att acceptera detta mandatformulär godkänner du att {creditorName} skickar instruktioner till din bank att debitera ditt konto och att din bank debiterar ditt konto i enlighet med dessa instruktioner. Du har rätt till återbetalning från din bank enligt villkoren i ditt avtal med banken. Återbetalning måste krävas inom åtta veckor från det datum då ditt konto debiterades.", + "checkoutcom_sepa_payment_type": "Betalningstyp: engångs (ej återkommande)", + "clearpay_name_text": "Clearpay", + "credit_card_text": "Kreditkort", + "credit_card_customer_code_label": "Kundkod", + "credit_card_cvv_help_text": "För VISA och Mastercard är CVV en tresiffrig kod tryckt på baksidan. För American Express är det den fyrsiffriga koden som är tryckt på framsidan. CVV är en säkerhetsåtgärd för att säkerställa att du har tillgång till kortet.", + "credit_card_cvv_invalid_error": "CVV måste vara giltigt", + "credit_card_cvv_label": "CVV", + "credit_card_cvv_required_error": "CVV är obligatoriskt", + "credit_card_expiration_invalid_error": "Utgångsdatum måste vara ett giltigt framtida datum i MM/ÅÅ-format", + "credit_card_expiration_label": "Utgång", + "credit_card_expiration_date_label": "Utgångsdatum", + "credit_card_expiration_required_error": "Utgångsdatum krävs", + "credit_card_expiration_placeholder_text": "MM/ÅÅ", + "credit_card_name_label": "Namn på kort", + "credit_card_name_required_error": "Fullständigt namn krävs", + "credit_card_number_invalid_error": "Kreditkortsnummer måste vara giltigt", + "credit_card_number_label": "Kreditkortsnummer", + "credit_card_number_last_four": "Ange kortnummer för {cardType} som slutar på {lastFour}", + "credit_card_number_required_error": "Kreditkortsnummer är obligatoriskt", + "credit_card_number_mismatch_error": "Det angivna kortnumret matchar inte det kort som är lagrat på ditt konto", + "credit_debit_card_text": "Kredit-/betalkort", + "digitalriver_dropin_error": "Det uppstod ett fel när betalningen bearbetades. Försök igen eller kontakta oss.", + "digitalriver_checkout_error": "Ett fel uppstod i kassan. Vänligen kontrollera dina uppgifter och försök igen, eller kontakta kundtjänst.", + "digitalriver_checkout_error_title": "Fel vid bearbetning av begäran.", + "digitalriver_display_name_text": "Vänligen välj din betalningsmetod", + "google_pay_name_text": "Google Pay", + "humm_not_processable_error": "Humm kan inte behandla din betalning för denna beställning. Vänligen välj en annan betalningsmetod.", + "klarna_continue_action": "Fortsätt med Klarna", + "klarna_name_text": "Klarna", + "masterpass_name_text": "Masterpass", + "opy_continue_action": "Fortsätt med Openpay", + "orbital_continue_action": "Beställ", + "orbital_description_text": "Betala med ditt ChasePay-konto", + "payment_cancelled": "Betalningen har avbrutits", + "payment_error": "Ett fel inträffade när din betalning behandlades. Försök igen.", + "payment_error_heading": "Betalningen misslyckades", + "payment_heading": "Betalning", + "payment_invalid_error_heading": "Betalningen är inte tillgänglig", + "payment_method_disabled_error": "Den valda betalningsmetoden är inte längre giltig. Klicka på OK för att se de senaste betalningsmetoderna.", + "payment_method_error": "Svar från betalningsleverantör: {message}", + "payment_method_invalid_error": "Det gick inte att behandla din betalning. Kontakta oss för att få hjälp eller välj en annan betalningsmetod.", + "payment_method_unavailable_error": "Denna betalningsleverantör är tillfälligt otillgänglig. Försök igen senare.", + "payment_not_required_text": "Betalning krävs inte för denna beställning.", + "paypal_continue_action": "Fortsätt med PayPal", + "paypal_credit_continue_action": "Fortsätt med PayPal Credit", + "paypal_credit_description_text": "Köp nu, betala med tiden", + "paypal_description_text": "Betala med ditt PayPal-konto", + "paypal_name_text": "PayPal", + "paypal_credit_name_text": "Betala senare", + "place_order_action": "Beställ", + "place_order_error": "Beställningen kunde inte genomföras. Kontakta oss.", + "place_order_error_heading": "Beställningen kunde inte genomföras", + "postal_code_label": "Postnummer", + "ideal_bic_required": "Du måste välja en utfärdare för att genomföra beställningen", + "instrument_text": "Lagrade kreditkort", + "instrument_add_card_action": "Använd ett annat kort", + "instrument_default_ending_in_text": "Kort som slutar på {endingIn}", + "instrument_ending_in_text": "{cardTitle} slutar på {endingIn}", + "instrument_expired_text": "Gick ut {expiryDate}", + "instrument_expires_text": "Går ut {expiryDate}", + "instrument_manage_button": "hantera", + "instrument_manage_modal_confirmation_action": "Ja, radera", + "instrument_manage_modal_confirmation_label": "Är du säker på att du vill radera den här lagrade betalningsmetoden?", + "instrument_manage_modal_title_text": "Hantera lagrade betalningsmetoder", + "instrument_manage_modal_empty_text": "Du har inga lagrade betalningsmetoder.", + "instrument_manage_table_header_ending_in_text": "Slutar på", + "instrument_manage_table_header_expiry_date_text": "Förfallodatum", + "instrument_manage_table_header_payment_method_text": "Betalnings metod", + "instrument_manage_delete_server_error": "Det inträffade ett fel när den lagrade betalningsmetoden skulle raderas. Försök igen.", + "instrument_manage_delete_auth_error": "Det gick inte att auktorisera din förfrågan. Försök logga in igen", + "instrument_manage_delete_client_error": "Det inträffade ett fel när den lagrade betalningsmetoden skulle raderas – betalningsmetoden finns inte längre eller kan inte raderas.", + "instrument_save_payment_method_label": "Spara detta kort för framtida transaktioner", + "instrument_save_as_default_payment_method_label": "Använd detta kort som standardbetalningsmetod för framtida transaktioner", + "account_instrument_add_action": "Använd ett annat konto", + "account_instrument_save_payment_method_label": "Spara detta konto för framtida transaktioner", + "account_instrument_save_as_default_payment_method_label": "Använd detta konto som standardbetalningsmetod för framtida transaktioner", + "account_instrument_text": "Lagrade konton", + "account_instrument_new_shipping_address": "Vi märkte att detta är en ny leveransadress.

Av säkerhetsskäl måste du länka ditt PayPal-konto igen när du skickar till en adress för första gången eller om leveransadressen redigerades nyligen.

", + "instrument_trusted_shipping_address_text": "Detta ytterligare säkerhetssteg tillämpas på ditt kort när du skickar till en adress för första gången eller om leveransadressen redigerades nyligen.", + "instrument_trusted_shipping_address_title_text": "Ange ditt kortnummer igen för att auktorisera transaktionen.", + "quadpay_continue_action": "Fortsätt med Zip", + "quadpay_display_name_text": "Betala i 4 delbetalningar (Quadpay)", + "ppsdk_continue_action": "Fortsätt med {methodName}", + "select_your_bank": "Välj din bank", + "sepa_account_number": "Kontonummer (IBAN)", + "sepa_account_number_required": "Du måste ange ditt kontonummer (IBAN)", + "sepa_bic": "BIC", + "sepa_bic_length": "BIC måste bestå av 8 eller 11 tecken", + "sepa_mandate_required": "Du måste acceptera mandatformuläret", + "sezzle_display_name_text": "Betala senare. 0 % ränta.", + "stripe_sepa_display_name_text": "Sepa-direktdebitering.", + "stripe_sepa_mandate_disclaimer": "Genom att tillhandahålla ditt IBAN och bekräfta denna betalning godkänner du (A) att {storeUrl} och Stripe, vår betalningstjänsteleverantör, skickar instruktioner till din bank att debitera ditt konto och (B) att din bank debiterar ditt konto i enlighet med dessa instruktioner. Du har rätt till återbetalning från din bank enligt villkoren i ditt avtal med banken. Återbetalning måste krävas inom åtta veckor från det datum då ditt konto debiterades.", + "tax_provider_unavailable": "Moms kunde inte beräknas. Vänligen försök igen. Om det inte lyckas, vänligen kontakta vårt supportteam för att genomföra köpet.", + "vco_name_text": "Klicka för att betala", + "visa_checkout_continue_action": "Gå vidare med Click to pay", + "zip_continue_action": "Fortsätt med Zip", + "zip_name_text": "Post", + "zip_display_name_text": "Få den nu, betala senare", + "errors": { + "additional_action_required": "Vänligen fortsätt med ytterligare åtgärder.", + "authorization_expired": "Behörigheten för denna transaktion har utgått.", + "authorization_revoked": "Auktorisationen för denna transaktion har återkallats.", + "call_issuer": "Det gick inte att bearbeta ditt kort. Kontakta din kortutfärdare.", + "captured_transaction": "Beställningen har redan betalats.", + "card_declined": "Betalningen nekades. Försök med ett annat kort.", + "card_error": "Dina kortuppgifter kunde inte verifieras. Kontrollera dem och försök igen.", + "card_replaced": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "connection_error": "Vi kan inte bearbeta din transaktion. Försök igen senare.", + "duplicate_transaction": "Detta är en dubblettransaktion. Kontakta oss för att bekräfta din beställning. Försök inte betala igen.", + "expired_card": "Ditt kort har gått ut. Försök igen med ett giltigt kort.", + "gateway_error": "Någonting gick fel på servern. Vänligen försök igen vid ett senare tillfälle.", + "general_error": "Fel vid bearbetning av betalningsförfrågan.", + "hosted_form_error": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "incorrect_address": "Din faktureringsadress kunde inte verifieras. Kontrollera din faktureringsadress och försök igen.", + "incorrect_amount": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "incorrect_cvc": "Dina kortuppgifter kunde inte verifieras. Kontrollera dem och försök igen.", + "incorrect_number": "Dina kortuppgifter kunde inte verifieras. Kontrollera dem och försök igen.", + "incorrect_zip": "Din faktureringsadress kunde inte verifieras. Kontrollera din faktureringsadress och försök igen.", + "insufficient_funds": "Betalningen nekades. Kontakta din bank.", + "invalid_address": "Din faktureringsadress kunde inte verifieras. Kontrollera din faktureringsadress och försök igen.", + "invalid_amount": "Det uppstod ett fel när betalningen bearbetades. Försök igen eller kontakta oss.", + "invalid_authorization_code": "Det uppstod ett fel när betalningen bearbetades. Försök igen eller kontakta oss.", + "invalid_create_instrument_request": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "invalid_cvc": "Dina kortuppgifter kunde inte verifieras. Kontrollera dem och försök igen.", + "invalid_email_address": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "invalid_expiry_date": "Dina kortuppgifter kunde inte verifieras. Kontrollera dem och försök igen.", + "invalid_expiry_month": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "invalid_expiry_year": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "invalid_gateway": "Gatewayen är giltig.", + "invalid_gateway_options": "Gatewayalternativen är ogiltiga.", + "invalid_instrument": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "invalid_issuer": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "invalid_number": "Dina kortuppgifter kunde inte verifieras. Kontrollera dem och försök igen.", + "invalid_payment_request": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "invalid_request_error": "Vi kan inte bearbeta din transaktion. Kontakta oss eller försök igen senare.", + "invalid_user_authentication": "Det uppstod ett fel när betalningen bearbetades. Kontakta oss.", + "invalid_zip": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "journal_error": "Någonting gick fel på servern. Vänligen försök igen vid ett senare tillfälle.", + "lost_or_stolen_card": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "missing_test_mode": "Det gick inte att bearbeta förfrågan eftersom ogiltiga uppgifter levererades med transaktionen.", + "not_found": "Vi kan inte bearbeta din transaktion. Försök igen senare.", + "payment_config_error": "Någonting gick fel på servern. Vänligen försök igen vid ett senare tillfälle.", + "payment_config_not_found": "Någonting gick fel på servern. Vänligen försök igen vid ett senare tillfälle.", + "pending_review": "Din transaktion har godkänts, men den hålls för granskning av handlaren.", + "pickup_card": "Ditt kort kan inte användas för att göra denna betalning. Kontakta din kortutfärdare eller försök använda ett annat kort.", + "processing_error": "Vi kan inte bearbeta din transaktion. Försök igen senare.", + "provider_configuration_error": "Säljarens betalningsleverantör är inte korrekt konfigurerad.", + "refund_timelimit_expired": "Tidsgränsen för återbetalning av denna transaktion har utgått.", + "refunded_transaction": "Denna transaktion har redan återbetalats.", + "request_timeout": "Din betalning kan inte bearbetas eftersom den tog för lång tid. Försök igen.", + "required_field": "Din betalning kunde inte verifieras. Kontrollera dina kortuppgifter och försök igen.", + "server_error": "Det uppstod ett fel när din betalning skulle bearbetas och din beställning kunde inte slutföras. Försök igen.", + "store_instrument_failed": "Det gick inte att behandla begäran. Vänligen försök igen.", + "stored_payment_instrument_not_found": "Det lagrade betalningsinstrumentet kunde inte hittas. Vänligen försök med ett annat betalningsalternativ.", + "three_d_secure_declined": "Det har uppstått ett problem med din betalning. Kontrollera dina betalningsuppgifter eller kontakta din kortutgivare", + "three_d_secure_failed": "Betalningen misslyckades. Vänligen försök igen, eller använd ett annat betalningsalternativ.", + "three_d_secure_required": "Ytterligare autentisering krävs för att bearbeta din betalning. Kontakta oss.", + "token_error": "Vi kan inte bearbeta din transaktion. Försök igen senare.", + "transaction_declined": "Din betalning nekades. Vänligen försök igen.", + "transaction_rejected": "Betalningen nekades. Vänligen försök igen.", + "unauthorized": "Vi kan inte bearbeta din transaktion. Försök igen senare.", + "unsupported_currency": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "unsupported_instrument": "Dina kortuppgifter kunde inte verifieras. Kontrollera dem och försök igen.", + "unsupported_request": "Det gick inte att bearbeta betalningen eftersom att ogiltigt e-postmeddelande levererades med transaktionen.", + "user_authorization_error": "Det uppstod ett fel när betalningen bearbetades. Kontakta oss.", + "vaulting_service_unavailable": "Tjänsten för Vaulting är för närvarande inte tillgänglig.", + "voided_transaction": "Det gick inte att bearbeta din betalning eftersom transaktionen redan har annullerats. Försök igen eller kontakta oss." + } + }, + "redeemable": { + "applied_text": "Applicerad", + "apply_action": "Tillämpa", + "apply_store_credit_after_action": "lagra kredit för beställning", + "apply_store_credit_before_action": "Tillämpa", + "code_invalid_error": "Presentkortet eller kupongkoden är ogiltig", + "code_label": "Presentkort eller kupongkod", + "code_required_error": "Ange ett presentkort eller en kupongkod", + "coupon_location_error": "Din leveransadress uppfyller inte platskraven för den kupongkod du angav.", + "coupon_min_order_total": "Din beställning uppfyller inte den minsta summan för att denna kupongkod ska tillämpas.", + "coupon_text": "Kupong", + "gift_certificate_remaining_text": "återstående", + "gift_certificate_text": "Presentkort", + "remove_action": "Ta bort", + "store_credit_available_text": "Ditt konto har för närvarande totalt {storeCredit} tillgängliga butikskrediter", + "toggle_action": "Kupong/presentkort" + }, + "remote": { + "browser_unsupported": "Den valda betalningsmetoden kräver en annan webbläsare. Välj en annan betalningsmetod.", + "connection_error": "Anslutning till fjärrkassan nekades, försök senare.", + "continue_with_text": "Eller fortsätt med", + "payment_method_error": "Det gick inte att hämta din fjärrbetalningsmetod. Försök igen.", + "select_different_card_action": "Välj ett annat kort", + "session_error": "Din fjärrsession har gått ut. Logga in igen.", + "shipping_address_error": "Det gick inte att hämta din fjärrleveransadress. Försök igen.", + "sign_in_action": "Logga in på {providerName}", + "sign_out_action": "Logga ut från {providerName}", + "sign_out_after_action": "för att visa andra betalningsmetoder", + "sign_in_required_error": "Fjärrinloggning krävs före betalning" + }, + "shipping": { + "cart_change_error": "En uppdatering av din kundvagn har upptäckts och dina tillgängliga fraktkostnader har uppdaterats. Välj en leveransmetod igen för att fortsätta.", + "enter_shipping_address_text": "Ange en leveransadress för att se fraktkostnader", + "order_comment_label": "Beställningskommentarer", + "assign_item_error": "Ett fel inträffade när varan skulle tilldelas till adressen. Försök igen", + "assign_item_invalid_address_error_heading": "Ogiltig adress", + "assign_item_invalid_address_error": "Den valda adressen är inte giltig. Gå till din kontosida och uppdatera den.", + "unassign_item_error": "Ett fel inträffade när tilldelningen av varan till adressen skulle tas bort.", + "save_shipping_address_error": "Ett fel inträffade när leveransadressen skulle sparas i din prisoffert. Försök igen.", + "save_shipping_option_error": "Ett fel inträffade när fraktkostnaden skulle sparas för din beställning. Försök igen.", + "select_shipping_address_text": "Välj en leveransadress för att se fraktkostnader", + "shipping_address_heading": "Leveransadress", + "multishipping_address_heading": "Välj vart du vill skicka varje vara", + "multishipping_address_heading_guest": "Logga in först", + "multishipping_guest_intro": "För att skicka dina varor till flera adresser måste du", + "multishipping_guest_sign_in": "logga in på ditt konto", + "multishipping_guest_create": "eller skapa ett konto innan du fortsätter.", + "ship_to_multi": "Skicka till flera adresser", + "ship_to_single": "Skicka till en enda adress", + "shipping_heading": "Frakt", + "shipping_method_label": "Fraktmetod:", + "shipping_option_expired_error": "Fraktpriset du såg tidigare är inte längre giltigt. Klicka på OK för att se de senaste fraktpriserna.", + "shipping_option_expired_heading": "Ditt fraktpris har uppdaterats", + "view_shipping_options_action": "Se andra alternativ" + }, + "social": { + "share_action": "Dela med sig", + "share_heading": "Berätta för dina vänner vad du har köpt!", + "tweet_action": "Tweet" + }, + "spam_protection": { + "verify_action": "Klicka här för att verifiera att du är en människa innan du fortsätter." + }, + "privacy_policy": { + "required_error": "Godkänn sekretesspolicyn.", + "label": "Ja, jag godkänner sekretesspolicyn.", + "heading": "Sekretesspolicy" + }, + "terms_and_conditions": { + "agreement_required_error": "Godkänn villkoren", + "agreement_text": "Ja, jag godkänner ovanstående villkor.", + "agreement_with_link_text": "Ja, jag godkänner villkoren.", + "terms_and_conditions_heading": "Villkor" + }, + "order_confirmation": { + "order_number_text": "Ditt beställningsnummer är {orderNumber}", + "order_pending_review_text": "Din beställning har skickats till oss, men du har inte betalat än. Din beställning slutförs när vi tar emot betalningen. Om du redan har angett betalningsuppgifter kommer vi att behandla din beställning manuellt och skicka ett e-postmeddelande till dig när den är slutförd.", + "order_pending_status_text": "Vi har fått din beställning och behandlar din betalning. Din beställning slutförs när betalningen har verifierats. Vi skickar ett e-postmeddelande till dig när det är klart. Observera att den här processen kan ta några minuter beroende på behandlingstiderna för din valda metod. Om du har några frågor om ditt köp kan du skicka ett meddelande till oss på {supportEmail}.", + "order_incomplete_status_text": "Vi har fått din beställning och betalning. Din beställning behandlas nu av vårt system. Observera att behandlingen kan ta några minuter. Om du har några frågor om ditt köp kan du skicka ett meddelande till oss på {supportEmail}.", + "order_with_downloadable_digital_items_text": "Du kan ladda ner dina digitala köp genom att klicka på länkarna på den här sidan, eller genom att logga in på ditt konto när som helst. Det finns också en nedladdningslänk i din e-postbekräftelse, som du bör få inom kort.", + "order_with_support_number_text": "Ett e-postmeddelande kommer att skickas med information om ditt köp. Om du har några frågor om ditt köp kan du skicka ett meddelande till oss på {supportEmail} eller ringa oss på {supportPhoneNumber}.", + "order_without_downloadable_digital_items_text": "När vi har fått din betalning skickar vi ett bekräftelsemeddelande med en länk för att ladda ner dina digitala köp.", + "order_without_support_number_text": "Ett e-postmeddelande kommer att skickas med information om ditt köp. Om du har några frågor om ditt köp kan du skicka ett meddelande till oss på {supportEmail}.", + "thank_you_customer_heading": "Tack, {name}!", + "thank_you_heading": "Tack!", + "continue_shopping": "Fortsätt handla »", + "order_status_update_facebook_messenger_heading": "Få omedelbara uppdateringar om din beställning till Messenger", + "mandate_link_text": "Mandat för {provider}", + "boleto_link_text": "Boleto Bancário-ticket", + "oxxo_link_text": "OXXO-ticket", + "sepa_link_text": "SEPA-direktdebiteringsmandat" + } + } +} diff --git a/configuration/config.yml b/configuration/config.yml new file mode 100644 index 000000000..c00f51dca --- /dev/null +++ b/configuration/config.yml @@ -0,0 +1,1160 @@ +swagger: '2.0' +info: + title: config.json + description: The main configuration file for Stencil Themes. + version: 1.0.0 +host: api.example.com +schemes: + - https +definitions: + configJson: + type: object + minProperties: 0 + description: The main configuration file for Stencil Themes. + title: config.json + properties: + name: + type: string + example: Starlight + description: The theme name. + version: + type: string + example: '"2.6.0"' + description: The themeʼs version number. + meta: + type: object + description: BigCommerce will use this metadata to list themes in Theme Marketplace. + required: + - price + - documentation_url + - author_name + - author_email + - author_support_url + - composed_image + - features + properties: + price: + type: integer + example: 15000 + description: 'Price, in cents, to purchase this theme in Theme Marketplace.' + documentation_url: + type: string + example: '"https://support.bigcommerce.com/articles/Public/Cornerstone-Theme-Manual"' + description: URL of the themeʼs developer documentation. + author_name: + type: string + example: 'eCommerce Themes, Inc.' + description: Name of the developer or partner creating the theme. + author_email: + type: string + description: Contact email address for the developer or partner creating the theme. + example: '"contact@thethemecollective.com"' + author_support_url: + type: string + example: '"support@thethemecollective.com"' + description: Support URL for the developer or partner creating the theme. + composed_image: + type: string + example: '"starlight_mosaic.png"' + description: |- + File name for a composed/mosaic screenshot of all variations of the theme, to appear on the "My Themes" page of purchased themes. The file-name value is arbitrary, but it must match the name of a file located in the `theme‑name/meta/` subdirectory. + + The actual file’s resolution must be 600 x 760 pixels (horizontal x vertical). + features: + type: array + description: |- + This should be an array of exact feature names supported in the theme. The "Default/Examples"column lists the complete namespace. At least one of the values listed there must be present. + These values are used as metadata for Theme Marketplace searches. + The `"customized_check_out"` value has a second function: It must be present if you want to enable [Optimized One-Page Checkout](https://support.bigcommerce.com/articles/Public/Optimized-Single-Page-Checkout) for your theme. + enum: + - fully_responsive + - mega_navigation + - multi_tiered_sidebar_menu + - masonry_design + - frontpage_slideshow + - quick_add_to_cart + - switchable_product_view + - product_comparison_table + - complex_search_filtering + - customizable_product_selector + - cart_suggested_products + - free_customer_support + - free_theme_upgrades + - high_res_product_images + - product_filtering + - advanced_quick_view + - product_showcase + - persistent_cart + - one_page_check_out + - product_videos + - google_amp + - customized_checkout + - enhanced_ecommerce + - csrf_protection + - account_payment_methods_v2 + items: + type: string + css_compiler: + type: string + example: '"scss"' + default: SCSS + description: Name of the themeʼs CSS preprocessor. + autoprefixer_cascade: + type: boolean + description: Denotes whether to enable the Autoprefixer CSS postprocessor in order to add vendor prefixes to CSS rules. + example: true + autoprefixer_browsers: + type: array + example: + - '> 1%' + - last 2 versions + - Firefox ESR + description: 'Which legacy browsers [Autoprefixer](https://github.com/postcss/autoprefixer) should support, specified in [Browserslist](https://github.com/ai/browserslist) query format.' + items: + type: string + settings: + type: object + description: |- + Display-oriented key names and values that you can arbitrarily set for your theme. Handlebars accesses the combined settings as the context variable `{{theme_settings}}`. + + Theme variations also have their own `settings` sections. Values that you set at the variation level will override global values that you set here (for corresponding key names and within the scope of that variation). + + If you want to create a custom variable to use in Handlebars, either add it within this theme-level `settings` section, or add it down in a variation-level `settings` section. + + You would access your arbitrarily named custom variable in Handlebars as `{{theme_settings.}}`. + + Here is an example of a custom variable in the default theme’s `config.json`: + + `"settings": { "homepage_featured_products_count": 6, + }` + + Here is the corresponding front matter in `home.html` that calls this variable. (Note that this is pure YAML – the `{{...}}` used to reference `config.json` variables within pages’ front matter **do not** constitute a Handlebars statement) + + ``` + + products: + featured: + limit: {{theme_settings.homepage_featured_products_count}} + + ``` + properties: + homepage_new_products_count: + type: integer + example: 12 + description: Number of products to include in home page’s New Products section. + homepage_featured_products_count: + type: integer + description: Number of products to include in home page’s Featured Products section. + example: 4 + homepage_top_products_count: + type: integer + description: Number of products to include in home page’s Top Products section. + example: 4 + homepage_show_carousel: + type: boolean + example: true + description: Defines whether to display an image carousel on the home page. + homepage_stretch_carousel_images: + type: boolean + example: false + homepage_new_products_column_count: + type: integer + example: 4 + description: Number of New Products columns to include on the home-page. + homepage_featured_products_column_count: + type: integer + description: Number of Featured Products columns to include on the home-page. + example: 3 + homepage_top_products_column_count: + type: integer + description: Number of Top Products columns to include on the home-page. + example: 3 + homepage_blog_posts_count: + type: integer + example: 3 + productpage_videos_count: + type: integer + example: 8 + productpage_reviews_count: + type: integer + example: 9 + productpage_related_products_count: + type: integer + example: 10 + productpage_similar_by_views_count: + type: integer + example: 10 + categorypage_products_per_page: + type: integer + example: 12 + shop_by_price_visibility: + type: boolean + example: true + brandpage_products_per_page: + type: integer + example: 12 + searchpage_products_per_page: + type: integer + example: 12 + show_product_quick_view: + type: boolean + example: true + show_powered_by: + type: boolean + example: true + shop_by_brand_show_footer: + type: boolean + example: true + show_copyright_footer: + type: boolean + example: true + show_accept_amex: + type: boolean + example: true + show_accept_discover: + type: boolean + example: true + show_accept_mastercard: + type: boolean + example: true + show_accept_paypal: + type: boolean + example: true + show_accept_visa: + type: boolean + example: true + show_product_details_tabs: + type: boolean + show_product_reviews_tabs: + type: boolean + show_product_weight: + type: boolean + show_product_dimensions: + type: boolean + product_list_display_mode: + type: string + logo-position: + type: string + logo_size: + type: string + logo_fontSize: + type: integer + logo-font: + type: string + brand_size: + type: string + gallery_size: + type: string + productgallery_size: + type: string + product_size: + type: string + productview_thumb_size: + type: string + productthumb_size: + type: string + thumb_size: + type: string + zoom_size: + type: string + blog_size: + type: string + default_image_brand: + type: string + default_image_product: + type: string + default_image_gift_certificate: + type: string + body-font: + type: string + headings-font: + type: string + fontSize-root: + type: integer + fontSize-h1: + type: integer + fontSize-h2: + type: integer + fontSize-h3: + type: integer + fontSize-h4: + type: integer + fontSize-h5: + type: integer + fontSize-h6: + type: integer + applePay-button: + type: string + color-textBase: + type: string + color-textBase--hover: + type: string + color-textBase--active: + type: string + color-textSecondary: + type: string + color-textSecondary--hover: + type: string + color-textSecondary--active: + type: string + color-textLink: + type: string + color-textLink--hover: + type: string + color-textLink--active: + type: string + color-textHeading: + type: string + color-primary: + type: string + color-primaryDark: + type: string + color-primaryDarker: + type: string + color-primaryLight: + type: string + color-secondary: + type: string + color-secondaryDark: + type: string + color-secondaryDarker: + type: string + color-error: + type: string + color-errorLight: + type: string + color-info: + type: string + color-infoLight: + type: string + color-success: + type: string + color-successLight: + type: string + color-warning: + type: string + color-warningLight: + type: string + color-black: + type: string + color-white: + type: string + color-whitesBase: + type: string + color-grey: + type: string + color-greyDarkest: + type: string + color-greyDarker: + type: string + color-greyDark: + type: string + color-greyMedium: + type: string + color-greyLight: + type: string + color-greyLighter: + type: string + color-greyLightest: + type: string + button--default-color: + type: string + button--default-colorHover: + type: string + button--default-colorActive: + type: string + button--default-borderColor: + type: string + button--default-borderColorHover: + type: string + button--default-borderColorActive: + type: string + button--primary-color: + type: string + button--primary-colorHover: + type: string + button--primary-colorActive: + type: string + button--primary-backgroundColor: + type: string + button--primary-backgroundColorHover: + type: string + button--primary-backgroundColorActive: + type: string + button--disabled-color: + type: string + button--disabled-backgroundColor: + type: string + button--disabled-borderColor: + type: string + icon-color: + type: string + icon-color-hover: + type: string + button--icon-svg-color: + type: string + icon-ratingEmpty: + type: string + icon-ratingFull: + type: string + carousel-bgColor: + type: string + carousel-title-color: + type: string + carousel-description-color: + type: string + carousel-dot-color: + type: string + carousel-dot-color-active: + type: string + carousel-dot-bgColor: + type: string + carousel-arrow-color: + type: string + carousel-arrow-bgColor: + type: string + carousel-arrow-borderColor: + type: string + card-title-color: + type: string + card-title-color-hover: + type: string + card-figcaption-button-background: + type: string + card-figcaption-button-color: + type: string + card--alternate-backgroundColor: + type: string + card--alternate-borderColor: + type: string + card--alternate-color--hover: + type: string + form-label-font-color: + type: string + input-font-color: + type: string + input-border-color: + type: string + input-border-color-active: + type: string + input-bg-color: + type: string + input-disabled-bg: + type: string + select-bg-color: + type: string + select-arrow-color: + type: string + checkRadio-color: + type: string + checkRadio-backgroundColor: + type: string + checkRadio-borderColor: + type: string + alert-backgroundColor: + type: string + alert-color: + type: string + alert-color-alt: + type: string + storeName-color: + type: string + body-bg: + type: string + header-backgroundColor: + type: string + footer-backgroundColor: + type: string + navUser-color: + type: string + navUser-color-hover: + type: string + navUser-dropdown-backgroundColor: + type: string + navUser-dropdown-borderColor: + type: string + navUser-indicator-backgroundColor: + type: string + navPages-color: + type: string + navPages-color-hover: + type: string + navPages-subMenu-backgroundColor: + type: string + navPages-subMenu-separatorColor: + type: string + dropdown--quickSearch-backgroundColor: + type: string + dropdown--wishList-backgroundColor: + type: string + blockquote-cite-font-color: + type: string + container-border-global-color-base: + type: string + container-fill-base: + type: string + container-fill-dark: + type: string + label-backgroundColor: + type: string + label-color: + type: string + overlay-backgroundColor: + type: string + loadingOverlay-backgroundColor: + type: string + pace-progress-backgroundColor: + type: string + spinner-borderColor-dark: + type: string + spinner-borderColor-light: + type: string + hide_content_navigation: + type: boolean + optimizedCheckout-header-backgroundColor: + type: string + optimizedCheckout-show-backgroundImage: + type: boolean + optimizedCheckout-backgroundImage: + type: string + optimizedCheckout-backgroundImage-size: + type: string + optimizedCheckout-show-logo: + type: string + optimizedCheckout-logo: + type: string + optimizedCheckout-logo-size: + type: string + optimizedCheckout-logo-position: + type: string + optimizedCheckout-headingPrimary-color: + type: string + optimizedCheckout-headingPrimary-font: + type: string + optimizedCheckout-headingSecondary-color: + type: string + optimizedCheckout-headingSecondary-font: + type: string + optimizedCheckout-body-backgroundColor: + type: string + optimizedCheckout-colorFocus: + type: string + optimizedCheckout-contentPrimary-color: + type: string + optimizedCheckout-contentPrimary-font: + type: string + optimizedCheckout-contentSecondary-color: + type: string + optimizedCheckout-contentSecondary-font: + type: string + optimizedCheckout-buttonPrimary-font: + type: string + optimizedCheckout-buttonPrimary-color: + type: string + optimizedCheckout-buttonPrimary-colorHover: + type: string + optimizedCheckout-buttonPrimary-colorActive: + type: string + optimizedCheckout-buttonPrimary-backgroundColor: + type: string + optimizedCheckout-buttonPrimary-backgroundColorHover: + type: string + optimizedCheckout-buttonPrimary-backgroundColorActive: + type: string + optimizedCheckout-buttonPrimary-borderColor: + type: string + optimizedCheckout-buttonPrimary-borderColorHover: + type: string + optimizedCheckout-buttonPrimary-borderColorActive: + type: string + optimizedCheckout-buttonPrimary-borderColorDisabled: + type: string + optimizedCheckout-buttonPrimary-backgroundColorDisabled: + type: string + optimizedCheckout-buttonPrimary-colorDisabled: + type: string + optimizedCheckout-formChecklist-backgroundColor: + type: string + optimizedCheckout-formChecklist-color: + type: string + optimizedCheckout-formChecklist-borderColor: + type: string + optimizedCheckout-formChecklist-backgroundColorSelected: + type: string + optimizedCheckout-buttonSecondary-font: + type: string + optimizedCheckout-buttonSecondary-color: + type: string + optimizedCheckout-buttonSecondary-colorHover: + type: string + optimizedCheckout-buttonSecondary-colorActive: + type: string + optimizedCheckout-buttonSecondary-backgroundColor: + type: string + optimizedCheckout-buttonSecondary-borderColor: + type: string + optimizedCheckout-buttonSecondary-backgroundColorHover: + type: string + optimizedCheckout-buttonSecondary-backgroundColorActive: + type: string + optimizedCheckout-buttonSecondary-borderColorHover: + type: string + optimizedCheckout-buttonSecondary-borderColorActive: + type: string + optimizedCheckout-link-color: + type: string + optimizedCheckout-link-font: + type: string + optimizedCheckout-discountBanner-backgroundColor: + type: string + optimizedCheckout-discountBanner-textColor: + type: string + optimizedCheckout-discountBanner-iconColor: + type: string + optimizedCheckout-orderSummary-backgroundColor: + type: string + optimizedCheckout-orderSummary-borderColor: + type: string + optimizedCheckout-step-backgroundColor: + type: string + optimizedCheckout-step-textColor: + type: string + optimizedCheckout-form-textColor: + type: string + optimizedCheckout-formField-borderColor: + type: string + optimizedCheckout-formField-textColor: + type: string + optimizedCheckout-formField-shadowColor: + type: string + optimizedCheckout-formField-placeholderColor: + type: string + optimizedCheckout-formField-backgroundColor: + type: string + optimizedCheckout-formField-errorColor: + type: string + optimizedCheckout-formField-inputControlColor: + type: string + optimizedCheckout-step-borderColor: + type: string + optimizedCheckout-header-borderColor: + type: string + optimizedCheckout-header-textColor: + type: string + optimizedCheckout-loadingToaster-backgroundColor: + type: string + optimizedCheckout-loadingToaster-textColor: + type: string + optimizedCheckout-link-hoverColor: + type: string + product_sale_badges: + type: string + color_badge_product_sale_badges: + type: string + color_text_product_sale_badges: + type: string + color_hover_product_sale_badges: + type: string + restrict_to_login: + type: boolean + swatch_option_size: + type: string + social_icon_placement_top: + type: boolean + social_icon_placement_bottom: + type: string + geotrust_ssl_common_name: + type: string + geotrust_ssl_seal_size: + type: string + navigation_design: + type: string + price_ranges: + type: boolean + pdp-price-label: + type: string + pdp-sale-price-label: + type: string + pdp-non-sale-price-label: + type: string + pdp-retail-price-label: + type: string + read_only_files: + type: array + items: + type: string + resources: + type: object + properties: + cart: + type: boolean + bulk_discount_rates: + type: boolean + shop_by_brand: + type: object + properties: + limit: + type: integer + variations: + type: array + items: + type: object + properties: + name: + type: string + id: + type: string + meta: + type: object + properties: + desktop_screenshot: + type: string + mobile_screenshot: + type: string + description: + type: string + demo_url: + type: string + optimized_for: + type: array + enum: + - arts_crafts + - animals_pets + - automotive_industrial + - electronics_computers + - fashion_jewelry + - food_beverage + - gifts_specialty + - health_beauty + - home_garden + - books_entertainment + - sports_recreation + - toys_games + - multi_purpose + - chrome_firefox_safari_ie_10 + - mobile_tablet_desktop + - sales_discounts + - wholesale + - single_product + - large_catalog + - mobile + - clothing + - cosmetics + - home_appliances + - home_furnishings + - movies + - music + - digital_downloads + - outdoor_sports + - hunting_fishing + - video_games + items: + type: string + industries: + type: array + enum: + - arts_crafts + - animals_pets + - automotive_industrial + - electronics_computers + - fashion_jewelry + - food_beverage + - gifts_specialty + - health_beauty + - home_garden + - books_entertainment + - sports_recreation + - toys_games + items: + type: string + required: + - desktop_screenshot + - mobile_screenshot + - description + - demo_url + - optimized_for + images: + type: object + settings: + type: object + properties: + homepage_featured_products_count: + type: integer + homepage_featured_products_column_count: + type: integer + body-font: + type: string + headings-font: + type: string + color-textBase: + type: string + color-textBase--hover: + type: string + color-textBase--active: + type: string + color-textSecondary: + type: string + color-textSecondary--hover: + type: string + color-textSecondary--active: + type: string + color-textLink: + type: string + color-textLink--hover: + type: string + color-textLink--active: + type: string + color-textHeading: + type: string + color-primary: + type: string + color-primaryDark: + type: string + color-primaryDarker: + type: string + color-primaryLight: + type: string + color-secondary: + type: string + color-secondaryDark: + type: string + color-secondaryDarker: + type: string + color-error: + type: string + color-errorLight: + type: string + color-info: + type: string + color-infoLight: + type: string + color-success: + type: string + color-successLight: + type: string + color-warning: + type: string + color-warningLight: + type: string + color-black: + type: string + color-white: + type: string + color-whitesBase: + type: string + color-grey: + type: string + color-greyDarkest: + type: string + color-greyDarker: + type: string + color-greyDark: + type: string + color-greyMedium: + type: string + color-greyLight: + type: string + color-greyLighter: + type: string + color-greyLightest: + type: string + button--default-color: + type: string + button--default-colorHover: + type: string + button--default-colorActive: + type: string + button--default-borderColor: + type: string + button--default-borderColorHover: + type: string + button--default-borderColorActive: + type: string + button--primary-color: + type: string + button--primary-colorHover: + type: string + button--primary-colorActive: + type: string + button--primary-backgroundColor: + type: string + button--primary-backgroundColorHover: + type: string + button--primary-backgroundColorActive: + type: string + button--disabled-color: + type: string + button--disabled-backgroundColor: + type: string + button--disabled-borderColor: + type: string + icon-color: + type: string + icon-color-hover: + type: string + button--icon-svg-color: + type: string + icon-ratingEmpty: + type: string + icon-ratingFull: + type: string + carousel-bgColor: + type: string + carousel-title-color: + type: string + carousel-description-color: + type: string + carousel-dot-color: + type: string + carousel-dot-color-active: + type: string + carousel-dot-bgColor: + type: string + carousel-arrow-color: + type: string + carousel-arrow-bgColor: + type: string + carousel-arrow-borderColor: + type: string + card-title-color: + type: string + card-title-color-hover: + type: string + card-figcaption-button-background: + type: string + card-figcaption-button-color: + type: string + card--alternate-backgroundColor: + type: string + card--alternate-borderColor: + type: string + card--alternate-color--hover: + type: string + form-label-font-color: + type: string + input-font-color: + type: string + input-border-color: + type: string + input-border-color-active: + type: string + input-bg-color: + type: string + input-disabled-bg: + type: string + select-bg-color: + type: string + select-arrow-color: + type: string + checkRadio-color: + type: string + checkRadio-backgroundColor: + type: string + checkRadio-borderColor: + type: string + alert-backgroundColor: + type: string + alert-color: + type: string + alert-color-alt: + type: string + storeName-color: + type: string + body-bg: + type: string + header-backgroundColor: + type: string + footer-backgroundColor: + type: string + navUser-color: + type: string + navUser-color-hover: + type: string + navUser-dropdown-backgroundColor: + type: string + navUser-dropdown-borderColor: + type: string + navUser-indicator-backgroundColor: + type: string + navPages-color: + type: string + navPages-color-hover: + type: string + navPages-subMenu-backgroundColor: + type: string + navPages-subMenu-separatorColor: + type: string + dropdown--quickSearch-backgroundColor: + type: string + dropdown--wishList-backgroundColor: + type: string + blockquote-cite-font-color: + type: string + container-border-global-color-base: + type: string + container-fill-base: + type: string + container-fill-dark: + type: string + label-backgroundColor: + type: string + label-color: + type: string + overlay-backgroundColor: + type: string + loadingOverlay-backgroundColor: + type: string + pace-progress-backgroundColor: + type: string + spinner-borderColor-dark: + type: string + spinner-borderColor-light: + type: string + optimizedCheckout-header-backgroundColor: + type: string + optimizedCheckout-headingPrimary-color: + type: string + optimizedCheckout-headingPrimary-font: + type: string + optimizedCheckout-headingSecondary-color: + type: string + optimizedCheckout-headingSecondary-font: + type: string + optimizedCheckout-body-backgroundColor: + type: string + optimizedCheckout-colorFocus: + type: string + optimizedCheckout-contentPrimary-color: + type: string + optimizedCheckout-contentPrimary-font: + type: string + optimizedCheckout-contentSecondary-color: + type: string + optimizedCheckout-contentSecondary-font: + type: string + optimizedCheckout-buttonPrimary-font: + type: string + optimizedCheckout-buttonPrimary-color: + type: string + optimizedCheckout-buttonPrimary-colorHover: + type: string + optimizedCheckout-buttonPrimary-colorActive: + type: string + optimizedCheckout-buttonPrimary-backgroundColor: + type: string + optimizedCheckout-buttonPrimary-backgroundColorHover: + type: string + optimizedCheckout-buttonPrimary-backgroundColorActive: + type: string + optimizedCheckout-buttonPrimary-borderColor: + type: string + optimizedCheckout-buttonPrimary-borderColorHover: + type: string + optimizedCheckout-buttonPrimary-borderColorActive: + type: string + optimizedCheckout-buttonPrimary-borderColorDisabled: + type: string + optimizedCheckout-buttonPrimary-backgroundColorDisabled: + type: string + optimizedCheckout-buttonPrimary-colorDisabled: + type: string + optimizedCheckout-formChecklist-backgroundColor: + type: string + optimizedCheckout-formChecklist-color: + type: string + optimizedCheckout-formChecklist-borderColor: + type: string + optimizedCheckout-formChecklist-backgroundColorSelected: + type: string + optimizedCheckout-buttonSecondary-font: + type: string + optimizedCheckout-buttonSecondary-color: + type: string + optimizedCheckout-buttonSecondary-colorHover: + type: string + optimizedCheckout-buttonSecondary-colorActive: + type: string + optimizedCheckout-buttonSecondary-backgroundColor: + type: string + optimizedCheckout-buttonSecondary-borderColor: + type: string + optimizedCheckout-buttonSecondary-backgroundColorHover: + type: string + optimizedCheckout-buttonSecondary-backgroundColorActive: + type: string + optimizedCheckout-buttonSecondary-borderColorHover: + type: string + optimizedCheckout-buttonSecondary-borderColorActive: + type: string + optimizedCheckout-link-color: + type: string + optimizedCheckout-link-font: + type: string + optimizedCheckout-discountBanner-backgroundColor: + type: string + optimizedCheckout-discountBanner-textColor: + type: string + optimizedCheckout-discountBanner-iconColor: + type: string + optimizedCheckout-orderSummary-backgroundColor: + type: string + optimizedCheckout-orderSummary-borderColor: + type: string + optimizedCheckout-step-backgroundColor: + type: string + optimizedCheckout-step-textColor: + type: string + optimizedCheckout-form-textColor: + type: string + optimizedCheckout-formField-borderColor: + type: string + optimizedCheckout-formField-textColor: + type: string + optimizedCheckout-formField-shadowColor: + type: string + optimizedCheckout-formField-placeholderColor: + type: string + optimizedCheckout-formField-backgroundColor: + type: string + optimizedCheckout-formField-errorColor: + type: string + optimizedCheckout-formField-inputControlColor: + type: string + optimizedCheckout-step-borderColor: + type: string + optimizedCheckout-header-borderColor: + type: string + optimizedCheckout-header-textColor: + type: string + optimizedCheckout-loadingToaster-backgroundColor: + type: string + optimizedCheckout-loadingToaster-textColor: + type: string + optimizedCheckout-link-hoverColor: + type: string + color_badge_product_sale_badges: + type: string + color_text_product_sale_badges: + type: string + color_hover_product_sale_badges: + type: string + required: + - name + - id + required: + - name + - version + - meta + - settings + - variations +securityDefinitions: + API Key - 1: + name: API Key + type: apiKey + in: query + API Key - 2: + name: API Key + type: apiKey + in: query +x-extension-1: null +x-extension-2: null diff --git a/docs/api-docs/analytics/bodl-for-storefronts.mdx b/docs/api-docs/analytics/bodl-for-storefronts.mdx new file mode 100644 index 000000000..5bb225f67 --- /dev/null +++ b/docs/api-docs/analytics/bodl-for-storefronts.mdx @@ -0,0 +1,414 @@ +--- +title: Big Open Data Layer for Storefront Analytics +keywords: currency, currencies, analytics, storefronts, bodl, big open data layer, data, scripts, draft order, ga4, GA4, google, events, if, google analytics 4, +--- + +# Big Open Data Layer for Storefront Analytics + +The Big Open Data Layer (shortened as _BODL_, pronounced 'Bottle') is a JavaScript object that simplifies sending data from BigCommerce-hosted storefronts to third-party analytics providers. It gives third-party scripts access to clean, consistent data. BODL makes store sites more efficient by consolidating data of interest and presenting it as a package. Each analytics script does not need to fetch the same data independently. + +BODL is event-based. Scripts can capture accurate storefront data as it exists at the moment a shopper triggers any BODL-supported event. + +This guide illustrates the basics of using BODL data in your integration. This article does the following: +1. Describes the standard BODL schema after a shopper triggers a specified event so that you can see how BODL organizes event data for your integration to capture. +2. Provides an example script that uses the standard BODL object so you can examine BODL properties in the browser console. +3. Gives an example of adding a BODL script to a storefront page using the Scripts API. + +## Prerequisites + +For scripts to successfully use BODL to access storefront data, the following must be true: + +- Enable BODL on the subject storefront using the control panel or the [GraphQL Admin API's Enable data layer mutation](/docs/store-operations/settings/data#enable-data-layer) +- The storefront must use a stencil theme +- If a merchant enables cookie tracking consent on the subject storefront, the shopper must consent to the [appropriate category](#category-of-consent) + +## BODL event schemas + +BODL exposes data when shoppers trigger storefront events. Currently, BODL supports the following storefront events: + +- [Keyword search](#keyword-search) +- [View banner](#view-banner) +- [View product page](#view-product-page-event-schema) +- [View product category](#view-product-category-event-schema) +- [Add product to cart](#add-product-to-cart-event-schema) +- [View cart](#view-cart-event-schema) +- [Remove product from cart](#remove-product-from-cart-event-schema) +- [Start checkout](#start-checkout-event-schema) +- [Add shipping information](#add-shipping-information) +- [Add payment information](#add-payment-information) +- [Purchase order](#purchase-order-event-schema) + +### Keyword search + +When the shopper enters search keywords and clicks Enter or presses the search button, the following fields appear in the BODL object for the `bodl_v1_keyword_search` event: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where the event is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `search_keyword ` | string | Keywords used for the search. | No mapping | + +### View banner + +When a shopper views a storefront banner, the following fields appear in the BODL object for the `bodl_v1_view_banner` event: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where the event is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `banner_id` | string | ID of the banner. | [Get all banners](/docs/rest-content/marketing/banners#get-all-banners)
`id` | +| `banner_name` | string | Banner name. | [Get all banners](/docs/rest-content/marketing/banners#get-all-banners)
`name` | + +### View product category + +When the shopper clicks a button to view the category page for a product, the following fields appear in the BODL object for the `bodl_v1_product_category_viewed` event: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `category_id` | integer | ID of the category. | [Get all categories](/docs/rest-catalog/categories#get-all-categories)
`data.id` | +| `category_name` | string | Name of the category. | [Get all categories](/docs/rest-catalog/categories#get-all-categories)
`data.name` | +| `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `line_items[]` | array of `line_item` objects | Items in the category. | See [line_item](#line_item-object-schema) object for event fields | + +### View product page + +When the shopper clicks a button to view a product page, the following fields appear in the BODL object for the `bodl_v1_product_page_viewed` event: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) for the currency the storefront displays to shoppers. | [Get all currencies](/docs/rest-management/currencies#get-all-currencies)
`currency_code` | +| `product_value` | number | Price of the product before taxes; tax-exclusive price. | [Get prices](/docs/rest-management/pricing/products#get-prices-batch)
`data.calculated_price.tax_exclusive` | +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `line_items[]` | array of `line_item` objects | Item on the product page. | See [line_item](#line_item-object-schema) object for event fields | + +### Add product to cart + +When the shopper clicks a button to add a product to a cart, the following fields appear in the BODL object for the `bodl_v1_cart_product_added` event: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `channel_id` | string | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.cart.currency.code` | +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `line_items[]` | array of `line_item` objects | Items added to the cart. | See [line_item](#line_item-object-schema) object for event fields | +| `product_value` | number | Item price multiplied by quantity. Product default price or, if applicable, the sale price configured in the admin panel, before discounts and coupons are applied. | [Get a cart](/docs/rest-storefront/carts#get-a-cart)
`lineItems.physicalItems.listPrice` or
`lineItems.digitalItems.listPrice`| + +### View cart + +When the shopper clicks a button to view a cart, the following fields appear in the BODL object for the `bodl_v1_cart_viewed` event: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a cart](/docs/rest-storefront/carts#get-a-cart)
`cartAmount` | +| `channel_id` | string | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.cart.currency.code` | +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `line_items[]` | array of `line_item` objects | All items in the cart. | See [line_item](#line_item-object-schema) object for event fields | + +### Remove product from cart + +When the shopper clicks a button to remove a product from the cart, the following fields appear in the BODL object for the `bodl_v1_cart_product_removed` event: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `product_value` | number | Item price multiplied by quantity. Product default price or, if applicable, the sale price configured in the admin panel, before discounts and coupons are applied. | [Get a cart](/docs/rest-storefront/carts#get-a-cart)
`lineItems.physicalItems.listPrice` or
`lineItems.digitalItems.listPrice`| +| `channel_id` | string | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#gset-a-checkout)
`data.cart.currency.code` | +| `line_items[]` | array of `line_item` objects | Items removed from the cart. | See [line_item](#line_item-object-schema) object for event fields | + +### Start checkout + +When the shopper clicks on the button to initiate a checkout process, the following fields appear in the BODL object for the `bodl_v1_begin_checkout` event: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a cart](/docs/rest-storefront/carts#get-a-cart)
`cartAmount` | +| `channel_id` | string | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `coupon_codes[]` | array of strings | Coupon codes applied to the cart. BigCommerce supports only one coupon code per checkout. | [Get a cart](/docs/rest-storefront/carts#get-a-cart)
`coupons.code` | +| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. BigCommerce tracks currency for a cart and not for each line item within the cart. | [Get a cart](/docs/rest-storefront/carts#get-a-cart)
`currency.code` | +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `line_items[]` | array of `line_item` objects | Items that were checked out. | See [line_item](#line_item-object-schema) object for event fields | + +### Add shipping information + +Each time the shopper adds shipping information, the following fields appear in the BODL object for the `bodl_v1_shipping_information_added` event. This event can trigger multiple times for a single order. + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.cart.currency.code` | +| `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout)
`data.cart.cart_amount_inc_tax` | +| `coupon_codes[]` | array of strings | Coupon codes applied to the purchase. BigCommerce supports only one coupon code per checkout. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.cart.coupons.code` | +| `shipping_method` | string | Shipping method, for example, UPS or First Class Mail. | [Get order shipments](/docs/rest-management/orders/order-shipments#get-order-shipments)
`shipping_method` | +| `line_items[]` | array of `line_item` objects | Items that were checked out. | See [line_item](#line_item-object-schema) object for event fields | + +### Add payment information + +Each time the shopper adds payment information, the following fields appear in the BODL object for the `bodl_v1_payment_information_added` event. This event can trigger multiple times for a single order. + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.cart.currency.code` | +| `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout)
`data.cart.cart_amount_inc_tax` | +| `coupon_codes[]` | array of strings | Coupon codes applied to the purchase. BigCommerce supports only one coupon code per checkout. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.cart.coupons.code` | +| `payment_type` | string | Payment type, for example, check or credit card. | [Get an order](/docs/rest-management/orders#get-an-order)
`payment_method` | +| `line_items[]` | array of `line_item` objects | Items that were checked out. | See [line_item](#line_item-object-schema) object for event fields | + +### Purchase order + +When the shopper clicks a button to finalize a purchase, the following fields appear in the BODL object for the `bodl_v1_order_purchased` event: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout)
`data.cart.cart_amount_inc_tax` | +| `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels)
`data.id` | +| `coupon_codes[]` | array of strings | Coupon codes applied to the purchase. BigCommerce supports only one coupon code per order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.cart.coupons.code` | +| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.cart.currency.code` | +| `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | +| `line_items[]` | array of `line_item` objects | Items that were purchased. | See [line_item](#line_item-object-schema) object for event fields | +| `order_id` | integer | Unique order ID generated by BigCommerce. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.orderId` | +| `shipping_cost` | number | Total shipping cost including tax. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout)
`data.shipping_cost_total_inc_tax` | +| `tax` | number | Tax incurred. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.taxTotal` | + +### line_item object schema + +The `line_item` object has many common fields for browser events, including the following fields: + +| Event field | Type | Description | BigCommerce data map | +|:---|:---|:---|:---| +| `base_price` | number | Price of product. Default price in the control panel. The price should include or exclude tax, based on the store settings. | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.price` | +| `brand_name` | string | Brand name. | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.brand_name` | +| `category_names[]` | array of strings | Category names. | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.categories[]` | +| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) for the transaction. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout)
`data.cart.currency.code` | +| `discount` | number | Discount applied to the purchase. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout)
`data.cart.discountAmount` | +| `gift_certificate_id` | string | ID of gift certificate. | [Get a cart](/docs/rest-storefront/carts#get-a-cart)
`lineItems.giftCertificates.id` | +| `gift_certificate_name` | string | Name of gift certificate that appears in the control panel. | [Get a Cart](/docs/rest-storefront/carts#get-a-cart)
`lineItems.giftCertificates.name` | +| `gift_certificate_theme` | string | Theme of gift certificate. | [Get a cart](/docs/rest-storefront/carts#get-a-cart)
`lineItems.giftCertificates.theme` | +| `product_id` | string | ID of the product. | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.id` | +| `product_name` | string | Name of the product. | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.name` | +| `purchase_price` | number | Final price of product that the shopper actually pays before taxes and other charges. Equals the `base_price` unless there is a `sale_price`. The price should include or exclude tax, based on the store settings. | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.price` or
`data.sale_price` | +| `quantity` | integer | Number of items of product purchased. | [Get a cart](/docs/rest-storefront/carts#get-a-cart)
`lineItems.physicalItems.quantity` or
`lineItems.digitalItems.quantity` | +| `retail_price` | number | The retail price of the product. The price should include or exclude tax, based on the store settings. | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.retail_price` | +| `sale_price` | number | Price of product after sale. The price should include or exclude tax, based on the store settings. | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.sale_price` | +| `sku` | string | User-defined SKU for the product or variant (whichever is applied). | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.sku` or `data.variants.sku` | +| `variant_id` | string | ID of the variant. | [Get a product](/docs/rest-catalog/products#get-a-product)
`data.variants.id` | + +## Example implementation + +You can use the [Scripts API](/docs/rest-management/scripts) or control panel [Script Manager](https://support.bigcommerce.com/s/article/Using-Script-Manager) to add scripts to a BigCommerce-hosted storefront. + +Merchants must enable BODL in the store control panel for your script to subscribe to BODL events. Once BODL is enabled, BigCommerce checks every storefront page for the BODL object once per page render. + +### Example script + +To view BODL properties in the browser console, use the following example script: + +```html filename="Log BODL to the browser console" showLineNumbers copy + +``` + + +#### Category of consent +If a merchant enables cookie tracking consent, the shopper must provide consent to the category of consent (`consent_category`) to which the script is set. For more on consent categories, see the [Script Manager](https://support.bigcommerce.com/s/article/Using-Script-Manager) support article. + + +### Scripts API example + +The following is an example request that uses the Scripts API to associate the example script with pages on a storefront. Send a request to the [Create a script](/docs/rest-management/scripts#create-a-script) endpoint. For more, see the [Scripts API article](/docs/integrations/scripts). + +```http filename="Example request: Create a Script" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/content/scripts +X-Auth-Token: {{ACCESS_TOKEN}} //scope should include Checkout Content when adding script to a checkout page +Content-Type: application/json +Accept: application/json + +{ + "name": "BODL script", + "description": "view BODL in the browser console", + "html": "", + "load_method": "default", + "location": "head", + "visibility": "all_pages", //set which pages can access the script + "kind": "script_tag", + "consent_category": "essential", //script is set to a category of consent + "enabled": true, + "channel_id": 2 //storefront channel ID +} +``` + +## Resources + +- [Scripts API article](/docs/integrations/scripts) +- [Scripts API reference](/docs/rest-management/scripts#create-a-script) +- [Scripts Manager support article](https://support.bigcommerce.com/s/article/Using-Script-Manager) diff --git a/docs/api-docs/analytics/data-layer-api.mdx b/docs/api-docs/analytics/data-layer-api.mdx new file mode 100644 index 000000000..6505fac54 --- /dev/null +++ b/docs/api-docs/analytics/data-layer-api.mdx @@ -0,0 +1,161 @@ +--- +title: Data Layer Settings in the GraphQL Admin API +keywords: GA4, ga4, data, graphql, admin, google analytics 4, +--- + +# Data Layer Settings in the GraphQL Admin API + +The GraphQL Admin API's data layer setting allows BigCommerce to send data from BigCommerce-hosted storefronts to third-party analytics providers through [Big Open Data Layer](/docs/integrations/hosted-analytics). Bigcommerce can build native integrations to analytics providers, such as Google Analytics 4, using the data layer. Partners may also build their own integrations using the data layer. In each case, you must first enable the data layer using the GraphQL Admin API. The data layer is enabled at the global level. + +This guide shows you how to use the GraphQL Admin API's data layer queries and mutations. For full schema, see the [GraphQL Admin API reference](/graphql-admin/reference). + +## Prerequisites + +You need a [store-level API account](/docs/start/authentication/api-accounts#store-level-api-accounts) that contains the following [OAuth scopes](/docs/start/authentication/api-accounts#oauth-scopes): + +| UI Name | Permission | Parameter | Description | +|:--------|:-----------|:----------|:------------| +| Information & Settings | modify | `store_v2_information` | View and modify store information and settings | + +For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication). + +## Get data layer + +Send the following query to retrieve whether the data layer is enabled in the store: + + + + + ```http filename="Example query: Get data layer enabled flag" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + settings { + dataSolutions { + isDataLayerEnabled + } + } + } + } + ``` + + + + ```json filename="Example query: Get data layer enabled flag" showLineNumbers copy + { + "data": { + "store": { + "settings": { + "dataSolutions": { + "isDataLayerEnabled": false + } + } + } + } + } + ``` + + + +## Enable data layer + +Send the following mutation to enable the data layer in the store: + + + + + ```http filename="Example mutation: Enable data layer" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation { + settings { + dataSolutions { + updateDataLayer (input: {isDataLayerEnabled: true}) { + dataSolutions { + isDataLayerEnabled + } + } + } + } + } + ``` + + + + ```json filename="Example mutation: Enable data layer" showLineNumbers copy + { + "data": { + "settings": { + "dataSolutions": { + "updateDataLayer": { + "dataSolutions": { + "isDataLayerEnabled": true + } + } + } + } + } + } + ``` + + + + +## Disable data layer + +Send the following mutation to disable the data layer in the store: + + + + + ```http filename="Example mutation: Disable data layer" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation { + settings { + dataSolutions { + updateDataLayer (input: {isDataLayerEnabled: false}) { + dataSolutions { + isDataLayerEnabled + } + } + } + } + } + ``` + + + + + ```json filename="Example mutation: Disable data layer" showLineNumbers copy + { + "data": { + "settings": { + "dataSolutions": { + "updateDataLayer": { + "dataSolutions": { + "isDataLayerEnabled": false + } + } + } + } + } + } + ``` + + + + +## Resources +- [GraphQL Admin API reference](/graphql-admin/reference) +- [Big Open Data Layer](/docs/integrations/hosted-analytics) diff --git a/docs/api-docs/apps/apps-id.mdx b/docs/api-docs/apps/apps-id.mdx new file mode 100644 index 000000000..023f27bd3 --- /dev/null +++ b/docs/api-docs/apps/apps-id.mdx @@ -0,0 +1,68 @@ +# Locating the ID of an APP + + + +Select partners [building channel apps](/docs/integrations/channels/guide) need to know their app's ID in order to create and modify the channel's configuration. This tutorial demonstrates how to find an app's ID in the [Developer Portal](#find-in-developer-portal) and the [control panel](#find-in-control-panel). + + + +## Find in control panel +An app's ID can be found in the URL while on the app's page in a store's control panel. The location of the app's page depends on if the app is installed or uninstalled. + +* **Uninstalled Draft Apps:** **Apps** > **My Apps** > [**My Draft Apps**](https://login.bigcommerce.com/deep-links/manage/marketplace/apps/my-apps/drafts) + +* **Installed Apps:** **Apps** > [**My Apps**](https://login.bigcommerce.com/deep-links/manage/marketplace/apps/my-apps) + + +To open the app page, click the app: + +![Draft App](https://storage.googleapis.com/bigcommerce-production-dev-center/images/apps/apps-id-01.png "Draft App") + +The app ID is in the URL after `/manage/marketplace/apps/`: + +![Draft App ID](https://storage.googleapis.com/bigcommerce-production-dev-center/images/apps/apps-id-02.png "Draft App ID") + +## Find in Developer Portal + + +To find an app's ID in the [Developer Portal](https://devtools.bigcommerce.com/my/apps): +1. Sign in to the [Developer Portal](https://devtools.bigcommerce.com/my/apps). + +2. Click **Edit App**. + +3. Identify the app's ID is in the URL (ex: `/my/apps/{APP_ID}/summary?review=false`). + + +## Usage + +Once you obtain the app ID, you can use it to create or modify the app configuration for a channel using the [Create a channel](/docs/rest-management/channels#create-a-channel) or [Update a channel](/docs/rest-management/channels#update-a-channel) endpoint. + +```http filename="Example request: Create a channel with app configuration" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{STORE_HASH}/v3/channels +X-Auth-Token: {ACCESS_TOKEN} +Content-Type: application/json +Accept: application/json + +[{ + "type": "type of channel", + "platform": "sales channel platform", + "name": "name of the sales channel", + "external_id": "", + "status": "connected", + "app": { + "id": 123, // ID of the app + "sections": [{ + "title": "Overview", + "query_path": "overview" + }, { + "title": "Settings", + "query_path": "settings" + }] + } +}] +``` + +## Resources +* [Building Apps Guide](/docs/integrations/apps) +* [Building Channel Apps](/docs/integrations/channels/guide) +* [Extending Existing Apps with Channels Toolkit](/docs/integrations/channels/guide/extending-existing-apps) diff --git a/docs/api-docs/apps/apps-quick-start.mdx b/docs/api-docs/apps/apps-quick-start.mdx new file mode 100644 index 000000000..7b952734d --- /dev/null +++ b/docs/api-docs/apps/apps-quick-start.mdx @@ -0,0 +1,173 @@ +--- +title: Apps Quick Start +keywords: apps, app extensions, configuration, environment variables, env vars, +--- + +# BigCommerce Apps Quick Start + +In this quick start tutorial, you will create a [single-click app](/docs/integrations/apps/guide/types) using [Node.js](https://nodejs.org/en/), [React](https://www.reactjs.org/), [Next.js](https://nextjs.org/), and [BigDesign](https://developer.bigcommerce.com/big-design). + +## Prerequisites + +To successfully complete this tutorial, you will need the following: + +* [BigCommerce sandbox store](/docs/start/about/sandboxes) (required to develop and test apps) +* [Developer Portal Account](https://devtools.bigcommerce.com/) (required to register apps) +* Experience using [npm](https://www.npmjs.com/) +* The most recent LTS version of Node.js and its highest corresponding npm version + +## Get started + +1. Start by forking the [sample-app-nodejs](https://github.com/bigcommerce/sample-app-nodejs) repository. +2. Navigate to the root directory of your project and install npm packages. + +```shell copy +npm install +``` + +## Add and start ngrok + +You will need a publicly accessible URL to connect the draft app to BigCommerce. To add network access while in the development phase, you can use [ngrok](https://ngrok.com/docs), a free tool that lets you expose local servers like `localhost:3000{:http}` to the public internet over secure tunnels. + +1. In a new terminal window, install [ngrok](https://www.npmjs.com/package/ngrok#usage). + +```shell copy +npm install ngrok -g +``` + +2. Expose the web server on port 3000 to the internet. + +```shell copy +ngrok http 3000 +``` + +## Register the app + +Next, create a draft app profile in the [Developer Portal](https://devtools.bigcommerce.com/) using the following steps: + +1. [Sign in to the Developer Portal](https://devtools.bigcommerce.com/). +2. Click **Create an app**. +3. Give the app a name. +4. Click **Technical**. +5. Enter the **Auth Callback URL** as `https://{ngrok_url}/api/auth{:http}`. For example, `https://12345.ngrok.io/api/auth{:http}`. You can get the `ngrok_url` from the terminal that is running `ngrok http 3000{:shell}`. +6. Enter the **Load Callback URL** as `https://{ngrok_url}/api/load{:http}`. +7. Enter the **Uninstall Callback URL** as `https://{ngrok_url}/api/uninstall{:http}`. +8. If your app supports multiple users, locate the **App Features** section. Select **Multiple Users**, then enter the **Remove User Callback URL** as `https://{ngrok_url}/api/remove_user{:http}`. +9. Because you will be using the API to modify the store's products, set the Products OAuth scope to `modify`. To learn more about the available OAuth scopes, see [OAuth scopes](/docs/start/authentication/api-accounts#oauth-scopes). +10. Click **Update & Close**. +11. Click **View Client ID** to view this app's client ID and client secret, or _app-level API account_. + +Keep this tab open for the next step. + +## Configure environment variables + +After registering the draft app, add its credentials and auth callback URL to your project's environment variables file. + + + #### Alternate Heroku environment setup + If deploying on Heroku, skip the `.env` setup. Instead, enter `env` variables in the Heroku App Dashboard under **Settings** > **Config Vars**. + + + +1. Create a `.env` file in the root directory of your project. + +2. Copy the contents of `.env-sample` to `.env`. + +```shell filename=".env-sample" showLineNumbers copy +# Get the Client ID and Secret from the Developer Portal +CLIENT_ID={app client id} +CLIENT_SECRET={app secret} + +# Test locally with ngrok +# https://developer.bigcommerce.com/api-docs/apps/guide/development#testing-locally-with-ngrok + +AUTH_CALLBACK=https://{ngrok_url}/api/auth + +# Replace jwt key with a 32+ random character secret +JWT_KEY={SECRET} + +# Specify the type of database +DB_TYPE=firebase + +# If using firebase, enter your config here +FIRE_API_KEY={firebase key} +FIRE_DOMAIN={firebase domain} +FIRE_PROJECT_ID={firebase project id} + +# If using mysql, enter your config here and change DB_TYPE to mysql +MYSQL_HOST={mysql host} +MYSQL_DATABASE={mysql database name} +MYSQL_USERNAME={mysql username} +MYSQL_PASSWORD={mysql password} +MYSQL_PORT={mysql port *optional*} + +API_URL=api.bigcommerce.com + +``` + +[See code in GitHub](https://github.com/bigcommerce/sample-app-nodejs/blob/main/.env-sample) + +3. Replace the `CLIENT_ID` and `CLIENT_SECRET` with the app's client ID and client secret from the [Developer Portal](https://devtools.bigcommerce.com/). + +4. Update the `AUTH_CALLBACK` with the `ngrok_url`. You can get the `ngrok_url` from the terminal that is running `ngrok http 3000{:shell}`. + +5. Enter a JSON Web Token (**JWT**) secret. To learn more about JWT, see the [Internet Engineering Task Force documentation](https://datatracker.ietf.org/doc/html/rfc7519). + + + #### JWT key length + JWT key should be at least 32 random characters (256 bits) for HS256. + + + +6. Specify `DB_TYPE`: +* If using Firebase, enter your project's Firebase config keys. For information on how to set up Cloud Firestore, see [Firebase quick start](https://firebase.google.com/docs/firestore/quickstart). +* If using MySQL, enter your project's MySQL database config keys (host, database, user/pass and optionally port). +* If using Heroku with ClearDB, the database should create the necessary Config Var, namely, `CLEARDB_DATABASE_URL`. + +7. If you're using MySQL, set up the initial tables by navigating to the root directory of your project, then run the database migration using the following npm script: + +```shell filename="Initial database migration" copy +npm run db:setup +``` + +## Start dev environment + +In a separate terminal from `ngrok`, start the app's dev environment. + +```shell copy +npm run dev +``` + + #### Ngrok configuration + Although you can use the `ngrok` npm package without creating an account, any unauthenticated tunnels you create will expire after two hours. For the best development experience, [create a free ngrok account](https://dashboard.ngrok.com/signup), [find your ngrok authtoken](https://dashboard.ngrok.com/get-started/your-authtoken), and [add the authtoken](https://ngrok.com/docs#getting-started-authtoken) to your global `ngrok` configuration. + + +## Install the app + +Finally, install the draft app on any store registered to the same email as your [Developer Portal](https://devtools.bigcommerce.com/my/apps) account using the following steps: + +1. Sign in to the store, navigate to **Apps** > **My Apps** > [**My Draft Apps**](https://login.bigcommerce.com/deep-links/manage/marketplace/apps/my-apps/drafts), and install the app. +2. If everything is configured correctly, you should get an `Authorization Successful` message. +3. Navigate back to **My Apps** to see the list of installed apps. +4. Click **Launch** on the draft app to test the `/load` callback. +5. Navigate back to **My Apps** and click **Uninstall** to test the `/uninstall callback`. + +Congrats! You've created and installed a BigCommerce draft app. + + + #### Becoming a partner + Interested in sharing or selling your app? Learn more about [becoming a BigCommerce partner](https://www.bigcommerce.com/partners/become-a-partner) and [getting your app approved](/docs/integrations/apps/guide/requirements). + + + +## Next steps +* [Learn more about building apps](/docs/integrations/apps) +* [Apply to become a BigCommerce partner](https://www.bigcommerce.com/partners/become-a-partner) +* [Check out the BC App Marketplace approval requirements](/docs/integrations/apps/guide/requirements) + +## Resources +* [BC App Marketplace](https://www.bigcommerce.com/apps/) +* [Guide to API Accounts](/docs/start/authentication/api-accounts) +* [Testing locally with ngrok](/docs/integrations/apps/guide#testing-locally-with-ngrok) +* [Types of apps](/docs/integrations/apps/guide/types) +* [Becoming a partner](/docs/start/partner) diff --git a/docs/api-docs/apps/guide/apps-01-introduction.mdx b/docs/api-docs/apps/guide/apps-01-introduction.mdx new file mode 100644 index 000000000..c5e2f31fe --- /dev/null +++ b/docs/api-docs/apps/guide/apps-01-introduction.mdx @@ -0,0 +1,99 @@ +--- +title: Introduction to Building Apps +keywords: apps, app extensions +--- + +# Introduction to Building Apps + +Using BigCommerce's powerful APIs, SDKs, and toolkits, developers can build apps that are installable on BigCommerce stores. Once approved, apps can be sold (or made available free of charge) to all BigCommerce merchants on the [App Marketplace](https://www.bigcommerce.com/apps). This is the first article in a comprehensive developer's guide to building BigCommerce apps. It provides a brief, high-level introduction for developers new to the platform. If you already have experience developing for BigCommerce, feel free to [skip ahead](#next-steps) or check out the [quick start tutorial](/docs/integrations/apps/quick-start). + + +## About BigCommerce apps + +Let's first take a look how apps are discovered, displayed, and managed on BigCommerce stores. + +### Discovery +Approved apps are listed on the [App Marketplace](https://www.bigcommerce.com/apps/) for merchants to browse, search, and install. + +![App Marketplace](https://storage.googleapis.com/bigcommerce-production-dev-center/images/apps/apps-01-introduction-01.png "App Marketplace") + +### Management +Apps installed on a store are managed in the store's control panel under **Apps** > [**My Apps**](https://login.bigcommerce.com/deep-links/manage/marketplace/apps/my-apps/drafts). Here, store users can launch or uninstall the app. + +![App Management](https://storage.googleapis.com/bigcommerce-production-dev-center/images/apps/apps-01-introduction-02.png "App Management") + +### Display +When a merchant launches an app, BigCommerce makes a request to the app's `/load` callback and displays the app's UI in an iFrame. + +![App Display](https://storage.googleapis.com/bigcommerce-production-dev-center/images/apps/apps-01-introduction-03.png "App Display") + +## Use cases +What can developers do with BigCommerce apps? + +### Integrate with business systems +Use [BigCommerce APIs](/docs/api) to integrate stores with business systems such as the following: +* [ERP systems](https://www.bigcommerce.com/apps/categories/erp/) +* [Order management platforms](https://www.bigcommerce.com/apps/categories/catalog-order-management/) +* [Accounting software](https://www.bigcommerce.com/apps/categories/accounting-tax/) +* [Shipping and Fulfillment services](https://www.bigcommerce.com/apps/categories/shipping-fulfillment/) + +[Learn more about BigCommerce's APIs](/docs/api). + + +### Connect to sales channels +List products on external [sales channels](https://www.bigcommerce.com/apps/categories/sales-channels/) with [Channels Toolkit](/docs/integrations/channels/toolkit-reference). + +[Learn more about connecting apps to sales channels.](/docs/integrations/channels). + +### Add and manage scripts +Create and manage scripts with [Scripts API](/docs/rest-management/scripts) and [Script Manager](https://support.bigcommerce.com/s/article/Using-Script-Manager). + +[Learn more about creating scripts](/docs/integrations/scripts). + +### Create custom widgets +Create [widgets](https://support.bigcommerce.com/s/article/Page-Builder#builder) for merchants to install and configure. + +[Learn more about creating widgets](/docs/storefront/widgets). + +## Getting started +Here's how to get started with BigCommerce development: +1. [Create a BigCommerce sandbox store](/docs/start/about/sandboxes). + +2. [Apply to be a Partner](https://www.bigcommerce.com/partners) to get paid for your apps. + +3. [Create a Developer Portal account](https://devtools.bigcommerce.com/) to register and submit apps. + +4. [Join the Developer Community](/community) to get help from other BigCommerce developers. +5. [Check out the Marketplace](https://www.bigcommerce.com/marketplace/) to get inspiration on what to build. + + +## Next steps +* [Decide which type of app to build](/docs/integrations/apps/guide/types) + +* [Start building apps with Node, React, Next.js, and BigDesign](/docs/integrations/apps/quick-start) + + +## Resources + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) (BigCommerce Developer Blog) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) (BigCommerce Developer Blog) +* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) (BigCommerce Developer Blog) diff --git a/docs/api-docs/apps/guide/apps-02-types.mdx b/docs/api-docs/apps/guide/apps-02-types.mdx new file mode 100644 index 000000000..185b72721 --- /dev/null +++ b/docs/api-docs/apps/guide/apps-02-types.mdx @@ -0,0 +1,75 @@ +--- +title: Types of Apps +keywords: app extensions +--- + +# Types of Apps + +The first step when developing an app is deciding which type of app to develop. The two types of apps, single-click and connector, are defined by the method of authentication. [Single-click](#single-click) apps use an OAuth Authorization Code Grant flow. [Connector apps](#connector) require store owners to manually generate and configure store API credentials. In addition to the authentication method, apps can differ by [visibility](#visibility). + +## Single-Click + +Single-click apps are the recommended app type. They use [OAuth 2.0 Authorization Code Grant](https://oauth.net/2/grant-types/authorization-code/) (oauth2.net) flow. Users initiate installation by clicking **Install**. + +![Install App](https://storage.googleapis.com/bigcommerce-production-dev-center/images/apps/apps-02-types-01.png "Install App") + +The app requests the user to grant permissions associated to scopes configured for the app in the [Developer Portal](https://devtools.bigcommerce.com/my/apps): + +![App Permissions](https://storage.googleapis.com/bigcommerce-production-dev-center/images/apps/apps-02-types-02.png "App Permissions") + +Once granted, the app can request a permanent `access_token` for making REST API requests on the user's behalf. + +Single-click apps can use [App Extensions](/docs/integrations/apps/app-extensions). + +## Connector +Connector apps use manual OAuth token creation instead of the single-click app flow. Store owners manually generate [store-level API credentials](/docs/start/authentication/api-accounts#revoking-store-level-api-credentials) and enter them into the app's configuration. While single-click apps are recommended, the following use cases might not be compatible: + +- Customized integrations that vary per store. +- Integrations that do not provide any content for an iFrame. +- Apps that do not provide web services for OAuth exchange (ex: native order sync app). + +## Visibility +There are three visibility options for apps: **Draft**, **Unlisted**, and **Public**. + +| Visibility | Description | Use Cases | +|:-----------|:------------|:----------| +| Draft | Apps registered in the [Developer Portal](https://devtools.bigcommerce.com/) but never submitted for approval |
  • Installing on stores owned by the same email address as the [Developer Portal](https://devtools.bigcommerce.com/auth/bigcommerce) account email
  • Beta testing before publishing to the [App Marketplace](https://www.bigcommerce.com/apps/)
  • | +| Unlisted | Apps submitted and approved but not listed on the [App Marketplace](https://www.bigcommerce.com/apps/) |
  • Installing on stores not owned by same email address as the [Developer Portal](https://devtools.bigcommerce.com/auth/bigcommerce) account email
  • Beta testing before publishing to the [App Marketplace](https://www.bigcommerce.com/apps/)
  • | +| Public | Apps submitted, approved, and listed on the [App Marketplace](https://www.bigcommerce.com/apps/) |
  • Making apps visible and installable on all stores
  • Making apps sellable on the [App Marketplace](https://www.bigcommerce.com/apps/)
  • | + + + * Only approved [partners](https://www.bigcommerce.com/partners/) can create unlisted apps. + * To have an app unlisted, contact appstore@bigcommerce.com. + + + +## Next steps +[Begin app development](/docs/integrations/apps/guide). + +## Resources + +### Related articles +* [Building Apps Quick Start](/docs/integrations/apps/quick-start) + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/guide/apps-03-developing.mdx b/docs/api-docs/apps/guide/apps-03-developing.mdx new file mode 100644 index 000000000..f10ceacd7 --- /dev/null +++ b/docs/api-docs/apps/guide/apps-03-developing.mdx @@ -0,0 +1,97 @@ +# Beginning App Development + + + +The BigCommerce team has developed an array of sample apps and tools to assist developers in the initial phase of app development. In this article, we'll introduce those tools and go over how to begin app development by installing and registering a draft app. + +## Getting started +Here's a few things you'll need before beginning app development: +1. [BigCommerce sandbox store](/docs/start/about/sandboxes) (required to test app installation) +2. [Developer Portal Account](https://devtools.bigcommerce.com/) (required to register apps) +3. [BigCommerce partnership](https://www.bigcommerce.com/partners/) (required to publish apps to marketplace) + +## Beginning quickly +The fastest way to begin app development is by starting with one of our sample apps. You can follow our [Building Apps Quick Start Tutorial](/docs/integrations/apps/quick-start), either alone or in conjunction with [spinning up a Heroku instance](https://heroku.com/deploy?template=https://github.com/bigcommerce/sample-app-nodejs) that runs our [Node / React / Next.js sample app](https://github.com/bigcommerce/sample-app-nodejs/). + +Alternatively, you can clone the GitHub repo for your preferred stack: + +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs/) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +## Testing locally with ngrok +You can use [ngrok](https://ngrok.com/) to test apps locally. It's easy to install and works well with [Express](https://expressjs.com/): + + +```shell copy +npm install express-generator -g # install express generate + +express myapp # generate new express app + +cd myapp # move into app dir + +npm install ngrok # install ngrok + +npm install # install dependencies + +npm start # start app + +ngrok http 3000 # start ngrok +``` + +For step-by-step instructions, see [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) on our [developer blog](https://medium.com/bigcommerce-developer-blog). + +## Registering a draft app +Once you've exposed your app to the internet, you can register it as a draft app in the [Developer Portal](https://devtools.bigcommerce.com/) using the app's callback URLs. Use the following steps to register: + +1. [Sign in to the Developer Portal](https://devtools.bigcommerce.com/). +2. Click **Create an App**. +3. Name your app. +4. Click **Technical**. +5. Enter your app's callback URLs. If you're using ngrok, they'll look like this: + * **Auth**: `https://4022ffe4.ngrok.io/auth{:http}` + * **Load**: `https://4022ffe4.ngrok.io/load{:http}` + * **Uninstall**: `https://4022ffe4.ngrok.io/uninstall{:http}` +6. Click **Update & Close**. +7. Click **View Client ID** to view the app's `client_id` and `client_secret`. + +## Installing a draft app +Any store registered to the same email as your [Developer Portal](https://devtools.bigcommerce.com/my/apps) account can install your draft apps. Use the following steps to install: + +1. Sign in to the store and navigate to **Apps** > **My Apps** > [**My Draft Apps**](https://login.bigcommerce.com/deep-links/manage/marketplace/apps/my-apps/drafts). +2. Click the draft app thumbnail to install the draft. +3. Once you click **Install**, BigCommerce will begin the OAuth flow by making a `GET` request to the app's `/auth` callback URL. If the app handles all the requests successfully, the app has been installed and you can begin feature development. + +## Next steps +* [Learn How Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) + +## Resources + +### Related articles +* [Building Apps Quick Start](/docs/integrations/apps/quick-start) + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/guide/apps-04-devloper-portal.mdx b/docs/api-docs/apps/guide/apps-04-devloper-portal.mdx new file mode 100644 index 000000000..5180ee1f5 --- /dev/null +++ b/docs/api-docs/apps/guide/apps-04-devloper-portal.mdx @@ -0,0 +1,145 @@ +# Managing Apps in the Developer Portal + +Create, edit, and submit apps for approval using the [Developer Portal](https://devtools.bigcommerce.com/). In [Beginning App Development](/docs/integrations/apps/guide), we briefly touched on how to create a draft app. In this article, we'll go over how to perform other common app management tasks. To get started, sign in or create an account in the [Developer Portal](https://devtools.bigcommerce.com/). + + + #### Store email address constraint + Apps that aren't approved for distribution through the [App Marketplace](https://bigcommerce.com/apps) can only be installed on stores owned by the same email address as the developer portal account's email address. + + +## Create an app profile + +Creating an app also creates an app API account. To learn more about app API accounts, see the [Guide to API Accounts](/docs/start/authentication/api-accounts#app-level-api-accounts). To create an app, do the following: + + + #### Information optional + No app profile fields are mandatory unless you're preparing the app for BigCommerce [App Marketplace](https://bigcommerce.com/apps) approval. To learn more about preparing an app for approval, see our [App Publishing Guide](/docs/integrations/apps/guide/publishing). + + +1. Sign in or create an account with the [Developer Portal](https://devtools.bigcommerce.com). + +2. Click the **Create an app** button on the right side of the landing page. + +![Create an App](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-create-app.png "Create an App") + +3. Give your app a name in the **What would you like to call your app?** dialog. This name is only visible to you. Once complete, click the **Create** button. + +![Name the app](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-name-app-dialog.png "Name the App") + +4. The **app registration dialog** appears; click the **Technical** tab at the top. + +![Technical](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-technical.png "Technical") + +5. Scroll down to the **OAuth scopes** section and toggle the necessary OAuth scopes for your app. + +![Assign OAuth scopes](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-oauth-scopes-tight.png "Assign OAuth scopes") + +6. Click the **Update & Close** button on the registration dialog's lower right corner. + +7. A new dialog opens, asking if you want to add new OAuth scopes. Click **Confirm Update**. + +![Confirm OAuth changes](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-oauth-scopes-confirm.png "Confirm OAuth changes") + +You can view the client ID and client secret any time; see the following section on [viewing credentials](#view-credentials). + +## View credentials + +1. To view an app API account's credentials, navigate to the Dev Portal's [My Apps dashboard](https://devtools.bigcommerce.com/my/apps) and click the **View Client ID** padlock icon to the right of the relevant app's listing. + +![Menu - view client ID](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-app-menu-client-id.png "View Client ID") + +2. A dialog box opens to reveal your API account credentials. + +To learn more about using an app API account to generate store-specific access tokens, see [Implementing the OAuth Flow](/docs/integrations/apps/guide/auth). + +## Edit an app profile + +1. To edit an app, navigate to the Dev Portal's [My Apps dashboard](https://devtools.bigcommerce.com/my/apps) and click the **Edit App** pencil icon to the right of the app you want to edit. + +![Menu - edit app](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-app-menu-edit-app.png "Edit an App") + +2. The **edit app dialog** opens. It is identical to the app registration dialog. + +![Edit app dialog](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-edit-dialog-landing.png "Edit App / App Registration Dialog Landing View") + + + + #### Marketplace delay + Edits can take up to 24 hours to appear in the [App Marketplace](https://www.bigcommerce.com/apps/), but changes are immediately effective and visible in your existing users' store control panels. + + +### Edit technical details + +1. Once you [enter the app dialog](#edit-an-app), click the **Technical** tab at the top to edit enabled features, callback URLs, and OAuth scopes. + +![Technical Details](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-technical.png "Technical Details") + +![Assign OAuth scopes](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-oauth-scopes-tight.png "Assign OAuth scopes") + +2. To save your change, click the **Update & Close** button on the edit dialog's lower right corner. + +3. A new dialog opens, asking if you want to add new OAuth scopes. Click **Confirm Update**. + +![Confirm OAuth changes](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-oauth-scopes-confirm.png "Confirm OAuth changes") + +4. After saving, edits are effective immediately for all app users. + +### Indicate multi-storefront support + +If your app supports stores that sell through multiple storefronts or sales channels, add that information to the app's profile. + +1. Once you [enter the edit app dialog](#edit-an-app), click the **App Supported Features** tab at the top. + +![MSF Toggle](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-msf.png "Toggle MSF on the App Supported Features tab") + +2. Select either **Single Storefront** or **Multi Storefront**. This doesn't grant or deny your app access to any APIs; it helps us test and label your app appropriately. + +3. To save your change, click the **Update & Close** button on the edit dialog's lower right corner. + +To read about designing or modifying your app to support multi-storefront, see [Multi-Storefront App Compatibility and Optimization](/docs/integrations/apps/multi-storefront) + +## Submit an app for approval + +1. Submit apps for [App Marketplace](https://www.bigcommerce.com/apps) approval by navigating to the Dev Portal's [My Apps dashboard](https://devtools.bigcommerce.com/my/apps), then finding the app you want approved and clicking the **Submit** checkmark icon to the right of its listing. + +![Menu - submit](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-app-menu-submit.png "Submit an App") + +2. The registration dialog opens; complete the app's profile. + +To learn more about completing app registration fields and submitting apps for approval, consult our [App Publishing Guide](/docs/integrations/apps/guide/publishing). + +## Deleting apps + +Deleting an app also deletes its API account. This is a destructive action; you can't recover the app or its API account. Do not delete an app without serious consideration, particularly if it is in production. It is likely to have far-reaching negative impacts on your users' stores. + +To learn about mitigating the risks of deleting an app and its API account, see the [Guide to API Accounts](/docs/start/authentication/api-accounts#delete-apps-carefully). + +1. To delete an app, navigate to the Dev Portal's [My Apps dashboard](https://devtools.bigcommerce.com/my/apps) and click the **Delete App** trash can icon to the right of the app you want to edit. + +![Menu - delete app](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-app-menu-delete.png "Delete an App") + +2. The **delete app dialog** opens to verify whether you truly want to delete the app. Click **Delete**. + +![Delete App Dialog](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtool-delete-app-confirm.png "Delete App Dialog") + +## Next steps +* [Implement the OAuth flow](/docs/integrations/apps/guide/auth) +* [Handle app callbacks](/docs/integrations/apps/guide/callbacks) + +## Resources + +### Related articles + +* [Introduction to Building Apps](/docs/integrations/apps) +* [Beginning App Development](/docs/integrations/apps/guide) +* [Implementing App OAuth](/docs/integrations/apps/guide/auth) +* [App Approval Requirements](/docs/integrations/apps/guide/requirements) +* [Publishing an App](/docs/integrations/apps/guide/publishing) +* [Guide to API Accounts](/docs/start/authentication/api-accounts) + +### Other resources + +* [Developer Portal](https://devtools.bigcommerce.com/) (devtools.bigcommerce.com) +* [Partner Portal](https://partners.bigcommerce.com/English/) (partners.bigcommerce.com) +* [Technology Partner Program](https://partners.bigcommerce.com/English/register_email.aspx) (partners.bigcommerce.com) +* [BigCommerce App Marketplace](https://www.bigcommerce.com/apps/) (bigcommerce.com) diff --git a/docs/api-docs/apps/guide/apps-05-oauth.mdx b/docs/api-docs/apps/guide/apps-05-oauth.mdx new file mode 100644 index 000000000..b48f99abf --- /dev/null +++ b/docs/api-docs/apps/guide/apps-05-oauth.mdx @@ -0,0 +1,218 @@ +# Single-Click App OAuth Flow + + +After you [install your draft app](/docs/integrations/apps/guide) and [create an app profile](/docs/integrations/apps/guide/developer-portal), you're ready to write the code grant authorization flow that generates a unique `access_token` for each store that installs your app. This article covers the sequence and contents of API requests and responses in the code grant authorization flow for a BigCommerce app. + +It may be more appropriate for your application to use an API client to handle this logic; see [the list of BigCommerce API clients](#helpful-tools) that expose OAuth-related helper methods. + + + #### Store owner access_token constraint + Typically, only [store owners](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating) and authorized users can create API accounts and `access_token`s for a store. However, when an app is approved to be publicly available for additional stores to install, it can generate `access_token`s *on behalf* of store owners. + + +## Overview + +Your app must expose a callback endpoint, `GET /auth{:http}`, that the merchant's store control panel can hit to initiate the code grant authorization flow. For a list of all the callback endpoints your app can expose, both required and optional, see [Single-Click App Callback Handlers](/docs/integrations/apps/guide/callbacks). + +BigCommerce uses a modified version of the [OAuth2 authorization code grant (tools.ietf.org)](https://tools.ietf.org/html/rfc6749#section-4.1). The sequence is as follows: + +1. The merchant initiates installing your app by signing in to their store control panel and doing one of the following: + * clicking **Install** in the [App Marketplace](https://www.bigcommerce.com/apps/), or + * following a direct installation link. +2. The merchant accepts the app's OAuth scope permissions. The OAuth consent view presented to the merchant requires them to approve all the scopes to install the app; at this time, merchants cannot pick and choose scopes. +3. The merchant's [browser sends a GET request to the app](#receiving-the-auth-callback) server's `GET /auth{:http}` endpoint that contains some of the information necessary to request a unique `access_token` for the store. +4. The [app sends POST request to BigCommerce](#requesting-the-access_token) to request a unique `access_token` for the store. +5. BigCommerce responds with either an error or an `access_token` unique to the merchant's store; see [receiving the access_token response](#receiving-the-access_token-response). +6. The app saves the store's unique `access_token` and handles any internal logic. +7. The app sends a [response to the browser's GET request](#responding-to-the-auth-callback) in step 3 that contains markup to render the app's landing view in the iFrame the store control panel provides. + +After your app has an `access_token` for the store, the following events can mark the `access_token` for invalidation the next time the merchant opens the app: +* You change the app's OAuth scopes. +* The merchant's email address changes. + +The next time the merchant opens the app in the store control panel, the browser will prompt them to accept the changes. Once they accept, their previous `access_token` will be invalid, and your app will receive a fresh auth callback for their store. + +## Receiving the auth callback + + + #### Auth callback URL requirement + In production, all app callback URLs must be publicly available, fully qualified, and served over TLS/SSL. + + +The request to your app's `GET /auth{:http}` endpoint contains query parameters required to request an `access_token`. + +It's a best practice to request and receive an `access_token` **before** responding to the auth callback. + + + +```http filename="Example request: auth callback" showLineNumbers copy +GET https://your_app.example.com/auth?account_uuid=12345678-90ab-cdef-1234-567890abcdef&code=qr6h3thvbvag2ffq&context=stores%2Fg5cd38&scope=store_v2_orders+store_channel_listings_read_only +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 +Referer: https://login.bigcommerce.com/ +``` + + +```json filename="Example query parameters: auth callback" showLineNumbers copy +{ + "account_uuid": "12345678-90ab-cdef-1234-567890abcdef", + "code": "qr6h3thvbvag2ffq", + "context": "stores/g5cd38", + "scope": "store_v2_orders store_channel_listings_read_only" +} +``` + + + +### Query parameters in auth callback + +| Parameter | Description | +|:----------|:------------| +| `code` | The proverbial code in the code grant authorization flow; exchange for a semi-permanent `access_token`. | +| `scope` | A space-separated list of the OAuth scopes associated with this app's [API account](/docs/start/authentication/api-accounts#app-level-api-accounts). | +| `context` | The path that identifies the store in API requests to `https://api.bigcommerce.com{:http}`; a string of the form `stores/{STORE_HASH}`. | +| `account_uuid` | The ID of the Developer Portal account that registered the app profile. | + +Before proceeding with the grant code authorization flow, it's a best practice to validate the list of scopes to ensure that it matches the scopes currently configured in your app profile. + +## Requesting the access_token + + +To generate an access_token for the merchant's store, send a `POST` request to `https://login.bigcommerce.com/oauth2/token{:http}`. The request body contains a combination of query arguments from the auth callback and credentials from your app profile. + +```http filename="Example request: Create an access_token" showLineNumbers copy +POST https://login.bigcommerce.com/oauth2/token +Accept: application/json +Content-Type: application/json + +{ + "client_id": {CLIENT_ID}, + "client_secret": {CLIENT_SECRET}, + "code": "qr6h3thvbvag2ffq", + "context": "stores/g5cd38", + "scope": "store_v2_orders store_channel_listings_read_only", + "grant_type": "authorization_code", + "redirect_uri": "https://your_app.example.com/auth" +} + +``` + +### Request body properties in the access_token request + +| Property | Description | +|:---------|:------------| +| `client_id` | Your app's client ID. | +| `client_secret` | Your app's client secret. | +| `code` | The `code` from the auth callback; see the [list of auth callback query parameters](#query-parameters-in-auth-callback). | +| `scope` | The `scope` list from the auth callback; see the [list of auth callback query parameters](#query-parameters-in-auth-callback).| +| `context` | The store `context` from the auth callback; see the [list of auth callback query parameters](#query-parameters-in-auth-callback). | +| `grant_type` | The value is always `authorization_code`. | +| `redirect_uri` | Identical to the auth callback registered in the app profile. | + + + +## Receiving the access_token response + +BigCommerce responds to the access_token request with JSON that contains a permanent `access_token`, among other information. Use this `access_token` to authenticate API requests the app makes on behalf of the store; see [Authentication and Example Requests](/docs/start/authentication). To provide the most responsive app architecture and re-authentication checks, save all the response values. + +```json filename="Example response: Create an access_token" showLineNumbers copy +{ + "access_token": "xxxxalphanumstringxxxx", + "scope": "store_v2_orders store_channel_listings_read_only", + "user": { + "id": 24654, + "username": "merchant@example.com", + "email": "merchant@example.com" + }, + "owner": { + "id": 12345, + "username": "owner@example.com", + "email": "owner@example.com" + }, + "context": "stores/g5cd38", + "account_uuid": "12345678-90ab-cdef-1234-567890abcdef" +} +``` + +### Response body properties for the access_token request + +| Property | Type | Description | +|:---------|:-----|:------------| +| `access_token` | string | The semi-permanent security token that your app can use to make requests on behalf of the store. Save this value securely for future requests. | +| `scope` | string | A space-separated list of the OAuth scopes this `access_token` authorizes access to. | +| `user.id` | integer | BigCommerce’s unique identifier for the authorized user. Save this value to identify the user in future requests. | +| `user.username` | string | The username that the authorized user has on file with BigCommerce. | +| `user.email` | string | The email address that the authorized user has on file with BigCommerce. Save this value for future requests. | +| `owner.id` | integer | BigCommerce’s unique identifier for the store owner. Save this value to identify the user in future requests. | +| `owner.username` | string | The username that the store owner has on file with BigCommerce. | +| `owner.email` | string | The email address that the store owner has on file with BigCommerce. Save this value for future requests. | +| `context` | string | The path that identifies the store in API requests to `https://api.bigcommerce.com{:http}`; a string of the form `stores/{STORE_HASH}`. | +| `account_uuid` | string, UUID | The ID of the Developer Portal account that registered the app profile. | + +## Responding to the auth callback + +After you save the `access_token` response body information, respond to the `GET /auth{:http}` callback with markup and assets to render in the store control panel. BigCommerce renders the response view inside an **iFrame**, so ensure that any JavaScript you send is scoped to avoid conflicts with the store control panel's JavaScript. + +If you do not respond, the merchant will be left looking at a blank screen and will not be able to interact with your app. + + +## Security considerations + +[RFC 6749 (tools.ietf.org)](https://tools.ietf.org/html/rfc6749) discusses security considerations, recommendations, and requirements. The following are some requirements and recommendations applicable to apps: +* Request access tokens with the minimal scope necessary. +* Keep access tokens and client secrets confidential in transit and storage. +* Educate end-users about the risks phishing attacks pose. +* Implement CSRF protection on redirect URIs. + +For additional details, see [Security Considerations in RFC 6749 (tools.ietf.org)](https://tools.ietf.org/html/rfc6749#section-10). For a list of the top web application security risks and best practices for avoiding them, see [OWASP Top Ten (owasp.org)](https://owasp.org/www-project-top-ten/). + + +## Helpful tools + +The following BigCommerce API clients expose helper methods for BigCommerce's code grant authorization flow: +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) + * Fetches `access_token` + * Verifies `signed_payload_jwt` +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) + * Fetches `access_token` + * Verifies `signed_payload_jwt` +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) + * Fetches `access_token` +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) + * Fetches `access_token` + +## Next step +* [Handle load, uninstall, and remove_user callbacks](/docs/integrations/apps/guide/callbacks) + +## Resources + +### Related articles +* [About Our APIs](/docs/start/about) +* [Authentication](/docs/start/authentication) + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) with [quick start tutorial](/docs/integrations/apps/quick-start) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) + +### Additional resources +* [OAuth 2.0 Simplified (oauth.net)](https://oauth.net/getting-started/) +* [RFC 6749 (tools.ietf.org)](https://tools.ietf.org/html/rfc6749) +* [OWASP Top Ten (owasp.org)](https://owasp.org/www-project-top-ten/) diff --git a/docs/api-docs/apps/guide/apps-06-callbacks.mdx b/docs/api-docs/apps/guide/apps-06-callbacks.mdx new file mode 100644 index 000000000..7caa35a26 --- /dev/null +++ b/docs/api-docs/apps/guide/apps-06-callbacks.mdx @@ -0,0 +1,161 @@ +# Single-Click App Callback Handlers + +After a store owner or authorized user installs your single-click app, they and other authorized users will need to use it and configure any settings. In turn, your app will likely need to store and manage information about the stores and users you're supporting. + +This article is a reference for endpoints to which we send event-driven callbacks, and a guide to writing handlers that verify and use our JWT payloads. It also describes the payload schema of the `signed_payload_jwt`. + + + #### Callback URL requirements + In production, all app callback URLs must be publicly available, fully qualified, and served over TLS/SSL. + + +## Overview + +Your app's front-end views render inside an iFrame in the store control panel, so your app has no native ability to listen for a few high-level events. To support your work, BigCommerce sends `GET` requests to callback routes in your app that correspond to three events: opening the app, uninstalling the app, and revoking a user's access to the app. Each request includes a signed JSON web token (_JWT_), which contains identifying information about the store and the user. + +Your app is only required to handle the `GET /auth{:http}` and `GET /load{:http}` endpoints, but we recommend writing handlers for the others, as well. Please see the corresponding detail sections that follow for more about the consequences of not handling optional callback endpoints. + +The following table lists the app management callbacks that BigCommerce stores send: the three listed in the preceding paragraph, plus the auth callback described in [Single-Click App OAuth Flow](/docs/integrations/apps/guide/auth). + +| Endpoint | Required | Request Origin | Payload | Expected Response | Event Description | +|:---------|:--------:|:---------------|:--------|:-----------------|:------------------| +| `GET /auth{:http}` | yes | browser | URL-encoded | markup | See [Implement the OAuth flow](/docs/integrations/apps/guide/auth). | +| `GET /load{:http}` | yes | browser | JWT | markup | The store owner or authorized user clicks to load the app. | +| `GET /uninstall{:http}` | no | server | JWT | JSON | The store owner or authorized user clicks to uninstall the app. | +| `GET /remove_user{:http}` | no | server | JWT | JSON | The store owner revokes a user's access to the app. | + +## Render the app with load + +Once the store owner or authorized user installs your app, it appears on the **Apps** sub-menu list in their store control panel, as well as their authorized users' control panels. When a user clicks your app's listing or another referring UI component, BigCommerce dispatches a request to your app's `GET /load{:http}` endpoint. The following is an example request: + +```http filename="Example request: /load callback from BigCommerce" +GET https://your_app.example.com/load?signed_payload_jwt={header_b64.payload_claims_b64.signature_b64} +Accept: application/json +``` + +After your app [verifies the payload](#decode-and-verify-signed_payload_jwt), [identifies the requesting user](#work-with-payload-claims), and handles any internal business, respond with the markup and assets for the view that you want BigCommerce to render in the provided **iFrame**. + +## Deactivate stores with uninstall + +When the store owner or authorized user clicks the **Uninstall** button on your app's card in the store control panel, BigCommerce dispatches a request to the app's `GET /uninstall{:http}` endpoint. The following is an example request: + +```http filename="Example request: uninstall callback from BigCommerce" +GET https://your_app.example.com/uninstall?signed_payload_jwt={header_b64.payload_claims_b64.signature_b64} +Accept: application/json +``` + +After your app [verifies the payload](#decode-and-verify-signed_payload_jwt) and [identifies the requesting user](#work-with-payload-claims), handle any internal business, such as marking the user inactive in your app's database or decrementing the number of active installations. You do not need to send a response. If you do not write a handler for the `GET /uninstall{:http}` endpoint, BigCommerce will still uninstall your app from the owner's store, but your app will not know that. + +## Revoke user access with remove_user + +When the store owner revokes a user's authorization to access your app, BigCommerce dispatches a request to the app's the `GET /remove_user{:http}` endpoint. The following is an example request: + +```http filename="Example request: remove_user callback" +GET https://your_app.example.com/remove_user?signed_payload_jwt={header_b64.payload_claims_b64.signature_b64} +Accept: application/json +``` + +After your app [verifies the payload](#decode-and-verify-signed_payload_jwt) and [identifies the requesting user](#work-with-payload-claims), handle any internal business, such as removing the user's data from your app database. You do not need to send a response. If you do not write a handler for the `GET /remove_user{:http}` endpoint, BigCommerce will still revoke the user's access to your app in the store control panel, but your app will not know that. + +## Decode and verify signed_payload_jwt + +The `signed_payload_jwt` is composed of three distinct **base64URL**-encoded strings concatenated with the `.` character. + +```js filename="Form of payload JWT" +header_b64.payload_claims_b64.signature_b64 +``` + +Use a [compatible BigCommerce API client](#helpful-tools) or a [standard library package (jwt.io)](https://jwt.io/libraries) to decode, verify, and parse the `signed_payload_jwt`s that BigCommerce sends to your app's callback endpoints. + +## Work with payload claims + +Use the payload claim data to identify the store and user. What your app should do with this information typically depends on whether it supports [multiple users](/docs/integrations/apps/guide/users). Refer to the following table for instructions: + +| Endpoint | Multiple Users Enabled | Multiple Users Not Enabled | +|:---------|:-----------------------|:---------------------------| +| `GET /load{:http}` | Compare user to store owner or existing user; if no match, it's a new user; add them to the app's database. | Matches store owner | +| `GET /uninstall{:http}` | Compare user to store owner or existing user; only store owner or authorized users can uninstall an app. | Matches store owner | +| `GET /remove_user{:http}` | Compare user to users stored in app database; remove matching user from database. | N/A | + + +The following is an example of the payload claims encoded in the `signed_payload_jwt` that BigCommerce sends to your app callback endpoints: + +```json filename="Example: app callback payload" showLineNumbers copy +{ + "aud": "U8RphZeDjQc4kLVSzNjePo0CMjq7yOg", // your app's CLIENT_ID + "iss": "bc", + "iat": 1659031626, + "nbf": 1659031621, + "exp": 1659118026, + "jti": "c5f0bcf5-a504-4ae6-8dcc-0e40eaa5a070", // JWT unique identifier + "sub": "stores/z4zn3wo", // STORE_HASH + "user": { + "id": 9876543, + "email": "authorized_user@example.com", + "locale": "en-US" + }, + "owner": { + "id": 7654321, + "email": "owner@example.com" + }, + "url": "/", + "channel_id": null, +} +``` + +### Data properties in the signed_payload_jwt + +| Property | Type | Description | +|:---------|:-----|:------------| +| `aud` | string | The app API account's client ID; the intended *audience*. | +| `iss` | string | The *issuer*; the value is always `bc`. | +| `iat` | integer, UNIX time | The *issued at* time; when the JWT was issued. | +| `nbf` | integer, UNIX time | The *not valid before* time; when the JWT became or becomes valid. The value is always the same as `iat`. | +| `exp` | integer, UNIX time | The *expiration* time; when the JWT becomes invalid. Currently, 24 hours after `nbf`. | +| `jti` | string, UUID | The *JWT ID*; a unique identifier for the JWT. | +| `sub` | string | Identifies the *subject* store in API requests to `https://api.bigcommerce.com{:http}`; a string of the form `stores/{STORE_HASH}`. | +| `user.id` | integer | The ID of the user who initiates the callback. | +| `user.email` | string | The email address of the user who initiates the callback. | +| `user.locale` | string | The [BCP 47](https://www.rfc-editor.org/info/bcp47) language tag of the user who initiates the callback. | +| `owner.id` | integer | The ID of the store owner. | +| `owner.email` | string | The email address of the store owner. | +| `url` | string | Also known as a *deep link*. A developer-configured path that provides the app more information about the resource that initiated the load callback. | +| `channel_id` | integer | The channel associated with the click event that dispatched the callback. The value is `null` when a click in the **Apps** menu sidebar initiates the load callback. | + +## Helpful tools + +The following BigCommerce API clients expose helper methods for verifying the `signed_payload_jwt`: +* [Python API client](https://github.com/bigcommerce/bigcommerce-api-python) + * Fetches `access_token` + * Verifies `signed_payload_jwt` +* [Node API client](https://github.com/bigcommerce/node-bigcommerce/) + * Fetches `access_token` + * Verifies `signed_payload_jwt` + +## Next step +* [Support multiple users](/docs/integrations/apps/guide/users) + +## Resources + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) with [quick start tutorial](/docs/integrations/apps/quick-start) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/guide/apps-07-users.mdx b/docs/api-docs/apps/guide/apps-07-users.mdx new file mode 100644 index 000000000..f46454d61 --- /dev/null +++ b/docs/api-docs/apps/guide/apps-07-users.mdx @@ -0,0 +1,64 @@ +# Supporting Multiple Users + + + +When you register your app in the [Developer Portal](https://devtools.bigcommerce.com/), you'll have the option of enabling **Multiple Users**. This allows store administrators to manually authorize users to load the app. This article describes how enabling **Multiple Users** impacts the app's user experience in the control panel, and discusses important implications for app developers to consider before enabling the feature. + +## Enabling multiple users + +Enabling **Multiple Users** in [Developer Portal](https://devtools.bigcommerce.com/) affects the control panel on any store your that has installed your app. If you already have an app published in the [Marketplace](https://www.bigcommerce.com/apps/), be aware that this setting takes effect immediately. We recommend testing **Multiple Users** using a separate app that is in draft status. + +Let store owners know you've enabled this feature. Otherwise, they won't know they can grant access to users. + +If **Multiple Users** is enabled after your app has launched, the update will cause the app scopes to change and users will be alerted of the new permission request. + +## The control panel experience + +Store owners will be able to adjust user permissions to grant or deny the store's other users access to your app. The next time the user logs in, they will see any apps they've received permission to access. Users can then click the app icon in the left nav to load it. + +Use your draft app and your sandbox store to review this behavior. + +## The load request + +Apps with **Multiple Users** enabled can expect the `email` and `ID` of the user that initiated the callback in addition to the owner's `email` and `ID` in the JSON object sent in the `load` request. If a `load` request is sent with information for a user you haven't seen, provision the user account and associate it with the store in your database. + +Because you know the store owner or user's `email` and `ID` from the app installation sequence, your app can distinguish store owners from other users. This allows you to provide different user experiences based on the information in the load request. Here is a summary of the two types of users: +- **Store owner** and **authorized users**: Can `install`, `uninstall`, and `load` apps. Store owners must grant permissions so that authorized users can install or uninstall apps. +- **Users**: Cannot `install` or `uninstall` apps. Users are permitted only to `load` the apps that a store owner authorized. + +## The remove user request +Store owners can also remove users. This action generates a `GET` request to the remove user callback URL that you provided in the [Developer Portal](https://devtools.bigcommerce.com/my/apps). When this occurs, your app should remove the user identified in the request from it's records. + +For details about remove user and load requests, see [Single-click App Callbacks](/docs/integrations/apps/guide/callbacks). + +## Next steps + +* [Learn how to handle store events](/docs/integrations/apps/guide/users). + +## Resources + +## Related articles +* [Single-click App Callbacks](/docs/integrations/apps/guide/callbacks) + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/guide/apps-08-events.mdx b/docs/api-docs/apps/guide/apps-08-events.mdx new file mode 100644 index 000000000..87161bff0 --- /dev/null +++ b/docs/api-docs/apps/guide/apps-08-events.mdx @@ -0,0 +1,80 @@ +# Listening for Events + + + +Your app may need to be notified when specific events occur on a BigCommerce store (for example, when an order is created). Your app can programmatically subscribe to such events using [webhooks](/docs/webhooks). We'll briefly introduce webhooks in this article (for visibility); to take a deeper dive, see [Webhooks Overview](/docs/integrations/webhooks). + + +## Available webhooks + +The following resources have webhooks events available to apps: +* [Carts](/docs/integrations/webhooks/events#carts) + +* [Cart Line Items](/docs/integrations/webhooks/events#cart-line-items) + +* [Categories](/docs/integrations/webhooks/events#categories) + +* [Customers](/docs/integrations/webhooks/events#customers) + +* [Orders](/docs/integrations/webhooks/events#orders) + +* [Products](/docs/integrations/webhooks/events#products) +* [Shipments](/docs/integrations/webhooks/events#shipments) +* [SKUs](/docs/integrations/webhooks/events#skus) +* [Stores](/docs/integrations/webhooks/events#stores) +* [Subscribers](/docs/integrations/webhooks/events#subscribers) + +[Learn more about webhook events](/docs/integrations/webhooks/events#orders). + +## Creating webhooks + +To create a webhook, send a request to the [Create a webhook](/docs/webhooks/webhooks/manage-webhooks-bulk#create-a-webhook) endpoint. + + +```http filename="Example request: Create a webhook" showLineNumbers +POST https://api.bigcommerce.com/stores/{STORE_HASH}/v2/hooks +X-Auth-Token: {ACCESS_TOKEN} +Content-Type: application/json +Accept: application/json + +{ + "scope": "store/order/updated", + "destination": "https://665b65a6.ngrok.io/webhooks", + "is_active": true +} +``` + +[Learn more about creating webhooks](/docs/integrations/webhooks). + +## Next steps +* [Design your app's user interface](/docs/integrations/apps/guide/ui). + +## Resources + +### Related articles +* [Webhooks Overview](/docs/integrations/webhooks) +* [Webhooks Tutorial](/docs/integrations/webhooks) +* [Webhooks Events](/docs/integrations/webhooks/events) + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/guide/apps-09-ui.mdx b/docs/api-docs/apps/guide/apps-09-ui.mdx new file mode 100644 index 000000000..bb66ec9fc --- /dev/null +++ b/docs/api-docs/apps/guide/apps-09-ui.mdx @@ -0,0 +1,99 @@ +# Designing a Single-Click App's UI + + + +Your app's user interface is loaded inside an iFrame in a store's control panel after a user clicks the app's icon in the left nav and triggers the [load callback](/docs/integrations/apps/guide/callbacks). To ensure a seamless user experience, you should design your app's UI to match the design of BigCommerce's control panel. We've built a collection of reusable React components, design guidelines, and UI patterns (known collectively as *BigDesign*) that you can use to rapidly develop an app front-end that's consistent with BigCommerce's UI. + +## Installing BigDesign React components + +Add BigDesign and styled-components to your project using `npm`: + +```shell copy +npm install @bigcommerce/big-design styled-components +``` + +or with `yarn`: + +```shell copy +yarn add @bigcommerce/big-design styled-components +``` + +Import the `GlobalStyles` component and use it once in your app. This will set a few styles globally, including a base font family, [Source Sans Pro](https://fonts.google.com/specimen/Source+Sans+3) and [normalize.css](https://github.com/necolas/normalize.css/). We recommend placing it close to your root component. Then import any component, such as `Button`, to use it anywhere in your app. + +```js filename="GlobalStyles component" showLineNumbers copy +import { Button, GlobalStyles } from '@bigcommerce/big-design'; + +// ... + + + + + +``` + +For additional installation and usage instructions, see the [bigcommerce/big-design](https://github.com/bigcommerce/big-design) repo on GitHub. + +## Using BigDesign tools + +The BigCommerce team has developed a collection of tools to help you design your app's UI. + +### Developer playground +The BigDesign Playground demonstrates the visual style and behavior of each BigDesign component. Each component has props that you can pass to the components for further configuration. + +[Go to the BigDesign Developer Playground](https://developer.bigcommerce.com/big-design). + +### Example app +We've built a channels app that serves as a reference implementation for BigDesign React Components. You can install it on your store [here](https://apps.bigcommerce.com/details/18212) (apps.bigcommerce.com) to view the components. + +[Learn more about the channels app](https://github.com/bigcommerce/channels-app). + +### Design kits + +Do you design with Figma? If so, check out our design kit: +* [BigDesign Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) + + +## Developing for the iFrame + +Single-click apps benefit from a high level of integration with the BigCommerce control panel. BigCommerce achieves this by rendering your app's UI in an iFrame. To meet [App Marketplace](https://www.bigcommerce.com/apps/) requirements, your app should perform all functions inside the iFrame. The iFrame approach requires special attention from app developers. + +To load inside the control panel iFrame, your app must do the following: +1. **Serve app resources over HTTPS:** BigCommerce's control panel is served over HTTPS. Your app must also be served over HTTPS, including any remote resources referenced (such as CSS, JS, and image files). If any resources are served over HTTP, the user's browser will display a mixed content error and refuse to render your app's UI in the control panel iFrame. +2. **Support browser same-origin policies:** Same-origin policities restrict apps running within iFrames from performing certain activities, such as interacting with other services. If your app requires this, open a new tab for actions that cannot occur in an iFrame1. [Learn more about same-origin policies](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy) (developer.mozilla.org). + + + Apps that operate in the iFrame get strong preference during [App Marketplace](https://www.bigcommerce.com/apps/) consideration; however, we sometimes make exceptions for apps that need to interact with other services. + + + + +## Next steps +* [Create external installation buttons](/docs/integrations/apps/guide/buttons). +* [Follow best practices](/docs/integrations/apps/guide/best-practices). +* [Check requirements](/docs/integrations/apps/guide/requirements). +* [Publish your app](/docs/integrations/apps/guide/publishing). + +## Resources + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) + + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/guide/apps-10-buttons.mdx b/docs/api-docs/apps/guide/apps-10-buttons.mdx new file mode 100644 index 000000000..232286811 --- /dev/null +++ b/docs/api-docs/apps/guide/apps-10-buttons.mdx @@ -0,0 +1,97 @@ +# Creating an External Installation Button + + + + +Single-click apps can be installed from outside the BigCommerce control panel. For example, an install button on your company's site that directs the merchant to download your app. This tutorial provides step-by-step instructions for creating an external install button for BigCommerce single-click apps. + + +## Creating an install button + +First, embed an install button like the one below, at any web location from which you’d like to enable app installation. + +![Install Button](https://storage.googleapis.com/bigcommerce-production-dev-center/images/apps/apps-10-buttons-01.png "Install Button") + +Redirect anyone who presses your button to: `https://login.bigcommerce.com/app/{CLIENT_ID}/install{:http}`. + +## Configuring the button + +When clicked, your button should open a modal similar to the image below. We recommend a modal sized `900px` wide by `450px` high. + +![Install Button](https://storage.googleapis.com/bigcommerce-production-dev-center/images/apps/apps-10-buttons-02.png "Install Button") + +Your button will link merchants to BigCommerce's install endpoint for your application. Once the merchant clicks the link, they will be prompted to sign in and authorize your application. + +## Rendering success and failure pages + +Modify your web site's server-side code to serve either a success or failure page, depending on whether the external installation was successful or unsuccessful. + +If you skip this step, your application will load in the iFrame created by your button. To ensure a good experience for your users, we strongly recommend that you return a confirmation page, instead of allowing your application to be loaded in that modal. + +## Handling errors + +If your application's installation was initiated and completed through an external link, BigCommerce will send your `auth` callback endpoint an extra parameter called `external_install`. + +If you receive this parameter and there are no errors, make a `GET` request to the install succeeded endpoint. + + +```http copy +GET /app/{CLIENT_ID}/install/succeeded HTTP/1.1 +Host: login.bigcommerce.com +``` + +If there were errors, make a `GET` request to the install failed endpoint: + +```http copy +GET /app/{CLIENT_ID}/install/failed HTTP/1.1 +Host: login.bigcommerce.com +``` + +Depending on which endpoint you call, BigCommerce will render a success or failure page to the modal. + +## Code samples + +Handling errors in Lua: + +```lua filename="Example: Lua error handling" showLineNumbers copy +if params['external_install'] + return get 'https://login.bigcommerce.com/app/m8e1mkkmjw2xjinydqz7ie05to1y2nk/install/succeeded' +end + +redirect '/' + +rescue => e +if params['external_install'] + return get 'https://login.bigcommerce.com/app/m8e1mkkmjw2xjinydqz7ie05to1y2nk/install/failed' +end +``` + +## Next steps +* [Follow best practices](/docs/integrations/apps/guide/best-practices). +* [Check requirements](/docs/integrations/apps/guide/requirements). +* [Publish your app](/docs/integrations/apps/guide/publishing). + +## Resources + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/guide/apps-11-best-practices.mdx b/docs/api-docs/apps/guide/apps-11-best-practices.mdx new file mode 100644 index 000000000..5076931e1 --- /dev/null +++ b/docs/api-docs/apps/guide/apps-11-best-practices.mdx @@ -0,0 +1,109 @@ +--- +title: App Development Best Practices +keywords: rate limits, apps, best practices, +--- + +# App Development Best Practices + +Review the following best practices before submitting your app to the [App Marketplace](https://www.bigcommerce.com/apps/). + +## OAuth flow + +### Follow security best practices and requirements + +[RFC 6749](https://tools.ietf.org/html/rfc6749#section-10) discusses OAuth security considerations, recommendations, and requirements. Here's a summary of important items applicable to apps: +* Request access tokens with minimal scopes necessary. +* Serve all redirect URIs over TLS. +* Keep access tokens confidential in transit and storage. +* Do not transmit access tokens, refresh tokens, or client credentials in the clear. +* Do not transmit authorization codes in the clear. +* Educate end-users about the risks phishing attacks pose. +* Provide mechanisms that make it easy for end-users to confirm the authenticity of your app. +* Implement CSRF protection on redirect URI. + +For details, see [Security Considerations in RC6749](https://tools.ietf.org/html/rfc6749#section-10). For a list of the top web application security risks and best practices to avoid them, see [OWASP Top Ten](https://owasp.org/www-project-top-ten/). + +## API requests + +For recommendations on API request-related best practices, including rate limits, threading, parallel requests, and the finer points of request headers, see our article on [Best Practices](/docs/start/best-practices). + +## Webhook events + +### Use webhooks to keep app data up-to-date + +Rather than polling endpoints, get notified when updates occur by subscribing to [webhooks](/docs/integrations/webhooks). + +## User interface + +### Manage user session timeouts + +Add BigCommerce's JavaScript SDK to your single-click app's front-end to prevent users from getting logged out of the control panel while using your app. To do so, reference the following script in your app's client-side code: + +```js copy + https://cdn.bigcommerce.com/jssdk/bc-sdk.js +``` + +To perform some action when a logout occurs, specify an `onLogout` callback: + + +```js copy +Bigcommerce.init({ + onLogout: callback +}); +``` + +### Streamline new user onboarding + +- If your app has a new user form, we recommend auto-filling input fields with data from the [Store Information API](/docs/rest-management/store-information), which manages much of the info you need. +- If your app doesn't have an approval process for new users, consider automatically generating accounts for new stores that install your app. +- If your app requires the user to sign in at launch, use the information BigCommerce sends to your callback URL to authenticate the user without asking for a username and password each time. +- If you plan to share user testimonials, add a link to your full case study in the case studies field. + + +### Offer multi-user access + +Merchants often have more than one person who can access a store's control panel. BigCommerce allows additional users to access an app when the store owner has granted them appropriate permissions. The requirements for supporting multi-user app access are: +* The app must save the API account access token for each store with its `store_hash`, rather than a user's info. +* In the app's [Developer Portal profile](https://devtools.bigcommerce.com), you must [enable multiple users](/docs/integrations/apps/guide/developer-portal#edit-technical-details). + +In the payload returned when a user launches an app, users are distinguished by `owner_email` versus `user_email`. If these two emails match, the user is the store owner. + +Enabling user removal is optional. If you want merchants to be able to remove users, you can do so by writing a `remove_user` callback and [adding its URL](/docs/integrations/apps/guide/developer-portal#edit-technical-details) to your app's [Developer Portal profile](https://devtools.bigcommerce.com). For more advanced implementations, you can enable the store owner to grant specific permissions to different non-admin users. For example, `person1@example.com` could be permitted to edit product inventory but not view orders. If you decide to implement user permissions in your app, it’s a great feature to advertise. + +For more information, see [Multi-User Support](/docs/integrations/apps#multi-user-support). + + +## Deployment + +### Consider hosting on Google Cloud Platform's us-central1 region + +BigCommerce hosts [Google Cloud Platform](https://cloud.google.com/) in the [us-central1](https://cloud.google.com/compute/docs/regions-zones/) region; maximize performance by hosting in the same region. + +## Next steps +* [Check requirements](/docs/integrations/apps/guide/requirements). +* [Publish your app](/docs/integrations/apps/guide/publishing). + +## Resources + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/guide/apps-12-requirements.mdx b/docs/api-docs/apps/guide/apps-12-requirements.mdx new file mode 100644 index 000000000..481dd9268 --- /dev/null +++ b/docs/api-docs/apps/guide/apps-12-requirements.mdx @@ -0,0 +1,87 @@ +# App Store Approval Requirements + + + +The Marketplace team reviews all app submissions and tests apps to verify they meet [App Marketplace](https://www.bigcommerce.com/apps/) listing standards. Verify your app meets the requirements below before submitting it for approval. + +## General requirements + +- Make support resources available throughout the app, like during onboarding and on the app's dashboard within the BigCommerce iframe. +- Follow branding guidelines when referencing BigCommerce (see our [Media Kit](https://www.bigcommerce.com/press/media-kit/) for more information). +Don't reference competitor platforms in the app's listing information or dashboard. +* Use the same app name in app submission and in app content such as logos and descriptions. +* Keep app titles concise. Avoid using extra taglines or descriptors; include those in the app summary, if necessary. +* Include the name of both your brand and any connected third-party platforms in the title (ex: +"Marketplace by BigCommerce" or "Search by BigCommerce"). +- Develop app client-side code to be compatible with all BigCommerce [supported browsers](https://support.bigcommerce.com/s/article/Themes-Supported-Browsers) and default features. +- Include applicable test account details in your test instructions with the submission for any third-party services required in the app. +- Use BigCommerce APIs for app functionality wherever possible. For example, don't require a merchant to manually import a product CSV if those products can be retrieved using the BigCommerce API. + + +## Listing + +* Approval for the [App Marketplace](https://www.bigcommerce.com/apps/) requires all fields listed in the Publishing Apps section (**Case Studies** and **Videos** are optional). +* Listings should be well worded, cleanly formatted, and follow wording and image specifications. +* App listing name should be restricted to only branding and not include taglines. + +## Functionality + +* Apps must work as intended and cannot conflict with BigCommerce functionality. +* Apps must use V3 endpoints in favor of V2 endpoints when feature parity exists. +* Apps must serve all callback URLs over HTTPS. +* Apps in the App Marketplace must be [multi-user enabled](/docs/integrations/apps/guide/users). +* Apps that process transactions or handle credit card data must pass a PCI Compliance review by BigCommerce's security team. New payment gateway app submissions may not be accepted for App Marketplace review. +* Apps that access the Checkout Content scope will also be subject to a security assessment by BigCommerce's security team. +* Apps that modify the checkout experience must use the BigCommerce [Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk). +* Apps that add another marketplace or sales channel to a store should make use of the [Channels Toolkit](/docs/integrations/channels/guide) and follow [Channel App Requirements](/docs/integrations/channels/guide/requirements). +* Apps that create orders in the BigCommerce store need to properly mark accurate order source, payment method, and other order details. + +## Installation + +* Apps should be [single-click](/docs/integrations/apps/guide/types#single-click) and use [OAuth flow](/docs/integrations/apps/guide/auth) to authenticate. +* Apps must respond to install [callback](/docs/integrations/apps/guide/callbacks) with styled and branded HTML for the control panel iframe; this content cannot be blank and must follow our user-interface constraints. Apps using [BigDesign](https://developer.bigcommerce.com/big-design/) are preferred. +* Apps must store user tokens against the store hash, not the user's email address, to avoid problems with ownership changes and multiple user support. +* Apps need to include options for new user registration as well as existing users. +* Apps should autofill registration fields such as email address and store URL based on the store's information. +* Apps should include onboarding instructions and any setup requirements after installing. +* Apps that install scripts must use the [Scripts API](/docs/rest-management/scripts) to insert into Script Manager using proper `consent_category`. + + + If your app cannot meet these requirements, email appstore@bigcommerce.com to discuss your options for approval. + + +## FAQ + +**Are all fields required?** +For App Marketplace approval, you'll need to fill out all fields on your listing with applicable content and links. These will be reviewed as part of the Marketplace approval process. **Case Studies** and **Videos** are optional. + +## Next steps +* [Publish your app](/docs/integrations/apps/guide/publishing). + +## Resources + +### Sample apps + +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools + +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts + +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/guide/apps-13-publishing.mdx b/docs/api-docs/apps/guide/apps-13-publishing.mdx new file mode 100644 index 000000000..6daa12baf --- /dev/null +++ b/docs/api-docs/apps/guide/apps-13-publishing.mdx @@ -0,0 +1,148 @@ +# Publishing an App + +After completing development, verifying best practices, and checking approval requirements, you may submit your app for Marketplace approval in the [Developer Portal](https://devtools.bigcommerce.com/). This article takes you step-by-step through the submission form and provides descriptions for each field. + +## Before you begin + +Your listing on the [App Marketplace](https://www.bigcommerce.com/apps/) plays a major role in your app's success. A good listing accomplishes three goals: +* Shows users how your platform or solution differs from competitive offerings +* Includes keywords so prospective users can find your listing in searches +* Sets up clear and accurate user expectations as to your solution's features and functionality + +Before you begin completing the app registration, we recommend prepping the following assets: +* Company logos +* Screenshots and video content +* Case studies + +We also recommend giving special attention to the following search indexed fields: +* App name +* App summary +* App category + +## Provide a summary + +To begin the app certification process, we'll need some basic information about you. + +![App Summary](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-summary.png "App Summary") + +| Field | Description | +|:----------------|:-------------------------------------------------------------------------------------------------------| +| Contact Name | Email address created when applying for your Partner ID | +| Partner Name | Name of your company​; attributed on the detail page | +| Partner Website | URL to your homepage | +| Support Email | Business mail where users can get help with the app | +| Support Website | Used for **Get Support** button in Marketplace | +| Partner ID | Required for submission; assigned to [partners](/docs/start/partner#applying-to-the-technology-partner-program) after approval | +| App Name | Brand name given to app for titles and app content; should not include taglines or descriptors | +| App Logo | Primary app logo; should be 350 x 130px with a white background and dark branding with no taglines | +| App Icon | Shown on main app detail page and left nav in control panel once installed; should be 200 x 200px | +| Price | App's starting price; if offering free plan, choose **Free**; specify details in **Other** selection | +| App Summary | App tagline used in the marketplace category and search results; 128 character max | +| Category | Marketplace category for app; used as search attribute; BigCommerce may re-categorize prior to launch | + +## Add technical information + +Specify app type, multiple users support, callback URLs, and OAuth scopes; and, provide detailed testing instructions. + +![Technical](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-technical.png "Technical") + +| Field | Description | +|:-----------------------|:---------------------------------------------------------------------------| +| Multiple Users | Optionally allow your app to be accessible to store users other than owner | +| App Type | Type of app; single-click recommended | +| Auth Callback URL | Requested when store owner or authorized user clicks `install` | +| Load Callback URL | Requested when user launches app | +| Uninstall Callback URL | Requested when store owner or authorized user clicks `uninstall` | +| OAuth Scopes | OAuth scopes the app requires | +| Test Instructions | Instructions needed to test the app thoroughly | + +## Fill in details + +Provide a helpful description with screenshots and a video to promote your app. We recommend bullet points followed by short paragraphs with headers. Aim for 200 words in total. + +![Details](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-details.png "Details") + +| Field | Description | +|:------|:------------| +| App Details | Value proposition; avoid fluff or buzzwords; not be indexed for search; 200 words max | +| Videos | Videos highlighting purpose and value of your app | +| Case Studies | Case studies demonstrating how merchants have benefited from using your app. 4 max | +| Features | App's major features; include title and description for each; title is search indexed; rich text accepted; 5 max | +| Legal Terms & Privacy | App privacy policy and ToS links; legally required | +| International Optimization | Countries app optimized for and countries app does not support | +| Help Guides | Links to app's user and installation guides; highly recommended | +| App Screenshot | Screenshots of app UI in a BigCommerce store's control panel | +| Alternate Logo | Used if app featured in Marketplace carousel; should be 259 x 158px (or larger at ratio); dark background and light branding; no taglines | + +## Add supported features + +Indicate whether your app supports multi-storefront functionality. + +![App Supported Features](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-msf.png "App Supported Features") + +## Review submission + +Review the information added before submitting the app. + +![Review](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-review.png "Review") + +## Submit your app for approval + +Ensure all information is complete, then click **Submit for Review** to pay the review and listing fee and submit the app. Test the app before submitting it to avoid paying additional review fees. + +![Payment & Submission](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-submit.png "Payment & Submission") + +If you have any questions about your submission, email [AppStore@bigcommerce.com](mailto:appstore@bigcommerce.com). + +## FAQ + +**Are all fields required?** + +For Marketplace approval, you'll need to fill out all fields on your listing with applicable content and links. These will be reviewed as part of the Marketplace approval process. The **Case Studies** field and **Videos** field are optional. + + +**Am I able to preview the changes to my listing before publishing them?** + +Yes! With the updated fields in the Developer Portal, we're also adding the ability to +preview how these changes will appear on the BigCommerce Marketplace. You will see the option to preview on a new step after Review when editing your listing. + +**Is there a draft status for these changes, or will saving make them live?** + +Any changes you save will take effect immediately, so make sure you're ready to push them out to the Marketplace before saving. + +**I've logged in to the Developer Portal, but I don't see my published listing. Where is it?** + +You may have logged in with the wrong account. Each listing can only be owned by one user, so it is likely assigned to another email address. If you're unable to track down the correct owner account for your solution, please reach out to [appstore@bigcommerce.com](mailto:appstore@bigcommerce.com). + +**I saved my changes, but my listing has not updated yet. What's the problem?** + +The changes will be effective immediately in your control panel app card, but the updates +can take up to 24 hours to appear on the App Marketplace. Feel free to use this as a grace period to make edits as needed. + +## Next steps +[Review the App Marketplace listing guide (PDF)](https://grow.bigcommerce.com/rs/695-JJT-333/images/Updated_List_of_App_Fields_for_Tech_Partners.pdf) + +## Resources + +### Sample apps +* [Node / React / Next.js](https://github.com/bigcommerce/sample-app-nodejs) +* [Python / Flask](https://github.com/bigcommerce/hello-world-app-python-flask) +* [PHP / Silex](https://github.com/bigcommerce/hello-world-app-php-silex) +* [Ruby / Sinatra](https://github.com/bigcommerce/hello-world-app-ruby-sinatra) +* [Laravel / React](https://github.com/bigcommerce/laravel-react-sample-app) +* [Node / FaunaDB / Netlify](https://github.com/bigcommerce/channels-app/) + +### Tools +* [Node API Client](https://github.com/bigcommerce/node-bigcommerce/) +* [Python API Client](https://github.com/bigcommerce/bigcommerce-api-python) +* [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) +* [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) +* [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) +* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) +* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) + +### Blog posts +* [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) +* [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/api-docs/apps/tutorials/sample-app-next/heroku-deploy.mdx b/docs/api-docs/apps/tutorials/sample-app-next/heroku-deploy.mdx new file mode 100644 index 000000000..014aeb123 --- /dev/null +++ b/docs/api-docs/apps/tutorials/sample-app-next/heroku-deploy.mdx @@ -0,0 +1,64 @@ +# Quick Start: Deploy to Heroku Install Flow + +If you want to skip the tutorial and get the app running quickly, you can use this install flow to deploy the sample app to [Heroku](https://www.heroku.com/home). To create a Heroku account, visit the [Heroku signup page](https://signup.heroku.com/). + + +### Fork the repo + +Fork the BigCommerce's [sample-app-nodejs](https://github.com/bigcommerce/sample-app-nodejs) repository. + +### Click deploy + +In your fork, locate the `README.md` file. Click **Deploy to Heroku**. This will open Heroku's [Create New App](https://dashboard.heroku.com/) page in your browser. + +![Deploy to Heroku](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-heroku-1.png "Deploy to Heroku") + +### Heroku: add app details + +When prompted, fill out your app details including giving your app a name. + +Scroll down to **Config Vars** and replace the `` placeholder inside `AUTH_CALLBACK` with your app's name. + +### BC DevTools: Create an app profile + +To obtain the client ID and client secret, sign in to the [Developer Portal](https://devtools.bigcommerce.com/my/apps) and click **Create an app**. Name the app and click **Create**. For now, click **Close** to continue without entering information. + +![Create an App](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-03.png "Create an App") + +### Add the app API account to Heroku + +On the My Apps page of the BC Developer Portal, locate your newly created app and click **View Client ID**. This will open a new window displaying your client ID and client secret. + +Copy and paste your app's client ID and client secret into your Heroku app. + +### Heroku: Deploy app server + +Click **Deploy app** at the bottom of Heroku's Create New App page. Wait for the deploy script to finish running. + +![Deploy app](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-heroku-2.png "Deploy app") + +### BC DevTools: Add Heroku callback URLs + +1. In the Developer Portal, click **Edit App**. +2. Open the **Technical** tab. Select STORE OWNER for **Multiple Users** and SINGLE-CLICK for **App Type**. +3. Scroll down to **Callback URLs** and update Auth, Load, and Uninstall URLs, replacing placeholders with your Heroku app URL. For example, your Auth Callback should look similar to the following: `https://heroku-sample-app.herokuapp.com/api/auth`. +4. Scroll down to OAuth scopes and set the **Products** access to MODIFY. +5. Click **Update & Close**. + +### Install the app on your sandbox + +In your sandbox store control panel, go to **Apps** > **My Apps** > **My Draft Apps**. Open your app and press **Install**. Click **Confirm**. This will install the app on your store. The installed app should look similar to the following: + +**Home page** + +![Home page](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-16.png "Home page") + +**Products page** + +![Products page](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-14.png "Products page") + +**Product page** + +![Product page](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-17.png "Product page") + + diff --git a/docs/api-docs/apps/tutorials/sample-app-next/introduction.mdx b/docs/api-docs/apps/tutorials/sample-app-next/introduction.mdx new file mode 100644 index 000000000..286a534d6 --- /dev/null +++ b/docs/api-docs/apps/tutorials/sample-app-next/introduction.mdx @@ -0,0 +1,35 @@ +# Introduction + + + +This tutorial demonstrates how to build and embed a BigCommerce app using Node.js, React.js, Next.js, and BigDesign, BigCommerce's library of React components. + +You will learn how to connect your app to BigCommerce, integrate an API, and set up a database to store app data. You will use BigDesign to give your app a native BigCommerce visual style and behavior. + +At the end of this tutorial, you will have a functional single-click app that can make API calls and store app data in a database. + + + #### Heroku option + To get the app up and running quickly, follow the steps described in [Quick Start: Deploy to Heroku Install Flow](/docs/integrations/apps/tutorial/nextjs-quick-start). + + + +## Prerequisites + +To successfully complete this tutorial, you need the following: + +* Experience using a text editor and a terminal app +* Experience with [Node.js](https://nodejs.org/en/), [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript), and [React.js](https://www.reactjs.org/) +* Experience using [npm](https://www.npmjs.com/) +* [BigCommerce sandbox store](/docs/start/about/sandboxes) (required to develop and test apps) +* [Developer Portal Account](https://devtools.bigcommerce.com/) (required to register apps) + +You will be using [Next.js](https://nextjs.org/), [BigDesign](https://developer.bigcommerce.com/big-design), and [styled-components](https://styled-components.com/docs) to build this sample app. + +[Next.js](https://nextjs.org/) is a production-ready React framework equipped with many built-in features that allows you to create static and dynamic React-based applications quickly. Next.js handles a lot of the backend work for you giving you a jump start on building applications. Among other built-in features, Next.js comes with a [page-based](https://nextjs.org/docs/basic-features/pages) routing system, [server-side rendering](https://nextjs.org/docs/basic-features/pages#server-side-rendering), and [client-side routing](https://nextjs.org/docs/routing/introduction#linking-between-pages). + +With the exception of automated routing, our sample app is very React-ive. Even if you haven't worked with Next.js before, having React experience will enable you to read the app. + +[BigDesign](https://developer.bigcommerce.com/big-design) is a BigCommerce library of React components. Using BigDesign when developing your BigCommerce apps will ensure that your app has a similar interface and adheres to the same user experience standards as the rest of the BigCommerce platform. We encourage you to familiarize yourself with BigDesign to simplify future integrations with BigCommerce. + +[Next: Set up Your Local Environment](/docs/integrations/apps/tutorial/nextjs-setup) diff --git a/docs/api-docs/apps/tutorials/sample-app-next/step-1-setup.mdx b/docs/api-docs/apps/tutorials/sample-app-next/step-1-setup.mdx new file mode 100644 index 000000000..023bd9c20 --- /dev/null +++ b/docs/api-docs/apps/tutorials/sample-app-next/step-1-setup.mdx @@ -0,0 +1,231 @@ +--- +title: Set up Your Local Environment +keywords: apps, next.js +--- + +# Step 1: Set up Your Local Environment + +Start by setting up your local development environment. + +## Install Node + +For this tutorial, you need Node.js version 18+. To check your version of Node.js, run the following command in your terminal: + +```shell copy filename="Check Node.js version" +node -v +``` + +If you do not have Node.js installed, you can download it from [nodejs.org (downloads)](https://nodejs.org/en/download/). + +## Set up a project directory + +1. Create a new project directory. + +2. Navigate to the directory using the terminal. + +## Generate a package.json file + + + #### Node.js version and custom dependencies + * Make sure that you are using Node.js version 18+ and npm version 8+. + * This sample app uses custom dependencies and does not rely on the `create-next-app` CLI tool. + + + +1. To create the project's `package.json` file, enter the [interactive initialization sequence](https://docs.npmjs.com/cli/v8/commands/npm-init). Run the following command in the terminal: + +```shell copy filename="Initialize package.json" +npm init +``` + +Press enter to continue prompts. + +To write a `package.json` file with default values, run `npm init -y` instead. Descriptive fields will be blank. + +## Install npm packages + +1. Install `big-design`, `big-design-icons`, `big-design-theme`, `dotenv`, `next`, `react`, `react-dom`, and `styled-components`. + +```shell copy filename="Install dependencies" +npm install --save @bigcommerce/big-design @bigcommerce/big-design-icons @bigcommerce/big-design-theme dotenv next react react-dom styled-components +``` + +2. Install dev dependencies. + +```shell copy filename="Install devDependencies" +npm install --save-dev babel-plugin-styled-components @types/node @types/react @types/react-dom @types/styled-components typescript +``` + +[babel-plugin-styled-components](https://www.npmjs.com/package/babel-plugin-styled-components) is a supplement to the styled-components library that, among other things, offers improved debugging and minification of styles. + +[@types/node](https://www.npmjs.com/package/@types/node) and [@types/react](https://www.npmjs.com/package/@types/react) contain TypeScript type definitions for Node.js and React.js respectively. + + + #### View tested package versions + You can view a list of all the tested package versions in the [package.json file on the Step 1 branch](https://github.com/bigcommerce/sample-app-nodejs/blob/step-1-app-foundation/package.json) of this sample app's repo. + + +## Add scripts + +1. Open `package.json` in your text editor. + +2. Update the `scripts` property, by adding the `dev`, `build`, and `start` scripts. + +```json filename="Add npm scripts" showLineNumbers copy +{ + ... + "scripts": { + "dev": "next", + "build": "next build", + "start": "next start -p $PORT", + "test": "echo \"Error: no test specified\" && exit 1" + } +} +``` + +3. Save your changes. + +## Add the node and npm engines + +1. Open `package.json` in your text editor. + +2. Add an `engines` property with the following values: + +```json filename="Add engines" showLineNumbers copy +{ + ... + "engines": { + "node": ">=16 <20", + "npm": ">=8 <10" + }, +} +``` + +3. Save your changes. + + +## Create a starter page + +1. In the root directory of your project, create a `pages` folder. + +2. In the `pages` folder, create an `index.tsx` file. This is your app's homepage. + +3. Open `index.tsx` in your code editor. + +4. Add `Panel` and `Text` BigDesign imports at the top of the file. + +```ts filename="Add imports index.tsx" +import { Panel, Text } from '@bigcommerce/big-design'; +``` + +The **Panel** component allows you to contain content in a structured format. To learn more about the BigDesign's **Panel** component, see [Panel Developer Docs](https://developer.bigcommerce.com/big-design/panel). + +**Text** is one of the many predefined typography components in BigDesign. BigDesign offers multiple properties to customize the typographic palette. To view available typography components, see [Typography](https://developer.bigcommerce.com/big-design/typography). + +5. Add the `Index` functional component below the import statements. You can [view index.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-1-app-foundation/pages/index.tsx). + +```tsx filename="Add functional component index.tsx" showLineNumbers copy +const Index = () => ( + + Hello world + +); + +export default Index; +``` + +Next.js associates each file in the pages folder with a route based on the file's name. Consequently, the `Index` React component you exported in `pages/index.tsx` will be accessible at `/index`. + +## Initialize BigDesign + +Next.js allows you to use a theme provider and import CSS files from `node_modules`. In this tutorial, you integrate [BigDesign](https://developer.bigcommerce.com/big-design/) to give your app a distinct BigCommerce look and feel. + +1. Next.js uses the `App` component to initialize pages. To override the default `App` component, add the `_app.tsx` file to the `pages` folder. This is where you initialize BigDesign. + +2. Open `_app.tsx` and import `GlobalStyles` from BigDesign and `AppProps` from Next.js. + +```ts filename="Add imports _app.tsx" +import { GlobalStyles } from '@bigcommerce/big-design'; +import type { AppProps } from 'next/app' +``` + +Importing the `GlobalStyles` component will set BigCommerce's base styles globally. + +3. Add the `MyApp` functional component below the import statements. You can [view _app.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-1-app-foundation/pages/_app.tsx). + +```tsx filename="Functional component _app.tsx" showLineNumbers copy +const MyApp = ({ Component, pageProps }: AppProps) => ( + <> + + + +); + +export default MyApp; +``` + +The `Component` prop represents the active page. Consequently, it will change when you navigate between routes. + +## Initialize styled-components + +Because BigDesign uses styled-components, we need to add additional configuration for both BigDesign and styled-components to function properly. + +1. Add a custom `_document.tsx` file to your pages folder. + +2. Import `Document` and `DocumentContext`, the built-in TypeScript types, from Next.js. + +```ts filename="Import components Document and DocumentContext" +import Document, { DocumentContext } from 'next/document'; +``` + +3. Import `ServerStyleSheet` from styled-components. + +```ts filename="Import component ServerStyleSheet" +import { ServerStyleSheet } from 'styled-components'; +``` + +4. Extend the `Document` class. You can [view _document.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-1-app-foundation/pages/_document.tsx). + +```tsx filename="Extend class Document" showLineNumbers copy +export default class MyDocument extends Document { + static async getInitialProps(ctx: DocumentContext) { + const sheet = new ServerStyleSheet(); + const originalRenderPage = ctx.renderPage; + + try { + ctx.renderPage = () => + originalRenderPage({ + enhanceApp: (App) => (props) => sheet.collectStyles(), + }) + + const initialProps = await Document.getInitialProps(ctx); + + return { + ...initialProps, + styles: ( + <> + {initialProps.styles} + {sheet.getStyleElement()} + + ), + }; + } finally { + sheet.seal(); + } + } +} +``` + +## Start the development server + +1. Using the terminal, open the root directory of your app and start the development server. + +```shell copy filename="Start development server" +npm run dev +``` + +2. Open `http://localhost:3000` from your browser. You should see the text “Hello world” displayed under **Homepage**. + +![Hello world](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-01.png "Hello world") + +[Next: Connect Your App to BigCommerce](/docs/integrations/apps/tutorial/nextjs-connect) diff --git a/docs/api-docs/apps/tutorials/sample-app-next/step-2-connect-to-bc.mdx b/docs/api-docs/apps/tutorials/sample-app-next/step-2-connect-to-bc.mdx new file mode 100644 index 000000000..c10716207 --- /dev/null +++ b/docs/api-docs/apps/tutorials/sample-app-next/step-2-connect-to-bc.mdx @@ -0,0 +1,275 @@ +--- +title: Connect Your App to BigCommerce +keywords: apps, next.js +--- + +# Step 2: Connect Your App to BigCommerce + +In this step, you connect your app to the BigCommerce ecosystem embedding it into **Draft Apps**. + +## Install node-bigcommerce + +To authenticate and use your app with the BigCommerce API, install BigCommerce's in-house [node-bigcommerce module (GitHub)](https://github.com/bigcommerce/node-bigcommerce). + +```shell copy filename="Install node client" +npm install github:bigcommerce/node-bigcommerce +``` + + + #### View tested package versions + You can view a list of all the tested package versions in the [package.json file on the Step 2 branch](https://github.com/bigcommerce/sample-app-nodejs/blob/step-2-connect-app-to-bc/package.json) of this sample app's repo. + + +## Setup the auth lib page + +1. In the root directory of your app, create a `lib` folder. + +2. In the `lib` folder, create an `auth.ts` file. + +3. Open the `auth.ts` file and add the `BigCommerce` import at the top of the file. + +```ts filename="Add imports auth.ts" showLineNumbers copy +import * as BigCommerce from 'node-bigcommerce'; +``` + +4. Create a BigCommerce instance required as part of the authorization step when first installing the application. + +```ts filename="Create BC instance auth.ts" showLineNumbers copy +// Create BigCommerce instance +// https://github.com/bigcommerce/node-bigcommerce/ +const bigcommerce = new BigCommerce({ + logLevel: 'info', + clientId: process.env.CLIENT_ID, + secret: process.env.CLIENT_SECRET, + callback: process.env.AUTH_CALLBACK, + responseType: 'json', + headers: { 'Accept-Encoding': '*' }, + apiVersion: 'v3' +}); + +const bigcommerceSigned = new BigCommerce({ + secret: process.env.CLIENT_SECRET, + responseType: 'json' +}); + +interface QueryParams { + [key: string]: string; +} +``` + +The `bigcommerceSigned` function is called when loading or uninstalling the application. + +5. Export the `getBCAuth` function. + +```ts filename="Export getBCAuth auth.ts" showLineNumbers copy +export function getBCAuth(query: QueryParams) { + return bigcommerce.authorize(query); +} +``` + +You use the `authorize` method for the `/auth` API endpoint which gets called when you install or update the app. The `authorize` method retrieves your permanent access token and returns it in the `data` object. + +6. Export the `getBCVerify` function. + +```ts filename="Exports getBCVerify auth.ts" showLineNumbers copy +export function getBCVerify({ signed_payload_jwt }: QueryParams) { + return bigcommerceSigned.verifyJWT(signed_payload_jwt); +} +``` + +The `verifyJWT` method employs the `signed_payload_jwt` query parameter to authenticate requests. You use the `verifyJWT` method for both `/load` and `/uninstall` API endpoints. To learn more about the OAuth flow, see [Single-Click App OAuth Flow](/docs/integrations/apps/guide/auth). + +You can [view auth.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-2-connect-app-to-bc/lib/auth.ts). + +## Add API endpoints + +Next.js maps all APIs that are part of the Next.js application to the `/api/*` route. You can take advantage of it by creating a sub-directory within the `pages` folder called `api`. This signals Next.js to treat files within `/pages/api` as API endpoints and automatically handle their routing. To learn more about Next.js API routes, see [API Routes](https://nextjs.org/docs/api-routes/introduction). + +1. In the `pages` folder, create an `api` folder. + +2. Open the `api` folder and add the following files: `auth.ts`, `load.ts`, and `uninstall.ts`. + +3. Open the `auth.ts` file and add the logic to authorize the app. You can [view auth.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-2-connect-app-to-bc/pages/api/auth.ts). + +```ts filename="Add logic auth.ts" showLineNumbers copy +import { NextApiRequest, NextApiResponse } from 'next'; +import { getBCAuth } from '../../lib/auth'; + +export default async function auth(req: NextApiRequest, res: NextApiResponse) { + try { + // First, authorize the application + // req.query: query param passed from the Control Panel to your app + await getBCAuth(req.query); + // Once the app has been authorized, redirect to the homepage (/pages/index.tsx) + res.redirect(302, '/'); + } catch (error) { + const { message, response } = error; + res.status(response?.status || 500).json({ message }); + } +} +``` + +The `/auth` endpoint gets called when installing the app. Launching (loading) or uninstalling the app will not call the `/auth` endpoint. + +4. Open the `load.ts` file and add the logic to sign the user in when the app calls the `/load` endpoint (when launching the app). You can [view load.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-2-connect-app-to-bc/pages/api/load.ts). + +```ts filename="Add logic load.ts" showLineNumbers copy +import { NextApiRequest, NextApiResponse } from 'next'; +import { getBCVerify } from '../../lib/auth'; + +export default async function load(req: NextApiRequest, res: NextApiResponse) { + try { + await getBCVerify(req.query); + + res.redirect(302, '/'); + } catch (error) { + const { message, response } = error; + res.status(response?.status || 500).json({ message }); + } +} +``` + +5. Open the `uninstall.ts` file and add the logic to remove a user who has uninstalled the application from their BigCommerce account. You can [view uninstall.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-2-connect-app-to-bc/pages/api/uninstall.ts). + +```ts filename="Add logic uninstall.ts" showLineNumbers copy +import { NextApiRequest, NextApiResponse } from 'next'; +import { getBCVerify } from '../../lib/auth'; + +export default async function uninstall(req: NextApiRequest, res: NextApiResponse) { + try { + await getBCVerify(req.query); + + res.status(200).end(); + } catch (error) { + const { message, response } = error; + res.status(response?.status || 500).json(message); + } +} +``` + +## Create an HTTPS tunnel + +To connect your sample app to BigCommerce, you need a publicly accessible URL. To add network access while still in the development phase, you can use [ngrok](https://ngrok.com/docs), a free tool that lets you expose local servers like `localhost:3000` to the public internet over secure tunnels. + +1. Open a new terminal window and install [ngrok](https://www.npmjs.com/package/ngrok#usage). + +```shell copy filename="Install ngrok" +npm install ngrok -g +``` + +2. Expose the web server on port 3000 to the internet. + +```shell copy filename="Expose server ngrok" +ngrok http 3000 +``` + +3. Your terminal should display a message similar to the following: + +![https tunnel](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-02.png "https tunnel") + + + #### Ngrok configuration + Although you can use the `ngrok` npm package without creating an account, any unauthenticated tunnels you create will expire after two hours. For the best development experience, [create a free ngrok account](https://dashboard.ngrok.com/signup), [find your ngrok authtoken](https://dashboard.ngrok.com/get-started/your-authtoken), and [add the authtoken](https://ngrok.com/docs#getting-started-authtoken) to your global `ngrok` configuration. + + +## Register the draft app + +To register an app, you need a BigCommerce store. If you do not have a BigCommerce store, visit the [BigCommerce Pricing](https://www.bigcommerce.com/essentials/pricing/) page to start a free trial. + +1. In your [Developer Portal](https://devtools.bigcommerce.com/my/apps) account, click **Create an app**. + +![Create an app](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-03.png "Create an app") + +2. Enter app details at the prompts. Because you are building a sample app, you can name it anything you want. Production-level apps should meet the general requirements outlined in [Approval Requirements](/docs/integrations/apps/guide/requirements). + +3. Click **Technical**. + +4. Under **App Features**, select **STORE OWNER** for Multiple Users and **SINGLE-CLICK** for App Type. + +5. To fill out Callback URLs, retrieve the public HTTPS URL of your ngrok tunnel. + +![HTTPS URL](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-05.png "HTTPS URL") + + + #### Use the secure tunnel + Avoid using the unsecured HTTP URL to prevent security policy errors. + + +* For Auth Callback URL, enter the ngrok URL of your app followed by `/api/auth`. +* For Load Callback URL, enter the ngrok URL of your app followed by `/api/load`. +* For Uninstall Callback URL, enter the ngrok URL of your app followed by `/api/uninstall`. + +![Callback URL](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-06.png "Callback URL") + + + #### Next.js route mapping + Next.js maps all APIs that are part of the Next.js application to the `/api/*` route. To learn more about Next.js API routes, see [API Routes](https://nextjs.org/docs/api-routes/introduction). + + +6. Because you will be modifying the Products API resource, set the Products OAuth scope to **MODIFY**. To learn more about the available OAuth scopes, see [OAuth scopes](/docs/start/authentication/api-accounts#oauth-scopes). + +![OAuth scopes](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-07.png "OAuth Scopes") + +7. Click **Update & Close**. + +8. Select **Confirm Update**. + +You should see your app listed under **My Apps** in your **Developer Portal** account. + +## Add your client ID and client secret + +It is best practice to declare environment variables in the `.env` environment file. You use the `.env` file to store your Client ID and Client Secret Key. + +Next.js comes pre-equipped to handle environment variables. It loads environment variables from `.env.local` into `process.env`, allowing you to use them in Next.js data fetching and API routes. To learn more, see [Next.js Environment Variables](https://nextjs.org/docs/basic-features/environment-variables). + +1. Create an `.env` file in the root directory of your app. + +2. Add the app's credentials and auth callback placeholders to the `.env` file. + +```shell copy filename="Initial contents .env" +CLIENT_ID={app client id} +CLIENT_SECRET={app secret} + +AUTH_CALLBACK=https://{ngrok_url}/api/auth + +# Most users do not need to change this +API_URL=api.bigcommerce.com +``` + + + #### Don't commit authentication credentials + Never share sensitive data such as API keys and passwords publicly. Avoid committing them to your repository. + + + +3. Navigate to [Developer Portal > My Apps](https://devtools.bigcommerce.com/my/apps). Locate your app and click **View Client ID** to retrieve your app's credentials. +4. Copy the app's client ID and client secret and paste them into the `.env` file. +5. Update `AUTH_CALLBACK` in `.env` with your `{ngrok_url}`. Because `env` variables are loaded on build, make sure to save your changes. +6. Switch to the terminal window where the dev server is currently running and restart the dev environment. + +```shell copy filename="Restart dev server" +npm run dev +``` + + + #### Ngrok expiration and callbacks + If ngrok stops working or your ngrok session expires, restart the tunnel to get the new `{ngrok_url}` and update the callback URLs in the Developer Portal and the `AUTH_CALLBACK` in the `.env` file. + + +## Install and launch the app + +1. Sign in to your BigCommerce store and navigate to [**Apps** > **My Apps** > **My Draft Apps**](https://login.bigcommerce.com/deep-links/manage/marketplace/apps/my-apps/drafts). You should see your new app displayed under **My Draft Apps**. + +![My draft apps](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-08.png "My draft apps") + +2. Click the app's name. + +3. Click **Install**. + +4. Click **Confirm**. + +You should see your app embedded in the BigCommerce platform. + +![Embedded app](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-09.png "Embedded app") + +[Next: Integrate the BigCommerce API and Add a Database](/docs/integrations/apps/tutorial/nextjs-integrate) diff --git a/docs/api-docs/apps/tutorials/sample-app-next/step-3-integrate-api.mdx b/docs/api-docs/apps/tutorials/sample-app-next/step-3-integrate-api.mdx new file mode 100644 index 000000000..12c5b440e --- /dev/null +++ b/docs/api-docs/apps/tutorials/sample-app-next/step-3-integrate-api.mdx @@ -0,0 +1,864 @@ +--- +title: Integrate the BigCommerce API and Add a Database +keywords: apps, if, next.js +--- + +# Step 3: Integrate the BigCommerce API and Add a Database + +Now that you have embedded your app in the BigCommerce platform, you're ready to integrate the BigCommerce API. + +Anytime you make an API call to BigCommerce, you need to pass in the access token. Storing the access token in a database allows you to persist the session when you call `/auth`, `/load`, or `/uninstall` endpoints. + +This step demonstrates how to integrate the sample app with [Cloud Firestore](https://firebase.google.com/docs/firestore/quickstart), a cloud-hosted NoSQLFirebase database, and [MySQL](https://www.mysql.com/), a relational database management system. + +## Install npm packages + +If using Firebase, install `firebase`, `jsonwebtoken`, and `swr` npm packages. + +```shell copy filename="Install packages Firebase" +npm install --save firebase jsonwebtoken swr +``` + +If using MySQL, install `mysql2`, `jsonwebtoken`, and `swr` npm packages. + +```shell copy filename="Install packages MySQL" +npm install --save mysql2 jsonwebtoken swr +``` + + + #### Firebase version + These instructions have been tested using the **firebase v9** package. You can view a list of all the tested package versions in the [package.json file on the Step 3 branch](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/package.json) of this sample app's repo. + + +## Add scripts + +1. Open `package.json` in your text editor. + +2. Update the `scripts` property to include the `db:setup` script. + +```json filename="Add npm scripts" showLineNumbers copy +{ + ... + "scripts": { + ..., + "db:setup": "node scripts/db.js" + } +} +``` + +3. Save your changes. + +## Add TypeScript definitions + +1. In the root directory of your project, add a `types` folder. + +2. In the `types` folder, create `auth.ts`, `db.ts`, and `index.ts` files. + +3. Open the `auth.ts` file and export `User`, `SessionProps`, and `QueryParams` TypeScript type definitions. You can [view auth.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/types/auth.ts). + +```ts filename="Export types auth.ts" showLineNumbers copy +export interface User { + id: number; + username?: string; + email: string; +} + +export interface SessionProps { + access_token?: string; + scope?: string; + user: User; + context: string; + store_hash?: string; + timestamp?: number; +} + +export interface QueryParams { + [key: string]: string | string[]; +} +``` + +4. Open the `db.ts` file. Import `SessionProps` from `./index` and export `StoreData`, `UserData`, and `Db` TypeScript type definitions. You can [view db.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/types/db.ts). + +```ts filename="Export types db.ts" showLineNumbers copy +import { SessionProps } from './index'; + +export interface StoreData { + accessToken?: string; + scope?: string; + storeHash: string; +} + +export interface UserData { + email: string; + username?: string; +} + +export interface Db { + setUser(session: SessionProps): Promise; + setStore(session: SessionProps): Promise; + getStoreToken(storeHash: string): string | null; + deleteStore(session: SessionProps): Promise; +} +``` + +5. Open the `index.ts` file and export all interfaces. You can [view index.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/types/index.ts). + +```ts filename="Add exports index.ts" showLineNumbers copy +export * from './auth'; +export * from './db'; +``` + + + + #### Ngrok expiration and callbacks + If ngrok stops working or your ngrok session expires, restart the tunnel to get the new `{ngrok_url}` and update the callback URLs in the Developer Portal and the `AUTH_CALLBACK` in the `.env` file. + + + +## Initialize React Context + +React's Context API is a state management tool that streamlines the process of passing data to multiple components at different nesting levels. It lets you pass data through the component tree without having to pass props through multiple levels of React components. To learn more about Context, see React's [Context guide](https://reactjs.org/docs/context.html). + +1. In the root of your app, create a `context` folder. + +2. In the `context` folder, create a `session.tsx` file. + +3. Add the logic to create a context. You can [view session.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/context/session.tsx). + +```tsx filename="Add context logic session.tsx" showLineNumbers copy +import { useRouter } from 'next/router'; +import { createContext, useContext, useEffect, useState } from 'react'; + +const SessionContext = createContext({ context: '' }); + +const SessionProvider = ({ children }) => { + const { query } = useRouter(); + const [context, setContext] = useState(''); + + useEffect(() => { + if (query.context) { + setContext(query.context.toString()); + } + }, [query.context]); + + return ( + + {children} + + ); +}; + +export const useSession = () => useContext(SessionContext); + +export default SessionProvider; +``` + +## Update environment variables + +You use a JSON Web Token (**JWT**) to securely transmit information encoded as a JSON object between parties. To learn more about JWT, see the [Internet Engineering Task Force documentation](https://datatracker.ietf.org/doc/html/rfc7519). + +1. Open the `.env` file. + +2. Enter a JWT secret. Your JWT key should be at least 32 random characters (256 bits) for HS256. + +```shell copy filename="Add JWT secret" +JWT_KEY={SECRET} +``` + + + #### JWT key length + The JWT key should be at least 32 random characters (256 bits) for HS256. + + +## Update the auth lib page + +1. In the `lib` folder, open the `auth.ts` file. + +2. At the top of the file, add the following imports: + +```ts filename="Add imports auth.ts" showLineNumbers copy +import * as jwt from 'jsonwebtoken'; +import * as BigCommerce from 'node-bigcommerce'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { QueryParams, SessionProps } from '../types'; +import db from './db'; +``` + +3. Below the import statements, add the following line of code to destructure environment variables from `.env`: + +```ts filename="Add imports auth.ts" showLineNumbers copy +const { AUTH_CALLBACK, CLIENT_ID, CLIENT_SECRET, JWT_KEY } = process.env; +``` + +4. Remove the `process.env` global variable from the BigCommerce instances. + +```ts filename="Export client config auth.ts" showLineNumbers copy +const bigcommerce = new BigCommerce({ + logLevel: 'info', + clientId: CLIENT_ID, + secret: CLIENT_SECRET, + callback: AUTH_CALLBACK, + responseType: 'json', + headers: { 'Accept-Encoding': '*' }, + apiVersion: 'v3' +}); + +const bigcommerceSigned = new BigCommerce({ + secret: CLIENT_SECRET, + responseType: 'json' +}); +``` + +5. Remove the `QueryParams` interface. + +```ts filename="Remove QueryParams auth.ts" showLineNumbers copy +//Delete this code +interface QueryParams { + [key: string]: string; +} +``` + +6. Below the `bigcommerceSigned` variable, export the `bigcommerceClient` function. + +```ts filename="Export client config auth.ts" showLineNumbers copy +export function bigcommerceClient(accessToken: string, storeHash: string) { + return new BigCommerce({ + clientId: CLIENT_ID, + accessToken, + storeHash, + responseType: 'json', + apiVersion: 'v3' + }); +} +``` + +7. Export `getBCAuth` and `getBCVerify` functions. + +```ts filename="Export JWT handling auth.ts" showLineNumbers copy +export function getBCAuth(query: QueryParams) { + return bigcommerce.authorize(query); +} + +export function getBCVerify({ signed_payload_jwt }: QueryParams) { + return bigcommerceSigned.verifyJWT(signed_payload_jwt); +} +``` + +8. Add the `setSession`, `getSession`, and `removeDataStore` functions. + +```ts filename="Export sessions auth.ts" showLineNumbers copy +export async function setSession(session: SessionProps) { + db.setUser(session); + db.setStore(session); +} + +export async function getSession({ query: { context = '' } }: NextApiRequest) { + if (typeof context !== 'string') return; + const decodedContext = decodePayload(context)?.context; + const accessToken = await db.getStoreToken(decodedContext); + + return { accessToken, storeHash: decodedContext }; +} + +export async function removeDataStore(res: NextApiResponse, session: SessionProps) { + await db.deleteStore(session); +} +``` + +9. Add the `encodePayload` and `decodePayload` functions. You can [view auth.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/lib/auth.ts) + +```ts filename="Export payload functions auth.ts" showLineNumbers copy +export function encodePayload({ ...session }: SessionProps) { + const contextString = session?.context ?? session?.sub; + const context = contextString.split('/')[1] || ''; + + return jwt.sign({ context }, JWT_KEY, { expiresIn: '24h' }); +} + +export function decodePayload(encodedContext: string) { + return jwt.verify(encodedContext, JWT_KEY); +} +``` + + + +## Add a database + +In this section of the tutorial, we provide config and initialization code for both Firebase and MySQL databases. Depending on the database you choose to integrate your app with, use the configuration instructions specific to your setup. + +For Firebase configuration instructions, see [Set up Firebase database](#set-up-firebase-database). + +For MySQL configuration instructions, see [Set up MySQL database](#set-up-mysql-database). + +## Set up Firebase database + +[Cloud Firestore](https://firebase.google.com/docs/firestore/quickstart) is a cloud-hosted NoSQL Firebase database built on Google's infrastructure. To learn more about Firebase, including how-to guides and code samples, see [Firebase Documentation](https://firebase.google.com/docs). For a quickstart on how to set up your Cloud Firestore, see [Get started](https://firebase.google.com/docs/firestore/quickstart). + +### Create a Firebase project + +1. Sign in to [Cloud Firestore](https://firebase.google.com/products/firestore) using your Google account. To create a Google account, visit the [Google signup page](https://accounts.google.com/signup/v2/webcreateaccount?hl=en&flowName=GlifWebSignIn&flowEntry=SignUp). + +2. Once logged in, click **Go to console** in the top right corner. + +3. In the Firebase console, click **Add project**. + +4. Enter your project name and click **Continue**. + +5. Click **Create project**. + +### Create a Firebase config + +1. In your Firebase project console, click on the **settings icon** that resembles a gear in the top left corner. + +2. Select **Project settings** from the dropdown menu. + +3. Under the **General** tab, scroll down to **Your apps** and click on the **code icon** (``) to select the web platform. + +4. Type in the name of your app and click **Register app**. + +5. Make a note of the Firebase `apiKey`, `authDomain`, and `projectId`. You will need that information to update the app's environment variables. + +### Create a Cloud Firestore database + +1. In your Firebase console, click **Firestore Database** under **Build** in the left pane. Follow the steps to create a Cloud Firestore database. + +2. Click **Create database**. + +3. Choose **Start in test mode**. + +4. Select your Cloud Firestore location and click **Enable**. + +### Update environment variables + +1. In the `.env` file, specify the database type. + +```shell copy filename="Add environment variables Firebase" +DB_TYPE=firebase +``` + +2. Enter your Firebase database config keys. + +```shell copy filename="Add environment variables Firebase" showLineNumbers copy +FIRE_API_KEY={firebaseConfig.apiKey} +FIRE_DOMAIN={firebaseConfig.authDomain} +FIRE_PROJECT_ID={firebaseConfig.projectId} +``` + + + #### Restart after adding environment variables + In the development mode, every time you modify your environment variables, make sure to restart the development server to capture the changes, using `npm run dev{:shell}`. + + +### Configure the Firebase database + +1. In the `lib` folder, create a `dbs` folder. + +2. In the `dbs` folder, create a `firebase.ts` file. + +3. At the top of the file, import the Firebase packages and TypeScript definitions. You can [view firebase.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/lib/dbs/firebase.ts). + +```ts filename="Add imports firebase.ts" showLineNumbers copy +import { initializeApp } from 'firebase/app'; +import { deleteDoc, doc, getDoc, getFirestore, setDoc, updateDoc } from 'firebase/firestore'; +import { SessionProps, UserData } from '../../types'; +``` + +4. Add the Firebase config and initialization logic. You can [view firebase.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/lib/dbs/firebase.ts) + +```ts filename="Add config firebase.ts" showLineNumbers copy +// Firebase config and initialization +// Prod applications might use config file +const { FIRE_API_KEY, FIRE_DOMAIN, FIRE_PROJECT_ID } = process.env; + +const firebaseConfig = { + apiKey: FIRE_API_KEY, + authDomain: FIRE_DOMAIN, + projectId: FIRE_PROJECT_ID, +}; + +const app = initializeApp(firebaseConfig); +const db = getFirestore(app); + +// Firestore data management functions +export async function setUser({ user }: SessionProps) { + if (!user) return null; + + const { email, id, username } = user; + const ref = doc(db, 'users', String(id)); + const data: UserData = { email }; + + if (username) { + data.username = username; + } + + await setDoc(ref, data, { merge: true }); +} + +export async function setStore(session: SessionProps) { + const { + access_token: accessToken, + context, + scope, + user: { id }, + } = session; + // Only set on app install or update + if (!accessToken || !scope) return null; + + const storeHash = context?.split('/')[1] || ''; + const ref = doc(db, 'store', storeHash); + const data = { accessToken, adminId: id, scope }; + + await setDoc(ref, data); +} + +export async function getStoreToken(storeHash: string) { + if (!storeHash) return null; + const storeDoc = await getDoc(doc(db, 'store', storeHash)); + + return storeDoc.data()?.accessToken ?? null; +} + +export async function deleteStore({ store_hash: storeHash }: SessionProps) { + const ref = doc(db, 'store', storeHash); + + await deleteDoc(ref); +} +``` + +5. Running `firebase.initializeApp()` will initialize the app. For initialized apps, call `firebase.app()` to retrieve the Firebase app instance. + +## Set up MySQL database + +[MySQL](https://www.mysql.com/) is a relational database management system. For instructions on how to set up and use MySQL, see [Getting Started with MySQL](https://dev.mysql.com/doc/mysql-getting-started/en/). Once you complete the database setup, make a note of the MySQL `host`, `domain`, `username`, `password`, and `port` variables. You will need them to update the app's environment variables in the next step. + +### Update environment variables + +1. In the `.env` file, specify the database type. + +```shell copy filename=".env" +DB_TYPE=mysql +``` + +2. Enter your MySQL database config keys. + +```shell copy filename="Add .env MySQL" +MYSQL_HOST={mysql host} +MYSQL_DATABASE={mysql domain} +MYSQL_USERNAME={mysql username} +MYSQL_PASSWORD={mysql password} +MYSQL_PORT={mysql port} +``` + + + #### Restart dev server when .env changes + In the development mode, every time you modify your environment variables, make sure to restart the development server to capture the changes, using `npm run dev{:shell}`. + + +### Configure MySQL + +1. In the `dbs` folder, create a `mysql.ts` file. + +2. At the top of the file, add the following imports: + +```ts filename="Add imports mysql.ts" showLineNumbers copy +import * as mysql from 'mysql2'; +import { promisify } from 'util'; +import { SessionProps, StoreData } from '../../types'; +``` + +3. Add the MySQL config and initialization logic. You can [view mysql.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/lib/dbs/mysql.ts). + +```ts filename="Add config mysql.ts" showLineNumbers copy +const MYSQL_CONFIG = { + host: process.env.MYSQL_HOST, + database: process.env.MYSQL_DATABASE, + user: process.env.MYSQL_USERNAME, + password: process.env.MYSQL_PASSWORD, + ...(process.env.MYSQL_PORT && { port: process.env.MYSQL_PORT }), +}; + +// For use with Heroku ClearDB +// Other mysql: https://www.npmjs.com/package/mysql#pooling-connections +const pool = mysql.createPool(process.env.CLEARDB_DATABASE_URL ? process.env.CLEARDB_DATABASE_URL : MYSQL_CONFIG); +const query = promisify(pool.query.bind(pool)); + +export async function setUser({ user }: SessionProps) { + if (!user) return null; + + const { email, id, username } = user; + const userData = { email, userId: id, username }; + + await query('REPLACE INTO users SET ?', userData); +} + +export async function setStore(session: SessionProps) { + const { access_token: accessToken, context, scope } = session; + // Only set on app install or update + if (!accessToken || !scope) return null; + + const storeHash = context?.split('/')[1] || ''; + + const storeData: StoreData = { accessToken, scope, storeHash }; + await query('REPLACE INTO stores SET ?', storeData); +} + +export async function getStoreToken(storeHash: string) { + if (!storeHash) return null; + + const results = await query('SELECT accessToken from stores limit 1'); + + return results.length ? results[0].accessToken : null; +} + +export async function deleteStore({ store_hash: storeHash }: SessionProps) { + await query('DELETE FROM stores WHERE storeHash = ?', storeHash); +} +``` + +## Set up a db lib page + +1. In the `lib` folder, create a `db.ts` file. + +2. Open the `db.ts` file and add the following imports at the top of the file. + +```ts filename="Add imports db.ts" +import * as firebaseDB from './dbs/firebase'; +import * as sqlDB from './dbs/mysql'; +import { Db } from '../types'; +``` + +3. Add the switch expression to determine which database code to execute. You can [view db.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/lib/db.ts). + +```ts filename="Add config db.ts" showLineNumbers copy +const { DB_TYPE } = process.env; + +let db: Db; + +switch (DB_TYPE) { + case 'firebase': + db = firebaseDB; + break; + case 'mysql': + db = sqlDB; + break; + default: + db = firebaseDB; + break; +} + +export default db; +``` + +## Run the initial database migration + +If you're using MySQL, set up the initial tables by navigating to the root directory of your project and running the following script: + +```shell filename="Initial database migration" copy +npm run db:setup +``` + +## Upgrade the endpoints + +### Auth endpoint + +1. Open the `auth.ts` file nested inside the `pages/api` folder. + + 1. Import `encodePayload`, `getBCVerify`, and `setSession` from `/lib/auth`. Your imports should now look like this: + +```ts filename="auth.ts" showLineNumbers copy +import { NextApiRequest, NextApiResponse } from 'next'; +import { encodePayload, getBCAuth, setSession } from '../../lib/auth'; +``` + +3. Update the logic to authenticate the app on install. You can [view auth.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/pages/api/auth.ts). + +```ts filename="Add config auth.ts" showLineNumbers copy +export default async function auth(req: NextApiRequest, res: NextApiResponse) { + try { + // Authenticate the app on install + const session = await getBCAuth(req.query); + const encodedContext = encodePayload(session); // Signed JWT to validate/ prevent tampering + + await setSession(session); + res.redirect(302, `/?context=${encodedContext}`); + } catch (error) { + const { message, response } = error; + res.status(response?.status || 500).json({ message }); + } +} +``` + +### Load endpoint + +1. Open the `load.ts` file nested inside the `pages/api` folder. + +2. Import `encodePayload`, `getBCVerify`, and `setSession` from `/lib/auth`. Your imports should now look like this: + +```ts filename="Add imports load.ts" showLineNumbers copy +import { NextApiRequest, NextApiResponse } from 'next'; +import { encodePayload, getBCVerify, setSession } from '../../lib/auth'; +``` + +3. Update the logic to authenticate the app on load. You can [view load.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/pages/api/load.ts). + +```ts filename="Add config load.ts" showLineNumbers copy +export default async function load(req: NextApiRequest, res: NextApiResponse) { + try { + // Verify when app loaded (launch) + const session = await getBCVerify(req.query); + const encodedContext = encodePayload(session); // Signed JWT to validate/ prevent tampering + + await setSession(session); + res.redirect(302, `/?context=${encodedContext}`); + } catch (error) { + const { message, response } = error; + res.status(response?.status || 500).json({ message }); + } +} +``` + +### Uninstall endpoint + + +1. Open the `uninstall.ts` file nested inside the `pages/api` folder. + +2. Import `getBCVerify` and `removeSession` from `/lib/auth`. Your imports should now look like this: + +```ts filename="Add imports uninstall.ts" showLineNumbers copy +import { NextApiRequest, NextApiResponse } from 'next'; +import { getBCVerify, removeSession } from '../../lib/auth'; +``` + +3. Update the logic to delete the session at time of uninstall. You can [view uninstall.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/pages/api/uninstall.ts). + +```ts filename="Add config uninstall.ts" showLineNumbers copy +export default async function uninstall(req: NextApiRequest, res: NextApiResponse) { + try { + const session = await getBCVerify(req.query); + + await removeSession(res, session); + res.status(200).end(); + } catch (error) { + const { message, response } = error; + res.status(response?.status || 500).json(message); + } +} +``` + + +## Add the Products endpoint + +The Products endpoint retrieves your products summary from the [Catalog API](/docs/rest-catalog). + +1. In the `pages/api` folder, create a new folder called `products`. + +2. In the `products` folder, create an `index.ts` file. This will create a `/products` route. + +3. At the top of the file, import the following packages: + +```ts filename="index.ts" showLineNumbers copy +import { NextApiRequest, NextApiResponse } from 'next'; +import { bigcommerceClient, getSession } from '../../../lib/auth'; +``` + +4. Add the async `products` function, which awaits the data returned from `bigcommerce.get`. You can [view index.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/pages/api/products/index.ts). The `products` function calls the `getSession` function to retrieve the session's access token and store hash. + +```ts filename="Add products function index.ts" showLineNumbers copy +export default async function products(req: NextApiRequest, res: NextApiResponse) { + try { + // First, retrieve the session by calling: + const { accessToken, storeHash } = await getSession(req); + // Then, connect the Node API client (to make API calls to BigCommerce) + const bigcommerce = bigcommerceClient(accessToken, storeHash); + // For this example, we'll be connecting to the Catalog API + const { data } = await bigcommerce.get('/catalog/summary'); + res.status(200).json(data); + // Finally, handle errors + } catch (error) { + const { message, response } = error; + res.status(response?.status || 500).json({ message }); + } +} +``` + +## Create a custom hook + +To consume the Products endpoint, create a custom React hook using [SWR](https://swr.vercel.app/). + +1. In the `lib` folder, create a `hooks.ts` file. + +2. At the top of the file, import the `useSWR` React hook from SWR and `useSession` from Context. + +```ts filename="Add imports hooks.ts" showLineNumbers copy +import useSWR from 'swr'; +import { useSession } from '../context/session'; +``` + +3. Declare the `fetcher` function. + +```ts filename="Declare fetcher hooks.ts" showLineNumbers copy +function fetcher(url: string, encodedContext: string) { + return fetch(`${url}?context=${encodedContext}`).then(res => res.json()); +} +``` + +The `fetcher` function accepts the API URL and returns data asynchronously. + +4. Export the `useProducts` function. You can [view hooks.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/lib/hooks.ts). + +```ts filename="Export useProducts hooks.ts" showLineNumbers copy +// Reusable SWR hooks +// https://swr.vercel.app/ +export function useProducts() { + const encodedContext = useSession()?.context; + // Request is deduped and cached; Can be shared across components + const { data, error } = useSWR(encodedContext ? ['/api/products', encodedContext] : null, fetcher); + + return { + summary: data, + isError: error, + }; +} +``` + +`useSWR` accepts two arguments: the API URL and the `fetcher` function. The `fetcher` function takes the `/api/products` URL passed in from the `useProduct` function. The `useProducts` function destructures the data returned by the `useSWR` hook. + +## Create a header component + +1. In the app's root directory, create a `components` folder. + +2. In the `component`s folder, create a `header.tsx` file. + +3. Import `Box` and `Link` components from BigDesign. + +```tsx filename="Add imports header.tsx" showLineNumbers copy +import { Box, Link } from '@bigcommerce/big-design'; +``` + +4. Define the `Header` functional component. You can [view header.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/components/header.tsx). + +```tsx filename="Functional component header.tsx" showLineNumbers copy +const Header = () => ( + + Home + +); + +export default Header; +``` + +## Update the homepage + +1. In the `pages` folder, open the `index.tsx` file. + +2. At the top of the file, replace the existing import with the following: + +```tsx filename="Add imports index.tsx" showLineNumbers copy +import { Box, Flex, Panel, Text } from '@bigcommerce/big-design'; +import { useProducts } from '../lib/hooks'; +``` + +3. Update the `Index` functional component. You can [view index.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/pages/index.tsx). + +```tsx filename="Functional component index.tsx" showLineNumbers copy +const Index = () => { + const { summary } = useProducts(); + + return ( + + {summary && + + + Inventory Count + {summary.inventory_count} + + + Variant Count + {summary.variant_count} + + + Primary Category + {summary.primary_category_name} + + + } + + ); +}; + +export default Index; +``` + + +`summary` creates the `Flex` component with three `Box` components inside of it. `inventory_count`, `variant_count`, and `primary_category_name` are populated with data returned from calling the `/catalog/summary` endpoint added in [Add the Products endpoint](#add-the-products-endpoint). + +For the complete list of properties returned by the `/catalog/summary` endpoint, see [Get a Catalog Summary](/docs/rest-catalog/products/summary#get-a-catalog-summary). + +## Update the user interface + +1. In the root of the pages folder, open the `_app.tsx` file. + +2. Import the `Box` and `Header` components. + +```tsx filename="_app.tsx" showLineNumbers copy +import { Box, GlobalStyles } from '@bigcommerce/big-design'; +import Header from '../components/header'; +``` + +3. Import `SessionProvider` from Context. + +```tsx filename="_app.tsx" showLineNumbers copy +import SessionProvider from '../context/session'; +``` + +Your updated import statements should resemble the following: + +```tsx filename="_app.tsx" showLineNumbers copy +import { Box, GlobalStyles } from '@bigcommerce/big-design'; +import type { AppProps } from 'next/app'; +import Header from '../components/header'; +import SessionProvider from '../context/session'; +``` + +4. For Context to properly propagate, we need to wrap `` with the Context `SessionProvider`. This ensures that each page has access to the React Context. + +```tsx filename="SessionProvider _app.tsx" showLineNumbers copy + + + +``` + +5. Add a `Box` component and place the `Header` and `SessionProvider` components inside it. You can [view _app.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-3-add-database/pages/_app.tsx). + +```tsx filename="Add Box _app.tsx" showLineNumbers copy +const MyApp = ({ Component, pageProps }: AppProps) => ( + <> + + +
    + + + + + +); + +export default MyApp; +``` + + +6. In the root of the `pages` folder, open `index.tsx`. + +7. Import the `Header` component. You can [view index.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-add-database/pages/index.tsx). + +```tsx filename="Add imports index.tsx" showLineNumbers copy +import Header from '../components/header'; +``` + +## Test your app + +Now that you have synced up the database, your app should display information under **Inventory Count**, **Variant Count**, and **Primary Category** fields. + +![Sample app](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-13.png "Sample app") + +[Next: Enhance the User Experience with BigDesign](/docs/integrations/apps/tutorial/nextjs-enhance) diff --git a/docs/api-docs/apps/tutorials/sample-app-next/step-4-enhance-ux.mdx b/docs/api-docs/apps/tutorials/sample-app-next/step-4-enhance-ux.mdx new file mode 100644 index 000000000..f145fc29b --- /dev/null +++ b/docs/api-docs/apps/tutorials/sample-app-next/step-4-enhance-ux.mdx @@ -0,0 +1,761 @@ +--- +title: Enhance the User Experience with BigDesign +keywords: products, bigdesign, apps, ux, webhooks, next.js, components, if, +--- + +# Step 4: Enhance the User Experience with BigDesign + +[BigDesign](https://developer.bigcommerce.com/big-design) plays a pivotal part in the BigCommerce control panel and ecosystem. App developers are encouraged to use BigDesign to develop apps that have a native BigCommerce look and feel. + +This step focuses on expanding functionality and integrating advanced design elements available as part of the BigDesign library. + +## Create the Products List route + +1. From the `pages/api` folder, open the `products` folder. + +2. In the `products` folder, create a `list.ts` file. The `list.ts` file will be routed to `/api/list` and treated as an API endpoint, instead of a regular component. + +3. At the top of the file, import the following packages: + +```ts filename="Add imports list.ts" showLineNumbers copy +import { NextApiRequest, NextApiResponse } from 'next'; +import { bigcommerceClient, getSession } from '../../../lib/auth'; +``` + +4. Add the logic to call the Products endpoint of BigCommerce's [Catalog API](/docs/rest-catalog). You can [view list.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-big-design/pages/api/products/list.ts). + +```ts filename="Add logic list.ts" showLineNumbers copy +export default async function list(req: NextApiRequest, res: NextApiResponse) { + try { + const { accessToken, storeHash } = await getSession(req); + const bigcommerce = bigcommerceClient(accessToken, storeHash); + // Optional: pass in API params here + const params = new URLSearchParams({ limit: '11' }).toString(); + + const { data } = await bigcommerce.get(`/catalog/products?${params}`); + res.status(200).json(data); + } catch (error) { + const { message, response } = error; + res.status(response?.status || 500).json({ message }); + } +} +``` + +## Update custom hooks + +1. In the `lib` folder, open the `hooks.ts` file. + +2. Add the `isLoading` property to the `useProducts` custom hook. + +```ts filename="Add isLoading hooks.ts" showLineNumbers copy +export function useProducts() { + const encodedContext = useSession()?.context; + // Request is deduped and cached; Can be shared across components + const { data, error } = useSWR(encodedContext ? ['/api/products', encodedContext] : null, fetcher); + + return { + summary: data, + isLoading: !data && !error, + isError: error, + }; +} +``` + +3. Add the `useProductList` custom hook. You can [view hooks.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-big-design/lib/hooks.ts). + +```ts filename="Add useProductList hooks.ts" showLineNumbers copy +export function useProductList() { + const encodedContext = useSession()?.context; + // Use an array to send multiple arguments to fetcher + const { data, error, mutate: mutateList } = useSWR(encodedContext ? ['/api/products/list', encodedContext] : null, fetcher); + + return { + list: data, + isLoading: !data && !error, + isError: error, + mutateList, + }; +} +``` + +## Create the Products page + +1. In the `pages` folder, create a `products` folder. + +2. In the `products` folder, create an `index.tsx` file. + +3. At the top of the file, import the following packages: + +```ts filename="Add imports index.tsx" showLineNumbers copy +import { Button, Dropdown, Panel, Small, StatefulTable, Link as StyledLink } from '@bigcommerce/big-design'; +import { MoreHorizIcon } from '@bigcommerce/big-design-icons'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import { ReactElement } from 'react'; +import { useProductList } from '../../lib/hooks'; +``` + + #### Resolve Link namespace collision + Because BigDesign and Next.js both have a component called `Link`, you need to import BigDesign's `Link` as `StyledLink` to avoid TypeScript errors. + + +4. Add the `Products` functional component. The `Products` component uses the BigDesign's [StatefulTable](https://developer.bigcommerce.com/big-design/statefulTable), a wrapper of the [Table](https://developer.bigcommerce.com/big-design/table) component that supports pagination, row selection, and sorting. You can [view index.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-big-design/pages/products/index.tsx). + +```tsx filename="Functional component index.tsx" showLineNumbers copy +const Products = () => { + const router = useRouter(); + // Retrieve data from the catalog/products endpoint + const { isError, isLoading, list = [] } = useProductList(); + // Properly format data for BigDesign's StatefulTable + const tableItems = list.map(({ id, inventory_level: stock, name, price }) => ({ + id, + name, + price, + stock, + })); + // When rendering table headers, you can return a string or a React component: + const renderName = (id: number, name: string): ReactElement => ( + + {name} + + ); + + const renderPrice = (price: number): string => ( + new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(price) + ); + + const renderStock = (stock: number): ReactElement => (stock > 0 + ? {stock} + : 0 + ); + + const renderAction = (id: number): ReactElement => ( + router.push(`/products/${id}`), hash: 'edit' } ]} + toggle={ + {name && +

    {name}

    + } +
    + + ); +}; + +export default InnerHeader; +``` + +The `InnerHeader` component uses BigDesign's `Button` component with the `variant` property set to `subtle`. By setting the variant type to `subtle`, you remove the button's border and simultaneously add a hover effect. To learn more about the BigDesign's `Button` component, see [Buttons Design Guidelines](https://developer.bigcommerce.com/big-design/button). + +The `ArrowBackIcon` component is part of the BigDesign's Icons package. You can modify the look of the icon by setting its color and size. To learn more about BigDesign's Icons, see [Icons](https://developer.bigcommerce.com/big-design/icons). + +## Update the Header component + +In this step, you incorporate the BigDesign's `Tabs` component into your app. You use the `Tabs` component to organize and navigate between content types. To learn more, see [Tabs Developer Docs](https://developer.bigcommerce.com/big-design/tabs). + +1. In the components folder, open the `header.tsx` file and update the imports. + +```ts filename="Add imports header.tsx" showLineNumbers copy +import { Box, Tabs } from '@bigcommerce/big-design'; +import { useRouter } from 'next/router'; +import { useEffect, useState } from 'react'; +import InnerHeader from './innerHeader'; +``` + +2. Declare `TabIds`, `TabRoutes`, `InnerRoutes`, and `HeaderTypes` variables. + +```ts filename="Declare variables header.tsx" showLineNumbers copy +export const TabIds = { + HOME: 'home', + PRODUCTS: 'products', +}; + +export const TabRoutes = { + [TabIds.HOME]: '/', + [TabIds.PRODUCTS]: '/products', +}; + +const InnerRoutes = [ + '/products/[pid]', +]; + +const HeaderTypes = { + GLOBAL: 'global', + INNER: 'inner', +}; +``` + +3. Update the `Header` functional component. You can [view header.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-big-design/components/header.tsx). + +```tsx filename="Functional component header.tsx" showLineNumbers copy +const Header = () => { + const [activeTab, setActiveTab] = useState(''); + const [headerType, setHeaderType] = useState(HeaderTypes.GLOBAL); + const router = useRouter(); + const { pathname } = router; + + useEffect(() => { + if (InnerRoutes.includes(pathname)) { + // Use InnerHeader if route matches inner routes + setHeaderType(HeaderTypes.INNER); + } else { + // Check if new route matches TabRoutes + const tabKey = Object.keys(TabRoutes).find(key => TabRoutes[key] === pathname); + + // Set the active tab to tabKey or set no active tab if route doesn't match (404) + setActiveTab(tabKey ?? ''); + setHeaderType(HeaderTypes.GLOBAL); + } + + }, [pathname]); + + useEffect(() => { + // Prefetch products page to reduce latency (doesn't prefetch in dev) + router.prefetch('/products'); + }); + + const items = [ + { id: TabIds.HOME, title: 'Home' }, + { id: TabIds.PRODUCTS, title: 'Products' }, + ]; + + const handleTabClick = (tabId: string) => { + setActiveTab(tabId); + + return router.push(TabRoutes[tabId]); + }; + + if (headerType === HeaderTypes.INNER) return ; + + return ( + + + + ); +}; + +export default Header; +``` + +The `Header` functional component uses the `useEffect` React hook to perform side effects and enhance performance. Notably, performance enhancement is only visible in a production or production-like environment (integration or staging). `router.prefetch()` does not prefetch the products page while in the development mode. + +### Test your app + +Your app should now display two tabs: **Home** and **Products**. Click on the **Products** tab. You should see a list of products from your test store. + +![Products page](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Sample_app/nextjs-app-14.png "Products page") + +### Latency + +When loading the products page for the first time, the latency you notice only happens in the development mode. In production or a production-like environment, `router.prefetch()` prefetches the products page reducing the latency. + +To test your app in a production or a production-like environment (integration or staging), run `npm run build` instead of `npm run dev` in your terminal. This builds and compiles your local code. Then, run `npm run start` to get the performance enhancements traditionally not available in the development mode. + +Keep in mind that any changes you make to your code after running `npm run build` need to go through the build process to be captured. + +## Create the ErrorMessage component + +To surface error messages to the app's users, add an error message component. You can call this component from any `page` or `component`. + +1. In the `components` folder, add the `error.tsx` file. + +2. Copy and paste the following code to create the `ErrorMessage` component. You can [view error.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-big-design/components/error.tsx). + +```tsx filename="Functional component error.tsx" showLineNumbers copy +import { H3, Panel } from '@bigcommerce/big-design'; + +interface ErrorMessageProps { + error?: Error; +} + +const ErrorMessage = ({ error }: ErrorMessageProps) => ( + +

    Failed to load

    + {error && error.message} +
    +); + +export default ErrorMessage; +``` + +## Create the Loading component + +The `Loading` component makes use of the BigDesign's indeterminant ProgressCircle indicator. The indeterminant [ProgressCircle](https://developer.bigcommerce.com/big-design/progress-circle) represents an unknown amount of time for a task to complete. To learn more about BigDesign's progress indicators, see [Progress Circle Developer Docs](https://developer.bigcommerce.com/big-design/progress-circle). + +In the `components` folder, create a `loading.tsx` file. You can [view loading.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-big-design/components/loading.tsx). + +```tsx filename="Functional component loading.tsx" showLineNumbers copy +import { Flex, H3, Panel, ProgressCircle } from '@bigcommerce/big-design'; + +const Loading = () => ( + +

    Loading...

    + + + +
    +); + +export default Loading; +``` + +## Add system checks + +Now that you have created the `ErrorMessage` and `Loading` components, you can add them to the `Products` component. + +1. In the `/pages/products` folder, open the `index.tsx` file. + +2. Import the `ErrorMessage` and `Loading` components. + +```ts filename="Add imports index.tsx" showLineNumbers copy +import ErrorMessage from '../../components/error'; +import Loading from '../../components/loading'; +``` + +3. Inside the `Products` functional component, above the `return` statement, add the logic to return `ErrorMessage` and `Loading` components. `isLoading` checks when the page or component is loading and `isError` checks for API errors. You can [view index.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-big-design/pages/products/index.tsx). + +```tsx filename="System check components index.tsx" showLineNumbers copy +if (isLoading) return ; +if (isError) return ; +``` + +## Update TypeScript definitions + +1. In the `types` folder, open the `data.ts` file. + +2. Export `FormData` and `StringKeyValue` TypeScript definitions. You can [view data.ts (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-big-design/types/data.ts). + +```ts filename="Export types data.ts" showLineNumbers copy +export interface FormData { + description: string; + isVisible: boolean; + name: string; + price: number; + type: string; +} + +export interface StringKeyValue { + [key: string]: string; +} +``` + +## Create the Form component + +You use the BigDesign's `Form` component to display and edit individual product information. + +The BigDesign's `Form` component comes with built-in support for accessibility, validation, and handling errors. It supports various input types, including Input, Checkbox, Radio, Select, and Textarea. To learn more, see [Form Developer Docs](https://developer.bigcommerce.com/big-design/form). + +1. In the `components` folder, add the `form.tsx` file. + +2. At the top of the file, import the following packages: + +```ts filename="Add imports form.tsx" showLineNumbers copy +import { Button, Checkbox, Flex, FormGroup, Input, Panel, Select, Form as StyledForm, Textarea } from '@bigcommerce/big-design'; +import { ChangeEvent, FormEvent, useState } from 'react'; +import { FormData, StringKeyValue } from '../types'; +``` + +3. Add the `FormProps` TypeScript definition. + +```ts filename="Define FormProps form.tsx" showLineNumbers copy +interface FormProps { + formData: FormData; + onCancel(): void; + onSubmit(form: FormData): void; +} +``` + +4. Declare the `FormErrors` variable. + +```ts filename="Declare FormErrors form.tsx" showLineNumbers copy +const FormErrors = { + name: 'Product name is required', + price: 'Default price is required', +}; +``` + +5. Declare and export the `Form` functional component. You can [view form.tsx (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/blob/step-4-big-design/components/form.tsx). + +```tsx filename="Functional component form.tsx" showLineNumbers copy +const Form = ({ formData, onCancel, onSubmit }: FormProps) => { + const { description, isVisible, name, price, type } = formData; + const [form, setForm] = useState({ description, isVisible, name, price, type }); + const [errors, setErrors] = useState({}); + + const handleChange = (event: ChangeEvent) => { + const { name: formName, value } = event?.target; + setForm(prevForm => ({ ...prevForm, [formName]: value })); + + // Add error if it exists in FormErrors and the input is empty, otherwise remove from errors + !value && FormErrors[formName] + ? setErrors(prevErrors => ({ ...prevErrors, [formName]: FormErrors[formName] })) + : setErrors(({ [formName]: removed, ...prevErrors }) => ({ ...prevErrors })); + }; + + const handleSelectChange = (value: string) => { + setForm(prevForm => ({ ...prevForm, type: value })); + }; + + const handleCheckboxChange = (event: ChangeEvent) => { + const { checked, name: formName } = event?.target; + setForm(prevForm => ({ ...prevForm, [formName]: checked })); + }; + + const handleSubmit = (event: FormEvent) => { + event.preventDefault(); + + // If there are errors, do not submit the form + const hasErrors = Object.keys(errors).length > 0; + if (hasErrors) return; + + onSubmit(form); + }; + + return ( + + + + + + + + + + + + + + + {/* Using description for demo purposes. Consider using a wysiwig instead (e.g. TinyMCE) */} + + + +``` + +#### ...with this (after): + +```java filename="" copy +%%GLOBAL_ReCaptchaMarkup%% +``` + +## Supported Browsers + +Below are the browsers supported for the BigCommerce control panel. We drop support when a version falls below 2% of usage. The browsers are sorted by popularity, with the most popular browsers at the top. + +| Desktop | +|-| +| Chrome latest | +| Firefox latest | +| Safari latest | + +For a current list of target browsers (desktop and mobile) that BigCommerce supports for _storefronts_ using our themes, please see our [article on supported browsers](https://support.bigcommerce.com/s/article/Themes-Supported-Browsers?language=en_US). diff --git a/docs/legacy/blueprint-themes/store-wide-global-panels.mdx b/docs/legacy/blueprint-themes/store-wide-global-panels.mdx new file mode 100644 index 000000000..fa4eabff4 --- /dev/null +++ b/docs/legacy/blueprint-themes/store-wide-global-panels.mdx @@ -0,0 +1,22 @@ +# Store-Wide Global Panels + +The following panels are available store-wide: + +| Variable | Description | +|:---------|:------------| +| `HTMLHead` | Content shown between the `` tags of each page. This includes code for visitor tracking, RSS feeds, etc. | +| `Header` | The header for each page in the store (includes the `TopMenu` and `HeaderSearch` panels) | +| `Footer` | The footer for each page in the store. | +| `SideCategoryList` | A list of categories shown in the store, to the category depth configured in the control panel. | +| `SideNewProducts` | A list of products recently added to the store. | +| `SideNewsletterBox` | The newsletter subscription form. | +| `SideShopByBrand` | A list of popular brands on the store (based on the number of products in each brand). | +| `SideProductRecentlyViewed` | A list of the products recently viewed by the current customer. | +| `SideTopSellers` | A list of top selling-products on the store (based purely on the number of times the product has sold on this store). | +| `SidePopularProducts` | A list of popular products on the store (by average rating). | +| `SideLiveChatServices` | Any live chat service code that has been integrated in to the store. | +| `SideCurrencySelector` | The store currency selection box, containing the list of currencies configured on the store. | +| `SideCartContents` | A list of items in currently in the customer's cart. | +| `TopMenu` | The top navigation menu (`Home`, `My Account`, `Sign In or Create Account`, etc.) | +| `PagesMenu` | A list of parent-level pages configured on the store. | +| `HeaderSearch` | The search box included at the top of each of the store's pages. | diff --git a/docs/legacy/blueprint-themes/store-wide-global-variables.mdx b/docs/legacy/blueprint-themes/store-wide-global-variables.mdx new file mode 100644 index 000000000..b34be32f9 --- /dev/null +++ b/docs/legacy/blueprint-themes/store-wide-global-variables.mdx @@ -0,0 +1,47 @@ +# Store-Wide Global Variables + +The following GLOBAL variables are available from any layout, panel, or snippet in the store, independent of session status: + +| Variable | Description | +|:---------|:------------| +| `%%GLOBAL_AllPricesAreInCurrency%%` | This variable produces a text string that identifies the currency currently active on the store. For example: `All Prices are in USD` | +| `%%GLOBAL_AlternateClass%%` | . | +| `%%GLOBAL_CdnAppPath%%` | The URI of the CDN application. | +| `%%GLOBAL_CdnStorePath%%` | The URI to the store's CDN directory. | +| `%%GLOBAL_CharacterSet%%` | The character set currently active on the store. For example, UTF-8. | +| `%%GLOBAL_CheckoutLink%%` | The URI that initiates a checkout sequence. | +| `%%GLOBAL_CurrentCustomerFirstName%%` | The first name of the customer who is currently logged in. If no customer is logged in, returns: `Guest` | +| `%%GLOBAL_CurrentCustomerLastName%%` | The last name of the customer who is currently logged in. If no customer is logged in, returns no content. | +| `%%GLOBAL_CustomerGroupId%%` | The ID of the customer group for the currently logged-in user or guest. Blank if none. | +| `%%GLOBAL_CustomerGroupName%%` | The name of the customer group for the currently logged-in user or guest. Blank if none. | +| `%%GLOBAL_Favicon%%` | The URI location of the favicon file. | +| `%%GLOBAL_HeaderLogo%%` | The store's logo. This can be either an image file or an HTML-formatted text string. | +| `%%GLOBAL_ImageDirectory%%` | The name of the images directory. | +| `%%GLOBAL_IMG_PATH%%` | The URI of the directory in which the site's image files reside. | +| `%%GLOBAL_jQueryPath%%` | The URI of the minified jQuery library in use. For example:
    `https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js` | +| `%%GLOBAL_jQueryUIPath%%` | The path to the jQuery UI script. For example:
    `https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.js` | +| `%%GLOBAL_LiveChatCodeEnabled%%` | A value representing whether Live Chat is enabled or disabled. For example: `none` | +| `%%GLOBAL_LoginOrLogoutText%%` | The HTML code of the string (including links) providing the option to sign into the store or to log out. For example: `Sign in or Create an account` | +| `%%GLOBAL_LogoText%%` | The text string used for the store logo. | +| `%%GLOBAL_MASTER_THEME_PATH%%` | The URI of the __master theme directory. | +| `%%GLOBAL_PageLink%%` | The URI of the page. | +| `%%GLOBAL_PageName%%` | The name of the page. For example: `RSS Syndication` | +| `%%GLOBAL_PoweredBy%%` | The string identifying the software used by the store. For example: `Shopping Cart Software by BigCommerce` | +| `%%GLOBAL_SHARED_GIFT_THEME_PATH%%` | The CDN URI of the store's gift themes. | +| `%%GLOBAL_ShopPath%%` | The store's URI. If the page is protected with TLS/SSL, this will be an HTTPS path. | +| `%%GLOBAL_ShopPathNormal%%` | The unencrypted URI of the store, prefixed with HTTP. | +| `%%GLOBAL_ShopPathSSL%%` | The encrypted URI of the store, prefixed with HTTPS. | +| `%%GLOBAL_ShowCookieWarningMessage%%` | A boolean value that represents whether or not the display of a cookie warning message is enabled or disabled. | +| `%%GLOBAL_SiteColor%%` | The current template's active color scheme. | +| `%%GLOBAL_SitemapURL_HTML%%` | The URI to the store's site map directory. | +| `%%GLOBAL_SocialMedia_Service_Class%%` | The name of the social media class. For example: `#FFFFFF` | +| `%%GLOBAL_SocialMedia_Service_Url%%` | The URI to the social media service. | +| `%%GLOBAL_SocialMediaService_Name%%` | The name of the social media service. For example: `LinkedIn` | +| `%%GLOBAL_StoreLogo%%` | The file name of the store logo image. | +| `%%GLOBAL_StoreName%%` | The name of the store. | +| `%%GLOBAL_StorePhoneNumber%%` | The phone number of the store. | +| `%%GLOBAL_STYLE_PATH%%` | The CDN URI of the active theme's styles directory. | +| `%%GLOBAL_SwapFrequency%%` | . | +| `%%GLOBAL_TPL_PATH%%` | The CDN URI of the theme. | +| `%%GLOBAL_value%%` | The type of value. For example: `Array` | +| `%%GLOBAL_Year%%` | The current year. For example: `2015` | diff --git a/docs/legacy/blueprint-themes/style-editor.mdx b/docs/legacy/blueprint-themes/style-editor.mdx new file mode 100644 index 000000000..933258b0c --- /dev/null +++ b/docs/legacy/blueprint-themes/style-editor.mdx @@ -0,0 +1,134 @@ +# Style Editor + + + +Style Editor allows users to customize the look and feel of their BigCommerce store, without needing to know HTML or CSS conventions. Using a simple WYSIWYG interface, users can edit colors and fonts, then see the changes simultaneously in a live preview. + +Style Editor uses Less.js as a CSS preprocessor. This allows Style Editor to take advantage of variables and other functions to ensure design consistency. + +## What Is Less.js? + +Less (formally, Less.js) is a CSS preprocessor that allows theme designers to use advanced functions and programming principles in their CSS. A JavaScript compiler runs over the Less files, and converts them into usable CSS that can be included in themes. + +For more information on examples, techniques, and how to install Less, please see [lesscss.org](http://lesscss.org/). + +## Integrating a Theme with the Style Editor + +The Style Editor uses a specific group of files to build its user interface, and to compile and generate the stylesheet. BigCommerce’s base developer theme, Blueprint, already contains these out-of-the-box. The files are stored in the `Styles/less` directory. + +The Style Editor depends on these files: + +* `style-editor-variables.less` +* `internal-variables.less` +* `init.less` +* `theme.less` + +### style-editor-variables.less + +Style Editor uses this file to generate its user interface. Here, you can enter variables for colours, fonts and numbers that will help the merchant customize the design of the theme. You can separate these variables out into sections with headings to help categorize the variables in a logical manner. No actual CSS is written in this file. + +There are some syntax patterns involved that Style Editor will understand to help you customize the UI. Special syntax: + +`@color-your-text-here` — This is the naming convention for a color variable. The style editor will generate this as a color picker, with the value of the variable set as the color picker’s default hexadecimal color value. + +For example: + +```css filename="" copy +@color-header-background: #FFFFFF; +``` + +This will generate a color picker with the label “Header Background”, set to #FFFFFF (white) by default. + +`@font-your-text-here` — This is the naming convention for a font variable. The style editor will generate this as a dropdown, preloaded with your theme’s predefined fonts. The variable’s value will be preselected. + +For example: + +```css filename="" copy +@font-page-text: "Open Sans",Helvetica,Arial,sans-serif; +``` + +This will generate a dropdown with the label “Page Text”, and with the “Open Sans” font preselected. The dropdown’s other options will be the predefined list of fonts you’ve provided. + +`@font-declaration` — This variable will store all the default fonts (and their fallbacks) for the style editor. It will use these fonts in the font dropdown mentioned in the above point. + +For example: + +```css filename="" copy +@font-declaration: '{ "Lato":["Lato", "Arial", "sans-serif"], "Freckle Face":["Freckle Face", "cursive"]}'; +``` + +This will populate all font drop-downs with the fonts “Lato” and “Freckle Face,” and if one of them is selected, the fonts for that variable will be set to the values in the corresponding array of fonts. For example, “Lato” will set the fonts to “Lato”, Arial, sans-serif. + +To use these fonts in the Style Editor, they must be included in the style editor variables file through an import. For the above example, you would include the styles from Google Fonts like so: + +```css filename="" copy +@import url(//fonts.googleapis.com/css?family=Lato|Freckle+Face); +``` +`@color-declaration` — This variable will store all the default colors for the style editor. It will list these colours in the color picker’s palette after all the color picker’s defaults. + +For example: + +```css filename="" copy +@color-declaration: '["#FF7700, #9966CC" ]'; +``` + +This will add a shade of orange and a shade of purple to the end of the list of colors selectable in the color picker. + +`//! @section: your text here` — You can group variables into sections with headings using this syntax to help your users read and understand your variables more easily. + +For example: + +`//! @section: Header` +`@color-header-background: #FFF;` +`//! @endsection` of + +This will create a section in the left navigation with the title “Header”, which will house the “Header Background” variable. + +More information on syntax, and examples, can be found in the comments of the style-editor-variables.less file found in Blueprint. + +### internal-variables.less + +This file is for you to store the variables that you may need to use, but don’t want the Style editor to see. For example, you can use it to create a hierarchy within your Less file, so that: + +* The user sets a value to `@color-store-name;` +* in internal-variables.less, `@main-accent: @color-store-name;` +* in init.less, we set a:hover `{color: @main-accent};` + +In this example, the link hover color will be set to whatever the store name color is. We can add as many selectors as we want to this css statement, depending on our design. + +This way, we can reuse the color that gets set to `@color-store-name` as the color for elements that we may not want to be edited in the Style Editor, but will now carry on the colour of the store name to create consistency within your design. + +### init.less + +This is where you initialize the use of the variables. This file contains all the CSS that will be compiled and generated into the theme.css file. For example, the @color-store-name can now be applied to the `#HeaderLogo h1` element by saying: + +```css filename="" showLineNumbers +#HeaderLogo h1 { +color: @color-store-name +} +``` +### theme.less + +The file that ultimately gets compiled into `theme.css`. This just uses `@import` to include the other three Less files for compilation. The Style Editor will read this file for instructions on how to compile your styles using Less. + +Compiling your Less files + +Once you have finished working on your `.less` files, _don’t forget to compile them!_ If you are using the command line, you should be doing something similar to: + +```less filename="" copy +lessc Styles/less/theme.less > Styles/theme.css +``` +This will use the `theme.less` file to generate the `theme.css` file into your theme's `Styles/` folder. + +If you find that you have to make a change to `theme.css`, please don't forget to replicate this change in `theme.less` (but more preferably, in `init.less`). Otherwise, every time you recompile the less files, this change will be overwritten. + +Less offers a variety of compilation methods, including applications for both Windows and Mac that you can use if you prefer not to use the command prompt/terminal. + +## Testing Style Editor with Your Theme + +If you'd like to add Style Editor support to your theme, you can enable the Style Editor on just your store. Simply log in to the control panel and place `/index.php?ToDo=viewTemplates&dev=enable` after `/admin`. + +(For example: `https://store-123abmy.mybigcommerce.com/admin/index.php?ToDo=viewTemplates&dev=enable`) + + +This will enable [Developer Mode](#) for your store, which also enables Blueprint and other features for theme developers. You can [use Blueprint](#) as a basis for creating new themes. diff --git a/docs/legacy/stencil-themes/installing-legacy-theme-modules.mdx b/docs/legacy/stencil-themes/installing-legacy-theme-modules.mdx new file mode 100644 index 000000000..9b31efd10 --- /dev/null +++ b/docs/legacy/stencil-themes/installing-legacy-theme-modules.mdx @@ -0,0 +1,67 @@ +# Installing Legacy Theme Modules + + + +If a theme’s version number is lower than `1.10.0`, the theme uses `jspm` as its JavaScript build system. Follow the steps outlined on this article to install theme modules via `jspm`. + + + +## Step 1: Install `jspm` + +```shell copy +npm install -g jspm@0.16.30 +``` + +Or, for Windows: + +```shell copy +npm install -g jspm@0.16.31 +``` + +## Step 2: Register `jspm` Instance + +Next, register your jspm instance with GitHub. To do so: +* Navigate to your [GitHub Personal Access Tokens page](https://github.com/settings/tokens). +* Generate a new personal access token with the name `Stencil` and scope `repo` (GitHub provides specific instructions). +* Verify the token includes the following scopes: `repo:status`, `repo_deployment`, and `public_repo`. +* Run the following command in a terminal to associate the `jspm` module and GitHub account: `jspm registry config github` +* When prompted with `Set up GitHub credentials?`, copy and paste the access token created above. + +## Step 3: Install `jspm-git` + +For the next step, you will need the [jspm-git registry plug-in](https://www.npmjs.com/package/jspm-git). + +To install it, enter the following in a terminal: + +```shell copy showLineNumbers +# Install jspm-git registry plug-in +npm install -g jspm-git +``` + +If you already have an earlier version of `jspm-git` installed, you might need to update it to handle git projects with two-digit version numbers: + +```shell copy showLineNumbers +npm upgrade jspm-git@latest +``` + +## Step 4: Add BitBucket as a `jspm` Registry + +Working with downloaded Marketplace themes requires adding a BitBucket registry for `jspm`. To do so, you'll need a [BitBucket account](https://bitbucket.org/product). Once you have an account, enter the following in a terminal to add BitBucket as a `jspm` registry: + +```shell copy showLineNumbers +jspm registry create bitbucket jspm-git + +# When prompted for a base URL, Enter: ssh://git@bitbucket.org +``` + +## Step 5: Install the Modules + +Finally, install the `npm` and `jspm` modules required to access Stencil JavaScript events: + +```shell copy showLineNumbers +# move into the theme's directory +cd ~/path/to/theme + +# install the modules with jspm +jspm install +``` diff --git a/docs/legacy/stencil-themes/stored-credit-card-management.mdx b/docs/legacy/stencil-themes/stored-credit-card-management.mdx new file mode 100644 index 000000000..2e7acce7a --- /dev/null +++ b/docs/legacy/stencil-themes/stored-credit-card-management.mdx @@ -0,0 +1,124 @@ +# Stored Credit Card Management + + + +Stored Credit Card management gives customer’s the ability to manage their stored credit cards from the My Account page of the storefront. In the Cornerstone theme, shoppers with store accounts will have the ability to add new cards, delete cards, select a default card, and edit the billing details of existing cards from their customer account area of the storefront. + +![Stored Credit Card Management](https://storage.googleapis.com/bigcommerce-production-dev-center/images/stored-credit-card-management.png "Stored Credit Card Management") + + + #### Theme Versions + Cornerstone versions 2.6.0+ include the ability to manage [Stored Credit Cards](https://support.bigcommerce.com/s/article/Enabling-Stored-Credit-Cards) (BigCommerce Support). + + + + + +## Prerequisites + +* Store must be on a [Plus plan or higher](https://www.bigcommerce.com/essentials/pricing/). +* Store needs to be using a compatible payment gateway: + * PayPal powered by Braintree + * Cybersource + * Authorize.net + * Stripe + * Paymetric + +## Adding Stored Credit Card Management + +Stored Credit Card Management was added to Cornerstone in [pull request #1376](https://github.com/bigcommerce/cornerstone/pull/1376). To add Stored Credit Cards to pre-2.6.0 Cornerstone or Marketplace themes, copy the changes from [PR #1376](https://github.com/bigcommerce/cornerstone/pull/1376) to your theme. This section will walk through [each individual commit](https://github.com/bigcommerce/cornerstone/pull/1376/commits), highlighting the changes that you will need to make to your template files. + +## Step 1: [Add Payment Methods Page](https://github.com/bigcommerce/cornerstone/pull/1376/commits/24abc038fe346a8572b40da40c98a9465788957a) + +* Create the new Payment Methods page on a shopper’s account by editing the following files: + * lang/en.json + * templates/components/account/navigation.html + * templates/pages/account/payment-methods.html + +![Payment Methods Page Addition Example](https://storage.googleapis.com/bigcommerce-production-dev-center/images/payment-methods-page-addition.png "Payment Methods Page Addition Example") + +## Step 2: [Add Translations](https://github.com/bigcommerce/cornerstone/pull/1376/commits/9edf1a0f6907811abf470db1486b4fdb199b27ae) + +* Makes the Payments Method page translatable by modifying the following: + * lang/en.json + * templates/components/account/navigation.html files + +## Step 3: [Include Credit Card Listing](https://github.com/bigcommerce/cornerstone/pull/1376/commits/5574eb98c710f4540e8390420563099b6f5710bf) + +* Group the credit cards by payment providers +* Include the payment method icons +* Account for mobile and desktop layouts +* Account for translations + +*Icons have been used to identify the credit card **type**. The data only provides the card brand in the credit card details.* + +![image](https://storage.googleapis.com/bigcommerce-production-dev-center/images/credit-cards-details.png) + +## Step 4: [Add Credit Card Actions](https://github.com/bigcommerce/cornerstone/pull/1376/commits/499016d320995852fe4ef621724e08556896b70d) + +* add `Edit`, `Delete`, and `Add` buttons + +![Implementation of Add, Edit, and Delete Methods](https://storage.googleapis.com/bigcommerce-production-dev-center/images/edit-delete-add-buttons.png "Implementation of Add, Edit, and Delete Methods") + +## Step 5: [Implement Delete Payment Method](https://github.com/bigcommerce/cornerstone/pull/1376/commits/cf102901d9061b7334e8c39f15a8904c37cf0652) + +* Bind the delete button's front end and back end + +First, the click will trigger window confirm. The confirmation modal has been added to prevent unintended action. Then, on confirming, a post request will be sent. The action is initiated through a localized form post request in the template which uses a [`delete_url`](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/account/payment-methods-list.html#L34) key provided in the credit card details data. Finally, there will be a redirect to the credit card listing. + +## Step 6: [Implement Edit Payment Method](https://github.com/bigcommerce/cornerstone/pull/1376/commits/ab2fe1df455fa8ac93760904b718fbce7ce361ed) + +* Add the design for credit card details and the edit billing address form, synced with existing address fields validation + +*The action is initiated via a [redirect](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/account/payment-methods-list.html#L36) to the edit page. The page uses HTML, CSS, and JavaScript for the billing address validation. The "name on card" label and values are also removed, as we do not store name along with the vaulted credit card. The full [edit-payment-method.html](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/edit-payment-method.html) can be viewed in the Cornerstone GitHub Repo.* + +![Edit Payment Method Form](https://storage.googleapis.com/bigcommerce-production-dev-center/images/payment-method-form.png "Edit Payment Method Form") + +## Step 7: [Implement Add Payment Method](https://github.com/bigcommerce/cornerstone/pull/1376/commits/c960338c32faa8fb798b2826c72dfe9d74bf9751) + +* Adding new icon `lock.svg` +* Unify the CSS classes for the add and edit form. +* Add a new template for edit form with an injection of global variables into context. +* Extend the `account.js` file with a new method to initiate credit card and billing address fields validations, mapping form fields name and value to body request. +* Add a `payment-method.js` file for credit card validations and helpers with unit test. + +*The add form will use ajax to validate and submit the credit card details (this differs from the way the edit form validates and submits). The [payment-method.js file](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/theme/common/payment-method.js) has been designed to be dragged and used in themes to simplify its implementation.* + +*The [add-payment-method.html template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/add-payment-method.html) also requires some customization because variables need to pass through handlebars in order to be used by JavaScript. From [line 20 to 25 of the template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/add-payment-method.html#L20-L25), we store variables, mostly for building the request url and header. The request body will directly use the form data. [More validations and extra mapping](https://github.com/bigcommerce/cornerstone/blob/24686de577c6ad5409ec8b82f5839c3d083cb760/assets/js/theme/account.js#L211) are added to the `add-payment-method.html` template as well.* + +![Example of the addition of the Add Payment Method](https://storage.googleapis.com/bigcommerce-production-dev-center/images/add-payment-method.png "Example of the addition of the Add Payment Method") + +## Step 8: [Add Default Instrument](https://github.com/bigcommerce/cornerstone/pull/1376/commits/5576aee5af0194e85cb11dbf44563f89b2687f40) + +* Add HTML and CSS for a single checkbox, default instrument +* Capture form data on ADD and transform to boolean +* Fix HTML credit card for tabulation navigation +* Fix for states reload list via AJAX + +![Add default instrument checkbox to edit and add form](https://storage.googleapis.com/bigcommerce-production-dev-center/images/default-instrument-checkbox.png "Add default instrument checkbox to edit and add form") + + + #### Utilizing GitHub Automation to Merge the Changes + Since this feature involves heavy code changes, it may be easier to merge the necessary code into your theme by utilizing GitHub's automated process for syncing a fork. See GitHub's documentation on [Syncing a Fork](https://help.github.com/articles/syncing-a-fork/) for more details on this method. + + + +## FAQ +**Where is the card data stored?** + +Card data is stored securely with the payment gateway. + +**Is storing credit cards PCI compliant?** + +Card data is stored securely with the payment gateway. The BigCommerce store is NOT storing the payment data. + +**Can shoppers modify their stored card?** + +After adding a card, shoppers will only be able to modify the billing address. If other credit card details need to be modified (such as expiration date), the shopper must delete and re-add the card. + +## Resources + +### Related Articles +* [Payments API](/docs/store-operations/payments) +* [Enabling Stored Cards](https://support.bigcommerce.com/s/article/Enabling-Stored-Credit-Cards) (BigCommerce Knowledge Base) +* [The Complete Guide to Checkout Customization on BigCommerce](https://medium.com/bigcommerce-developer-blog/the-complete-guide-to-checkout-customization-on-bigcommerce-6b566bc36fa9) (Developer Blog) diff --git a/docs/legacy/storefronts/nextjs-commerce-guide.mdx b/docs/legacy/storefronts/nextjs-commerce-guide.mdx new file mode 100644 index 000000000..28a00ecb7 --- /dev/null +++ b/docs/legacy/storefronts/nextjs-commerce-guide.mdx @@ -0,0 +1,167 @@ +# Next.js Commerce Quick Start + +## Overview + +BigCommerce offers cloud-based multi-channel ecommerce solutions. We also offer themes with powerful design tools and features that let you build and host your storefront on our servers. + + +This article is deprecated. Next.js Commerce has released a v2 with breaking changes. For Next.js Commerce v1, you can [view the code (GitHub)](https://github.com/vercel/commerce/tree/v1), [view the demo (vercel.store)](https://commerce-v1.vercel.store/), and [read the release notes (GitHub)](https://github.com/vercel/commerce/releases/tag/v1) at Vercel, and use this article to get started. + +To work with the improved v2, see our article on [Next.js + BigCommerce](/docs/storefront/next-commerce). + + +### Headless BigCommerce + +BigCommerce's flexibility allows for headless architecture, the ability to integrate storefront frontends with the BigCommerce backend. Some of the headless setups have the advantage of providing the following: + +- Customize your frontend technologies without migrating your database +- Preserve your legacy frontend while switching to BigCommerce as your ecommerce engine +- Power multiple stores on multiple sales channels from a single BigCommerce dashboard. + +### Next.js Commerce + +Next.js Commerce is a headless integration to BigCommerce. Created in partnership with the Next.js and Vercel teams, Next.js Commerce showcases how powerful Next.js is when partnered with our open SaaS ecommerce platform. + +## Getting started + +To get started with Next.js Commerce, you can develop locally by cloning the v1 branch of the `vercel/commerce` repo. The following steps walk you through the process. + +### Prerequisites + +- An IDE +- Knowledge of [Next.js (nextjs.org)](https://nextjs.org/) +- Knowledge of [BigCommerce APIs](/docs/build) +- A hosted Git repository account, such as GitHub, Bitbucket, or GitLab +- Git and Node/NPM + +### Developing locally + +1. Clone the v1 version using the following command: + +```shell copy +git clone -b v1 https://github.com/vercel/commerce +``` +2. Generate a store-level API account. Use the steps in our [Guide to API Accounts](/docs/start/authentication/api-accounts#creating-store-level-api-credentials), and make sure to download and keep the text file with the API credentials. In a development sandbox, you can grant the account all scopes. In a production store, grant the token only the scopes necessary to operate the storefront you build. If you think you may change the scopes, use an [app-level API account](/docs/start/authentication/api-accounts#app-level-api-accounts). + +3. Create a dedicated sales channel for your storefront. Use the [Create a channel](/docs/rest-management/channels#create-a-channel) endpoint to get started. To learn more about channels, see the [Channel Overview](/docs/integrations/channels). + +4. Use your API account and your channel ID to create a GraphQL Storefront customer impersonation token for your storefront. Use the [Create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token) endpoint to get started. + +5. Navigate to the local project's root directory and create a copy of the `.env.template` file. Rename the newly created file `.env.local` and add environment variables using the following reference: + +```bash +cd commerce +cp .env.template .env.local +``` + +```bash filename=".env.local" showLineNumbers copy +COMMERCE_PROVIDER=bigcommerce +BIGCOMMERCE_STOREFRONT_API_URL="https://store-${STORE_HASH}-${CHANNEL_ID}.mybigcommerce.com/graphql" +BIGCOMMERCE_STOREFRONT_API_TOKEN=${STOREFRONT_TOKEN} +BIGCOMMERCE_STORE_API_URL="https://api.bigcommerce.com/stores/${STORE_HASH}" +BIGCOMMERCE_STORE_API_TOKEN=${API_ACCOUNT_ACCESS_TOKEN} +BIGCOMMERCE_STORE_API_CLIENT_ID=${API_ACCOUNT_CLIENT_ID} +BIGCOMMERCE_CHANNEL_ID=${CHANNEL_ID} +BIGCOMMERCE_STORE_URL=https://store-${STORE_HASH}.mybigcommerce.com +BIGCOMMERCE_STORE_API_STORE_HASH=${STORE_HASH} +``` + +| Environment variable | Description | +|:---------------------|:------------| +| `STORE_HASH` | A unique identifier for your store. See the API PATH in your API account text file; the store hash is in the following position in the path string. `https://api.bigcommerce.com/stores/${STORE_HASH}/v3`. | +| `API_ACCOUNT_ACCESS_TOKEN` | See the ACCESS TOKEN in your API account text file from step 2. | +| `API_ACCOUNT_CLIENT_ID` | See the CLIENT ID in your API account text file from step 2. | +| `CHANNEL_ID` | Use the ID of the channel you created in step 3. | +| `STOREFRONT_TOKEN` | Use the Storefront customer impersonation token you created in step 4. | + +6. Install the project's dependencies using npm. + +```shell copy +npm install +``` + +7. Next.js's dev script loads the environmental variables from `.env.local`, starts a local server, and compiles your project. When dependencies have finished installing, get things started by running the following: + +```shell copy +npm run dev +``` + + + Note: By default, Next.js runs on port 3000. If that port is not available in your environment, [consult the Next documentation (nextjs.org)](https://nextjs.org) to modify the start command. + + +8. To see your Next.js Commerce storefront running locally, open a browser window to the following address: + +```shell copy +http://localhost:3000 +``` + +## Application + +The architecture for Next.js Commerce is standard for a Next.js application. To learn Next.js basics, visit [the official Next.js tutorial (nextjs.org)](https://nextjs.org/learn/basics/create-nextjs-app). + +To understand how Commerce generates pages and updates product information on your storefront, continue reading. + +### Pre-rendering pages + +One of the main advantages of Next.js is the fast page load times you can achieve by pre-rendering your content. By default, Next.js pre-renders all pages. + +Next.js allows you to choose how pages are pre-rendered: + +- **Static Generation:** Next.js generates the HTML at build time and reuses on each request. +- **Server-side Rendering:** Next.js generates the HTML on each request. + +Next.js Commerce statically generates pages while still keeping store information updated by using Incremental Static Regeneration. + +**Static Page Generation** + +Next.js pre-renders static content by calling the `getStaticProps()` function at build time on the server-side. Since `getStaticProps()` does not run on the client-side, you can do direct database queries or run other functions without exposing them to the client. To verify what Next.js eliminates from the client-side bundle, use Vercel's [Code Elimination (now.sh)](https://next-code-elimination.now.sh/) tool. + +**Incremental Static Regeneration** + +With `getStaticProps()`, you may still use dynamic content on your statically generated pages. Incremental Static Regeneration (ISR) updates existing pages by re-rendering them in the background when triggered by site traffic after a set timeout period. By default, data revalidation runs at most once every four hours, though you may customize this frequency. + +For more information and a demonstration on how ISR works, visit Vercel's [Static Reactions Demo (vercel.app)](https://reactions-demo.vercel.app/). + +By default, Next.js Commerce revalidates and updates product information from BigCommerce at most once every four hours. + +### Fetching and populating store data + +Next.js Commerce uses [storefront-data-hooks (GitHub)](https://github.com/bigcommerce/storefront-data-hooks) to connect your Next.js frontend with the BigCommerce backend. The package contains code-split React hooks for data fetching using [SWR (swr.vercel.app)](https://swr.vercel.app/) (stale-while-revalidate). SWR is a layer on top of React Hooks that automates cache management. Data can be transitively stale, but SWR re-fetches and synchronizes the correct data from BigCommerce. + +Storefront Data Hooks has helper functions to handle common user actions such as login, logout, and register. + +SWR uses FETCH for data fetching: [vercel/fetch: Opinionated fetch (with retrying and DNS caching) optimized for use inside microservices (GitHub)](https://github.com/vercel/fetch). + +## Application settings + +### SSL/TSL Certificate + +To use BigCommerce's [redirected checkout](/docs/storefront/headless/cart-checkout/checkout#redirecting-to-the-bigcommerce-checkout), make sure your Next.js Commerce storefront has an SSL/TSL certificate installed and you are using URL beginning with `https://`. You also need to [Create a channel site](/docs/rest-management/channels/channel-site#create-a-channel-site) and [Upsert the site checkout URL](/docs/rest-management/channels/channel-site-checkout-url#upsert-a-site's-checkout-url) to add the URL where you want to host the checkout. + +### Next SEO + +Next.js Commerce includes the [Next SEO (GitHub)](https://github.com/garmeeh/next-seo) plugin to simplify SEO settings so that Next.js Commerce appears correctly in search results and is more readily shareable on social media. To learn how to configure Next SEO settings, visit the [Next SEO GitHub repository (GitHub)](https://github.com/garmeeh/next-seo). + +### Component styling + +Next.js Commerce uses [Tailwind (tailwindcss.com)](https://tailwindcss.com/) to style components. Next.js Commerce's root directory contains a `tailwind.config.js` file where you can customize much of the project's styling. For more information on how to configure the `tailwind.config.js` file, visit [Tailwind CSS - Configuration (tailwindcss.com)](https://tailwindcss.com/docs/configuration). + +### Internationalized routing + +Next.js supports internationalized (i18n) routing and Next.js Commerce uses [sub-path routing (nextjs.org)](https://nextjs.org/docs/advanced-features/i18n-routing#sub-path-routing) which puts the locale in the URL path. By default, the `next.config.js` file has US English (`en-US`) and Spanish (`es`) set as locales. `en-US` is the preset default. + +```javascript showLineNumbers copy +i18n: { + locales: ['en-US', 'es'], + defaultLocale: 'en-US', +} +``` + +For more information on i18n routing in Next.js, see the Next.js documentation on [internationalized routing (nextjs.org)](https://nextjs.org/docs/advanced-features/i18n-routing). + +## Resources + +- [Next.js Commerce (nextjs.org)](http://nextjs.org/commerce) +- [Next.js Commerce Framework (GitHub)](https://github.com/vercel/commerce-framework) +- [BigCommerce Storefront Data Hooks (GitHub)](https://github.com/bigcommerce/storefront-data-hooks) diff --git a/docs/legacy/v2-catalog-products/v2-brands.mdx b/docs/legacy/v2-catalog-products/v2-brands.mdx new file mode 100644 index 000000000..35d87b3ad --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-brands.mdx @@ -0,0 +1,210 @@ +--- +title: Brands +keywords: v2, catalog v2 +--- + +# Brands + +## Brands + +Brand facets for identifying and categorizing products according to their manufacturer or company metonym. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Brands](/docs/rest-catalog/brands). + + +### Brand Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | +| name | string | The name of the brand. Must be unique. | +| page_title | string | The title shown in the browser while viewing the brand. | +| meta_keywords | text | Comma-separated list of meta keywords to include in the HTML. | +| meta_description | text | A meta description to include. | +| image_file | string | A valid image. | + +## List Brands + +Gets the collection of brands. (Default sorting is by brand id, from lowest to highest.) + +`GET /stores/{store_hash}/v2/brands` + +### Filters + +Filter parameters can be added to the URL query string to select specific brands in the collection. + +| Parameter | Type | Example | +|-|-|-| +| name | string | `/api/v2/brands?name={value}` | +| min_id | int | `/api/v2/brands?min_id={value}` | +| max_id | int | `/api/v2/brands?max_id={value}` | + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, BigCommerce returns up to 50 brands by default. + +| Parameter | Type | Example | +|-|-|-| +| Page | int | `/api/v2/brands?page={number}` | +| Limit | int | `/api/v2/brands?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 1, + "name": "Apple", + "page_title": "", + "meta_keywords": "", + "meta_description": "", + "image_file": "", + "search_keywords": "" + }, + { + "id": 2, + "name": "Microsoft", + "page_title": "", + "meta_keywords": "", + "meta_description": "", + "image_file": "", + "search_keywords": "" + } +] +``` + +## Get a Brand + +Gets a brand. + +`GET /stores/{store_hash}/v2/brands/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 1, + "name": "Apple", + "page_title": "", + "meta_keywords": "", + "meta_description": "", + "image_file": "", + "search_keywords": "" +} +``` + +## Get a Count of Brands + +Returns the total number of brands in the store. + +`GET /stores/{store_hash}/v2/brands/count` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 25 +} +``` + +## Create a Brand + +Creates a new brand. + +`POST /stores/{store_hash}/v2/brands` + +### Read-only Properties + +The following properties of the brand are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id + +### Requirements + +The following properties of the brand are required. The request won’t be fulfilled unless these properties are valid. + +* name + +**Note** + +To maximize system performance, BigCommerce caps the number of brands that can be added to a store at 30,000. If your POST causes the store to exceed the maximum of 30,000 brands, BigCommerce will return a 403 error. + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "name": "Xmen", + "page_title": "X men brand" +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 10, + "name": "Xmen", + "page_title": "X men brand", + "meta_keywords": null, + "meta_description": null, + "image_file": "", + "search_keywords": "" +} +``` + +## Update a Brand + +Updates an existing brand. + +`PUT /stores/{store_hash}/v2/brands/{id}` + +### Read-only Properties + +The following properties of the brand are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id + +### Requirements + +The following properties of the brand are required. The request won’t be fulfilled unless these properties are valid. + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 10, + "name": "Xmen", + "page_title": "X men brand", + "meta_keywords": null, + "meta_description": null, + "image_file": "t/apirmzk0a__43675.jpg", + "search_keywords": "xmen, awesomeness" +} +``` + +## Delete a Brand + +Deletes a brand. + +`DELETE /stores/{store_hash}/v2/brands/{id}` + +## Delete All Brands + +Deletes all brands belonging to a product. + +`DELETE /stores/{store_hash}/v2/brands` diff --git a/docs/legacy/v2-catalog-products/v2-bulk-pricing.mdx b/docs/legacy/v2-catalog-products/v2-bulk-pricing.mdx new file mode 100644 index 000000000..5b7da86c3 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-bulk-pricing.mdx @@ -0,0 +1,226 @@ +--- +title: Bulk Pricing Rules +keywords: v2, catalog, +--- + +# Bulk Pricing Rules +## Bulk Pricing + +Bulk pricing rules applied to a product. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Product Bulk Pricing Rules](/docs/rest-catalog/products/bulk-pricing-rules). + + +### Bulk Pricing Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | string | The ID of the bulk discount rule. | +| product_id | int | The ID of the product associated with this bulk discount rule. | +| min | int | The minimum inclusive quantity of a product to satisfy this rule. Must be greater than or equal to zero. | +| max | int | The maximum inclusive quantity of a product to satisfy this rule. Must be greater than the min value, unless this field has a value of 0 (zero), in which case there will be no maximum bound for this rule. | +| type | enum | +| type_value | decimal | The value of the discount | + +## List Bulk Pricing Rules + +Gets the collection of product bulk pricing rules. + +`GET /stores/{store_hash}/v2/products/{product_id}/discount_rules` + +### Filters + +There are no filter parameters specific to `discount_rules`. + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 bulk_pricing_rules are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/discount_rules?page={number}` | +| limit | int | `/api/v2/products/{product_id}/discount_rules?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": "1", + "product_id": 30, + "min": 100, + "max": 500, + "type": "price", + "type_value": 2 + } +] +``` + +## Get a Product Bulk Pricing Rule + +Gets a product bulk pricing rule. + +`GET /stores/{store_hash}/v2/products/{product_id}/discount_rules/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": "1", + "product_id": 30, + "min": 100, + "max": 500, + "type": "price", + "type_value": 2 +} +``` + +## Get a Count of Bulk Pricing Rules + +Gets a count of the number of bulk pricing rules in the store. + +`GET /stores/{store_hash}/v2/products/discount_rules/count` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 9 +} +``` + +## Create a Product Bulk Pricing Rule + +Creates a new product bulk pricing rule. + +`POST /stores/{store_hash}/v2/products/{product_id}/discount_rules` + +### Read-only Properties + +The following properties of the discount rule are read-only. If one or more of these properties are included in the request, it will be rejected. + +* product_id + +### Requirements + +The following properties of the discount rule are required. The request won’t be fulfilled unless these properties are valid. + +* type +* type_value + +**Note** + +To specify that a `min` or `max` value is unbounded, these properties must be explicitly set with a value of `0`. If neither `min` nor `max` properties are included in the request, the existing value will remain unchanged. + +The range of the `min` and `max` values must not overlap an existing rule associated with the same product. + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "min": 100, + "max": 500, + "type": "price", + "type_value": 2 +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": "1", + "product_id": 30, + "min": 100, + "max": 500, + "type": "price", + "type_value": 2 +} +``` + +## Update a Product Bulk Pricing Rule + +Updates an existing product bulk pricing rule. + +`PUT /stores/{store_hash}/v2/products/{product_id}/discount_rules/{id}` + +### Read-only Properties + +The following properties of the discount rule are read-only. If one or more of these properties are included in the request, it will be rejected. + +* product_id + +### Requirements + +The following properties of the discount rule are required. The request won’t be fulfilled unless these properties are valid. + +* type +* type_value + +**Note** + +To specify that a `min` or `max` value is unbounded, these properties must be explicitly set with a value of `0`. If neither `min` nor `max` properties are included in the request, the existing value will remain unchanged. + +The range of the `min` and `max` values must not overlap an existing rule associated with the same product. + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "min": 200, + "max": 300, + "type": "fixed", + "type_value": 10 +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": "1", + "product_id": 30, + "min": 200, + "max": 300, + "type": "fixed", + "type_value": 10 +} +``` + +## Delete a Product Bulk Pricing Rule + +Deletes a product bulk pricing rule. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/discount_rules/{id}` + +## Delete Multiple Product Bulk Pricing Rules + +Deletes bulk pricing rules associated with a product. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/discount_rules` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 `bulk_pricing_rules` are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/discount_rules?page={number}` | +| limit | int | `/api/v2/products/{product_id}/discount_rules?limit={count}` | diff --git a/docs/legacy/v2-catalog-products/v2-categories.mdx b/docs/legacy/v2-catalog-products/v2-categories.mdx new file mode 100644 index 000000000..046dc6466 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-categories.mdx @@ -0,0 +1,262 @@ +--- +title: Categories +keywords: v2, sort, +--- + +# Categories + +## Categories + +Index of hierarchical categories used to organize and group products. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Category](/docs/rest-catalog/categories). + + +### Category Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | A read-only field containing the unique numeric identifier of this category. | +| parent_id | int | The ID of the parent category to which this category belongs.
    (NOTE: the total number of parent categories cannot exceed seven.) | +| name | string | The name of the category. Must be unique. | +| description | text | A description for the category. | +| sort_order | int | The sort order of the category. | +| page_title | string | The page title for the category page. | +| meta_keywords | text | Comma-separated list of meta keywords to include in the HTML. | +| meta_description | text | A meta description to include. | +| layout_file | string | DEPRECATED. The layout template file used to render this category. This field is writable only for stores with a Blueprint theme applied. For Stencil stores, use the V3 Custom Templates API. | +| parent_category_list | array | A read-only field containing the ID of this category and the ID of its parent category, if any. | +| image_file | string | A valid image. | +| is_visible | boolean | Is the category visible? | +| search_keywords | string | A comma-separated list of keywords that can be used to locate this brand. | +| url | string | The context path of this category. | + +## List Categories + +Gets the list of categories. (Default sorting is by category id, from lowest to highest.) + +`GET /stores/{store_hash}/v2/categories` + +### Filters + +Filter parameters can be added to the URL query string to select specific categories in the collection. + +| Parameter | Type | Example | +|-|-|-| +| parent_id | string | `/api/v2/categories?parent_id={value}` | +| name | string | `/api/v2/categories?name={value}` | +| is_visible | string | `/api/v2/categories?is_visible={value}` | +| min_id | int | `/api/v2/categories?min_id={value}` | +| max_id | int | `/api/v2/categories?max_id={value}` | + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 categories are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| Page | int | `/api/v2/categories?page={number}` | +| Limit | int | `/api/v2/categories?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 1, + "parent_id": 0, + "name": "Shop Mac", + "description": "", + "sort_order": 0, + "page_title": "", + "meta_keywords": "", + "meta_description": "", + "layout_file": "category.html", + "parent_category_list": [ + 1 + ], + "image_file": "", + "is_visible": true, + "search_keywords": "", + "url": "/shop-mac/" + } +] +``` + +## Get a Category + +Gets a single category. + +`GET /stores/{store_hash}/v2/categories/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 10, + "parent_id": 1, + "name": "Xmen toys", + "description": "", + "sort_order": 2, + "page_title": "", + "meta_keywords": null, + "meta_description": null, + "layout_file": "category.html", + "parent_category_list": [ + 1, + 10 + ], + "image_file": "d/apiy2uz6q__69888.jpg", + "is_visible": true, + "search_keywords": "", + "url": "/xmen-toys/" +} +``` + +## Get a Count of Categories + +Gets a count of the total number of categories in the store. + +`GET /stores/{store_hash}/v2/categories/count` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 10 +} +``` + +## Create a Category + +Creates a new category. + +`POST /stores/{store_hash}/v2/categories` + +### Read-only Properties + +The following properties of the category are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* parent_category_list + +### Requirements + +The following properties of the category are required. The request won’t be fulfilled unless these properties are valid. + +* name + +**Note** + +To maximize system performance, BigCommerce caps the number of categories that can be added to a store at 16,000. If your `POST` causes the store to exceed the maximum of 16,000 categories, BigCommerce will return a 403 error. + +In addition, BigCommerce caps the total number of parent categories at seven. If your `POST` includes the ID of a parent category in the `parent_id` field, BigCommerce will check that parent category and its parent and so on to determine the total number of parent categories. If your `POST` would cause the total number of parent categories to exceed seven, BigCommerce will return a 403 error. + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "name": "Xmen toys" +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 10, + "parent_id": 1, + "name": "Xmen toys", + "description": "", + "sort_order": 2, + "page_title": "", + "meta_keywords": null, + "meta_description": null, + "layout_file": "category.html", + "parent_category_list": [ + 1, + 10 + ], + "image_file": "d/apiy2uz6q__69888.jpg", + "is_visible": true, + "search_keywords": "", + "url": "/xmen-toys/" +} +``` + +## Update a Category + +Updates an existing category. + +`PUT /stores/{store_hash}/v2/categories/{id}` + +### Read-only Properties + +The following properties of the category are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* parent_category_list + +### Requirements + +The following properties of the category are required. The request won’t be fulfilled unless these properties are valid. + +**Note** + +To maximize system performance, BigCommerce caps the total number of parent categories at seven. If your `PUT` includes the ID of a parent category in the `parent_id` field, BigCommerce will check the parent and any children of the current category to determine the total number of parent categories. If your `PUT` would cause the total number of parent categories to exceed the maximum of seven, BigCommerce will return a 403 error. + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 10, + "parent_id": 1, + "name": "Xmen toys", + "description": "", + "sort_order": 2, + "page_title": "", + "meta_keywords": null, + "meta_description": null, + "layout_file": "category.html", + "parent_category_list": [ + 1, + 10 + ], + "image_file": "d/apiy2uz6q__69888.jpg", + "is_visible": true, + "search_keywords": "", + "url": "/xmen-toys/" +} +``` + +## Delete a Category + +Deletes a category. + +`DELETE /stores/{store_hash}/v2/categories/{id}` + + + #### Delete Products before Categories + The Delete All Categories operation will not succeed unless the store has zero products. If any products in the store belong to any categories, the entire operation will fail. Therefore, if you really want to delete all the categories of the store, you must first delete all of the products in the store. + + +## Delete All Categories + +Deletes all the categories in the store. + +`DELETE /stores/{store_hash}/v2/categories` diff --git a/docs/legacy/v2-catalog-products/v2-custom-fields.mdx b/docs/legacy/v2-catalog-products/v2-custom-fields.mdx new file mode 100644 index 000000000..60088667e --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-custom-fields.mdx @@ -0,0 +1,211 @@ +--- +title: Custom Fields +keywords: v2, catalog, +--- + +# Custom Fields + +## Custom Fields + +Custom fields associated with a product. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Product Custom Fields](/docs/rest-catalog/products/custom-fields#get-custom-fields). + + +### Custom Field Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | | +| product_id | int | ID of the associated product | +| name | string | key; limited to 250 characters | +| text | string | value; limited to 250 characters | + +| Manages | OAuth Scopes | +|-|-| +| store_v2_products|store_v2_products_read_only + +## List Custom Fields + +Gets custom fields associated with a product. + +`GET /stores/{store_hash}/v2/products/{product_id}/custom_fields` + +### Filters + +There are no filter parameters specific to `custom_fields`. + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 custom_fields are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/custom_fields?page={number}` | +| limit | int | `/api/v2/products/{product_id}/custom_fields?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 1, + "product_id": 30, + "name": "Toy manufactured in", + "text": "USA" + }, + { + "id": 2, + "product_id": 45, + "name": "Release Date", + "text": "2013-12-25" + } +] +``` + +## Get a Custom Field + +Gets a custom field associated with a product. + +`GET /stores/{store_hash}/v2/products/{product_id}/custom_fields/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 2, + "product_id": 30, + "name": "Toy manufactured in", + "text": "USA" +} +``` + +## Get a Count of Custom Fields + +Gets a count of the number of custom fields in the store. + +`GET /stores/{store_hash}/v2/products/custom_fields/count` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 0 +} +``` + +## Create a Custom Field + +Creates a new custom field associated with a product + +`POST /stores/{store_hash}/v2/products/{product_id}/custom_fields` + +### Read-only Properties + +The following properties of the custom field are read-only. If one or more of these properties are included in the request, it will be rejected. + +* product_id + +### Requirements + +The following properties of the custom field are required. The request won’t be fulfilled unless these properties are valid. + +* name +* text + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "name": "Release Date", + "text": "2013-12-25" +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 5, + "product_id": 45, + "name": "Release Date", + "text": "2013-12-25" +} +``` + +## Update a Custom Field + +Updates an existing custom field associated with a product. + +`PUT /stores/{store_hash}/v2/products/{product_id}/custom_fields/{id}` + +### Read-only Properties + +The following properties of the custom field are read-only. If one or more of these properties are included in the request, it will be rejected. + +* product_id + +### Requirements + +The following properties of the custom field are required. The request won’t be fulfilled unless these properties are valid. + +* name +* text + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "name": "Release Date", + "text": "2013-12-31" +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 5, + "product_id": 45, + "name": "Release Date", + "text": "2013-12-31" +} +``` + +## Delete a Custom Field + +Deletes a custom field associated with a product. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/custom_fields/{id}` + +## Delete Multiple Custom Fields + +Deletes multiple custom fields associated with a product. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/custom_fields` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 custom_fields are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/custom_fields?page={number}` | +| limit | int | `/api/v2/products/{product_id}/custom_fields?limit={count}` | diff --git a/docs/legacy/v2-catalog-products/v2-option-set-options.mdx b/docs/legacy/v2-catalog-products/v2-option-set-options.mdx new file mode 100644 index 000000000..90c12e235 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-option-set-options.mdx @@ -0,0 +1,278 @@ +--- +title: Option Set Options +keywords: v2, catalog, +--- + +# Option Set Options + +## Option Set Options + +Options belonging to an option set. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + + +### Option Set Option: Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | The ID of this option. | +| option_id | int | The ID of the option to which this option set connects. | +| option_set_id | int | The ID of this option set. | +| display_name | string | The friendly name used for this option set. | +| sort_order | int | The order in which the option is displayed on the product page. | +| is_required | boolean | Specifies whether customer is required to enter a value for this option before they can add the product to their cart. | +| option | resource | The connected option. | +| values | object_array | Array of values for the connected option. | + +## List Option Set Options + +Gets the options associated with an option set. (Default sorting is by option id, from lowest to highest.) + +`GET /stores/{store_hash}/v2/option_sets/{option_set_id}/options` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 option_set_options are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| Page | int | `/api/v2/option_sets/{option_set_id}/options?page={number}` | +| Limit | int | `/api/v2/option_sets/{option_set_id}/options?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 43, + "option_id": 18, + "option_set_id": 14, + "display_name": "Size", + "sort_order": 0, + "is_required": true, + "option": { + "url": "https://example.com/api/v2/options/18.json", + "resource": "/options/18" + }, + "values": [ + { + "label": "XS", + "sort_order": 0, + "value": "XS", + "option_value_id": 68 + }, + { + "label": "S", + "sort_order": 1, + "value": "S", + "option_value_id": 69 + }, + { + "label": "M", + "sort_order": 2, + "value": "M", + "option_value_id": 70 + }, + { + "label": "L", + "sort_order": 3, + "value": "L", + "option_value_id": 71 + }, + { + "label": "XL", + "sort_order": 4, + "value": "XL", + "option_value_id": 72 + } + ] + }, + { + "id": 44, + "option_id": 3, + "option_set_id": 14, + "display_name": "Color", + "sort_order": 1, + "is_required": true, + "option": { + "url": "https://example.com/api/v2/options/3.json", + "resource": "/options/3" + }, + "values": [ + { + "label": "Silver", + "sort_order": 1, + "value": "#cccccc", + "option_value_id": 7 + }, + { + "label": "Black", + "sort_order": 2, + "value": "#000000", + "option_value_id": 8 + }, + { + "label": "Purple", + "sort_order": 3, + "value": "#700170", + "option_value_id": 9 + } + ] + } +] +``` + +## Get an Option Set Option + +Gets an option set option. + +`GET /stores/{store_hash}/v2/option_sets/{option_set_id}/options/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 4, + "option_id": 5, + "option_set_id": 2, + "display_name": "Clock Speeds (CPU)", + "sort_order": 0, + "is_required": true, + "option": { + "url": "https://example.com/api/v2/options/5.json", + "resource": "/options/5" + } +} +``` + +## Create an Option Set Option + +Creates a new option associated with an option set. + +`POST /stores/{store_hash}/v2/option_sets/{option_set_id}/options` + +### Read-only Properties + +The following properties of the option set option are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* option_set_id +* values +* option + +### Requirements + +The following properties of the option set option are required. The request won’t be fulfilled unless these properties are valid. + +* option_id + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "option_id": 10, + "display_name": "Choose a color", + "sort_order": 1, + "is_required": true +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 2, + "option_id": 10, + "option_set_id": 1, + "display_name": "Choose a color", + "sort_order": 1, + "is_required": true, + "option": { + "url": "https://example.com/api/v2/options/10.json", + "resource": "/options/10" + } +} +``` + +## Update an Option Set Option + +Updates an existing option set option. + +`PUT /stores/{store_hash}/v2/option_sets/{option_set_id}/options/{id}` + +### Read-only Properties + +The following properties of the option set option are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* option_id +* option_set_id +* values +* option + +### Requirements + +The following properties of the option set option are required. The request won’t be fulfilled unless these properties are valid. + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "display_name": "Pick a color...", + "sort_order": 2, + "is_required": false +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 2, + "option_id": 10, + "option_set_id": 2, + "display_name": "Pick a color...", + "sort_order": 2, + "is_required": false, + "option": { + "url": "https://example.com/api/v2/options/10.json", + "resource": "/options/10" + } +} +``` + +## Delete an Option Set Option + +Deletes an option belonging to an option set. + +`DELETE /stores/{store_hash}/v2/option_sets/{option_set_id}/options/{id}` + +## Delete Multiple Option Set Options + +Deletes multiple options associated with an option set. + +`DELETE /stores/{store_hash}/v2/option_sets/{option_set_id}/options` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 option_set_options are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| Page | int | `/api/v2/option_sets/{option_set_id}/options?page={number}` | +| Limit | int | `/api/v2/option_sets/{option_set_id}/options?limit={count}` | diff --git a/docs/legacy/v2-catalog-products/v2-option-sets.mdx b/docs/legacy/v2-catalog-products/v2-option-sets.mdx new file mode 100644 index 000000000..d1fe3ed66 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-option-sets.mdx @@ -0,0 +1,220 @@ +--- +title: Option Sets +keywords: v2, catalog, +--- + +# Option Sets + +## Option Sets + +A reusable set of option facets that can be applied to products. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + + + +### Option Set Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | Optional field. Unique numeric ID for this option set. Increments sequentially. | +| name | string | Required field. The option set's name, as used internally. Must be unique. | +| options | object/resource | Optional field; read-only. Object containing option-set options: a `url` and a `resource`. | +| product_id (optional) | integer | Optional field; read-only. If `null`, this option set can be reused with any product. If populated with a numeric ID, this option set can be used exclusively with the corresponding product. | + +## List Option Sets + +Gets the collection of option sets. (Default sorting is by option-set id, from lowest to highest.) + +`GET /stores/{store_hash}/v2/option_sets` + +### Filters + +Filter parameters can be added to the URL query string to select specific option_sets in the collection. + +| Parameter | Type | Example | +|-|-|-| +| name | string | `/api/v2/option_sets?name={value}` | + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 option_sets are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| Page | int | `/api/v2/option_sets?page={number}` | +| Limit | int | `/api/v2/option_sets?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 1, + "product_id": null, + "name": "MacBook", + "options": { + "url": "https://store-bwvr466.mybigcommerce.com/api/v2/optionsets/1/options.json", + "resource": "/optionsets/1/options", + "product_id": null + } + }, + { + "id": 2, + "product_id": null, + "name": "PixelSkin Case", + "options": { + "url": "https://store-bwvr466.mybigcommerce.com/api/v2/optionsets/2/options.json", + "resource": "/optionsets/2/options", + "product_id": null + } + } +] +``` + +## Get an Option Set + +Gets an option set. + +`GET /stores/{store_hash}/v2/option_sets/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 10, + "product_id": null, + "name": "T-Shirt Facets", + "options": { + "url": "https://store-bwvr466.mybigcommerce.com/api/v2/optionsets/10/options.json", + "resource": "/optionsets/13/options", + "product_id": null + } +} +``` + +## Get a Count of Option Sets + +Gets a count of the number of option sets in the store. + +`GET /stores/{store_hash}/v2/option_sets/count` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 4 +} +``` + +## Create an Option Set + +Creates a new Option set. + +`POST /stores/{store_hash}/v2/option_sets` + +### Read-only Properties + +The following properties of the option set are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* options + +### Requirements + +The following properties of the option set are required. The request won’t be fulfilled unless these properties are valid. + +* name + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "name": "T-Shirts" +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 10, + "product_id": null, + "name": "T-Shirts", + "options": { + "url": "https://store-bwvr466.mybigcommerce.com/api/v2/optionsets/10/options.json", + "resource": "/optionsets/10/options", + "product_id": null + } +} +``` + +## Update an Option Set + +Updates an existing option set. + +`PUT /stores/{store_hash}/v2/option_sets/{id}` + +### Read-only Properties + +The following properties of the option set are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* options + +### Requirements + +The following properties of the option set are required. The request won’t be fulfilled unless these properties are valid. + +* name + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "name": "T-shirt Facets" +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 10, + "product_id": null, + "name": "T-shirt Facets", + "options": { + "url": "https://store-bwvr466.mybigcommerce.com/api/v2/optionsets/10/options.json", + "resource": "/optionsets/13/options", + "product_id": null + } +} +``` + +## Delete an Option Set + +Deletes an option set. + +`DELETE /stores/{store_hash}/v2/option_sets/{id}` + +## Delete All Option Sets + +Deletes all option sets in the store. + +`DELETE /stores/{store_hash}/v2/option_sets` diff --git a/docs/legacy/v2-catalog-products/v2-option-values.mdx b/docs/legacy/v2-catalog-products/v2-option-values.mdx new file mode 100644 index 000000000..d232faa99 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-option-values.mdx @@ -0,0 +1,212 @@ +--- +title: Option Values +keywords: v2, catalog, +--- + +# Option Values + +## Option Values + +Values that can be selected for an option. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Product Option Values](/archive/store-operations/v2-catalog-products/v2-option-values). + + +### Option Value Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | A unique, read-only value that identifies this option value. | +| option_id | int | A read-only value identifying the option to which this option value is assigned. | +| label | string | The name of the label. Cannot be the same as the label of another value already assigned to the option. | +| sort_order | int | +| value | text | Acceptable values generally depend on the option type, as defined in the option:

    `RB`: string to be displayed to the customer.
    `RT`: string to be displayed to the customer.
    `S`: string to be displayed to the customer.
    `P`: product ID;
    `PI`: product ID.
    `CS`: one of the following color values – a hexadecimal color code to create a color option (e.g., `#0f0000`);
    a CSS 2.1 color name (e.g., `blue`);
    up to three hexadecimal color codes and/or color names, separated by pipe symbols (e.g., `#FF0000|lime|#0000FF`);
    a URI to an image to create a texture (e.g., `http://store.com/images/myimg.png`);
    or the name of an image file in the store's WebDAV `import` folder (e.g., `myimg.png`). | +| is_default | boolean | Whether or not this value is selected by default. For each option, only one option value can be selected by default. | + +## List Option Values + +Gets the values belonging to an option. (Default sorting is by option-value id, from lowest to highest.) + +`GET /stores/{store_hash}/v2/options/{option_id}/values` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 option_values are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| Page | int | `/api/v2/options/{option_id}/values?page={number}` | +| Limit | int | `/api/v2/options/{option_id}/values?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 1, + "option_id": 3, + "label": "Silver", + "sort_order": 2, + "value": "#cccccc", + "is_default": true + }, + { + "id": 2, + "option_id": 3, + "label": "Black", + "sort_order": 1, + "value": "#000000", + "is_default": false + } +] +``` + +## Get an Option Value + +Gets an option value. + +`GET /stores/{store_hash}/v2/options/{option_id}/values/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 9, + "option_id": 3, + "label": "Purple", + "sort_order": 3, + "value": "#700170", + "is_default": false +} +``` + +## Create an Option Value + +Creates a new option value. + +`POST /stores/{store_hash}/v2/options/{option_id}/values` + +### Read-only Properties + +The following properties of the option value are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* option_id + +### Requirements + +The following properties of the option value are required. The request won’t be fulfilled unless these properties are valid. + +* label +* value + +**Note** + +To maximize system performance, BigCommerce caps the total number of values per option at 250. IF the option has 250 values and you try to create another one, BigCommerce will return a 403 error. + +When you POST an `is_default`property of `true`, all other option values on the parent option will have their `is_default` property set to `false`. + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "label": "white", + "sort_order": 0, + "value": "#FFFFFF", + "is_default": true +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 68, + "option_id": 3, + "label": "white", + "sort_order": 0, + "value": "#FFFFFF", + "is_default": true +} +``` + +## Update an Option Value + +Updates an existing option value. + +`PUT /stores/{store_hash}/v2/options/{option_id}/values/{id}` + +### Read-only Properties + +The following properties of the option value are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* option_id + +### Requirements + +The following properties of the option value are required. The request won’t be fulfilled unless these properties are valid. + +### Notes + +When you PUT an `is_default` property of `true`, all other option values on the parent option will have their `is_default` property set to `false`. + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "label": "whitish", + "sort_order": 1, + "value": "#FFFFEF", + "is_default": true +} +``` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 68, + "option_id": 3, + "label": "whitish", + "sort_order": 1, + "value": "#FFFFEF", + "is_default": true +} +``` + +## Delete an Option Value + +Deletes an option value. + +`DELETE /stores/{store_hash}/v2/options/{option_id}/values/{id}` + +## Delete Multiple Option Values + +Deletes multiple values belonging to an option. + +`DELETE /stores/{store_hash}/v2/options/{option_id}/values` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 option_values are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| Page | int | `/api/v2/options/{option_id}/values?page={number}` | +| Limit | int | `/api/v2/options/{option_id}/values?limit={count}` | diff --git a/docs/legacy/v2-catalog-products/v2-options.mdx b/docs/legacy/v2-catalog-products/v2-options.mdx new file mode 100644 index 000000000..a7862b8bc --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-options.mdx @@ -0,0 +1,87 @@ +--- +title: Product Options +keywords: v2, catalog, +--- + +# Product Options + +## Options + +Shared attributes that control value facets on a product. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + + +### Options Object – Properties + +| Name | Type | Description | +|-|-|-| +| name | string | Required field. The option's name, as used internally. Must be unique. | +| display_name | string | Optional field. The option's name, as displayed on the storefront. Defaults to same value as `name`. However, a custom value can be defined here, and can be reused among multiple options. | +| type | string | Optional field. The type of option, which determines how it will display on the storefront. Acceptable values:
    `C`: Checkbox;
    `D`: Date field;
    `F`: File upload field;
    `MT`: Multi-line text field;
    `RB`: Radio buttons;
    `RT`: Rectangular boxes (for product sizes);
    `S`: Select/drop-down list;
    `C`: Numbers-only text field;
    `P`: Product Pick list;
    `CS`: Color/texture Swatch;
    `T`: Text field. | +| values | object | Optional field. Object containing option values: a `url` and a `resource`. | +| product_id | integer | Optional field; read-only. If `null`, this option can be reused with any product. If populated with a numeric ID, this option can be used exclusively with the corresponding product. | + +## List Product Options + +Gets the options associated with a product. + +`GET /stores/{store_hash}/v2/products/{product_id}/options` + +### Filters + +There are no filter parameters specific to product options. + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 product_options are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/options?page={number}` | +| limit | int | `/api/v2/products/{product_id}/options?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 13, + "option_id": 8, + "display_name": "iPod Capacities", + "sort_order": 0, + "is_required": true + }, + { + "id": 14, + "option_id": 9, + "display_name": "Accessories", + "sort_order": 1, + "is_required": false + } +] +``` + +## Get a Product Option + +Gets an option associated with a product. + +`GET /stores/{store_hash}/v2/products/{product_id}/options/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 14, + "option_id": 9, + "display_name": "Accessories", + "sort_order": 1, + "is_required": false +} +``` diff --git a/docs/legacy/v2-catalog-products/v2-product-images.mdx b/docs/legacy/v2-catalog-products/v2-product-images.mdx new file mode 100644 index 000000000..6c112ce2f --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-product-images.mdx @@ -0,0 +1,215 @@ +--- +title: Product Images +keywords: v2, catalog, products, +--- + +# Product Images + +## Product Images + +Images associated with a product. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Product Images](/docs/rest-catalog/products/images#get-all-product-images). + + +### Product Image Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | +| product_id | int | The ID of the product to which the image belongs. | +| image_file | string | When specifying a product image, the `image_file` should be specified as either: a path to an image already uploaded via WebDAV to the import directory (with the path relative to the import directory); or a URL to an image accessible on the internet. | +| is_thumbnail | boolean | If true, the image is used as the product's thumbnail. | +| sort_order | int | The order in which the image will be displayed on the product page. Lower integers will give the image a higher priority. If the image is given a lower priority, then when updating, all images with a `sort_order` the same or greater than the image's new `sort_order` value will have their `sort_order` reordered. | +| description | text | The description for the image | +| date_created | date | + +### List Product Images + +Gets the images associated with a product. (Default sorting is by image id, from lowest to highest.) + +`GET /stores/{store_hash}/v2/products/{product_id}/images` + +### Filters + +There are no filter parameters specific to product images. + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 product_images are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/images?page={number}` | +| limit | int | `/api/v2/products/{product_id}/images?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 247, + "product_id": 32, + "image_file": "sample_images/in_123__14581.jpg", + "zoom_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.1280.1280.jpg?c=1", + "thumbnail_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.386.513.jpg?c=1", + "standard_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.220.290.jpg?c=1", + "tiny_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.44.58.jpg?c=1", + "is_thumbnail": true, + "sort_order": 0, + "description": null, + "date_created": "Mon, 24 Sep 2012 01:14:30 +0000" + }, + { + "id": 248, + "product_id": 32, + "image_file": "sample_images/in_122__93910.jpg", + "zoom_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/248/in_122__93910.1393831046.1280.1280.jpg?c=1", + "thumbnail_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/248/in_122__93910.1393831046.386.513.jpg?c=1", + "standard_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/248/in_122__93910.1393831046.220.290.jpg?c=1", + "tiny_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/248/in_122__93910.1393831046.44.58.jpg?c=1", + "is_thumbnail": false, + "sort_order": 1, + "description": null, + "date_created": "Mon, 24 Sep 2012 01:17:14 +0000" + } +] +``` + +## Get a Product Image + +Gets a product image. + +`GET /stores/{store_hash}/v2/products/{product_id}/images/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 248, + "product_id": 32, + "image_file": "sample_images/in_122__93910.jpg", + "zoom_url": "https://cdn.bcapp.dev/bcapp/et7xe3pz/products/32/images/248/in_122__93910.1393831046.1280.1280.jpg?c=1", + "thumbnail_url": "https://cdn.bcapp.dev/bcapp/et7xe3pz/products/32/images/248/in_122__93910.1393831046.386.513.jpg?c=1", + "standard_url": "https://cdn.bcapp.dev/bcapp/et7xe3pz/products/32/images/248/in_122__93910.1393831046.220.290.jpg?c=1", + "tiny_url": "https://cdn.bcapp.dev/bcapp/et7xe3pz/products/32/images/248/in_122__93910.1393831046.44.58.jpg?c=1", + "is_thumbnail": false, + "sort_order": 1, + "description": null, + "date_created": "Mon, 24 Sep 2012 01:17:14 +0000" +} +``` + +## Get a Count of Product Images + +Gets a count of the number of product images in the store. + +`GET /stores/{store_hash}/v2/products/images/count` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 105 +} +``` + +## Create a Product Image + +Creates a new product image. + +`POST /stores/{store_hash}/v2/products/{product_id}/images` + +### Read-only Properties + +The following properties of the product image are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* date_created +* product_id + +### Requirements + +The following properties of the product image are required. The request won’t be fulfilled unless these properties are valid. + +* image_file + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 116, + "product_id": 29, + "image_file": "p/022/astonishing-x-men-1-100k__36562.jpg", + "is_thumbnail": false, + "sort_order": 0, + "description": "", + "date_created": "Fri, 21 Dec 2012 18:54:04 +0000" +} +``` + +## Update a Product Image + +Updates an existing product image. + +`PUT /stores/{store_hash}/v2/products/{product_id}/images/{id}` + +### Read-only Properties + +The following properties of the product image are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* product_id +* date_created + +### Requirements + +The following properties of the product image are required. The request won’t be fulfilled unless these properties are valid. + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 118, + "product_id": 30, + "image_file": "k/392/ud2vk0n1l0zcfr7gtlqi__43888.png", + "is_thumbnail": false, + "sort_order": 1, + "description": "", + "date_created": "Fri, 21 Dec 2012 19:01:03 +0000" +} +``` + +## Delete a Product Image + +Deletes a product image. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/images/{id}` + +## Delete Multiple Product Images + +Deletes multiple product images. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/images` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 `product_images` are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| Page | int | `/api/v2/products/{product_id}/images?page={number}` | +| Limit | int | `/api/v2/products/{product_id}/images?limit={count}` | diff --git a/docs/legacy/v2-catalog-products/v2-product-options.mdx b/docs/legacy/v2-catalog-products/v2-product-options.mdx new file mode 100644 index 000000000..fe235d50a --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-product-options.mdx @@ -0,0 +1,82 @@ +--- +title: Product Options +keywords: v2, catalog, products, +--- + +# Product Options + +## Product Options + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Product Options](/archive/store-operations/v2-catalog-products/v2-product-options). + + +### Product Options Object – Properties + +| Title | Name | Type | Description | +|-|-|-|-| +| `id` | `int` | +| `option_id` | `int` | +| `display_name` | `string` | +| `sort_order` | `int` | +| `is_required` | `boolean` | + +## List Product Options + +Gets the options associated with a product. + +`GET /stores/{store_hash}/v2/products/{product_id}/options` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250\. If a limit isn’t provided, up to 50 product_options are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| `page` | int | `/api/v2/products/{product_id}/options?page={number}` | +| `limit` | int | `/api/v2/products/{product_id}/options?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 13, + "option_id": 8, + "display_name": "iPod Capacities", + "sort_order": 0, + "is_required": true + }, + { + "id": 14, + "option_id": 9, + "display_name": "Accessories", + "sort_order": 1, + "is_required": false + } +] +``` + +## Get a Product Option + +Gets an option associated with a product. + +`GET /stores/{store_hash}/v2/products/{product_id}/options/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 14, + "option_id": 9, + "display_name": "Accessories", + "sort_order": 1, + "is_required": false +} +``` diff --git a/docs/legacy/v2-catalog-products/v2-product-reviews.mdx b/docs/legacy/v2-catalog-products/v2-product-reviews.mdx new file mode 100644 index 000000000..14410ec98 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-product-reviews.mdx @@ -0,0 +1,195 @@ +--- +title: Product Reviews +keywords: v2, catalog, products, +--- + +# Product Reviews + +## Product Reviews + +Reviews associated with a product. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Product Reviews](/docs/rest-catalog/products/reviews#get-product-reviews). + + +### Product Review Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | Unique database ID for this product review. Read-only. | +| product_id | int | The ID of the product to which this review belongs. Read-only. | +| author | string | The review's author, displayed on the storefront. | +| date_created | date | RFC 2822 date that specifies the creation time of the review. (If not specified, will use the current time.) | +| rating | int | A whole number from 1–5, specifying the product's rating in this review. | +| title | string | The review's title, displayed on the storefront. | +| review | text | The full text of the review, displayed on the storefront. | +| status | int | A status indicator. 0="Pending", 1= "Approved", 2="Disapproved". | + +## List Product Reviews + +Gets the reviews associated with a product. (Default sorting is by review id, from lowest to highest.) + +`GET /stores/{store_hash}/v2/products/{id}/reviews` + +### Filters + +There are no filter parameters specific to product reviews. + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 product_reviews are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/reviews?page={number}` | +| limit | int | `/api/v2/products/{product_id}/reviews?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 190, + "product_id": 5310, + "author": "John Doe", + "date_created": "Wed, 12 Dec 2012 06:00:00 +0000", + "title": "My experience with the widget", + "review": "This widget worked for me, but might not work for everyone.", + "rating": 4, + "status": 1 + }, + { + "id": 191, + "product_id": 5310, + "author": "Jane Doe", + "date_created": "Tue, 12 Nov 2013 06:00:00 +0000", + "title": "Great product, slow shipping", + "review": "Took two weeks to arrive", + "rating": 3, + "status": 1 + }, + { + "id": 192, + "product_id": 5310, + "author": "Jimmy Doe", + "date_created": "Fri, 14 Dec 2012 06:00:00 +0000", + "title": "Worked for me!", + "review": "I thought this product was pretty good", + "rating": 5, + "status": 1 + } +] +``` + +## Get a Product Review + +Gets a product review. + +`GET /stores/{store_hash}/v2/products/{product_id}/reviews/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 190, + "product_id": 5310, + "author": "John Doe", + "date_created": "Wed, 12 Dec 2012 06:00:00 +0000", + "title": "My experience with the widget", + "review": "This widget worked for me, but might not work for everyone.", + "rating": 4, + "status": 1 +} +``` + +## Create a Product Review + +Creates a new product review. + +**Note** + +The `review` property is the review's text. The `rating` property must be a whole number between 1–5. If the optional `date_created` property is not specified, it defaults to the current date/time. If the optional "status" property is not specified, it defaults to 0 [`Pending`]. Other allowable values are 1 [`Approved`] or 2 [`Disapproved`].) + +`POST /stores/{store_hash}/v2/products/{product_id}/reviews` + +### Read-only Properties + +The following properties of the product review are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* product_id + +### Requirements + +The following properties of the product review are required. The request won’t be fulfilled unless these properties are valid. + +* author +* title +* review +* rating + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 8, + "product_id": 32, + "author": "Jimmy Doe", + "date_created": "Tue, 05 Mar 2013 06:00:00 +0000", + "title": "Worked for me!", + "review": "I thought this product was pretty good", + "rating": 5, + "status": 0 +} +``` + +## Update a Product Review + +Updates an existing product review. Your request may update any of the properties that are writeable for the Create (POST) operation. + +`PUT /stores/{store_hash}/v2/products/{product_id}/reviews/{id}` + +### Read-only Properties + +The following properties of the product review are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* product_id + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 8, + "product_id": 32, + "author": "Jimmy Doe", + "date_created": "Tue, 05 Mar 2013 06:00:00 +0000", + "title": "Worked for me!", + "review": "I thought this product was pretty good", + "rating": 5, + "status": 1 +} +``` + +## Delete a Product Review + +Deletes a specified product review. (If successful, this will typically return a `204 No Content`.) + +`DELETE /stores/{store_hash}/v2/products/{product_id}/reviews/{id}` + +## Delete All Product Reviews + +Deletes all reviews for the specified product. (If successful, this will typically return a `204 No Content`.) + +`DELETE /stores/{store_hash}/v2/products/{product_id}/reviews` diff --git a/docs/legacy/v2-catalog-products/v2-product-rules.mdx b/docs/legacy/v2-catalog-products/v2-product-rules.mdx new file mode 100644 index 000000000..02436a223 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-product-rules.mdx @@ -0,0 +1,265 @@ +--- +title: Product Rules +keywords: v2, catalog, products, +--- + +# Product Rules + +## Product Rules + +Rules that modify the properties of a product, such as weight, price, and product image. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Product Complex Rules](/docs/rest-catalog/products/complex-rules#get-complex-rules). + + +### Product Rule Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | The ID of the rule. | +| product_id | int | The ID of the product to which the rule belongs. | +| sort_order | int | The order in which the rule will be displayed on the product page. Lower integers will give the rule a higher priority. If the rule is given a lower priority, then when updating, all rules with a `sort_order` the same or greater than the rule's new `sort_order` value will have their `sort_order` reordered. | +| is_enabled | boolean | If set to `true`, the rule will be evaluated when a customer configures a product's options. | +| is_stop | boolean | If set to `true` and the rule evaluates to `true`, no more rules with a higher `sort_order` will be processed. | +| price_adjuster | object | If a product option rule specifies a change to the price based on an option, the `price_adjuster` object will consist of two name/value pairs. The first pair is named `adjuster` and contains one of the following values: `relative`, `percentage`, or `absolute`. The `percentage` value causes the price to vary based on either a positive or negative percentage. The `relative` value causes the price to vary by either a positive or negative monetary amount. The `absolute` value resets the price, so it should always be a positive number. The second pair is named `adjuster_value` and contains a decimal value representing one of the following: the amount to add or subtract from the price, the percentage by which the price should change, or the new price (as per the `adjuster` setting). If the product option rule does not specify a change to the price based on size or color, `price_adjuster` will be null. | +| weight_adjuster | object | If a product option rule specifies a change to the weight based on an option, the `weight_adjuster` object will consist of two name/value pairs. The first pair is named `adjuster` and contains one of the following values: `relative` or `absolute`. The `relative` value causes the weight to vary by either a positive or negative amount. The `absolute` value resets the weight, so it should always be a positive number. The second pair is named `adjuster_value` and contains a decimal value representing one of the following: the amount to add or subtract from the weight or the new weight (as per the `adjuster` setting). If the product option rule does not specify a change to the price based on size or color, `weight_adjuster` will be null. | +| is_purchasing_disabled | boolean | If true this rule prohibits purchasing the product with the configured option values. | +| purchasing_disabled_message | string | The message to display if the rule disabled purchasing the product. | +| is_purchasing_hidden | boolean | If true the rule hides the options on the product. Setting this to true has no effect if the rule is based on an SKU or has conditions from multiple product options. | +| image_file | string | When specifying a product rule, the image_file should be specified as either: A path to a rule already uploaded via FTP in the import directory and the path should be relative from the import directory. It can be a URL to a rule accessible on the internet. | +| conditions | array | The conditions array can contain one or more objects. Each object inside the array contains three name/value pairs, but at least one value will be missing at any given time. If a `product_option_id` value is present, then a `option_value_id` must also be present. If `product_option_id` and `option_value_id` values are present, then a `sku_id` value must not be present. This also holds true in the reverse, where if a `sku_id` value exists, values for the `product_option_id` and `option_value_id` cannot exist. NOTE: if you can use a SKU value, this is preferred for simplicity. Empty values are represented as `null`. If multiple objects are included in the array, the software runs through them using an AND/OR logic. Objects with identical `product_option_id` values will be linked with an OR. Objects with different `product_option_id` values will be linked with an AND. When one object contains a `sku_id` value and the other contains `product_option_id` and `option_value_id` values, they will be linked with an AND. Two objects which both contain `sku_id` values will be linked with an OR. | + +## List Product Rules + +Gets the collection of rules associated with a product. (Default sorting is by rule id, from lowest to highest.) + +`GET /stores/{store_hash}/v2/products/{product_id}/rules` + +### Filters + +There are no filter parameters specific to product rules. + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 product_rules are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/rules?page={number}` | +| limit | int | `/api/v2/products/{product_id}/rules?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 1, + "product_id": 3, + "sort_order": 0, + "is_enabled": true, + "is_stop": false, + "price_adjuster": null, + "weight_adjuster": null, + "is_purchasing_disabled": false, + "purchasing_disabled_message": "", + "is_purchasing_hidden": false, + "image_file": "attribute_rule_images/1_source.jpg", + "conditions": [ + { + "product_option_id": 4, + "option_value_id": 7, + "sku_id": null + } + ] + }, + { + "id": 2, + "product_id": 3, + "sort_order": 1, + "is_enabled": true, + "is_stop": false, + "price_adjuster": null, + "weight_adjuster": null, + "is_purchasing_disabled": false, + "purchasing_disabled_message": "", + "is_purchasing_hidden": false, + "image_file": "attribute_rule_images/2_source.jpg", + "conditions": [ + { + "product_option_id": 4, + "option_value_id": 8, + "sku_id": null + } + ] + } +] +``` + +## Get a Product Rule + +Gets a single product rule. + +`GET /stores/{store_hash}/v2/products/{product_id}/rules/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 2, + "product_id": 3, + "sort_order": 1, + "is_enabled": true, + "is_stop": false, + "price_adjuster": null, + "weight_adjuster": null, + "is_purchasing_disabled": false, + "purchasing_disabled_message": "", + "is_purchasing_hidden": false, + "image_file": "attribute_rule_images/2_source.jpg", + "conditions": [ + { + "product_option_id": 4, + "option_value_id": 8, + "sku_id": null + } + ] +} +``` + +## Get a Count of Product Rules + +Gets a count of the number of product rules in the store. + +`GET /stores/{store_hash}/v2/products/rules/count` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 3 +} +``` + +## Create a Product Rule + +Creates a new product rule. + +`POST /stores/{store_hash}/v2/products/{product_id}/rules` + +### Read-only Properties + +The following properties of the product rule are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* product_id + +### Requirements + +The following properties of the product rule are required. The request won’t be fulfilled unless these properties are valid. + +* conditions + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 10, + "product_id": 3, + "sort_order": 1, + "is_enabled": true, + "is_stop": false, + "price_adjuster": null, + "weight_adjuster": null, + "is_purchasing_disabled": false, + "purchasing_disabled_message": "", + "is_purchasing_hidden": false, + "image_file": "attribute_rule_images/2_source.jpg", + "conditions": [ + { + "product_option_id": 4, + "option_value_id": 8, + "sku_id": null + } + ] +} +``` + +## Update a Product Rule + +Updates an existing product rule. + +**Note** + +If you include a conditions object array, its contents will be appended to any existing conditions. This operation does not overwrite existing conditions. + +`PUT /stores/{store_hash}/v2/products/{product_id}/rules/{id}` + +### Read-only Properties + +The following properties of the product rule are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* product_id + +### Requirements + +There are no property requirements for updating a product rule. + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 2, + "product_id": 3, + "sort_order": 2, + "is_enabled": true, + "is_stop": false, + "price_adjuster": null, + "weight_adjuster": null, + "is_purchasing_disabled": false, + "purchasing_disabled_message": "", + "is_purchasing_hidden": false, + "image_file": "attribute_rule_images/2_source.jpg", + "conditions": [ + { + "product_option_id": 4, + "option_value_id": 8, + "sku_id": null + } + ] +} +``` + +## Delete a Product Rule + +Deletes a product rule. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/rules/{id}` + +## Delete Multiple Product Rules + +Deletes multiple product rules. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/rules` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 `product_rules` are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/rules?page={number}` | +| limit | int | `/api/v2/products/{product_id}/rules?limit={count}` | diff --git a/docs/legacy/v2-catalog-products/v2-product-sku.mdx b/docs/legacy/v2-catalog-products/v2-product-sku.mdx new file mode 100644 index 000000000..760333a34 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-product-sku.mdx @@ -0,0 +1,351 @@ +--- +title: Product SKU +keywords: v2, catalog, products, +--- + +# Product SKU + +## SKUs + +Stock Keeping Unit identifiers associated with products or product options. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Product Variants](/docs/rest-catalog/product-variants#get-all-product-variants). + + +### SKU Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | | +| product_id | int | | +| sku | string | The unique SKU (stock keeping unit). | +| price | decimal | This SKU's base price on the storefront. If this value is null, the product's default price (set in the Product resource's `price` field) will be used as the base price. | +| adjusted_price | decimal | The SKU's price on the storefront – after the product's base price is inherited, and/or any option set or any product rules are applied. This property is READ-ONLY. | +| cost_price | decimal | The product's cost price. | +| upc | string | The UPC (Universal Product Code) for this product combination. | +| inventory_level | int | The inventory level for the product. | +| inventory_warning_level | int | The inventory warning level for the product .| +| bin_picking_number | string | The BIN picking number. | +| weight | decimal | This SKU's base weight on the storefront. If this value is null, the product's default weight (set in the Product resource's weight field) will be used as the base weight. | +| adjusted_weight | decimal | This SKU's weight on the storefront – after the product's base weight is inherited, and/or any option set or any product rules are applied. This property is READ-ONLY. | +| is_purchasing_disabled | boolean | if true, this prohibits purchasing of the SKU. | +| purchasing_disabled_message | string | The message to display if purchasing is disabled on this SKU. | +| image_file | string | The image that will be displayed when this SKU is selected on the storefront. When updating a SKU image, send the publicly accessible URL. Supported image formats are JPEG, PNG, and GIF. | +| options | object_array | This is an object `{"product_option_id": int, "option_value_id":int}` | + +## List Product SKUs + +Gets the collection of SKUs associated with a product. + +`GET /stores/{store_hash}/v2/products/{product_id}/skus` + +**Note** + +BigCommerce has updated the SKU schema to include additional price, weight, image, and purchasable properties. We will eventually remove the ability to manage these properties via SKU rules. (Merchants are already constrained from creating SKU-only rules in the BigCommerce control panel.) + +### Filters + +Filter parameters can be added to the URL query string to select specific skus in the collection. + +| Parameter | Type | Example | +|-|-|-| +| min_id | int | `/api/v2/products/{product_id}/skus?min_id={value}` | +| max_id | int | `/api/v2/products/{product_id}/skus?max_id={value}` | +| sku | string | `/api/v2/products/{product_id}/skus?sku={value}` | +| upc | string | `/api/v2/products/{product_id}/skus?upc={value}` | +| inventory_level | string | `/api/v2/products/{product_id}/skus?inventory_level={value}` | +| inventory_warning_level | string | `/api/v2/products/{product_id}/skus?inventory_warning_level={value}` | +| bin_picking_number | string | `/api/v2/products/{product_id}/skus?bin_picking_number={value}` | +| min_inventory_level | int | `/api/v2/products/{product_id}/skus?min_inventory_level={value}` | +| max_inventory_level | int | `/api/v2/products/{product_id}/skus?max_inventory_level={value}` | +| is_low_inventory | boolean | `/api/v2/products/{product_id}/skus?is_low_inventory={value}` | +| product_hash | int | `/api/v2/products/{product_id}/skus?product_hash={value}` | + +#### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 skus are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/skus?page={number}` | +| limit | int | `/api/v2/products/{product_id}/skus?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 1, + "product_id": 5, + "sku": "MB-1", + "price": null, + "adjusted_price": "1.5000", + "cost_price": "0.0000", + "upc": "", + "inventory_level": 0, + "inventory_warning_level": 0, + "bin_picking_number": "", + "weight": null, + "adjusted_weight": "0.00", + "is_purchasing_disabled": false, + "purchasing_disabled_message": "", + "image_file": "", + "options": [ + { + "product_option_id": 15, + "option_value_id": 17 + }, + { + "product_option_id": 16, + "option_value_id": 28 + } + ] + }, + { + "id": 2, + "product_id": 5, + "sku": "MB-2", + "price": null, + "adjusted_price": "2.0000", + "cost_price": "0.0000", + "upc": "", + "inventory_level": 0, + "inventory_warning_level": 0, + "bin_picking_number": "", + "weight": null, + "adjusted_weight": "0.00", + "is_purchasing_disabled": true, + "purchasing_disabled_message": "We're sorry, this is unavailable.", + "image_file": "", + "options": [ + { + "product_option_id": 15, + "option_value_id": 18 + }, + { + "product_option_id": 16, + "option_value_id": 26 + } + ] + } +] +``` + +## Get a Product SKU + +Gets a single product SKU. + +`GET /stores/{store_hash}/v2/products/{product_id}/skus/{id}` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 5, + "product_id": 7, + "sku": "MBA-1atest", + "price": null, + "adjusted_price": "1.5000", + "cost_price": "0.0000", + "upc": "", + "inventory_level": 0, + "inventory_warning_level": 0, + "bin_picking_number": "", + "weight": null, + "adjusted_weight": "0.00", + "is_purchasing_disabled": false, + "purchasing_disabled_message": "", + "image_file": "https://thinglust.com/eyecandy.png", + "options": [ + { + "product_option_id": 20, + "option_value_id": 51 + } + ] +} +``` + +### Get a Count of Product SKUs + +Gets a count of the number of product SKUs in the store. + +* OAuth +`GET /stores/{store_hash}/v2/products/skus/count` +* Basic Auth +`GET /api/v2/products/skus/count` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 1235 +} +``` + +### Create a Product SKU + +Creates a new product SKU. + +* OAuth +`POST /stores/{store_hash}/v2/products/{product_id}/skus` + +### Read-only Properties + +The following properties of the sku are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* product_id +* adjusted_price +* adjusted_weight + +### Requirements + +The following properties of the sku are required. The request won’t be fulfilled unless these properties are valid. + +* sku +* options + +**Note** + +To maximize system performance, BigCommerce caps the number of SKUs associated with a product at 500. If you attempt to add a SKU to a product that has 500 SKUs, BigCommerce will return a 403 error. + +BigCommerce has updated the SKU schema to include additional price, weight, image, and purchasable properties. We will eventually remove the ability to manage these properties via SKU rules. (Merchants are already constrained from creating SKU-only rules in the BigCommerce control panel.) + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 5, + "product_id": 7, + "sku": "MBA-1atest", + "price": null, + "adjusted_price": "1.5000", + "cost_price": "0.0000", + "upc": "", + "inventory_level": 0, + "inventory_warning_level": 0, + "bin_picking_number": "", + "weight": null, + "adjusted_weight": "0.00", + "is_purchasing_disabled": false, + "purchasing_disabled_message": "", + "image_file": "", + "options": [ + { + "product_option_id": 20, + "option_value_id": 51 + } + ] +} +``` + +You may encounter a case where product information was updated successfully, but related inventory data failed to update. In such cases, BigCommerce will return a `207` status along with the object as updated and a descriptive error message. + +``` +207 Multi-Status +``` + +## Update a Product SKU + +Updates an existing product SKU. + +`PUT /stores/{store_hash}/v2/products/{product_id}/skus/{id}` + +### Read-only Properties + +The following properties of the sku are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* product_id +* adjusted_price +* adjusted_weight + +### Requirements + +There are no required properties for updating a product SKU. + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 5, + "product_id": 7, + "sku": "MBA-1atest", + "price": "4.9900", + "adjusted_price": "3.9900", + "cost_price": "2.9900", + "upc": "", + "inventory_level": 0, + "inventory_warning_level": 0, + "bin_picking_number": "", + "weight": null, + "adjusted_weight": "0.00", + "is_purchasing_disabled": true, + "purchasing_disabled_message": "We're sorry, this is unavailable.", + "image_file": "", + "options": [ + { + "product_option_id": 20, + "option_value_id": 51 + } + ] +} +``` + +You may encounter a case where product information was updated successfully, but related inventory data failed to update. In such cases, BigCommerce will return a `207` status along with the object as updated and a descriptive error message. + +``` +207 Multi-Status +``` + +## Delete a Product SKU + +Deletes a product SKU. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/skus/{id}` + +## Delete Multiple Product SKUs + +Deletes multiple product SKUs. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/skus` + +### Filters + +Filter parameters can be added to the URL query string to select specific SKUs in the collection. + +| Parameter | Type | Example | +|-|-|-| +| min_id | int | `/api/v2/products/{product_id}/skus?min_id={value}` | +| max_id | int | `/api/v2/products/{product_id}/skus?max_id={value}` | +| sku | string | `/api/v2/products/{product_id}/skus?sku={value}` | +| upc | string | `/api/v2/products/{product_id}/skus?upc={value}` | +| inventory_level | string | `/api/v2/products/{product_id}/skus?inventory_level={value}` | +| inventory_warning_level | string | `/api/v2/products/{product_id}/skus?inventory_warning_level={value}` | +| bin_picking_number | string | `/api/v2/products/{product_id}/skus?bin_picking_number={value}` | +| min_inventory_level | int | `/api/v2/products/{product_id}/skus?min_inventory_level={value}` | +| max_inventory_level | int | `/api/v2/products/{product_id}/skus?max_inventory_level={value}` | +| is_low_inventory | boolean | `/api/v2/products/{product_id}/skus?is_low_inventory={value}` | +| product_hash | int | `/api/v2/products/{product_id}/skus?product_hash={value}` | + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 skus are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/skus?page={number}` | +| limit | int | `/api/v2/products/{product_id}/skus?limit={count}` | diff --git a/docs/legacy/v2-catalog-products/v2-product-videos.mdx b/docs/legacy/v2-catalog-products/v2-product-videos.mdx new file mode 100644 index 000000000..6243e4ab2 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-product-videos.mdx @@ -0,0 +1,156 @@ +--- +title: Product Videos +keywords: v2, catalog, sort, products, +--- + +# Product Videos + +## Videos + +Embedded videos displayed on product listings. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + For the most up-to-date version of this API, see [Product Videos](/docs/rest-catalog/products/videos). + + +### Videos Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | string | ID of this video. | +| product_id | int | ID of the associated product. | +| sort_order | int | Sort order for this video. | +| name | string | Name for this video. | + +## List Product Videos + +Gets the videos associated with a product. + +`GET /stores/{store_hash}/v2/products/{product_id}/videos` + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 `product_videos` are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| page | int | `/api/v2/products/{product_id}/videos?page={number}` | +| limit | int | `/api/v2/products/{product_id}/videos?limit={count}` | + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": "UmhvxsOwhqk", + "product_id": 30, + "sort_order": 0, + "name": "X-Men Evolution: Season 1, Episode 1" + } +] +``` + +## Get a Product Video + +Gets a product video. + +`GET /stores/{store_hash}/v2/products/{product_id}/videos/{id}` + +## Get a Count of Product Videos + +Gets a count of the number of product videos in the store. + +`GET /stores/{store_hash}/v2/products/videos/count` + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 0 +} +``` + +## Create a Product Video + +Adds a link to a YouTube video to a product. + +`POST /stores/{store_hash}/v2/products/{product_id}/videos` + +### Read-only Properties + +The following properties of the product video are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* product_id + +### Requirements + +The following properties of the product video are required. The request won’t be fulfilled unless these properties are valid. + +* url + +**Note** + +Only YouTube videos are supported. To create a new video, pass the full `url` in the request body. + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "url": "https://www.youtube.com/watch?v=4wZ3ZG_Wams" +} +``` + +## Update Product Video Metadata + +Edit the metadata of a product video. + +`PUT /stores/{store_hash}/v2/products/{product_id}/videos/{id}` + +### Read-only Properties + +The following properties of the product video are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* product_id + +### Requirements + +There are no required properties when updating a product video. + +**Note** + +The `name`, `sort_order` and `url` properties of the product video are editable. + +Posting a new `url` will update the `id` of the video to reference the new video. + +### Request + +Example request object: + +```json showLineNumbers copy +{ + "name": "New video title", + "sort_order": 2 +} +``` + +## Delete a Product Video + +Delete a product video. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/videos/{id}` + +## Delete All Product Videos + +Deletes all videos belonging to a product. + +`DELETE /stores/{store_hash}/v2/products/{product_id}/videos` diff --git a/docs/legacy/v2-catalog-products/v2-products.mdx b/docs/legacy/v2-catalog-products/v2-products.mdx new file mode 100644 index 000000000..ecb5b81b4 --- /dev/null +++ b/docs/legacy/v2-catalog-products/v2-products.mdx @@ -0,0 +1,906 @@ +--- +title: Products V2 +keywords: v2, catalog, configurable_fields, products +--- +# Products V2 + + + It is recommended to use the new [Catalog Products](/docs/rest-catalog). + + +## Products +A product object represents a saleable item in the catalog. + + + #### Deprecated + Avoid using this API operation if possible. It will be removed in a future version. + + + +### Product Object – Properties + +| Name | Type | Description | +|-|-|-| +| id | int | The unique numerical ID of the product. Increments sequentially. | +| keyword_filter | string | (This property is deprecated.) | +| name | string | The product name. | +| type | enum | The product type. One of:
    `physical` – a physical stock unit.
    `digital` – a digital download. | +| sku | string | User-defined product code/stock keeping unit (SKU). | +| description | text | Product description, which can include HTML formatting. | +| search_keywords | text | A comma-separated list of keywords that can be used to locate the product when searching the store. | +| availability_description | string | Availability text, displayed on the checkout page under the product title, telling the customer how long it will normally take to ship this product. E.g.: "Usually ships in 24 hours". | +| price | decimal | The product's price. Should include, or exclude, tax based on the store settings. | +| cost_price | decimal | The product's cost price. Stored for reference only; not used or displayed anywhere on the store. | +| retail_price | decimal | The product's retail cost. If entered, this retail price will be shown on the product page. | +| sale_price | decimal | Sale price. If entered, this will be used instead of value in the price field when calculating the product's cost. | +| calculated_price | decimal | Price as displayed to guests, adjusted for applicable sales and rules. (Cart price might incorporate further discounts for logged-in customers or customer groups.) Read-only. | +| sort_order | int | Priority to give this product when included in product lists on category pages and in search results. Lower integers will place the product closer to the top of the results. | +| is_visible | boolean | Flag to determine whether or not the product should be displayed to customers browsing. If `true`, the product will be displayed. If `false`, the product will be hidden from view. | +| is_featured | boolean | Flag to determine whether the product should be included in the "featured products" panel for shoppers viewing the store. | +| related_products | string | Defaults to `-1`, which causes the store to automatically generate a list of related products. To manually specify the list of related products, include their IDs, separated by commas. For example: `3, 6, 7, 21`. | +| inventory_level | int | Current inventory level of the product. Simple inventory tracking must be enabled (see the `inventory_tracking` field) for this to take effect. | +| inventory_warning_level | int | Inventory Warning level for the product. When the product's inventory level drops below this warning level, the store owner will be sent a notification. Simple inventory tracking must be enabled (see the `inventory_tracking` field) for this to take effect. | +| warranty | text | Warranty information displayed on the product page. Can include HTML formatting. | +| weight | decimal | Weight of the product, which can be used when calculating shipping costs. | +| width | decimal | Width of the product, which can be used when calculating shipping costs. | +| height | decimal | Height of the product, which can be used when calculating shipping costs. | +| depth | decimal | Depth of the product, which can be used when calculating shipping costs. | +| fixed_cost_shipping_price | decimal | A fixed shipping cost for the product. If defined, this value will be used instead of normal shipping-cost calculation during checkout. | +| is_free_shipping | boolean | Flag used to indicate whether or not the product has free shipping. If `true`, the shipping cost for the product will be zero. | +| inventory_tracking | enum | The type of inventory tracking for the product. One of:
    `none` – inventory levels will not be tracked.
    `simple` – inventory levels will be tracked using the `inventory_level` and `inventory_warning_level` fields.
    `sku` – inventory levels will be tracked based on individual product options, which maintain their own warning levels and inventory levels. | +| rating_total | int | The total rating for the product. | +| rating_count | int | The total number of ratings the product has had. | +| total_sold | int | Total quantity of this product sold through transactions. | +| date_created | date | The date of which the product was created. | +| brand_id | int | The product's brand | +| view_count | int | The number of times the product has been viewed. | +| page_title | string | Custom title for the product's page. If not defined, the product name will be used as the page title. | +| meta_keywords | text | Custom meta keywords for the product page. If not defined, the store's default keywords will be used. | +| meta_description | text | Custom meta description for the product page. If not defined, the store's default meta description will be used. | +| layout_file | string | DEPRECATED. The layout template file used to render this product. This field is writable only for stores with a Blueprint theme applied. For Stencil stores, use the V3 Custom Templates API. | +| is_price_hidden | boolean | The default `false` value indicates that this product's price should be shown on the product page. If set to `true`, the price will be hidden. (NOTE: To successfully set `is_price_hidden` to `true`, the `availability` value must be `disabled`.) | +| price_hidden_label | string | By default, an empty string. If `is_price_hidden` is `true`, the value of `price_hidden_label` will be displayed instead of the price. (NOTE: To successfully set a non-empty string value for `price_hidden_label`, the `availability` value must be `disabled`.) | +| categories | array | An array of IDs for the categories this product belongs to. When updating a product, if an array of categories is supplied, then all product categories will be overwritten. Does not accept more than 1,000 ID values. | +| date_modified | date | The date that the product was last modified. | +| event_date_field_name | string | Name of the field to be displayed on the product page when selecting the event/delivery date. | +| event_date_type | enum | One of the following values:
    `none` – Disables the event/delivery date requirement and field.
    `after` – The selected date must fall either on, or after, the date specified in the `event_date_start` field.
    `before` – The selected date must fall either before, or on, the date specified in the `event_date_end` field.
    `range` – The selected date must fall between the `event_date_start` and `event_date_end` dates. | +| event_date_start | date | When the product requires the customer to select an event/delivery date, this date is used as the "after" date. | +| event_date_end | date | When the product requires the customer to select an event/delivery date, this date is used as the "before" date. | +| myob_asset_account | string | MYOB Asset Account. | +| myob_income_account | string | MYOB Income Account. | +| myob_expense_account | string | MYOB Expense/COS Account. | +| peachtree_gl_account | string | Peachtree General Ledger Account. | +| condition | enum | The product's condition. Will be shown on the product page if the value of the `is_condition_shown` field is true. Possible values: `New`, `Used`, `Refurbished`. | +| is_condition_shown | boolean | Flag used to determine whether the product's condition will be shown to the customer on the product page. | +| preorder_release_date | date | Pre-order release date. See `availability` field for details on setting a product's availability to accept pre-orders. | +| is_preorder_only | boolean | If set to `false`, the product will not change its `availability` from `preorder` to `available` on the release date. Otherwise, on the release date the product's availability/status will change to `available`. | +| preorder_message | string | Custom expected-date message to display on the product page. If undefined, the message defaults to the storewide setting. Can contain the `%%DATE%%` placeholder, which will be replaced with the release date. | +| order_quantity_minimum | int | The minimum quantity an order must contain in order to purchase this product. | +| order_quantity_maximum | int | The maximum quantity an order can contain when purchasing the product. | +| open_graph_type | enum | Type of product. Acceptable values are: `product`, `album`, `book`, `drink`, `food`, `game`, `movie`, `song`, `tv_show` | +| open_graph_title | string | Title of the product. If not specified, the product's name will be used instead. | +| open_graph_description | text | Description to use for the product. If not specified, the `meta_description` will be used instead. | +| is_open_graph_thumbnail | boolean | If set to `true`, the product thumbnail image will be used as the open graph image. | +| upc | string | The product UPC code, which is used in feeds for shopping comparison sites. | +| date_last_imported | date | The date on which the product was last imported using the bulk importer. | +| option_set_id | int | The ID of the [option set](/archive/store-operations/v2-catalog-products/v2-option-sets) applied to the product. (NOTE: To remove the option set from the product, set the value to `null` on update.) | +| tax_class_id | int | The ID of the tax class applied to the product. (NOTE: Value ignored if automatic tax is enabled.) | +| option_set_display | enum | The position on the product page where options from the option set will be displayed. | +| bin_picking_number | string | The BIN picking number for the product. | +| custom_url | string | Custom URL (if set) overriding the structure dictated in the store's settings. If no custom URL is set, this will contain the default URL. | +| primary_image | object | An image object, corresponding to the image that is set as the product's thumbnail. This object includes that image's `id`, plus four URL values identifying where to pull the image at different sizes:
    `standard_url` is the image used in the product page's image box.
    `tiny_url` is the thumbnail image displayed below the product page's image box.
    `thumbnail_url` is used for product list-box images on category pages and in side panels.
    `zoom_url` is either the original image size provided to BigCommerce, or the merchant-selected `Product Zoom Image`/`Zoomed image` size – whichever is smaller. (You can always access the product's original image via the [Product Images resource](/api/v2/#product-images).) | +| availability | enum | Availability of the product. Possible values:
    `available` – the product can be purchased on the storefront.
    `disabled` - the product is listed on the storefront, but cannot be purchased.
    `preorder` – the product is listed for pre-orders. | +| brand | resource | The product's brand | +| downloads | resource | Total number of downloads for a downloadable product. | +| images | resource | See the [Product Images resource](/api/v2/#product-images) for information. | +| discount_rules | resource | See the [Bulk Pricing/Discount](/api/v2/#bulk-pricing) resource for information. | +| configurable_fields | resource | See the [Configurable Fields](/api/v2/#configurable-fields) resource for information. | +| custom_fields | resource | See the [Custom Fields](/api/v2/#custom-fields) resource for information. | +| videos | resource | See the [Videos resource](/api/v2/#videos) for information. | +| skus | resource | Stock Keeping Units for the product. See the [Product SKUs](/api/v2/#skus) resource for the definition of a sku object. | +| rules | resource | Rules that apply only to this product, based on the product's [option set](/archive/store-operations/v2-catalog-products/v2-option-sets). See [Product Rules](/archive/store-operations/v2-catalog-products/v2-product-rules) resource for information. | +| option_set | resource | See the [Product Option Sets](/archive/store-operations/v2-catalog-products/v2-option-sets) resource for information. | +| options | resource | Options from the [option set](/api/v2/#option-sets) applied to the product. See the [Product Options](/api/v2/#product-options) resource for information. | +| tax_class | resource | Assigned tax class, when using a manual tax setup. This can be a number matching one of the tax classes set up in your store. | +| avalara_product_tax_code | resource | Accepts AvaTax System Tax Codes, which identify products and services that fall into special sales-tax categories. By using these codes, merchants who subscribe to Avalara Premium can calculate sales taxes more accurately.

    Stores without Avalara Premium will ignore the code when calculating sales tax. Do not pass more than one code. The codes are case-sensitive.

    For details, please see Avalara's overview and FAQ on AvaTax System Tax Codes. You can also download codes as a zipfile of spreadsheets, or search or browse codes in Avalara's Tax Code Search Tool. (These external links are subject to change.) | + +## List Products + +Gets the collection of products. (Default sorting is by product id, from lowest to highest.) +> `GET /stores/{store_hash}/v2/products` + +### Filters + +Filter parameters can be added to the URL query string to select specific products in the collection. + +| Parameter | Type | Example | +|-|-|-| +| min_id | int | `/api/v2/products?min_id={value}` | +| max_id | int | `/api/v2/products?max_id={value}` | +| name | string | `/api/v2/products?name={value}` | +| keyword_filter | string | `/api/v2/products?keyword_filter={value}` | +| description | string | `/api/v2/products?description={value}` | +| sku | string | `/api/v2/products?sku={value}` | +| condition | string | `/api/v2/products?condition={value}` | +| availability | string | `/api/v2/products?availability={value}` | +| brand_id | string | `/api/v2/products?brand_id={value}` | +| min_date_created | dateTime or date | `/api/v2/products?min_date_created={value}` | +| max_date_created | dateTime or date | `/api/v2/products?max_date_created={value}` | +| min_date_modified | dateTime or date | `/api/v2/products?min_date_modified={value}` | +| max_date_modified | dateTime or date | `/api/v2/products?max_date_modified={value}` | +| min_date_last_imported | date | `/api/v2/products?min_date_last_imported={value}` | +| max_date_last_imported | date | `/api/v2/products?max_date_last_imported={value}` | +| min_price | decimal | `/api/v2/products?min_price={value}` | +| max_price | decimal | `/api/v2/products?max_price={value}` | +| min_number_sold | int | `/api/v2/products?min_number_sold={value}` | +| max_number_sold | int | `/api/v2/products?max_number_sold={value}` | +| is_visible | string | `/api/v2/products?is_visible={value}` | +| is_featured | string | `/api/v2/products?is_featured={value}` | +| min_inventory_level | int | `/api/v2/products?min_inventory_level={value}` | +| max_inventory_level | int | `/api/v2/products?max_inventory_level={value}` | +| include_sku | boolean | `/api/v2/products?include_sku={value}` | +| category | string | `/api/v2/products?category={value}` | +| product_tax_code | string | `/api/v2/products?product_tax_code={value}` | + +### Pagination + +Parameters can be added to the URL query string to paginate the collection. The maximum limit is 250. If a limit isn’t provided, up to 50 products are returned by default. + +| Parameter | Type | Example | +|-|-|-| +| Page | int | `/api/v2/products?page={number}` | +| Limit | int | `/api/v2/products?limit={count}` | + +**Note** + +You can filter the retrieved fields by appending one of the following options to your request: + +* ?include= +* ?include=@summary +* ?exclude= + +For details, syntax, and examples, please see the [Get a Product](#get-a-product) operation. + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +[ + { + "id": 32, + "keyword_filter": null, + "name": "[Sample] Tomorrow is today, Red printed scarf", + "type": "physical", + "sku": "", + "description": "Densely pack your descriptions with useful information and watch products fly off the shelf.", + "search_keywords": null, + "availability_description": "", + "price": "89.0000", + "cost_price": "0.0000", + "retail_price": "0.0000", + "sale_price": "0.0000", + "calculated_price": "89.0000", + "sort_order": 0, + "is_visible": true, + "is_featured": true, + "related_products": "-1", + "inventory_level": 0, + "inventory_warning_level": 0, + "warranty": null, + "weight": "0.3000", + "width": "0.0000", + "height": "0.0000", + "depth": "0.0000", + "fixed_cost_shipping_price": "10.0000", + "is_free_shipping": false, + "inventory_tracking": "none", + "rating_total": 0, + "rating_count": 0, + "total_sold": 0, + "date_created": "Fri, 21 Sep 2012 02:31:01 +0000", + "brand_id": 17, + "view_count": 4, + "page_title": "", + "meta_keywords": null, + "meta_description": null, + "layout_file": "product.html", + "is_price_hidden": false, + "price_hidden_label": "", + "categories": [ + 14 + ], + "date_modified": "Mon, 24 Sep 2012 01:34:57 +0000", + "event_date_field_name": "Delivery Date", + "event_date_type": "none", + "event_date_start": "", + "event_date_end": "", + "myob_asset_account": "", + "myob_income_account": "", + "myob_expense_account": "", + "peachtree_gl_account": "", + "condition": "New", + "is_condition_shown": false, + "preorder_release_date": "", + "is_preorder_only": false, + "preorder_message": "", + "order_quantity_minimum": 0, + "order_quantity_maximum": 0, + "open_graph_type": "product", + "open_graph_title": "", + "open_graph_description": null, + "is_open_graph_thumbnail": true, + "upc": null, + "avalara_product_tax_code": "", + "date_last_imported": "", + "option_set_id": null, + "tax_class_id": 0, + "option_set_display": "right", + "bin_picking_number": "", + "custom_url": "/tomorrow-is-today-red-printed-scarf/", + "primary_image": { + "id": 247, + "zoom_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.1280.1280.jpg?c=1", + "thumbnail_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.220.290.jpg?c=1", + "standard_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.386.513.jpg?c=1", + "tiny_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.44.58.jpg?c=1" + }, + "availability": "available", + "brand": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/brands/17.json", + "resource": "/brands/17" + }, + "images": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/images.json", + "resource": "/products/32/images" + }, + "discount_rules": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/discountrules.json", + "resource": "/products/32/discountrules" + }, + "configurable_fields": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/configurablefields.json", + "resource": "/products/32/configurablefields" + }, + "custom_fields": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/customfields.json", + "resource": "/products/32/customfields" + }, + "videos": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/videos.json", + "resource": "/products/32/videos" + }, + "skus": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/skus.json", + "resource": "/products/32/skus" + }, + "rules": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/rules.json", + "resource": "/products/32/rules" + }, + "option_set": null, + "options": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/options.json", + "resource": "/products/32/options" + }, + "tax_class": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/taxclasses/0.json", + "resource": "/taxclasses/0" + } + }, + { + "id": 33, + "keyword_filter": null, + "name": "[Sample] Anna, multi-colored bangles", + "type": "physical", + "sku": "", + "description": "One of the best things you can do to make your store successful is invest some time in writing great product descriptions.

    ", + "search_keywords": null, + "availability_description": "", + "price": "59.0000", + "cost_price": "0.0000", + "retail_price": "0.0000", + "sale_price": "0.0000", + "calculated_price": "59.0000", + "sort_order": 0, + "is_visible": true, + "is_featured": true, + "related_products": "-1", + "inventory_level": 0, + "inventory_warning_level": 0, + "warranty": null, + "weight": "0.5000", + "width": "0.0000", + "height": "0.0000", + "depth": "0.0000", + "fixed_cost_shipping_price": "0.0000", + "is_free_shipping": false, + "inventory_tracking": "none", + "rating_total": 0, + "rating_count": 0, + "total_sold": 0, + "date_created": "Fri, 21 Sep 2012 02:46:41 +0000", + "brand_id": 18, + "view_count": 12, + "page_title": "", + "meta_keywords": null, + "meta_description": null, + "layout_file": "product.html", + "is_price_hidden": false, + "price_hidden_label": "", + "categories": [ + 14 + ], + "date_modified": "Mon, 24 Sep 2012 05:28:02 +0000", + "event_date_field_name": "Delivery Date", + "event_date_type": "none", + "event_date_start": "", + "event_date_end": "", + "myob_asset_account": "", + "myob_income_account": "", + "myob_expense_account": "", + "peachtree_gl_account": "", + "condition": "New", + "is_condition_shown": false, + "preorder_release_date": "", + "is_preorder_only": false, + "preorder_message": "", + "order_quantity_minimum": 0, + "order_quantity_maximum": 0, + "open_graph_type": "product", + "open_graph_title": "", + "open_graph_description": null, + "is_open_graph_thumbnail": true, + "upc": null, + "avalara_product_tax_code": "", + "date_last_imported": "", + "option_set_id": 13, + "tax_class_id": 0, + "option_set_display": "right", + "bin_picking_number": "", + "custom_url": "/anna-multi-colored-bangles/", + "primary_image": { + "id": 245, + "zoom_url": "https://cdn.url.path/bcapp/et7xe3pz/products/33/images/245/HERO_cocolee_anna_92865__20303.1393831046.1280.1280.jpg?c=1", + "thumbnail_url": "https://cdn.url.path/bcapp/et7xe3pz/products/33/images/245/HERO_cocolee_anna_92865__20303.1393831046.220.290.jpg?c=1", + "standard_url": "https://cdn.url.path/bcapp/et7xe3pz/products/33/images/245/HERO_cocolee_anna_92865__20303.1393831046.386.513.jpg?c=1", + "tiny_url": "https://cdn.url.path/bcapp/et7xe3pz/products/33/images/245/HERO_cocolee_anna_92865__20303.1393831046.44.58.jpg?c=1" + }, + "availability": "available", + "brand": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/brands/18.json", + "resource": "/brands/18" + }, + "images": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/33/images.json", + "resource": "/products/33/images" + }, + "discount_rules": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/33/discountrules.json", + "resource": "/products/33/discountrules" + }, + "configurable_fields": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/33/configurablefields.json", + "resource": "/products/33/configurablefields" + }, + "custom_fields": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/33/customfields.json", + "resource": "/products/33/customfields" + }, + "videos": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/33/videos.json", + "resource": "/products/33/videos" + }, + "skus": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/33/skus.json", + "resource": "/products/33/skus" + }, + "rules": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/33/rules.json", + "resource": "/products/33/rules" + }, + "option_set": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/optionsets/13.json", + "resource": "/optionsets/13" + }, + "options": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/33/options.json", + "resource": "/products/33/options" + }, + "tax_class": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/taxclasses/0.json", + "resource": "/taxclasses/0" + } + } +] +``` + +## Get a Product + +Gets a product. + +> `GET /stores/{store_hash}/v2/products/{id}` + +**Note** + +You can filter the retrieved fields by appending one of the following options to your request: + +- `?include=` +- `?include=@summary` +- `?exclude=` + +In particular, you can reduce payload size, and improve performance, by excluding the `description` field. + +### Mandatory Fields + +However, the following fields are always present on product API requests, and cannot be excluded: + +- `id` +- `name` +- `date_modified` +- `primary_image` + +### include + +The following sample request will retrieve *only* the specified `date_created`, `price`, and `cost_price` fields, plus the mandatory fields listed just above: + +``` +https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32?include=date_created,price,cost_price +``` + +Here is a corresponding sample response: + +```json showLineNumbers copy +{ + "id": 32, + "name": "[Sample] Tomorrow is today, Red printed scarf", + "price": "89.0000", + "cost_price": "0.0000", + "date_created": "Fri, 21 Sep 2012 02:31:01 +0000", + "date_modified": "Thu, 10 Dec 2015 21:10:17 +0000", + "primary_image": { + "id": 247, + "tiny_url": "https://cdn.url.path/bcapp/k84uuwpy/products/32/images/247/in_123__14581.1348449270.60.90.jpg?c=1", + "standard_url": "https://cdn.url.path/bcapp/k84uuwpy/products/32/images/247/in_123__14581.1348449270.500.750.jpg?c=1", + "thumbnail_url": "https://cdn.url.path/bcapp/k84uuwpy/products/32/images/247/in_123__14581.1348449270.190.285.jpg?c=1", + "zoom_url": "https://cdn.url.path/bcapp/k84uuwpy/products/32/images/247/in_123__14581.1348449270.1280.1280.jpg?c=1" + }, + "metadata": [] +} +``` + +### include=@summary + +The `?include=@summary` option retrieves the following predefined subset of fields, in addition to the [mandatory fields](#mandatory-fields) listed above: + +- `availability` +- `calculated_price` +- `inventory_tracking` +- `sku` +- `inventory_level` +- `inventory_warning_level` +- `is_visible` +- `is_featured` + +Here is a sample request with the `?include=@summary` option appended: + +``` +https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32?include=@summary +``` + +Here is a corresponding sample response: + +```json showLineNumbers copy +{ + "id": 32, + "name": "[Sample] Tomorrow is today, Red printed scarf", + "sku": "TTRPS", + "calculated_price": "89.0000", + "is_visible": true, + "is_featured": true, + "inventory_level": 0, + "inventory_warning_level": 0, + "inventory_tracking": "none", + "date_modified": "Thu, 10 Dec 2015 21:10:17 +0000", + "availability": "available", + "primary_image": { + "id": 247, + "tiny_url": "https://cdn.url.path/bcapp/k84uuwpy/products/32/images/247/in_123__14581.1348449270.60.90.jpg?c=1", + "standard_url": "https://cdn.url.path/bcapp/k84uuwpy/products/32/images/247/in_123__14581.1348449270.500.750.jpg?c=1", + "thumbnail_url": "https://cdn.url.path/bcapp/k84uuwpy/products/32/images/247/in_123__14581.1348449270.190.285.jpg?c=1", + "zoom_url": "https://cdn.url.path/bcapp/k84uuwpy/products/32/images/247/in_123__14581.1348449270.1280.1280.jpg?c=1" + }, + "metadata": [] +} +``` + +### exclude + +The `?exclude=` option excludes one or more specified fields. However, you cannot exclude the mandatory `id`, `name`, `date_modified`, or `primary_image` fields. + +Here is a sample request with the `?exclude=` option appended: + +``` +https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32?exclude=description +``` + +We have omitted the corresponding sample response. However, the following section shows a complete sample response for a request submitted with no `?include` or `?exclude` option. (The effect of the `?exclude=description` option shown above would be to omit the `"description": ` field shown as the sixth field below.) + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "id": 32, + "keyword_filter": null, + "name": "[Sample] Tomorrow is today, Red printed scarf", + "type": "physical", + "sku": "", + "description": "Densely pack your descriptions with useful information and watch products fly off the shelf.", + "search_keywords": null, + "availability_description": "", + "price": "89.0000", + "cost_price": "0.0000", + "retail_price": "0.0000", + "sale_price": "0.0000", + "calculated_price": "89.0000", + "sort_order": 0, + "is_visible": true, + "is_featured": true, + "related_products": "-1", + "inventory_level": 0, + "inventory_warning_level": 0, + "warranty": null, + "weight": "0.3000", + "width": "0.0000", + "height": "0.0000", + "depth": "0.0000", + "fixed_cost_shipping_price": "10.0000", + "is_free_shipping": false, + "inventory_tracking": "none", + "rating_total": 0, + "rating_count": 0, + "total_sold": 0, + "date_created": "Fri, 21 Sep 2012 02:31:01 +0000", + "brand_id": 17, + "view_count": 4, + "page_title": "", + "meta_keywords": null, + "meta_description": null, + "layout_file": "product.html", + "is_price_hidden": false, + "price_hidden_label": "", + "categories": [ + 14 + ], + "date_modified": "Mon, 24 Sep 2012 01:34:57 +0000", + "event_date_field_name": "Delivery Date", + "event_date_type": "none", + "event_date_start": "", + "event_date_end": "", + "myob_asset_account": "", + "myob_income_account": "", + "myob_expense_account": "", + "peachtree_gl_account": "", + "condition": "New", + "is_condition_shown": false, + "preorder_release_date": "", + "is_preorder_only": false, + "preorder_message": "", + "order_quantity_minimum": 0, + "order_quantity_maximum": 0, + "open_graph_type": "product", + "open_graph_title": "", + "open_graph_description": null, + "is_open_graph_thumbnail": true, + "upc": null, + "avalara_product_tax_code": "", + "date_last_imported": "", + "option_set_id": null, + "tax_class_id": 0, + "option_set_display": "right", + "bin_picking_number": "", + "custom_url": "/tomorrow-is-today-red-printed-scarf/", + "primary_image": { + "id": 247, + "zoom_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.1280.1280.jpg?c=1", + "thumbnail_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.220.290.jpg?c=1", + "standard_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.386.513.jpg?c=1", + "tiny_url": "https://cdn.url.path/bcapp/et7xe3pz/products/32/images/247/in_123__14581.1393831046.44.58.jpg?c=1" + }, + "availability": "available", + "brand": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/brands/17.json", + "resource": "/brands/17" + }, + "images": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/images.json", + "resource": "/products/32/images" + }, + "discount_rules": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/discountrules.json", + "resource": "/products/32/discountrules" + }, + "configurable_fields": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/configurablefields.json", + "resource": "/products/32/configurablefields" + }, + "custom_fields": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/customfields.json", + "resource": "/products/32/customfields" + }, + "videos": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/videos.json", + "resource": "/products/32/videos" + }, + "skus": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/skus.json", + "resource": "/products/32/skus" + }, + "rules": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/rules.json", + "resource": "/products/32/rules" + }, + "option_set": null, + "options": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/products/32/options.json", + "resource": "/products/32/options" + }, + "tax_class": { + "url": "https://store-et7xe3pz.mybigcommerce.com/api/v2/taxclasses/0.json", + "resource": "/taxclasses/0" + } +} +``` + +## Get a Product Count + +Gets a count of products. + +> `GET /stores/{store_hash}/v2/products/count` + +### Filters + +Filter parameters can be added to the URL query string to select specific products in the collection. + +| Parameter | Type | Example | +|-|-|-| +| min_id | int | `/api/v2/products?min_id={value}` | +| max_id | int | `/api/v2/products?max_id={value}` | +| name | string | `/api/v2/products?name={value}` | +| keyword_filter | string | `/api/v2/products?keyword_filter={value}` | +| description | string | `/api/v2/products?description={value}` | +| sku | string | `/api/v2/products?sku={value}` | +| condition | string | `/api/v2/products?condition={value}` | +| availability | string | `/api/v2/products?availability={value}` | +| brand_id | string | `/api/v2/products?brand_id={value}` | +| min_date_created | date | `/api/v2/products?min_date_created={value}` | +| max_date_created | date | `/api/v2/products?max_date_created={value}` | +| min_date_modified | date | `/api/v2/products?min_date_modified={value}` | +| max_date_modified | date | `/api/v2/products?max_date_modified={value}` | +| min_date_last_imported | date | `/api/v2/products?min_date_last_imported={value}` | +| max_date_last_imported | date | `/api/v2/products?max_date_last_imported={value}` | +| min_price | decimal | `/api/v2/products?min_price={value}` | +| max_price | decimal | `/api/v2/products?max_price={value}` | +| min_number_sold | int | `/api/v2/products?min_number_sold={value}` | +| max_number_sold | int | `/api/v2/products?max_number_sold={value}` | +| is_visible | string | `/api/v2/products?is_visible={value}` | +| is_featured | string | `/api/v2/products?is_featured={value}` | +| min_inventory_level | int | `/api/v2/products?min_inventory_level={value}` | +| max_inventory_level | int | `/api/v2/products?max_inventory_level={value}` | +| include_sku | boolean | `/api/v2/products?include_sku={value}` | +| category | string | `/api/v2/products?category={value}` | +| product_tax_code | string | `/api/v2/products?product_tax_code={value}` | + +**Note** + +If no filters are applied, the total number of products is returned. + +### Response + +Example JSON returned in the response: + +```json showLineNumbers copy +{ + "count": 44 +} +``` + +## Create a Product + +Creates a new product. The example request shows how to create a basic product by sending a product object with the minimum required properties. + +> `POST /stores/{store_hash}/v2/products` + +### Read-only Properties + +The following properties of the product are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* calculated_price +* brand +* images +* discount_rules +* configurable_fields +* custom_fields +* primary_image +* videos +* skus +* rules +* option_set +* options +* tax_class + +### Requirements + +The following properties of the product are required. The request won’t be fulfilled unless these properties are valid. + +* name +* price +* categories +* type +* availability +* weight + +**Note** + +Create a request by sending a [product object](#product-object--properties) with the minimum required properties: + +```json showLineNumbers copy +{ + "name": "Plain T-Shirt", + "type": "physical", + "description": "This timeless fashion staple will never go out of style!", + "price": "29.99", + "categories": [18], + "availability": "available", + "weight": "0.5" +} +``` + +When the `is_visible` property is not provided, the product's visibility is `false` by default. + +To make newly created products immediately visible on the storefront, you must set `is_visible` to `true` when you create each product. + +You may encounter a case where product information was updated successfully, but related inventory data failed to update. In such cases, BigCommerce will return a `207` status along with the object as updated and a descriptive error message. + +``` +207 Multi-Status +``` + +To maximize system performance, BigCommerce caps the number of categories to which a product can belong. The maximum is 1,000. If your `POST` includes an array of more than 1,000 `categories` ID values, BigCommerce will return a 403 error: + +``` +403 Access Denied/Forbidden +``` + +If automatic tax is enabled on the store, the value of `tax_class_id` will have no effect on the calculation of taxes. + +## Update a Product + +Updates an existing product. + +> `PUT /stores/{store_hash}/v2/products/{id}` + +### Read-only Properties + +The following properties of the product are read-only. If one or more of these properties are included in the request, it will be rejected. + +* id +* rating_total +* rating_count +* number_sold +* date_created +* date_modified +* date_last_imported +* calculated_price +* brand +* images +* discount_rules +* configurable_fields +* custom_fields +* primary_image +* videos +* skus +* rules +* option_set +* options +* tax_class + +### Requirements + +There are no required properties when updating a product. + +**Note** + +To update a product, set one or more product properties in the `PUT` request: + +```json showLineNumbers copy +{ + "custom_url": "/plain-tshirt/", + "is_visible": true +} +``` + +For example, you can use a `PUT` to link a product to an option set: + +```json showLineNumbers copy +{ + "option_set_id": 14 +} +``` + +Invalid property values will produce a `400 Bad Request` error response: + +### Request + +```json showLineNumbers copy +{ + "condition": "Worn" +} +``` + +### Response + +``` +400 Bad Request +``` + +Trying to set read-only properties will also produce a `400 Bad Request` error response: + +### Request + +```json showLineNumbers copy +{ + "number_sold": 99 +} +``` + +### Response + +``` +400 Bad Request +``` + +You may encounter a case where product information was updated successfully, but related inventory data failed to update. In such cases, BigCommerce will return a `207` status along with the object as updated and a descriptive error message. + +``` +207 Multi-Status +``` + +To maximize system performance, BigCommerce caps the maximum number of categories to which a product can belong, at 1,000. If your `PUT` includes an array of more than 1,000 `categories` ID values, BigCommerce will return a `403` error: + +``` +403 Access Denied/Forbidden +``` + +If automatic tax is enabled on the store, the value of `tax_class_id` will have no effect on the calculation of taxes. + +## Delete a Product + +Deletes a product. + +> `DELETE /stores/{store_hash}/v2/products/{id}` + +**Note** + +Successful deletion of a product returns a `204 No Content` response: + +``` +204 No Content +``` + +## Delete All Products + +Deletes all products from the store. + +> `DELETE /stores/{store_hash}/v2/products` + +**Note** + +Successful deletion of all products returns a `204 No Content` response: + +``` +204 No Content +``` diff --git a/docs/legacy/v2-products/v2-v3.mdx b/docs/legacy/v2-products/v2-v3.mdx new file mode 100644 index 000000000..d1cb34cad --- /dev/null +++ b/docs/legacy/v2-products/v2-v3.mdx @@ -0,0 +1,1051 @@ +--- +title: V2 versus V3 API +keywords: products, v2, catalog, v3, configurable_fields, options, modifiers +--- + +# V2 versus V3 API + +## Advantages of V3 over V2 + +The V3 API introduces a number of improvements designed to improve efficiency. Most tasks can be performed with fewer API calls, and the V3 API supports the inclusion of subresources within a request. For example, you can now create a product with variants and custom fields in a single API call. + +Each V3 resource includes a `meta` object at the end of the response, making pagination easier. + +Additionally, metafields have been added to the V3 Products resource so data can be stored against the object. Metafield values can be specific to your application or visible to other applications. + +Lastly, the V3 API has been optimized for performance, allowing data to be synced quickly. + +## Products in V3 + +### Variants + +Every purchasable entity in the catalog is now a variant, including the product itself. This enables enhanced flows around inventory management, such as the ability to solely use the variants endpoint to manage inventory levels. For more on variants see [Variants](/docs/store-operations/catalog#variants). + +In V3 a variant needs to be created for every combination of option values. In V2 it was possible to create a SKU with a subset of product options. + +We recommend creating products using V3 as BigCommerce starts to move operations to the V3 API. + + + #### V2 SKU rules will override Variant pricing + Creating SKU rules via the V2 API or via CSV import will alter or override any Variant price or sale price added to a product via the Control Panel, V3 API or Price Lists UI. + + +### Options and Modifiers + +There is now a clear separation of [options that define variants](/docs/store-operations/catalog#variant-options) versus [options that are modifiers of a variant](/docs/store-operations/catalog#modifier-options). This simplifies the creation and management of variant prices and modifier adjusters and removes the need to use complex rules, in all but the most extreme cases. + +In V3, options and modifiers are attached directly to the product, without the requirement to create an option set beforehand. + +Creating Options on V2 has several steps: +1. Create the product +2. Create the options +3. Create an option set +4. Assign the option set to the product +5. Create adjustments, such as price adjustment, using rules + +Creating Products and Variants on V3: +1. Create the product with variants in one call +2. Create adjustments, such as price adjustment, directly on the variant or modifier + +Variants can be included with a GET request to lower the number of API calls being made using `?include=variants`. + +V3 includes endpoints for working with catalog trees. Stores that have multi-storefront enabled can have more than one tree. See the catagories section of the [Multi-Storefront API Guide](/docs/storefront/multi-storefront/guide#categories). Stores that are not MSF-enabled can use the same endponts. + +## Interoperability between V2 and V3 + +Previously (prior to December 17th, 2018), when a product option, is created in V2 and assigned to a product, trying to edit the global option using the V3 API would return a 422 error. + +```json showLineNumbers copy +{ + "status": 422, + "title": "The product is currently associated with an option set, please remove it before editing an option or modifier.", + "type": "/docs/start/about/status-codes", + "errors": { + "product_id": "The product is currently associated with an option set, please remove it before editing an option or modifier." + } +} +``` + +Instead of a 422 error, now it will automatically copy the V2 global product option to a local product variant option or modifier option. This is triggered by an Update or Delete to either the [Product Variant Options](/docs/rest-catalog/product-variant-options#get-all-product-variant-options) or [Product Modifiers](/docs/rest-catalog/product-modifiers#get-all-product-modifiers) endpoints. + +**What this does is:** +- Changes the `option_value` > `id`. Not the `option_id`. +- Creates a copy directly on the product. +- Copies over any variants, modifiers and option set rules. +- In the Control Panel the product is listed as having a (Custom) Option Set. +- Global Option Set rules are copied as product rules and the `sort_order` is updated so they executed before any existing product rules (which should mirror the behavior before the product was changed). + +**What this does not do:** +- Remove the Option Set from the store entirely. It is still available in the control panel as an option set to be assigned. +- Change product pricing, rules or any other product modifiers. They will be copied over and assigned the product correctly. + +### Update Request to Product Option Values +On the following product, you will see the original option response of a product created using V2, a change to the option values and then the final option response. + +This product is a T-Shirt with a global option set of size and color added. Take a note of the option values id’s. These will change when an update is made to the option using the /options endpoint on V3. While they will all change since the entire option set is copied to the product, the one we are updating below is the label for Size Small, which has a `option_value` > `id` of 192. + +```json filename="GET https://api.bigcommerce.com/stores/{store_hash}/v3/catalog/products/{product_id}/options" showLineNumbers copy +// Note the option_values id's for the colors are 180, 181 and 182. The values for color are 192, 193 and 194. +{ + "data": [ + { + "id": 242, + "product_id": 201, + "name": "Color", + "display_name": "Color", + "type": "swatch", + "sort_order": 0, + "option_values": [ + { + "id": 180, + "label": "Red", + "sort_order": 1, + "value_data": { + "colors": [ + "#ff0000" + ] + }, + "is_default": false + }, + { + "id": 181, + "label": "Green", + "sort_order": 2, + "value_data": { + "colors": [ + "#008000" + ] + }, + "is_default": false + }, + { + "id": 182, + "label": "Blue", + "sort_order": 3, + "value_data": { + "colors": [ + "#0000ff" + ] + }, + "is_default": false + } + ], + "config": [] + }, + { + "id": 243, + "product_id": 201, + "name": "Size", + "display_name": "T-Shirt Size", + "type": "rectangles", + "sort_order": 1, + "option_values": [ + { + "id": 192, + "label": "Small", + "sort_order": 0, + "value_data": null, + "is_default": false + }, + { + "id": 193, + "label": "Medium", + "sort_order": 1, + "value_data": null, + "is_default": false + }, + { + "id": 194, + "label": "Large", + "sort_order": 2, + "value_data": null, + "is_default": false + } + ], + "config": [] + } + ], + "meta": { + "pagination": { + "total": 2, + "count": 2, + "per_page": 50, + "current_page": 1, + "total_pages": 1, + "links": { + "current": "?page=1&limit=50" + } + } + } +} +``` + +![Size and Color](https://storage.googleapis.com/bigcommerce-production-dev-center/images/EditProduct.png "Size and Color") + +Below, "Small" is updated to "Small T-Shirt". + +```json filename="PUT https://api.bigcommerce.com/stores/{store_hash}/v3/catalog/products/{product_id}/options/{option_id}/values/{option_value}" showLineNumbers copy +{ + "label": "Small T-Shirt" +} +``` +  +```json filename="Response PUT https://api.bigcommerce.com/stores/{store_hash}/v3/catalog/products/{product_id}/options/{option_id}/values/{option_value}" showLineNumbers copy +{ + "data": { + "id": 214, + "label": "Small T-Shirt", + "sort_order": 0, + "value_data": null, + "is_default": false + }, + "meta": {} +} +``` + +The ID is now 214. It was changed from 192. Below you can see the `option_value` > `id` for all the options changed even though only one was edited. The Control Panel now shows the options as (Custom). + +```json filename="GET https://api.bigcommerce.com/stores/{store_hash}/v3/catalog/products/{product_id}/options" showLineNumbers copy +// The option_value > id is now 214 +{ + "data": [ + { + "id": 242, + "product_id": 201, + "name": "Color1545071633-201", + "display_name": "Color", + "type": "swatch", + "sort_order": 0, + "option_values": [ + { + "id": 211, + "label": "Red", + "sort_order": 1, + "value_data": { + "colors": [ + "#ff0000" + ] + }, + "is_default": false + }, + { + "id": 212, + "label": "Green", + "sort_order": 2, + "value_data": { + "colors": [ + "#008000" + ] + }, + "is_default": false + }, + { + "id": 213, + "label": "Blue", + "sort_order": 3, + "value_data": { + "colors": [ + "#0000ff" + ] + }, + "is_default": false + } + ], + "config": [] + }, + { + "id": 243, + "product_id": 201, + "name": "T-Shirt-Size1545071633-201", + "display_name": "T-Shirt Size", + "type": "rectangles", + "sort_order": 1, + "option_values": [ + { + "id": 214, + "label": "Small T-Shirt", + "sort_order": 0, + "value_data": null, + "is_default": false + }, + { + "id": 215, + "label": "Medium", + "sort_order": 1, + "value_data": null, + "is_default": false + }, + { + "id": 216, + "label": "Large", + "sort_order": 2, + "value_data": null, + "is_default": false + } + ], + "config": [] + } + ], + "meta": { + "pagination": { + "total": 2, + "count": 2, + "per_page": 50, + "current_page": 1, + "total_pages": 1, + "links": { + "current": "?page=1&limit=50" + } + } + } +} +``` + +![Size and Color](https://storage.googleapis.com/bigcommerce-production-dev-center/images/EditProduct.png "Size and Color") + +## What's not in V3 + +In V3, options are attached directly to products. So option sets are not required, and V3 includes no endpoint to manage option sets. However, V3 will respect option sets that have been attached via V2 or the control panel. + +Moving forward, new resources will be built in V3 and existing V2 resources will eventually be migrated to V3. Some V3 resources do not have V2 counterparts, and vice versa. + +### Complex Rules + +Most of the use cases for using V2 rules can be solved by making adjustments directly on variants and modifier options. We recommend using variants as best practice, but in cases where an adjustment depends on the selection of multiple modifier values, V3 includes a Complex Rules resource. + +### Product Rules +Any variant created in v3 with non-null core properties (price, weight, image, purchasability) will create a rule under the hood. The same goes for modifier adjusters. These will show in v2 as product rules, and any edits to them will be shared across API versions. + +### Option Sets +In our control panel’s Add/Edit Product section, any products created by the V3 API will not have an option set applied, but merchants can still edit the options. If the merchant applies an option set to a V3 product, the product's variants will be removed. Currently, the Add/Edit Product area consumes the V2 API, so products created and managed through the control panel will be converted to the V2 model, using option sets. + +## Recommendations +When the resource is available in [V3](/docs/rest-catalog/products), it is best practice to use the V3 endpoint. For resources that do not have a V3 counterpart, like Orders, use V2. Both the V2 and V3 APIs authenticate with Oauth and are designed to be used concurrently within a single application. + +We have created a handy cheat sheet below that lists all the differences between V2 and V3 of the API. + +## V2 and V3 Cheat Sheet + +This identifies the differences between major actions on both versions. + +In the examples below: +* Simple product is defined as not having variants, modifiers or options. +* Complex Products are defined as having variants, options and modifiers. + + + +## Simple Product + + + +### Get a Product + +**Response V3 Product** +`GET /v3/catalog/products/{product_id}` + +```json showLineNumbers copy +{ + "data": { + "id": 195, + "name": "BigCommerce Coffee Mug_3", + "type": "physical", + "sku": "", + "description": "", + "weight": 3, + "width": 0, + "depth": 0, + "height": 0, + "price": 11, + "cost_price": 0, + "retail_price": 0, + "sale_price": 0, + "map_price": 0, + "tax_class_id": 0, + "product_tax_code": "", + "calculated_price": 11, + "categories": [ + 21 + ], + "brand_id": 38, + "option_set_id": 50, + "option_set_display": "right", + "inventory_level": 400, + "inventory_warning_level": 40, + "inventory_tracking": "variant", + "reviews_rating_sum": 0, + "reviews_count": 0, + "total_sold": 0, + "fixed_cost_shipping_price": 0, + "is_free_shipping": false, + "is_visible": true, + "is_featured": false, + "related_products": [ + -1 + ], + "warranty": "", + "bin_picking_number": "", + "layout_file": "product.html", + "upc": "", + "mpn": "", + "gtin": "", + "search_keywords": "", + "availability": "available", + "availability_description": "", + "gift_wrapping_options_type": "any", + "gift_wrapping_options_list": [], + "sort_order": 0, + "condition": "New", + "is_condition_shown": false, + "order_quantity_minimum": 0, + "order_quantity_maximum": 0, + "page_title": "", + "meta_keywords": [], + "meta_description": "", + "date_created": "2018-09-05T20:22:19+00:00", + "date_modified": "2018-09-20T15:28:50+00:00", + "view_count": 4, + "preorder_release_date": null, + "preorder_message": "", + "is_preorder_only": false, + "is_price_hidden": false, + "price_hidden_label": "", + "custom_url": { + "url": "/bigcommerce-coffee-mug_3/", + "is_customized": false + }, + "base_variant_id": null, + "open_graph_type": "product", + "open_graph_title": "", + "open_graph_description": "", + "open_graph_use_meta_description": true, + "open_graph_use_product_name": true, + "open_graph_use_image": true + }, + "meta": {} +} +``` + +**Response V2 Product** +`GET /v2/products/{product_id}` + +```json showLineNumbers copy +{ + "id": 195, + "keyword_filter": null, + "name": "BigCommerce Coffee Mug_3", + "type": "physical", + "sku": "", + "description": "", + "search_keywords": "", + "availability_description": "", + "price": "11.0000", + "cost_price": "0.0000", + "retail_price": "0.0000", + "sale_price": "0.0000", + "calculated_price": "11.0000", + "sort_order": 0, + "is_visible": true, + "is_featured": false, + "related_products": "-1", + "inventory_level": 400, + "inventory_warning_level": 40, + "warranty": "", + "weight": "3.0000", + "width": "0.0000", + "height": "0.0000", + "depth": "0.0000", + "fixed_cost_shipping_price": "0.0000", + "is_free_shipping": false, + "inventory_tracking": "sku", + "rating_total": 0, + "rating_count": 0, + "total_sold": 0, + "date_created": "Wed, 05 Sep 2018 20:22:19 +0000", + "brand_id": 38, + "view_count": 4, + "page_title": "", + "meta_keywords": "", + "meta_description": "", + "layout_file": "product.html", + "is_price_hidden": false, + "price_hidden_label": "", + "categories": [ + 21 + ], + "date_modified": "Thu, 20 Sep 2018 15:28:50 +0000", + "event_date_field_name": "", + "event_date_type": "none", + "event_date_start": null, + "event_date_end": null, + "myob_asset_account": "", + "myob_income_account": "", + "myob_expense_account": "", + "peachtree_gl_account": "", + "condition": "New", + "is_condition_shown": false, + "preorder_release_date": "", + "is_preorder_only": false, + "preorder_message": "", + "order_quantity_minimum": 0, + "order_quantity_maximum": 0, + "open_graph_type": "product", + "open_graph_title": "", + "open_graph_description": "", + "is_open_graph_thumbnail": true, + "upc": "", + "avalara_product_tax_code": "", + "date_last_imported": "", + "option_set_id": 50, + "tax_class_id": 0, + "option_set_display": "right", + "bin_picking_number": "", + "custom_url": "/bigcommerce-coffee-mug_3/", + "primary_image": { + "id": 0, + "zoom_url": null, + "thumbnail_url": null, + "standard_url": null, + "tiny_url": null + }, + "availability": "available", + "brand": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/brands/38", + "resource": "/brands/38" + }, + "downloads": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/downloads", + "resource": "/products/195/downloads" + }, + "images": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/images", + "resource": "/products/195/images" + }, + "discount_rules": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/discountrules", + "resource": "/products/195/discountrules" + }, + "configurable_fields": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/configurablefields", + "resource": "/products/195/configurablefields" + }, + "custom_fields": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/customfields", + "resource": "/products/195/customfields" + }, + "videos": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/videos", + "resource": "/products/195/videos" + }, + "skus": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/skus", + "resource": "/products/195/skus" + }, + "rules": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/rules", + "resource": "/products/195/rules" + }, + "option_set": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/optionsets/50", + "resource": "/optionsets/50" + }, + "options": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/options", + "resource": "/products/195/options" + }, + "tax_class": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/taxclasses/0", + "resource": "/taxclasses/0" + }, + "reviews": { + "url": "https://api.bigcommerce.com/stores/id30h7ohwf/v2/products/195/reviews", + "resource": "/products/195/reviews" + }, + "metadata": [] +} +``` + + + +### Create a Product + +**Request V3 Product** +`POST /v3/catalog/products` + +```json showLineNumbers copy +{ + "name": "BigCommerce Coffee Mug", + "price": "10.00", + "categories": [ + 23, + 21 + ], + "weight": 4, + "type": "physical" +} +``` + +**Request V2 Product** +`POST /v2/products` + +```json showLineNumbers copy +{ + "name": "Plain T-Shirt", + "type": "physical", + "description": "This timeless fashion staple will never go out of style!", + "price": "29.99", + "categories": [ + 18 + ], + "availability": "available", + "weight": "0.5" +} +``` + + + +### Create Product with Images + +**Request V3 Product Images** +`POST /v3/catalog/products/{product_id}/images` + +1. Create a product using: `POST /v3/catalog/products` +2. Add images using: `POST /v3/catalog/products/{product_id}/images` + +```json showLineNumbers copy +{ + "is_thumbnail": true, + "sort_order": 1, + "description": "Top View", + "image_url": "https://upload.wikimedia.org/wikipedia/commons/7/7f/Anglel_Bless_Legendary_Hills_1_m%C4%9Bs%C3%ADc_st%C3%A1%C5%99%C3%AD.jpg" +} +``` + +**Request V2 Product Images** +`POST /v2/products/{product_id}/images` + +1. Create a product using: `POST /v2/products` +2. Add images using: `POST /v2/products/{product_id}/images` + +* Only accepts form data. + +```shell showLineNumbers copy +curl -X POST \ + https://api.bigcommerce.com/stores/{store_hash}/v2/products/{product_id}/images \ + -H 'Accept: application/json' \ + -H 'Cache-Control: no-cache' \ + -H 'Content-Type: application/json' \ + -H 'Postman-Token: 841f5f9a-244b-4d2c-900f-938ac2067a4a' \ + -H 'X-Auth-Token: {X-Auth-Token}' \ + -H 'content-type: multipart/form-data; boundary=-WebKitFormBoundary7MA4YWxkTrZu0gW' \ + -F image_file=@/Users/{user_name}/Documents/product_images/image_file.png + ``` + + + +### Create Product with Video + +**Request V3 Product Videos** +`POST /v3/catalog/products/{{id}}/videos` + +1. Create a product using: `POST /v3/catalog/products` +2. Add video using: `POST /v3/catalog/products/{{id}}/videos` + +```json showLineNumbers copy +{ + "title": "Your Video", + "description": "Company Values", + "sort_order": 1, + "type": "youtube", + "video_id": "123345AA" +} +``` + +**Request V2 Product Videos** +`POST /v2/products/{{id}}/videos` + +```json showLineNumbers copy +{ + "url": "https://www.youtube.com/watch?v=4wZ3ZG_Wams" +} +``` + + + +## Complex Products + + + +### Create Product with Variants/SKU + +**Request V3 Product Variants** +`POST /v3/catalog/products` + +```json showLineNumbers copy +{ + "name": "BigCommerce Coffee Mug", + "price": "10.00", + "categories": [ + 23, + 21 + ], + "weight": 4, + "type": "physical", + "variants": [ + { + "sku": "SKU-BLU", + "option_values": [ + { + "option_display_name": "Mug Color", + "label": "Blue" + } + ] + }, + { + "sku": "SKU-GRAY", + "option_values": [ + { + "option_display_name": "Mug Color", + "label": "Gray" + } + ] + } + ] +} +``` + +**V2 Scenarios** + +When using the V2 Products API to make product options and option sets. The simplest workflow is when starting from scratch is below: + +1. Create an Option (in this example Size) +2. Add option values +3. Add the options created in step 1 to the option set +4. Create an Option Set +5. Add options created in step 1 and step 2 to the option set. +6. Assign the option set to the product +7. Assign SKU's to the Options on the product + +**Create an Option** +`POST /v2/option_sets` +This will only create an option with no values added. + +```json showLineNumbers copy +{ + "name": "Size", + "display_name": "T-Shirt Size", + "type": "RT" +} +``` + +**Add option values** +`POST /v2/options/{option_id}/values` + +This will add values such as small, medium and large. Only one value at a time can be created. In this example it will take 3 seperate /POST requests to create all sizes. + +```json showLineNumbers copy +{ + "label": "Medium", + "sort_order": 1, + "value": "Medium", + "is_default": false +} +``` + +After the option with values has been created, an option set needs to be created so the option and values created in the previous steps can be added to it. + +**Create Option Set** +`POST /v2/optionsets` + +```json showLineNumbers copy +{ + "name": "T-Shirt Sizes BigCommerce" +} +``` + +**Add the T-Shirt Size Options to Set** +`POST /optionsets/{option_set_id}/options` + +```json showLineNumbers copy +{ + "option_id": 88 +} +``` + +To assign the option set to a product, do a /PUT request against the product and update the `option_set_id` field. + +**Assign the Option Set to the Product** +`PUT /v2/products/{product_id}*` + +```json showLineNumbers copy +{ + "option_set_id": 60 +} +``` + +To create the SKU's first you need the `option_value_id`. +`/GET optionsets/{option_set_id}/options` + +```json showLineNumbers copy +{ + "id": 119, + "option_id": 88, + "option_set_id": 60, + "display_name": "T-Shirt Size", + "sort_order": 0, + "is_required": false, + "option": { + "url": "https://api.bigcommerce.com/stores/{store_hash}/v2/options/88", + "resource": "/options/88" + }, + "values": [ + { + "label": "Small", + "sort_order": 0, + "value": "Small", + "is_default": false, + "option_value_id": 192 + }, + { + "label": "Medium", + "sort_order": 1, + "value": "Medium", + "is_default": false, + "option_value_id": 193 + }, + { + "label": "Large", + "sort_order": 2, + "value": "Large", + "is_default": false, + "option_value_id": 194 + } + ] +} +``` + +The `product_option_id` is also required. +`/v2/products/{product_id}/options`. + +Each size will need a separate POST to create all the SKU's. + +**Add Product SKU** +`POST /v2/products/{product_id}/skus` + +```json showLineNumbers copy +{ + "sku": "SMALL-1", + "options": [ + { + "product_option_id": 223, + "option_value_id": 192 + } + ] +} +``` + + + +### Create a Product with Variants & Modifiers + +**Request V3 Modifier** +`POST /v3/catalog/products/{product_id}/modifiers` + +This examples uses a checkbox which is created in two steps. + +1. Create Modifier + +```json showLineNumbers copy +{ + "type": "checkbox", + "required": false, + "config": { + "default_value": "Yes", + "checked_by_default": false, + "checkbox_label": "Check for Donation" + }, + "display_name": "Add a $5 Donation" +} +``` + +2. Update Modifier Values + +`PUT /v3/catalog/products/{product_id}/modifiers/{modifier_id}/values` + +```json showLineNumbers copy +{ + "is_default": false, + "adjusters": { + "price": { + "adjuster": "relative", + "adjuster_value": 5 + } + } +} +``` + +**V2 Modifier** + +* Modifiers are considered an option on V2. They can be assigned a SKU or not. +* They follow the same steps as Create Product with Variants/SKU + +1. Create an Option (in this example Size) +2. Add option values +3. Add the options created in step 1 to the option set +4. Create an Option Set +5. Add options created in step 1 and step 2 to the option set. +6. Assign the option set to the product. + + + +### Create a Product with Rules/Complex Rules + +`POST /v3/catalog/products/{product_id}/complex-rules` + +They are not recommended for V3 products since they can be created at the variant level. See [Complex Rules](/docs/store-operations/catalog#complex-rules) for more information. + +```json showLineNumbers copy +{ + "product_id": 1200, + "enabled": true, + "price_adjuster": { + "adjuster_value": 10 + }, + "conditions": [ + { + "modifier_id": 506, + "modifier_value_id": 852 + }, + { + "modifier_id": 507, + "modifier_value_id": 854 + } + ] +} +``` + +**Request V2 Product Rules** +`/v2/products/{product_id}/rules` + +* A complex rule can not be added without an option + +The example below add's a complex rule to increase the price by $5 if the checkbox is selected. + +```json showLineNumbers copy +{ + "id": 89, + "product_id": null, + "name": "Checkbox", + "display_name": "$5 for Insurance", + "type": "C", + "values": { + "url": "https://api.bigcommerce.com/stores/{store_hash}/v2/options/89/values", + "resource": "/options/89/values" + } +} +``` + +```json showLineNumbers copy +{ + "price_adjuster": { + "adjuster": "relative", + "adjuster_value": 5 + }, + "conditions": [ + { + "product_option_id": 89, + "option_value_id": 195 + } + ] +} +``` + + + +## Stock Levels + + + +### Update Stock Levels +For a simple product + +**Request V3 Product Stock** +`PUT /v3/catalog/products/{id}` + +```json showLineNumbers copy +{ + "inventory_level": 100, + "inventory_warning_level": 10 +} +``` + +**Request V2 Product Stock** +`PUT /v2/products/{id}` + +```json showLineNumbers copy +{ + "inventory_level": 15, + "inventory_warning_level": 5, +} +``` + + +### Update Stock Levels on Variant/SKU +For a single SKU + +**Request V3 Stock Variant** +`PUT /v3/catalog/products/{id}/variants/{id}` + +```json showLineNumbers copy +{ + "inventory_level": 100, + "inventory_warning_level": 10 +} +``` + +**Request V2 Stock Variant** +`PUT /v2/products/{id}/skus/{id}` + +```json showLineNumbers copy +{ + "inventory_level": 100, + "inventory_warning_level": 10, + "id": 388, + "sku": "SKU-4484A834" +} +``` + + + +### Update Stock Levels on Multiple Variants/SKU + +**Request V3 Stock on Multiple Variants** +`PUT /v3/catalog/products/{id}` + +```json showLineNumbers copy +[ + { + "inventory_level": 100, + "inventory_warning_level": 10, + "id": 388, + "sku": "SKU-4484A834" + }, + { + "inventory_level": 100, + "inventory_warning_level": 10, + "id": 389, + "sku": "SKU-9E932372" + } +] +``` + +**Request V2 Stock Level SKU** +`PUT /v2/products/{id}/skus/{id}` + +A request must be sent for each SKU + +```json showLineNumbers copy +{ + "inventory_level": 100, + "inventory_warning_level": 10 +} +``` diff --git a/docs/msf/managing-store-configuration.mdx b/docs/msf/managing-store-configuration.mdx new file mode 100644 index 000000000..6eef79b9c --- /dev/null +++ b/docs/msf/managing-store-configuration.mdx @@ -0,0 +1,201 @@ +# Managing Store Configuration + +[Settings API reference documentation](/docs/rest-management/settings) + +BigCommerce's Settings APIs can manage many of the configuration settings that are exposed to merchants in their store control panel, such as the store's name and contact information, SEO settings, and search filters. + +These Settings APIs can be used to simplify the setup of new storefronts and other new sales channels, as well as to automate ongoing configuration changes. They enable developers to build configuration management tools that may be more efficient than the store control panel for a particular use case. + +They are also useful for app developers who want to build integrations that can understand, respect, and work with the potentially complex states of a store's configuration. For example, knowing the settings that relate to the display of pricing in a storefront or other sales channel can be useful for an application that also displays pricing, automates the application of promotions, or sends emails containing prices. + +Unlike many of BigCommerce's APIs, Settings APIs usually don't involve large collections of objects that can be created, deleted, and paginated. Instead, these APIs deal with a limited, static set of configurable properties that affect various aspects of store operations. They can be configured both on the **global** level and as channel-specific **contextual overrides** that apply to only one sales channel. + +## Global settings and channel-specific settings + +![settings-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/settings-diagram.webp) + +The majority of BigCommerce merchants sell their products exclusively through the storefront website that comes preconfigured with their plan. When these merchants configure their store settings, they're modifying the **global default** versions of their settings. + +Once a merchant starts to take advantage of multi-storefront or other multi-channel functionality, they often want to configure settings differently for each sales channel. + +Each new channel will use the store's global default values unless the merchant chooses to override them by defining **channel-specific** settings. + +The Settings APIs use query parameters to distinguish which set of settings a request is accessing. + +Consider the following request to the [Get store profile settings](/docs/rest-management/settings/store-profile#get-store-profile-settings) endpoint: + + + + +```http filename="Example request: Get store profile settings" showLineNumbers copy +GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/settings/store/profile +X-Auth-Token: {{ACCESS_TOKEN}} +Accept: application/json +``` + + + + +```json filename="Example response: Get store profile" showLineNumbers copy +{ + "data": { + "store_phone": "+1 123-456-7890", + "store_name": "My Default Store Name", + "store_address": "123 Default St" + }, + "meta": {} +} +``` + + + + +Because the request did not specify any query parameters, the API returned the **global default** configuration for this merchant. Responses that return global configuration data will contain values for all properties of the requested object. + +The merchant's global configuration is used for all storefronts and other channels that have not specified different, channel-specific configuration settings. + +To check whether channel-specific values for a setting are defined, send the `channel_id` as a query parameter in your requests to settings endpoints. + + + + +```http filename="Example request: Get store profile settings for channel 122" showLineNumbers copy +GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/settings/store/profile?channel_id=122 +X-Auth-Token: {{ACCESS_TOKEN}} +Accept: application/json +``` + + + +```json filename="Example response: Get store profile settings for channel 122" showLineNumbers copy +{ + "data": {}, + "meta": {} +} +``` + + + +The response's empty `data` object indicates that no channel-specific store profile settings are configured for the specified channel. It is safe to infer that this channel is using the global default store profile settings. When the global default store profile settings change, this channel's profile will reflect those changes. For example, if the global default value for the store name changed, the store name would change at each place it appears in this channel. + +The following request-response pair shows an example of a channel that does have channel-specific store profile settings configured. + + + + +```http filename="Example request: Get store profile settings for channel 123" showLineNumbers copy +GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/settings/store/profile?channel_id=123 +X-Auth-Token: {{ACCESS_TOKEN}} +Accept: application/json +``` + + + +```json filename="Example response: Get store profile settings for channel 123" showLineNumbers copy +{ + "data": { + "store_name": "My Channel-Specific Name for Channel 123", + }, + "meta": {} +} +``` + + + + +Because a custom store name exists for channel 123, the channel-specific store name overrides the global default. Shoppers who interact with this channel will see the custom store name at each place it appears in the channel. When the global default `store_name` in the merchant's store profile settings changes, this channel will not reflect that change. However, any other changes to the global default store profile will affect channel 123, because `store_name` is the only channel-specific value defined. + +The following request-response pair shows an example of a channel with a complete set of channel-specific store profile settings configured. + + + + +```http filename="Example request: Get store profile settings for channel 124" showLineNumbers copy +GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/settings/store/profile?channel_id=124 +X-Auth-Token: {{ACCESS_TOKEN}} +Accept: application/json +``` + + + + +```json filename="Example response: Get store profile settings for channel 124" showLineNumbers copy +{ + "data": { + "store_phone": "+1 555-555-555", + "store_name": "My Channel-Specific Name For Channel 124", + "store_address": "124 Channel St" + }, + "meta": {} +} +``` + + + + +Because channel-specific values exist for all store profile object properties, this channel is configured to override all the global default store profile configuration settings. Changes to the global defaults will not affect this channel. + +## Editing store configuration settings + + +#### Global-only settings +Currently, the following settings are inherently global and cannot be modified with channel-specific overrides: +* store_address_type +* store_country + + +You can modify global and channel-specific settings alike by sending `PUT` requests to the relevant endpoints. + +The following example uses the [Update store profile settings](/docs/rest-management/settings/store-profile#update-store-profile-settings) endpoint to modify a store's global default configuration: + +```http filename="Example request: Update global store profile settings" showLineNumbers copy +PUT https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/settings/store/profile +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "store_name": "The new global store name", +} +``` + +To update channel-specific settings, send a request to the same endpoint along with a value for the `channel_id` query parameter. + +```http filename="Example request: Update store profile settings for channel 123" showLineNumbers copy +PUT https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/settings/store/profile?channel_id=123 +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "store_name": "A different Channel-Specific Name for Channel 123", +} +``` + +If you wish to restore global defaults on a channel with a channel-specific configuration, you can "un-override" the channel's settings by sending a `PUT` request. Use the following in the request: +* the `channel_id` query parameter +* `null` as a value for _all_ fields. The endpoint does not support partial updates; you must remove overrides for all fields. + + +```http filename="Example request: Reset channel-specific store profile settings to default" showLineNumbers copy +PUT https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/settings/store/profile?channel_id=124 +X-Auth-Token: {{ACCESS_TOKEN}} +Accept: application/json + +{ + "store_address": null, + "store_email": null, + "store_name": null, + "store_phone": null +} +``` + + + Global settings cannot be deleted, only updated. + + +## The cumulative effect of global and channel-specific settings + +At every point of contact a shopper has with a storefront or other sales channel, channel-specific settings are displayed first. Global default settings will only appear to shoppers when channel-specific values for those properties are not defined. This goes for viewing the storefront or product feed, reading a transactional email, receiving a packing slip, and all other interactions with the channel. + +The Settings APIs discussed in this article are primarily for use cases involved with the management or administration of store settings. If your application's proposed implementation of the Settings APIs is mostly concerned with presenting the correct shopper-facing details at their "touch point" with a storefront or other sales channel, consider using the [GraphQL Storefront API](/docs/storefront/graphql) to simplify your integration. Storefront API requests are run in the context of the shopper's active channel, so the relevant configuration is already correctly integrated with the data it returns. Stencil-powered storefront themes are also equipped with objects that represent the shopper-facing experience in context. diff --git a/docs/msf/msf-api-guide.mdx b/docs/msf/msf-api-guide.mdx new file mode 100644 index 000000000..679a5c5d5 --- /dev/null +++ b/docs/msf/msf-api-guide.mdx @@ -0,0 +1,180 @@ +--- +title: Multi-Storefront API Guide +keywords: multistorefront, channels, multi-channel, multichannel, sort, graphql, storefronts, +--- + +# Multi-Storefront API Guide + +## Cart and Checkout + +When your integration creates a cart or checkout, make sure it specifies the `channel_id` for the storefront or other channel the shopper is using. + +If the cart is associated with the shopper's channel and the relationship between a storefront's channel and site has been properly configured with the [Sites API](/docs/rest-management/sites#create-a-site), both [cart redirect URLs](/docs/rest-management/carts/redirects#create-cart-redirect-url) and [embedded checkout URLs](/docs/storefront/cart-checkout/embedded-checkout) will refer the shopper to the correct site. + +If your application interacts with shoppers, you can use the [GraphQL Storefront API: Carts and Checkout](/docs/storefront/cart-checkout/guide/graphql-storefront) to access cart and checkout data for shoppers in real time. + +## Categories + +[Categories API reference documentation](/docs/rest-catalog/category-trees/categories#get-all-categories) + +Previously, a store had a collection of categories that were organized in a tree structure. This collection of categories has been abstracted from the store and converted into the store's first **category tree**. You can create multiple category trees, each of which you can assign to a storefront or other sales channel. + +![categories-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/categories-diagram.webp) + +To access the category structure used by a particular storefront, you must first identify which tree is tied to that storefront channel. You can do so by sending a request to the following endpoint. Include the `channel_id:in` query parameter, which accepts one or more channel IDs as a comma-separated list. + +```http filename="Example request: Get category tree for channel 3" showLineNumbers copy +GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/catalog/trees?channel_id:in=3 +X-Auth-Token: {{ACCESS_TOKEN}} +Accept: application/json +``` + + + Currently, a tree may only be assigned to a maximum of one channel. BigCommerce's roadmap includes relaxing this restriction in the future so that several channels can share a common tree. + + +If your application interacts with shoppers, you may be able to use the [GraphQL Storefront API](/docs/storefront/graphql) to get the active category tree for shopper's channel in real time. + +## Customers + +[Customers API documentation](/docs/rest-management/customers) + +Each customer account has an `origin_channel_id` that references the channel on which it was created. Email addresses must be unique within each **channel**, rather than within the store. This means that a single email address can exist two (or more) times in one store: associated with two Customer IDs on two different channels. + +## Orders + +[Orders API reference documentation](/docs/rest-management/transactions) + +For applications that deal with order management, it is now crucial to include the `channel_id` as part of the order object. Among other benefits, linking each order to a channel will make it easier to sort, categorize, and filter orders by the storefront or other sales channel in which they were placed. You will also avoid accidentally having [an order associated with the default channel](/docs/storefront/multi-storefront#backwards-compatibility), which may confuse shoppers by exposing store configuration details that do not apply to their channel. + +Similarly, if your application is shopper-facing and deals with orders, it's important to provide the appropriate channel-specific information to shoppers. For example, if your app sends order confirmation emails to customers, you'll need to ensure that any store information, URLs, and links in your email reflect the correct storefront or other sales channel. For more details, see the use case considerations at the end of [Managing Store Configuration](/docs/rest-management/settings#the-cumulative-effect-of-global-and-channel-specific-settings). + +## Price lists + +[Price List Assignments API documentation](/docs/rest-management/price-lists/price-lists-assignments#get-price-list-assignments) + +Previously, price lists assignments were made with the V2 Customer Groups API. Price lists could only be assigned to customer groups. + +The V3 Price List Assignments API allows you to assign price lists to channels, customer groups, or the combination of a channel and customer group. Only one price list can apply at any given time, so BigCommerce determines which price list to apply using the following logic: + +* If a price list assignment is found that matches both the shopper's active channel **AND** their current customer group, it will be used; otherwise, +* If a price list assignment is found that both does not specify a channel **AND** matches the shopper's current customer group, it will be used; otherwise, +* If a price list assignment is found that both matches the shopper's current channel **AND** does not specify a customer group, it will be used; otherwise, +* The catalog default pricing will be used. + +If your implementation uses price lists to manage pricing, we recommend that you start using the V3 Price List Assignments API so that your app fully understands and can reason about the pricing state for the customers, orders, and channels on the merchant's store. + +If your use case is primarily concerned with what the price will be for a given shopper, consider using the [GraphQL Storefront API](/docs/storefront/graphql) to fetch data about the shopper's view in real time. + +## Products + +[Channel Assignments API documentation]() + + +#### The cardinal rule of multi-channel sales +Products must be explicitly assigned to a channel to be sold on that channel. + + +It is important to understand the difference between assigning a product to a category and assigning a product to a channel. Adding a product to a category allows you to merchandise the product and develop a store's taxonomy of products, categories, and category trees, but it does not make the product available within a channel. A product must be explicitly assigned to a channel to be sold on that channel. For native Stencil storefronts, if a product is not assigned to the storefront's channel, it will be hidden from that channel's storefront. + +![products-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/products-diagram.webp) + +If your app provides merchants with a sales channel, such as an integration with a third-party marketplace, we recommend that you check the merchant's catalog to determine their existing channel assignments. This will help your app understand and communicate with the merchant about which products the integration's channel is currently permitted to offer for sale. For extended product information relevant to your channel, consult the [Channel Listings API](/docs/rest-management/channels/channel-listings#get-channel-listings). + +If your application interacts with shoppers, you can use the [GraphQL Storefront API](/docs/storefront/graphql) to get the correct product availability and data for a given shopper in real time. + +### The nuances of channel assignments + +Use the [Channel Assignments API](/docs/rest-catalog/products/channel-assignments#get-products-channel-assignments) to create and manage product assignments for [storefronts and other sales channels](/docs/storefront/multi-storefront#channels). + +A product assigned to a storefront channel can be sold on that channel, discovered in search, and accessed by direct link, unless that storefront's settings otherwise disable direct links. + +Removing a product from a channel will make that product unavailable on the given channel. The product will remain categorized, but it will not be available using category filters, search, or direct link. + +Removing a product from a category does not remove it from the channel. Use the [Channel Assignments API](/docs/rest-catalog/products/channel-assignments#get-products-channel-assignments) to revoke channel assignments. + +Removing a product from one or all of a channel's categories without revoking the channel assignment will remove the product from the category views and filters, but shoppers will still be able to access the product by search or direct link. This may be useful for sales campaigns that send shoppers a direct link to purchase a specific product. + +## Storefront and Content + +### Scripts + +Scripts are associated with a particular site. Any scripts that were created previously have been assigned to the default site, the ID of which is `1000` for each merchant store. If you do not supply a `site_id` when you create a script, it will be assigned to the default site. To support multi-storefront stores, you should explicitly assign scripts to the site on which you intended them to render. If you want a particular script to show up on several sites, you must create that script separately on each site. + +![scripts-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/scripts-diagram.webp) + +[Scripts API reference documentation](/docs/rest-management/scripts) + +From a UX perspective, you may wish to make it clear to merchants who are setting up your app that they must explicitly select one or more storefront sites on which to install your app's storefront functionality. You should also provide ways to remove your scripts from each site and install your scripts on any new sites the merchant creates in the future. + +### Pages + +Pages are associated with a particular site. Any pages that were created previously have been assigned to the default site, the ID of which is `1000` for each merchant store. + +![pages-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/pages-diagram.webp) + +[Pages API reference documentation](/docs/rest-content/pages#get-pages) + +The new V3 Pages API services multi-storefront use cases and provides several of the efficiency benefits that V3 APIs offer in comparison with their V2 equivalents. The V3 Pages API has `site_id` as a required parameter. + +If your application reads pages-related data, be sure to filter by the appropriate `site_id` when dealing with a particular site. Similarly, when writing new pages, be sure to provide the correct `site_id`. + +### Widgets + +Widget templates, widgets, and widget placements are all associated with a particular channel. Any previously existing widget-related objects are assigned to the default channel, which is the first channel that was created on the store. + +Going forward, we recommend that you use the query parameters on each Widgets API endpoint to pass the `channel_id` of the storefront for which you are managing content. This will restrict the scope of your requests to the target channel. When you create new widget objects, be sure to include the correct `channel_id`. + +### 301 Redirects + +![redirects-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/redirects-diagram.webp) + +[Redirects API documentation](/docs/rest-management/redirects) + +Redirects are associated with a particular site. Any redirects that were created previously have been assigned to the default site, the ID of which is `1000` for each merchant store. + +The new V3 Redirects API services multi-storefront use cases and provides several of the efficiency benefits that V3 APIs offer in comparison with their V2 equivalents. The V3 Redirects API has `site_id` as a required parameter. + +If your application reads redirects-related data, be sure to filter by the appropriate `site_id` when dealing with a particular site. Similarly, when writing new redirects, be sure to provide the correct `site_id`. + +### Themes + +Previously, the [Activate store theme](/docs/rest-content/themes/theme-actions#activate-a-theme) endpoint accepted a `variation_id` and a `which` value. This has changed. + +Because we now support installing different themes and/or theme configurations for each storefront, you must supply a `variation_id` and `configuration_id` for the theme configuration you want to apply, as well as a `site_id` or `channel_id` for the target storefront. The `which` value is not supported for multi-storefront installations. + + +#### Locating the configuration ID +The `configuration_id` is the same as a configuration's `uuid`, returned in the [Get Theme Configuration](/docs/rest-content/themes/theme-configurations#get-theme-configuration) response body. + + +![themes-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/themes-diagram.webp) +[Themes API documentation](/docs/rest-content/themes) + +To understand which theme is active for a particular site, you can check the [Get active theme](/docs/rest-management/channels/channel-active-theme) endpoint. + +Themes themselves remain "global" to the store, but each theme now exposes a list of configuration settings. Each theme has a default configuration, but you can use the store control panel's Page Builder feature in the BigCommerce control panel to apply a different configuration to a storefront. + + +#### Themes API roadmap +Our Themes API roadmap includes the following: +* Exposing an endpoint to create a new theme configuration +* Adding a `download_url` query parameter to the [Get all themes](/docs/rest-content/themes#get-all-themes) endpoint + + +Currently, you can use the [Download a theme](/docs/rest-content/themes/theme-actions#download-a-theme) endpoint to download a theme. This will create a download job. + +Because each theme can define its own configuration, the response from the [Get theme configurations](/docs/rest-content/themes/theme-configurations#get-theme-configuration) endpoint may differ for each theme. Valid configurations match the theme's schema. You can use the [Validate theme configurations](/docs/rest-content/themes/theme-configurations#validate-theme-configuration) endpoint to validate a potential configuration against the theme's schema. + +### Subscribers + +[Subscribers API documentation](/docs/rest-management/subscribers) + +Each subscriber now has an `origin_channel_id` property that identifies the channel on which the subscriber consented to receive a newsletter. When not supplied, the `origin_channel_id` will default to `1`. To comply with electronic consent and privacy regulations, we recommend that your implementation specify the `origin_channel_id` for every subscriber. + +If your application deals with subscribers, be sure to check the `origin_channel_id` to understand exactly where the subscriber signed up. If you are integrating with an email marketing system, you may want to allow the merchant to pick which email lists will be used for which channels. + + +#### Subscriber webhooks roadmap +Our roadmap includes augmenting subscriber webhooks with an `origin_channel_id`, so that new subscriptions can be added to the email list that corresponds with the subscriber's channel. + diff --git a/docs/msf/msf-app-compatibility.mdx b/docs/msf/msf-app-compatibility.mdx new file mode 100644 index 000000000..9ba5754bd --- /dev/null +++ b/docs/msf/msf-app-compatibility.mdx @@ -0,0 +1,85 @@ +--- +title: Multi-Storefront App Compatibility +keywords: currency, currencies, headless, channels, apps, multistorefront, msf +--- + +# Multi-Storefront App Compatibility + +## Compatible versus optimized + +Multi-storefront **compatible** apps work with the data from all storefronts and other sales channels associated with a store. These apps must handle the core [install and load functions](/docs/integrations/apps/guide/callbacks). Compatible apps must be **channel aware**; they should be able to work intelligently with the configuration nuances of multiple storefronts and other sales channels. + +In addition to being channel-aware, **optimized** multi-storefront apps are **channel extensible**. They offer features that allow merchants and other users to configure parameters that are unique to each channel, over and above the offerings of BigCommerce. + +The features that will make an app channel-optimized depend exclusively on its use cases, so this guide focuses primarily on ensuring that your app meets the relevant requirements before you submit it for approval. + +## Upgrading existing apps + +It may make sense to provide merchants with an opportunity to configure different behaviors for each channel on which they sell. Your app might be relevant to only certain channel types; for example, `storefront` type channels on the `bigcommerce` platform. + +It's a good idea to fetch the list of a store's channels immediately after a merchant installs your app. Once your app understands whether it is compatible with the merchant's existing channels, it can inform the merchant per its use case. + +You should determine whether your application is relevant only to Stencil storefronts served by BigCommerce, or if it can also add value to the merchant's "headless" storefronts that sell through other sites or sales channels. Once your app understands whether it is useful in headless contexts, you may wish to show merchants who are setting up your app a list of their store's sites and channels so that they can configure your app differently for each sales channel. + +## Setup and channels configuration + +Ensure that your app's settings acknowledge multiple storefronts and convey that understanding to the merchant or authorized user. Your app's features should work with any subset of a merchant's channels, including a single channel, some of their channels, or across all the channels in their store. + +In testing, make sure that users can install and load the app in a store with multiple BigCommerce storefront channels. Use the [Channels API](/docs/rest-management/channels) to work with basic data about the store's channels. Use the [Sites API](/docs/rest-management/sites) to work with the channels' sites. + +Edit the app's profile in your [Developer Portal](https://devtools.bigcommerce.com/my/apps) to indicate that it supports multi-storefront functionality. See [Managing Apps in the Developer Portal](/docs/integrations/apps/guide/developer-portal#indicate-multi-storefront-support). + + +## Reading from and writing to multiple channels + +An app that functions correctly with a store's multi-channel product catalog and customer base must be able to handle the following complexity. Ensure that your app meets these criteria before submitting it for approval. + +1. Products synced to the app should include correct channel assignments. Read more about [retrieving product channel assignments](/docs/storefront/multi-storefront/guide#products). Merchants who use your app to create products should be able to assign them to one or more channels. + +2. Categories synced to the app should include correct channel assignments. Read more about [identifying the category tree](/docs/storefront/multi-storefront/guide#categories) that's active on a sales channel. Your app should allow merchants to integrate new categories individually into each target channel's active category tree. + +3. Orders synced to the app should include correct channel assignments. Orders that your app creates should include correct storefront channel assignments. Your app should be able to assign new orders to one or more channels. Read more about [channel-aware orders](/docs/storefront/multi-storefront/guide#orders). + +4. Customers synced to the app should include correct channel access permissions within the app. If your app creates any new customers, it should be able to assign them to one or more channels. Read more about [customers and channels](/docs/storefront/multi-storefront/guide#customers). Customer groups synced to the app should also include correct channel assignments. If your app creates any new customer groups, it should be able to assign them to one or more channels. + + +#### Price lists +Price lists have been substantially upgraded to support multi-channel sales. Read more about [channel-aware price lists](/docs/storefront/multi-storefront/guide#price-lists). + + +## Storefront content + +All storefront content that your app creates should be assigned to the channel of the merchant's choosing. Merchants should be able to customize storefront content on a channel-by-channel basis. + +1. Scripts installed using the Scripts API should include correct storefront site assignments. Read more about using the `site_id` to [assign a script to a site](/docs/storefront/multi-storefront/guide#scripts). + +2. Tracking scripts and pixels should be unique to each storefront or other sales channel. Read more about [scripts](/docs/storefront/multi-storefront/guide#scripts) and consult the [Update a web analytics provider](/docs/rest-management/settings/analytics#update-a-web-analytics-provider) endpoint. + +3. If your app creates storefront content or features, merchants should be able to make it accessible on one or more channels. Read more about [channel-aware storefront content](/docs/storefront/multi-storefront/guide#storefront-and-content). + +4. Any widgets that your app creates should be available on one or more storefronts. Read more about [channel-aware widgets](/docs/storefront/multi-storefront/guide#widgets). + +5. Themes synced to the app should include correct storefront site assignments. Published themes should include configuration options for any subset of storefronts. Read more about [channel-aware themes](/docs/storefront/multi-storefront/guide#themes). + +6. Custom template files synced to the app should include correct storefront assignments. Custom template files that the app creates should include configuration options for one or more storefronts. Read more about [widget template objects](/docs/rest-content/widgets/widget-template#get-a-widget-template). + +7. Pages synced to the app should include correct storefront assignments. Pages that the app creates should include configuration options for one or more storefronts. Read more about [working with pages' site_id property](/docs/storefront/multi-storefront/guide#pages). + +8. Carts that the app tracks or creates should include the correct `channel_id`. Read more about [channel-aware carts and checkout](/docs/storefront/multi-storefront/guide#cart-and-checkout). + +## Additional settings and content + +1. BigCommerce store settings synced to the app should include the correct channel assignments. Merchants should be able to configure store settings that the app creates for one or more channels. Read more about [managing store configuration](/docs/rest-management/settings). + +2. Newsletter subscribers synced to the app should include the correct storefront channel assignments. Merchants should be able to assign any subscribers that the app creates to one or more channels. Read more about [subscribers](/docs/storefront/multi-storefront/guide#subscribers). + +3. Currencies synced to the app should include correct channel assignments. Merchants should be able to ensure that currency modifications that the app makes apply to the channel or channels of their choosing. Consult the [Get store information endpoint](/docs/rest-management/store-information#get-store-information) to learn more about viewing and updating currency properties. + + +4. 301 redirects synced from or written to a merchant's store must include the correct storefront's `site_id`. Read more about [channel-aware 301 redirects](/docs/storefront/multi-storefront/guide#redirects). + + +5. Transactional emails synced from or written to a merchant's store should include the correct `channel_id`. Consult the reference for the [Get transactional email settings](/docs/rest-management/settings/email-statuses#get-transactional-email-settings) and [Update transactional email settings](/docs/rest-management/settings/email-statuses#update-transactional-email-settings) endpoints. + + +6. Abandoned cart emails synced from or written to a merchant's store should include the correct `channel_id`. Consult the reference for the [Update channel abandoned cart settings](/docs/rest-management/abandoned-carts/abandoned-carts-settings#update-channel-abandoned-cart-settings) endpoint. diff --git a/docs/msf/msf-overview.mdx b/docs/msf/msf-overview.mdx new file mode 100644 index 000000000..4681b88ea --- /dev/null +++ b/docs/msf/msf-overview.mdx @@ -0,0 +1,74 @@ +# Introduction to Multi-Storefront + +Some merchants want to sell their products in different places. They may want to maintain multiple website-based eCommerce storefronts, or sell products from their store's catalog on other channels, such as Amazon, eBay, in-person POS (point-of-sale) systems, and so on. + +Multi-storefront capabilities extend the reach of BigCommerce stores. Merchants are no longer relegated to selling from a single storefront website. They can maintain multiple websites, on which they can configure and customize the look, feel, pricing, and organization of the shopping experience to support multiple distinct brands or sales goals. To this end, BigCommerce's data model has evolved significantly to support these new dimensions. + +We intend to provide these new features with no breaking changes to the platform so that existing single-storefront merchant stores continue to function as they did previously, and the existing APIs function as before for these stores. However, there are several additive changes to the platform. To provide the full multi-storefront, multi-channel support that merchants with complex stores expect and require, our partners must adapt. + +This guide provides an overview of the core features that power multi-storefront, multi-channel stores. Our [Multi-Storefront API Guide](/docs/storefront/multi-storefront/guide) and [Multi-Storefront App Compatibility and Optimization](/docs/integrations/apps/multi-storefront) article provide guidance on how developers can modify and reimagine applications to support multi-storefront, multi-channel selling. + +![channels-sites-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/channels-sites-diagram.webp) + +## Channels + +[Channels API reference documentation](/docs/rest-management/channels) + +A **channel** is a place where a merchant's store sells products. Storefront websites, marketplaces like Amazon and eBay, point-of-sale systems, and marketing feeds are all sales channels. A custom channel may not fit into any one of these types. A merchant creates a new channel to sell in a new context. Channels can help to organize a merchant's complex business by allowing them to sell to many customers in many places from a single catalog in one BigCommerce store. In a transactional context, channel objects link together a variety of other objects that describe a particular shopper's experience on a sales channel. + +![channels-sites-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/channels-sites-diagram.webp) + +A channel is defined by the following: + +* A `name`, which is merchant-defined for internal convenience and not exposed to shoppers +* A `type`, which may be one of the following: + * `storefront`, + * `marketing`, + * `pos`, + * `marketplace` + * `custom` +* A `platform`, which indicates the platform on which shoppers primarily use the channel + +Consult the [Channels API documentation](/docs/rest-management/channels#create-a-channel) for more information on valid combinations of `type` and `platform`. For example, a BigCommerce-hosted Stencil storefront has a type of `storefront` and a platform of `bigcommerce`. + +Each BigCommerce store is provisioned with one channel out of the box, intended for its first Stencil storefront. The ID of this channel is `1` for all BigCommerce stores. This channel may also be referred to as the "default channel", and it cannot be deleted. + + +#### Backwards compatibility +In some cases when a more specific channel cannot be associated with an interaction, channel `1` may be used for backwards compatibility. For example, orders created using the V2 Orders API that do not specify a channel ID will be associated with channel `1`. + + +To learn more about upgrading your application to support multi-channel sales, see [Multi-Storefront App Compatibility](/docs/integrations/apps/multi-storefront#upgrading-existing-apps). + +## Sites + +[Sites API documentation](/docs/rest-management/sites) + +A **site** is a website owned or controlled exclusively by the merchant, usually for hosting a storefront website. Every site will be tied to exactly one channel, but because not all sales channels are sites, channels are not required to have a site. Sites are mainly relevant to storefront-type channels, and they serve as containers for settings and objects that only apply to websites. + +Every site must have the following properties: + +* The `channel_id` of the sales channel associated with the site +* A `url`, which is the public-facing URL of the site + +Every Stencil storefront has a site, in addition to having a channel of type `storefront` and a platform of type `bigcommerce`. + +The first Stencil storefront of each merchant store has an ID of `1000` and is also known as the default site. It cannot be deleted. + +To learn more about upgrading your application to support multi-storefront functionality, see [Multi-Storefront App Compatibility](/docs/integrations/apps/multi-storefront#upgrading-existing-apps). + +## Settings & Configuration + +[Settings API Documentation](/docs/rest-management/settings) + +The Settings APIs now allow your app to read and write many important elements of the store's configuration, both globally and on a per-channel basis. If your application manages settings, you can use these endpoints to enable merchants to configure different settings for different channels. You may also wish to read and respect any merchant-configured settings that control details of your application's behavior. + +If your application interacts with shoppers, you may be able to use the [GraphQL Storefront API](/docs/storefront/graphql) instead to get the relevant settings for a given shopper in real time. + +For a deep dive into this new class of APIs, see our [Settings API Overview](/docs/rest-management/settings). + +## Resources +* [Multi-Storefront API Guide](/docs/storefront/multi-storefront/guide) +* [Multi-Storefront App Compatibility and Optimization](/docs/integrations/apps/multi-storefront) +* [Settings API Overview](/docs/rest-management/settings) +* [Multi-Storefront (Help Center)](https://support.bigcommerce.com/s/article/Multi-Storefront?language=en_US) diff --git a/docs/partner-apps/bundleb2b/b2b-edition.mdx b/docs/partner-apps/bundleb2b/b2b-edition.mdx new file mode 100644 index 000000000..64faefec1 --- /dev/null +++ b/docs/partner-apps/bundleb2b/b2b-edition.mdx @@ -0,0 +1,179 @@ +# B2B Edition for Stencil + +BigCommerce's B2B Edition offers a range of business-to-business (B2B) solutions that help businesses grow, streamline operations, and improve the experience for both their internal teams and their business customers. + +B2B Edition for Stencil is a packaged offering of the BigCommerce Enterprise plan, the B2B Edition integration, and [six supported Stencil themes](https://support.bigcommerce.com/s/article/B2B-Edition#themes). + +## Feature enhancements + +B2B Edition offers multiple B2B feature enhancements to your BigCommerce store, including the following: + +- Customer account hierarchy with user roles and permissions +- Shared shopping lists and "buy again" functionality +- Sales representative enablement tools +- Quote management +- Invoice & payment management + +For a more complete list of B2B Edition feature enhancements, see our Help Center [article on B2B Edition's features](https://support.bigcommerce.com/s/article/B2B-Edition#features). + +## Stencil versus the Buyer Portal + +The shopping frontend of B2B Edition for Stencil runs on Stencil storefronts alone, whereas the [B2B Edition Buyer Portal](https://support.bigcommerce.com/s/article/B2B-Edition-Buyer-Functions#buyer-portal) is storefront technology-agnostic. + +The Buyer Portal uses the [Scripts API](/docs/integrations/scripts) to deploy a React app that accomplishes many of the same things as B2B Edition for Stencil. It is Stencil-compatible, but does not use Stencil's context or Handlebars theme objects. + +The Buyer Portal is also channel-aware and [MSF-optimized](/docs/integrations/apps/multi-storefront). The backend can manage B2B functionality on multiple storefronts. + +For more on the differences, see our Help Center article on the [Buyer Portal](https://support.bigcommerce.com/s/article/B2B-Edition-Buyer-Functions#buyer-portal). We encourage businesses who are installing B2B Edition for the first time to use the Buyer Portal, as the B2B Edition team is actively developing the Buyer Portal and adding new features regularly. If you choose to use the Buyer Portal, this article is not relevant to your implementation. + +## Installing and locating the app + +If your development sandbox or merchant store didn't come with B2B Edition pre-installed, reach out to your BigCommerce representative. You can also download the app from the [B2B Edition information page](https://www.bigcommerce.com/apps/b2b-edition/) in the Apps Marketplace. + +The B2B Edition backend settings are accessible in the **Apps > [My Apps](https://login.bigcommerce.com/deep-links/manage/marketplace/apps/my-apps)** menu of the store control panel. The client-facing portions of the app load dynamically with JavaScript. + +## Customizing B2B Edition for Stencil + +With B2B Edition for Stencil, you can customize display text, styling, checkout configurations, and the placement of app elements. You can also access the lifecycle methods for many B2B Edition objects and inject your own JavaScript functions. + +Additionally, you can use the B2B Edition API to create, read, update, and delete items such as orders, companies, addresses, payments, sales reps, and company users. This API allows you to build your own services or integrate B2B Edition with third-party business tools, such as Salesforce or Zendesk. + +This section details how to edit the DOM, CSS, and display text in a B2B Edition Stencil theme, and how to define JavaScript lifecycle methods. It assumes you are familiar with editing Stencil themes locally and pushing them to a sandbox or production store using the Stencil CLI. + +### Prerequisites for customizing B2B Edition + +- [Node.js 14+ and npm](https://nodejs.org/en/download/releases/) +- The [Stencil CLI](/docs/storefront/stencil/cli/install) +- A Stencil-scoped [API account access_token](/docs/storefront/stencil/cli/development-server#creating-store-level-api-accounts-for-stencil), to push your custom B3-optimized theme to a store +- A text editor or IDE, such as [VS Code](https://visualstudio.microsoft.com) +- Access to a BigCommerce store control panel with store owner permissions + +### Customizing page containers + +B2B Edition for Stencil renders client-facing pages and elements by mounting fixed containers to BigCommerce themes using JavaScript. B2B Edition elements and containers are _B3 objects_. You can change the placement of select B3 elements by specifying the DOM node on which you want B2B Edition to mount the container using the following steps: + +1. Insert `window.b3themeConfig.useContainers = {}` into your theme's `assets/js/global.js` file. +2. Within `window.b3themeConfig.useContainers = {}`, create a property with the name of the B3 container as its key and the selector for the theme element on which it will mount as its value. + +When done, the object will resemble the following: + +```js filename="Example: Specify a custom mount node for the dashboard container" showLineNumbers copy +window.b3themeConfig.useContainers = { + /* B3 will append the dashboard container to the first returned DOM node with a class of "page" that is a descendant of an element with the class of "container" */ + 'dashboard.container': '.container .page', +} +``` + +For a list of B3 container names and their default placements, see the [B3 containers reference](https://developer.bundleb2b.net/storefront/containers.html). + +### Customizing styles + +You can customize the styling of many B3 elements using CSS. + +To modify the styling of a B3 module, follow these steps: +1. Insert `window.b3themeConfig.useStyles = {}` into your theme's `assets/js/global.js` file. +2. Within `window.b3themeConfig.useStyles = {}`, create a property with the name of the B3 element as its key and an object that defines the desired CSS styles as its value. + + + Because the CSS is written in a JavaScript object, two-word properties, like `background-color`, must be written with camel case syntax. For example, `backgroundColor: "red"`. + + +When done, the object will resemble the following: + +```js filename="Example: Specify custom styles for the TPA button" showLineNumbers copy +window.b3themeConfig.useStyles = { +/* B3 will use the specified styles for the "Trade Partner Application" button that is appended to the secondary navigation menu */ + 'tpa.entryButton': { + fontFamily: 'Karla,Arial,Helvetica,sans-serif', + fontSize: '1rem', + listStyle: 'none', + boxSizing: 'border-box', + lineHeight: 'inherit', + transition: 'color .15s ease', + display: 'block', + color: '#333', + fontWeight: 700, + padding: '1rem .78571rem', + textDecoration: 'none', + textTransform: 'uppercase', + }, +}; +``` + +For more on B3 element names and their styles, see the [B3 styles reference](https://developer.bundleb2b.net/storefront/styles.html). + +### Customizing display text + +You can customize display text for many B3 elements, such as buttons, headers, and labels. + +To overwrite the default text that B3 renders, follow these steps: + +1. Insert `window.b3themeConfig.useText = {}` into your theme's `assets/js/global.js` file. +2. Within `window.b3themeConfig.useText = {}`, create a property for each element you would like to overwrite, using B3 element names as keys and strings containing the new display text as values. + +When done, the object will resemble the following: + +```js filename="Example: Specify custom display text for the quick order button" showLineNumbers copy +window.b3themeConfig.useText = { +/* B3 will now use the call to action "Place Quick Order" instead of the default "Quick Order Pad" for the button that is appended to the secondary navigation menu */ + 'nav.button.quickOrderPad': 'Place Quick Order', +} +``` + +For B3 element names and their default text values, see the [B3 text reference](https://developer.bundleb2b.net/storefront/text.html). + +### Overwriting and injecting JavaScript + +B3 has lifecycle methods for many modules that allow you to inject custom JavaScript functions at different times during page render. Each supported module has the following four global keys: + +| Key | Type | Default | Definition | +|:----|:-----|:--------|:-----------| +| overwrite | boolean | false | Specifies whether to overwrite B3 functions for the module. | +| callback() | function | {} (no-op) | Calls all enclosed functions after all other B3 code has run, regardless of the value of `overwrite`. | +| beforeMount() | function | {} (no-op) | Calls all enclosed functions before the module renders. | +| mounted() | function | {} (no-op) | Calls all enclosed functions after the module has rendered. | + +To overwrite and/or inject custom functions for a supported B3 module, follow these steps: + +1. Insert `window.b3themeConfig.useJavaScript = {}` into your theme's `assets/js/global.js` file. +2. Within `window.b3themeConfig.useJavaScript = {}`, create a property for each of the modules you'd like to customize. Uses the module name as the key and an object that defines values for the global keys as its value. + +When done, your object will resemble the following example that demonstrates the call stack of each function: + +```js filename="Example: Specify lifecycle method values for the quick order pad module" showLineNumbers copy +window.b3themeConfig.useJavaScript = { + quickorderpad: { + overwrite: false, + callback() { + console.trace(`quickorderpad.callback() runs after all other quickorderpad functions`); + }, + beforeMount() { + console.trace(`quickorderpad.beforeMount() runs before quickorderpad mounts`); + }, + mounted() { + console.trace(`quickorderpad.mounted() runs after quickorderpad mounts`); + } + } +} +``` + +The following displays the example's browser console output: + +![B3 console log output](https://storage.googleapis.com/bigcommerce-production-dev-center/images/b3_console_log_output.png) + +For a full list of available modules, see the [B3 JavaScript reference](https://developer.bundleb2b.net/storefront/js.html). + +## B2B Edition API + +You can find instructions on how to get a B2B Edition API token from the storefront context in the [B2B Edition authentication article](https://bundleb2b.stoplight.io/docs/openapi/65687766b2725-authentication). + +For the complete list of B2B Edition API endpoints, see the [B2B Edition API Reference](https://bundleb2b.stoplight.io/). + +## Additional B2B Edition resources + +- [Quick Start](https://developer.bundleb2b.net/storefront/quick-start.html) +- [B2B Edition API Reference](https://bundleb2b.stoplight.io/) +- [RESTful APIs call](https://developer.bundleb2b.net/storefront/api-call.html) +- [Customize display text](https://developer.bundleb2b.net/storefront/text.html) +- [Customize page containers](https://developer.bundleb2b.net/storefront/containers.html) +- [JavaScript overwrite and injection](https://developer.bundleb2b.net/storefront/js.html) diff --git a/docs/start/introduction-to-bigcommerce.mdx b/docs/start/introduction-to-bigcommerce.mdx new file mode 100644 index 000000000..1501b8821 --- /dev/null +++ b/docs/start/introduction-to-bigcommerce.mdx @@ -0,0 +1,39 @@ +# Introduction to BigCommerce + +It all starts with **purpose**. + +✨ We’re here to _open commerce_. ✨ + +We open up the possibilities of commerce for brands and retailers throughout their journeys, and we openly collaborate with the broader commerce ecosystem to create opportunities for mutual growth. + +## What is BigCommerce? + +We’re a commerce-centric company, platform, and set of retailer-facing SaaS products used to scale ecommerce businesses: + +**Commerce-centric company** + +We’re innovators in the commerce landscape. A NASDAQ-listed, publicly traded company, we empower brands and retailers to grow at all stages of their development, across every sales channel. + +**Commerce platform** + +From store-level APIs that handle product catalogs, orders, and customers to shopper-focused APIs that help you craft perfect storefront experiences, our platform can power almost any commerce experience you can imagine. The products we offer are all powered by our platform, and our [developer-focused starter projects](/tools-resources) give examples of what’s possible. You’re in the right place to learn about everything our platform can do! + +**Commerce products for brands** + +Our hosted control panel and bundled storefront are how most brands interact with BigCommerce. They have access to their BigCommerce stores from day one. And when those businesses need more? That’s when developers like you step in, building single-click apps that enrich their control panels with new functionality. Hundreds of apps available in our marketplace do just that, and thousands of agencies support brands as they further customize their storefronts. + +We deliver our core platform and products using a SaaS model. We continually enhance our stores with feature, performance, and security updates. We take pride in handling these mission-critical updates for the brands we serve. An ever-expanding set of certifications demonstrate the performance and reliability of our platform, including PCI, ISO, SOC, FIPS, RH-ISAC, GDPR, and CCPA. + +## What makes BigCommerce unique? + +We strive to open commerce through our open SaaS approach, blending the flexibility of open source with the usability and security of SaaS. It means developers and retailers get a powerhouse commerce platform without the constraints of a SaaS monolith. + +We think BigCommerce is the most welcoming, open SaaS commerce platform out there, both technologically and on a human level. Our partners, agencies, and the developers that work with them are always top of mind, because we believe that great ideas can come from outside. We think it’s key to build the future of commerce _together_, and you’ll see us operate with that mindset every day. + +## Where should you start? + +1. **Complete the getting started guide**: Our [guide](/docs/start) will help you set up a developer sandbox and focus your initial development efforts. + +2. **Join our developer community**: Our [community](/community) is where you’ll forge connections with our developer relations team, product and engineering teams, and fellow developers using our platform. + +We can’t wait to see what you build! diff --git a/docs/stencil-docs/configure-store-design-ui/defining-global-styles.mdx b/docs/stencil-docs/configure-store-design-ui/defining-global-styles.mdx new file mode 100644 index 000000000..2aaf52b89 --- /dev/null +++ b/docs/stencil-docs/configure-store-design-ui/defining-global-styles.mdx @@ -0,0 +1,258 @@ +# Defining Themes Styles + + + +## Configuration file + +You can manage your theme's front-end components by configuring its `config.json` file. This file is made up of different keys and values that define your theme's global styles. + +`config.json` performs the following functions: + +* Provides global context for Stencil's CSS and Handlebars resources. +* Provides values for the Page Builder UI to manage. +* Provides metadata for your theme's listing in the Theme Marketplace. +* Defines variations included in your theme. + +For a list of all available keys and values in `config.json`, see [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config). + +## Requirements and restrictions + +The `config.json` file must meet the following requirements: + +* It must be named `config.json` and reside in the root of your `` top-level subdirectory (for example, `/cornerstone/config.json`), and must contain valid JSON. +* The maximum allowable size for a theme's `config.json` file is 64 KB. Exceeding this limit will trigger an error upon uploading the theme to BigCommerce. +* Each key's value is restricted to 64 characters. Exceeding this limit will similarly trigger an upload error. + +Apart from the aforementioned size constraints, there is no limit on the number of keys and values you can place in a theme's `config.json`. + + +Carefully check your theme against all the listed requirements – including the required keys within the `meta` object and `variations` array. While some requirements are not enforced in local development, they will be validated when you upload your theme to BigCommerce. + + + +### Required config.json keys + +The `config.json` file must contain the following keys: + +* `name` +* `version` +* `settings` +* `variations` +* `meta` (see specific requirements below) + +### Required meta keys + +The `meta` object must contain the following keys: + +* `price` +* `author_name` +* `author_email` +* `author_support_url` +* `documentation_url` +* `composed_image` +* `features` + +For illustration, below is a commented excerpt. + +```json +{ + ... + "meta": { + "price": 15000, // in cents; non-negative integer, minimum 0 + "author_name": "eCommerce Themes, Inc.", // Must be a string, not null + "author_email": "support@example.com", // Must be a string, should be a valid email address, not null + "author_support_url": "http://example.com/contactus", // Must be a string, should be a valid URL, not null + "documentation_url": "http://example.com/guide", // Must be a string, limit of 255 characters, not null + "composed_image": "path/to/composed.png", // Must be a string path to the composed-image file + "features": [ + // Array of feature strings, all of which must be in the list enumerated here: + // https://github.com/bigcommerce/theme-registry/blob/master/app/schemas/theme_config.json#L33 + "fully_responsive" // Must include at least one feature, and no duplicate entries + ] + }, + ... +} +``` + +### Required variation keys + +A theme requires at least one variation. For each variation that you choose to include in your theme, you must provide the following keys: + +* `name` +* `id` +* `meta` + +For illustration, consider the following code sample from Cornerstone: + +```json showLineNumbers +{ + "variations": [ + { + "name": "Light", + "id": "light", + "meta": { + "desktop_screenshot": "desktop_light.png", + "mobile_screenshot": "mobile_light.png", + "description": "Ideal for a wide range of businesses and brands, this design is fully responsive, simple, and ready for you to add your branding, logo, and products. ...", + ... + } + } + ], + ... +} +``` + +## New products example + +The values that you define in the `config.json` file interact with local resources making it possible to customize your theme's appearance globally. Your `config.json` definitions set global defaults for templates, front matter attributes, and Handlebars resources throughout your theme. You can also define custom variables in `config.json`, named according to your needs. +To see how interactions with `config.json` values work, first note the default values in `config.json` for the `homepage_new_products_count` and `product_list_display_mode` keys. + +```json +{ + "settings": { + "homepage_new_products_count": 5, + "product_list_display_mode": "grid", + } +} +``` + +Next, open your `templates/pages/home.html` file. +Note the reference to the `homepage_new_products_count` key in the file's front matter. If your current theme's `home.html` front matter omits `products:new:limit`, paste it in for this demonstration. + +```html +products: + new: + limit: {{theme_settings.homepage_new_products_count}} + featured: + limit: {{theme_settings.homepage_featured_products_count}} + top_sellers: + limit: {{theme_settings.homepage_top_products_count}} +carousel: {{theme_settings.homepage_show_carousel}} +blog: + recent_posts: + limit: {{theme_settings.homepage_blog_posts_count}} +{{#partial "hero"}} + +{{/partial}} +{{> layout/base}} +``` + +You should see five products displayed in a grid in the New Products section of your homepage. + +## Changing page layout using local front matter + +In the `home.html` front matter, `products:featured:limit` controls how many products appear on the home page. The number of products is set by the `config.json` file's `homepage_featured_products_count`. + +```html +products: + featured: + limit: {{theme_settings.homepage_featured_products_count}} + +``` + +To set theme-wide configurations in the front matter using `config.json`, replace the `{{theme_settings.homepage_featured_products_count}}` statement in `home.html` with a hard-coded `2`. For reference, see the following example. + +```html +products: + + featured: + limit: 2 + + +{{#partial "page"}} + +
    + {{#if products.featured}} + {{> components/products/featured products=products.featured columns=2}} + {{/if}} +
    +{{/partial}} +{{> layout/base}} +``` + +Reload the page. You should see the number of products displayed in Featured Products change to two. +## Retrieving specific config.json values through Sass +In `config.json`, global variables bring dynamic values into the framework. Sass imports these global variables' values to handle data, such as colors hexadecimal values, and to make the data available to Page Builder. + +The following is a snippet of color variables from `config.json`. + +```json +{ + ... + "color-highlight": "#00abc9", + "color-highlightDark": "#f2f2f2", + "color-highlightDarker": "#dfdfdf", + ... +} +``` + +Below are the corresponding references in the theme's `assets/scss/settings/global/color/_color.scss` file. + +```scss +// ... +$color-highlight: stencilColor("color-highlight"); +$color-highlightDarker: stencilColor("color-highlightDarker"); +$color-highlightDark: stencilColor("color-highlightDark"); +// ... +``` + +In `config.json`, try redefining one or more color variables to hex values of your choice. Reload the page to see the effects. +## Adding and removing components +The properties that Stencil abstracts as Handlebars resources are portable between HTML files. To see this in action, open any storefront page in a browser and navigate to the page's footer where you should see the Categories section. +Open your theme's `footer.html` file located in `templates/components/common/footer.html`, navigate to the `footer-info` section, and remove the following `footer-categories` component: + +```handlebars + +``` + +Refresh the page. The Categories section should disappear from the footer. +Next, add a `footer` directory to `templates/components` and create a new `categories.html` template (for example, `templates/components/footer/categories.html`). Paste the code block from the previous step into `categories.html`. + +```handlebars + +``` + +In `templates/components/common/footer.html`, add a reference to the new template as shown below. + +```handlebars +
    +
    + +
    +
    +``` +Refresh the page. The Categories list should reappear in the footer. + +## Resources + +### Additional resources + +- [Edit config.json file](https://bigcommerce.wistia.com/medias/rmsz7xfan1) +- [Customize Components](https://bigcommerce.wistia.com/medias/sv3qsdehcw) +- [Customize Layout and Pages](https://bigcommerce.wistia.com/medias/jlv5fbr954) +- [Customize Assets](https://bigcommerce.wistia.com/medias/xtjm0ebnar) +- [Language File](https://bigcommerce.wistia.com/medias/ovx95ctbb0) +- [Theme Editor Text Fields](https://bigcommerce.wistia.com/medias/phggd7og8u) +- [Debugging Your Stencil Theme](https://bigcommerce.wistia.com/medias/3fhjpgpvun) diff --git a/docs/stencil-docs/configure-store-design-ui/defining-ui-options.mdx b/docs/stencil-docs/configure-store-design-ui/defining-ui-options.mdx new file mode 100644 index 000000000..7ec2092cc --- /dev/null +++ b/docs/stencil-docs/configure-store-design-ui/defining-ui-options.mdx @@ -0,0 +1,117 @@ +# Defining UI Options + + + +You are free to decide which properties of your theme to make editable in Store Design, and in which order to display them. Store Design can expose any set of properties as long as your schema.json declares them using the data types that Store Design supports. + +## Enabling Store Design Options + +To provide merchants with Store Design customization options, you must declare those options in the theme's schema.json file. You must also include those settings in your theme's config.json file, templates, and Sass/CSS files. The basic division of labor is this: +* schema.json is an array of objects, declaring which theme settings are editable in Store Design. These objects also declare all possible values to display in Store Design's GUI. +* config.json assigns (and updates) a default value for each of the editable settings. +* Each schema.json entry has an id element that maps it to its corresponding config.json entry. The id value identifies the relevant config.json key name. +* For front-matter properties to be editable, your theme's Handlebars template must call certain Handlebars helpers to transform the config.json entries into JavaScript values. +* For fonts to be editable, a Sass stylesheet must call certain custom Sass functions to transform the config.json font entries into CSS values. +* For styles to be editable, a Sass stylesheet must call certain custom Handlebars helpers to transform the config.json entries into CSS values. + +As users select options within the Store Design UI (and save their selections), Stencil will automatically rewrite config.json to record new defaults for the theme. + +### File Management Requirements + +See Stencil's default Cornerstone theme for examples that fulfill all of the above requirements. However, remember these hard requirements: + +* For any theme setting (such as a Sass variable or a front-matter value) to be merchant-customizable, +that setting – and its possible values – must be present in schema.json. You must manually provide these declarations, according to the structure described here. + +* Also, each key that you create in schema.json must have a corresponding config.json key whose name matches its id value. This config.json key sets the default value (even if that is simply an empty string). A schema.json setting without an `id`-matched config.json key will not appear to users in the Store Design GUI. + +## Best Practices + +Please follow these guidelines to head off errors upon theme upload, and to avoid possible loss of customizations made via the Store Design GUI at runtime: + +* Single-Instance Restriction per Storefront: We strongly recommend opening only one instance of Store Design, at a time, against each storefront. This is because there is currently no synchronization mechanism to reconcile configuration changes made by multiple Store Design instances. So schema.json will record the last changes made by any instance – but changes saved earlier by other instances might be lost. + +* Single-Storefront Restriction per Editor: In the current release, users can have only one storefront at a time open in Store Design. (A workaround is to open an "Incognito"/private-browsing window on an additional storefront, to bypass the cookie that imposes this restriction.) + +* File Name, Location, and Structure: Your theme's schema.json file must be named schema.json, must reside in the root of your `` subdirectory (e.g.: /cornerstone/schema.json), and must be valid JSON. + +* File Size: The maximum allowable size for a theme's schema.json file is 64 KB. Exceeding this limit will trigger an error upon uploading the theme to BigCommerce. (Other than this size constraint, there is no limit on the number of keys and values that you can place in a theme's schema.json.) + +## How .json Entries Govern Store Design's UI + +Your entries in the schema.json and config.json directly shape users' options in Store Design: +* Theme Variations always appear at the top of the Store Design panel. These variations are defined only in config.json, and their definition order in that file governs their display order in Store Design. +* Merchants must select one variation to edit, at a time, in Store Design. The selections that they make in the remainder of Store Design's UI will apply to only that selected variation. +* Store Design's remaining sequence of top-level (Section) headings corresponds directly to the sequence of top-level (Section) objects that you declare in `schema.json` + +The options displayed within these expandable Section headings correspond directly to the keys/values that you nest within schema.json's corresponding Section objects. + +In all, the structure that you give your theme's config.json and schema.json files directly governs the UI that Store Design exposes to merchants. So these files provide your UI design tools. + +## Store Design Data Types + +Store Design supports these data types: +* color +* font +* select [drop-down list] +* checkbox +* imageDimension +* text + +Within schema.json, each object's data type is declared in a statement like the one highlighted here: + +```json filename="Example object data type declaration schema.json" showLineNumbers + { + "type": "color", + "label": "Text Color", + "id": "body-font-color" + }, +``` + +### Types versus "heading" Labels + +Within schema.json, you will also see `"type": "heading"` statements like this one – highlighted earlier in the same object used for the above example: + +```json filename="'Heading' type settings schema.json" showLineNumbers highlightLines=[[5]] +{ + "name": "Colors", + "settings": [ + { + "type": "heading", + "content": "General" + }, + { + "type": "color", + "label": "Text Color", + "id": "body-font-color" + }, + {...} + ] +} +``` + +These `"type": "heading"` statements do not reference data types. Rather, they declare display captions for the Store Design UI's subcategories – the middle level nested within the Section headings, but outside the individual options from which merchants can select. (Those inner options are designated by `"label": ` statements.) + +## Store Design Data Structure in schema.json + +The schema.json nesting structure that you just saw maps directly to the Store Design UI displayed to merchants: Below the `variations` section (whose data are imported from config.json), the order and nesting of options in Store Design's UI directly matches the order and nesting of your schema.json entries. + +## Store Design UI Troubleshooting + +You may experience an issue when setting up the Store Design UI. For any unexpected behavior that you encounter while developing your Stencil theme, we recommend that you check the terminal window where you started Stencil CLI. In some cases, the terminal will provide a verbose error message specifying where to look for problems. For less-detailed error messages, see the below list of potential issues and diagnostic suggestions. + +### Empty Drop-Down List in Store Design Panel + +* **Symptom:** A drop-down list’s outline appears below its configured label. However, the list appears to be empty. +* **Likely Cause:** A default value specified in the theme’s config.json file is not enumerated in the schema.json file. +* **Resolution:** Update schema.json to include the config.json value. + +### Configured Control Missing from Store Design Panel +* **Symptom:** A control that you have configured within schema.json is completely absent from the Store Design UI. +* **Likely Cause:** The specified "type" is one of: text, text area, radio [button], or image. (Store Design does not currently support these data types.) +* **Resolution:** Display the user option via one of the supported data types: color, font, select [drop-down list], or checkbox. + +### Theme Changes Not Saved from Store Design UI +* **Symptom:** Changes saved in a browser’s Store Design panel are not reflected in the storefront. +* **Likely Cause:** Check whether Store Design to customize the same storefront. +* **Resolution:** We strongly recommend opening only one instance of Store Design, at a time, per storefront. BigCommerce currently provides no synchronization mechanism for configuration changes from multiple Store Design instances. So the storefront’s schema.json will record the last changes made by any instance – but changes saved earlier by other instances might be lost. diff --git a/docs/stencil-docs/configure-store-design-ui/store-design-overview.mdx b/docs/stencil-docs/configure-store-design-ui/store-design-overview.mdx new file mode 100644 index 000000000..72938237a --- /dev/null +++ b/docs/stencil-docs/configure-store-design-ui/store-design-overview.mdx @@ -0,0 +1,47 @@ +# Store Design Overview + + + +[Store Design](https://support.bigcommerce.com/s/article/Store-Design) is a browser-based tool that enables BigCommerce merchants to rapidly modify and customize a storefront's look and feel without writing any code. A merchant using Store Design can customize a storefront theme by modifying characteristics from a variety of menu options such as **Styles, Colors, Typography, Buttons**, and more. + +As a theme developer, you can configure your own settings for Store Design. Your configuration determines the theme's customizable aspects. For example, by customizing the configuration of Store Design, you can modify how merchants can customize colors, fonts, display of page features, and number of products to display per feature. + +## Configuration Files + +Each theme contains two related JSON files of key-value pairs: config.json and schema.json. These files' keys provide the following features: + +Keys that you include in schema.json – together with their corresponding config.json default values – define the settings that merchants can customize through Store Design's graphical interface. +Other config.json keys contain metadata about the theme, such as the theme's name, version, and resource controls. +Keys located in config.json's `variations` object define variations of the theme. For example, a theme might have a "Light" variation and a "Bold" variation, each with different typography and colors. Each theme can include as many variations as you like. +Keys located under both files' `settings` objects define the theme's look, feel, and functionality. + +For documentation on the principal keys included in Stencil's reference Cornerstone theme, see this section's [config.json Metadata](https://github.com/bigcommerce/cornerstone/blob/master/config.json) and [schema.json Metadata](https://github.com/bigcommerce/cornerstone/blob/master/schema.json) entries. + +## Managing Keys between Versions + +To make sure revisions to your theme are backward-compatibile, we generally recommend that you manage keys in both your config.json and schema.json files in an additive way. Specific recommendations: + +Adding new keys is generally fine. (However, each key in schema.json must have a matching default in config.json.) + +* Use caution in deleting any key. Doing so can break your new theme version's backward compatibility. +* We do not recommend renaming keys. Instead, we recommend introducing a new key, while maintaining the old key until it is no longer in use by anyone using an older version of your theme. +* Each object within your config.json › `variations` object defines one theme variation. If you are adapting an existing theme and consciously want to remove one or more variations, you can do so by removing the corresponding key(s). + +## Persistent Settings Storage + +When store administrators use Store Design to customize your theme for their store, the store's resulting configuration settings are saved to a separate configuration service at BigCommerce. + +## Theme Upgrades and Settings + +When a merchant upgrades your theme to a newer version, all key-value pairs that were saved to the BigCommerce configuration service are carried forward. For example, assume this customization/upgrade scenario: + +You release your Star Glow theme, version 1. This theme's config.json includes a key named `logo_size`, establishing a default value of 100x250. The combination of the key and the value compose a `logo_size` setting. +The merchant uses Store Design to change the `logo_size` setting to 175x275. This customized setting is stored in the BigCommerce configuration service. +You release Star Glow, version 1.1. In this theme revision, you have changed the `logo_size` to 300x300. +When the merchant applies Star Glow version 1.1 to their store, their custom `logo_size` setting of 175x275 remains in effect. +If you the merchant creates a second store and applies Star Glow version 1.1 to it, that store has no custom `logo_size` setting – so it will default to the new theme version's 300x300 value. + +## Resources + +### Related Articles +* [Store Design](https://support.bigcommerce.com/s/article/Store-Design) (BigCommerce Knowledge Base) diff --git a/docs/stencil-docs/customizing-checkout/checkout-confirmation-injection.mdx b/docs/stencil-docs/customizing-checkout/checkout-confirmation-injection.mdx new file mode 100644 index 000000000..8279455f6 --- /dev/null +++ b/docs/stencil-docs/customizing-checkout/checkout-confirmation-injection.mdx @@ -0,0 +1,248 @@ +# Checkout/Confirmation Injection + +This article covers styling, scripting, and extending the functionality of the checkout confirmation page. + +## Adding Storewide Styles + +A prerequisite for the next two options is to add themewide styles to your Checkout or Order Confirmation page. To do so, add this statement: + +`{{{stylesheet '/assets/css/theme.scss'}}}` + +...before this statement, which is already present at the head of each template: + +`{{{ checkout.checkout_head }}}` + +## Applying Storewide Header + +You can replace each page's predefined header with your storewide header. To do so, first add themewide styles as described above. Next, replace the following code block (if present): + +```html showLineNumbers copy +
    + +
    +``` + +with this Handlebars partial reference: + +`{{> components/common/header }}` + +Ensure that you paste it before this **existing** statement: + +`{{{ checkout.checkout_head }}}` + +## Applying Storewide Scripts + +You have the following options to add and customize headers and footers, on either or both templates: + +* Adding your themewide header/footer. +* Adding themewide scripts (for analytics, etc.). +* Adding both. + +If you are working on a theme that does not have the scripts already enabled, here are the steps to enable these options: + +1. Add themewide styles, as described above. + +2. Towards the top of the checkout template (`checkout.html`), add this Handlebars statement to enable header scripts: + +`{{{ head.scripts }}}` + +Add it between these existing statements, so it will ultimately read as shown below. + +```html showLineNumbers copy + + +{{{head.scripts}}} + +{{/partial}} + +{{#partial "page"}} +``` + +Additionally, at the bottom of the checkout template (`checkout.html`), add this Handlebars statement to enable footer scripts: + +`{{{ footer.scripts }}}` + +Add it between these existing statements, so it will ultimately read as shown below. + +```html showLineNumbers copy + {{{ checkout.checkout_content }}} + + {{{ footer.scripts }}} + + {{/partial}} +``` + +3. Towards the top of the order confirmation template (`order-confirmation.html`), add this Handlebars statement to enable header scripts: + +`{{{ head.scripts }}}` + +Add it between these existing statements, so it will ultimately read as shown below. + +```html showLineNumbers copy + + +{{{head.scripts}}} + +{{/partial}} + +{{#partial "page"}} +``` + +Additionally, at the bottom of the order confirmation template (`order-confirmation.html`), insert this Handlebars statement: + +`{{{ footer.scripts }}}` + +Insert it between these existing statements, so it will ultimately read as shown below. + +```html showLineNumbers copy +{{{ checkout.order_confirmation_content }}} + +{{{ footer.scripts }}} + +{{/partial}} +``` + +4. In your store's BigCommerce control panel, ensure that you have inserted any desired script text in the `Storefront` > `Script Manager` field. + +## Adding Trust Seals + +To add a trust seal to either template: + +1. Generate a code snippet (seal script) from your trust-seal provider. You can find instructions for GeoTrust seals in [this BigCommerce KB article](https://support.bigcommerce.com/s/article/Adding-a-GeoTrust-SSL-seal-to-your--footer). (Instructions for other providers will vary.) + +2. Copy and paste the seal script into your checkout or order confirmation template, before or after the `{{{ checkout.checkout_content }}}` Handlebars statement. + +## Checkout App Injection + +With BigCommerce's extensible software, there are a variety of ways to add scripts to your store. The steps above outline only one method of adding header and footer scripts to your store, which is by directly editing the theme files. + +As mentioned in the App Injection Script Examples, you can use BigCommerce's Script Manager and Script API to inject scripts to your store. The Script Manager user interface is available to store owners and other users via granted permission directly in the Control Panel, or scripts can be programmatically injected into the store by developers using the Scripts API. These are the recommended methods as they allow seamless and intuitive injection of scripts. + +The following sections present examples of scripts that inject popular apps into the checkout/order confirmation sequence. + +### Olark Live Chat + +As an example of injecting an app from the BigCommerce App Marketplace, you could enable the Olark Live Chat app on either page by using the script manager or our new Scripts API: + +```html showLineNumbers copy + + + +``` + +### Bluecheck Age Verification + +Similarly, you could enable the Bluecheck age-verification app by using the script manager or our new Scripts API: + +```html showLineNumbers copy + + + + + + + + + + +``` + +### Rebillia Recurring Billing + +To add the Rebillia app, you could add the following tags by using the script manager or our new Scripts API: + +```html showLineNumbers copy +
    + + + + + + +``` + +### Conversion Tracking: Conversions on Demand + +Here is one final example of an app that you could enable by using the script manager or our new Scripts API. This example enables Conversions on Demand: + +```html showLineNumbers copy + +``` + +### Google Analytics: Addrexx Address Verification + +The Addrexx app is integrated to the Checkout or Order Confirmation page via the BigCommerce control panel's Google Analytics box, rather than through injection directly into either Stencil template file. Here is the corresponding script to enter into the control panel: + +```html showLineNumbers copy + + + +``` + +## Resources + +* [Scripts API](/docs/rest-management/scripts) + +### Related Articles +* [Adding a GeoTrust SSL Seal to Your Store's Footer (Help Center)](https://support.bigcommerce.com/s/article/Adding-a-GeoTrust-SSL-seal-to-your--footer) + +### Additonal Resources +* [Olark (Olark)](https://www.olark.com/integrations/bigcommerce) +* [Rebilla (Rebilla)](https://www.rebillia.com/documentation/stencil-or-blueprint) +* [Set up conversion tracking for your website (Google)](https://support.google.com/google-ads/answer/6095821) +* [Addrexx (BigCommerce App Marketplace)](https://www.bigcommerce.com/apps/addrexx/) diff --git a/docs/stencil-docs/customizing-checkout/checkout-sdk-example.mdx b/docs/stencil-docs/customizing-checkout/checkout-sdk-example.mdx new file mode 100644 index 000000000..ab1812277 --- /dev/null +++ b/docs/stencil-docs/customizing-checkout/checkout-sdk-example.mdx @@ -0,0 +1,86 @@ +# Checkout SDK Tutorial + +This tutorial assumes you are familiar with the Checkout SDK. If you are unfamiliar with the Checkout SDK, refer to [Getting Started with Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk/tutorial) to get some general information. + +In this tutorial, we will create a custom checkout using a checkout loader file, building on the steps from the [Getting Started with Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk/tutorial) article. This tutorial will outline how to package a custom checkout file and install a custom checkout using the control panel. + + +## Creating a checkout-loader.js file + +In your text editor, create a file for upload called `checkout-loader-.js` with the following content, where `` represents an arbitrary version number used for invalidating cached versions of the file. + +```js copy +var script = document.createElement('script'); +script.onload = function () { + checkoutKitLoader.load('checkout-sdk') + .then(function (module) { + var checkoutService = module.createCheckoutService(); + return checkoutService.loadCheckout(window.checkoutConfig.checkoutId); + }) + .then(function (state) { + console.log('Checkout SDK Quickstart', state.data.getCheckout()); + document.getElementById(window.checkoutConfig.containerId).innerHTML = 'Checkout ID: ' + state.data.getCheckout().id; + }); +}; +script.src = 'https://checkout-sdk.bigcommerce.com/v1/loader.js'; +document.head.appendChild(script); +``` + +Comparing the content of this newly created file and the code from the [Getting Started with Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk/tutorial#installing-the-checkout-js-sdk), you should see a clear resemblance between the two. + + +## Use WebDAV to upload the checkout-loader.js file + +You can upload the checkout-loader.js file to your store's server using WebDAV by following the instructions below: + +1. Before proceeding, ensure you have downloaded [Cyberduck](https://cyberduck.io/), our recommended WebDAV client. For more information on how to use Cyberduck, refer to [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV). +2. From your store control panel, navigate to **Settings** > **Advanced** > **File access (WebDAV)**. + * To automatically connect with Cyberduck, see [Single-click Login](https://support.bigcommerce.com/s/article/File-Access-WebDAV#login). + * To manually connect with Cyberduck, see [Connecting with Cyberduck Manually](https://support.bigcommerce.com/s/article/File-Access-WebDAV#manual). +3. From Cyberduck, enter the `/content` folder, create a new folder, and name it _checkout_. +4. Copy the file `checkout-loader.js` into the newly created _checkout_ folder on WebDAV. + +## Install your custom checkout using the control panel + +To install a custom checkout on a store, follow these steps: +1. Navigate to **Settings** > **Advanced** > **Checkout** in your store's control panel. +2. Under **Checkout Type**, select **Custom Checkouts**. +3. Type the following in the Script URL field: + +```js copy +webdav:checkout/checkout-loader-.js +``` + + +NOTES: + +* Prepending `webdav`: indicates that the URL is in the remote WebDAV directory. It treats `/content` as the root WebDAV directory. + +* It is best practice to include a `` number in the Script URL field. Note that if you change the same provided loader filename, you could serve a cached version to the user. + +![custom-checkout-01](https://storage.googleapis.com/bigcommerce-production-dev-center/images/custom-checkout-01.png "Custom Checkout") + +4. Click the **Save** button at the bottom of the page. +5. Navigate to your live storefront to view your new custom checkout. + +## Log the checkout object + +1. Open your browser console and ensure you are logged in to collect cart and checkout information. +2. Add an item to your cart and proceed to the checkout page. The checkout page will be blank below the header. +3. From your developer’s console, execute the following command to fetch checkout content: + +```js copy +state.data.getCheckout(); +``` + +In the developer console, you will see the checkout object, and you can test out additional `state.data` commands. + +This tutorial also gives you the steps to build a custom checkout. Instead of working with code in our theme, as shown in the [Getting Started with Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk/tutorial) article, we created a file and uploaded it to WebDAV, effectively taking over the entire checkout experience. + + + +## Resources + +Sample apps +* [Checkout SDK Source Code](https://github.com/bigcommerce/checkout-sdk-js) + diff --git a/docs/stencil-docs/customizing-checkout/checkout-sdk-quickstart.mdx b/docs/stencil-docs/customizing-checkout/checkout-sdk-quickstart.mdx new file mode 100644 index 000000000..95934a1fc --- /dev/null +++ b/docs/stencil-docs/customizing-checkout/checkout-sdk-quickstart.mdx @@ -0,0 +1,179 @@ +# Getting Started with Checkout SDK + +The Checkout SDK is a JavaScript library of methods for performing actions related to checkout. It includes methods for logging in a customer, adding addresses to the checkout object, and surfacing the shipping and payment methods a merchant configures. It’s everything you need to build your own custom checkout page on BigCommerce. + +Our [reference implementation](https://github.com/bigcommerce/checkout-js) is a great place to start if you prefer to develop within a framework. However, the SDK, built with VanillaJS, is framework agnostic. + +This article will walk you through becoming familiar with Checkout SDK and experimenting with building checkouts using Cornerstone. At the end of the article, you will have installed the Checkout SDK, created a new JavaScript module for your custom checkout, and console-logged the checkout object. + +## Prerequisites +* This tutorial uses [Cornerstone](https://github.com/bigcommerce/cornerstone). Your theme may differ. +* The theme should be set up for [local development](/docs/storefront/stencil/cli/install). Use Stencil CLI to preview your local changes. + +## Installing the Checkout JS SDK + +1. Open your terminal and navigate to your theme's directory. + +For example, `cd cornerstone` + +2. Add the Checkout SDK loader script to your theme in `templates/pages/checkout.html` right after `{{#partial “page”}}`. + +```html copy + +``` + +3. Then, add an async function right after the Checkout SDK loader script in `templates/pages/checkout.html`. + +```html showLineNumbers copy + +``` + +`initSdk()` is in charge of loading checkout-sdk, creating the service, and load checkout with our current cart/checkout id. + + +The checkout.html page should look like this: + +```html showLineNumbers copy +{{#partial "head"}} + +{{{ checkout.checkout_head }}} +{{{ stylesheet '/assets/css/optimized-checkout.css' }}} +{{ getFontsCollection }} + + + +{{{head.scripts}}} + +{{/partial}} + +{{#partial "page"}} + + + + + +
    + +
    + + +{{{ checkout.checkout_content }}} + +{{{ footer.scripts }}} + +{{/partial}} + +{{> layout/empty}} +``` +4. Run Stencil CLI to view your changes. +5. Before navigating to the checkout page, ensure you are logged in to collect cart and checkout information. +6. Navigate to the checkout page, and from your developer’s console, execute the following command to fetch cart content: + +```js copy +state.data.getCart(); +``` + +In the developer console, you can see the entire available cart object. The output will look like this: + +```json showLineNumbers copy +{ + "id": "78fbb9bd-0489-4f6f-aeb7-60a697ccb63a", + "customerId": 0, + "email": "", + "currency": { + "name": "US Dollar", + "code": "USD", + "symbol": "$", + "decimalPlaces": 2 + }, + "isTaxIncluded": true, + "baseAmount": 57, + "discountAmount": 0, + "cartAmount": 57, + "coupons": [], + "discounts": [ + { + "id": "ce448bc8-2f35-40d1-a0a6-f5a7e2882c5c", + "discountedAmount": 0 + } + ], + "lineItems": { + "physicalItems": [], + "digitalItems": [ + { + "id": "ce448bc8-2f35-40d1-a0a6-f5a7e2882c5c", + "parentId": null, + "variantId": 5851, + "productId": 5860, + "sku": "", + "name": "Handcrafted Rubber Table", + "url": "https://example.com/handcrafted-rubber-table", + "quantity": 1, + "brand": "", + "isTaxable": true, + "imageUrl": "https://cdn11.bigcommerce.com/s-xxxyyyzzz/products/5860/images/588/dzn_Handcrafted-Rubber-Table-7__57890.1685111102.220.290.jpg?c=1", + "discounts": [], + "discountAmount": 0, + "couponAmount": 0, + "originalPrice": 57, + "listPrice": 57, + "salePrice": 57, + "retailPrice": null, + "extendedListPrice": 57, + "extendedSalePrice": 57, + "comparisonPrice": 57, + "extendedComparisonPrice": 57, + "isShippingRequired": false, + "type": "digital", + "isMutable": true, + "options": [] + } + ], + "giftCertificates": [], + "customItems": [] + }, + "createdTime": "2023-07-12T13:59:48+00:00", + "updatedTime": "2023-07-12T13:59:48+00:00", + "locale": "en" +} +``` + + +We can, for example, get or set shipping and billing addresses, sign in customers, apply coupons or gift certificates, initialize payment, or complete orders. + + + +## Resources + +### Sample apps +* [Checkout SDK Source Code](https://github.com/bigcommerce/checkout-sdk-js) (BigCommerce GitHub) + +## Related articles +* [Installling Stencil CLI](/docs/storefront/stencil/cli/install) diff --git a/docs/stencil-docs/customizing-checkout/custom-order-confirmation.mdx b/docs/stencil-docs/customizing-checkout/custom-order-confirmation.mdx new file mode 100644 index 000000000..f59c6120c --- /dev/null +++ b/docs/stencil-docs/customizing-checkout/custom-order-confirmation.mdx @@ -0,0 +1,101 @@ +# Installing a Custom Order Confirmation Page + + +You can engage with your customers after purchase with a custom order confirmation page even if you are not using a custom checkout. This article outlines how to package a custom order confirmation file, and install a custom confirmation file via the control panel. +The installation process is the same as [Installing a Custom Checkout](/docs/storefront/cart-checkout/open-checkouts/guide), except you will modify a different [file](https://github.com/bigcommerce/checkout-js/blob/master/packages/core/src/app/order/OrderConfirmation.tsx) in [Open Source Checkout](https://github.com/bigcommerce/checkout-js). + +## Generate the JavaScript loader file +Generating a loader file is the first step in installing a custom order confirmation page. If you are creating a custom checkout and a custom order confirmation page using checkout-js, the generated loader file is the same for both. However, you can install a custom order confirmation page and still use the default checkout. + +The loader file must be responsible for the following: + +* Loading all the required assets, including CSS files +* Running the app + +### Packaging custom order confirmation page with Open Source Checkout + +If using Open Source Checkout, you can generate the loader file by following these steps: + +1. Navigate and locate the Open Source Checkout folder using the terminal, and run `npm ci` to download dependencies. +2. Run `npm run build` to generate a `/dist/` folder with all the files. + +You can deploy and [install the custom confirmation page](#installing-a-custom-order-confirmation-page) when using Open Source Checkout to view changes and test implementations through the UI. + +### Properties available on the custom order confirmation page +When a store uses a custom confirmation page, the following properties are attached to the `window.checkoutConfig` object on the checkout page: + +* `containerId`: ID of the HTML component where you load the checkout app. +* `orderId`: The generated order ID. +* `publicPath`: If present, the public URL of the custom checkout file's directory. + + +To use the data exposed in the window object, include relevant code in your loader file. The following is an example of the relevant code: + +```jsx filename="Include code in loader file" showLineNumbers copy +ReactDOM.render( + , + document.getElementById(window.checkoutConfig.containerId) +); +``` + +## Hosting a custom order confirmation page + +You will need to host the custom confirmation file online so it can be served by the store using an external hosting service. Using an external host will allow you the freedom to automate the build process if you wish and push updates automatically from your local machine. + +### Using WebDAV to host a custom order confirmation page + +You can upload a custom order confirmation page to your store's server using WebDAV. The instructions to upload the `/dist` folder to the BigCommerce server using WebDav are below: + + +1. Before proceeding, ensure you have downloaded [Cyberduck](https://cyberduck.io/), our recommended WebDAV client. +2. From your store control panel, navigate to **Server Settings** > **File Access (WebDAV)**. + * To automatically connect with Cyberduck, see [Single-click Login](https://support.bigcommerce.com/s/article/File-Access-WebDAV#login). + * To manually connect with Cyberduck, see [Connecting with Cyberduck Manually](https://support.bigcommerce.com/s/article/File-Access-WebDAV#manual). +3. From Cyberduck, enter the `/content` folder and create a new folder named *OrderConfirmation*. +4. Navigate into the `/dist` folder in your OrderConfirmation project. +5. Copy the contents of the `/dist` folder and paste it into the *OrderConfirmation* folder. + + + For more information on how to use Cyberduck, refer to the [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) page. + + +## Installing a custom order confirmation page + +You can install a custom checkout on a store in the following two ways: + +* [Install using the control panel](#install-using-the-control-panel) +* [Install using the V3 Checkout API](#install-using-the-V3-checkout-API) + + +### Install using the control panel +To install a custom order confirmation page on a store, follow these steps: + +1. Navigate to **Advanced Settings > Checkout** in your store's control panel. +2. Under **Custom Order Confirmation**, type the following in the **Script URL** field, replacing `version` with the latest version number generated by running the `npm run release:alpha` command: + + + + `webdav:checkout/auto-loader-.js` + + +![order-confirmation-page](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/order-confirmation-page.png "Custom Order Confirmation Page") + + + * Prepending `webdav:` Indicates that the URL is in the remote WebDAV directory. It will treat `/content` as the root WebDAV directory. + * It is important to include `` number in the Script URL field. Because if you make changes to the same provided loader filename, you could serve a cached version to the user. + * If you previously created a custom checkout, use the same Script URL. You may need to enter the Script URL again. + + +1. Click the **Save** button at the bottom of the page. +2. Navigate to your live storefront to view your new custom order confirmation page. + + +### Install using the V3 Checkout API +To install a custom checkout on a store, use the [Update Checkout Settings](/docs/rest-management/checkouts/checkout-settings#update-checkout-settings) endpoint to install the loader file. + +## Related resources + +### Articles +- [Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk) +- [File Access (WebDav)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) +- [Installing Custom Checkouts in the Control Panel](https://support.bigcommerce.com/s/blog-article/aAn4O000000CdFGSA0/installing-custom-checkouts-in-the-control-panel) diff --git a/docs/stencil-docs/customizing-checkout/open-checkout-quick-start.mdx b/docs/stencil-docs/customizing-checkout/open-checkout-quick-start.mdx new file mode 100644 index 000000000..8545affdf --- /dev/null +++ b/docs/stencil-docs/customizing-checkout/open-checkout-quick-start.mdx @@ -0,0 +1,88 @@ +# Open Checkout Tutorial + +In this tutorial, we'll configure our development environment and make a code change to a fork of BigCommerce's [Checkout JS](https://github.com/bigcommerce/checkout-js) (also known as [Optimized One-Page Checkout](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout)). + +### Prerequisites + +- [Developer sandbox](https://www.bigcommerce.com/essentials/free-trial/) +- Node v10 and later +- NPM v3 and later +- [Unix-based OS](https://github.com/bigcommerce/checkout-js#requirements) (Linux or Mac OS X) + + + We recommend that Windows 10 users use [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/). + + + + +## Fork and install checkout-js + +Fork and clone [checkout-js](https://github.com/bigcommerce/checkout-js); then, install dependencies. + +```bash showLineNumbers copy +# Clone the repo +git clone https://github.com/bigcommerce/checkout-js + +# Install dependencies +cd checkout-js +npm ci +``` + +## Start development server + +Start webpack in watch mode and launch dev server. + +```bash showLineNumbers copy +npm run dev & npm run dev:server +``` + + + - Open your browser and navigate to `http://127.0.0.1:8080/` to confirm the dev server is running (you should see content from `build/`). + - To serve files over HTTPS, install an SSL on your development machine, or use [ngrok](https://ngrok.com/). + + + + +## Configure your sandbox + +Next, configure your sandbox to use the files served up by your dev server. + +1. Login to your BigCommerce developer sandbox, and navigate to **Advanced Settings** > [**Checkout**](https://login.bigcommerce.com/deep-links/manage/settings/checkout). +2. Change **Checkout Type** to **Custom Checkout**. +3. Under **Custom Checkout Settings**, copy and paste `http://127.0.0.1:8080/auto-loader-dev.js` into **Script URL**. +4. Save. + +[Learn more about installing custom checkouts](/docs/storefront/cart-checkout/open-checkouts/guide). + +## Make a code change + +Make a code change and wait a few seconds for webpack to reload the dev server. For example, the code below adds a `
    ` to the Checkout component defined in `src/app/checkout/Checkout.tsx`. + +```javascript showLineNumbers copy +class Checkout extends Component { + // ... + render(): ReactNode { + // ... + return <> +
    +
    +
    Open Checkout Quick Start Example
    + { this.renderContent() } +
    + { errorModal } +
    + + ; + } +} +``` + +## Resources + +- [Open Checkout GitHub Repo](https://github.com/bigcommerce/checkout-js) +- [Installing Custom Checkouts](/docs/storefront/cart-checkout/open-checkouts/guide) +- [File Access (WebDav)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) + +### Additional resources + +- [Fork a repo](https://docs.github.com/en/free-pro-team@latest/github/getting-started-with-github/fork-a-repo) (docs.github.com) diff --git a/docs/stencil-docs/customizing-checkout/open-source-checkout.mdx b/docs/stencil-docs/customizing-checkout/open-source-checkout.mdx new file mode 100644 index 000000000..37e7594f9 --- /dev/null +++ b/docs/stencil-docs/customizing-checkout/open-source-checkout.mdx @@ -0,0 +1,65 @@ +# Installing an Open Source Checkout + +You can create unique shopping experiences that fit the look and feel of a store's brand using custom checkouts. This article outlines how to package a custom checkout file and install a custom checkout using the control panel. + +This article will address using both [Open Source Checkout](https://github.com/bigcommerce/checkout-js) and [Checkout SDK](https://github.com/bigcommerce/checkout-sdk-js) powered checkouts. + +## Obtaining the JavaScript loader file +Custom checkouts must have a single JS loader file. The first step to using a custom checkout is generating this file. The loader file must be responsible for the following: + +* Loading all the required assets, including all CSS files, no matter the location +* Running the app + +## Developing a custom checkout + +If you wish to customize a checkout, enter your CSS into the [optimized-checkout.scss](https://github.com/bigcommerce/cornerstone/blob/master/assets/scss/optimized-checkout.scss) in Cornerstone or the [scss folder](https://github.com/bigcommerce/checkout-js/tree/master/packages/core/src/scss) in checkout.js. We suggest moving content from "optimized-checkout.scss to the scss folder or vice-versa to ensure a single source of truth for handling styles. + + + Note: "optimized-checkout.scss" will always override the CSS rules defined in checkout-js. + + +### Packaging custom checkouts with Open Source Checkout + +If using [Open Source Checkout](https://github.com/bigcommerce/checkout-js), you can generate the loader file by following these steps: + +1. Fork and clone [checkout-js](https://github.com/bigcommerce/checkout-js); then, install dependencies. + +```bash showLineNumbers copy +# Clone the repo +git clone https://github.com/bigcommerce/checkout-js + +# Install dependencies +cd checkout-js +npm ci +``` + +2. Start webpack in watch mode and launch the dev server. + +```bash showLineNumbers copy +npm run dev & npm run dev:server +``` + + + - Open your browser and navigate to `http://127.0.0.1:8080/` to confirm the dev server is running. You should see content from `build/`. + - To serve files over HTTPS, install an SSL on your development machine, or use [ngrok](https://ngrok.com/). + + + +When using Open Source Checkout to view changes and test implementations through the UI, deploy, and install the custom checkout. Checkout-JS is a reference implementation of [Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk); therefore, changes to your loader file are unnecessary. For more details on installing the Checkout JS SDK, see the [Checkout SDK Tutorial](/docs/storefront/cart-checkout/checkout-sdk/tutorial). + +## Hosting a custom checkout + +You'll need to host the custom checkout file online so the store can serve it. You can use a hosting service, such as [Amazon S3](https://aws.amazon.com/s3/). Using an external host gives you the freedom to automate the build process if you wish and push updates automatically from your local machine. Or you can host it on your store using WebDAV. + +The steps to host a custom checkout on BigCommerce are below: +1. Use WebDAV to upload a custom checkout. For details, see [Use WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV) to upload the checkout-loader.js file. +2. Install custom checkout using the [control panel](https://support.bigcommerce.com/s/blog-article/aAn4O000000CdFGSA0/installing-custom-checkouts-in-the-control-panel) or use the [Update Checkout Settings](https://developer.bigcommerce.com/docs/rest-management/checkouts/checkout-settings#update-checkout-settings) endpoint to install the loader file. + + + +## Related resources + +### Articles +- [Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk) +- [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) +- [Installing Custom Checkouts in the Control Panel](https://support.bigcommerce.com/s/blog-article/aAn4O000000CdFGSA0/installing-custom-checkouts-in-the-control-panel) diff --git a/docs/stencil-docs/customizing-checkout/optimized-one-page-checkout.mdx b/docs/stencil-docs/customizing-checkout/optimized-one-page-checkout.mdx new file mode 100644 index 000000000..e33b5072c --- /dev/null +++ b/docs/stencil-docs/customizing-checkout/optimized-one-page-checkout.mdx @@ -0,0 +1,80 @@ +# Optimized One-Page Checkout + +This article covers styling and display options for Optimized One-Page Checkout. + +## Working with the optimized checkout SCSS file + +Cornerstone includes a SCSS file that styles the Optimized Checkout page. In your local installation, this file is located at `cornerstone/assets/scss/optimized-checkout.scss`. + +You can access the most recent version of this file in the [Cornerstone repository](https://github.com/bigcommerce/cornerstone/blob/master/assets/scss/optimized-checkout.scss). All themes share the same stylesheet for the Optimized One-Page checkout, even those not based on Cornerstone, so this stylesheet applies universally across Stencil themes. + + + + #### Customizing checkout restrictions + When customizing the checkout page, you are free to change classes' contents; however, **do not** nest elements or change any class names. BigCommerce imposes these restrictions because each class here maps to multiple optimized checkout elements. Changing the structure or naming would break updates available in future optimized checkout enhancements. + + + +## Configuring the desktop viewport + +To set up optimized checkout's responsive features within the `optimized-checkout.scss` file, you should configure the following breakpoint to define your preferred desktop viewport size: + + +```css showLineNumbers copy + // TODO: + // Configure media query to be 'desktop' breakpoint size + // -- + @media (min-width: 801px) { + text-align: stencilString("optimizedCheckout-logo-position"); + } +``` + +## Classes available for customization + +Below are the classes provided in Cornerstone's `optimized-checkout.scss`, with the corresponding page elements that they style. These class names and mappings are subject to change, so please check the inline comments in the `optimized-checkout.scss` file that you downloaded with your current Cornerstone release. + +| Class | Styles this Optimized One-Page Checkout element | +|:------|:------| +| `.optimizedCheckout-header` | Page header. | +| `.optimizedCheckout-headingPrimary` | Top-level headings. | +| `.optimizedCheckout-headingSecondary` | Certain lower-level elements, such as descriptions of cart items. | +| `.optimizedCheckout-overlay` | Shipping Method box. | +| `.optimizedCheckout-contentPrimary` | Body text in the desktop `Order Summary`/`Order Confirmation` (cart contents); drop-down-list items; and text that summarizes completed steps. | +| `.optimizedCheckout-contentSecondary` | Text labels on check boxes, and lower-level text in the desktop Order Summary. | +| `.optimizedCheckout-button--primary` | `CONTINUE` button and final `PAY` button. | +| `.optimizedCheckout-button--secondary` | `Edit` buttons. +| `.optimizedCheckout-orderSummary` | Colors in the `Order Summary` mobile drawer/modal. +| `.optimizedCheckout-step` | Large step-number indicators on the page's left side. | +| `.optimizedCheckout-form-label` | Styles form fields like `Email Address` – the field's text-label color. | +| `.optimizedCheckout-form-input` | Styles form fields like `Email Address` – the entry box's background and border colors. | + +## Providing customizable options in Page Builder + +You can determine which aspects of Optimized One-Page Checkout merchants will customize with the Page Builder tool. + +In Cornerstone's `optimized-checkout.scss`, each SCSS class and property available has a corresponding key/value pair in the `config.json` file, which can be used as the `id` value in schema.json when [creating customizable Page Builder options](https://github.com/bigcommerce/cornerstone/blob/master/schema.json). + + + +## Currency conversion options + +You can enable the display of alternate currencies on your Stencil theme's Optimized One-Page Checkout and order confirmation pages. + + + #### Restrictions + The options on this page require that you first enable Optimized One-Page Checkout. Find instructions on how to do this in [Optimized One-Page Checkout](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout). + + +Note that regardless of the display options you set below, you will always process transactions in the store's single default currency. To change that setting, see [Changing Your Default Currency](https://support.bigcommerce.com/s/article/Managing-Currencies#default). + +To allow shoppers to view prices in multiple currencies, you will need to add the desired currencies in the store control panel. + +Shoppers will then be able to use the Currency drop-down list throughout the storefront to switch displayed prices among the enabled currencies. + +At checkout, the shopper still receives the bill in the store's default currency. As shown below, the checkout and cart templates will show an annotation about this while flagging any converted total (in a shopper's selected alternate currency) as an Estimated Total: + +![checkout template](https://storage.googleapis.com/bigcommerce-production-dev-center/images/checkout-template.png) + +## Related resources + +* [The Complete Guide to Checkout Customization on BigCommerce (Developer Blog)](https://medium.com/bigcommerce-developer-blog/the-complete-guide-to-checkout-customization-on-bigcommerce-6b566bc36fa9) diff --git a/docs/stencil-docs/customizing-checkout/paypal-smart-buttons.mdx b/docs/stencil-docs/customizing-checkout/paypal-smart-buttons.mdx new file mode 100644 index 000000000..ce050c42a --- /dev/null +++ b/docs/stencil-docs/customizing-checkout/paypal-smart-buttons.mdx @@ -0,0 +1,193 @@ +# PayPal Smart Buttons + + +PayPal Smart Buttons are available on Cornerstone versions 2.6.0+ for merchants who have **PayPal powered by Braintree** or **PayPal Express Checkout** enabled on their store. + +Theme developers can enable Smart Buttons on a custom Stencil theme by adding the required settings to the config.json file. + +Merchants will have the ability to customize some style aspects of the PayPal payment buttons at checkout using Page Builder for stores that have PayPal powered by Braintree or PayPal Express Checkout enabled. To make PayPal Smart Buttons customizable with Page Builder, a theme developer will need to make its customization properties available by adding its schema to the schema.json file. + +## Enable Smart Buttons on Your Stencil Theme + +Smart Buttons are included on Cornerstone versions 2.6.0+. If your theme does not already include Smart Buttons, append the `paymentbuttons` settings to the _Settings_ object within your config.json file. See the code sample below. + +```json filename="Addition of paymentbuttons to 'settings' object config.json" showlineNumbers copy + "settings": { + "..." + "color_badge_product_sale_badges": "#007dc6", + "color_text_product_sale_badges": "#ffffff", + "color_hover_product_sale_badges": "#000000", + "restrict_to_login": false, + "swatch_option_size": "22x22", + "social_icon_placement_top": false, + "social_icon_placement_bottom": "bottom_none", + "geotrust_ssl_common_name": "", + "geotrust_ssl_seal_size": "M", + "navigation_design": "simple", + "price_ranges": true, + "pdp-price-label": "", + "pdp-sale-price-label": "Now:", + "pdp-non-sale-price-label": "Was:", + "pdp-retail-price-label": "MSRP:", + "paymentbuttons-paypal-layout": "horizontal", + "paymentbuttons-paypal-color": "gold", + "paymentbuttons-paypal-shape": "pill", + "paymentbuttons-paypal-size": "small", + "paymentbuttons-paypal-label": "checkout", + "paymentbuttons-paypal-tagline": true, + "paymentbuttons-paypal-fundingicons": false + }, +``` + + + +#### Page Builder Customization +Adding the above keys to the `config.json` file will enable Smart Buttons on a Stencil theme, however, the merchant will **not** be able to customize button styles with Page Builder unless setting configurations are added to the `schema.json` file. + + + + + +## Enabling Smart Buttons Customization via Page Builder + +Merchants who enable PayPal powered by Braintree and PayPal Express Checkout can also customize PayPal Smart Buttons via Page Builder. As a theme developer, you can enable PayPal Smart Buttons customization via [Page Builder](https://github.com/bigcommerce/cornerstone/blob/master/schema.json), by appending the following object to the schema.json file: + + +```json Filename="Addition to schema.json file in order to enable Page Builder customization schema.json" showLineNumbers copy +{ + "name": "Payment Buttons", + "enable": "smartButtons", + "settings": [ + { + "type": "checkbox", + "label": "Show Paypal tagline", + "force_reload": true, + "id": "paymentbuttons-paypal-tagline" + }, + { + "type": "checkbox", + "label": "Show funding icons", + "force_reload": true, + "id": "paymentbuttons-paypal-fundingicons" + }, + { + "type": "select", + "label": "Button color", + "id": "paymentbuttons-paypal-color", + "force_reload": true, + "options": [ + { + "value": "gold", + "label": "Gold" + }, + { + "value": "blue", + "label": "Blue" + }, + { + "value": "silver", + "label": "Silver" + }, + { + "value": "black", + "label": "Black" + } + ] + }, + { + "type": "select", + "label": "Button shape", + "id": "paymentbuttons-paypal-shape", + "force_reload": true, + "options": [ + { + "value": "pill", + "label": "Pill" + }, + { + "value": "rect", + "label": "Rectangle" + } + ] + }, + { + "type": "select", + "label": "Button size", + "id": "paymentbuttons-paypal-size", + "force_reload": true, + "options": [ + { + "value": "small", + "label": "Small" + }, + { + "value": "medium", + "label": "Medium" + }, + { + "value": "large", + "label": "Large" + }, + { + "value": "responsive", + "label": "Responsive" + } + ] + }, + { + "type": "select", + "label": "Button content", + "id": "paymentbuttons-paypal-label", + "force_reload": true, + "options": [ + { + "value": "checkout", + "label": "Paypal Checkout" + }, + { + "value": "pay", + "label": "Pay with Paypal" + }, + { + "value": "buynow", + "label": "Buy Now" + }, + { + "value": "paypal", + "label": "Paypal" + } + ] + }, + { + "type": "select", + "label": "Display style", + "id": "paymentbuttons-paypal-layout", + "force_reload": true, + "options": [ + { + "value": "horizontal", + "label": "Show buttons horizontally" + }, + { + "value": "vertical", + "label": "Show buttons vertically" + } + ] +``` + + + +#### Mutually exclusive options +Some customization options are mutually exclusive, meaning when used in combination with other customization options, the smart button will completely fail to render on the page. +All mutually exclusive options are tied to the layout setting `vertical.` If your layout setting is `vertical,` take note of the following customization **restrictions**: + * If you have a layout setting of `vertical`, you **can not** have a button size of `small`. + * If you have a layout setting of `vertical`, you **can not** customize the `branding` of the button. + * If you have a layout setting of `vertical`, you **can not** customize the `tagline` of the button. + * If you have a layout setting of `vertical`, you **can not** customize the `funding icons` settings. + + +## Resources + +### Related Articles + +* [PayPal Checkout Customization](https://developer.paypal.com/demo/checkout/#/pattern/checkout) (PayPal) diff --git a/docs/stencil-docs/deploying-a-theme/bundling-and-pushing.mdx b/docs/stencil-docs/deploying-a-theme/bundling-and-pushing.mdx new file mode 100644 index 000000000..74abae835 --- /dev/null +++ b/docs/stencil-docs/deploying-a-theme/bundling-and-pushing.mdx @@ -0,0 +1,160 @@ +# Bundling and Pushing a Theme + + + +## Confirm dependencies + +If you have customized a theme originally downloaded from the BigCommerce Theme Marketplace: Before you package your theme, make sure your theme directory includes all the dependencies that BigCommerce requires for submission. + + +Follow the link for your scenario: + +If you downloaded a refreshed version of Stencil's default Cornerstone theme: Run `npm install` in the theme directory to install refreshed JavaScript dependencies, as outlined in [Installing Stencil](/docs/storefront/stencil/cli/install#installing_installing-stencils-js-utilities). + + + + +#### No automatic check for dependencies +The `stencil bundle` and `stencil push` commands do not check for the dependencies that these build systems install. So if those dependencies are missing, these commands will not immediately report errors. However, your resulting .zip file will not properly upload to BigCommerce, and will not run properly on a storefront. + + +## Verify directory and file permissions + +If you have added any new subdirectories or files to your base theme, verify that you have: + +* Set newly added directories to permission `755` (`drwxr-xr-x`). +* Set newly added files to permission `644` (`rw-r--r--`). + + + +#### Writable permissions are required +Without these writable permissions, bundling your theme will fail, blocking its upload to BigCommerce. + + +## Bundling your theme + +Once you have verified the requirements above, you are ready to process and package your theme for upload to BigCommerce. Stencil CLI provides two options for creating a zip file that contains all of your theme's essentials while excluding redundant components. The options are either only bundling your theme, or bundling and pushing your theme. These options are available depending on how you've [authorized](/docs/storefront/stencil/cli/unexpected-behavior#stencil-start-errors) your theme: + + +### Bundle only + +The `stencil bundle` command bundles your theme into a zip file which may be uploaded to a BigCommerce store. + + +The `bundle` command will notify you of its progress and completion, as well as any errors that prevent bundling. + +#### Check/Adjust zipfile's size + +Check the resulting zip file's size before you proceed. The zipped bundle should be only a few megabytes. BigCommerce imposes a hard limit of 50 MB, and any file size approaching that is problematic. If your zip file fits comfortably within the size limit above, jump directly to [Pushing Your Theme](/docs/storefront/stencil/deployment/upload#pushing-your-theme). However, if your zip file approaches or exceeds 50 MB, you must first use one of these procedures to restructure your theme to a manageable size for upload to BigCommerce: + + +* [Shrinking Your Theme by Excluding Static Assets (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV#manual) +* [Staging a Theme for CDN Delivery](https://support.bigcommerce.com/s/article/Optimizing-Your-Images#imageop-cdn) + +### Bundle and push + +The `stencil push` command is available only for themes that you have successfully initialized using a [Stencil CLI token](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating) (with `Themes: modify scope`). This command bundles your theme and uploads it to the associated store, in one continuous process. + +For further requirements and usage details, please see the _Command-Line Upload_ in [Pushing Your Theme](/docs/storefront/stencil/deployment/upload#pushing-your-theme) below. + +For file-size error diagnostics and workarounds, please _Check/Adjust Zipfile's Size_ above. + +### Software requirements / resolving lint errors + +* Only use the `stencil bundle` or the `stencil push` command to process and package themes for submission. These commands generate `.zip` files that match BigCommerce's expected structure. They also generate metadata required for your theme to function properly. + +* Do not create `.zip` files using general-purpose archiving software. The resulting files will trigger errors upon upload to BigCommerce. + +* Do not open a bundled theme zip file to add, delete, rename, or update files. Doing so will make your theme unusable in the production store. + + +* If bundling your theme triggers multiple lint errors related to the `bundle.js` file, then your theme is missing the `.eslintignore` file. Please retrieve this file from the [Stencil Cornerstone repo](https://github.com/bigcommerce/cornerstone/blob/master/.eslintignore), then re-run `stencil bundle` or `stencil push`. + +## Pushing your theme + +BigCommerce provides two alternatives for uploading a theme to its associated BigCommerce store. You can perform either a control panel upload, or a command line upload. These options are available depending on how you've authorized your theme: + +### Control Panel upload + +To upload your theme to a store using the BigCommerce Control Panel, first use `stencil bundle` to package your theme into a zip file. Prepare your file according to the instructions in the [Bundle only](#bundle-only) section. + +For the Control Panel's upload steps, see the [Uploading Custom Themes](https://support.bigcommerce.com/s/article/Stencil-Themes#download-upload) article in our Knowledge Base. + +For error codes that you might encounter when uploading a theme – and corresponding workarounds, see [Troubleshooting Theme Uploads](/docs/storefront/stencil/cli/unexpected-behavior). + +### Command line upload + +The `stencil push` command allows you to bundle your theme and upload it to the store, with a single terminal command. To run `stencil push`, you must first: + +Successfully initialize your theme using a [Stencil CLI token](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating) that you created with the `Themes: modify scope`. + +Install Stencil CLI version 1.12.0 or higher. + +To check your current Stencil CLI version, enter `stencil --version` or `stencil -V` on the command line. If you need to update an earlier version, reinstall Stencil CLI. + +### Pushing a theme + +To initiate bundling and pushing, enter the following on the command line: + +`stencil push` + +Stencil CLI displays the same notifications, prompts, and selection options you would receive when using the control panel's GUI. The following sections will describe the notifications and interactions you might see. + +To push a theme and activate a particular variation without being prompted, use `stencil push -a VARIATION_NAME` with the name of the variation. For example, `stencil push -a Light` will activate the "Light" variation. If you simply use `stencil push -a` without a variation name, the first variation will be applied. + +To push a theme and apply it to selected channels, use `stencil push -a -c 123 456`. To apply a theme to all available channels, use `stencil push -a -allc`. + +If you are already at your theme limit, you can automatically delete the oldest theme on your store using `stencil push -d`. You can use the combination, `stencil push -a -d`, to give the best chance of the upload working without any interaction, which is desirable for automated deployments of Stencil CLI. + +### Successful bundling + +Stencil CLI will display `ok` confirmations, or `not ok` errors, or `warnings` for individual substeps in bundling and uploading your theme. If bundling is successful, you will next see a `Processing` progress bar to track the upload. + +![bundling](https://storage.googleapis.com/bigcommerce-production-dev-center/images/bundling.png) + +### Successful upload + +Upon successful upload, you will receive the prompt, `Would you like to apply your theme to your store at ? (y/N)`. Any response except `y` or `Y` processes as "No." You can always apply the theme later through the control panel. + +### Apply which variation? + +If you chose to apply the newly uploaded theme, you will receive the prompt: "Which variation would you like to apply? (Use arrow keys)" + +![which variation](https://storage.googleapis.com/bigcommerce-production-dev-center/images/which-variation.png) + +Use your arrow keys to move the selection caret/highlight to the variation you want, and then press `Enter`. + +Stencil CLI will then confirm which variation is active on the storefront. + +![select variation](https://storage.googleapis.com/bigcommerce-production-dev-center/images/select-variation.png) + +## Theme quota warning + +If you run `stencil push` when your store's **My Themes** section has reached its maximum of 20 themes, you will receive a prompt to select at least one existing theme for deletion. + +![theme quota warning](https://storage.googleapis.com/bigcommerce-production-dev-center/images/theme-quota-warning.png) + +Custom themes – which are available for selection – will have a circle to their left. Marketplace themes and the store's active theme – all of which are protected from deletion – will be flagged `(Disabled)`. + +Use your arrow keys to move the selection caret to each theme/version that you want to select. Then press the spacebar to select it. (Filled circles will indicate your selected themes/versions.) + +If you are certain of your selections, you can press **Enter** to delete the themes. + + + + + #### Select carefully – no confirmation + Once you press `Enter`, the selected themes will be deleted immediately, with no further confirmation. + If you have any doubts – especially about deleting multiple themes/versions – it is safest to delete them through the control panel GUI. This GUI allows you to compare uploaded versions and to inspect their metadata. + + +## Other bundling or upload errors + +For any other `not ok` bundling or upload errors that you receive, please refer to these debugging guidelines Theme setup and sizing diagnostics in preceding sections throughout this page, or the following article titled [Troubleshooting Theme Uploads](/docs/storefront/stencil/cli/unexpected-behavior). + +## Resources + +### Related articles +* [Naming Your Theme and Theme Variations](/docs/storefront/stencil/themes/foundations/variations) +* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) +* [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images) diff --git a/docs/stencil-docs/deploying-a-theme/checking-a-themes-size.mdx b/docs/stencil-docs/deploying-a-theme/checking-a-themes-size.mdx new file mode 100644 index 000000000..15f4e1880 --- /dev/null +++ b/docs/stencil-docs/deploying-a-theme/checking-a-themes-size.mdx @@ -0,0 +1,95 @@ +# Checking a Theme's Size + + + +Ideally, your theme should bundle into an archive of only a few megabytes (MB). BigCommerce imposes a hard limit of 50 MB, but most themes do not approach this limit unless they include many large static assets. If your theme does not exceed 50 MB, follow the steps outlined in [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) to process and package your theme for upload to BigCommerce. + + +If your theme exceeds the 50 MB limit, you have two options: + +* Shrink your theme with the help of WebDAV. +* Stage your theme for CDN delivery. + +## Shrinking a theme + +### Restructuring your theme + +In this section, you will first isolate static assets from your theme's local directory, then use WebDAV to cloud-host those assets, and finally reference those assets using Stencil's `{{cdn}}` Handlebars helper. For an existing theme, make a backup of your whole `theme‑name` directory before proceeding. + +Examine your theme's `assets` subdirectory and its intended contents. Check for large static assets like images, especially in `assets/img/`, and videos that are likely to cause a bundled ZIP file to exceed BigCommerce's 50 MB limit. + +Use WebDAV to upload these items to WebDAV's `remote /content/` directory. For more information on WebDAV, see [Connecting to WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). + +Throughout your theme, reference each of these assets using Stencil’s `{{cdn}}` Handlebars helper, prepending the `webdav:` option to the `assetPath` parameter. + +Prepending `webdav:` will build a URL in the remote WebDAV directory. This allows your theme's deployed topology to diverge from your local directory structure. The `{{cdn}}` helper will treat `content` as the root WebDAV directory. + +For example, this statement + + +``` + +``` + +will build the following URL: + +``` + +``` + +On your local machine, move the large static assets to a location where the `stencil bundle` command will ignore them. This can be a location outside your theme's directory, or it can be the `assets/cdn/` subdirectory, which `stencil bundle` excludes from bundling. Separating these assets is necessary to exclude them from the next step. + +Run the `stencil bundle` command from inside your streamlined `theme‑name` directory. Once your resulting ZIP file is 50 MB or smaller, you are ready to upload it to BigCommerce. For more information, see [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload). + + + + #### URL references to assets + Both in production and locally, subdirectories of your theme's `assets` directory, such as `img`,`js`, and `fonts`, are parallel to its `scss` subdirectory. Within your CSS, path references to such assets should reflect this parallel relationship, for example: `../img/test.jpg`. + + +### WebDAV folders and Stencil themes + +If you have used WebDAV in developing BigCommerce's Blueprint generation of themes, you will see some differences when uploading Stencil themes. Depending on the type of theme that is active in the merchant's store, the directories accessible through WebDAV will change as shown in the table below. + +| Blueprint theme | Stencil theme | +| ----------- | ----------- | +| `content` | `content` | +| `product_images` | `product_images` | +| `product_downloads` | `product_downloads` | +| `import_files` | `import_files` | +| `exports` | `exports` | +| `template` | - | +| `mobile_template` | - | + +The overall difference is that the WebDAV `template` and `mobile_template` directories are **not** available for Stencil themes. These templates must reside and remain within your Stencil theme's local directory and file structure. + +## Organizing a theme + +For themes that would otherwise exceed BigCommerce's 50 MB limit on uploads, delivering your theme's large static assets using a CDN is an alternative to WebDAV. + +The advantage of this alternative is that all assets stay within your theme's directory, so your theme's local structure matches its deployed structure. The disadvantage is that the procedure outlined below requires the expense of a CDN. + +To stage your theme for CDN delivery, you would locally store your large static assets within your theme's +`assets/cdn/` subdirectory. By design, the `stencil bundle` command omits this subdirectory's contents. So those contents do not count against the 50 MB limit on the resulting ZIP file. + +As you develop your theme, reference each of these assets using Stencil's `{{cdn}}` custom Handlebars helper, for example: + +``` + +``` + + + + The presumed WebDAV root directory is `content`. In this example, the `image.jpg` file had been uploaded to the WebDAV `content` directory. The presumed local directory for other CDNs is `assets`, so you can omit that path when referencing its contained files or subdirectories. + + + +When you are ready to upload your theme to BigCommerce, follow the process outlined in [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload). + +## Resources + +### Related articles +* [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) +* [Naming Your Theme and Theme Variations](/docs/storefront/stencil/themes/foundations/variations) +* [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images) +* [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV#manual) (BigCommerce Knowledge Base) diff --git a/docs/stencil-docs/deploying-a-theme/naming-your-theme.mdx b/docs/stencil-docs/deploying-a-theme/naming-your-theme.mdx new file mode 100644 index 000000000..00dec6047 --- /dev/null +++ b/docs/stencil-docs/deploying-a-theme/naming-your-theme.mdx @@ -0,0 +1,123 @@ +# Working with Theme Variations + + + +## Naming your theme + +The basic details of the Cornerstone theme are outlined in the theme's configuration file, [`config.json`](https://github.com/bigcommerce/cornerstone/blob/master/config.json). You can update the Cornerstone's `config.json` file to reflect your theme's values, such as name, version number, and documentation URL. + + +Here are the first key-value sets in Cornerstone's `config.json`: + +```json filename="Cornerstone settings config.json" showLineNumbers copy +{ + "name": "Cornerstone", + "version": "4.9.0", + "meta": { + "price": 0, + "documentation_url": "https://support.bigcommerce.com/articles/Public/Cornerstone-Theme-Manual", + // ... + } +} +``` + +The following example shows how to change Cornerstone's configurations to reflect your own theme's name, version number, price on Theme Marketplace, and documentation URL: + + +```json filename="Cornerstone settings config.json" showLineNumbers copy +{ +"name": "MyTheme", +"version": "1.1.2", +"meta": { + "price": 10000, + "documentation_url": "https://www.mywebsite.com/theme-docs/my-theme.html", + // ... + } +} +``` + +## Creating and naming a new theme variation + +You define variations in your theme's `config.json` file. Below is the Cornerstone Light variation's definition from Cornerstone's `config.json`: + + +```json filename="Cornerstone Light theme variation settings config.json" showLineNumbers copy + "variations": [ + { + "name": "Light", + "id": "light", + "meta": { + "desktop_screenshot": "desktop_light.png", + "mobile_screenshot": "mobile_light.png", + "description": "Ideal for a wide range of businesses and brands, this design is fully responsive, simple, and ready for you to add your branding, logo, and products. It comes ready to build a clean looking and beautiful store with features such as homepage carousel, social media icons, featured and top selling products, and faceted search (which is available on select BigCommerce plans). Fully express your brand by using our Theme Editor to quickly and easily style your site's fonts and colors, all without the need to write code.", + "demo_url": "https://cornerstone-light-demo.mybigcommerce.com", + "optimized_for": [ + "multi_purpose", + "mobile_tablet_desktop", + "sales_discounts", + "large_catalog" + ], + //... + }, + //.. + }, +``` + +Try inserting your custom variation into the `variations` object of Cornerstone's `config.json`. Your variation's definition might look something like this: + + +```json filename="Example theme variation definition config.json" showLineNumbers copy +"variations": [ +// ... + { + "name": "MyCustomVariation", + "id": "my_custom_variation", + "meta": { + "desktop_screenshot": "my_custom_desktop_screenshot.jpg", + "mobile_screenshot": "my_custom_mobile_screenshot.png", + "description": "This is a really cool custom style of the Stencil Theme", + "demo_url": "https://stencil-custom.mybigcommerce.com", + "optimized_for": ["fashion", "image_heavy", "etc"], + "industries": [] + }, + }, + // ... +``` + +## Changing a theme variation's font family + + +To learn more about defining variations, see [Defining Global Styles](/docs/storefront/stencil/themes/foundations/global-styles). In particular, note the option to configure settings and variables that are scoped to each variation. + +The following example shows how to set the body font of a theme variation to a specific typeface/family by inserting the `body-font-family` key into the `settings` object: + +```json Filename="Example body font variation config.json" showLineNumbers copy +{ + "name": "MyCustomVariation", + "id": "my_custom_variation", + "settings": { + // ... + "body-font-family": "MyCoolFont, AnotherFont, sans-serif", + // ... + } +} +``` + +## Preparing a variation's thumbnails + + +For details on preparing screenshots that enable merchants to preview each variation, and to preview your theme as a whole in the BigCommerce control panel and Theme Marketplace, see [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images). + + + + #### Using Stencil CLI to change variations + To locally test/debug a specific variation of your theme, launch it by invoking the Stencil CLI's `stencil start -v` switch. Enter the following code into the terminal, replacing `variation-name` with your theme's variation name as listed in `config.json`: + `stencil start -v variation-name` + + +## Resources + +### Related articles +* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) +* [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images) +* [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) diff --git a/docs/stencil-docs/deploying-a-theme/preparing-thumbnail-images.mdx b/docs/stencil-docs/deploying-a-theme/preparing-thumbnail-images.mdx new file mode 100644 index 000000000..e41a47f1c --- /dev/null +++ b/docs/stencil-docs/deploying-a-theme/preparing-thumbnail-images.mdx @@ -0,0 +1,101 @@ +# Preparing Thumbnail Images + + + +## Displaying theme thumbnail images + + +A complete Stencil theme includes screenshots to display the theme on cards that appear in two locations within a non active MSF BigCommerce control panel: + + +* **Storefront** › **Themes**: Each individual card displays a composite which is an image that contains combination of screenshots of the theme's multiple variations. +* **Storefront** › **Themes Marketplace**: Each card displays one variation of your theme. The three variations of Cornerstone (Light, Warm, and Bold) are displayed across three separate cards. + +![Desktop View of My Themes](https://storage.googleapis.com/bigcommerce-production-dev-center/images/my-themes-desktop.png "Desktop View of My Themes") + +![Desktop View of Themes Marketplace](https://storage.googleapis.com/bigcommerce-production-dev-center/images/themes-marketplace-desktop.png "Desktop View of Themes Marketplace") + +![Mobile View of Themes Marketplace](https://storage.googleapis.com/bigcommerce-production-dev-center/images/themes-marketplace-mobile.png "Mobile View of Themes Marketplace") + +## General image requirements + +All screenshots described below must meet the following specifications in order for the `stencil bundle` command to be able to process them: +* Must be saved to a supported image file type: .jpg, .jpeg, .png, or .gif. +* Must be stored in your [meta/](https://github.com/bigcommerce/cornerstone/tree/master/meta) subdirectory. +* Must be in **portrait aspect ratio**. + +## Theme-wide composite image + +The theme-wide composite image represents your theme in a non-active MSF BigCommerce control panel's **Storefront** › **Themes**, which shows merchants their currently available themes, including any custom uploaded themes. + + +This file will normally be a mosaic of screenshots from multiple variations within your theme. It must meet the following requirements, beyond the general specifications above: + +* Resolution of 600 x 760 pixels (horizontal x vertical). +* File size smaller than 2 MB. +* Arbitrary filename prefix, referenced in your [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json) file as the `meta` object's `composed_image` key value. + +Here is an example of a compliant file type and location: + +`meta/composed.png` + +Here is how you would reference this file within [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json). + +```js copy showLineNumbers +{ + // [...] + "meta": { + [...] + "composed_image": "composed.png", + // [...] +} +``` + +## Variations: desktop and mobile screenshots + +Each variation within your theme must be represented by two additional screenshots if you want that variation to appear in a non-active MSF control panel's **Storefront** › **Theme Marketplace**, which shows merchants the themes that are available for download. + +### Desktop screenshot + +The first screenshot, showing your theme on a desktop viewport, must meet the following requirements beyond the general specifications above: +* Resolution of 2048 x 2600 pixels. + +* File size smaller than 5 MB +* Arbitrary filename prefix, referenced in your [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json) file as the `variations` object's `desktop_screenshot` key value. + +### Mobile screenshot + +The second screenshot, showing your theme on a mobile viewport, must meet the following requirements beyond the general specifications above: +* Resolution of 304 x 540 pixels. + +* File size smaller than 1 MB. +* Arbitrary filename prefix, referenced in your [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json) file as the `variations` object's `mobile_screenshot` key value. + +Below is an example showing two files of compliant types and location. + +* `meta/desktop_bright.png` +* `meta/mobile_bright.png` + +Here is how you would reference these files within [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json), for a variation named `Bright`: + +```js showLineNumbers copy +// [...] + "variations": [ + { + "name": "Bright", + "id": "bright", + "meta": { + "desktop_screenshot": "desktop_bright.png", + "mobile_screenshot": "mobile_bright.jpg", + // [...] + } + ] + +``` + +## Resources + +### Related articles +* [Naming Your Theme and Theme Variations](/docs/storefront/stencil/themes/foundations/variations) +* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) +* [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) diff --git a/docs/stencil-docs/deploying-a-theme/theme-best-practices.mdx b/docs/stencil-docs/deploying-a-theme/theme-best-practices.mdx new file mode 100644 index 000000000..94a33e69e --- /dev/null +++ b/docs/stencil-docs/deploying-a-theme/theme-best-practices.mdx @@ -0,0 +1,143 @@ +# Theme Development Tutorial + +In this tutorial, you will learn the correct way to import theme images and inject theme variables. Also, you will learn how to improve theme designs using [Lighthouse](https://developer.chrome.com/docs/lighthouse/overview) and [accessibility best practices](/docs/storefront/stencil/themes/accessibility). + +## Importing images +There are two ways to import images. The steps below describe the quickest and easiest way to import images. +1. Connect to your store using the [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV) client of your choice. +2. Add images to the `/content` directory. +3. Upload the images using a WebDAV client. You can access the images within the theme using the `cdn` Handlebars helper as follows: + +```handlebars filename="cdn helper" copy +{{cdn "webdav:/img/image.jpg"}} +``` +The WebDAV import option allows you to upload images in bulk. However, we recommend that you only select the specific files needed. Importing the entire markup folder or unessential files can affect page load time. + +To learn about the BigCommerce folder structure best practices, see the [Folder Structure](https://support.bigcommerce.com/s/article/File-Access-WebDAV#folder) page in the Help Center. + +The second way to import images is to use the image manager within the control panel: +1. In the control panel, go to **Storefront** > **Image Manager**. +2. Click **Upload images...** +3. Click **Choose File** (or **Browse**) and select an image from your computer. Repeat for each additional image. +4. Click **Upload**. + +When importing images, ensure your images are high quality, the appropriate dimensions, and are low byte sizes. Doing this increases a store's site speed. We recommend using Stencil themes that support responsive images. Once you have selected a theme, upload the images you have, and BigCommerce will optimize them. We recommend JPEGs over other formats. For more details on how to optimize images, see [Optimizing your Images](https://support.bigcommerce.com/s/article/Optimizing-Your-Images). + +## Injecting variables + +Injecting JavaScript context variables allow you to access store data through your theme. You can inject JavaScript context variables using the `{{inject}}` Handlebars helper. Be sure to assign a custom variable name to the injected variable. + +You can then use the `{{jsContext}}` Handlebars helper to access a stringified JSON object containing all injected data with your assigned custom variable names as keys in the key-value pairs. For more information, see [injection helpers](/docs/storefront/stencil/themes/context/handlebars-reference#inject). + +The code example below uses `{{inject}}` and `{{jsContext}}` to log the product name to your browser's console when added to Cornerstone's `product.html` file: + +```handlebars filename="product.html" showLineNumbers copy +{{inject "myProductName" product.title}} + + +``` + +We recommend injecting only the variables you need. If you inject all settings, you could accidentlly inject PII (Personally-Identifying Information) and cause performance issues with your site. + +## Using Lighthouse + +Google [Lighthouse](https://developers.google.com/web/tools/lighthouse) is an open-source tool used to improve web page performance, quality, and accessibility. Enter a URL into Lighthouse, and it will generate a series of audits against the page. We highly encourage you to use Lighthouse as a validation step. + +We recommend that you use Lighthouse to focus on the following metrics for optimizing your BigCommerce store. +* [Largest Contentful Paint](#largest-contentful-paint) +* [First Input Delay](#first-input-delay) +* [Cumulative Layout Shift](#cumulative-layout-shift) + +### Largest Contentful Paint +Largest Contentful Paint (LCP) is the metric that reports the time it takes to display the largest image on the screen. This metric is important because page speed ensures visitors receive the best performance and presentation of the site. + + + #### Good score + The optimal LCP score is 2.5 seconds or faster. + + +To improve LCP: +* Make images smaller or remove anything preventing a quick download. +* Avoid JavaScript or external scripts to load images. +* Use an image CDN. +* Optimize your server. + +### First Input Delay +First Input Delay (FID) is the metric that measures the delay users experience when interacting with a page. It is the time it takes for the site to respond when a user clicks a link, selects a button, taps on the screen, etc. + + + #### Good score + The optimal FID score is 100 milliseconds or less. + + +To improve FID: +* Reduce the effect of third-party code. +* Reduce JavaScript execution time. +* Reduce the duration of your longest task. + +Lighthouse does not display FID since measuring the response delay requires real user interaction. Instead, Lighthouse displays Total Blocking Time (TBT) to gauge how long a page takes to become useable. TBT is the sum of task loading time over 50ms measured between the first text or image rendering and the time it takes for a fully interactive page. Improvements to TBT will also improve your FID score. + +A good TBT score is 300 milliseconds or less. + +### Cumulative Layout Shift + +Cumulative Layout Shift (CLS) is the metric that measures visual stability. This metric measures how often users experience unexpected layout shifts. A layout shift is when a visible element changes its position from one rendered frame to the next. For example, a layout shift can occur when a user views a page and a video moves on top of the home carousel. These unexpected movements can result in an unpleasant experience for the user. + + + #### Good score + The optimal CLS score is 0.1 seconds or less. + + +To improve CLS: +* Add size attributes to elements. +* Reserve space for injected content. +* Avoid inserting ads or banners dynamically. +* Load critical CSS before the content. + +### Optimization example + +In this example, the performance score is currently 47. The LCP score is 6.2 s, the TBT score is 410 ms, and the CLS score is 1.137, which are all less than optimal scores. + +![Performance Metrics](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/performance-example-1.png "Performance Metrics") + +To improve performance, let's start by measuring usused JavaScript. In Chrome DevTools, the **Lighthouse** and **Coverage** tabs offer suggestions of unused JavaScript code that you can potentially remove. The red section of the bar represents unused bytes; the green section represents used bytes. It is important to note that unused JavaScript means your page has not used it yet. The JavaScript in red might be connected to event listeners that only fire when a user interacts with your page. + +![Coverage tab](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/performance-example-2.png "Coverage tab") + +In addition to removing unused code, you can minify, compress, and refactor CSS and JavaScript files by removing line breaks, whitespace, and comments. + +```css filename="Example, Part 1: Not minified" showLineNumbers copy +.element-class { +padding: 1px 5px 1px 5px; +font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Courier New, monospace, serif; +background-color: #eeeeee;} +``` +  +```css filename="Example, Part 2: Minified" showLineNumbers copy +.element-class{padding: 1px 5px 1px 5px;font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;background-color: #eee;} +``` + +Lighthouse displays information relevant to elements contributing to the CLS score. In this example, the banner above the carousel causes a loading issue. Once the image is resized or removed the CLS score improves. + +After removing some unused bytes, minifying JavaScript files, and resizing an image, the performance score is 77. The LCP score is now 4.3 s, the TBT score is 120 ms and the CLS score is 0.001. You can continue to remove additional unused bytes to improve your performance score and metrics. + +![Improved Performance Metrics](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/performance-example-3.png "Improved Performance Metrics") + +Using Lighthouse is an important step in optimizing your site and improving the user experience. It is an easy to use best practice tip that provides powerful insights. + +## Designing for accessibility + +Accessible sites have benefits, including faster load speed, better SEO, and useful for marketing your product. See [Developing Themes for Accessibility](/docs/storefront/stencil/themes/accessibility) for more information. + +## Related resources +- [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV)(Knowledge Base) +- [Lighthouse](https://developers.google.com/web/tools/lighthouse) +- [Designing for Accessibility](/docs/storefront/stencil/themes/accessibility) +- [Folder Structure](https://support.bigcommerce.com/s/article/File-Access-WebDAV#folder) diff --git a/docs/stencil-docs/deploying-a-theme/troubleshooting-theme-uploads.mdx b/docs/stencil-docs/deploying-a-theme/troubleshooting-theme-uploads.mdx new file mode 100644 index 000000000..0cfda4c4a --- /dev/null +++ b/docs/stencil-docs/deploying-a-theme/troubleshooting-theme-uploads.mdx @@ -0,0 +1,68 @@ +# Troubleshooting Theme Uploads + + + +## Restrictions + +Custom theme uploads must meet these restrictions: + +* You may upload a maximum of 20 custom themes at a time to the control panel's `Storefront` > `My Themes` section. +* If you reach this maximum, you can delete custom themes to make room for more uploads. +* Before uploading, you must package custom themes into a Stencil-specific zip file format, using Stencil CLI's `stencil bundle` command. +* A theme's zip file must be no larger than 50 MB. If your file exceeds that size, please use either a WebDAV or a CDN upload to exclude large static assets. +* Generated parsed template files must be less than 1 MB. + +## Error codes + +| Error code | Meaning | +|:- | - | +| TR-100, -101, -700, -1200, -1300 | A server error occurred. | +| TR-200 | Problem uploading the theme. | +| TR-300 | Invalid zip file. (Among other possible root causes, this can indicate an included `bundle.js.map` source-map file that exceeds its size limit of 5 MB. As a workaround, move this file outside your theme directory before re-running `stencil bundle`.) | +| TR-301 | Failed to unzip file. | +| TR-400 | The zip contains restricted/invalid file(s) - e.g., a file with an invalid extension. | +| TR-500 | The zip file is larger than the 50 MB limit, or the parsed JSON for templates exceeds the 1 MB size limit. | +| TR-600 | The zip file is missing a required file (`theme-name/templates/pages/home.html`). | +| TR-601 | The zip file is missing some parsed template file(s); or, one or more non-`.html` files are present in the `theme-name/templates/` subdirectory. | +| TR-800 | There was a problem processing the contained `config.json` file. Please check the `config.json` documentation for the required keys and for keys that require values. | +| TR-900 | The contained `config.json` file is missing the required developer information. | +| TR-901 | A theme variation defined in the contained config.json file is missing its required external ID. | +| TR-902 | Two or more theme variations defined in the contained config.json file share an external ID. All external IDs must be unique. | +| TR-1000 | There was a problem processing the contained schema.json file. | +| TR-1001 | The theme is missing its required schema.json file. | +| TR-1400 | There was a problem processing template front matter. | +| TR-1401 | There was a database validation error when saving front matter to the database. | +| TR-1500 | There was a problem uploading your files due to multi-threading (multiple simultaneous uploads). Please try again. | +| TR-1600 | There was a temporary problem on our system. Please try again. | +| TR-1601 | There was a problem with processing screenshots. | +| TR-1700, -1800, -1801, -1802, -1803 | System error, possibly temporary. Please try again. | +| TR-3402 | You are not allowed to edit your active theme. [Please select **Make a Copy**, then edit the resulting copy of your theme.] | +| TR-4400 | One or more values in the `config.json` file exceed the 64-character limit. (The 64-character limit only applies to values in `config.json` that are both greater than 64 characters and mapped to a text input in the theme's `schema.json` file.) | + +## Warnings + +Warnings will not block a theme's upload, but these onscreen and/or log messages notify you of problems within the zipped theme. Here are the warnings and their meanings: + +| Warning | +|-| +| (These messages do not have numeric codes) | +| Issue in processing this theme's thumbnail screenshot (`composed_image`). | +| Issue in processing this theme's full-size screenshot (`desktop_screenshot`). | +| Issue in processing this theme's mobile [screenshot](/docs/storefront/stencil/themes/context/object-reference/config#configjson) (`mobile_screenshot`). | +| Missing file: This theme does not support the Theme Editor, as it is missing its required `[schema.json]` file. | +| One or more of this theme's screenshots are not image files. | +| Theme is missing a valid thumbnail image (`composed_image`). | +| Theme is missing a valid full-size image (`desktop_screenshot`). | +| Theme is missing a valid mobile image (`mobile_screenshot`). | +| One or more of this theme's images is not of a supported file type. Valid filetypes are: JPEG, PNG, GIF. | +| Thumbnail (`composed_image`) image dimensions are not right. The expected dimensions are 600 x 760 pixels. | +| Full-size (`desktop_screenshot`) image dimensions are not right. The expected dimensions are 2048 x 2600 pixels. | +| Mobile (`mobile_screenshot`) image dimensions are not right. The expected dimensions are 304 x 540 pixels. | +| Too-large image file size for a theme screenshot `composed_image` (thumbnails), `desktop_screenshot`, or `mobile_screenshot`] . The maximum supported size is x, but the file's actual size is y. | + +## Workarounds and further info +* When using a Windows machine, it is necessary to close PowerShell and re-open as admin before installing nvm. + +* If a custom theme does not render properly after you upload and apply it to a storefront, make sure you have created the theme's zip file using the `stencil bundle` command, on a Mac OS, Linux computer, or virtual machine. Using the `stencil bundle` command will exclude Windows-specific errors that have occurred on some bundles. + +* If you repeatedly encounter the same error or warning and neither this page nor our KB resolves the problem, see support resources for theme developers in our [Developer Community](/community). diff --git a/docs/stencil-docs/developing-further/add-recaptcha-v2.mdx b/docs/stencil-docs/developing-further/add-recaptcha-v2.mdx new file mode 100644 index 000000000..89f050895 --- /dev/null +++ b/docs/stencil-docs/developing-further/add-recaptcha-v2.mdx @@ -0,0 +1,25 @@ +# Adding reCAPTCHA V2 + + + +reCAPTCHA v1 was deprecated as of March 31, 2018. To deter spam submission through storefront forms, BigCommerce now supports Google reCAPTCHA v2 challenges, to distinguish human customers/visitors from automated bots. We recommend that all storefront themes take advantage of this upgraded bot detection. + +If you have based your theme on a theme/version that already incorporates reCAPTCHA v2, you do not need to take any further action. Compliant themes/versions currently are listed in [Updating Themes with reCAPTCHA V2](https://support.bigcommerce.com/s/article/Updating-Themes-with-reCAPTCHA-v2#updatingthemes) (Knowledge Base). + +## How to Upgrade + +To add reCAPTCHA v2 support to a theme, update script references in three template files. You can find them in the following subdirectories of the `{theme-name}/templates/` directory: + +- [pages/auth/create-account.html](https://github.com/bigcommerce/cornerstone/pull/951/files#diff-ecbae6e2b7d5bbf5c950d68878e79d99) +- [components/products/modals/writeReview.html](https://github.com/bigcommerce/cornerstone/pull/951/files#diff-945a5d7f1563068188ae39df568cfd43) +- [components/pages/contact-us-form.html](https://github.com/bigcommerce/cornerstone/pull/951/files#diff-5351402159301e1c225752f03d9f1f8e) + +See [PR #951](https://github.com/bigcommerce/cornerstone/pull/951) in the Cornerstone GitHub Repository to see differentials for each file that needs to be modified. + +It is possible to add reCaptcha to the Login template. See the [Forms object](/docs/storefront/stencil/themes/context/object-reference/schemas#forms) for details. + +## Resources + +### Related Articles + +* [Enabling ReCAPTCHA](https://support.bigcommerce.com/s/article/Updating-Themes-with-reCAPTCHA-v2) diff --git a/docs/stencil-docs/developing-further/catalog-price-object.mdx b/docs/stencil-docs/developing-further/catalog-price-object.mdx new file mode 100644 index 000000000..9ee346902 --- /dev/null +++ b/docs/stencil-docs/developing-further/catalog-price-object.mdx @@ -0,0 +1,305 @@ +# Using Catalog Price Objects + + + +As a theme developer, you can use the catalog price object to highlight the savings that a merchant is offering over the MSRP directly on the storefront by referencing the product's `price` object and the correct property for the product. + +Merchants can use control panel options to set the following prices for a catalog product: + +| Field | Description | +| ----------- | ----------- | +| Default Price | This is the product’s standard store price. The **Excluding/Including Tax** indicator to the right of the **Default Price** field is applicable to all price fields (**Cost**, **MSRP**, **Sale Price**).| +| Cost | The product's `cost` property is never returned to the storefront by design. Generally, merchants would not want to reveal the true cost of goods to shoppers. The **Cost** field is meant for reports and third-party accounting integrations.| +| MSRP | This field contains the manufacturer's suggested retail price, a price recommended for the sale of an item in all retail outlets. | +| Sale Price | This field is the product's reduced store price. | + + +These options and assigned values are each represented in the catalog price object, allowing theme developers to pull the information and render it onto the storefront to highlight the savings offered by a merchant. + +## Catalog price object examples excluding tax + +### No sale price defined in control panel + +Assume that a merchant has defined the following for a product in the control panel: + +* **Default Price** +* **Cost** +* **MSRP** + +A corresponding catalog price object for the product will be structured as shown below: + +```json filename="Catalog price object, no sale price defined" showLineNumbers copy +{ + "product": { + // ... + }, + "price": { + "without_tax": { + "formatted": "$20.00", + "value": 20 + }, + "tax_label": "Sales Tax", + "rrp_without_tax": { + "formatted": "$25.00", + "value": 25 + }, + "saved": { + "formatted": "$5.00", + "value": 5 + }, + "retail_price_range": { + "min": { + "without_tax": { + "formatted": "$25.00", + "value": 25 + } + }, + "max": { + "without_tax": { + "formatted": "$25.00", + "value": 25 + } + } + } + } +} +``` + +In this example: + +| Property | Description | +| ----------- | ----------- | +| `without_tax` | This property maps to the control panel’s **Default Price** field.| +| `rrp_without_tax` | `rrp` stands for "regular retail price." This property maps to the control panel's **MSRP** field.| +| `saved` | This value is the difference between the existing values for `without_tax` (**Default Price**) and `rrp_without_tax` (**MSRP**).| + +### Sale price defined in control panel + +Assume that a merchant has defined the following for a product in the control panel: + +* **Default Price** +* **Cost** +* **MSRP** +* **Sale Price** + +A corresponding catalog price object for the product will be structured as shown below: + + +```json filename="Catalog price object, sale price defined" showLineNumbers copy +{ + "product": { + // ... + "price": { + "without_tax": { + "formatted": "$15.00", + "value": 15 + }, + "tax_label": "Sales Tax", + "sale_price_without_tax": { + "formatted": "$15.00", + "value": 15 + }, + "non_sale_price_without_tax": { + "formatted": "$20.00", + "value": 20 + }, + "rrp_without_tax": { + "formatted": "$25.00", + "value": 25 + }, + "saved": { + "formatted": "$10.00", + "value": 10 + }, + "retail_price_range": { + "min": { + "without_tax": { + "formatted": "$25.00", + "value": 25 + } + }, + "max": { + "without_tax": { + "formatted": "$25.00", + "value": 25 + } + } + } + } + } +} +``` + +In this example: + +| Property | Description | +| ----------- | ----------- | +| `sale_price_without_tax` | This property maps to the product’s effective price in the control panel's **Sale Price** field. The `sale_price_without_tax` property will directly expose the sale price set on a base product, variant, or price record.| +| `non_sale_price_without_tax` | This property displays the regular store price.| + +Properties noted will only be displayed if a sale price is set on the product. + +### Prices and conditional logic example + +Stencil structures product prices for backward compatibility with the BigCommerce platform's traditional treatment of prices. This behavior enables you to add logic that determines whether to display a strikeout price on the storefront. + +The example below tests for the presence of the `sale_price_without_tax` property. (You could also look for the `sale_price_with_tax` property.) The presence of the `sale_price_without_tax` property means that the product has been given a sale price. + +With the logic below, the page will display a strikeout standard price next to the **Sale Price** field, indicating the current selling price of the product. + + +```handlebars filename="Conditional logic" showLineNumbers copy + {{#or price.sale_price_without_tax price.sale_price_with_tax}} + ... [code to display on-sale strikeout pricing or content for a discounted product] ... + {{/or}} +``` + +## Catalog price object examples including and excluding tax + +Depending on the store’s [**Tax Display Settings**](https://login.bigcommerce.com/deep-links/manage/settings/tax/settings), the `price` object will display prices in one of the following ways: + +* **Including tax** +* **Excluding tax** +* **Including and excluding tax** + +This display setting affects how values are returned in the catalog price object and how the values appear on storefront pages. + +![Configure tax display settings](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Tax-Settings.png "Configure tax display settings.") + +### No sale price defined in control panel + +Assume that a merchant has defined the following tax configurations for a product in the control panel: + +* Show prices on product pages including and excluding tax +* Use a flat rate of 10% tax + +There is no defined sale price for the product. + +A corresponding catalog price object will be structured as shown below: + +```json filename="Product including and excluding tax, no sale price defined" showLineNumbers copy +{ + "product": { + "price": { + "with_tax": { + "formatted": "$165.00", + "value": 165 + }, + "without_tax": { + "formatted": "$150.00", + "value": 150 + }, + "rrp_with_tax": { + "formatted": "$275.00", + "value": 275 + }, + "rrp_without_tax": { + "formatted": "$250.00", + "value": 250 + }, + "saved": { + "formatted": "$110.00", + "value": 110 + }, + "tax_label": "Tax" + } + } +} +``` + +In this example: + +| Property | Description | +| ----------- | ----------- | +| `with_tax` | This property represents the `without_tax` value plus a 10% tax markup.| +| `rrp_with_tax` | This property represents the `rrp_without_tax` value plus a 10% tax markup.| + + + + #### Tax display configurations + The same properties and values are returned for **Including tax** and **Including and excluding tax** display settings. These properties and values are not available for a control panel setting of **Excluding tax**. + + +### Sale price defined in control panel + +Assume that a merchant has defined the following tax configurations for a product in the control panel, alongside a defined sale price: + +* Show prices on product pages including and excluding tax +* Use a flat rate of 10% tax + +```json filename="Product including and excluding tax, sale price defined" showLineNumbers copy +{ + "product": { + "price": { + "with_tax": { + "formatted": "$135.30", + "value": 135.3 + }, + "without_tax": { + "formatted": "$123.00", + "value": 123 + }, + "sale_price_without_tax": { + "formatted": "123.00", + "value": 123 + }, + "sale_price_with_tax": { + "formatted": "135.30", + "value": 135.3 + }, + "rrp_with_tax": { + "formatted": "$275.00", + "value": 275 + }, + "rrp_without_tax": { + "formatted": "$250.00", + "value": 250 + }, + "saved": { + "formatted": "$139.70", + "value": 139.7 + }, + "non_sale_price_without_tax": { + "formatted": "$150.00", + "value": 150 + }, + "non_sale_price_with_tax": { + "formatted": "$165.00", + "value": 165 + }, + "tax_label": "Tax" + } + } +} +``` + +In this example: + +| Property | Description | +| ----------- | ----------- | +| `non_sale_price_with_tax` | This property represents the standard store price with tax.| +| `non_sale_price_without_tax` | This property represents the standard store price without tax.| +| `sale_price_with_tax` and `sale_price_without_tax` | These properties represent the product's defined sale price.| +| `saved` | This value is based on the difference between the `with_tax` and `non_sale_price_with_tax` values.| + +## Control panel quick reference + +The table below explains the mapping between the control panel fields and the catalog price object properties and values. + +| Field | Catalog Price Object Property | Description | +| ----------- | ----------- | ----------- | +| Default Price (excluding tax) |
    • **Sale Price** is defined:
    • `{{ product.price.non_sale_price_without_tax }}`
    • **Sale Price** is not defined:
    • `{{ product.price.without_tax }}`
    | The standard store price for the product. | + Default Price (including tax) |
    • **Sale Price** is defined:
    • `{{ product.price.non_sale_price_with_tax }}`
    • **Sale Price** is not defined:
    • `{{ product.price.with_tax }}`
    | The standard store price for the product, with tax. | + Cost |Cost is not returned in the catalog price object.| This field represents true cost of goods, and is typically meant for reports and third-party accounting integrations. | +MSRP (excluding tax)|`{{ product.price.rrp_without_tax }}`| This field represents the product’s list price, or the manufacturer's suggested retail price. | +MSRP (including tax)|`{{ product.price.rrp_with_tax }}`| This field represents the product’s list price, or the manufacturer's suggested retail price, including tax. | +Sale Price (excluding tax)|`{{product.price.sale_price_without_tax}}`| This product’s discounted/sale price. | +Sale Price (including tax)|`{{ product.sale_price_with_tax }}`| This product’s discounted/sale price, with tax. | +Difference between Default Price and MSRP (*Default Price - MSRP)*|`{{ product.price.saved }}`| The customer’s savings on the effective price versus list price. | + +## Resources + +### Related Articles + +* [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config) +* [Adding a Product](https://support.bigcommerce.com/s/article/Adding-Products-v3#product-details) (BigCommerce Knowledge Base) diff --git a/docs/stencil-docs/developing-further/customizing-emails.mdx b/docs/stencil-docs/developing-further/customizing-emails.mdx new file mode 100644 index 000000000..b6cb41803 --- /dev/null +++ b/docs/stencil-docs/developing-further/customizing-emails.mdx @@ -0,0 +1,19 @@ +# Customizing Emails + + +This article provides information on how to create your own unique email templates using our legacy framework. + + + For information on customizing email templates on our latest theme framework engine, see [Customizing Emails](https://support.bigcommerce.com/s/article/Customizing-Emails) and [Handlebars Email Template Objects](/docs/store-operations/emails/object-reference). + + +## BigCommerce Legacy Email Templates +Email templates provide the framework for the store emails automatically sent to customers. You can edit these templates locally then upload them to the store via WebDav, or make changes to them directly in the store's control panel. For information on which user actions trigger these emails to be sent to a customer, see [Email Template Files and Snippets](https://support.bigcommerce.com/s/article/Customizing-Emails#template-files). + +## Accessing and Editing Legacy Email Templates +To access and edit BigCommerce email templates: + +1. Connect to your store via the WebDav client of your choice. For more on connecting to a store via WebDav, see [File Access (WebDav)](https://support.bigcommerce.com/s/article/File-Access-WebDAV). + +2. Download the base templates from the `/email_templates/` folder. +3. Make changes to the templates locally. Re-upload modified templates to the `/email_templates/` folder. diff --git a/docs/stencil-docs/developing-further/customizing-invoices.mdx b/docs/stencil-docs/developing-further/customizing-invoices.mdx new file mode 100644 index 000000000..e490602ca --- /dev/null +++ b/docs/stencil-docs/developing-further/customizing-invoices.mdx @@ -0,0 +1,79 @@ +# Customizing Invoices + +There are four editable invoices in BigCommerce: + +1. Email invoice +2. Merchant printable invoice +3. Customer printable invoice +4. Detailed merchant printable invoice (Supported by UK, France, and Poland) + +Merchants commonly request developers modify the default content of invoices in order to satisfy specific business requirements and industry demands. In order to assist developers in making these changes, this articles contains instructions on how to edit each invoice. + +## Email invoice template + +To define merchant-facing email invoice templates, see the [Email Templates Overview](/docs/store-operations/emails) and the reference for the [email invoice object](/docs/store-operations/emails/object-reference#invoice). + + +## Merchant printable invoice + +The merchant printable invoice is the invoice that can be printed from the control panel in **Orders** > **View**. Clicking the **...** in the **Action** column will generate a list of options, one option being **Print Invoice**. + +![Print Order Invoice](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/customizing_invoice_print_order_invoice.png "Order Invoice") + +The invoice that is generated by clicking **Print Invoice** relies on template files and variables from [BigCommerce's legacy Blueprint themes framework](/archive/storefront/blueprint/themes/email-templates). This invoice can be customized by performing the following steps: + +1. Download the [invoice_printable.zip](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/invoice_printable.zip) file, which contains the skeleton of a printable invoice. +2. Open the file in the text editor of your choice and edit the HTML file to match your desired customization. +3. Use WebDAV to upload your customized HTML file to WebDAV's /template/ folder. We recommend CyberDuck, the freeware [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client) client, available for Windows and Mac OS. Your store's control panel offers a downloadable connection file pre-filled with most store credentials. + + + **Note** + For a list of available variables, see [Blueprint Email Templates](/archive/storefront/blueprint/themes/email-templates). + + +### Localizing the merchant printable invoice + +Localization of the merchant-printed invoice is handled the same way as system and error storefront messages. `PrintableInvoice.html` relies on the Blueprint template that contains currently undecorated (untranslatable) strings. The following steps describe how to translate a merchant-printed invoice. + +1. Download the [PrintableInvoice.html](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/invoice_printable.zip) file, which contains the skeleton of a printable invoice. +2. Modify the content by replacing variables with their desired translated value. + +| Variable | Value | +|:---------|:------| +| %%LNG_ShippingAddress%% | Shipping Address Translation | +|`%%LNG_Quantity%%`| Quantity Translation| +|`%%LNG_Code%%`| Code Translation | +|`%%LNG_ProdName%%`| Product Name Translation | + +3. Upload the edited templates via [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client). We recommend CyberDuck, the freeware [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client) client, available for Windows and Mac OS. Your store's control panel offers a downloadable connection file pre-filled with most store credentials. +4. Review the merchant printable invoice via the control panel. + +## Customizing the customer printable invoice + +The customer printable invoice is the printable invoice that is available on a storefront's order page for shoppers that have registered accounts with your store. + +![Customer Printable Invoice](https://storage.googleapis.com/bigcommerce-production-dev-center/images/customer-printable-invoice.png "Customer Printable Invoice") + +This invoice becomes available in a shopper's orders after completing an order. A shopper can generate this invoice by clicking **Print Invoice** on the right-hand side of the page. + +As a developer, you can customize this invoice by editing your theme's `invoice.html` file that is present in your theme's files. This file is located in `templates/pages/account/orders/invoice.html`. + +## Customizing the detailed merchant printable invoice + +Use this invoice when a store receives an order from a shipping address in a country which supports PrintableDetailedInvoice. This invoice can be customized by performing the following steps: + +1. Download the [PrintableDetailedInvoice.html](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/PrintableDetailedInvoice.html) file, which contains the skeleton of the detailed printable invoice. +2. Open the file in the text editor of your choice and edit the HTML file to match your desired customization. +3. Use WebDAV to upload your customized HTML file to WebDAV's /template/ folder. We recommend CyberDuck, the freeware [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client) client, available for Windows and Mac OS. Your store's control panel offers a downloadable connection file pre-filled with most store credentials. + +## Resources + +### Related articles + +* [Email Templates Overview](/docs/store-operations/emails) +* [Email Templates Object Reference](/docs/store-operations/emails/object-reference) +* [Shrinking a Theme by Excluding Static Assets Using WebDAV](/docs/storefront/stencil/deployment/theme-size#shrinking-a-theme) +* [Blueprint Theme Email Templates](/archive/storefront/blueprint/themes/email-templates) +* [Uploading and Linking to a File in Your Store (Help Center)](https://support.bigcommerce.com/s/article/How-do-I-add-and-link-to-a-file-in-my-store#upload-a-file) +* [Editing and Printing Invoices (Help Center)](https://support.bigcommerce.com/s/article/Invoices#custom) +* [WebDAV File Access (Help Center)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) diff --git a/docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx b/docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx new file mode 100644 index 000000000..529608c7a --- /dev/null +++ b/docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx @@ -0,0 +1,25 @@ +# Customizing Printable Packing Slips + + + +Developers are commonly asked to modify the default content of packing slips in order to satisfy specific business requirements and industry demands. This article contains instructions on how to edit the HTML file of a printable packing slip. + +## Customizing printable packing slips + +Customizing your Stencil theme’s printable packing slip currently relies on a template and variables from BigCommerce’s legacy Blueprint themes framework. To make changes to the packing slip file, follow these steps: + + +1. Download [printable packing slip .zip](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/packing_slip_printable.zip), which contains the HTML skeleton of a printable packing slip. + +2. Make your customizations to the HTML file. + +3. Upload your customized HTML file to the WebDAV’s `/template/` folder [using WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). Ensure that it is named `packing_slip_print.html` and replaces the default file, or your changes will not be applied. + +## Resources + +### Related Articles + +* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) +* [Blueprint Theme Email Templates](/archive/storefront/blueprint/themes/email-templates) +* [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) (Knowledge Base) +* [Uploading and Linking to a File in Your Store](https://support.bigcommerce.com/s/article/How-do-I-add-and-link-to-a-file-in-my-store#upload-a-file) (Knowledge Base) diff --git a/docs/stencil-docs/developing-further/google-analytics-enhanced-ecommerce.mdx b/docs/stencil-docs/developing-further/google-analytics-enhanced-ecommerce.mdx new file mode 100644 index 000000000..3b3d76743 --- /dev/null +++ b/docs/stencil-docs/developing-further/google-analytics-enhanced-ecommerce.mdx @@ -0,0 +1,184 @@ +# Google Analytics Enhanced ECommerce + +Google Analytics is a free analytics tool that helps you track visitors and conversions on your store. BigCommerce has updated the Google Analytics integration to support Enhanced Ecommerce. As apart of the Enhanced ECommerce feature, Stencil themes now support data attributes. + +Data attributes provide detailed data on the way shoppers interact with your store’s products. However, data attributes are not only limited to only product data collection. Data attributes can also track your store’s header and footer for promotions and can collect data on whether those promotions were viewed and/or clicked. BigCommerce’s data attributes are powered by [Segment](https://segment.com/docs/destinations/google-analytics/) and [Platform.js](https://github.com/segment-integrations/analytics.js-integration-google-analytics/blob/master/lib/index.js), and will send your store’s product data through to Google Analytics. + +Cornerstone versions 2.6.0+ will have data attributes already included in the theme. + + + #### GAEE for Blueprint Themes + While you can implement data attributes with Blueprint themes, we do not currently have specific documentation on how to do this. The data attribute HTML structure, however, will be the same as it is in a Stencil theme. + + + +### Downloading a theme +Data attributes will work on any theme. For this tutorial, we will be adding data attributes to the Cornerstone theme. If you do not already have a local copy of Cornerstone on your machine, see [Downloading Cornerstone](/docs/storefront/stencil/cli/install#authorizing_download). + + +If you would like to implement data attributes on your custom theme and do not already have a copy of your custom theme downloaded, see [Downloading a Marketplace Theme](/docs/storefront/stencil/cli/install#authorizing_download). + + + The remainder of this tutorial will be working off the theme’s base folder `cornerstone`. + + +## Adding data attributes + +### Prerequisites +* [BigCommerce Store](https://support.bigcommerce.com/s/article/Starting-a-Bigcommerce-Trial) +* [Optimized One-Page Checkout enabled](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout) +* [Cornerstone theme installed](/docs/storefront/stencil/start#cornerstone) + +### Include the Enhanced ECommerce property + +1. Open your local copy of your theme and navigate to the theme’s cornerstone/config.json file. + +2. In the `config.json` file, navigate to the features array. There should be a property in this array called `enhanced ecommerce`. If the `enhanced ecommerce` property is not present in the features array, add it. The features object should then look similar to the image below. + +```json filename="Enhanced eCommerce feature: config.json" showLineNumbers copy +"features": [ + "fully_responsive", + "mega_navigation", + "multi_tiered_sidebar_menu", + "masonry_design", + "frontpage_slideshow", + "quick_add_to_cart", + "switchable_product_view", + "product_comparison_table", + "complex_search_filtering", + "customizable_product_selector", + "cart_suggested_products", + "free_customer_support", + "free_theme_upgrades", + "high_res_product_images", + "product_filtering", + "advanced_quick_view", + "product_showcase", + "persistent_cart", + "one_page_check_out", + "product_videos", + "google_amp", + "customized_checkout", + "account_payment_methods", + "enhanced_ecommerce", + "csrf_protection" +] +``` + +You are now ready to begin adding data attributes into the HTML files across your Cornerstone theme. + +### Adding data attributes into Cornerstone’s HTML files + +Data attributes must be manually added to a product in order to track shopper events and interactions with a product. Because data attributes collect product data at a very granular level, there will be multiple locations you will have to add attributes on a singular product in order to get a comprehensive look at the product’s data. For example, if you want to, it is imperative to note that a product can be viewed by clicking any of the following: + +* The name of the product +* The “Quick View” button +* The product image + +So, if you would like to track the clicks on a specific product, in order to ensure you get a fully comprehensive look at shoppers’ interactions with a product, you will want to include a data attribute on each of these fields. If a specific product possesses multiple data attributes, the data attribute that is closest to the product is the one which will track clicks, product impressions, or product views. + +Data attributes will be implemented in your store by using simple HTML. In order to begin tracking, you will add data attributes to the already existing HTML tags present in your theme. + +See [Pull Request #1377](https://github.com/bigcommerce/cornerstone/pull/1377/commits/55fc73eeb1edc6e140005ca811f090f06ab35435) to see how data attributes were implemented in Cornerstone 2.6.0. + +### Data attribute implementation example + +You can see a data attribute implemented in the HTML form tag in the code sample below: + +```handlebars filename="Data attribute HTML" showLineNumbers copy +
    + {{#if theme_settings.product_list_display_mode '===' 'grid'}} + {{> components/products/grid products=brand.products show_compare=brand.show_compare theme_settings=theme_settings event="list"}} + {{else}} + {{> components/products/list products=brand.products show_compare=brand.show_compare theme_settings=theme_settings event="list"}} + {{/if}} +
    + +{{> components/common/paginator pagination.brand}} +``` + +In the above snippet, the data attribute is embedded in a `
    ` HTML tag in lines 1 and 2. The data attribute is `data-list-name` and its value is `"Brand: {{brand.name}}"`. + + +## Data attribute reference + +Currently, BigCommerce supports 11 different data attributes. Below is a table with a breakdown of each attribute and its description. + + + **Mandatory data** + * If tracking promotions data, either `data-banner-id` or `data-name` are required. + * If tracking data for a product, either `data-entity-id` or `data-name` are required. + * If tracking data for a product list, `data-product-list` or `data-entity-id` are required. + + +The “tracked product” refers to the product on which you are inserting the data attribute. + +| Data Attribute | Description | Value Type | Example | +|-----|-----|-----|-----| +| `data-list-name` | The `data-list-name` attribute denotes the name of the list that will be reflected on Google Analytics. | string or handlebars helper | **String Example**:`data-list-name="Kitchen Appliances"`

    **Handlebars Value Example**: The `data-list-name` attribute can also get its value using Handlebars. For example, if you are adding a data attribute to your carousel products in products/carousel.html, you could create the attribute `data-list-name="{{list}}"` and define the list value in products/new.html to be: `list="New products"`| +| `data-entity-id` | The `data-entity-id` is equal to the tracked item’s id. | integer | `data-entity-id=12` | +| `data-position` | The `data-position` attribute is equal to the tracked product’s position or the tracked promotion’s position. | Value is a string if creating the data attribute for a promotion. The string should denote the location of the promotion.

    Value is an integer if creating the data attribute for a product. The integer should represent the product’s placement. An example use case for this data attribute is to answer a question like, “does the product in position 1 sell more than the product in position 4?” | **String Value Example:** `data-position="center"`

    **Integer Value Example:** `data-position=2` | +| `data-banner-id` | The `data-banner-id` attribute is the id of the banner being tracked. The banner id is not to be mistaken with the promotion id. | integer | `data-banner-id=5` | +| `data-event-type` | The `data-event-type` attribute is equal to the shopper event that will be tracked. There are a 4 shopper/product interactions you can measure and set the data-event-type equal to. Custom events are not yet implemented. | **String that can be one of:**
    `"promotion"`
    `"promotion click"`
    `"product"`
    `"list"` | `data-event-type="promotion"` | +| `data-name` | The `data-name` attribute is equal to the tracked product’s or banner’s name. | string or handlebars helper | **String Value Example:**
    `data-name="Ruffle Off-the-Shoulder Top"`

    **Handlebars Value Example:**
    The `data-name` attribute can also get its value using Handlebars.

    For example, if you are adding a data attribute to your footer in products/footer.html, you could create the attribute: `data-name="{{this.banner-name}}"`

    Or, if you are adding a data attribute to a product list item in products/list-item.html, you could create the attribute below `data-name="{{name}}"` as long as these values are defined. | +| `data-product-category` | The `data-product-category` attribute is equal to the tracked product’s category. | string | `data-product-category="Women’s Apparel"` | +| `data-product-brand` | The `data-product-brand` attribute is equal to the tracked product’s brand. | string | `data-product-brand="Ralph Lauren Corporation"` | +| `data-product-price` | The `data-product-price` attribute is equal to the tracked product’s price. | integer | `data-product-price="27.99"` | +| `data-product-sku` | The `data-product-sku` attribute is equal to the tracked product’s sku value. | string | `data-product-sku="S18T-Ots-YM"` | +| `data-product-variant` | The `data-product-variant` is equal to the tracked product’s variant. | string | `data-product-variant="4-Yellow"` | + + +## Custom Dimensions and Metrics + +Custom dimensions and metrics are also supported. To add them in the `config.json` `settings` array, add the name of the dimension/metric followed by the generic custom metric/dimension alias: + +```json filename="config.json: Settings array" showLineNumbers copy +{ + // ... + "settings": { + // ... + "custom-dimensions": { + "": "dimension1", "dimension-common": "dimension2" + }, + "custom-metrics": { + " + * Spelling must be exact + * Names may not have spaces + + +Next, add the custom metrics/dimensions to the desired theme template: + +```handlebars filename="Theme template with custom dimensions and metrics" showLineNumbers copy + +{{#if settings.data_tag_enabled}} +
    +{{else}} + +{{/if}} + +``` + + + **Dimensions and metrics** + + Dimensions are typically strings; metrics are usually integers. + +## Resources + +### Pull Requests +* Cornerstone [PR #1377](https://github.com/bigcommerce/cornerstone/pull/1377/commits/55fc73eeb1edc6e140005ca811f090f06ab35435) (GitHub) +* [Google Analytics Product Data Tags](https://github.com/bigcommerce/cornerstone/commit/9a4ddcae7f531a9d542aeb8ebf38c8bda2656b1c) (BigCommerce GitHub) + +### Related Articles + +* [Customizing the BigCommerce Google Analytics Enhanced ECommerce Integration](https://medium.com/bigcommerce-developer-blog/customizing-the-bigcommerce-google-analytics-enhanced-ecommerce-integration-803d4338d018) (Developer Blog) + +### Additional Resources +* [Google Analytics Enhanced ECommerce](https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#ecommerce-data) (Google) diff --git a/docs/stencil-docs/developing-further/modifying-forms.mdx b/docs/stencil-docs/developing-further/modifying-forms.mdx new file mode 100644 index 000000000..6590efd6a --- /dev/null +++ b/docs/stencil-docs/developing-further/modifying-forms.mdx @@ -0,0 +1,39 @@ +# Modifying Forms + + +## Modifying the template +You can customize the login experience by modifying the theme's `templates/pages/auth/login.html` file. + +### Changing default text +Here is an example of the default text you can change in the **Login page** template: + +![New customer facts](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/new_customer.png "New customer facts.") + +```html +
  • {{lang 'login.new_customer.fact1' }}
  • +
  • {{lang 'login.new_customer.fact2' }}
  • +``` +You will find key value pairs for default form text in `/assets/lang/en.json`, and can modify them with your own custom values. For example: + +```json +"new_customer": { + "heading": "New Customer?", + "intro": "Create an account with us and you'll be able to:", + "fact1": "Get customer perks", + "fact2": "Place a recurring order" + } +``` + +### Login form redirect +By default, customers are redirected to `/account.php` upon login, but you can redirect customers to another relative URL. You can do this by passing the parameter `id="redirect_to"` with a `value={path}` on a hidden form field within the `` element in the template. For example: + +```html + +``` +When the form is submitted, a `POST` request is sent to BigCommerce to validate the login information. At this point, the customer will be redirected to the page you defined. + +Only relative URLs are supported for security reasons. + + +The redirect does not work if select "Allow customers to access items in their shopping cart across multiple devices." is enabled in the control panel (**Settings > Advanced > Checkout > General Settings > Cart**) and the customer has an active cart. + diff --git a/docs/stencil-docs/developing-further/stored-credit-card-management.mdx b/docs/stencil-docs/developing-further/stored-credit-card-management.mdx new file mode 100644 index 000000000..588965808 --- /dev/null +++ b/docs/stencil-docs/developing-further/stored-credit-card-management.mdx @@ -0,0 +1,228 @@ +# Adding Stored Payment Methods + +The [Cornerstone 2.6.0 release](/release-notes#posts/cornerstone-2-6-0-release) added stored payment method management for saved credit cards to the customer `account.php` page. The [Cornerstone 4.4.0 release](/release-notes#posts/cornerstone-4-4-0-release) expanded this functionality to include saving PayPal accounts using [PayPal Powered by Braintree](https://support.bigcommerce.com/s/article/Connecting-with-PayPal-Powered-by-Braintree). + +This article contains instructions for manually applying the changes made in `4.4.0` to themes version `2.6.0 ` to `4.3.1`. For a full diff of the files to change, see [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files). If you're developing on a theme older than version `2.6.0` you'll first need to apply the changes made in `2.6.0`; to do so, see [Stored Credit Card Management](/archive/storefront/stencil/stored-credit-card-management). For theme update best practices, see [Theme Updates and Version Control](/docs/storefront/stencil/deployment/updates-and-version-control). + +![Save PayPal Account](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/stored-credit-card-management02.png "Save PayPal Account") + +## Update `config.json` + +In `config.json`, replace `account_payment_methods` in the `features` array with `account_payment_methods_v2` and add `csrf_protection`: + +```json filename="config.json" showLineNumbers copy +{ + "name": "Cornerstone", + "version": "4.3.1", + "meta": { + ... + "features": [ + "fully_responsive", + "mega_navigation", + ... + "csrf_protection", // add csrf_protection + "account_payment_methods" // replace with account_payment_methods_v2 + ] + } +} +``` + +To enable saving PayPal accounts, credit cards, and other non-credit card payment methods using the theme, [add the supported_payment_methods array (GitHub)](https://github.com/leeBigCommerce/cornerstone/blob/54f5681a6a15cd8477c51c6db9eb54ea3eb40972/config.json#L325) and append `card` and `paypal` to it: + +```json filename="config.json" showLineNumbers copy +{ + ... + "supported_card_type_icons": [ + ... + ], + "supported_payment_methods": [ // Add supported_payment_methods array + "card", // allowlist card and paypal + "paypal" + ], + "lazyload_mode": "lazyload+lqip" + ... +} +``` + +To see the full diff, refer to [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html&file-filters%5B%5D=.json&file-filters%5B%5D=.md#diff-06b2d3b23dce96e1619d2b53d6c947ec). + +## Update payment-methods-list.html + +After you make the preceding config changes, you can pass a new version of the `payment_methods` object to the template. + +To use the updated object, apply the changes from [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html) to `payment-methods-list.html`. + +The updated object shows saved PayPal accounts in the payment method list. + +![Payment Method List](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/stored-credit-card-management01.png "Payment Method List") + +## Update edit-payment-method.html + +The `customer.edit_stored_instrument` object has been lightly extended to include a `type` attribute. + +Using `type`, you can show or hide fields based on whether the current instrument is a `stored_card` or `stored_paypal_account`. The type is also passed to the form handler in a hidden input so the handler can update the instrument accordingly. + +Modify `edit-payment-method.html` to include changes from [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html) to add the new user interface elements and behavior. + +## Update `_paymentMethods.scss` + +To style the newly added UI elements, update `_paymentMethods.scss` with the changes from [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=#diff-1c33ed0c69f228483a39fce2616e1942). + +## Add PayPal Logo + +The changes to `payment-methods-list.html` include a PayPal logo that's displayed on the payment method cards: + +```handlebars showLineNumbers copy +{{lang 'account.payment_methods.paypal'}} +``` + +Use the command line to download the `.svg` and save it to `assets/img/payment-methods`: + +```bash showLineNumbers copy +cd assets/img/payment-methods/paypal.svg +curl -O https://raw.githubusercontent.com/leeBigCommerce/cornerstone/54f5681a6a15cd8477c51c6db9eb54ea3eb40972/assets/img/payment-methods/paypal.svg +``` + +## Update en.json + +At minimum, an English translation needs to be added to `lang/en.json`: [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html&file-filters%5B%5D=.json&file-filters%5B%5D=.md#diff-b0d4c1fc9d8d2a5a213b27a72cf6c9fe). Add translations for other locales as needed. + + +## Manage stored account payments + +After adding a [stored payment method](https://support.bigcommerce.com/s/article/Enabling-Stored-Payment-Methods?language=en_US), shoppers can use the Storefront account payments microapp to manage their stored payment instruments. The microapp provides a payment method form with billing address fields. Currently, the microapp works with Adyen. Plans include expanding the number of supported payment processors. + +### Install the microapp + +To install the Storefront account payments microapp to your theme, inject the `account_payments` variable into the `add-payment-method.html` template. + +```handlebars showLineNumbers copy +{{#if account_payments}} + {{{ account_payments }}} + +{{/if}} +``` + +The `account_payments` variable includes the `
    ` element that renders the microapp and a script tag containing the microapp URL. If the `window.BigCommerce` object does not yet exist, insert a script to create it. + +If the selected payment provider already has an integration with the Storefront account payments microapp, [initializing window.BigCommerce.renderAccountPayments](#initialize-the-microapp) renders the microapp automatically. + +If the selected payment provider does not have an integration with the microapp, the `account_payments` variable is undefined and the fallback payment form renders. See an example of a fallback payment form and the conditional rendering logic from the [Cornerstone theme](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/add-payment-method.html#L45). + +### Initialize the microapp + +Initialize the microapp by calling the `renderAccountPayments()` method of the storefront browser's `window.BigCommerce` object. The Cornerstore theme initializes the microapp in the `account.js` file. + +The `renderAccountPayments()` method takes the following three parameters: + +* `style` - an options **object** for customizing the look of the microapp form. May be empty. +* `storeContextData` - an **object** that supplies store context. +* `errorHandler` - a **function** that the microapp calls if the payments form submission fails. + +```js filename="Example renderAccountPayments() wrapper function" copy +const initializeMicroapp = (style, storeContextData, errorHandler) => window.BigCommerce.renderAccountPayments(style, storeContextData, errorHandler); +``` + +This [Cornerstone example (GitHub)](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/theme/account.js#L102) initializes `window.BigCommerce.renderAccountPayments` using JavaScript. + +The following example expresses the method's parameters as a TypeScript interface: + +```ts filename="Example interface for renderAccountPayments()" showLineNumbers copy +interface AppConfigInterface { + styles?: AppStyles; + storeContextData: StoreContextDataInterface; + errorHandler(error: string): void; +} +``` + +The following TypeScript interfaces express the data structures and types that `renderAccountPayments()` expects: + +```ts showLineNumbers copy +interface AppStyles { + inputBase?: CSSProperties; + inputValidationError?: CSSProperties; + inputValidationSuccess?: CSSProperties; + submitButton?: CSSProperties; + cancelButton?: CSSProperties; + label?: CSSProperties; + inputWrapper?: CSSProperties; + validationError?: CSSProperties; + heading?: CSSProperties; + formRow?: CSSProperties; + formActions?: CSSProperties; +} + +interface StoreContextDataInterface { + countries: Country[]; + paymentsUrl: string; + storeHash: string; + storeLocale: string; + vaultToken: string; + shopperId: string; + customerEmail: string; + providerId: PaymentProviders; + currencyCode: string; + paymentMethodsUrl: string; + paymentProviderInitializationData: PaymentProviderInitializationData; +} + +type PaymentProviderInitializationData = + AdyenV2InitializationData + | AdyenV3InitializationData; + +interface AdyenV2InitializationData { + clientKey?: string; + environment: string; + gateway: string; + originKey: string; +} + +interface AdyenV3InitializationData { + clientKey: string; + environment: string; + gateway: string; + originKey?: string; +} + +interface Country { + code: string; + label: string; + states?: State[]; + value: string; +} + +interface State { + code: string; + name: string; + value: string; +} + +enum PaymentProviders { + Adyenv2 = 'adyenv2', + Adyenv3 = 'adyenv3', +} +``` + +## FAQ + +**Where is the card data stored?** + +Card data is stored securely with the payment gateway. + +**Is storing credit cards PCI compliant?** + +Card data is stored securely with the payment gateway. The BigCommerce store is NOT storing the payment data. + +**Can shoppers modify their stored card?** + +After adding a card, shoppers can modify the billing address. To modify other the other details, shoppers will need to delete and re-add the card. + +## Resources + +### Related articles + +* [Payments API](/docs/store-operations/payments) +* [Enabling Stored Cards (Help Center)](https://support.bigcommerce.com/s/article/Enabling-Stored-Credit-Cards) +* [The Complete Guide to Checkout Customization on BigCommerce (Developer Blog)](https://medium.com/bigcommerce-developer-blog/the-complete-guide-to-checkout-customization-on-bigcommerce-6b566bc36fa9) diff --git a/docs/stencil-docs/developing-further/theme-updates-and-version-control.mdx b/docs/stencil-docs/developing-further/theme-updates-and-version-control.mdx new file mode 100644 index 000000000..e1e893cb3 --- /dev/null +++ b/docs/stencil-docs/developing-further/theme-updates-and-version-control.mdx @@ -0,0 +1,32 @@ +# Theme Updates and Version Control + + + +When developing BigCommerce themes, there are a few steps you can take to ensure your custom theme stays up to date with BigCommerce theme updates and version releases. + +## Version control + +A typical setup might include a base theme, with several custom themes branching from the base theme. The custom theme(s) will need to be kept up to date with any major changes while maintaining its own customizations. Version control systems such as Git can help ensure themes stay up-to-date. For example, you can place the parent theme on the master branch and keep each child theme on its own separate branch. Changes to the master theme can then be pushed to each child. + + +## Theme updates + +If you are using a Cornerstone theme as your base theme, update notifications are found in our [changelog](/release-notes). If you are using another theme, please see the theme creator for updates. + +Before updating your theme, review the following list items to ensure a successful update: + +* Create a backup of the custom theme. +* Keep a backup of `config.json`. This file contains all the configurations and many of the customizations for a theme. +* Never merge an update directly into your custom theme. +* Test any new updates before pushing the updates to production. A good way to do this is to keep a test theme that mirrors your theme in production and apply any new changes to the test theme. If there are no issues, apply your updates to production. + +## Maintaining customizations + +When creating customizations, it's important to create a new file to overwrite the original styles, as opposed to modifying the original existing file. For example, `{{{stylesheet ‘/assets/css/theme.css’}}}` is the file that has the CSS that already exists in the theme. Instead of making edits to this file, create a new `.css` file, such as `{{{stylesheet ‘/assets/css/my_custom_theme.css’}}}`. Place your new styles in this file, and reference this file in the layouts. + +Make sure to discuss with the merchant not to make any changes to the files. This can cause issues later on with updates. Having multiple editors to files could potentially cause issues later on with updates if a proper workflow is not established. + +## Resources +* [Version Control for Teams](https://medium.com/bigcommerce-developer-blog/version-control-for-teams-a186bd74ba7e?source=friends_link&sk=721c0fc073cbe5b729c1a2282377ca86) (BigCommerce Developer Blog) +* [Level Up Your Development Workflow with Continuous Delivery](https://medium.com/bigcommerce-developer-blog/how-to-level-up-your-development-workflow-with-continuous-delivery-3a6493cc1d13) (BigCommerce Developer Blog) +* [What is Version Control?](https://www.atlassian.com/git/tutorials/what-is-version-control) (Atlassian Blog) diff --git a/docs/stencil-docs/getting-started/about-stencil.mdx b/docs/stencil-docs/getting-started/about-stencil.mdx new file mode 100644 index 000000000..401c676c7 --- /dev/null +++ b/docs/stencil-docs/getting-started/about-stencil.mdx @@ -0,0 +1,83 @@ +# About Stencil + + + +Stencil is BigCommerce's theme engine. It incorporates industry best practices in technology, design standards, SEO, and allows developers to build a stunning storefront that engages shoppers and encourages checkouts on any device. Stencil themes are supported on the [following browsers](https://support.bigcommerce.com/s/article/Themes-Supported-Browsers). Stencil is responsible for powering the BigCommerce [Cornerstone theme](#cornerstone). + +The [Page Builder](/docs/storefront/stencil/content/page-builder) tool available on Stencil themes allows merchants to customize a storefront's look and feel with no coding, making customizations possible by a wide range of users. Page Builder enables quick and easy customization of a theme's colors, typography, banners, headings, carousel, and footer. It also enables customization of a storefront's layout characteristics, such as the number of products displayed in various panels, category pages, and brand pages. For details, see [Personalizing Your Theme](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US). + + +BigCommerce Stencil themes are responsive, mobile friendly themes, allowing shoppers to have a first class experience across any device. Each Stencil theme can contain one to four variations. You can optimize individual variations for specific markets, audiences, and styles, while still managing and distributing all of these variations as one theme. + +## Cornerstone + +BigCommerce's [Cornerstone](https://github.com/bigcommerce/cornerstone) theme is the building block and starting point for rapidly developing themes for BigCommerce. Cornerstone is available open source on [GitHub](https://github.com/bigcommerce/cornerstone). + +Cornerstone comes in three, fully-responsive variations: + +* Cornerstone Light +* Cornerstone Warm +* Cornerstone Bold + +See the [Cornerstone Light theme demo](http://cornerstone-light-demo.mybigcommerce.com/) to experience a Stencil theme's capabilities. + +As the default theme on new stores, Cornerstone is typically the first theme to support new theme-related features and improvements. See the [BigCommerce Developer Changelog](/release-notes) for the latest Cornerstone news and release notes. + +## Stencil CLI + +The Stencil CLI enables developers to locally develop and customize on any Stencil theme with no impact on a merchant's live storefront during the development process. When developing locally, developers have access to real-time Browsersync preview and testing across desktop, mobile, and tablet devices/viewports. + +Stencil CLI runs on the [Node.js](https://nodejs.org/en/) runtime environment. Installing Node.js also provides the required [npm package manager](https://www.npmjs.com/package/npm). + +## Flexible templates + +Stencil's logic based templates allow BigCommerce developers to customize storefront pages efficiently with the lightweight templating language, [Handlebars.js](https://handlebarsjs.com/). Handlebars.js allows you to efficiently embed dynamic and conditional logic onto your storefront pages. + +## Powerful CSS stack + +Stencil themes support both **Sass** and **SCSS**. Developers can use these popular CSS pre-processors to nest CSS properties, variables, and mix-ins. + +Cornerstone uses a BigCommerce SCSS Framework [Citadel](https://www.npmjs.com/package/@bigcommerce/citadel), which is built on top of [Foundation](https://foundation.zurb.com/sites/docs/) `v5.5.3` (Foundation `v6.x` not currently supported). + +Foundation assets are located in the following directories: +* assets/scss/settings/foundation/ +* assets/scss/components/foundation/ + +## Front Matter + +Stencil's use of **YAML Front Matter** allows developers to request only the objects needed on the storefront, increasing page speed and allowing developers to define the content to render with just a few keystrokes. + +## JavaScript event hooks + +Stencil themes can access remote objects through event hook and use the hooks to trigger defined events based on shopper behavior. This will allow you to collect product data and optimize a shopper's experience. To facilitate theme-building, BigCommerce provides [stencil-utils](/docs/storefront/stencil/utils/reference) -- a client-side library for managing event hooks. + +## Blueprint (Legacy framework) + + +For information on Blueprint, BigCommerce's legacy theme framework, see [Blueprint Themes](https://support.bigcommerce.com/s/article/Blueprint-Themes?language=en_US). + +## Support + +### [Developer Community](/community) +This is a great place to get help from other developers who work on the BigCommerce platform. If you have BigCommerce specific questions this is the best place to ask. It’s also great for beginners to get assistance. + +### [Stack Overflow](https://stackoverflow.com/questions/tagged/bigcommerce) +Are you a more experienced developer or have a programming language specific question? This is a good place to ask questions and get help. The developer community is the best place to get answers about the BigCommerce platform specifically. + +If you need direct assistance, you can contact BigCommerce Support through [Live Chat, Phone Support, or Email Support](https://support.bigcommerce.com/s/contact). + +## Resources + +### Related Articles + +* [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) (BigCommerce Knowledge Base) +* [Personalizing Your Theme](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US) (BigCommerce Knowledge Base) + +### Sample Apps + +* [Cornerstone Theme Demo](http://cornerstone-light-demo.mybigcommerce.com/) + +### Additional Resources +* [stencil-cli Repository](https://github.com/bigcommerce/stencil-cli) (BigCommerce GitHub) +* [Cornerstone Repository](https://github.com/bigcommerce/cornerstone) (BigCommerce GitHub) +* [Cornerstone Theme Manual](https://support.bigcommerce.com/s/article/Cornerstone-Theme-Manual) (BigCommerce Knowledge Base) diff --git a/docs/stencil-docs/getting-started/stencil-technology-stack.mdx b/docs/stencil-docs/getting-started/stencil-technology-stack.mdx new file mode 100644 index 000000000..8d711166d --- /dev/null +++ b/docs/stencil-docs/getting-started/stencil-technology-stack.mdx @@ -0,0 +1,89 @@ +# Stencil Technology Stack + + + +Stencil's use of Handlebars.js, JavaScript, and YAML Front Matter on the front end allows developers to create dynamic, templated customizations across a BigCommerce storefront. + +## Handlebars overview + +[Handlebars.js](https://handlebarsjs.com/) is a minimal templating language that allows developers to create dynamic and robust templates for any BigCommerce Stencil storefront. A Handlebars template looks like an HTML file, with the addition of Handlebars.js expressions for dynamic logic that can be embedded into the page. + +A Handlebars expression begins and end with curly braces. Below is a basic example. + +```handlebars filename="Using handlebars to access the {{title}} variable" showLineNumbers copy +
    +

    {{title}}

    +
    +
    +``` + +In production, Handlebars statements run on the server side, generating HTML received by the shopper’s browser. + +View the [full Handlebars Helpers Reference](/docs/storefront/stencil/themes/context/handlebars-reference) to learn about the helpers available on a Stencil storefront. + +## Stencil objects overview + +Stencil objects are the individual JavaScript objects that are rendered onto a Stencil storefront. The following example is the JavaScript Object Notation (JSON) for a [Banner object](/docs/storefront/stencil/themes/context/object-reference/config#global-objects_banner) rendered on a category page of a storefront. + +```json filename="Example banners object JSON for a banner object, accessible through Handlebars.js " showLineNumbers copy + "banners": { + "top": [ + "For the week of May 20th, all apparel available at the online store will be 25% off the standard store price." + ], + "bottom": [ ], + "top_metadata": [ + { + "id": "3", + "banner-name": "All Apparel 25% off for a limited time!", + "content": "

    For the week of May 20th, all apparel available at the online store will be 25% off the standard store price.

    ", + "location": "top" + } + ] + } +``` + +![Banners Object (rendered)](https://storage.googleapis.com/bigcommerce-production-dev-center/images/banners-object-rendered.png "Banners Object (rendered)") + +As a developer, you can use Handlebars.js syntax to access objects and use them to customize your Stencil theme. + +Stencil objects are categorized as either Global, Common, or Other, which is representative of the object's scope or where in the theme it can be accessed. For example, Global Objects are components shared across the entire BigCommerce storefront. + +### Migration handlebars v3 to v4 +Depthed paths are now conditionally pushed onto the stack. If the helper uses the same context, then a new stack is not created. Any instances of ../ in templates must be checked for the correct behavior. See [handlebars.js](https://github.com/handlebars-lang/handlebars.js/issues/1028) documentation for more information. + + +## YAML front matter overview + +BigCommerce Stencil themes utilize YAML front matter on template pages. Front matter allows developers to request objects on the storefront, allowing developers to define each page's design and layout details. + + +When utilized, Front Matter must be the opening text of a file and must take the form of valid YAML set between triple-dashed lines. + +See our [Front Matter Reference](/docs/storefront/stencil/themes/context/frontmatter-reference) to see what Front Matter attributes are available on a Stencil storefront. Below is a snippet from the base Cornerstone theme's home.html file, showing how Front Matter can be used in a theme. + + +```yml filename="YAML Front Matter home.html, Cornerstone theme" showLineNumbers copy +products: + new: + limit: {{theme_settings.homepage_new_products_count}} + featured: + limit: {{theme_settings.homepage_featured_products_count}} + top_sellers: + limit: {{theme_settings.homepage_top_products_count}} +carousel: {{theme_settings.homepage_show_carousel}} +blog: + recent_posts: + limit: {{theme_settings.homepage_blog_posts_count}} +``` + +## Resources + +### Related Articles + +* [Handlebars.js documentation](https://handlebarsjs.com/) (Handlebars) + +### Additional Resources + +* [Stencil Technology Stack Video](https://bigcommerce.wistia.com/medias/9g0qjdhs8t) +* [Cornerstone Components Subdirectory](https://github.com/bigcommerce/cornerstone) (BigCommerce GitHub) + diff --git a/docs/stencil-docs/getting-started/transitioning-to-stencil.mdx b/docs/stencil-docs/getting-started/transitioning-to-stencil.mdx new file mode 100644 index 000000000..8549468a1 --- /dev/null +++ b/docs/stencil-docs/getting-started/transitioning-to-stencil.mdx @@ -0,0 +1,81 @@ +# Transitioning to Stencil + + + +This article outlines the key differences between Blueprint and Stencil for developers, agency partners, and anyone interested in Stencil's enhanced capabilities. + +## What is Stencil? + +[Stencil](/docs/storefront/stencil/start) is BigCommerce’s latest theme framework engine. Launched in 2016, Stencil incorporates industry best practices in technology, design standards, and SEO. You can use the framework’s theme on mobile, tablet, and desktop browsers. Stencil also allows developers to build storefronts that engage shoppers and encourage checkouts on any device. All of BigCommerce’s new storefronts use Stencil. + +If you are still using our legacy theme framework, Blueprint, we highly encourage switching to Stencil so you can take advantage of the new features and benefits. For more in-depth information about Stencil’s features, see the [Stencil Theme Platform](https://support.bigcommerce.com/s/article/The-Stencil-Theme-Platform#features) page. + +## Why transition to Stencil? + +Stencil improves the overall storefront experience for merchants and their customers. With enhancements in speed, security, and updates to your themes, this modern framework provides a more streamlined process for the everyday maintenance and tasks required to run a store. + +Stencil themes are built on non-proprietary, open-source code to provide easier adoption and adaptation while providing greater flexibility and access for customization. In comparison, Blueprint is built on a rigid, proprietary codebase, making it difficult to tailor and extend theme functionality. + +For more information on the enhanced capabilities of Stencil, see the [Stencil vs. Legacy Blueprint](https://support.bigcommerce.com/s/article/The-Stencil-Theme-Platform#compare) page. + +## Technical differences + +When transitioning any store from Blueprint to Stencil, you should be aware of a few key differences. Transitioning to Stencil allows developers to do the following: +- [Develop locally on Stencil CLI](#developing-locally-on-stencil-cli) +- [Use Handlebars instead of global variables](#using-handlebars) +- [Customize Page Builder mode](#customize-page-builder-mode) +- [Create custom templates](#create-custom-templates) + + +### Developing locally on Stencil CLI + +For complete control over a theme’s appearance, logic, and theme configuration files, developers can use the Stencil command line interface (Stencil CLI). This interface allows you to design and preview storefronts locally before pushing them to production. Access to real-time previews and testing across various devices is available via [Browsersync](https://www.browsersync.io/), a browser testing assistant built into Stencil CLI. + + +While Blueprint themes allow users to add new files and assets to themes via WebDav, Stencil assets must be added to and bundled into the theme, or referenced from an external source. + +For images referenced from anywhere in your Blueprint file directory, you will need to move these assets to your Stencil theme and reference them appropriately. You can still reference assets from within the `/content/` folder in WebDav or from an external source. + +For more information on Stencil theme assets, see the [Theme Assets](/docs/storefront/stencil/themes/style/assets) page. + +### Using Handlebars + + +While PHP variables enclosed within `%%` markers represent dynamic content, [Handlebars](https://handlebarsjs.com/), a JavaScript templating language represents BigCommerce dynamic stored data in Stencil themes. + +Handlebars keeps your HTML page clean by separating the logic-less templates from the business logic in your JavaScript files. This organization improves the structure of the application, promoting maintainability and scalability. Handlebars also simplifies the task of manually updating data in the customer-facing display view. + + +For more information about Handlebars, refer to these external resources: +- [A Beginner’s Guide to Handlebars](https://www.sitepoint.com/a-beginners-guide-to-handlebars/) +- [Getting Started with Handlebars.js](http://blog.teamtreehouse.com/getting-started-with-handlebars-js) +- [Handlebars interactive tutorial](http://tryhandlebarsjs.com/) + +For details on using Handlebars to surface objects in Stencil, see [Stencil Technology Stack](/docs/storefront/stencil/start/tech-stack). + +### Customize Page Builder mode + +While Blueprint uses Style Editor to customize legacy themes, Stencil uses Page Builder. [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) is BigCommerce's browser-based tool that enables merchants to rapidly modify and customize a storefront's look and feel without writing code. Stencil theme developers can configure settings for Page Builder. The configuration determines the theme's customizable aspects. + +For example, by customizing the configuration of Page Builder, you can modify how merchants customize colors, fonts, display of page features, and the number of products displayed per feature. + +When you switch to Stencil from Blueprint, you won’t lose any of your store data. However, you will lose any customization you’ve hardcoded into your previous Blueprint theme. + +### Create custom templates + +Stencil allows theme developers and merchants to assign custom layout templates to the following types of storefront pages: +- Brand (unique to Stencil) +- Category +- Product +- Store (static page) + +Unlike Blueprint, Stencil does not require that custom template file names start with an underscore. In the current Stencil release, you must create and bundle custom templates using Stencil CLI before uploading the custom templates to stores. However, once you have created and uploaded templates, authorized store users can assign them to storefront pages through the control panel. For more information on custom templates, see the [Custom Templates](/docs/storefront/stencil/themes/templates) page. + +### Resources + +For more information about switching to Stencil, see the following resources: +- [Getting Started with the Stencil Framework](https://bigcommerce.wistia.com/medias/9g0qjdhs8t) +- [Stencil Theme Editor](https://support.bigcommerce.com/s/article/Stencil-Themes) +- [Editing Stencil Theme Files](https://support.bigcommerce.com/s/article/Stencil-Themes#edit) +- [Personalizing Your Stencil Theme](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US) +- [What to Consider When Changing Your Stencil Theme](https://support.bigcommerce.com/s/article/What-to-Consider-When-Changing-Your-Theme) diff --git a/docs/stencil-docs/installing-stencil-cli/incompatible-directives.mdx b/docs/stencil-docs/installing-stencil-cli/incompatible-directives.mdx new file mode 100644 index 000000000..abca08e9e --- /dev/null +++ b/docs/stencil-docs/installing-stencil-cli/incompatible-directives.mdx @@ -0,0 +1,84 @@ +--- +title: Incompatible Directives +keywords: if, stencil +--- + +# Incompatible Directives + +**Prior to January 31, 2024, you must update your SCSS file structure and syntax to compile correctly and avoid frontend styling issues.** This upgrade is necessary to ensure the security of our platform going forward and to ensure we’re not running any out-of-date software that may be at additional risk for security vulnerabilities. + +This article covers the known divergent behavior and describes how to avoid unexpected compiler errors due to the Stencil CLI and BigCommerce's servers running different versions of node-sass. + +To ensure that your storefront is up to date, review the [Deprecation and Sunset Support for Node-Sass](/docs/storefront/stencil/cli/node-sass) information to learn about the two possible options for updating your node-sass compiler. + +## Examples + +1. In production, using the `/` character in SCSS directives causes a compiler error. + +Because support for SCSS directives came after the node-sass fork, SCSS directives that contain the `/` literal will break in production with an error stating that this syntax is not supported. + +We do not recommend using `/` in your SCSS files until the node-sass fork is sunset. + +For more information, see [Issue 2149 (GitHub / libsass)](https://github.com/sass/libsass/issues/2149). + +2. The `$hue` parameter behaves differently. + +The following example demonstrates the context in which you might pass `$hue` or encounter it in library packages: + +```scss filename="Example: $hue parameter" showLineNumbers copy +$color: #1caf9a; + +body { + background: change-color($color, $hue: 120); +} +``` + +Using `$hue` leads to different behavior in Stencil CLI versus in production. + +We do not recommend including `$hue` in your SCSS functions until the node-sass fork is sunset. + +For more information, see [Issue 2112 (GitHub / libsass)](https://github.com/sass/libsass/issues/2112). + + +3. In production, concatenating an empty string with a quoted string unquotes the string. + +The following example demonstrates the context in which you might concatenate an empty string or encounter it in library packages: + +```scss filename="Example: Empty string concatenation" showLineNumbers copy +@debug "\"foo\"" + ""; +``` + +Empty string arguments lead to divergent behavior between Stencil CLI, which supports empty string concatenation, and production, which unquotes strings. + +Pay particular attention to SCSS functions that might receive empty strings as arguments. + +For more information, see [Issue 2153 (GitHub / libsass)](https://github.com/sass/libsass/issues/2153). + +4. The `if()` method does not correctly evaluate its parent selector. + +For example, consider the following function: + +```scss filename="Example: Function that uses if()" showLineNumbers copy +@function foo() { + @return if(& != null, green, red); +} + +test { + color: foo(); +} +``` +In the preceding example, the fork's error in the evaluation of the `if()` method leads to the following divergent results: + +```css filename="Stencil CLI output" showLineNumbers copy +test { + color: green; +} +``` + +```css filename="Production output" showLineNumbers copy +test { + color: red; +} +``` + +For more information, see [Issue 2116 (GitHub / libsass)](https://github.com/sass/libsass/issues/2116). diff --git a/docs/stencil-docs/installing-stencil-cli/installing-stencil.mdx b/docs/stencil-docs/installing-stencil-cli/installing-stencil.mdx new file mode 100644 index 000000000..0bdd7d06d --- /dev/null +++ b/docs/stencil-docs/installing-stencil-cli/installing-stencil.mdx @@ -0,0 +1,168 @@ +# Installing Stencil CLI + + +BigCommerce is currently targeting 01/31/2024 to sunset its node-sass fork in favor of the latest [sass/node-sass](https://github.com/sass/node-sass). To ensure that your storefront is up to date, use the latest node version (Node 18) in Stencil CLI and use the CLI command to resolve [incompatible SCSS directives](/docs/storefront/stencil/cli/unexpected-behavior#incompatible-scss-directives), which can cause issues with the styling of your storefront. + + + + +Stencil CLI allows developers to locally edit and preview themes without impacting a merchant's live storefront, and its built-in [Browsersync](https://github.com/bigcommerce/browser-sync) capabilities make simultaneous testing across desktop, mobile, and tablet devices a breeze. Once work is complete, developers can push themes to BigCommerce storefronts and make them live using Stencil CLI's simple yet powerful commands. + + +This article contains detailed instructions on installing and configuring Stencil CLI, the first step towards developing Stencil themes for BigCommerce storefronts. + + + +## Installing on Mac + +To install Stencil CLI and its dependencies on Mac, open a terminal and run the following commands. Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. + + + + These instructions have been tested on **Mac OS X Yosemite**. + + +```shell showLineNumbers copy +# For ARM based macs +arch -x86_64 /bin/zsh + +# Install Node Version Manager (nvm) +curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash + +# Install Stencil CLI supported version of Node.js +nvm install 18.15.0 + +# Switch to Stencil CLI supported version of Node.js: +nvm use 18.15.0 + +# Install Stencil CLI +npm install -g @bigcommerce/stencil-cli +``` + +## Installing on Windows +There are two methods for installing Stencil CLI and its dependencies on Windows. + + +### Method 1: Install dependencies using Chocolatey +If you prefer a streamlined installation option, use the [Chocolatey package manager](https://chocolatey.org/install) to install Stencil CLI's dependencies. To do so, [open PowerShell](https://docs.microsoft.com/en-us/powershell/scripting/getting-started/starting-windows-powershell?view=powershell-6) as an administrator, and run the following commands: + + +```shell showLineNumbers copy +# Install Chocolatey +iex ((New-Object System.Net.WebClient).DownloadString("https://chocolatey.org/install.ps1")) + +# Install git if you don't have it +choco install git + +# Install nvm windows and stencil-compatible node.js + +choco install nvm; nvm install 18.15.0; nvm use 18.15.0 + +# Install Stencil CLI +npm install -g @bigcommerce/stencil-cli +``` + + + #### Execution policy errors + If you receive an execution policy error while attempting to install chocolatey, refer to [Microsoft's Documentation](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6) and/or consult with your organization's system administrator to determine the appropriate course of action. + + + + #### Chocolatey installation alternatives + For additional information on installing Chocolatey and alternative installation options, see [the installation page on chocolatey.org](https://chocolatey.org/install). + + +### Method 2: Install dependencies manually + +If you're a pro at installing and configuring Python and Node.js environments on Windows, feel free to install the required dependencies using your preferred method. + +**Required Dependencies:** +* [Git](https://git-scm.com/downloads) - required to run npm install +* [Node.js 18.15.0 and npm](https://nodejs.org/en/download/releases/) + +Once they're installed and configured, use `npm` to install Stencil CLI: + +```shell copy +npm install -g @bigcommerce/stencil-cli +``` + + + These instructions have been tested successfully on **Windows 10**. + Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. + + +## Installing on Linux + +To install Stencil CLI and dependencies on debian-based distros, open a terminal and run the following commands: + +```shell showLineNumbers copy +# Download and install nvm if you don't have it. +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash + +# Reload .bashrc so nvm command works +source ~/.bashrc + +# Explicitly install and use supported node version +nvm install 18.15.0 + +nvm use 18.15.0 + +# Install stencil +npm install -g @bigcommerce/stencil-cli +``` + +**Depending on the distro, you may also need to install:** +* g++ +* [libsass](https://sass-lang.com/libsass) +* git + + + * These instructions have been tested on **Ubuntu 18.04**. + * Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. + * Refer to [nvm](https://github.com/nvm-sh/nvm) for latest `nvm` install instructions. + + +## Live previewing a theme + +Once you've installed Stencil CLI, the next step on the road to theme development is downloading a theme to edit and previewing live changes using Stencil CLI's powerful Browsersync functionality. For detailed instructions on doing so, see [Live Previewing a Theme](/docs/storefront/stencil/cli/development-server). Here's the gist: + + +```shell showLineNumbers copy +# move into theme dir +cd ~/path/to/theme/dir + +# install theme modules +npm install + +# initialize a new .stencil config for the theme +stencil init + +# serve a live, Browsersync enabled preview of the theme +stencil start +``` +## Troubleshooting + +### Chocolatey install error +If you receive an error installing Chocolatey, run the following command to enable scripts on your system. + +```powershell copy +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned +``` + +### Visual Studio not found error + +Stencil CLI's dependencies no longer require Visual C++ build tools to compile. + +If you receive the error "Could not find VS", update to the most current version of Stencil CLI and run it using the version of Node.js indicated in this article. + + +### Python npm configuration error + +Stencil CLI's dependencies no longer require Python to compile. + +If you receive "Error: Could not find any Python installation to use", update to the most current version of Stencil CLI and run it using the version of Node.js indicated in this article. + + +## Resources + +* [Dockerizing BigCommerce's Stencil CLI](https://medium.com/bigcommerce-developer-blog/dockerizing-bigcommerces-stencil-cli-f508ddc0c3c0) (medium.com) diff --git a/docs/stencil-docs/installing-stencil-cli/live-previewing-a-theme.mdx b/docs/stencil-docs/installing-stencil-cli/live-previewing-a-theme.mdx new file mode 100644 index 000000000..78aa7bebc --- /dev/null +++ b/docs/stencil-docs/installing-stencil-cli/live-previewing-a-theme.mdx @@ -0,0 +1,144 @@ +# Live Previewing a Theme + +Once you've installed the Stencil CLI, the next steps are downloading a theme to edit and previewing live changes using Stencil CLI's powerful Browsersync functionality. This article walks you through the process of downloading a theme for development, installing theme modules, and serving a live preview using Stencil CLI's `stencil start` command. + +The steps in this article assume you've installed Stencil CLI on your system. If you haven't installed it yet, see [Installing Stencil CLI](/docs/storefront/stencil/cli/install) for detailed, system-specific instructions. + + + #### Theme access, copyright, and distribution +Developers may customize free and purchased marketplace themes; however, the original creator retains rights to the theme's design, which means derived themes may not be uploaded to a public theme marketplace (BigCommerce's or third-party) or sold privately. + + +## Creating Stencil API credentials + +Stencil CLI uses various BigCommerce APIs to inject store-specific data, like carousel images and products, into the live theme preview it serves up. To do so, you must supply the Stencil CLI with a Stencil-specific access token. + +To automatically create an API account with the scopes and permissions required by Stencil CLI, apply the following settings as you [create a store-level API account](/docs/start/authentication/api-accounts#creating-store-level-api-accounts). + +Select **Create Stencil-CLI Token** in the **Create API Accounts** dropdown: + +![Create API Account](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/create-api-account.png "Create API Account") + +The **Stencil-CLI Access Level** can then be set by selecting **local development only** or **publish theme**: + +![Create Stencil-CLI Token](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/create-stencil-cli-token.png "Create Stencil-CLI Token") + +* **local development only** - can read theme related store data, but can not publish +* **publish theme** - can read theme related store data and push themes to the live storefront + +For detailed instructions, see [Store API Accounts](https://support.bigcommerce.com/s/article/Store-API-Accounts). + +## Downloading a theme + +To develop against BigCommerce's Cornerstone theme (which is the building block and starting point for rapidly developing themes for BigCommerce) clone [the repository](https://github.com/bigcommerce/cornerstone) from GitHub: + +```shell copy +git clone https://github.com/bigcommerce/cornerstone.git +``` + + + #### Distribution of Cornerstone-based themes + Distribution of Cornerstone-based themes is subject to BigCommerce's Cornerstone license, including the mandatory incorporation of BigCommerce's copyright statement. + + +Cornerstone and other themes can also be downloaded from the BigCommerce control panel. For instructions on doing so, see [Downloading and Uploading Custom Themes](https://support.bigcommerce.com/s/article/Stencil-Themes#download-upload) (BigCommerce Knowledge Base). + + + #### Update themes after download + Downloading a theme does not include the current configuration of a theme. Run a [stencil pull](/docs/storefront/stencil/cli/options-and-commands#stencil-pull) command to obtain the theme's most recently saved version (appears only for themes customized for this store). +  + + +## Installing theme modules + + + #### Back up before reinstalling + If you're re-installing an existing theme, be sure to back up the theme’s `.stencil` file or `secrets.stencil.json` and `config.stencil.json` files (if using Stencil V3.1 release or later). The files contain the store URL, username, access tokens, and other settings. If you would like to allow for complete rollback, back up your entire theme’s directory. + + +For theme versions `1.10.0+`, modules can be installed with `npm`: + +```shell copy showLineNumbers +# move into the theme dir +cd ~/path/to/theme/dir + +# install modules using npm +npm install +``` + +This will install the `npm` modules required to properly leverage the Stencil event framework. + +## Serving a live preview + +Once Stencil CLI is installed and a theme is downloaded, a `.stencil` or `config.stencil.json` configuration file (if using Stencil V3.1 release or later) can be initialized for the theme and development can begin. + +Stencil CLI uses [Browsersync](https://github.com/bigcommerce/browser-sync) to serve up a live preview of a theme in development. When the preview is opened on multiple devices or browser windows, scroll, click, refresh and form actions are mirrored across the browser instances. + +The Browsersync preview is launched by executing the `stencil start` command in a terminal window. When `stencil start` is executed, Stencil CLI checks for the required `.stencil` configuration file or `secrets.stencil.json` and `config.stencil.json` configuration files (if using Stencil V3.1 release or later), which contains the following information: +* the store's URL +* a store-level API account access token +* a local port number + + + + The store's URL should be a vanity URL. + + +This configuration file is created by running `stencil init` and entering the information listed above. Before doing so, be sure to [create Stencil API credentials](#creating-stencil-api-credentials). + +To initialize a new `.stencil` or `config.stencil.json` configuration file (if using Stencil V3.1 release or later) and start live preview, run the following commands in a terminal: + +```shell showLineNumbers copy +# move into the theme's directory +cd ~/path/to/theme/dir + +# install theme modules (if you haven't already) +npm install + +# create `.stencil` or `config.stencil.json` configuration file (if using Stencil V3.1 release or later) +stencil init --url https://yourstore.com/ --token 19d3ae6-dc15-4af9-bead-a2c703aa7b --port 3000 + +# serve a live preview of the theme: +stencil start +``` + +`stencil start` will output several URLs: + +```shell showLineNumbers copy +# ... +[Browsersync] Proxying: http://localhost:3001 +[Browsersync] Access URLs: + -- + Local: http://localhost:3000 # preview real-time changes on your local machine + External: http://10.4.10.71:3000 # preview real-time changes across multiple devices + -- + UI: http://localhost:3002 + UI External: http://10.4.10.71:3002 + -- +[Browsersync] Watching files... +``` + +Browse to the local URL to preview the theme and see changes updated in real-time. To preview the theme on multiple devices simultaneously, browse to the external URL on the desired devices. As you navigate through the site, Stencil CLI will use the Stencil API token supplied to make API calls to BigCommerce and populate the theme preview with live store data in order to mimic production as closely as possible. + +### Serving a live preview over HTTPS + +It is possible to serve a live preview over HTTPS using [ngrok](https://ngrok.com/docs). To get started with ngrok, follow the [Create an HTTPS Tunnel](/docs/integrations/apps/tutorial/nextjs-connect#create-an-https-tunnel) section of the sample app tutorial. If your app does not run on port 3000, replace 3000 with the port of your app server. + +## Debugging your theme + + + #### BitBucket re-authentication + If you receive error messages about resolving BitBucket as an SSH host when running `stencil init`, enter the BitBucket password used to set up the BitBucket SSH Keys when prompted. + + +The Stencil framework provides built-in debugging tools to aid in your custom front-end development. To see what data is available on the page you are working on, add the debug query string to your store's localhost URL. For example, `http://localhost:3000/product/sample-product?debug=context`. This string will return a list of all the objects on the page in JSON syntax. If you want to view the available JSON objects and rendered page simultaneously, change the debug value to `bar`. For example, `http://localhost:3000/product/sample-product?debug=bar`. + +For a full list of Stencil CLI commands, see [Stencil CLI Options and Commands](/docs/storefront/stencil/cli/options-and-commands). For help troubleshooting errors or installation issues, see [Troubleshooting Your Setup](/docs/storefront/stencil/cli/unexpected-behavior). + + + +## Resources + +### Additional resources +* [Demonstration of Stencil Installation and Launch](https://bigcommerce.wistia.com/medias/8camrxj76a) +* [Stencil CLI GitHub Repo](https://github.com/bigcommerce/stencil-cli) diff --git a/docs/stencil-docs/installing-stencil-cli/node-sass.mdx b/docs/stencil-docs/installing-stencil-cli/node-sass.mdx new file mode 100644 index 000000000..93ac0eae1 --- /dev/null +++ b/docs/stencil-docs/installing-stencil-cli/node-sass.mdx @@ -0,0 +1,59 @@ +# Deprecation and Sunset Support for Node-sass + +If you recently received an alert within your BigCommerce control panel regarding incompatible SCSS directives, we want you to know that BigCommerce is here for you. This article will guide you through the two possible scenarios to ensure you are not affected when we move to a more modern version of our node-sass compiler and deprecate older versions of node.js early next year. + +## Scenario 1: Automated solution + +For most storefronts with incompatible SCSS issues, BigCommerce has provided an automated draft version of your storefront theme for your consideration. Please sign in to the store control panel and navigate to the channel manager. If we can offer an automated fix, you will see a draft version of your updated theme for your consideration with the name `Theme Name [SCSS AUTOFIXED]`. Please review and publish anytime **prior to January 31, 2024**. + +![Node sass image](https://storage.googleapis.com/bigcommerce-production-dev-center/images/node-sass-autofixed.png "Auto Fix") + +## Scenario 2: Manual upgrade + +If you prefer a more manual, granular approach, use the most recent version of the Stencil CLI, which supports only Node 18. If your theme needs attention, the `bundle` command will provide feedback. There is also a new Stencil CLI command, `autofix-scss`, that can help address many SCSS issues. + +To ensure your storefront is up to date, use the following steps: + +1. Using the latest version of `stencil-cli`, run the `stencil bundle` command to validate your theme’s code and note any errors in the console output. + +```shell copy +stencil bundle +``` + +2. For most issues, there is an option to run a script to update your files with the correct formatting. You can run the script by doing the following: + +a. Use the "dry run" option to see potential changes without making or saving those changes. + +```shell copy +stencil -scss-autofix.js --dry +``` + +b. To make the changes and revalidate, run the following: + +```shell copy +stencil -scss-autofix.js +``` + +```shell copy +stencil bundle +``` + +c. After making these changes, you can test your site to ensure there are no visual regressions. Run `stencil start` as usual to preview the site. + +```shell copy +stencil start +``` + +d. If everything looks good, push the changes live to your storefront by following your normal theme deployment workflow or running `stencil push`. + +```shell copy +stencil push +``` + +**If you are still experiencing issues, please get in touch with your development team, Customer Success Manager, or [BigCommerce customer support](https://support.bigcommerce.com/s/contact).** + +## Timeline + +**How long do I have? When will the legacy SCSS compiler (node-sass) be sunset?** + +Please make these changes immediately; we are sunsetting support for the `node-sass` package on **January 31, 2024**. After this date, you must compile all SCSS files with Stencil's updated SCSS compiler engine. This upgrade is necessary to ensure the security of our platform and to ensure that you are not running out-of-date packages that may expose your projects to additional security vulnerabilities. diff --git a/docs/stencil-docs/installing-stencil-cli/stencil-cli-options-and-commands.mdx b/docs/stencil-docs/installing-stencil-cli/stencil-cli-options-and-commands.mdx new file mode 100644 index 000000000..44fd2741a --- /dev/null +++ b/docs/stencil-docs/installing-stencil-cli/stencil-cli-options-and-commands.mdx @@ -0,0 +1,203 @@ +# Stencil CLI Options and Commands + + + +This article is a comprehensive command reference for Stencil CLI, BigCommerce's powerful theme development and deployment tool. For installation instructions for your OS, see [Installing Stencil CLI](/docs/storefront/stencil/cli/install). For more information on BigCommerce's Stencil Theme Engine, see [About Stencil](/docs/storefront/stencil/start). Continue reading below for detailed information on each Stencil CLI command and option. + + +BigCommerce is currently targeting January 31, 2024 to sunset its node-sass fork in favor of the latest [sass/node-sass](https://github.com/sass/node-sass). To ensure that your storefront is up to date, use the latest node version (Node 18) in Stencil CLI and use the CLI command to resolve [incompatible SCSS directives](/docs/storefront/stencil/cli/unexpected-behavior#incompatible-scss-directives), which can cause issues with the styling of your storefront. + + +## Commands overview + +The syntax to run a Stencil CLI command is as follows: + +```shell filename="Stencil CLI command syntax" copy +stencil COMMANDS [OPTIONS] +``` + +Running `stencil help` outputs a full list of commands and their descriptions. For more detailed information and usage examples, click a link in the table below: + +|Command |Description | +|-|--| +|[init](#stencil-init) |Interactively creates a `.stencil` file or `secrets.stencil.json` and `config.stencil.json` files (if using Stencil V3.1 release or later), which configures how to run a BigCommerce store locally.| +|[start](#stencil-init) |Starts up the BigCommerce storefront local development environment, using theme files in the current directory and data from the live store. | +|[bundle](#stencil-bundle) |Bundles up the theme into a structured `.zip` file, which can be uploaded to BigCommerce. | +|[pull](#stencil-pull) |Pulls the configuration from the active theme on your live store and updates your local configuration.| +|[download](#stencil-download) |Downloads the theme files from the active theme on your live store, overwriting local files if desired.| +|[push](#stencil-push) |Bundles the theme into `.zip` file; then directly uploads the `.zip` to BigCommerce. | +|[release](#stencil-release) |Creates a new release in a theme's GitHub repository. | +|[help](#stencil-help) |Displays help and returns all the options available to use for the specified command. | + + +![Basic Stencil CLI Options and Commands](https://storage.googleapis.com/bigcommerce-production-dev-center/images/CLI-options-commands.png "Basic Stencil CLI Options and Commands") + +## stencil help + +Displays help and returns all options available for the specified command. + +```shell filename="Usage: stencil help" copy +stencil help COMMAND +``` +  +```shell filename="Example: stencil help" copy showLineNumbers +~ $ stencil help +Usage: stencil [OPTIONS] COMMAND + +Options: + -V, --version output the version number + -h, --help output usage information +... +``` + +## stencil init + +Creates a `.stencil` file or `secrets.stencil.json` and `config.stencil.json` files (if using Stencil V3.1 release or later) used to configure the live preview when `stencil start` is run. You can specify the configuration information using the optional switches; if you do not specify the configuration information via options, Stencil CLI will prompt you to do so. + +NOTE: For custom templates, use only the `config.stencil.json` file. The `config.stencil.json` file contains theme-related configuration information like store URL, custom templates, etc. The `secrets.stencil.json` file contains the access token. + +```shell filename="Usage: stencil init" copy +stencil init [--url STORE_URL] [--token API_TOKEN] +``` + +| Option | Alias | Description | +|-|-|-| +| `--port HTTP_PORT` |`-p` | The `HTTP` port number to use when serving the live theme preview. | +| `--token API_TOKEN` |`-t` | The [BigCommerce API Token](https://support.bigcommerce.com/s/article/Store-API-Accounts). | +| `--url STORE_URL` |`-u` | The BigCommerce storefront URL. | + +## stencil start + +Starts the live theme preview using the theme files in the current directory. + +```shell filename="Usage: stencil start" showLineNumbers copy +stencil start [-V|--version] [-o|--open] [-v|--variation] [-t|--test] [-t|--tunnel] [-vb|--verbose] +stencil start [-h|--help] +``` +  +```shell filename="Example: stencil start" copy +stencil start --open # opens live theme preview in default browser +``` + +| Option |Alias| Description | +|-|-|-| +| `--version` |`-V` | Output the version number | +| `--open` |`-o` | Automatically open default browser | +| `--variation NAME` |`-v` | Set which theme variation to use while developing | +| `--channelId CHANNELID` |`-c` | Set the channel id for the storefront | +| `--timeout` |`-t` | Set a timeout for the bundle operation. Default is 20 secs | +| `--tunnel` | | Create a tunnel URL which points to your local server which anyone can use | +| `--no-cache` |`-n` | Turn off caching for API resource data (cache refreshes every 5 minutes) | +| `--verbose` |`-vb`| Enable verbose logging | +| `--help` |`-h` | Output usage information | + + + #### --theme-editor and --theme-editor-port [port]: + BigCommerce deprecated `-theme-editor` and `--theme-editor-port [port]` options as of v1.23.1. Please use [Page Builder](/docs/storefront/stencil/content/page-builder) instead. +  + + + + #### Authentication errors + If you receive an `Unauthorized, please use a valid username/token` error, authentication has failed. Make sure the API token you supplied is correct. For more information on creating store API accounts and generating tokens, see [Obtaining Store API Credentials](/docs/storefront/stencil/cli/development-server#step-3-serve-live-preview). + + +## stencil bundle + +Bundles up the theme into a structured `.zip` file, which can be uploaded to BigCommerce. + +```shell filename="Usage: stencil bundle" copy +stencil bundle +``` + +## stencil pull + +Pulls the configuration from the active theme on your live store and updates your local configuration. This is useful if any theme settings have been changed within Page Builder, as it will prevent you from overwriting them with your next theme upload by first syncing them. + +```shell filename="Usage: stencil pull" copy +stencil pull [OPTIONS] +``` + +| Option |Alias| Description | +|-|--|--| +|`--host HOSTNAME` |`-h` | Specify the API host (default: `api.bigcommerce.com`) | +|`--filename FILENAME` |`-f` | Specify the filename to use for the merged configuration (default: `config.json`) | +|`--saved` |`-s` | Downloads the most recently saved configuration instead of the live one. | +|`--channel_id CHANNEL_ID` |`-c` | Specify the channel ID of the storefront, if the store has multiple storefronts. | +|`--help` |`-h` | Output usage information | + +```shell filename="Example: stencil pull" copy +stencil pull +``` + +## stencil push + +Bundles up the theme into a structured `.zip file`; then directly uploads (pushes) the `.zip` to BigCommerce. + +```shell filename="Usage: stencil push" copy +stencil push [] +``` + +| Option |Alias| Description | +|-|--|--| +|`--version` |`-V` | Output the version number | +|`--host HOSTNAME` | | Specify the API host (default: `api.bigcommerce.com`) | +|`--file FILENAME` |`-f` | Specify the filename of the bundle to upload | +|`--save FILENAME` |`-s` | Specify the filename of the saved bundle | +|`--channel_ids CHANNEL_ID` |`-c` | Specify the channel ID(s) of the storefront, if the store has multiple storefronts | +|`--activate VARIATIONNAME` |`-a` | Skip activation prompt; specify variation or leave blank to select first variation | +| |`-a -c {{channel_id_1 channel_id_2 ... channel_id_n}}`| Allows you to apply a theme to selected channels (at least one channel id should be provided) | +| |`-a -all_channels` or `a -allc`| Allows you to apply a theme to all available channels. | +|`--delete` |`-d` | Delete oldest private, non-active theme if upload limit reached | +|`--help` |`-h` | Output usage information | + + +```shell filename="Example: stencil push" copy +stencil push -f Cornerstone-2.3.2.zip # uploads specified file, skips bundling if file already exists +``` + + #### --filename: + You can use the `-f` or `--filename` option in cases where you have already run `stencil bundle` to bundle your theme, but the resulting .zip file has not yet been uploaded to BigCommerce. Use the generated .zip file's **filename** as a parameter to identify the generated file in your theme directory. An example of the command is outlined below. + When you run `stencil push`, you can apply one theme to multiple storefront or channels. + When you run `stencil push` with the `-f` or `--filename` option, Stencil CLI skips all its bundling steps and diagnostics. It proceeds directly to uploading the specified file, displaying its processing progress bar to show upload status. + + +## stencil download + +Download the theme files from your live store, overwriting files in your local directory. + +```shell filename="Usage: stencil download" copy +stencil download [OPTIONS] +``` + +| Option |Alias| Description | +|-|--|--| +|`--host HOSTNAME` |`-h` | Specify the API host (default: `api.bigcommerce.com`) | +|`--file FILENAME` |`-f` | Specify a single file to download from the theme, e.g. `templates/layout/base.html` | +|`--exclude` |`-e` | Specify a directory to exclude from the download. | +|`--channel_id CHANNEL_ID` |`-c` | Specify the channel ID of the storefront, if the store has multiple storefronts. | +|`--help` |`-h` | Output usage information | + +```shell filename="Example: stencil download" copy +stencil download -f package.json +``` + +## stencil release + +Creates a new release in a theme’s GitHub repository. Developers outside BigCommerce can use this for forks (not master) of Stencil’s Cornerstone base theme, or for their own parallel themes independent of Cornerstone. + + +```shell filename="Usage: stencil release" copy +stencil release [OPTIONS] +``` + +| Option | Alias | Description | +|-|-|-| +| `--version` | `-V` | Output the version number | +| `--help` | `-h` | Output usage information | + +## Resources + +### Related Articles +* [Authorizing and Initializing the CLI](/docs/storefront/stencil/cli/install) +* [Troubleshooting Your Setup](/docs/storefront/stencil/cli/unexpected-behavior) diff --git a/docs/stencil-docs/installing-stencil-cli/troubleshooting-your-setup.mdx b/docs/stencil-docs/installing-stencil-cli/troubleshooting-your-setup.mdx new file mode 100644 index 000000000..a6e1b528f --- /dev/null +++ b/docs/stencil-docs/installing-stencil-cli/troubleshooting-your-setup.mdx @@ -0,0 +1,330 @@ +# Troubleshooting Your Setup + + +When you encounter unexpected behavior while developing your Stencil theme, start troubleshooting by checking the terminal window where you started Stencil CLI. + +In some cases, the terminal provides verbose error messages specifying where to look for problems. These have the potential to provide insight into the root cause of errors. For error messages that may not be helpful in revealing the issue you're experiencing, diagnostic suggestions are listed in this article. + + + BigCommerce is currently targeting January 31, 2024 to sunset its node-sass fork in favor of the latest [sass/node-sass (GitHub)](https://github.com/sass/node-sass). To ensure that your storefront is up to date, use the [latest Node.js version with long-term support (Node 18 LTS)](https://nodejs.org/en) to run the Stencil CLI and use the CLI command to resolve [incompatible SCSS directives](#incompatible-scss-directives), which can cause errors and consistency issues with your storefront's CSS. + + +## Incompatible SCSS directives + +To ensure that your storefront is up to date, perform the following steps: + +1. Using the latest version of Stencil CLI, run the `stencil bundle` command to validate your theme's code. Note any errors in the console output. + +```shell copy +stencil bundle +``` + +2. To ensure the correct formatting, update your theme files by running the following script. This step allows you to see changes before merging. + +```shell copy +stencil scss-autofix --dry +``` + +3. To commit the changes and revalidate, run the following commands: + +```shell showLineNumbers copy +stencil scss-autofix +stencil bundle +``` + +4. After making changes, you can test your site by running the following command: + +```shell copy +stencil start +``` + +5. If everything looks good, use the following command to push and deploy your changes to the storefront. + +```shell copy +stencil push +``` + +For more information, see [Incompatible Directives](/docs/storefront/stencil/cli/incompatible-directives). + +## Unsupported Node version + +If you receive the following error message, please reinstall Node.js to the [latest Node.js version with long-term support (Node 18 LTS)](https://nodejs.org/en): + +```text filename="Error, no parse method" showLineNumbers copy +Debug: internal, implementation, error + TypeError: Uncaught error: Object # has no method 'parse' + at internals.implementation + (/usr/local/lib/node_modules/stencil-cli/server/plugins/CssCompiler/index.js:32:26) +``` + +On MacOS, we have tested Stencil CLI most robustly on Node.js version 4.4.0. On Linux, we have tested most robustly on version 4.1.2. On Windows, we have tested most robustly on version 4.6.1. You’ll find detailed steps (for each operating system) in these instructions' Installing Stencil Prerequisites by OS section. + +## npm install errors + +The following headings represent errors that may occur when running the `npm install` command. The content under each heading issues a fix for the issue. + +### Unmet peer dependency error + +If you get any `Unmet Peer Dependency` errors when issuing the `npm install` command make sure you are running the `npm install` command **inside** your theme directory. + +If running the `npm install ` command inside your theme directory does not resolve the error, try one of the following: + +* Try removing your theme directory's `/node_modules/` subdirectory, by running `rm -rf node_modules` + +* Run the `npm cache clean` command + +* Re-run `npm install` + +### Permissions errors + +If you get a file-permissions error such as `EPERM` or `EACCES` when issuing the `npm install` command, try one of the workarounds listed on [Fixing npm Permissions](https://docs.npmjs.com/getting-started/fixing-npm-permissions) (docs.npmjs.com). + +### js/bundle errors + +If you get errors of the following type upon executing the `stencil init` command: + +```text showLineNumbers copy +Potentially unhandled rejection [6] TypeError: Error loading "js/bundle" +at file:/Users//Desktop/Fortune-1.4.6/assets/js/bundle.js +Error evaluating file:/Users//Desktop/Fortune-1.4.6/assets/js/bundle.js +Cannot read property 'createElement' of undefined... +``` + +Try the following workaround: + +1. Download and unzip a fresh copy of the theme. + +2. Refresh theme dependencies by running `npm install`. + +3. Run `stencil init`. + +*You will see the same error message as before, but proceed to:* + +4. Delete the `assets/js/bundle.js` file. + +5. Run `stencil init` again. +This should now execute properly. + +6. Run `stencil start`. + +7. Verify your theme's launch at: http://localhost:3000. + +### Stencil CLI as a non-global dependency + +If Stencil CLI is included as a dependency in a project's `package.json` file, you may get a long error message like the following when executing the `npm install` command: + +```text filename="Non-global invalid syntax error" showLineNumbers copy +npm ERR! gyp ERR! stack Error: Command failed: /usr/local/bin/python -c import sys; print "%s.%s.%s" % sys.version_info[:3]; +npm ERR! gyp ERR! stack File "", line 1 +npm ERR! gyp ERR! stack import sys; print "%s.%s.%s" % sys.version_info[:3]; +npm ERR! gyp ERR! stack ^ +npm ERR! gyp ERR! stack SyntaxError: invalid syntax +``` + +This error typically occurs when your `package.json` file includes an outdated version of Stencil CLI. In general, it's best to install Stencil CLI globally. It is not designed to function as a project dependency or devDependency. + +### Running stencil bundle errors + +Nowadays, `stencil bundle` runs several validation checks on a theme before it can be bundled and pushed to the store. + +You may see those errors because your theme has some missing properties in its translations files or frontmatter that have recently become required. + +For example, if your theme is missing a translation key in the `i18n.HeaderAndFooter` property of its `schemaTranslations.json` file, running `stencil bundle` may result in the following error: + +```text showLineNumbers copy +Error: Your theme's schemaTranslations.json has errors: +missing translation key "i18n.HeaderAndFooter" +``` + +The following error occurs when some translation keys in the `schemaTranslations.json` file are missed and aren't available to the theme. + +```text showLineNumbers copy +Error: Missed schemaTranslations.json file +``` + +```text showLineNumbers copy +Error: Your theme's schemaTranslations.json has errors: +unused translation key "i18n.ProductSaleBadges" +unused translation key "i18n.ShowProductSaleBadges" +``` + +The following error indicates that there is a trailing comma in the frontmatter of the `home.html` file. + +```test showLineNumbers copy +Error: Found unallowed trailing symbol in: "4,", while parsing frontmatter at ".....templates/pages/home.html". +``` + +### Node 18 support + +When you update the Node.js version, you can check to see whether you can update other theme packages, such as webpack, for updated feature support. + +## npm install and stencil init errors + +If you get an unexpected error messages when issuing the `npm install` or `stencil init` commands, check your Node.js version and ensure it aligns with a version compatible for the Stencil framework. + +## stencil init/stencil start errors + +If you get an unexpected error message or unexpected results upon executing the `stencil init`, `stencil start`, or other Stencil CLI commands, make sure you are working in the subdirectory for the specific theme you intend to launch. + +One way of checking what directory you are working in is by running the `pwd` command in your terminal. + +## Troubleshooting stencil start missing module errors + +If executing `stencil start` provokes errors like the following: + +```text showLineNumbers copy +module.js:327 +throw err; +^ + +Error: Cannot find module 'webpack' +at Function.Module._resolveFilename (module.js:325:15) +at Function.Module._load (module.js:276:25) +at Module.require (module.js:353:17) +at require (internal/module.js:12:17) +at Object. (/Users/jane.doe/themes/cornerstone/stencil.conf.js:2:15) +at Module._compile (module.js:409:26) +at Object.Module._extensions..js (module.js:416:10) +at Module.load (module.js:343:32) +at Function.Module._load (module.js:300:12) +at Module.require (module.js:353:17) +``` + +switch to your theme directory and run `npm install`. Running this command will add the missing JavaScript library dependencies. + +If you receive the same error again after running `npm install`, you should completely uninstall and reinstall both the Stencil framework and Node.js. + +## MacOS: Xcode/iOS license... errors + +On MacOS, if you have recently installed a new version of Xcode, the command line will display the following error when you next try to use or reinstall Stencil: + +```text +error: Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo. +``` + +To resolve this error, do the following: +* Launch Xcode. +* Accept its user agreement. +* Quit Xcode. +* Re-execute your Stencil command. + +## ETIMEOUT errors on Node > 4.4.0 + +If you are running a version of Node.js higher than 4.4.0, and you receive an `ETIMEOUT` error when running Stencil CLI, re-install the latest version of Stencil CLI to resolve this error by following the workflow in Installing Stencil CLI/Framework. + +## Troubleshooting stencil command not found + +### Reinstall Stencil CLI + +If you receive the error message -bash: `stencil: command not found`, ensure that you have followed the steps on Installing Stencil CLI/Framework or attempt to reinstall the Stencil CLI. + +### Redirect Bash shell + +If you receive the error message -bash: stencil: command not found, enter echo $NVM_DIR. If this command returns nothing, then run source ~/.bash_profile and try running stencil commands again. + +### Check/specify nvm version + +If you receive a `stencil: command not found` error message upon executing stencil start from inside your theme subdirectory: Check whether nvm has installed multiple versions of Node.js, by entering the following command: + +```shell copy +ls ~/.nvm/versions/node +``` + +If this reports more than one version, specify your platform's supported Node.js `` by entering: + +```shell copy +nvm use +``` + +To prevent this error from recurring, add the same `nvm use ` command to your ~/.bash_profile file. + + + +## Troubleshooting stencil start errors + +### Unauthorized...username/token error + +If executing the `stencil start` command generates an `Unauthorized, please use a valid username/token` error, make sure the `.stencil` file or `secrets.stencil.json` and `config.stencil.json` files (if using Stencil V3.1 release or later) contain the correct store URL. Also, verify that you copied the correct username and token. If you continue to get the same error, please reissue tokens. + +### 403 errors + +If the Stencil server responds with a `403` error and you are using a proxy-based domain service like Cloudflare or Amazon Cloudfront, modify your hosts file to map the localhost to your BigCommerce store IP address. + +## 500 errors + +If you see errors like or _similar_ to below: + +```json +{ + "statusCode": 500, + "error": "Internal Server Error", + "message": "An internal server error occurred" +} +``` + +They often indicate a template syntax error, such as unmatched or missing punctuation. Check your terminal window for more details. + +## Lint errors upon bundling + +If bundling your theme triggers multiple lint errors related to the `bundle.js` file, your theme is missing the `.eslintignore` file. Retrieve this file from the [Cornerstone repo](https://github.com/bigcommerce/cornerstone), then re-run `stencil bundle`. + +## Module not found errors upon bundling + +If you see the following error when running stencil bundle, this is a past bug that has since been corrected. + +```text +[ModuleNotFoundError: Module not found: Error: Cannot resolve module 'pace' in...] +``` + +To remove the error, please update your Cornerstone version. + +## Short undescriptive JavaScript diagnostics + +If JavaScript errors in your browser's developer tools are not reporting filenames and line numbers, try changing your `webpack.conf.js` file's sourcemap entry from: + +```js copy +{ + devtool: 'eval-cheap-module-source-map' +} +``` + +to: + +```js copy +{ + devtool: 'eval-source-map' +} +``` + +The `eval-cheap-module-source-map` option performs faster rebuilds, but omits line numbers. The `eval-source-map` option is slower, but more verbose. + +## TR-300 error upon theme upload + +If uploading your theme triggers a TR-300 error, this can indicate an included source-map file (`bundle.js.map`) that exceeds its size limit of 5 MB. If your `bundle.js.map` exceeds that limit, the workaround is to move this file outside your theme directory before re-running `stencil bundle`. + +Other reasons for this error include exceeding these stencil theme limitations: +* Max file size for `/templates/` and `/parsed/templates/`: 1 MB +* Max for any single file in the bundle: 5 MB +* Max zipped size: 50 MB +* Max unzipped size: 100 MB +* Max total files: 2500 + +## Reinstalling Stencil CLI + +If you encounter persistent problems in initializing or starting Stencil, you have the option of completely removing Stencil CLI and doing a fresh reinstall. You would do so as follows: + +1. From your command line, issue the command: + +```shell copy +npm uninstall -g @bigcommerce/stencil-cli +``` + +2. Navigate back to the Installing and Launching Stencil section and repeat all installation steps to reinstall dependencies and restore your theme, according to your development scenario. + +A more drastic measure is to uninstall and reinstall Stencil CLI's Node.js prerequisites, along with uninstalling Stencil CLI. We do not recommend this, as it might disable other Node.js applications on your local machine. + +## Resources + +### Related articles +* [Authorizing and Initializing the CLI](/docs/storefront/stencil/cli/install) +* [Stencil CLI Options and Commands](/docs/storefront/stencil/cli/options-and-commands) diff --git a/docs/stencil-docs/javascript-and-event-hooks/adding-javascript.mdx b/docs/stencil-docs/javascript-and-event-hooks/adding-javascript.mdx new file mode 100644 index 000000000..15474a546 --- /dev/null +++ b/docs/stencil-docs/javascript-and-event-hooks/adding-javascript.mdx @@ -0,0 +1,343 @@ +--- +title: Adding JavaScript to Your Theme +keywords: stencil, js, javascript, if, +--- + +# Adding JavaScript to Your Theme + +## Bundling and minification + +A small web application, such as a theme, can include rich user interactions that depend on many small JavaScript and CSS modules. If we were to embed each of the JavaScript modules in a template file with a separate ` +``` + +You can compose your JSON object across multiple pages, to create a different set of client-side data depending on the currently loaded template context. + +Stencil's Cornerstone base theme makes the `jsContext` available as `this.context`, both on the active page scoped and on global `PageManager` objects. + +## Placing modules in assets/js/ + +You can freely create subdirectories within `assets/js/`, to contain new JavaScript modules. The constraint is that all JavaScript files in each module must use the `.js` file extension. + +## Theme-specific JavaScript modules + +In your theme's `assets/js/theme/` subdirectory, you will find a tree of JavaScript files. Each file is a JavaScript module. Some modules are for specific page types. Others are common modules that can be used in other modules. Still others are global modules that are available on every page. + +## Mapping page types to JavaScript modules + +To find the mapping from page types to modules in `assets/js/theme/`, examine the `pageClasses` object in the file: `assets/js/app.js`. + +Each `=>import(...)` function within this class maps a page type to the entry module for that page type. For example, when the `cart` page type is loaded in the browser, the JavaScript module named `cart` will be loaded. + +### Mapping example in app.js + +Below is an excerpt of mappings from the Cornerstone base theme's [assets/js/app.js](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/app.js). + +```javascript showLineNumbers copy +import Global from './theme/global'; + +const getAccount = () => import('./theme/account'); +const getLogin = () => import('./theme/auth'); +const noop = null; + +const pageClasses = { + account_orderstatus: getAccount, + account_order: getAccount, + account_addressbook: getAccount, + shippingaddressform: getAccount, + account_new_return: getAccount, + 'add-wishlist': () => import('./theme/wishlist'), + account_recentitems: getAccount, + account_downloaditem: getAccount, + editaccount: getAccount, + account_inbox: getAccount, + account_saved_return: getAccount, + account_returns: getAccount, + account_paymentmethods: getAccount, + account_addpaymentmethod: getAccount, + account_editpaymentmethod: getAccount, + login: getLogin, + createaccount_thanks: getLogin, + createaccount: getLogin, + getnewpassword: getLogin, + forgotpassword: getLogin, + blog: noop, + blog_post: noop, + brand: () => import('./theme/brand'), + brands: noop, + cart: () => import('./theme/cart'), + category: () => import('./theme/category'), + compare: () => import('./theme/compare'), + page_contact_form: () => import('./theme/contact-us'), + error: noop, + 404: noop, + giftcertificates: () => import('./theme/gift-certificate'), + giftcertificates_balance: () => import('./theme/gift-certificate'), + giftcertificates_redeem: () => import('./theme/gift-certificate'), + default: noop, + page: noop, + product: () => import('./theme/product'), + amp_product_options: () => import('./theme/product'), + search: () => import('./theme/search'), + rss: noop, + sitemap: noop, + newsletter_subscribe: noop, + wishlist: () => import('./theme/wishlist'), + wishlists: () => import('./theme/wishlist'), +}; +``` + +### Mapping example in cart.js + +Inside the `cart` module ([assets/js/theme/cart.js](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/theme/cart.js)), other modules are imported, and custom JavaScript methods for the cart module are created for the `Cart` class. + +Below is an excerpt from Cornerstone's `assets/js/theme/cart.js` file. + +```javascript showLineNumbers copy +import PageManager from './page-manager'; +import _ from 'lodash'; +import giftCertCheck from './common/gift-certificate-validator'; +import utils from '@bigcommerce/stencil-utils'; +import ShippingEstimator from './cart/shipping-estimator'; +import { defaultModal } from './global/modal'; +import swal from './global/sweet-alert'; + +export default class Cart extends PageManager { + onReady() { + this.$cartContent = $('[data-cart-content]'); + this.$cartMessages = $('[data-cart-status]'); + this.$cartTotals = $('[data-cart-totals]'); + this.$overlay = $('[data-cart] .loadingOverlay') + .hide(); // TODO: temporary until roper pulls in his cart components + + this.bindEvents(); + } + + cartUpdate($target) { + const itemId = $target.data('cartItemid'); + const $el = $(`#qty-${itemId}`); + const oldQty = parseInt($el.val(), 10); + const maxQty = parseInt($el.data('quantityMax'), 10); + const minQty = parseInt($el.data('quantityMin'), 10); + const minError = $el.data('quantityMinError'); + const maxError = $el.data('quantityMaxError'); + const newQty = $target.data('action') === 'inc' ? oldQty + 1 : oldQty - 1; + // Does not quality for min/max quantity + if (newQty < minQty) { + return swal({ + text: minError, + type: 'error', + }); + } else if (maxQty > 0 && newQty > maxQty) { + return swal({ + text: maxError, + type: 'error', + }); + } + } +} +``` + +## Mapping custom templates to JavaScript modules + +If you add [custom page templates](/docs/storefront/stencil/themes/templates) to your theme, you can edit the same `assets/js/app.js` file to map each custom template to an appropriate JavaScript module. + +In the following example, we will map a custom JavaScript file, `assets/js/themes/custom.js` to a custom product page file `templates/pages/custom/product/customProd.html`. + +```js showLineNumbers copy +import PageManager from "./page-manager"; + +export default class Custom extends PageManager { + onReady(){ + alert("Hello world!"); + } +} +``` + +This is a basic module that creates a class called `Custom` which extends the PageManager class. + +```html showLineNumbers copy +{{~inject 'template' template}} +

    Hello World!

    + +Some custom content! + + + + +``` + +In order to successully map your custom module to a custom template file, that file must do the following: +* Inject the custom template +* Load webpack +* Load the main theme bundle +* Load stencilBootstrap + +It is a good idea to pull in `{{>layout/base}}` to your custom template file because of these requirements. + +Finally, use the customClasses function in `assets/js/app.js` to map the custom page file to your custom template. Your app.js file should look like this: + +```js showLineNumbers copy +const customClasses = { + 'pages/custom/product/customProd': () => import('./theme/custom'), // Mac/Linux + 'pages\\custom\\product\\customProd': () => import('./theme/custom'), // Windows +}; +/** + * This function gets added to the global window and then called + * on page load with the current template loaded and JS Context passed in + * @param pageType String + * @param contextJSON + * @returns {*} + */ +window.stencilBootstrap = function stencilBootstrap(pageType, contextJSON = null, loadGlobal = true) { + const context = JSON.parse(contextJSON || '{}'); + + return { + load() { + $(() => { + // Load globals + if (loadGlobal) { + Global.load(context); + } + + const importPromises = []; + + // Find the appropriate page loader based on pageType + const pageClassImporter = pageClasses[pageType]; + if (typeof pageClassImporter === 'function') { + importPromises.push(pageClassImporter()); + } + + // See if there is a page class default for a custom template + const customTemplateImporter = customClasses[context.template]; + if (typeof customTemplateImporter === 'function') { + importPromises.push(customTemplateImporter()); + } + + // Wait for imports to resolve, then call load() on them + Promise.all(importPromises).then(imports => { + imports.forEach(imported => { + imported.default.load(context); + }); + }); + }); + }, + }; +}; +``` + +## Summary + +To review the basics of using JavaScript in your Stencil theme: + +* Stencil automatically bundles and minifies JavaScript modules to optimize page performance. +* To insert custom JavaScript on a particular page in your theme, edit the JavaScript module that corresponds to the page's type. +* To add files from third-party JavaScript modules to a theme, use npm where possible. +* To add JavaScript modules not distributed via npm, you can create new subdirectories within [assets/js/](https://github.com/bigcommerce/cornerstone/tree/master/assets/js). +* Theme-Specific JavaScript modules are provided in the theme's [assets/js/theme/](https://github.com/bigcommerce/cornerstone/tree/master/assets/js/theme) subdirectory. +* To find the mapping between modules in assets/js/theme/ and page types, examine the PageClasses object contained in [assets/js/app.js](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/app.js). +* You can map JavaScript modules to custom page templates by editing the [assets/js/app.js](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/app.js) file. diff --git a/docs/stencil-docs/javascript-and-event-hooks/customizing-javascript.mdx b/docs/stencil-docs/javascript-and-event-hooks/customizing-javascript.mdx new file mode 100644 index 000000000..ed606d288 --- /dev/null +++ b/docs/stencil-docs/javascript-and-event-hooks/customizing-javascript.mdx @@ -0,0 +1,155 @@ +# Customizing JavaScript + + + +Most [Cornerstone theme](https://github.com/bigcommerce/cornerstone) page template files located in `templates/pages/` have a corresponding `.js` file in `assets/js/theme/`. These JavaScript files contain event handlers and logic for managing page specific elements and actions. + +For example, `assets/js/theme/product.js` corresponds to `templates/pages/product.html` and contains a `productReviewHandler()` and `bulkPricingHandler()`. These functions are implemented within a derived `Product` class which extends an abstract class called `PageManager`. This same pattern is repeated in all `assets/js/theme/*.js` files. + + +By default, all derived `PageManager` classes contain an `onReady` method functionally similar to `JQuery.ready()`. Additionally, certain pages have unique event handlers. For example, the `cartUpdate` handler in `assets/js/cart.js` runs each time certain cart elements are changed. Developers can customize and enhance page behavior and functionality by editing code within these event handlers or by creating their own event handlers. + + +To demonstrate, this article describes how to add some very simple JavaScript to `product.js`. + +## Modifying a page's JavaScript + +In this example, we will add some "Hello World!" text to the product page's `onReady` event. We'll first add a call to the function. Then, we will implement the function itself. + + +In `assets/js/theme/product.js` file, add a call to `this.helloWorld()` to the bottom of the `onReady()` method, which we'll implement in the next step. + + +```js showLineNumbers copy +export default class Product extends PageManager { + constructor(context) { + super(context); + this.url = window.location.href; + this.$reviewLink = $('[data-reveal-id="modal-review-form"]'); + this.$bulkPricingLink = $('[data-reveal-id="modal-bulk-pricing"]'); + } + + onReady() { + // ... + // Example Code + this.helloWorld(); + } + // ... +} +``` + +Next, implement the `helloWorld()` function by adding it to the `Product` class just after the closing `onReady()` bracket. + +```javascript showLineNumbers copy +export default class Product extends PageManager { + constructor(context) { + super(context); + this.url = window.location.href; + this.$reviewLink = $('[data-reveal-id="modal-review-form"]'); + this.$bulkPricingLink = $('[data-reveal-id="modal-bulk-pricing"]'); + } + + onReady() { + // ... + + // Example Code + this.helloWorld(); + } + + // Example Code + helloWorld() { + console.log("[assets/js/theme/product.js]: Hello World!"); + } + // ... +} +``` + +In your browser, refresh any product details pop-up or page to see your new "Hello World" message. If you are using the Stencil CLI and browsing to localhost, you may need to restart for the most recent changes to be reflected. + + +## Bringing in Handlebars context + + +You can inject any variables from the Handlebars context into your client-side JavaScript by using the `{{inject...}}` expression. + +```html copy +{{inject 'productThumbSize' theme_settings.productthumb_size}} +``` + +To inject `theme_settings.productthumb_size` into the product page's context, add `{{inject 'productThumbSize' theme_settings.productthumb_size}}` just under `{{#partial "page"}}` in `templates/pages/product.html<`: + +```html showLineNumbers copy +product: + videos: + limit: {{theme_settings.productpage_videos_count}} + reviews: + limit: {{theme_settings.productpage_reviews_count}} + related_products: + limit: {{theme_settings.productpage_related_products_count}} + similar_by_views: + limit: {{theme_settings.productpage_similar_by_views_count}} + +{{#partial "page"}} + + {{inject 'productThumbSize' theme_settings.productthumb_size}} + + +{{/partial}} +{{> layout/base}} +``` + +The injected `productThumbSize` property can then be accessed from `product.js` by calling `this.context.productThumbSize`. + +```js showLineNumbers copy +export default class Product extends PageManager { + constructor(context) { + super(context); + this.url = window.location.href; + this.$reviewLink = $('[data-reveal-id="modal-review-form"]'); + this.$bulkPricingLink = $('[data-reveal-id="modal-bulk-pricing"]'); + } + + onReady() { + //... + // Example Code + this.helloWorld(); + } + + // Example Code + helloWorld() { + console.log("[assets/js/theme/product.js]: Hello World!"); + console.log("[assets/js/theme/product.js]: " + this.context.productThumbSize); + } + // ... +} +``` + +Note that the `console.log(this.context.themeImageSizes);` statement will report the configured image size, following the "Hello World!" message previously defined in [Modifying a Page's JavaScript](#modifying-a-pages-javascript) above. + + + +``` showLineNumbers copy +[/assets/js/theme/product.js]: Hello World! +product.js:63 [/assets/js/theme/product.js]: 100x100 +``` + +## Installing libraries + +Once you have installed the default Stencil theme, you can add custom JavaScript libraries with npm. + + +```shell copy +npm install jquery +``` + +Next, you would open `assets/js/theme/product.js`, and insert the statements excerpted below: + +```js showLineNumbers copy +import $ from 'jquery'; + +$('.myElement').click(() => { + alert("You clicked myElement"); +}); +``` + +For additional installation instructions, refer to your chosen library's documentation. diff --git a/docs/stencil-docs/javascript-and-event-hooks/dynamic-content-rendering.mdx b/docs/stencil-docs/javascript-and-event-hooks/dynamic-content-rendering.mdx new file mode 100644 index 000000000..6953b4868 --- /dev/null +++ b/docs/stencil-docs/javascript-and-event-hooks/dynamic-content-rendering.mdx @@ -0,0 +1,235 @@ +--- +title: Dynamic Content Rendering on Stencil Storefronts +keywords: js, javascript, if, +--- + +# Dynamic Content Rendering on Stencil Storefronts + +_We're gratefully sharing techniques devised by Ken Utting, Web Developer for BigCommerce client goruck.com_. + +## Why Dynamic Content? + +At GORUCK, we've customized our Stencil theme (currently using the [Merchant](https://www.bigcommerce.com/theme/merchant-light/?_ga=2.52710120.1984523106.1539568940-967431010.1523308107) theme) to provide several ways to update our site content without requiring changes to the theme itself. This allows our content folks to make changes to our theme without having to wait on our software developers. + +Also, by pushing content out of the theme, these techniques reduce the differences between our customized theme and the out-of-the-box (base) theme – which makes it easier to integrate ongoing updates into our theme. Finally, these techniques allow us share identical content across pages without copying and pasting. + +Three techniques in particular have proven useful to us. We call them Dropzones, Dynamic Tabs, and Snippets. There is nothing particularly special to GORUCK about these techniques, so there is no reason you can't adopt them for your own store/theme. + +### Building on the Control Panel + +The BigCommerce control panel provides an HTML editor where you can enter custom content for Products, Categories, and custom static pages (Storefront > Web Pages). However, we encountered the following limitations: + +The HTML editor will remove a number of tags, particularly style and script tags. + +Without changes like the ones we made at GORUCK (described below), all the content will be placed in a single location on the page. + +At GORUCK, we needed the ability to inject arbitrary HTML into our page, and to place that content at various specific page locations. To achieve this, we developed the three techniques described below. + +## Dropzones + +Let's say that at the top of your category pages, you want to display a full-width, category-specific, image. And at the bottom of these pages, you want to display a category-specific message or image gallery. + +One possibility is to define a custom page for every category. But aside from the work involved to set this up, every time you added or removed a category, you would need to add or remove a custom page from your theme. And of course, it's possible that you would also want control like this on product pages, and on other pages on your storefront. + +A more general solution we implemented was to create a small set of custom pages: one for categories, one for products, and so on. Each of the custom pages contains a few `div` elements that define dropzones for that page. + +With these dropzones defined, we can then populate them with dynamic content specific to any instance of the page. Here is an example of a dropzone that places an image gallery at the bottom of a category page: + +![Dropzone that places an image gallery at the bottom of a category page](https://storage.googleapis.com/bigcommerce-production-dev-center/images/stencil-storefronts-dropzone.png "Dropzone that places an image gallery at the bottom of a category page") + +### Dropzones HTML + +The HTML for a dropzone is simply something like: + +`
    ` + +where the div's `id` defines the dropzone's name. + +Then, using the BigCommerce **control panel's custom HTML editor** (in this example, the Categories editor), we place our content inside div tags that specify the dropzone where the content should be inserted. Here is a simple example: + +```handlebars showLineNumbers copy +
    +

    This content will be placed in a dropzone at the top of the page, because that dropzone has the id matching our data-gr-zone attribute.

    +
    +``` + +### Dropzones HTML Example + +Here is an example of some HTML that we actually use: + +```handlebars showLineNumbers copy +
    +

    GORUCK GEAR IN THE FIELD

    + +
    +``` + +### Dropzones JavaScript + +The content is moved from the default location to the dropzone by JavaScript we added to the PageManager class. In BigCommerce's Cornerstone base theme, Pixel Union's Merchant theme, and other Stencil themes, PageManager is the parent class of all page classes. So, its methods get invoked on every page. This makes it a great place to put code like this, which needs to run every time a page is loaded. + +We modified our theme's PageManager.before method to invoke a new method named `gr_moveHtmlToDropzones`: + +```js showLineNumbers copy +gr_moveHtmlToDropzones () { + $(".gr-dropzone").each(function () { + const $this = $(this); + const zoneId = $this.data("gr-zone"); + if (zoneId) { + $("#" + zoneId).html($this.html()); // copy the html to where it should be + $this.remove(); // remove the html from its temporary location + } else { + console.warn("PageManager.gr_moveHtmlToDropzones: dropzone has no target."); + } + }); +} +``` + +Finally, in our .scss file, we set the `.gr-dropzone` class to display: none. This prevents the content from appearing on the page in the wrong location before PageManager has a chance to move it into the dropzone. + +## Dynamic Tabs + +Our Stencil base theme presents information on our product pages in several tabs. We wanted to introduce several new tabs, and to vary the tabs by product category and brand. Additionally, we wanted the ability to store a tab's content in an external file, on our WebDAV or CDN (content delivery network). + +By storing content in an external file, we can share identical content across pages, without copying and pasting. Also, changes to the content can be made just once, and be reflected on all our pages. + +So we implemented a feature we call Dynamic Tabs. Dynamic Tabs are similar to dropzones, in that they allow you to use the control panel's HTML editor to provide content, while moving it to a specific location on the page. In this case, our content will appear in a tab. + +In the example below, we use this technique to place the `RIGHT BY YOU` tab in the fourth position: + +![right by you](https://storage.googleapis.com/bigcommerce-production-dev-center/images/right_by_you.png) + +### Dynamic Tabs HTML + +There are two versions of the HTML. The first is designed for a tab you want to drop in using a page's own HTML: + +```handlebars showLineNumbers copy +
    + CONTENT +
    +``` + +The second version is designed for a tab that gets its content from an external file: + +```handlebars showLineNumbers copy +
    +
    +``` + +In this second case, the HTML in that external file must start with the POSITION and TITLE information: + +```handlebars showLineNumbers copy + + CONTENT +``` + +### Dynamic Tabs Parameters + +POSITION is a number, which determines where the dynamic tab will be put. For example, a POSITION of 3 means that the tab will be placed after the third tab. + +We use a POSITION of 0 to place a tab ahead of the first tab. If the POSITION attribute is omitted, the tab will be placed after all the other tabs. (Note that if you add multiple dynamic tabs, any POSITION that you specify must account for the previously inserted dynamic tabs.) + +TITLE is the text you want to display as the tab's title. For example: Our Guarantee. + +CONTENT is any arbitrary HTML, and is displayed when the user clicks on the tab's title. + +### Dynamic Tabs HTML Example + +To create the RIGHT BY YOU tab in the screenshot above, we added this code to our base theme's templates/pages/product.html template: + +```handlebars showLineNumbers copy + +
    +
    +``` + +This tells our code to pull in a file named `dynamicTab1.html`, located in our WebDAV's `/content/tabs/` folder. The querystring is used just to defeat caching. + +Here are the contents of our `dynamicTab1.html` file: + +```handlebars showLineNumbers copy + +
    +
    +
    +
    + +
    +
    +

    Free & Easy Returns

    +

    Don't like it? Send it back for free. Returnable in like-new condition within 30 days and + every order comes with a free return shipping label. Too easy.

    +
    +
    + +
    +
    + +
    + +
    +

    Challenge Excellence

    +

    We have two grades, A and F and A- rounds down. Excellence is the standard and please hold us to it, + we want you to love your gear as much as we do.

    +
    +
    + +
    +
    + +
    +
    +

    Do Right By People

    +

    Our goal is to run a company our grandfathers would be proud of. And the central tenet + — an oldie but a goodie — is that we do whatever it takes to do right by people. + Contact us at + team@goruck.com with any questions and we'll get back to you ASAP.

    +
    +
    +
    +
    +``` + +### Dynamic Tabs JavaScript + +Again, the JavaScript code to implement Dynamic Tabs is invoked in the PageManager class' before method. The Dynamic Tabs code is more complex, and it relies on other classes we wrote to get content from the external server and cache it in the browser. + +Nevertheless, none of it is rocket science. The three classes involved are 250 lines of code. Interested readers are invited to contact me via the BigCommerce Developers forum for more information about the implementation. + +## Snippets + +Snippets are similar to Dynamic Tabs, in that they allow you to use the BigCommerce control panel's HTML editor to provide content, but pull it from a separate file. This allows you to share common content across multiple pages. + +Also, because the control panel's HTML editor strips out stylesheets, this is a good way to provide page-specific styles for a page. + +We use snippets at GORUCK to display our sizing charts, as shown below. This makes sense since because we have a handful of charts that need to be shared across many products, so we don't want to copy and paste each chart for every product that needs it. + +![goruck](https://storage.googleapis.com/bigcommerce-production-dev-center/images/goruck.png) + +## Snippets HTML + +Here is the format of the HTML that needs to placed on each page that uses the snippet: + +```handlebars showLineNumbers copy +
    + Loading... +
    +``` + +The external file can contain any arbitrary HTML and CSS, and the styled HTML is displayed in the page location where the `gr-snippet` div is located. + +### Snippets JavaScript + +Like Dropzones and Dynamic Tabs, the Snippets code is invoked in `PageManager`'s `before` method. Snippets adds just another 50 lines of JavaScript code to the theme, also relying on the same code that Dynamic Tabs uses to get the external file and cache it in the browser. + +## Recap + +At GORUCK, we've developed a number of techniques that allow us to separate our content from our theme. These techniques have proved valuable to us, because they allow us to: + +* Keep our content development and software development workflows separate. +* Reduce modifications to our theme, which simplifies merging updates from our theme provider. +* Share content across multiple pages. +* Tailor our content based on product category and brand. diff --git a/docs/stencil-docs/javascript-and-event-hooks/event-hooks.mdx b/docs/stencil-docs/javascript-and-event-hooks/event-hooks.mdx new file mode 100644 index 000000000..025bfa410 --- /dev/null +++ b/docs/stencil-docs/javascript-and-event-hooks/event-hooks.mdx @@ -0,0 +1,113 @@ + +# Using Event Hooks + + + +Stencil themes provide access to remote resources through data tags and event hooks. Developers can use these hooks to trigger defined events. A theme can hook to an event to perform actions or calculations based on shopper behavior. + +Stencil themes incorporate event hooks by importing the stencil-utils module. If take a look at [cornerstone/assets/js/theme/](https://github.com/bigcommerce/cornerstone/tree/master/assets/js/theme), you will see the import statement `'import utils from '@bigcommerce/stencil-utils';` at the top of files using leveraging event hooks. + +## Cookie Notification Example + +In the example below, the `cookie-privacy-notification` hook enables customization of the alert window that displays European Union–required cookie notifications: + +First, ensure you have loaded the `stencil-utils` package with the following command: + +`import utils from '@bigcommerce/stencil-utils';` + +European websites must notify users of cookies to comply with European Union law. +The following code implements a hook that will alert shoppers that the website uses cookies. + +```js filename="Example cookie notification hook" showLineNumbers copy +export default function() { + + // Here you can override the default browser alert box by + // hooking to the 'cookie-privacy-notification' hook. + utils.hooks.on('cookie-privacy-notification', (event, privacyMessage) => { + + // You can make your own custom modal or alert box + // appear in your theme using the privacyMessage provided + myCustomAlert(privacyMessage); + + // Call event.preventDefault() to prevent the default + // browser alert from occurring in stencil-utils + event.preventDefault(); + }); +} +``` + +A theme would listen for the `cookie-privacy-notification` event to override the browser’s default notification UI. + +## Cart Dialog Example + +In the following code snippet from Cornerstone in [templates/components/products/product-view.html](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/products/product-view.html), note the data tag named `data‑cart‑item‑add`: + +```handlebars filename="templates/components/products/product-view.html: data‑cart‑item‑add" showLineNumbers copy + +``` + +This data tag enables the emission of the `cart‑item‑add` event in this next snippet: + +```js filename="Emitter, cart‑item‑add event" showLineNumbers copy +/* + * Import all product-specific js + */ +[...] +import utils from '@bigcommerce/stencil-utils'; +[...] +addProductToCart() { + utils.hooks.on('cart-item-add', (event) => { + event.preventDefault(); + }); +} +``` + +## Stencil Data Tags and Event Hooks +Stencil themes provide the following chains of data tags, delegated DOM (Document Object Model) events, emitted Stencil event hooks, and Stencil event parameter(s). + +### Cart Item Added + +Hook for items added to the customer’s shopping cart. + +```js filename="Function signature: cart item added" showLineNumbers copy +itemAdd() { + this.$body.on('submit', '[data-cart-item-add]', (event) => { + this.emit('cart-item-add', event, event.target); + }); +} +``` + + + +| Data Tag | Delegated DOM Event | Stencil Event/Hook | Stencil Event Parameters | +|---|---|---|--| +| data-cart-item-add | submit | cart-item-add | event, event.target | + +### Faceted-Search Events + +Hooks for faceted-search selections that the customer initiates or submits. + + +```js filename="Function signature: faceted-search events" showLineNumbers copy +searchEvents() { + this.$body.on('click', '[data-faceted-search-facet]', (event) => { + this.emit('facetedSearch-facet-clicked', event); + }); + + this.$body.on('submit', '[data-faceted-search-range]', (event) => { + this.emit('facetedSearch-range-submitted', event); + }); +} +``` + +| Data Tag | Delegated DOM Event | Stencil Event/Hook | Stencil Event Parameter(s) | +|---|---|---|--| +| data-faceted-search-facet | click | facetedSearch-facet-clicked | event | +| data-faceted-search-range | submit | facetedSearch-range-submitted | event | + + +## Resources + +### Additional Resources +* [cookieNotification.js](https://github.com/bigcommerce/cornerstone/blob/637ef1b0ff130333aea128663daa6d1a4d37fb78/assets/js/theme/global/cookieNotification.js) (BigCommerce GitHub) diff --git a/docs/stencil-docs/javascript-and-event-hooks/npm-tutorials.mdx b/docs/stencil-docs/javascript-and-event-hooks/npm-tutorials.mdx new file mode 100644 index 000000000..24ccb0553 --- /dev/null +++ b/docs/stencil-docs/javascript-and-event-hooks/npm-tutorials.mdx @@ -0,0 +1,276 @@ +--- +title: Using npm and React to Customize Your Theme +keywords: stencil, js, javascript, node, mern, if, +--- + +# Using npm and React to Customize Your Theme + +Stencil's architecture allows for organized customization using npm and React. In production, you can use these tools for stylizing seasonally themed products, temporary promotions, or event tickets. Below is a short tutorial on using npm and React to customize your Stencil theme. + +In this example, we'll be making a drawer that sends a coupon code to the customer's email using Material UI's React framework. The resulting customization will look like the following: + +![Image of Coupon Drawer example](https://storage.googleapis.com/bigcommerce-production-dev-center/images/coupon_drawer_example.png) + +### Prerequisites + +- Stencil CLI installed +- BigCommerce store +- Cornerstone Stencil theme with npm installed +- Knowledge of HTML and JavaScript + +To set up a BigCommerce store, see [Creating a Trial Store](https://support.bigcommerce.com/s/article/Starting-a-Bigcommerce-Trial#creating). + +## Installing React and npm packages + +To build this customization, complete the instructions in the following sections. + +### Install dependencies + +For this example, we'll be using packages from [Material-UI](https://material-ui.com/). These components require certain modules. + +Navigate into the root Cornerstone theme folder, then install the following npm packages. + +```shell showLineNumbers copy +# navigate into theme dir +cd ~/path/to/theme/dir + +# install dependencies +npm install --save-dev @material-ui/core react react-dom babel-plugin-transform-object-assign @babel/preset-react +``` + +### Update webpack.common.js + +Update` webpack.common.js` with the new presets and plugins. + +```js filename="Example 1: New presets and plugins" showLineNumbers copy +... +plugins: [ + ... + 'transform-object-assign', + ], +``` + +  + +```js filename="Example 2: New presets and plugins" showLineNumbers copy +... +presets: [ + ['@babel/preset-env', { + ... + }], '@babel/react', + ], +``` + +### Create components + +In the following steps, we'll be adding React components to assemble our coupon drawer. + +1. Navigate to the `./assets/js` folder. +2. Create a `/components` folder within the `/js` folder. +3. Navigate into the `/components` folder. +4. Create a `CouponDrawer.js` file. +5. Copy the following code into the file: + +```js filename="CouponDrawer.js" showLineNumbers copy +import React from 'react'; +import Drawer from '@material-ui/core/Drawer'; +import Button from '@material-ui/core/Button'; +import VerticalStepper from './VerticalStepper'; + +export default function CouponDrawer() { + const [state, setState] = React.useState({ + right: false, + }); + + const toggleDrawer = (side, open) => event => { + if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) { + return; + } + + setState({ ...state, [side]: open }); + }; + + return ( +
    + + + + +
    + ); +} +``` + +6. In the same `/components` folder, create a `VerticalStepper.js` file. +7. Copy the following code into the file: + +```js filename="VerticalStepper.js" showLineNumbers copy +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Stepper from '@material-ui/core/Stepper'; +import Step from '@material-ui/core/Step'; +import StepLabel from '@material-ui/core/StepLabel'; +import StepContent from '@material-ui/core/StepContent'; +import Button from '@material-ui/core/Button'; +import Typography from '@material-ui/core/Typography'; +import TextField from './TextField'; + +const useStyles = makeStyles(theme => ({ + root: { + width: '100%', + }, + button: { + marginTop: theme.spacing(1), + marginRight: theme.spacing(1), + }, + actionsContainer: { + marginBottom: theme.spacing(2), + }, + resetContainer: { + padding: theme.spacing(3), + }, +})); + +function getSteps() { + return ['Provide your email', 'Receive your coupon!']; +} + +function getStepContent(step) { + switch (step) { + case 0: + return `Please enter your email address:`; + case 1: + return `We have sent a coupon code to your email address.`; + default: + return `Unknown step`; + } +} + +export default function VerticalLinearStepper() { + const classes = useStyles(); + const [activeStep, setActiveStep] = React.useState(0); + const steps = getSteps(); + + const handleNext = () => { + setActiveStep(prevActiveStep => prevActiveStep + 1); + }; + + return ( +
    + + {steps.map((label, index) => ( + + {label} + + {getStepContent(index)} + {activeStep === 0 ? : null} +
    + {activeStep === 0 && ( +
    + +
    + )} +
    +
    +
    + ))} +
    +
    + ); +} +``` + +8. In the same `/components` folder, create a `TextField.js` file. +9. Copy the following code into the file: + +```js filename="TextField.js" showLineNumbers copy +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import TextField from '@material-ui/core/TextField'; + +const useStyles = makeStyles(theme => ({ + root: { + '& > *': { + margin: theme.spacing(1), + width: 200, + }, + }, +})); + +export default function BasicTextFields() { + const classes = useStyles(); + + return ( + + + + ); +} +``` + +### Import dependencies + +1. Import the React dependencies and the new CouponDrawer component we've created into `assets/js/app.js`: + +```js filename="assets/js/app.js" showLineNumbers copy +__webpack_public_path__ = window.__webpack_public_path__; // eslint-disable-line + +import Global from './theme/global'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import CouponDrawer from './components/CouponDrawer'; +``` + +2. At the bottom of the file, render the `CouponDrawer` component and assign it an id. + +```js filename="Render CouponDrawer component" showLineNumbers copy +ReactDOM.render(, document.querySelector('#coupondrawer')); +``` + +### Add the CouponDrawer div to base.html + +1. Navigate to `templates/layout/base.html`. +2. Add a new div element with our new id inside the body. + +```handlebars filename="templates/layout/base.html" showLineNumbers copy + + ... +
    + + {{> components/common/header }} + {{> components/common/body }} + {{> components/common/footer }} + + + + + + {{{footer.scripts}}} + +``` + +## Final product + +View the finished product using the Stencil CLI command `stencil start` in the Cornerstone theme directory. + +```shell filename="stencil start" showLineNumbers copy +# move into theme dir +cd ~/path/to/theme/dir + +# Preview store using Browsersync +stencil start +``` + +Open your browser and navigate to `localhost:3000` to view your local storefront. + +**Note:** This coupon drawer example does not send coupon codes to the emails entered. This is only an example to show how to customize your storefront theme. diff --git a/docs/stencil-docs/javascript-and-event-hooks/remote-api-tutorial.mdx b/docs/stencil-docs/javascript-and-event-hooks/remote-api-tutorial.mdx new file mode 100644 index 000000000..0f9bfeaf0 --- /dev/null +++ b/docs/stencil-docs/javascript-and-event-hooks/remote-api-tutorial.mdx @@ -0,0 +1,78 @@ +# Using Remote API + +Client-side JavaScript can access event hooks directly, without using Handlebars statements. By setting up listeners for these events, you can exercise granular control over your storefront’s user interface. For example, you can open custom windows when certain events occur. + +Below is an example implemented within a Stencil theme. This code adds an item to the shopping cart, and displays the result in a custom modal dialog rather than a cart page. + +This particular example uses certain conventions of ES6 JavaScript (also known as ECMAScript 6 or ECMAScript 2015). + +Here is the signature of the cart.itemAdd function used below, with parameters for product ID, quantity, and options: + +`itemAdd(FormData, callback)` + +Here is the signature of the cart.getContent function used further down: + +`getContent(options, callback)` + +This first complete code snippet calls cart.itemAdd, catches any errors, and displays the cart contents in a modal dialog: + +```js filename="cart.itemAdd" showLineNumbers copy + // Add item to cart +utils.api.cart.itemAdd(new FormData(form), (err, response) => { + const errorMessage = err || response.data.error; + + $addToCartBtn + .val(originalBtnVal) + .prop('disabled', false); + + this.$overlay.hide(); + + // Guard statement + if (errorMessage) { + // Strip the HTML from the error message + const tmp = document.createElement('DIV'); + tmp.innerHTML = errorMessage; + + return alert(tmp.textContent || tmp.innerText); + } + + // Open preview modal and update content + if (this.previewModal) { + this.previewModal.open(); + + this.updateCartContent(this.previewModal, response.data.cart_item.hash); + } else { + this.$overlay.show(); + // if no modal, redirect to the cart page + this.redirectTo(response.data.cart_item.cart_url || this.context.urls.cart); + } +}); +``` + +This final code snippet calls `cart.getContent` to fetch the cart contents, then display it in a preview format, which is specified by a template option with a value of `cart/preview`: + +```js filename="cart.getContent" showLineNumbers copy + /** + * Get cart contents + * + * @param {String} cartItemHash + * @param {Function} onComplete + */ + getCartContent(cartItemHash, onComplete) { + const options = { + template: 'cart/preview', + params: { + suggest: cartItemHash, + }, + config: { + cart: { + suggestions: { + limit: 4, + }, + }, + }, + }; + + utils.api.cart.getContent(options, onComplete); + } +``` diff --git a/docs/stencil-docs/javascript-and-event-hooks/rendering-html-with-ajax.mdx b/docs/stencil-docs/javascript-and-event-hooks/rendering-html-with-ajax.mdx new file mode 100644 index 000000000..679b6f98b --- /dev/null +++ b/docs/stencil-docs/javascript-and-event-hooks/rendering-html-with-ajax.mdx @@ -0,0 +1,43 @@ +# Rendering HTML with Ajax + +Stencil allows you to render dynamic components on the fly. For example, note this default code in templates/components/products/quick-view.html (note also this file name, which Handlebars will reference later in this example): + + +```handlebars filename="templates/components/products/quick-view.html" showLineNumbers copy + +``` + +To render a different template, you would instead reference that template’s file name. For example, assume that you want to substitute a custom template that you’ve named: `templates/components/products/quicker-view.html`. + +This next code block is from the Stencil default theme’s `/assets/js/theme/global/quick-view.js` file. Note the `quicker-view.html` statements brought in to reference the new file name: + + +```js filename="/assets/js/theme/global/quick-view.js" showLineNumbers copy +let $modal = $('#modal'), + $modalContent = $('.modal-content', $modal), + $modalOverlay = $('.loadingOverlay', $modal), + modalModifierClasses = 'modal--large'; + +$('body').on('click', '.quickview', (event) => { + let productId = $(event.currentTarget).data('product-id'); + + event.preventDefault(); + + // clear the modal + $modalContent.html(''); + $modalOverlay.show(); + + // open modal + $modal.foundation('reveal', 'open'); + + //quicker-view.html statement, replacing the standard template's quick-view.html template + utils.api.product.getById(productId, {template: 'products/quicker-view'}, function done(err, response) { + $modalOverlay.hide(); + $modalContent.html(response); + + return new ProductDetails($modalContent, context); + }); +}); +``` diff --git a/docs/stencil-docs/localization/localization-tutorial.mdx b/docs/stencil-docs/localization/localization-tutorial.mdx new file mode 100644 index 000000000..ae1ebbf3e --- /dev/null +++ b/docs/stencil-docs/localization/localization-tutorial.mdx @@ -0,0 +1,107 @@ +# Localization Tutorial + + +You can localize your Stencil theme for your desired target language. This tutorial describes how to localize a storefront in Spanish. By following this method, you can display a specific language based on the language selected in the viewer's browser. By the end of this tutorial, you will have the tools to localize most areas of your theme. + +### Prerequisites + +In this tutorial, we will use Stencil CLI and [Browsersync](https://github.com/bigcommerce/browser-sync) to serve up a live preview of a theme in development. + +To complete this tutorial, you should be familiar with the following concepts: + +* [Installing Stencil CLI](/docs/storefront/stencil/cli/install) +* [Creating a Stencil CLI Token](https://support.bigcommerce.com/s/article/Store-API-Accounts) +* [Downloading and uploading custom themes](https://support.bigcommerce.com/s/article/Stencil-Themes#download-upload) +* [Serving a live preview](/docs/storefront/stencil/cli/development-server#serving-a-live-preview) + + +## Adding a language file +1. After downloading and extracting your Stencil theme, open the folder containing your theme files and navigate to the `/lang` subfolder. + + +The `/lang` subfolder includes the `en.json` file and example language files. The `en.json` file and your language file must be present for a localized Stencil theme to work. Each language requires its own JSON file. + + + +2. Name your translation file `es.json` and save it in the `/lang` subfolder. Translation files are named based on the [BCP 47 specification](https://tools.ietf.org/html/bcp47) of language and region codes. + +3. Copy the desired key-value pairs from the `en.json` file and paste them into your newly-created `es.json` file. Update the values to create your language file. + + +```json filename="en.json" showLineNumbers copy +{ +"header": { + "welcome_back": "Welcome back, {name}", + "skip_to_main": "Skip to main content" + }, + } +``` + +```json filename="es.json" showLineNumbers copy +{ +"header": { + "welcome_back": "Bienvenidos, {name}", + "skip_to_main": "Saltar a la principal" + }, + } +``` + + +## Creating translation keys + +Perform the following steps to create new key-value pairs and invoke a defined translation key. + +1. Add a key-value pair to a language file. + + In `en.json`, add `new_hours` key and corresponding information for the value. + +```json showLineNumbers copy +"header": { + "welcome_back": "Welcome back, {name}", + "skip_to_main": "Skip to main content", + "new_hours": "Summer hours: {hours}" + }, + +``` +In `es.json`, add the same `new_hours` key and the Spanish translation of the value. + +```json showLineNumbers copy +"header": { + "welcome_back": "Bienvenidos, {name}", + "skip_to_main": "Saltar a la principal", + "new_hours": "Horario de verano: {hours}" + }, + +``` +2. Use the Handlebars `lang` directive in the appropriate file to show a translated string. + +For this example, update `/templates/components/common/header.html` using the code below. Add the code after the `{{/if}}` tag and before the `
    ` tag. + +```html showLineNumbers copy +{{/if}} +{{> components/common/alert/alert-success (lang 'header.new_hours' hours="8 AM to 5 PM Central" ) }} +