From 87742b2c3057921a272bd9e8af016991f64e6309 Mon Sep 17 00:00:00 2001 From: Charles El Issa Date: Mon, 8 Jun 2026 09:32:06 +0200 Subject: [PATCH 1/2] feat: add ar, fi, nb, ta, vi locales to dynamic checkout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add translations for Arabic, Finnish, Norwegian Bokmål, Tamil, and Vietnamese. Arabic gets RTL layout support via a `dir="rtl"` attribute on the widget wrapper plus accompanying style overrides. Co-Authored-By: Claude Opus 4.8 (1M context) --- package.json | 2 +- src/dynamic-checkout/dynamic-checkout.ts | 4 ++ src/dynamic-checkout/locales/ar.ts | 47 +++++++++++++++++++++ src/dynamic-checkout/locales/fi.ts | 48 +++++++++++++++++++++ src/dynamic-checkout/locales/nb.ts | 47 +++++++++++++++++++++ src/dynamic-checkout/locales/ta.ts | 48 +++++++++++++++++++++ src/dynamic-checkout/locales/vi.ts | 49 ++++++++++++++++++++++ src/dynamic-checkout/references.ts | 5 +++ src/dynamic-checkout/styles/default.ts | 26 ++++++++++++ src/dynamic-checkout/utils/translations.ts | 5 +++ 10 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 src/dynamic-checkout/locales/ar.ts create mode 100644 src/dynamic-checkout/locales/fi.ts create mode 100644 src/dynamic-checkout/locales/nb.ts create mode 100644 src/dynamic-checkout/locales/ta.ts create mode 100644 src/dynamic-checkout/locales/vi.ts diff --git a/package.json b/package.json index 9951d73..f7c1ca1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "processout.js", - "version": "1.9.5", + "version": "1.9.6", "description": "ProcessOut.js is a JavaScript library for ProcessOut's payment processing API.", "scripts": { "build:processout": "tsc -p src/processout && uglifyjs --compress --keep-fnames --ie8 dist/processout.js -o dist/processout.js", diff --git a/src/dynamic-checkout/dynamic-checkout.ts b/src/dynamic-checkout/dynamic-checkout.ts index 5c58651..07a356a 100644 --- a/src/dynamic-checkout/dynamic-checkout.ts +++ b/src/dynamic-checkout/dynamic-checkout.ts @@ -162,6 +162,10 @@ module ProcessOut { this.widgetWrapper = document.createElement("div") this.widgetWrapper.setAttribute("class", "dynamic-checkout-widget-wrapper") + if (this.paymentConfig.locale === "ar") { + this.widgetWrapper.setAttribute("dir", "rtl") + } + this.widgetWrapper.appendChild(view) this.dcoContainer.appendChild(this.widgetWrapper) } diff --git a/src/dynamic-checkout/locales/ar.ts b/src/dynamic-checkout/locales/ar.ts new file mode 100644 index 0000000..1cc9120 --- /dev/null +++ b/src/dynamic-checkout/locales/ar.ts @@ -0,0 +1,47 @@ +module ProcessOut { + export const ar = { + "apm-redirect-message": "سيتم تحويلك لإتمام عملية الدفع.", + "save-for-future-label": "حفظ لعمليات الدفع المستقبلية", + "continue-with-apm-button": "المتابعة باستخدام", + "pay-button-text": "ادفع", + "card-details-section-title": "تفاصيل البطاقة", + "cardholder-name-label": "اسم حامل البطاقة", + "billing-address-section-title": "عنوان الفوترة", + "country-label": "الدولة", + "select-country-placeholder": "اختر الدولة", + "select-state-placeholder": "اختر المنطقة", + "card-number-error-message": "رقم البطاقة غير صالح", + "expiry-date-error-message": "تاريخ الانتهاء غير صالح", + "cvc-error-message": "رمز الأمان غير صالح", + "cardholder-name-error-message": "اسم حامل البطاقة غير صالح", + "payment-error-message": "حدث خطأ ما. يرجى المحاولة مرة أخرى.", + "payment-cancelled-message": "تم إلغاء عملية الدفع.", + "express-checkout-header": "الدفع السريع", + "other-payment-methods-header": "طرق دفع أخرى", + "select-payment-method-label": "اختر طريقة الدفع", + "payment-success-message": "اكتملت عملية الدفع هذه.", + "payment-info-message": "نقوم بمعالجة عملية الدفع الخاصة بك. يمكنك الآن إغلاق هذه النافذة.", + "payment-pending-message": "عملية الدفع الخاصة بك قيد الانتظار.", + "payment-error-generic-message": "لم نتمكن من معالجة عملية الدفع الخاصة بك.", + "street1-label": "العنوان السطر 1", + "street2-label": "العنوان السطر 2", + "city-label": "المدينة", + "postcode-label": "الرمز البريدي", + "state-label": "المنطقة", + "payments-manager-header": "إدارة طرق الدفع المحفوظة", + "payments-manager-close-button": "إغلاق", + "no-saved-payment-methods-header": "لا توجد طرق دفع محفوظة", + "no-saved-payment-methods-message": "في المرة القادمة التي تحفظ فيها طريقة دفع، ستظهر هنا.", + "card-number-label": "رقم البطاقة", + "expiry-date-label": "تاريخ الانتهاء", + "cvc-label": "رمز الأمان", + "cvc-placeholder": "CVC/CVV", + "card-not-supported-error-message": "هذه البطاقة غير مدعومة", + "card-label": "بطاقة", + "delete-payment-method-label": "حذف طريقة الدفع", + "settings-button-label": "إدارة طرق الدفع المحفوظة", + "loading-label": "جارٍ التحميل", + "processing-payment-label": "جارٍ معالجة الدفع", + "card-form-label": "نموذج الدفع بالبطاقة", + } +} diff --git a/src/dynamic-checkout/locales/fi.ts b/src/dynamic-checkout/locales/fi.ts new file mode 100644 index 0000000..a5c831c --- /dev/null +++ b/src/dynamic-checkout/locales/fi.ts @@ -0,0 +1,48 @@ +module ProcessOut { + export const fi = { + "apm-redirect-message": "Sinut ohjataan viimeistelemään maksu.", + "save-for-future-label": "Tallenna tulevia maksuja varten", + "continue-with-apm-button": "Jatka tavalla", + "pay-button-text": "Maksa", + "card-details-section-title": "Kortin tiedot", + "cardholder-name-label": "Kortinhaltijan nimi", + "billing-address-section-title": "Laskutusosoite", + "country-label": "Maa", + "select-country-placeholder": "Valitse maa", + "select-state-placeholder": "Valitse osavaltio tai alue", + "card-number-error-message": "Kortin numero on virheellinen", + "expiry-date-error-message": "Viimeinen voimassaolopäivä on virheellinen", + "cvc-error-message": "Turvakoodi on virheellinen", + "cardholder-name-error-message": "Kortinhaltijan nimi on virheellinen", + "payment-error-message": "Jokin meni vikaan. Yritä uudelleen.", + "payment-cancelled-message": "Maksu on peruutettu.", + "express-checkout-header": "Pikamaksu", + "other-payment-methods-header": "Muut maksutavat", + "select-payment-method-label": "Valitse maksutapa", + "payment-success-message": "Tämä maksu on suoritettu.", + "payment-info-message": "Käsittelemme maksuasi. Voit nyt sulkea tämän ikkunan.", + "payment-pending-message": "Maksusi on käsittelyssä.", + "payment-error-generic-message": "Maksuasi ei voitu käsitellä.", + "street1-label": "Osoiterivi 1", + "street2-label": "Osoiterivi 2", + "city-label": "Kaupunki", + "postcode-label": "Postinumero", + "state-label": "Osavaltio tai alue", + "payments-manager-header": "Hallitse tallennettuja maksutapoja", + "payments-manager-close-button": "Sulje", + "no-saved-payment-methods-header": "Ei tallennettuja maksutapoja", + "no-saved-payment-methods-message": + "Kun seuraavan kerran tallennat maksutavan, se näkyy täällä.", + "card-number-label": "Kortin numero", + "expiry-date-label": "Viimeinen voimassaolopäivä", + "cvc-label": "Turvakoodi", + "cvc-placeholder": "CVC/CVV", + "card-not-supported-error-message": "Tätä korttia ei tueta", + "card-label": "Kortti", + "delete-payment-method-label": "Poista maksutapa", + "settings-button-label": "Hallitse tallennettuja maksutapoja", + "loading-label": "Ladataan", + "processing-payment-label": "Käsitellään maksua", + "card-form-label": "Kortin maksulomake", + } +} diff --git a/src/dynamic-checkout/locales/nb.ts b/src/dynamic-checkout/locales/nb.ts new file mode 100644 index 0000000..367c032 --- /dev/null +++ b/src/dynamic-checkout/locales/nb.ts @@ -0,0 +1,47 @@ +module ProcessOut { + export const nb = { + "apm-redirect-message": "Du blir videresendt for å fullføre betalingen.", + "save-for-future-label": "Lagre for fremtidige betalinger", + "continue-with-apm-button": "Fortsett med", + "pay-button-text": "Betal", + "card-details-section-title": "Kortdetaljer", + "cardholder-name-label": "Kortholders navn", + "billing-address-section-title": "Faktureringsadresse", + "country-label": "Land", + "select-country-placeholder": "Velg land", + "select-state-placeholder": "Velg region", + "card-number-error-message": "Kortnummeret er ugyldig", + "expiry-date-error-message": "Utløpsdatoen er ugyldig", + "cvc-error-message": "Sikkerhetskoden er ugyldig", + "cardholder-name-error-message": "Kortholders navn er ugyldig", + "payment-error-message": "Noe gikk galt. Vennligst prøv igjen.", + "payment-cancelled-message": "Betalingen er kansellert.", + "express-checkout-header": "Ekspressutsjekk", + "other-payment-methods-header": "Andre betalingsmåter", + "select-payment-method-label": "Velg betalingsmåte", + "payment-success-message": "Denne betalingen er fullført.", + "payment-info-message": "Vi behandler betalingen din. Du kan nå lukke dette vinduet.", + "payment-pending-message": "Betalingen din er under behandling.", + "payment-error-generic-message": "Vi kunne ikke behandle betalingen din.", + "street1-label": "Adresselinje 1", + "street2-label": "Adresselinje 2", + "city-label": "By", + "postcode-label": "Postnummer", + "state-label": "Region", + "payments-manager-header": "Administrer lagrede betalingsmåter", + "payments-manager-close-button": "Lukk", + "no-saved-payment-methods-header": "Ingen lagrede betalingsmåter", + "no-saved-payment-methods-message": "Neste gang du lagrer en betalingsmåte, vil den vises her.", + "card-number-label": "Kortnummer", + "expiry-date-label": "Utløpsdato", + "cvc-label": "Sikkerhetskode", + "cvc-placeholder": "CVC/CVV", + "card-not-supported-error-message": "Dette kortet støttes ikke", + "card-label": "Kort", + "delete-payment-method-label": "Slett betalingsmåte", + "settings-button-label": "Administrer lagrede betalingsmåter", + "loading-label": "Laster", + "processing-payment-label": "Behandler betaling", + "card-form-label": "Skjema for kortbetaling", + } +} diff --git a/src/dynamic-checkout/locales/ta.ts b/src/dynamic-checkout/locales/ta.ts new file mode 100644 index 0000000..a67866c --- /dev/null +++ b/src/dynamic-checkout/locales/ta.ts @@ -0,0 +1,48 @@ +module ProcessOut { + export const ta = { + "apm-redirect-message": "கட்டணத்தை முடிக்க நீங்கள் திருப்பி அனுப்பப்படுவீர்கள்.", + "save-for-future-label": "எதிர்கால கட்டணங்களுக்காகச் சேமிக்கவும்", + "continue-with-apm-button": "இதனுடன் தொடரவும்", + "pay-button-text": "செலுத்து", + "card-details-section-title": "அட்டை விவரங்கள்", + "cardholder-name-label": "அட்டைதாரரின் பெயர்", + "billing-address-section-title": "பில்லிங் முகவரி", + "country-label": "நாடு", + "select-country-placeholder": "நாட்டைத் தேர்ந்தெடுக்கவும்", + "select-state-placeholder": "மாநிலத்தைத் தேர்ந்தெடுக்கவும்", + "card-number-error-message": "அட்டை எண் தவறானது", + "expiry-date-error-message": "காலாவதி தேதி தவறானது", + "cvc-error-message": "பாதுகாப்புக் குறியீடு தவறானது", + "cardholder-name-error-message": "அட்டைதாரரின் பெயர் தவறானது", + "payment-error-message": "ஏதோ தவறு ஏற்பட்டது. மீண்டும் முயற்சிக்கவும்.", + "payment-cancelled-message": "கட்டணம் ரத்து செய்யப்பட்டது.", + "express-checkout-header": "விரைவு செக்அவுட்", + "other-payment-methods-header": "பிற கட்டண முறைகள்", + "select-payment-method-label": "கட்டண முறையைத் தேர்ந்தெடுக்கவும்", + "payment-success-message": "இந்தக் கட்டணம் முடிந்தது.", + "payment-info-message": "உங்கள் கட்டணத்தைச் செயலாக்குகிறோம். இப்போது இந்தச் சாளரத்தை மூடலாம்.", + "payment-pending-message": "உங்கள் கட்டணம் நிலுவையில் உள்ளது.", + "payment-error-generic-message": "உங்கள் கட்டணத்தைச் செயலாக்க முடியவில்லை.", + "street1-label": "முகவரி வரி 1", + "street2-label": "முகவரி வரி 2", + "city-label": "நகரம்", + "postcode-label": "அஞ்சல் குறியீடு", + "state-label": "மாநிலம்", + "payments-manager-header": "சேமித்த கட்டண முறைகளை நிர்வகிக்கவும்", + "payments-manager-close-button": "மூடு", + "no-saved-payment-methods-header": "சேமித்த கட்டண முறைகள் இல்லை", + "no-saved-payment-methods-message": + "அடுத்த முறை நீங்கள் ஒரு கட்டண முறையைச் சேமிக்கும்போது, அது இங்கே தோன்றும்.", + "card-number-label": "அட்டை எண்", + "expiry-date-label": "காலாவதி தேதி", + "cvc-label": "பாதுகாப்புக் குறியீடு", + "cvc-placeholder": "CVC/CVV", + "card-not-supported-error-message": "இந்த அட்டை ஆதரிக்கப்படவில்லை", + "card-label": "அட்டை", + "delete-payment-method-label": "கட்டண முறையை நீக்கு", + "settings-button-label": "சேமித்த கட்டண முறைகளை நிர்வகிக்கவும்", + "loading-label": "ஏற்றுகிறது", + "processing-payment-label": "கட்டணம் செயலாக்கப்படுகிறது", + "card-form-label": "அட்டை கட்டணப் படிவம்", + } +} diff --git a/src/dynamic-checkout/locales/vi.ts b/src/dynamic-checkout/locales/vi.ts new file mode 100644 index 0000000..2c70671 --- /dev/null +++ b/src/dynamic-checkout/locales/vi.ts @@ -0,0 +1,49 @@ +module ProcessOut { + export const vi = { + "apm-redirect-message": "Bạn sẽ được chuyển hướng để hoàn tất thanh toán.", + "save-for-future-label": "Lưu cho các lần thanh toán sau", + "continue-with-apm-button": "Tiếp tục với", + "pay-button-text": "Thanh toán", + "card-details-section-title": "Chi tiết thẻ", + "cardholder-name-label": "Tên chủ thẻ", + "billing-address-section-title": "Địa chỉ thanh toán", + "country-label": "Quốc gia", + "select-country-placeholder": "Chọn quốc gia", + "select-state-placeholder": "Chọn tỉnh hoặc bang", + "card-number-error-message": "Số thẻ không hợp lệ", + "expiry-date-error-message": "Ngày hết hạn không hợp lệ", + "cvc-error-message": "Mã bảo mật không hợp lệ", + "cardholder-name-error-message": "Tên chủ thẻ không hợp lệ", + "payment-error-message": "Đã xảy ra lỗi. Vui lòng thử lại.", + "payment-cancelled-message": "Thanh toán đã bị hủy.", + "express-checkout-header": "Thanh toán nhanh", + "other-payment-methods-header": "Phương thức thanh toán khác", + "select-payment-method-label": "Chọn phương thức thanh toán", + "payment-success-message": "Thanh toán này đã hoàn tất.", + "payment-info-message": + "Chúng tôi đang xử lý thanh toán của bạn. Bạn có thể đóng cửa sổ này ngay bây giờ.", + "payment-pending-message": "Thanh toán của bạn đang chờ xử lý.", + "payment-error-generic-message": "Chúng tôi không thể xử lý thanh toán của bạn.", + "street1-label": "Địa chỉ dòng 1", + "street2-label": "Địa chỉ dòng 2", + "city-label": "Thành phố", + "postcode-label": "Mã bưu chính", + "state-label": "Tỉnh hoặc bang", + "payments-manager-header": "Quản lý phương thức thanh toán đã lưu", + "payments-manager-close-button": "Đóng", + "no-saved-payment-methods-header": "Không có phương thức thanh toán đã lưu", + "no-saved-payment-methods-message": + "Lần tới khi bạn lưu một phương thức thanh toán, nó sẽ xuất hiện ở đây.", + "card-number-label": "Số thẻ", + "expiry-date-label": "Ngày hết hạn", + "cvc-label": "Mã bảo mật", + "cvc-placeholder": "CVC/CVV", + "card-not-supported-error-message": "Thẻ này không được hỗ trợ", + "card-label": "Thẻ", + "delete-payment-method-label": "Xóa phương thức thanh toán", + "settings-button-label": "Quản lý phương thức thanh toán đã lưu", + "loading-label": "Đang tải", + "processing-payment-label": "Đang xử lý thanh toán", + "card-form-label": "Biểu mẫu thanh toán bằng thẻ", + } +} diff --git a/src/dynamic-checkout/references.ts b/src/dynamic-checkout/references.ts index cbd3257..24f1b84 100644 --- a/src/dynamic-checkout/references.ts +++ b/src/dynamic-checkout/references.ts @@ -24,15 +24,20 @@ /// /// /// +/// /// /// /// +/// /// /// /// /// +/// /// /// +/// +/// /// /// /// diff --git a/src/dynamic-checkout/styles/default.ts b/src/dynamic-checkout/styles/default.ts index f6d7577..985d7f7 100644 --- a/src/dynamic-checkout/styles/default.ts +++ b/src/dynamic-checkout/styles/default.ts @@ -929,4 +929,30 @@ const defaultStyles = ` animation: none; } } + + /* Right-to-left layout overrides (e.g. Arabic locale) */ + [dir="rtl"] .dco-payment-method-button-wrapper { + padding-right: 0; + padding-left: 10px; + } + + [dir="rtl"] .dco-payment-method-card-form-input-cvc { + padding-right: 0; + padding-left: 40px; + } + + [dir="rtl"] .dco-card-cvc-icon { + right: auto; + left: 10px; + } + + [dir="rtl"] .dco-card-scheme-logo { + right: auto; + left: 10px; + } + + [dir="rtl"] .dco-delete-payment-method-button { + margin-left: 0; + margin-right: auto; + } ` diff --git a/src/dynamic-checkout/utils/translations.ts b/src/dynamic-checkout/utils/translations.ts index 9fc101d..06edbce 100644 --- a/src/dynamic-checkout/utils/translations.ts +++ b/src/dynamic-checkout/utils/translations.ts @@ -3,15 +3,20 @@ module ProcessOut { export class Translations { static localeTranslationsMap = { + ar: ar, de: de, en: en, es: es, + fi: fi, fr: fr, it: it, ja: ja, ko: ko, + nb: nb, pl: pl, pt: pt, + ta: ta, + vi: vi, } static getText(key: string, locale: string) { From 5345aa4828fbcf5eb20b1026de1ecd01281914b9 Mon Sep 17 00:00:00 2001 From: jakubjasinsky <141161697+jakubjasinsky@users.noreply.github.com> Date: Tue, 9 Jun 2026 11:22:29 +0200 Subject: [PATCH 2/2] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/dynamic-checkout/styles/default.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dynamic-checkout/styles/default.ts b/src/dynamic-checkout/styles/default.ts index 985d7f7..4900e42 100644 --- a/src/dynamic-checkout/styles/default.ts +++ b/src/dynamic-checkout/styles/default.ts @@ -931,27 +931,27 @@ const defaultStyles = ` } /* Right-to-left layout overrides (e.g. Arabic locale) */ - [dir="rtl"] .dco-payment-method-button-wrapper { + .dynamic-checkout-widget-wrapper[dir="rtl"] .dco-payment-method-button-wrapper { padding-right: 0; padding-left: 10px; } - [dir="rtl"] .dco-payment-method-card-form-input-cvc { + .dynamic-checkout-widget-wrapper[dir="rtl"] .dco-payment-method-card-form-input-cvc { padding-right: 0; padding-left: 40px; } - [dir="rtl"] .dco-card-cvc-icon { + .dynamic-checkout-widget-wrapper[dir="rtl"] .dco-card-cvc-icon { right: auto; left: 10px; } - [dir="rtl"] .dco-card-scheme-logo { + .dynamic-checkout-widget-wrapper[dir="rtl"] .dco-card-scheme-logo { right: auto; left: 10px; } - [dir="rtl"] .dco-delete-payment-method-button { + .dynamic-checkout-widget-wrapper[dir="rtl"] .dco-delete-payment-method-button { margin-left: 0; margin-right: auto; }