Multi-Language Support
A 5-minute video on internationalization and multi-language support:
Pre-Built Translations
In addition to English, we have pre-built support for French, Spanish, and German. You can simply pass in an i18n
parameter with lang
set to one of 'fr', 'de', 'sp', 'en'
and all of the buttons and pre-set text will be switched to the specified language.
window.churnkey.init('show', {
customerId: 'CUSTOMER_ID',
..., // additional Churnkey parameters
i18n: {
lang: 'fr', // 'fr', 'de', 'sp', 'en'
// specific overrides under messages (optional); all i18n phrases can be found in (III) below
messages: {
fr: {
next: 'Prochain',
back: 'Retour',
...
weReadEveryAnswer: 'Nous lisons chaque réponse'
}
}
}
})
Overriding Built-in Buttons and Offer Text
You can optionally pass in translations and overrides for some of Churnkey’s hard-coded text. This can be done by passing an i18n
object when initializing Churnkey or by changing these translations within Churnkey | Cancel Flows | Settings. Please note that i18n messages that are passed in JavaScript while initializing the Churnkey cancel flow embed take priority over those declared within the cancel flow settings.
Using cancel flow settings to override default English phrases
Using the i18n
parameter for overriding default English phrases
window.churnkey.init('show', {
i18n: {
messages: {
en: {
goToAccount: 'Return to Billing', // english override
},
},
},
});
Using i18n for translating into non-English languages
For complete translation, all phrases from the global list below (all i18n phrases) must be provided.
window.churnkey.init('show', {
i18n: {
lang: 'fr',
messages: {
fr: {
next: 'Prochain',
back: 'Retour',
...
weReadEveryAnswer: 'Nous lisons chaque réponse'
}
}
}
})
Creating Customer Segments for Different Languages
- Head to the Churnkey | Cancel Flows | Advanced Settings and create a custom attribute called “language”.
b. For each language that you offer your app in, create a segmented cancel flow to be shown to those customers. For instance, below is how you would create a segment for French users.
c. For each segment you create, translate the text in the cancel flow into the target language.
d. When initializing Churnkey in your web app, pass in the custom language attribute as applicable. This will ensure that the customer is shown the translated cancel flow that matches the segmented flow conditions.
window.churnkey.init('show', {
customerAttributes: {
language: 'fr',
},
i18n: {
lang: 'fr',
},
});
All i18n Phrases
Below are all phrases that can be supplied. By default, Churnkey provides English, German, French, and Spanish translations.
en: {
next: 'Next',
back: 'Back',
nevermind: 'Go Back',
goToAccount: 'Go to Account',
getHelp: 'Something Wrong? Contact Us...',
declineOffer: 'Decline Offer',
confirmAndCancel: 'Confirm & Cancel',
pauseSubscription: 'Pause Subscription',
cancelSubscription: 'Cancel',
discountSubscription: 'Accept This Offer', // button to accept discount offer
claimOffer: 'Claim your limited-time offer', // shown above discount offers
discountOff: 'off', // e.g. "10% _off_"
discountFor: 'for', // e.g. "20% off _for_ 2 months"
discountForever: 'for life', // e.g. "10% off _for life_"
discountOneTime: 'your next renewal', // e.g. "10% off _your next renewal_"
day: 'Day | Days', // e.g. "1 day" "2 days"
month: 'month | months', // e.g. "1 month" "2 months"
year: 'year | years', // e.g. "1 year" "2 years"
error: 'Sorry, something went wrong', // generic error message
genericErrorDescription: 'Please contact us.', // generic error message
cancelNow: 'Cancel Subscription →', // button to cancel subscription immediately
applyingDiscount: 'Applying discount...', // shown while applying discount
applyingCancel: 'Cancelling subscription...', // shown while cancelling subscription
applyingResume: 'Resuming subscription...', // shown while resuming a paused subscription
applyingPause: 'Pausing subscription...', // shown while pausing subscription
discountApplied: 'Discount applied.', // shown when discount is applied
discountAppliedMessage: "We're so happy you're still here", // shown when discount is applied
pauseApplied: 'Subscription paused.', // shown when subscription is paused
pauseAppliedMessage: "You won't be billed until your subscription resumes", // shown when subscription is paused
pauseAppliedResumeMessage: 'Your subscription will resume on', // shown when subscription is paused
pauseScheduledMessage: 'Your subscription will be paused beginning', // shown when subscription is scheduled in the future
until: 'until',
cancelApplied: 'Subscription cancelled.', // shown when subscription is canceled
cancelAppliedMessage: "You won't be billed again", // shown when subscription is canceled
cancelAppliedDateMessage: 'Your subscription will end on', // shown when subscription is canceled
howLongToPausePrompt: 'Choose how long you want to pause...', // shown above the pause subscription prompt
whatCouldWeHaveDone: 'What could we have done better?', // shown above the feedback prompt
weReadEveryAnswer: 'We read every answer...', // shown as placeholder in the feedback prompt
applyingCustomerAction: 'This will just take a second.', // shown while applying customer action
loading: 'Loading...', // shown while loading
pauseWallCardPunch: 'Want access?',
pauseWallCta: 'Resume Subscription Now',
pauseWallCardHeading: 'Resume your subscription',
scheduledToReactivate: "It's scheduled to reactivate on",
resumeApplied: 'Subscription resumed', // shown when subscription is paused
resumeAppliedMessage: 'You will be billed at your next subscription renewal period.', // shown when subscription is paused
resumeNextChargeMessage: "Upon reactivation, you'll be charged at your original rate of ",
resumeNextChargeMessageWithoutAmount: "Upon reactivation, you'll be charged at your usual rate.",
resumeAccountDataInfo: 'Your account data is being kept safe for when your subscription resumes.',
subscriptionPauseNotice: 'Looks like your subscription is still paused',
failedPaymentNotice: 'Your account access is limited right now',
chargedMultipleTimeNotice:
"We've tried a number of times to charge your card on file, but it just hasn't worked out. You're not someone we want to lose, though 👇",
failedPaymentCardPunch: 'Update your card to restore access.',
resumeHey: 'Hey',
invoicePaidTitle: 'Invoice paid successfully',
logout: 'Logout →', // used on failed payment and pause wall
// ex You have a 20% off for 3 months discount valid until October 15. Your existing discount will be overridden upon accepting a new offer.
note: 'Note:', // shown before the discount note
discount: 'discount',
discountNoticeHeadline: "Note: you'll also lose an active discount.",
discountNoticePrepend: "If you cancel now, you'll lose your current",
discountOverride: "if you take this offer, you'll lose your current",
discountValidUntil: "It's good until", // shown on active discount
updateBilling: 'Update Card',
// Trial Extension
extendTrialCTA: 'Extend Trial By ',
extendTrialPunch: 'Your trial ends on ',
extendTrialOfferTitle: 'Trial Extension',
trialExtended: 'Trial extended.',
trialExtendedMessage: 'Your trial has been extended successfully',
applyingTrialExtension: 'Extending your trial',
// Plan Change
switchPlanCTA: 'Switch Plan',
changePlanHighlights: 'Highlights',
changePlanOfferPunch: 'Discounted Secret Plans',
planChanged: 'Plan changed.',
planChangedMessage: 'Your new plan is now in effect',
applyingPlanChange: 'Changing your plan...',
// Left Theme Step Tags
surveyStepTag: 'Your Feedback',
freeFormStepTag: 'Your Feedback',
finalConfirmation: 'Final Confirmation',
offerDiscountTag: 'Special Offer',
offerChangePlanTag: 'Consider Other Plans',
offerExtendTrialTag: 'Extend Your Trial',
offerRedirectTag: 'Let Us Help',
offerContactTag: 'Let Us Help',
offerPauseTag: 'Subscription Pause',
completeTag: 'Subscription Cancelled',
errorTag: 'An Error Occurred',
offerAccepted: 'Offer Accepted',
}