diff --git a/.changeset/lemon-emus-wait.md b/.changeset/lemon-emus-wait.md new file mode 100644 index 0000000000..7d3f2c95d6 --- /dev/null +++ b/.changeset/lemon-emus-wait.md @@ -0,0 +1,5 @@ +--- +'@adyen/adyen-web': minor +--- + +Click to Pay - Enabling MC/Visa to drop cookies if the shopper gives consent diff --git a/packages/lib/src/components/internal/ClickToPay/components/CtPLogin/CtPLoginInput.tsx b/packages/lib/src/components/internal/ClickToPay/components/CtPLogin/CtPLoginInput.tsx index 244b8df5fe..4a89bedc77 100644 --- a/packages/lib/src/components/internal/ClickToPay/components/CtPLogin/CtPLoginInput.tsx +++ b/packages/lib/src/components/internal/ClickToPay/components/CtPLogin/CtPLoginInput.tsx @@ -4,7 +4,7 @@ import { loginValidationRules } from './validate'; import useCoreContext from '../../../../../core/Context/useCoreContext'; import useForm from '../../../../../utils/useForm'; import Field from '../../../FormFields/Field'; -import InputText from '../../../FormFields/InputText'; +import InputEmail from '../../../FormFields/InputEmail'; type OnChangeProps = { data: CtPLoginInputDataState; valid; errors; isValid: boolean }; @@ -73,7 +73,7 @@ const CtPLoginInput = (props: CtPLoginInputProps): h.JSX.Element => { errorMessage={isLoginInputDirty ? props.errorMessage || !!errors.shopperLogin : null} classNameModifiers={['shopperLogin']} > - (), configuration = {} } = {}) => { + return render( + + + {ui} + + + ); +}; + +describe('Click to Pay - CtPOneTimePassword', () => { + test('should set to store the cookie if shopper ticks the checkbox', async () => { + const user = userEvent.setup(); + const ctpServiceMock = mock(); + ctpServiceMock.schemes = ['visa', 'mc']; + // const onResendCodeMock = jest.fn(); + + customRender(, { clickToPayService: ctpServiceMock }); + + // Default false + const checkbox = (await screen.findByLabelText('Skip verification next time')) as HTMLInputElement; + expect(checkbox.checked).toBe(false); + + // Checked + await user.click(checkbox); + expect(checkbox.checked).toBe(true); + expect(ctpServiceMock.updateStoreCookiesConsent).toHaveBeenCalledWith(true); + expect(ctpServiceMock.updateStoreCookiesConsent).toHaveBeenCalledTimes(1); + + // Unchecked + await user.click(checkbox); + expect(checkbox.checked).toBe(false); + expect(ctpServiceMock.updateStoreCookiesConsent).toHaveBeenCalledWith(false); + expect(ctpServiceMock.updateStoreCookiesConsent).toHaveBeenCalledTimes(2); + }); + + test('should pass OTP to ClickToPay service', async () => { + const user = userEvent.setup({ delay: 100 }); + const ctpServiceMock = mock(); + ctpServiceMock.schemes = ['visa', 'mc']; + + customRender(, { clickToPayService: ctpServiceMock }); + + await screen.findByLabelText('One time code', { exact: false }); + + await user.keyboard('654321'); + await user.keyboard('[Enter]'); + + expect(ctpServiceMock.finishIdentityValidation).toHaveBeenCalledWith('654321'); + }); +}); diff --git a/packages/lib/src/components/internal/ClickToPay/components/CtPOneTimePassword/CtPOneTimePassword.tsx b/packages/lib/src/components/internal/ClickToPay/components/CtPOneTimePassword/CtPOneTimePassword.tsx index 825c9173be..576aa2380b 100644 --- a/packages/lib/src/components/internal/ClickToPay/components/CtPOneTimePassword/CtPOneTimePassword.tsx +++ b/packages/lib/src/components/internal/ClickToPay/components/CtPOneTimePassword/CtPOneTimePassword.tsx @@ -8,6 +8,7 @@ import { CtPInfo } from '../CtPInfo'; import CtPSection from '../CtPSection'; import useCoreContext from '../../../../../core/Context/useCoreContext'; import './CtPOneTimePassword.scss'; +import CtPSaveCookiesCheckbox from './CtPSaveCookiesCheckbox'; type CtPOneTimePasswordProps = { onDisplayCardComponent?(): void; @@ -80,6 +81,9 @@ const CtPOneTimePassword = ({ onDisplayCardComponent }: CtPOneTimePasswordProps) onResendCode={onResendCode} isValidatingOtp={isValidatingOtp} /> + + + + + ) : ( + {i18n.get('ctp.otp.saveCookiesCheckbox.information')} + )} +

+ + ); +} + +export default CtPSaveCookiesCheckbox; diff --git a/packages/lib/src/components/internal/ClickToPay/components/CtPOneTimePassword/CtPSaveCookiesCheckbox/index.ts b/packages/lib/src/components/internal/ClickToPay/components/CtPOneTimePassword/CtPSaveCookiesCheckbox/index.ts new file mode 100644 index 0000000000..bfaacd0df1 --- /dev/null +++ b/packages/lib/src/components/internal/ClickToPay/components/CtPOneTimePassword/CtPSaveCookiesCheckbox/index.ts @@ -0,0 +1 @@ +export { default } from './CtPSaveCookiesCheckbox'; diff --git a/packages/lib/src/components/internal/ClickToPay/components/CtPSection/CtPSection.scss b/packages/lib/src/components/internal/ClickToPay/components/CtPSection/CtPSection.scss index 24091c246f..89d0f72884 100644 --- a/packages/lib/src/components/internal/ClickToPay/components/CtPSection/CtPSection.scss +++ b/packages/lib/src/components/internal/ClickToPay/components/CtPSection/CtPSection.scss @@ -3,7 +3,7 @@ .adyen-checkout-ctp__section { position: relative; background-color: white; - box-shadow: 0 8px 24px rgb(0 0 0 / 15%); + box-shadow: 0 6px 12px rgb(0 17 44 / 8%), 0 2px 4px rgb(0 17 44 / 4%); border-radius: 12px; padding: 16px; @@ -11,7 +11,7 @@ display: flex; align-items: center; height: 18px; - margin-bottom: 14px; + margin-bottom: 16px; } &--standalone { @@ -31,8 +31,8 @@ font-size: 17px; font-weight: 600; line-height: 22px; - margin: 0 0 4px; padding: 0; + margin: 0; width: auto; @media screen and (max-width: 400px) { @@ -49,7 +49,7 @@ font-size: 13px; font-weight: 400; line-height: 19px; - color: $color-gray-darker; + color: $color-new-gray-darker; margin: 0 0 16px; } diff --git a/packages/lib/src/components/internal/ClickToPay/context/ClickToPayContext.ts b/packages/lib/src/components/internal/ClickToPay/context/ClickToPayContext.ts index 4bee65d829..be561ef336 100644 --- a/packages/lib/src/components/internal/ClickToPay/context/ClickToPayContext.ts +++ b/packages/lib/src/components/internal/ClickToPay/context/ClickToPayContext.ts @@ -11,8 +11,10 @@ export interface IClickToPayContext extends Pick { isStandaloneComponent: boolean; isCtpPrimaryPaymentMethod: boolean; + isStoringCookies: boolean; setIsCtpPrimaryPaymentMethod(isPrimary: boolean): void; logoutShopper(): Promise; + updateStoreCookiesConsent(shouldStore: boolean): void; ctpState: CtpState; cards: ShopperCard[]; schemes: string[]; @@ -37,8 +39,10 @@ const ClickToPayContext = createContext({ configuration: null, isStandaloneComponent: null, isCtpPrimaryPaymentMethod: null, + isStoringCookies: false, setIsCtpPrimaryPaymentMethod: null, logoutShopper: null, + updateStoreCookiesConsent: null, ctpState: null, cards: [], schemes: [], diff --git a/packages/lib/src/components/internal/ClickToPay/context/ClickToPayProvider.tsx b/packages/lib/src/components/internal/ClickToPay/context/ClickToPayProvider.tsx index ed0916994a..41f2add472 100644 --- a/packages/lib/src/components/internal/ClickToPay/context/ClickToPayProvider.tsx +++ b/packages/lib/src/components/internal/ClickToPay/context/ClickToPayProvider.tsx @@ -90,6 +90,13 @@ const ClickToPayProvider = ({ await ctpService?.logout(); }, [ctpService]); + const updateStoreCookiesConsent = useCallback( + (shouldStore: boolean) => { + ctpService.updateStoreCookiesConsent(shouldStore); + }, + [ctpService] + ); + return ( diff --git a/packages/lib/src/components/internal/ClickToPay/services/ClickToPayService.test.ts b/packages/lib/src/components/internal/ClickToPay/services/ClickToPayService.test.ts index b543b90723..1ecd73f515 100644 --- a/packages/lib/src/components/internal/ClickToPay/services/ClickToPayService.test.ts +++ b/packages/lib/src/components/internal/ClickToPay/services/ClickToPayService.test.ts @@ -4,8 +4,94 @@ import { ISrcSdkLoader } from './sdks/SrcSdkLoader'; import VisaSdk from './sdks/VisaSdk'; import MastercardSdk from './sdks/MastercardSdk'; import { IdentityLookupParams, SchemesConfiguration } from './types'; -import { SrciIdentityLookupResponse, SrcProfile } from './sdks/types'; +import { SrciCheckoutResponse, SrciIdentityLookupResponse, SrcProfile } from './sdks/types'; import SrciError from './sdks/SrciError'; +import ShopperCard from '../models/ShopperCard'; + +test('should be able to tweak the configuration to store the cookie', () => { + const visa = mock(); + const schemesConfig = mock(); + const sdkLoader = mock(); + sdkLoader.load.mockResolvedValue([visa]); + + const service = new ClickToPayService(schemesConfig, sdkLoader, 'test'); + expect(service.storeCookies).toBe(false); + + service.updateStoreCookiesConsent(true); + expect(service.storeCookies).toBe(true); + + service.updateStoreCookiesConsent(false); + expect(service.storeCookies).toBe(false); +}); + +test('should pass the complianceSettings if the cookie is set to be stored', async () => { + const checkoutResponseMock = mock(); + checkoutResponseMock.dcfActionCode = 'COMPLETE'; + + const profileFromVisaSrcSystem: SrcProfile = { + srcCorrelationId: '123456', + profiles: [ + { + maskedCards: [ + { + srcDigitalCardId: 'xxxx', + panLastFour: '8902', + dateOfCardLastUsed: '2019-09-28T08:10:02.312Z', + paymentCardDescriptor: 'visa', + panExpirationMonth: '12', + panExpirationYear: '2020', + digitalCardData: { + descriptorName: 'Visa', + artUri: 'https://image.com/visa' + }, + tokenId: '9w8e8e' + } + ] + } + ] + }; + + const visa = mock(); + // @ts-ignore Mocking readonly property + visa.schemeName = 'visa'; + visa.checkout.mockResolvedValue(checkoutResponseMock); + visa.init.mockResolvedValue(); + visa.isRecognized.mockResolvedValue({ recognized: true, idTokens: ['id-token'] }); + visa.getSrcProfile.mockResolvedValue(profileFromVisaSrcSystem); + + const sdkLoader = mock(); + const schemesConfig = mock(); + + const shopperCard = mock(); + shopperCard.srcDigitalCardId = 'xxxx'; + shopperCard.srcCorrelationId = 'zzzz'; + shopperCard.scheme = 'visa'; + Object.defineProperty(shopperCard, 'isDcfPopupEmbedded', { + get: jest.fn(() => false) + }); + + sdkLoader.load.mockResolvedValue([visa]); + + const service = new ClickToPayService(schemesConfig, sdkLoader, 'test'); + service.updateStoreCookiesConsent(true); + + await service.initialize(); + await service.checkout(shopperCard); + + expect(visa.checkout).toHaveBeenCalledTimes(1); + expect(visa.checkout).toHaveBeenCalledWith({ + complianceSettings: { + complianceResources: [ + { + complianceType: 'REMEMBER_ME', + uri: '' + } + ] + }, + srcCorrelationId: 'zzzz', + srcDigitalCardId: 'xxxx' + }); +}); test('should pass the correct configuration to the respective scheme SDKs', async () => { const visa = mock(); diff --git a/packages/lib/src/components/internal/ClickToPay/services/ClickToPayService.ts b/packages/lib/src/components/internal/ClickToPay/services/ClickToPayService.ts index 3b2e47b109..a23c882620 100644 --- a/packages/lib/src/components/internal/ClickToPay/services/ClickToPayService.ts +++ b/packages/lib/src/components/internal/ClickToPay/services/ClickToPayService.ts @@ -55,6 +55,11 @@ class ClickToPayService implements IClickToPayService { public shopperCards: ShopperCard[] = null; public identityValidationData: IdentityValidationData = null; + /** + * Indicates if the shopper opted for saving cookies during the transaction + */ + public storeCookies = false; + constructor( schemesConfig: SchemesConfiguration, sdkLoader: ISrcSdkLoader, @@ -77,12 +82,17 @@ class ClickToPayService implements IClickToPayService { return this.sdkLoader.schemes; } + public updateStoreCookiesConsent(shouldStore: boolean) { + this.storeCookies = shouldStore; + } + public async initialize(): Promise { this.setState(CtpState.Loading); try { this.sdks = await this.sdkLoader.load(this.environment); await this.initiateSdks(); + const { recognized = false, idTokens = null } = await this.verifyIfShopperIsRecognized(); if (recognized) { @@ -104,10 +114,14 @@ class ClickToPayService implements IClickToPayService { this.setState(CtpState.NotAvailable); } catch (error) { - if (error instanceof SrciError) console.warn(`Error at ClickToPayService # init: ${error.toString()}`); - if (error instanceof TimeoutError) { + if (error instanceof SrciError && error?.reason === 'REQUEST_TIMEOUT') { + const timeoutError = new TimeoutError(`ClickToPayService - Timeout during ${error.source}() of the scheme '${error.scheme}'`); + this.onTimeout?.(timeoutError); + } else if (error instanceof TimeoutError) { console.warn(error.toString()); this.onTimeout?.(error); + } else if (error instanceof SrciError) { + console.warn(`Error at ClickToPayService # init: ${error.toString()}`); } else { console.warn(error); } @@ -168,7 +182,8 @@ class ClickToPayService implements IClickToPayService { const checkoutResponse = await checkoutSdk.checkout({ srcDigitalCardId: card.srcDigitalCardId, srcCorrelationId: card.srcCorrelationId, - ...(card.isDcfPopupEmbedded && { windowRef: window.frames[CTP_IFRAME_NAME] }) + ...(card.isDcfPopupEmbedded && { windowRef: window.frames[CTP_IFRAME_NAME] }), + ...(this.storeCookies && { complianceSettings: { complianceResources: [{ complianceType: 'REMEMBER_ME', uri: '' }] } }) }); if (checkoutResponse.dcfActionCode !== 'COMPLETE') { diff --git a/packages/lib/src/components/internal/ClickToPay/services/sdks/MastercardSdk.ts b/packages/lib/src/components/internal/ClickToPay/services/sdks/MastercardSdk.ts index 901439a5ae..0df9d20d75 100644 --- a/packages/lib/src/components/internal/ClickToPay/services/sdks/MastercardSdk.ts +++ b/packages/lib/src/components/internal/ClickToPay/services/sdks/MastercardSdk.ts @@ -33,12 +33,17 @@ class MastercardSdk extends AbstractSrcInitiator { } public async init(params: SrcInitParams, srciTransactionId: string): Promise { - const sdkProps = { - ...params, - ...getMastercardSettings(this.customSdkConfiguration), - srciTransactionId - }; - await this.schemeSdk.init(sdkProps); + try { + const sdkProps = { + ...params, + ...getMastercardSettings(this.customSdkConfiguration), + srciTransactionId + }; + await this.schemeSdk.init(sdkProps); + } catch (err) { + const srciError = new SrciError(err, 'init', this.schemeName); + throw srciError; + } } public async identityLookup({ identityValue, type }: SrcIdentityLookupParams): Promise { diff --git a/packages/lib/src/components/internal/ClickToPay/services/sdks/VisaSdk.ts b/packages/lib/src/components/internal/ClickToPay/services/sdks/VisaSdk.ts index bbe3b3ae35..90eb4249b6 100644 --- a/packages/lib/src/components/internal/ClickToPay/services/sdks/VisaSdk.ts +++ b/packages/lib/src/components/internal/ClickToPay/services/sdks/VisaSdk.ts @@ -33,13 +33,18 @@ class VisaSdk extends AbstractSrcInitiator { } public async init(params: SrcInitParams, srciTransactionId: string): Promise { - const sdkProps = { - ...params, - ...getVisaSetttings(this.customSdkConfiguration), - srciTransactionId - }; + try { + const sdkProps = { + ...params, + ...getVisaSetttings(this.customSdkConfiguration), + srciTransactionId + }; - await this.schemeSdk.init(sdkProps); + await this.schemeSdk.init(sdkProps); + } catch (err) { + const srciError = new SrciError(err, 'init', this.schemeName); + throw srciError; + } } public async identityLookup({ identityValue, type }: SrcIdentityLookupParams): Promise { diff --git a/packages/lib/src/components/internal/ClickToPay/services/sdks/types.ts b/packages/lib/src/components/internal/ClickToPay/services/sdks/types.ts index b52152f2f6..38e09149c1 100644 --- a/packages/lib/src/components/internal/ClickToPay/services/sdks/types.ts +++ b/packages/lib/src/components/internal/ClickToPay/services/sdks/types.ts @@ -59,6 +59,16 @@ export type SrcCard = { export type SrcCheckoutParams = { srcCorrelationId: string; srcDigitalCardId: string; + complianceSettings?: { + complianceResources: [ + { + complianceType: 'REMEMBER_ME'; + uri: string; + version?: string; + dataPublished?: string; + } + ]; + }; windowRef?: Window; }; diff --git a/packages/lib/src/components/internal/ClickToPay/services/types.ts b/packages/lib/src/components/internal/ClickToPay/services/types.ts index c6472d48b6..e42fe3fe0e 100644 --- a/packages/lib/src/components/internal/ClickToPay/services/types.ts +++ b/packages/lib/src/components/internal/ClickToPay/services/types.ts @@ -9,6 +9,8 @@ export interface IClickToPayService { identityValidationData: IdentityValidationData; schemes: string[]; shopperAccountFound: boolean; + storeCookies: boolean; + updateStoreCookiesConsent(shouldStore: boolean): void; initialize(): Promise; checkout(card: ShopperCard): Promise; logout(): Promise; diff --git a/packages/lib/src/components/internal/FormFields/Checkbox/Checkbox.scss b/packages/lib/src/components/internal/FormFields/Checkbox/Checkbox.scss index 6868c4d997..bd6d2a8667 100644 --- a/packages/lib/src/components/internal/FormFields/Checkbox/Checkbox.scss +++ b/packages/lib/src/components/internal/FormFields/Checkbox/Checkbox.scss @@ -7,7 +7,6 @@ position: relative; padding-left: 24px; cursor: pointer; - display: inline-block; line-height: 19px; color: $color-black; font-size: $font-size-small; diff --git a/packages/lib/src/components/internal/FormFields/InputEmail.tsx b/packages/lib/src/components/internal/FormFields/InputEmail.tsx index 888601615f..9da03e0d6c 100644 --- a/packages/lib/src/components/internal/FormFields/InputEmail.tsx +++ b/packages/lib/src/components/internal/FormFields/InputEmail.tsx @@ -1,6 +1,6 @@ import { h } from 'preact'; -import InputBase from './InputBase'; +import InputBase, { InputBaseProps } from './InputBase'; -export default function InputEmail(props) { +export default function InputEmail(props: InputBaseProps) { return ; } diff --git a/packages/lib/src/components/internal/OpenInvoice/OpenInvoice.scss b/packages/lib/src/components/internal/OpenInvoice/OpenInvoice.scss index 0d4bc2eda6..80a89bd5b5 100644 --- a/packages/lib/src/components/internal/OpenInvoice/OpenInvoice.scss +++ b/packages/lib/src/components/internal/OpenInvoice/OpenInvoice.scss @@ -1,7 +1,7 @@ @import "../../../style/index"; .adyen-checkout__open-invoice .adyen-checkout__fieldset--billingAddress { - padding-bottom: 8px; + margin-bottom: 16px; } .adyen-checkout__open-invoice .adyen-checkout__fieldset--deliveryAddress { @@ -14,7 +14,7 @@ } .adyen-checkout__open-invoice .adyen-checkout__field--consentCheckbox { - margin-top: 22px; + margin-top: 16px; } .adyen-checkout__input--separateDeliveryAddress + .adyen-checkout__checkbox__label { diff --git a/packages/lib/src/language/locales/ar.json b/packages/lib/src/language/locales/ar.json index 56286473c5..65f3ca402f 100644 --- a/packages/lib/src/language/locales/ar.json +++ b/packages/lib/src/language/locales/ar.json @@ -4,6 +4,7 @@ "payButton.with": "ادفع %{value} باستخدام %{maskedData}", "close": "إغلاق", "storeDetails": "حفظ لمدفوعاتي القادمة", + "readMore": "اقرأ المزيد", "creditCard.holderName": "الاسم على البطاقة", "creditCard.holderName.placeholder": "جميل سعيد", "creditCard.holderName.invalid": "أدخل الاسم كما هو موضح على البطاقة", @@ -22,7 +23,7 @@ "creditCard.cvcField.placeholder.3digits": "3 أرقام", "creditCard.taxNumber.placeholder": "يوم شهر سنة / 0123456789", "installments": "عدد الأقساط", - "installmentOption": "%{times} x %{partialValue}", + "installmentOption": "%{times} × %{partialValue}", "installmentOptionMonths": "%{times} أشهر", "installments.oneTime": "الدفع مرة واحدة", "installments.installments": "الدفع على أقساط", @@ -260,6 +261,7 @@ "ctp.otp.subtitle": "أدخل الرمز %@ الذي أرسلناه إلى ٪@ للتحقق من هويتك.", "ctp.otp.saveCookiesCheckbox.label": "تخطي التحقق في المرة القادمة", "ctp.otp.saveCookiesCheckbox.information": "حدد حفظ البيانات على جهازك ومتصفحك في المتاجر المشاركة لإتمام عملية الدفع بشكل أسرع. لا يوصى به للأجهزة المشتركة.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "حدد تذكرني على جهازك ومتصفحك.", "ctp.emptyProfile.message": "لا توجد بطاقات مسجلة في هذا الملف التعريفي على Click to Pay", "ctp.separatorText": "أو استخدم", "ctp.cards.title": "أكمل الدفع باستخدام بطاقة Click to Pay", @@ -300,4 +302,4 @@ "ancv.confirmPayment": "استخدم تطبيق ANCV الخاص بك لتأكيد الدفع.", "ancv.form.instruction": "يعد تطبيق Cheque-Vacances ضروريًا للمصادقة على هذه المدفوعات.", "ancv.beneficiaryId.invalid": "أدخل عنوان بريد إلكتروني صحيحًا أو معرف ANCV" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/cs-CZ.json b/packages/lib/src/language/locales/cs-CZ.json index 81ba67bbff..d20cded11e 100644 --- a/packages/lib/src/language/locales/cs-CZ.json +++ b/packages/lib/src/language/locales/cs-CZ.json @@ -4,6 +4,7 @@ "payButton.with": "Zaplatit %{value} pomocí %{maskedData}", "close": "Zavřít", "storeDetails": "Uložit pro příští platby", + "readMore": "Přečtěte si více", "creditCard.holderName": "Jméno na kartě", "creditCard.holderName.placeholder": "Jan Novák", "creditCard.holderName.invalid": "Zadejte jméno, jak je uvedeno na kartě", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Zadejte kód %@, který jsme vám odeslali na %@ a ověřte sami sebe.", "ctp.otp.saveCookiesCheckbox.label": "Příště přeskočte ověřování", "ctp.otp.saveCookiesCheckbox.information": "Zvolte, že si je chcete zapamatovat ve svém zařízení a prohlížeči v zúčastněných obchodech, abyste se rychleji odhlásili. Nedoporučuje se pro sdílená zařízení.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Vyberte, abyste si je zapamatovali ve svém zařízení a prohlížeči", "ctp.emptyProfile.message": "V tomto profilu Click to Pay nejsou zaregistrovány žádné karty", "ctp.separatorText": "nebo použijte", "ctp.cards.title": "Dokončete platbu pomocí Click to Pay", @@ -296,4 +298,4 @@ "ancv.confirmPayment": "Pro potvrzení platby použijte aplikaci ANCV.", "ancv.form.instruction": "K potvrzení této platby je nutná aplikace Cheque-Vacances.", "ancv.beneficiaryId.invalid": "Zadejte platnou e-mailovou adresu nebo ID ANCV" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/da-DK.json b/packages/lib/src/language/locales/da-DK.json index b24f6e6c17..de494d2fd6 100644 --- a/packages/lib/src/language/locales/da-DK.json +++ b/packages/lib/src/language/locales/da-DK.json @@ -4,6 +4,7 @@ "payButton.with": "Betal %{value} med %{maskedData}", "close": "Luk", "storeDetails": "Gem til min næste betaling", + "readMore": "Læs mere", "creditCard.holderName": "Navn på kort", "creditCard.holderName.placeholder": "J. Hansen", "creditCard.holderName.invalid": "Indtast navn som vist på kortet", @@ -260,6 +261,7 @@ "ctp.otp.subtitle": "Indtast den kode, vi har sendt til %@ for at bekræfte, at det er dig.", "ctp.otp.saveCookiesCheckbox.label": "Spring bekræftelse over næste gang", "ctp.otp.saveCookiesCheckbox.information": "Vælg dette for at blive husket på din enhed og browser i deltagende butikker for hurtigere betaling. Anbefales ikke på delte enheder.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Vælg dette for at blive husket på din enhed og browser", "ctp.emptyProfile.message": "Ingen kort registreret i denne Click to Pay-profil", "ctp.separatorText": "eller brug", "ctp.cards.title": "Gennemfør betaling med Click to Pay", @@ -297,4 +299,4 @@ "ancv.confirmPayment": "Brug din ANCV-applikation til at bekræfte betalingen.", "ancv.form.instruction": "Cheque-Vacances-applikationen er nødvendig for at validere denne betaling.", "ancv.beneficiaryId.invalid": "Indtast en gyldig e-mailadresse eller ANCV-id" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/de-DE.json b/packages/lib/src/language/locales/de-DE.json index 52249167f9..a00f50be52 100644 --- a/packages/lib/src/language/locales/de-DE.json +++ b/packages/lib/src/language/locales/de-DE.json @@ -4,6 +4,7 @@ "payButton.with": "%{value} mit %{maskedData} zahlen", "close": "Schließen", "storeDetails": "Für zukünftige Zahlvorgänge speichern", + "readMore": "Mehr lesen", "creditCard.holderName": "Name auf der Karte", "creditCard.holderName.placeholder": "A. Müller", "creditCard.holderName.invalid": "Geben Sie den Namen wie auf der Karte gezeigt ein", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Geben Sie den Code ein, der von %@ an %@ gesendet wurde, um Ihre Identität zu bestätigen.", "ctp.otp.saveCookiesCheckbox.label": "Verifizierung beim nächsten Mal überspringen", "ctp.otp.saveCookiesCheckbox.information": "Wählen Sie diese Option, um bei teilnehmenden Geschäften auf Ihrem Gerät und Browser gespeichert zu werden, um den Bestellvorgang zu beschleunigen. Nicht für gemeinsam genutzte Geräte empfohlen.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Wählen Sie diese Option aus, um auf Ihrem Gerät und Browser gespeichert zu werden", "ctp.emptyProfile.message": "In diesem Click-to-Pay-Profil sind keine Karten registriert", "ctp.separatorText": "oder verwenden", "ctp.cards.title": "Zahlung mit Click to Pay abschließen", @@ -296,4 +298,4 @@ "ancv.confirmPayment": "Bestätigen Sie die Zahlung mit Ihrem ANCV-Antrag.", "ancv.form.instruction": "Zur Validierung dieser Zahlung ist der Antrag „Cheque-Vacances“ erforderlich.", "ancv.beneficiaryId.invalid": "Geben Sie eine gültige E-Mail-Adresse oder ANCV-ID ein" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/el-GR.json b/packages/lib/src/language/locales/el-GR.json index 66cae5d4ea..7768ed1715 100644 --- a/packages/lib/src/language/locales/el-GR.json +++ b/packages/lib/src/language/locales/el-GR.json @@ -4,6 +4,7 @@ "payButton.with": "Πληρωμή %{value} με %{maskedData}", "close": "Κλείσιμο", "storeDetails": "Αποθήκευση για την επόμενη πληρωμή μου", + "readMore": "Ανάγνωση περισσότερων", "creditCard.holderName": "Όνομα στην κάρτα", "creditCard.holderName.placeholder": "Γ. Παπαδάκης", "creditCard.holderName.invalid": "Εισαγάγετε το όνομα όπως αναγράφεται στην κάρτα", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Εισαγάγετε τον κωδικό %@ που στάλθηκε στο %@ για να επαληθεύσετε ότι είστε εσείς.", "ctp.otp.saveCookiesCheckbox.label": "Παράβλεψη επαλήθευσης την επόμενη φορά", "ctp.otp.saveCookiesCheckbox.information": "Επιλέξτε να απομνημονεύεται στη συσκευή και στο πρόγραμμα περιήγησής σας στα συμμετέχοντα καταστήματα για ταχύτερη ολοκλήρωση της πληρωμής. Δεν συνιστάται για κοινόχρηστες συσκευές.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Επιλέξτε να απομνημονεύεται στη συσκευή και στο πρόγραμμα περιήγησής σας", "ctp.emptyProfile.message": "Δεν υπάρχουν καταχωρισμένες κάρτες σε αυτό το προφίλ Click to Pay", "ctp.separatorText": "ή χρησιμοποιήστε το", "ctp.cards.title": "Ολοκληρώστε την πληρωμή με το Click to Pay", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "Χρησιμοποιήστε την εφαρμογή ANCV για επιβεβαίωση της πληρωμής.", "ancv.form.instruction": "Η εφαρμογή Cheque-Vacances είναι απαραίτητη για επικύρωση της πληρωμής αυτής.", "ancv.beneficiaryId.invalid": "Εισαγάγετε έγκυρη διεύθυνση email ή αναγνωριστικό ANCV" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/en-US.json b/packages/lib/src/language/locales/en-US.json index e2b655c912..5339048cf8 100644 --- a/packages/lib/src/language/locales/en-US.json +++ b/packages/lib/src/language/locales/en-US.json @@ -4,6 +4,7 @@ "payButton.with": "Pay %{value} with %{maskedData}", "close": "Close", "storeDetails": "Save for my next payment", + "readMore": "Read more", "creditCard.holderName": "Name on card", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "Enter name as shown on card", @@ -261,6 +262,7 @@ "ctp.otp.subtitle": "Enter the code %@ sent to %@ to verify it‘s you.", "ctp.otp.saveCookiesCheckbox.label": "Skip verification next time", "ctp.otp.saveCookiesCheckbox.information": "Select to be remembered on your device and browser at participating stores for faster checkout. Not recommended for shared devices.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Select to be remembered on your device and browser", "ctp.emptyProfile.message": "No cards registered in this Click to Pay profile", "ctp.separatorText": "or use", "ctp.cards.title": "Complete payment with Click to Pay", @@ -301,4 +303,4 @@ "ancv.confirmPayment": "Use your ANCV application to confirm the payment.", "ancv.form.instruction": "The Cheque-Vacances application is necessary to validate this payment.", "ancv.beneficiaryId.invalid": "Enter a valid email address or ANCV ID" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/es-ES.json b/packages/lib/src/language/locales/es-ES.json index 1f2dcd2f11..db9365554a 100644 --- a/packages/lib/src/language/locales/es-ES.json +++ b/packages/lib/src/language/locales/es-ES.json @@ -4,6 +4,7 @@ "payButton.with": "Pague %{value} con %{maskedData}", "close": "Cerrar", "storeDetails": "Recordar para mi próximo pago", + "readMore": "Leer más", "creditCard.holderName": "Nombre en la tarjeta", "creditCard.holderName.placeholder": "Juan Pérez", "creditCard.holderName.invalid": "Introduzca el nombre como se muestra en la tarjeta", @@ -254,6 +255,7 @@ "ctp.otp.subtitle": "Introduzca el código %@ que le hemos enviado a %@ para verificar que es usted.", "ctp.otp.saveCookiesCheckbox.label": "Omitir verificación la próxima vez", "ctp.otp.saveCookiesCheckbox.information": "Seleccione esta opción para recordarle en su dispositivo y navegador en las tiendas participantes para agilizar el proceso de pago. No lo recomendamos para dispositivos compartidos.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Seleccione esta opción para recordarle en su dispositivo y navegador", "ctp.emptyProfile.message": "No hay tarjetas registradas en este perfil de Click to Pay", "ctp.separatorText": "o utilice", "ctp.cards.title": "Completar el pago con Click to Pay", @@ -291,4 +293,4 @@ "ancv.confirmPayment": "Utilice su solicitud de la ANCV para confirmar el pago.", "ancv.form.instruction": "La aplicación de Cheque-Vacances es necesaria para validar este pago.", "ancv.beneficiaryId.invalid": "Introduzca una dirección de correo electrónico válida o un documento de identidad de la ANCV" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/fi-FI.json b/packages/lib/src/language/locales/fi-FI.json index 1a4c602c15..2a9dde395a 100644 --- a/packages/lib/src/language/locales/fi-FI.json +++ b/packages/lib/src/language/locales/fi-FI.json @@ -4,6 +4,7 @@ "payButton.with": "Maksa %{value} käyttäen maksutapaa %{maskedData}", "close": "Sulje", "storeDetails": "Tallenna seuraavaa maksuani varten", + "readMore": "Lue lisää", "creditCard.holderName": "Nimi kortilla", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "Syötä nimi sellaisena kuin se on kortissa", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Syötä koodi, jonka %@ lähetti osoitteeseen %@ vahvistaaksesi, että kyseessä olet sinä.", "ctp.otp.saveCookiesCheckbox.label": "Ohita vahvistus seuraavalla kerralla", "ctp.otp.saveCookiesCheckbox.information": "Valitse, että sinut muistetaan laitteellasi ja selaimessa osallistuvissa myymälöissä, jotta voit maksaa nopeammin. Ei suositella jaetuilla laitteilla.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Valitse, jotta sinut muistetaan laitteellasi ja selaimessa", "ctp.emptyProfile.message": "Tähän Click to Pay -profiiliin ei ole rekisteröity kortteja", "ctp.separatorText": "tai käytä", "ctp.cards.title": "Suorita maksu Click to Paylla", @@ -296,4 +298,4 @@ "ancv.confirmPayment": "Vahvista maksusi ANCV-sovelluksella.", "ancv.form.instruction": "Tämän maksun vahvistaminen edellyttää Cheque-Vacances -sovelluksen.", "ancv.beneficiaryId.invalid": "Anna kelvollinen sähköpostiosoite tai ANCV-tunnus" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/fr-FR.json b/packages/lib/src/language/locales/fr-FR.json index b93cce364b..f4ad64e25a 100644 --- a/packages/lib/src/language/locales/fr-FR.json +++ b/packages/lib/src/language/locales/fr-FR.json @@ -4,6 +4,7 @@ "payButton.with": "Payer %{value} avec %{maskedData}", "close": "Fermer", "storeDetails": "Sauvegarder pour mon prochain paiement", + "readMore": "Lire la suite", "creditCard.holderName": "Nom sur la carte", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "Entrez le nom tel qu'il apparaît sur la carte", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Saisissez le code %@ envoyé à %@ pour vérifier votre identité.", "ctp.otp.saveCookiesCheckbox.label": "Ignorer la vérification la prochaine fois", "ctp.otp.saveCookiesCheckbox.information": "Sélectionnez cette option pour mémoriser les informations sur votre appareil et votre navigateur afin d'accélérer le paiement dans les magasins participants. Non recommandé pour les appareils partagés.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Sélectionner cette option pour mémoriser les informations sur votre appareil et votre navigateur", "ctp.emptyProfile.message": "Aucune carte enregistrée dans ce profil Click to Pay", "ctp.separatorText": "ou utilisez", "ctp.cards.title": "Terminez le paiement avec Click to Pay", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "Utilisez votre application ANCV pour confirmer le paiement.", "ancv.form.instruction": "L'application Chèque-Vacances est nécessaire pour valider ce paiement.", "ancv.beneficiaryId.invalid": "Saisissez une adresse e-mail ou un identifiant ANCV valide" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/hr-HR.json b/packages/lib/src/language/locales/hr-HR.json index e0ac43f501..2277f45fdd 100644 --- a/packages/lib/src/language/locales/hr-HR.json +++ b/packages/lib/src/language/locales/hr-HR.json @@ -4,6 +4,7 @@ "payButton.with": "Platite iznos od %{value} uporabom stavke %{maskedData}", "close": "Zatvori", "storeDetails": "Pohrani za moje sljedeće plaćanje", + "readMore": "Opširnije", "creditCard.holderName": "Ime na kartici", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "Unesite ime kako je prikazano na kartici", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Upišite kôd %@ koji smo poslali na %@ da bismo potvrdili da ste to vi.", "ctp.otp.saveCookiesCheckbox.label": "Sljedeći puta preskoči provjeru", "ctp.otp.saveCookiesCheckbox.information": "Odaberite kako biste bili zapamćeni na svom uređaju i pregledniku u uključenim trgovinama za bržu naplatu. Ne preporučuje se za zajedničke uređaje.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Odaberite ako želite da vas se zapamti na vašem uređaju i pregledniku", "ctp.emptyProfile.message": "Nema kartica registriranih u sklopu ovog profila usluge Click to Pay", "ctp.separatorText": "ili upotrijebite", "ctp.cards.title": "Dovrši plaćanje uslugom Click to Pay", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "Koristite svoju ANCV aplikaciju za potvrdu plaćanja.", "ancv.form.instruction": "Za potvrdu ove uplate neophodna je aplikacija Cheque-Vacances.", "ancv.beneficiaryId.invalid": "Unesite valjanu adresu e-pošte ili ANCV ID" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/hu-HU.json b/packages/lib/src/language/locales/hu-HU.json index 1a32d70d1e..cff15e4878 100644 --- a/packages/lib/src/language/locales/hu-HU.json +++ b/packages/lib/src/language/locales/hu-HU.json @@ -4,6 +4,7 @@ "payButton.with": "%{value} fizetése a következővel: %{maskedData}", "close": "Bezárás", "storeDetails": "Mentés a következő fizetéshez", + "readMore": "Bővebben", "creditCard.holderName": "A kártyán szereplő név", "creditCard.holderName.placeholder": "Gipsz Jakab", "creditCard.holderName.invalid": "Adja meg a kártyán szereplő nevet", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Írja be a kódot, amit a(z) %@ küldött %@ részére ellenőrzés céljából.", "ctp.otp.saveCookiesCheckbox.label": "Ellenőrzés kihagyása a következő alkalommal", "ctp.otp.saveCookiesCheckbox.information": "Jelölje be, hogy a résztvevő üzletek a gyorsabb fizetés érdekében emlékezzenek az eszközre és a böngészőre. Megosztott eszközök esetén nem ajánlott.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Jelölje be, hogy a rendszer emlékezzen az eszközre és a böngészőre", "ctp.emptyProfile.message": "Ebben a Click to Pay-profilban nincs regisztrált kártya", "ctp.separatorText": "vagy használja a következőt", "ctp.cards.title": "Fizetés Click to Pay használatával", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "A fizetés megerősítéséhez használja az ANCV alkalmazást.", "ancv.form.instruction": "A fizetés érvényesítéséhez a Cheque-Vacances alkalmazás szükséges.", "ancv.beneficiaryId.invalid": "Adjon meg egy érvényes e-mail-címet vagy ANCV-azonosítót" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/it-IT.json b/packages/lib/src/language/locales/it-IT.json index 6c605de00e..8ac6d512c9 100644 --- a/packages/lib/src/language/locales/it-IT.json +++ b/packages/lib/src/language/locales/it-IT.json @@ -4,6 +4,7 @@ "payButton.with": "Paga %{value} con %{maskedData}", "close": "Chiudi", "storeDetails": "Salva per il prossimo pagamento", + "readMore": "Leggi di più", "creditCard.holderName": "Titolare carta", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "Immetti il nome riportato sulla carta", @@ -257,6 +258,7 @@ "ctp.otp.subtitle": "Inserisci il codice che %@ ha inviato a %@ per verificare la tua identità.", "ctp.otp.saveCookiesCheckbox.label": "Salta la verifica la prossima volta", "ctp.otp.saveCookiesCheckbox.information": "Scegli di essere ricordato sul dispositivo e il browser che utilizzi per velocizzare il pagamento nei negozi partecipanti. Non consigliato per dispositivi condivisi.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Seleziona per essere ricordato sul tuo dispositivo e sul browser", "ctp.emptyProfile.message": "Non esistono carte registrate in questo profilo Click to Pay", "ctp.separatorText": "o utilizza", "ctp.cards.title": "Completa il pagamento con Click to Pay", @@ -297,4 +299,4 @@ "ancv.confirmPayment": "Utilizza la tua richiesta ANCV per confermare il pagamento.", "ancv.form.instruction": "Per confermare il pagamento è necessario utilizzare la richiesta Cheque-Vacances.", "ancv.beneficiaryId.invalid": "Inserisci un indirizzo e-mail o un identificativo ANCV valido" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/ja-JP.json b/packages/lib/src/language/locales/ja-JP.json index df0f9dd89e..20dfef21dd 100644 --- a/packages/lib/src/language/locales/ja-JP.json +++ b/packages/lib/src/language/locales/ja-JP.json @@ -4,6 +4,7 @@ "payButton.with": "%{value}を%{maskedData}で支払う", "close": "終了", "storeDetails": "次回のお支払いのため詳細を保存", + "readMore": "詳細を確認", "creditCard.holderName": "カード上の名前", "creditCard.holderName.placeholder": "Taro Yamada", "creditCard.holderName.invalid": "カードに記載されている名前を入力してください", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "%@から%@に送信されたコードを入力して、ご本人であることを確認してください。", "ctp.otp.saveCookiesCheckbox.label": "次回は検証をスキップする", "ctp.otp.saveCookiesCheckbox.information": "対象店舗で、お使いのデバイスとブラウザで記憶させるように選択すると、より迅速なチェックアウトが可能になります。共有デバイスでは推奨されません。", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "選択すると、お使いのデバイスとブラウザに記憶されます", "ctp.emptyProfile.message": "このClick to Payプロフィールに登録されているカードはありません。", "ctp.separatorText": "または以下を使用", "ctp.cards.title": "Click to Payで支払いを完了する", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "ANCVアプリケーションを使用して、支払を確認してください。", "ancv.form.instruction": "この支払を検証するには、Cheque-Vacancesアプリケーションが必要です。", "ancv.beneficiaryId.invalid": "有効なメールアドレスまたはANCV IDを入力してください" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/ko-KR.json b/packages/lib/src/language/locales/ko-KR.json index 20de9be36b..f362ce5006 100644 --- a/packages/lib/src/language/locales/ko-KR.json +++ b/packages/lib/src/language/locales/ko-KR.json @@ -4,6 +4,7 @@ "payButton.with": "%{maskedData}(으)로 %{value} 결제", "close": "닫기", "storeDetails": "다음 결제를 위해 이 수단 저장", + "readMore": "자세히 보기", "creditCard.holderName": "카드상의 이름", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "카드에 표시된 대로 이름을 입력합니다.", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "%@로 전송된 %@ 코드를 입력하여 본인 인증을 진행합니다.", "ctp.otp.saveCookiesCheckbox.label": "다음 번에는 인증 건너뛰기", "ctp.otp.saveCookiesCheckbox.information": "더 빠른 결제를 위해 사용자 기기와 참여 매장의 브라우저에서 정보를 기억하도록 선택하세요. 공유 기기에는 권장하지 않습니다.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "장치와 브라우저에서 기억되도록 선택하기", "ctp.emptyProfile.message": "해당 Click to Pay 프로필에 등록된 카드가 없습니다", "ctp.separatorText": "또는 사용", "ctp.cards.title": "Click to Pay로 결제 완료", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "ANCV 애플리케이션을 사용해 결제를 확인하세요.", "ancv.form.instruction": "이 결제를 인증하려면 Cheque-Vacances 애플리케이션이 필요합니다.", "ancv.beneficiaryId.invalid": "유효한 이메일 주소나 ANCV ID를 입력하세요." -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/nl-NL.json b/packages/lib/src/language/locales/nl-NL.json index b739f72a6e..d4e58b529e 100644 --- a/packages/lib/src/language/locales/nl-NL.json +++ b/packages/lib/src/language/locales/nl-NL.json @@ -4,6 +4,7 @@ "payButton.with": "Betaal %{value} met %{maskedData}", "close": "Sluiten", "storeDetails": "Bewaar voor mijn volgende betaling", + "readMore": "Verder lezen", "creditCard.holderName": "Naam op kaart", "creditCard.holderName.placeholder": "J. Janssen", "creditCard.holderName.invalid": "Voer naam in zoals weergegeven op kaart", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Voer de code %@ in die naar %@ is gestuurd, zodat we kunnen verifiëren dat u het bent.", "ctp.otp.saveCookiesCheckbox.label": "Verificatie de volgende keer overslaan", "ctp.otp.saveCookiesCheckbox.information": "Selecteer om te worden onthouden op uw apparaat en in uw browser bij deelnemende winkels, zodat u sneller kunt afrekenen. Niet aanbevolen voor gedeelde apparaten.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Selecteer om onthouden te worden op uw apparaat en browser", "ctp.emptyProfile.message": "Geen kaarten geregistreerd voor dit Click to Pay-profiel", "ctp.separatorText": "of gebruik", "ctp.cards.title": "Voltooi de betaling met Click to Pay", @@ -296,4 +298,4 @@ "ancv.confirmPayment": "Gebruik uw ANCV-toepassing om de betaling te bevestigen.", "ancv.form.instruction": "De Cheque-Vacances applicatie is nodig om deze betaling te valideren.", "ancv.beneficiaryId.invalid": "Voer een geldig e-mailadres of ANCV-id in" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/no-NO.json b/packages/lib/src/language/locales/no-NO.json index 64b5b2b970..69efa2fbb3 100644 --- a/packages/lib/src/language/locales/no-NO.json +++ b/packages/lib/src/language/locales/no-NO.json @@ -4,6 +4,7 @@ "payButton.with": "Betal %{value} med %{maskedData}", "close": "Lukk", "storeDetails": "Lagre til min neste betaling", + "readMore": "Les mer", "creditCard.holderName": "Navn på kortet", "creditCard.holderName.placeholder": "O. Nordmann", "creditCard.holderName.invalid": "Skriv inn navnet som vist på kortet", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Tast inn koden vi sendte til %@, for å verifisere at det er deg.", "ctp.otp.saveCookiesCheckbox.label": "Hopp over verifisering neste gang", "ctp.otp.saveCookiesCheckbox.information": "Velg for å bli husket på enheten og i nettleseren din i deltakende butikker for raskere betaling. Anbefales ikke for delte enheter.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Velg for å bli husket på enheten og i nettleseren din", "ctp.emptyProfile.message": "Ingen kort er registrert i denne Click to Pay-profilen", "ctp.separatorText": "eller bruk", "ctp.cards.title": "Fullfør betalingen med Click to Pay", @@ -296,4 +298,4 @@ "ancv.confirmPayment": "Bruk ANCV-appen for å bekrefte betalingen.", "ancv.form.instruction": "Cheque-Vacances-appen er nødvendig for å validere denne betalingen.", "ancv.beneficiaryId.invalid": "Oppgi en gyldig e-postadresse eller ANCV-ID" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/pl-PL.json b/packages/lib/src/language/locales/pl-PL.json index d32d1ead3b..878a8d3250 100644 --- a/packages/lib/src/language/locales/pl-PL.json +++ b/packages/lib/src/language/locales/pl-PL.json @@ -4,6 +4,7 @@ "payButton.with": "Zapłać %{value} za pomocą %{maskedData}", "close": "Zamknij", "storeDetails": "Zapisz na potrzeby następnej płatności", + "readMore": "Czytaj więcej", "creditCard.holderName": "Imię i nazwisko na karcie", "creditCard.holderName.placeholder": "J. Kowalski", "creditCard.holderName.invalid": "Wpisz imię i nazwisko w takim formacie, jak na karcie", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Wprowadź kod %@ wysłany na adres %@, aby potwierdzić swoją tożsamość.", "ctp.otp.saveCookiesCheckbox.label": "Następnym razem pomiń weryfikację", "ctp.otp.saveCookiesCheckbox.information": "Wybierz opcję zapamiętywania na urządzeniu i w przeglądarce w sklepach uczestniczących w programie, aby przyspieszyć realizację transakcji. Niezalecane dla współużytkowanych urządzeń.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Wybierz, aby zapamiętać dane logowania na Twoim urządzeniu i przeglądarce", "ctp.emptyProfile.message": "W tym profilu Click to Pay nie zarejestrowano żadnych kart", "ctp.separatorText": "lub przypadków jej użycia", "ctp.cards.title": "Dokończ płatność za pomocą funkcji Click to Pay", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "Użyj aplikacji ANCV, aby potwierdzić płatność.", "ancv.form.instruction": "Do zatwierdzenia tej płatności konieczna jest aplikacja Cheque-Vacances.", "ancv.beneficiaryId.invalid": "Wprowadź poprawny adres e-mail lub identyfikator ANCV" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/pt-BR.json b/packages/lib/src/language/locales/pt-BR.json index 44ef4530ae..4db38b0ce8 100644 --- a/packages/lib/src/language/locales/pt-BR.json +++ b/packages/lib/src/language/locales/pt-BR.json @@ -4,6 +4,7 @@ "payButton.with": "Pague %{value} com %{maskedData}", "close": "Fechar", "storeDetails": "Salvar para meu próximo pagamento", + "readMore": "Leia mais", "creditCard.holderName": "Nome no cartão", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "Digite o nome conforme mostrado no cartão", @@ -257,6 +258,7 @@ "ctp.otp.subtitle": "Digite o código %@ enviado para %@ para confirmar que é você.", "ctp.otp.saveCookiesCheckbox.label": "Ignorar verificação da próxima vez", "ctp.otp.saveCookiesCheckbox.information": "Selecione esta opção para ser lembrado no seu dispositivo e navegador, agilizando o pagamento nas lojas participantes. Não recomendado para dispositivos compartilhados.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Selecione para ser lembrado em seu dispositivo e navegador", "ctp.emptyProfile.message": "Não há nenhum cartão cadastrado neste perfil do Click to Pay", "ctp.separatorText": "ou use", "ctp.cards.title": "Concluir o pagamento com o Click to Pay", @@ -297,4 +299,4 @@ "ancv.confirmPayment": "Use o aplicativo da ANCV para confirmar o pagamento.", "ancv.form.instruction": "É necessário ter o aplicativo da Cheque-Vacances para validar este pagamento.", "ancv.beneficiaryId.invalid": "Insira um endereço de e-mail válido ou uma ID da ANCV" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/pt-PT.json b/packages/lib/src/language/locales/pt-PT.json index 88f21a05e3..90d8f5472b 100644 --- a/packages/lib/src/language/locales/pt-PT.json +++ b/packages/lib/src/language/locales/pt-PT.json @@ -4,6 +4,7 @@ "payButton.with": "Pagar %{value} com %{maskedData}", "close": "Fechar", "storeDetails": "Guardar para o meu próximo pagamento", + "readMore": "Ler mais", "creditCard.holderName": "Nome no cartão", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "Introduzir o nome como mostrado no cartão", @@ -261,6 +262,7 @@ "ctp.otp.subtitle": "Introduza o código %@ enviado para %@ para verificar se é você.", "ctp.otp.saveCookiesCheckbox.label": "Saltar verificação da próxima vez", "ctp.otp.saveCookiesCheckbox.information": "Selecione para ser memorizado no seu dispositivo e navegador nas lojas participantes, para uma finalização de compra mais rápida. Não recomendado para dispositivos partilhados.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Selecione para ser memorizado no seu dispositivo e navegador", "ctp.emptyProfile.message": "Nenhum cartão registado neste perfil Click to Pay", "ctp.separatorText": "ou utilize", "ctp.cards.title": "Pagamento completo com Click to Pay", @@ -301,4 +303,4 @@ "ancv.confirmPayment": "Use a sua aplicação ANCV para confirmar o pagamento.", "ancv.form.instruction": "A app Cheque-Vacances é necessária para validar este pagamento.", "ancv.beneficiaryId.invalid": "Insira um endereço de e-mail ou ID válido de ANCV" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/ro-RO.json b/packages/lib/src/language/locales/ro-RO.json index 918b1b423c..01d394ad19 100644 --- a/packages/lib/src/language/locales/ro-RO.json +++ b/packages/lib/src/language/locales/ro-RO.json @@ -4,6 +4,7 @@ "payButton.with": "Plătiți %{value} cu %{maskedData}", "close": "Închidere", "storeDetails": "Salvează pentru următoarea mea plată", + "readMore": "Citiți mai mult", "creditCard.holderName": "Numele de pe card", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "Completați numele după cum figurează pe card", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Introduceți codul %@ pe care l-am trimis la %@ pentru a confirma că sunteți dvs.", "ctp.otp.saveCookiesCheckbox.label": "Omiteți verificarea data viitoare", "ctp.otp.saveCookiesCheckbox.information": "Selectați pentru a fi reținut pe dispozitiv și în browserul dvs. la magazinele participante pentru o plată mai rapidă. Nerecomandat pentru dispozitivele partajate.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Selectați pentru a fi memorat pe dispozitiv și browser", "ctp.emptyProfile.message": "Niciun card înregistrat în acest profil Click to Pay", "ctp.separatorText": "sau folosiți", "ctp.cards.title": "Finalizați plata cu Click to Pay", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "Utilizați aplicația ANCV pentru a confirma plata.", "ancv.form.instruction": "Aplicația Cheque-Vacances este necesară pentru a valida această plată.", "ancv.beneficiaryId.invalid": "Completați o adresă de e-mail sau un ID ANCV valabil" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/ru-RU.json b/packages/lib/src/language/locales/ru-RU.json index d3153a02d8..ef3ffe53dc 100644 --- a/packages/lib/src/language/locales/ru-RU.json +++ b/packages/lib/src/language/locales/ru-RU.json @@ -4,6 +4,7 @@ "payButton.with": "Оплатить %{value} %{maskedData}", "close": "Закрыть", "storeDetails": "Сохранить для следующего платежа", + "readMore": "Подробнее", "creditCard.holderName": "Имя на карте", "creditCard.holderName.placeholder": "И. Петров", "creditCard.holderName.invalid": "Введите имя, как оно указано на карте", @@ -256,6 +257,7 @@ "ctp.otp.subtitle": "Для подтверждения своей личности введите код %@, отправленный %@.", "ctp.otp.saveCookiesCheckbox.label": "Пропустить подтверждение в следующий раз", "ctp.otp.saveCookiesCheckbox.information": "Чтобы в соответствующих магазинах запомнили ваше устройство и браузер, выберите эту опцию. Это позволит быстрее оформлять заказы. Не рекомендуется на устройствах совместного использования.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Выберите, чтобы запомнили ваше устройство и браузер", "ctp.emptyProfile.message": "В данном профиле Click to Pay нет зарегистрированных карт", "ctp.separatorText": "или используйте", "ctp.cards.title": "Оформите оплату с помощью Click to Pay", @@ -296,4 +298,4 @@ "ancv.confirmPayment": "Используйте приложение ANCV для подтверждения платежа.", "ancv.form.instruction": "Для подтверждения этого платежа необходимо приложение Cheque-Vacances.", "ancv.beneficiaryId.invalid": "Введите действительный адрес электронной почты или идентификатор ANCV" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/sk-SK.json b/packages/lib/src/language/locales/sk-SK.json index 573beb0e7e..476a4415a0 100644 --- a/packages/lib/src/language/locales/sk-SK.json +++ b/packages/lib/src/language/locales/sk-SK.json @@ -4,6 +4,7 @@ "payButton.with": "Zaplatiť %{value} pomocou %{maskedData}", "close": "Zavrieť", "storeDetails": "Uložiť pre moju ďalšiu platbu", + "readMore": "Prečítajte si viac", "creditCard.holderName": "Meno na karte", "creditCard.holderName.placeholder": "J. Novák", "creditCard.holderName.invalid": "Zadajte meno tak, ako je uvedené na karte", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Zadajte kód %@, ktorý sme poslali na adresu %@, aby sme overili, že ste to vy.", "ctp.otp.saveCookiesCheckbox.label": "Nabudúce preskočiť overovanie", "ctp.otp.saveCookiesCheckbox.information": "Vyberte túto možnosť na zapamätanie v zariadení a prehliadači v zúčastnených obchodoch, čím urýchlite platbu. Neodporúča sa pre zdieľané zariadenia.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Vyberte túto možnosť na zapamätanie v zariadení a prehliadači", "ctp.emptyProfile.message": "V tomto profile Click to Pay nie sú registrované žiadne karty", "ctp.separatorText": "alebo použite", "ctp.cards.title": "Dokončite platbu v službe Click to Pay", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "Na potvrdenie platby použite svoju aplikáciu ANCV.", "ancv.form.instruction": "Na potvrdenie tejto platby je potrebná aplikácia Cheque-Vacances.", "ancv.beneficiaryId.invalid": "Zadajte platnú e-mailovú adresu alebo ANCV ID" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/sl-SI.json b/packages/lib/src/language/locales/sl-SI.json index bfd883eaef..f50c1f8017 100644 --- a/packages/lib/src/language/locales/sl-SI.json +++ b/packages/lib/src/language/locales/sl-SI.json @@ -4,6 +4,7 @@ "payButton.with": "Plačajte %{value} z %{maskedData}", "close": "Zapri", "storeDetails": "Shrani za moje naslednje plačilo", + "readMore": "Preberi več", "creditCard.holderName": "Ime na kartici", "creditCard.holderName.placeholder": "J. Novak", "creditCard.holderName.invalid": "Vnesite ime, kot je prikazano na kartici", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Vnesite kodo %@, ki smo jo poslali na %@, da potrdite, da ste to res vi.", "ctp.otp.saveCookiesCheckbox.label": "Naslednjič preskoči preverjanje", "ctp.otp.saveCookiesCheckbox.information": "Izberite če želite, da se v vaši napravi in brskalniku v sodelujočih trgovinah vaši podatki shranijo za hitrejši zaključek zakupa. Ni priporočljivo za naprave v skupni rabi.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Izberite, če želite, da se v vaši napravi in brskalniku shranijo vaši podatki", "ctp.emptyProfile.message": "V tem profilu Click to Pay ni registriranih nobenih kartic", "ctp.separatorText": "ali uporabite", "ctp.cards.title": "Dokončajte plačilo s storitvijo Click to Pay", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "Za potrditev plačila uporabite aplikacijo ANCV.", "ancv.form.instruction": "Za potrditev tega plačila je potrebna aplikacija Cheque-Vacances.", "ancv.beneficiaryId.invalid": "Vnesite veljaven e-poštni naslov ali ANCV ID" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/sv-SE.json b/packages/lib/src/language/locales/sv-SE.json index 3004465921..a841bcfa39 100644 --- a/packages/lib/src/language/locales/sv-SE.json +++ b/packages/lib/src/language/locales/sv-SE.json @@ -4,6 +4,7 @@ "payButton.with": "Betala %{value} med %{maskedData}", "close": "Stäng", "storeDetails": "Spara till min nästa betalning", + "readMore": "Läs mer", "creditCard.holderName": "Namn på kort", "creditCard.holderName.placeholder": "A. Andersson", "creditCard.holderName.invalid": "Ange namnet som det står på kortet", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "Ange koden som %@ skickade till %@ för att verifiera att det är du.", "ctp.otp.saveCookiesCheckbox.label": "Hoppa över verifieringen nästa gång", "ctp.otp.saveCookiesCheckbox.information": "Välj att bli ihågkommen på din enhet och webbläsare i deltagande butiker för snabbare utcheckning. Rekommenderas inte för delade enheter.", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "Välj att bli ihågkommen på din enhet och i din webbläsare", "ctp.emptyProfile.message": "Inga kort registrerade i denna Click to Pay-profil", "ctp.separatorText": "eller använd", "ctp.cards.title": "Slutför betalningen med Click to Pay", @@ -297,4 +299,4 @@ "ancv.confirmPayment": "Bekräfta betalningen i din ANCV-app.", "ancv.form.instruction": "Appen Cheque-Vacances krävs för att validera denna betalning.", "ancv.beneficiaryId.invalid": "Ange en giltig e-postadress eller ANCV-ID" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/zh-CN.json b/packages/lib/src/language/locales/zh-CN.json index 5fe6f7a363..71cb8f968f 100644 --- a/packages/lib/src/language/locales/zh-CN.json +++ b/packages/lib/src/language/locales/zh-CN.json @@ -4,6 +4,7 @@ "payButton.with": "使用 %{maskedData} 支付 %{value}", "close": "关闭", "storeDetails": "保存以便下次支付使用", + "readMore": "阅读更多", "creditCard.holderName": "卡片上的姓名", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "输入卡片上显示的姓名", @@ -258,6 +259,7 @@ "ctp.otp.subtitle": "请输入我们发送至 %@ 的代码 (%@),以验证是您本人。", "ctp.otp.saveCookiesCheckbox.label": "下次跳过验证", "ctp.otp.saveCookiesCheckbox.information": "在您的设备和浏览器上,在参与活动的店铺中选择记住该选项,以便更快地结账。不建议用于共享设备。", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "选择在您的设备和浏览器上记住", "ctp.emptyProfile.message": "此 Click to Pay 个人资料中尚未注册任何卡片", "ctp.separatorText": "或使用", "ctp.cards.title": "借助 Click to Pay 完成付款", @@ -298,4 +300,4 @@ "ancv.confirmPayment": "使用您的 ANCV 应用以确认付款。", "ancv.form.instruction": "要验证这笔付款,必须使用 Checke-Vacances 应用。", "ancv.beneficiaryId.invalid": "输入有效的电子邮件地址或 ANCV ID" -} \ No newline at end of file +} diff --git a/packages/lib/src/language/locales/zh-TW.json b/packages/lib/src/language/locales/zh-TW.json index 2ea7e5ac01..c3525f9c64 100644 --- a/packages/lib/src/language/locales/zh-TW.json +++ b/packages/lib/src/language/locales/zh-TW.json @@ -4,6 +4,7 @@ "payButton.with": "用 %{maskedData} 支付 %{value}", "close": "關閉", "storeDetails": "儲存以供下次付款使用", + "readMore": "閱讀全文", "creditCard.holderName": "信用卡上的姓名", "creditCard.holderName.placeholder": "J. Smith", "creditCard.holderName.invalid": "輸入卡上所示的姓名", @@ -259,6 +260,7 @@ "ctp.otp.subtitle": "請輸入我們傳送至 %@ 的驗證碼 %@,以驗證是您本人。", "ctp.otp.saveCookiesCheckbox.label": "下次略過驗證", "ctp.otp.saveCookiesCheckbox.information": "選擇在裝置和瀏覽器中記住參與商店的驗證資訊,以加快結帳速度。不建議在共享裝置上選取該設定。", + "ctp.otp.saveCookiesCheckbox.shorterInfo": "選擇在裝置和瀏覽器中記住", "ctp.emptyProfile.message": "此 Click to Pay 個人資料中未註冊任何卡", "ctp.separatorText": "或使用", "ctp.cards.title": "使用 Click to Pay 完成付款", @@ -299,4 +301,4 @@ "ancv.confirmPayment": "使用您的 ANCV 應用程式確認付款。", "ancv.form.instruction": "必須申請 Cheque-Vacances 才能驗證此付款。", "ancv.beneficiaryId.invalid": "輸入有效的電子郵件地址或 ANCV ID" -} \ No newline at end of file +} diff --git a/packages/lib/src/utils/isScreenSmall.ts b/packages/lib/src/utils/isScreenSmall.ts new file mode 100644 index 0000000000..3dd210b0ab --- /dev/null +++ b/packages/lib/src/utils/isScreenSmall.ts @@ -0,0 +1,3 @@ +const isScreenSmall = (): boolean => window.matchMedia('(max-width: 480px)').matches; + +export default isScreenSmall; diff --git a/packages/playground/src/pages/Cards/Cards.js b/packages/playground/src/pages/Cards/Cards.js index dca46e6939..28aaea7026 100644 --- a/packages/playground/src/pages/Cards/Cards.js +++ b/packages/playground/src/pages/Cards/Cards.js @@ -188,7 +188,7 @@ getPaymentMethods({ amount, shopperLocale }).then(async paymentMethodsResponse = mcSrcClientId: '6d41d4d6-45b1-42c3-a5d0-a28c0e69d4b1' }, clickToPayConfiguration: { - shopperEmail: 'shopper@example.com', + shopperEmail: 'shopper@adyen.com', merchantDisplayName: 'Adyen Merchant Name', onReady: () => { console.log('Component is ready to be used');