From 5fc81e2479bc33a581b5321399dbbc8c0d278b7d Mon Sep 17 00:00:00 2001 From: FranzBot Date: Sat, 5 Oct 2019 00:00:21 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/nl.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json index d302c7429..607e81c89 100644 --- a/src/i18n/locales/nl.json +++ b/src/i18n/locales/nl.json @@ -91,7 +91,7 @@ "menu.services" : "Services", "menu.services.activatePreviousService" : "Activeer vorige service", "menu.services.addNewService" : "Nieuwe service toevoegen...", - "menu.services.goHome" : "Home", + "menu.services.goHome" : "Thuis", "menu.services.setNextServiceActive" : "Activeer volgende service", "menu.todos" : "Taken", "menu.todos.enableTodos" : "Todo's inschakelen", @@ -123,9 +123,9 @@ "password.submit.label" : "Verzenden", "password.successInfo" : "Controleer je e-mail", "premiumFeature.button.upgradeAccount" : "Upgrade Account", - "pricing.features.adFree" : "Forever ad-free", + "pricing.features.adFree" : "Voor altijd reclamevrij", "pricing.features.appDelays" : "Geen wachtschermen", - "pricing.features.customWebsites" : "Add Custom Websites", + "pricing.features.customWebsites" : "Voeg eigen websites toe", "pricing.features.onPremise" : "On-premise & other Hosted Services", "pricing.features.serviceProxies" : "Service Proxies", "pricing.features.spellchecker" : "Spellchecker support", @@ -373,7 +373,7 @@ "validation.url" : "{field} is geen geldige URL", "webControls.back" : "Back", "webControls.forward" : "Forward", - "webControls.goHome" : "Home", + "webControls.goHome" : "Thuis", "webControls.openInBrowser" : "Open in Browser", "webControls.reload" : "Herladen", "welcome.loginButton" : "Log in op je account", -- cgit v1.2.3-54-g00ecf From 5323a190a45644d87bedf89726d74ee92dceeac0 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 7 Oct 2019 20:17:48 +0200 Subject: Also show Franz loading spinner when workspaces are loading --- src/containers/layout/AppLayoutContainer.js | 5 ++++- src/features/workspaces/store.js | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js index a14a98554..5563c48bc 100644 --- a/src/containers/layout/AppLayoutContainer.js +++ b/src/containers/layout/AppLayoutContainer.js @@ -24,6 +24,7 @@ import { state as delayAppState } from '../../features/delayApp'; import { workspaceActions } from '../../features/workspaces/actions'; import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer'; import { workspaceStore } from '../../features/workspaces'; +import WorkspacesStore from '../../features/workspaces/store'; export default @inject('stores', 'actions') @observer class AppLayoutContainer extends Component { static defaultProps = { @@ -41,6 +42,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e globalError, requests, user, + workspaces, } = this.props.stores; const { @@ -79,7 +81,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e const isLoadingServices = services.allServicesRequest.isExecuting && services.allServicesRequest.isExecutingFirstTime; - if (isLoadingFeatures || isLoadingServices) { + if (isLoadingFeatures || isLoadingServices || workspaces.isLoadingWorkspaces) { return ( @@ -174,6 +176,7 @@ AppLayoutContainer.wrappedComponent.propTypes = { user: PropTypes.instanceOf(UserStore).isRequired, requests: PropTypes.instanceOf(RequestStore).isRequired, globalError: PropTypes.instanceOf(GlobalErrorStore).isRequired, + workspaces: PropTypes.instanceOf(WorkspacesStore).isRequired, }).isRequired, actions: PropTypes.shape({ service: PropTypes.shape({ diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index f08323e6c..b83fe335a 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -45,6 +45,11 @@ export default class WorkspacesStore extends FeatureStore { return getUserWorkspacesRequest.result || []; } + @computed get isLoadingWorkspaces() { + if (!this.isFeatureActive) return false; + return getUserWorkspacesRequest.isExecutingFirstTime; + } + @computed get settings() { return localStorage.getItem('workspaces') || {}; } -- cgit v1.2.3-54-g00ecf From dd880340379c1be57acd95101180b29f146503a1 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 7 Oct 2019 20:18:19 +0200 Subject: Fix app delay by waiting on workspaces to load --- src/features/delayApp/index.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js index c0029873a..28b079e6b 100644 --- a/src/features/delayApp/index.js +++ b/src/features/delayApp/index.js @@ -4,6 +4,7 @@ import DelayAppComponent from './Component'; import { DEFAULT_FEATURES_CONFIG } from '../../config'; import { gaEvent, gaPage } from '../../lib/analytics'; +import { getUserWorkspacesRequest } from '../workspaces/api'; const debug = require('debug')('Franz:feature:delayApp'); @@ -33,7 +34,13 @@ export default function init(stores) { }; reaction( - () => stores.user.isLoggedIn && stores.services.allServicesRequest.wasExecuted && stores.features.features.needToWaitToProceed && !stores.user.data.isPremium, + () => ( + stores.user.isLoggedIn + && stores.services.allServicesRequest.wasExecuted + && getUserWorkspacesRequest.wasExecuted + && stores.features.features.needToWaitToProceed + && !stores.user.data.isPremium + ), (isEnabled) => { if (isEnabled) { debug('Enabling `delayApp` feature'); -- cgit v1.2.3-54-g00ecf From dea59f20debdfde7279551f5cd2fbf3c390171e0 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 7 Oct 2019 20:18:38 +0200 Subject: Fix non-related issues --- src/components/ui/PremiumFeatureContainer/index.js | 4 ++-- src/containers/settings/EditSettingsScreen.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/components/ui/PremiumFeatureContainer/index.js b/src/components/ui/PremiumFeatureContainer/index.js index 8d2746e22..f1e526560 100644 --- a/src/components/ui/PremiumFeatureContainer/index.js +++ b/src/components/ui/PremiumFeatureContainer/index.js @@ -10,7 +10,7 @@ import UserStore from '../../../stores/UserStore'; import styles from './styles'; import { gaEvent } from '../../../lib/analytics'; -import { FeatureStore } from '../../../features/utils/FeatureStore'; +import FeaturesStore from '../../../stores/FeaturesStore'; const messages = defineMessages({ action: { @@ -96,7 +96,7 @@ PremiumFeatureContainer.wrappedComponent.propTypes = { children: oneOrManyChildElements.isRequired, stores: PropTypes.shape({ user: PropTypes.instanceOf(UserStore).isRequired, - features: PropTypes.instanceOf(FeatureStore).isRequired, + features: PropTypes.instanceOf(FeaturesStore).isRequired, }).isRequired, actions: PropTypes.shape({ ui: PropTypes.shape({ diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js index 9aba212be..698b5a3d9 100644 --- a/src/containers/settings/EditSettingsScreen.js +++ b/src/containers/settings/EditSettingsScreen.js @@ -313,7 +313,7 @@ EditSettingsScreen.wrappedComponent.propTypes = { toggleTodosFeatureVisibility: PropTypes.func.isRequired, }).isRequired, workspaces: PropTypes.shape({ - toggleAllWorkspacesLoadedSetting: PropTypes.func.isRequired, + toggleKeepAllWorkspacesLoadedSetting: PropTypes.func.isRequired, }).isRequired, }).isRequired, }; -- cgit v1.2.3-54-g00ecf From ea366b28cccb457064df1747db9f8d4f425c2998 Mon Sep 17 00:00:00 2001 From: FranzBot Date: Tue, 8 Oct 2019 12:00:20 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/id.json | 154 +++++++++++++++++++++++------------------------ 1 file changed, 77 insertions(+), 77 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json index 0c66f59bc..841644703 100644 --- a/src/i18n/locales/id.json +++ b/src/i18n/locales/id.json @@ -4,12 +4,12 @@ "feature.announcements.changelog.headline" : "Perubahan dalam Franz {version}", "feature.delayApp.headline" : "Beli Lisensi Pendukung Franz agar tidak perlu menunggu", "feature.delayApp.text" : "Franz akan melanjutkan dalam {seconds} detik.", - "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", - "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", + "feature.delayApp.trial.action" : "Ya, saya ingin menguji gratis 14 hari Franz Professional", + "feature.delayApp.trial.actionShort" : "Aktifkan uji coba gratis Franz Professional", + "feature.delayApp.trial.headline" : "Dapatkan uji coba gratis 14 hari Franz Professional dan tak perlu lagi menunggu!", "feature.delayApp.upgrade.action" : "Dapatkan Lisensi Pendukung Franz", "feature.delayApp.upgrade.actionShort" : "Tingkatkan akun", - "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", + "feature.serviceLimit.limitReached" : "Anda telah menambahkan {amount} dari kuota {limit} layanan yang tersedia untuk paket Anda. Tingkatkan akun untuk menambahkan layanan lain.", "feature.shareFranz.action.email" : "Kirim sebagai email", "feature.shareFranz.action.facebook" : "Bagikan di Facebook", "feature.shareFranz.action.twitter" : "Bagikan di Twitter", @@ -17,17 +17,17 @@ "feature.shareFranz.shareText.email" : "Saya telah menambahkan layanan {count} ke Franz! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan co di www.meetfranz.com", "feature.shareFranz.shareText.twitter" : "Saya telah menambahkan {count} layanan di Franz! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan lainnya di www.meetfranz.com \/cc @FranzMessenger", "feature.shareFranz.text" : "Beri tahu teman dan kolega Anda betapa hebatnya Franz dan bantu kami menyebarkan berita.", - "feature.todos.premium.info" : "Franz Todos are available to premium users now!", - "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.", - "feature.todos.premium.upgrade" : "Upgrade Account", - "global.api.unhealthy" : "Tidak dapat tersambung ke layanan Franz", - "global.franzProRequired" : "Franz Professional Required", + "feature.todos.premium.info" : "Kini Franz Todos tersedia untuk pengguna premium!", + "feature.todos.premium.rollout" : "Yang lain harus menunggu lebih lama.", + "feature.todos.premium.upgrade" : "Tingkatkan Akun", + "global.api.unhealthy" : "Tidak dapat tersambung ke layanan online Franz", + "global.franzProRequired" : "Diperlukan Franz Professional", "global.notConnectedToTheInternet" : "Anda tidak tersambung ke internet.", "global.spellchecker.useDefault" : "Gunakan Bawaan Sistem ({default})", "global.spellchecking.autodetect" : "Deteksi bahasa secara otomatis", "global.spellchecking.autodetect.short" : "Otomatis", "global.spellchecking.language" : "Periksa ejaan", - "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional", + "global.upgradeButton.upgradeToPro" : "Tingkatkan ke Franz Professional", "import.headline" : "Impor layanan Franz 4 Anda", "import.notSupportedHeadline" : "Layanan belum didukung di Franz 5", "import.skip.label" : "Saya ingin menambahkan layanan secara manual", @@ -37,12 +37,12 @@ "infobar.buttonReloadServices" : "Muat ulang layanan", "infobar.requiredRequestsFailed" : "Gagal memuat layanan dan informasi pengguna", "infobar.servicesUpdated" : "Layanan Anda telah diperbarui", - "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!", + "infobar.trialActivated" : "Uji coba Anda berhasil diaktifkan! Selamat berpesan ria!", "infobar.updateAvailable" : "Versi baru Franz tersedia.", "invite.email.label" : "Alamat email", "invite.headline.friends" : "Undang 3 teman atau kolega Anda", "invite.name.label" : "Nama", - "invite.skip.label" : "Saya ingin melakukan ini nanti", + "invite.skip.label" : "Nanti saja", "invite.submit.label" : "Kirim undangan", "invite.successInfo" : "Undangan berhasil dikirim", "login.email.label" : "Alamat email", @@ -54,8 +54,8 @@ "login.serverLogout" : "Sesi Anda telah berakhir, silakan masuk kembali.", "login.submit.label" : "Masuk", "login.tokenExpired" : "Sesi Anda telah kedaluwarsa, silakan masuk kembali.", - "menu.Todoss.closeTodosDrawer" : "Close Todos drawer", - "menu.Todoss.openTodosDrawer" : "Open Todos drawer", + "menu.Todoss.closeTodosDrawer" : "Tutup laci Todos", + "menu.Todoss.openTodosDrawer" : "Buka laci Todos", "menu.app.about" : "Tentang Franz", "menu.app.announcement" : "Yang baru", "menu.app.checkForUpdates" : "Periksa versi baru", @@ -81,9 +81,9 @@ "menu.file" : "Berkas", "menu.help" : "Bantuan", "menu.help.changelog" : "Log Perubahan", - "menu.help.debugInfo" : "Copy Debug Information", - "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.", - "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information", + "menu.help.debugInfo" : "Salin Informasi Debug", + "menu.help.debugInfoCopiedBody" : "Informasi Debug Anda telah disalin ke papan klip.", + "menu.help.debugInfoCopiedHeadline" : "Informasi Debug Franz", "menu.help.learnMore" : "Pelajari Lebih Lanjut", "menu.help.privacy" : "Pernyataan Privasi", "menu.help.support" : "Dukungan", @@ -91,10 +91,10 @@ "menu.services" : "Layanan", "menu.services.activatePreviousService" : "Aktifkan layanan sebelumnya", "menu.services.addNewService" : "Tambahkan Layanan Baru...", - "menu.services.goHome" : "Home", + "menu.services.goHome" : "Beranda", "menu.services.setNextServiceActive" : "Aktifkan layanan berikutnya", "menu.todos" : "Todos", - "menu.todos.enableTodos" : "Enable Todos", + "menu.todos.enableTodos" : "Aktifkan Todos", "menu.view" : "Tampilan", "menu.view.enterFullScreen" : "Masuk ke Mode Layar Penuh", "menu.view.exitFullScreen" : "Keluar dari Layar Penuh", @@ -104,13 +104,13 @@ "menu.view.toggleDevTools" : "Aktif\/Nonaktifkan alat pengembang", "menu.view.toggleFullScreen" : "Aktif\/Nonaktifkan Layar Penuh", "menu.view.toggleServiceDevTools" : "Aktif\/Nonaktifkan layanan alat pengembang", - "menu.view.toggleTodosDevTools" : "Toggle Todos Developer Tools", + "menu.view.toggleTodosDevTools" : "Aktif\/Nonaktifkan Alat Pengembang Todos", "menu.view.zoomIn" : "Perbesar", "menu.view.zoomOut" : "Perkecil", "menu.window" : "Jendela", "menu.window.close" : "Tutup", "menu.window.minimize" : "Minimalkan", - "menu.workspaces" : "Ruang kerja", + "menu.workspaces" : "Ruang Kerja", "menu.workspaces.addNewWorkspace" : "Tambah Ruang Kerja Baru...", "menu.workspaces.closeWorkspaceDrawer" : "Tutup laci ruang kerja", "menu.workspaces.defaultWorkspace" : "Semua layanan", @@ -123,33 +123,33 @@ "password.submit.label" : "Kirim", "password.successInfo" : "Periksa email Anda", "premiumFeature.button.upgradeAccount" : "Tingkatkan akun", - "pricing.features.adFree" : "Forever ad-free", - "pricing.features.appDelays" : "No Waiting Screens", - "pricing.features.customWebsites" : "Add Custom Websites", - "pricing.features.onPremise" : "On-premise & other Hosted Services", - "pricing.features.serviceProxies" : "Service Proxies", - "pricing.features.spellchecker" : "Spellchecker support", - "pricing.features.teamManagement" : "Team Management", - "pricing.features.thirdPartyServices" : "Install 3rd party services", - "pricing.features.unlimitedServices" : "Add unlimited services", - "pricing.features.workspaces" : "Ruang kerja", + "pricing.features.adFree" : "Bebas iklan selamanya", + "pricing.features.appDelays" : "Tanpa Layar Penjeda Waktu", + "pricing.features.customWebsites" : "Tambahkan Situs Web Khusus", + "pricing.features.onPremise" : "Layanan On-premise dan Hosted lainnya", + "pricing.features.serviceProxies" : "Proksi Layanan", + "pricing.features.spellchecker" : "Dukungan pengecek ejaan", + "pricing.features.teamManagement" : "Manajemen Tim", + "pricing.features.thirdPartyServices" : "Instal layanan pihak ketiga", + "pricing.features.unlimitedServices" : "Tambahkan layanan tak terbatas", + "pricing.features.workspaces" : "Ruang Kerja", "pricing.plan.free" : "Franz Free", "pricing.plan.legacy" : "Franz Premium", "pricing.plan.personal" : "Franz Personal", - "pricing.plan.personal-monthly" : "Franz Personal Monthly", - "pricing.plan.personal-yearly" : "Franz Personal Yearly", + "pricing.plan.personal-monthly" : "Franz Personal Bulanan", + "pricing.plan.personal-yearly" : "Franz Personal Tahunan", "pricing.plan.pro" : "Franz Professional", - "pricing.plan.pro-monthly" : "Franz Professional Monthly", - "pricing.plan.pro-yearly" : "Franz Professional Yearly", - "pricing.trial.cta.accept" : "Yes, upgrade my account to Franz Professional", - "pricing.trial.cta.skip" : "Continue to Franz", - "pricing.trial.error" : "Sorry, we could not activate your trial!", - "pricing.trial.features.headline" : "Franz Professional includes:", + "pricing.plan.pro-monthly" : "Franz Professional Bulanan", + "pricing.plan.pro-yearly" : "Franz Professional Tahunan", + "pricing.trial.cta.accept" : "Ya, tingkatkan akun saya ke Franz Professional", + "pricing.trial.cta.skip" : "Lanjutkan ke Franz", + "pricing.trial.error" : "Maaf, kami tidak bisa mengaktifkan uji coba Anda!", + "pricing.trial.features.headline" : "Franz Professional menyertakan:", "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Your personal welcome offer:", - "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", - "pricing.trial.terms.headline" : "No strings attached", - "pricing.trial.terms.noCreditCard" : "No credit card required", + "pricing.trial.subheadline" : "Penawaran spesial untuk Anda:", + "pricing.trial.terms.automaticTrialEnd" : "Uji coba gratis Anda berakhir secara otomatis dalam 14 hari", + "pricing.trial.terms.headline" : "Tanpa embel-embel", + "pricing.trial.terms.noCreditCard" : "Tidak memerlukan kartu kredit", "service.crashHandler.action" : "Muat Ulang {name}", "service.crashHandler.autoReload" : "Mencoba memulihkan {name} secara otomatis dalam {seconds} detik", "service.crashHandler.headline" : "Ya Ampun!", @@ -161,11 +161,11 @@ "service.errorHandler.headline" : "Oh tidak!", "service.errorHandler.message" : "Kesalahan", "service.errorHandler.text" : "{name} gagal dimuat", - "service.restrictedHandler.action" : "Upgrade Account", - "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required", - "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.", - "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.", - "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.", + "service.restrictedHandler.action" : "Tingkatkan Akun", + "service.restrictedHandler.customUrl.headline" : "Diperlukan Paket Franz Professional", + "service.restrictedHandler.customUrl.text" : "Tingkatkan ke paket Franz Professional untuk menggunakan URL khusus dan layanan hosted mandiri.", + "service.restrictedHandler.serviceLimit.headline" : "Anda telah mencapai batas kota layanan.", + "service.restrictedHandler.serviceLimit.text" : "Tingkatkan akun Anda untuk menggunakan lebih dari {count} layanan.", "service.webviewLoader.loading" : "Memuat", "services.getStarted" : "Memulai", "services.welcome" : "Selamat datang di Franz", @@ -183,19 +183,19 @@ "settings.account.headlinePassword" : "Ubah sandi", "settings.account.headlineProfile" : "Perbarui profil", "settings.account.headlineSubscription" : "Langganan Anda", - "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial", - "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience", + "settings.account.headlineTrialUpgrade" : "Dapatkan Uji Coba Gratis 14 Hari Franz Professional", + "settings.account.headlineUpgradeAccount" : "Tingkatkan akun Anda dan dapatkan pengalaman Franz lengkap", "settings.account.invoiceDownload" : "Unduh", "settings.account.manageSubscription.label" : "Kelola langganan Anda", "settings.account.successInfo" : "Perubahan Anda telah disimpan", - "settings.account.trial" : "Free Trial", - "settings.account.trialEndsIn" : "Your free trial ends in {duration}.", - "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.", + "settings.account.trial" : "Uji Coba Gratis", + "settings.account.trialEndsIn" : "Uji coba gratis Anda berakhir dalam {duration}.", + "settings.account.trialUpdateBillingInfo" : "Perbarui informasi penagihan Anda untuk melanjutkan menggunakan {license} setelah uji coba Anda berakhir.", "settings.account.tryReloadServices" : "Coba lagi", "settings.account.tryReloadUserInfoRequest" : "Coba lagi", - "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional", + "settings.account.upgradeToPro.label" : "Tingkatkan ke Franz Professional", "settings.account.userInfoRequestFailed" : "Gagal memuat informasi pengguna", - "settings.account.yourLicense" : "Your Franz License", + "settings.account.yourLicense" : "Lisensi Franz Anda", "settings.app.buttonClearAllCache" : "Bersihkan singgahan", "settings.app.buttonInstallUpdate" : "Mulai ulang dan instal versi baru", "settings.app.buttonSearchForUpdate" : "Periksa pembaruan", @@ -208,8 +208,8 @@ "settings.app.form.enableGPUAcceleration" : "Aktifkan Akselerasi GPU", "settings.app.form.enableSpellchecking" : "Aktifkan pemeriksaan ejaan", "settings.app.form.enableSystemTray" : "Tampilkan Franz di baki sistem", - "settings.app.form.enableTodos" : "Enable Franz Todos", - "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded", + "settings.app.form.enableTodos" : "Aktifkan Franz Todos", + "settings.app.form.keepAllWorkspacesLoaded" : "Muat semua ruang kerja Anda", "settings.app.form.language" : "Bahasa", "settings.app.form.minimizeToSystemTray" : "Perkecil Franz ke baki sistem", "settings.app.form.runInBackground" : "Tetap jalankan Franz di latar belakang saat menutup jendela", @@ -238,13 +238,13 @@ "settings.navigation.yourServices" : "Layanan Anda", "settings.navigation.yourWorkspaces" : "Ruang kerja Anda", "settings.recipes.all" : "Semua layanan", - "settings.recipes.custom" : "Custom Services", - "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes", - "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes", - "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes", - "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:", - "settings.recipes.customService.openDevDocs" : "Developer Documentation", - "settings.recipes.customService.openFolder" : "Open folder", + "settings.recipes.custom" : "Layanan Khusus", + "settings.recipes.customService.headline.communityRecipes" : "Resep Komunitas Pihak Ketiga", + "settings.recipes.customService.headline.customRecipes" : "Resep Khusus Pihak Ketiga", + "settings.recipes.customService.headline.devRecipes" : "Resep Layanan Pengembangan Anda", + "settings.recipes.customService.intro" : "Untuk menambahkan layanan khusus, salin resep layanan ke:", + "settings.recipes.customService.openDevDocs" : "Dokumentasi Pengembang", + "settings.recipes.customService.openFolder" : "Buka folder", "settings.recipes.headline" : "Layanan tersedia", "settings.recipes.missingService" : "Layanan tidak tersedia?", "settings.recipes.mostPopular" : "Terpopuler", @@ -257,7 +257,7 @@ "settings.service.form.addServiceHeadline" : "Tambahkan {name}", "settings.service.form.availableServices" : "Layanan tersedia", "settings.service.form.customUrl" : "Server khusus", - "settings.service.form.customUrlPremiumInfo" : "Untuk menambahkan layanan hosted yang dijalankan mandiri, Anda membutuhkan Franz Premium Supporter Account.", + "settings.service.form.customUrlPremiumInfo" : "Untuk menambahkan layanan hosted mandiri, Anda membutuhkan Franz Premium Supporter Account.", "settings.service.form.customUrlUpgradeAccount" : "Tingkatkan akun Anda", "settings.service.form.customUrlValidationError" : "Gagal memvalidasi server {nama} khusus.", "settings.service.form.deleteButton" : "Hapus layanan", @@ -331,10 +331,10 @@ "settings.workspaces.workspaceFeatureInfo" : "Ruang Kerja Franz dapat digunakan untuk tetap fokus pada hal penting saat ini. Siapkan sekelompok layanan yang berbeda dan dengan mudah beralih ke yang lain. Anda yang memutuskan layanan mana yang Anda perlukan dan kapan, agar kami bisa membantu Anda tetap berada di garis depan - atau dengan mudah mengakhiri hari kerja kapan saja Anda inginkan.", "settings.workspaces.workspacesRequestFailed" : "Tidak dapat memuat ruang kerja Anda", "sidebar.addNewService" : "Tambahkan layanan baru", - "sidebar.closeTodosDrawer" : "Close Franz Todos", + "sidebar.closeTodosDrawer" : "Tutup Franz Todos", "sidebar.closeWorkspaceDrawer" : "Tutup laci ruang kerja", "sidebar.muteApp" : "Nonaktifkan pemberitahuan & audio", - "sidebar.openTodosDrawer" : "Open Franz Todos", + "sidebar.openTodosDrawer" : "Buka Franz Todos", "sidebar.openWorkspaceDrawer" : "Buka laci ruang kerja", "sidebar.settings" : "Pengaturan", "sidebar.unmuteApp" : "Aktifkan pemberitahuan", @@ -349,12 +349,12 @@ "signup.link.login" : "Sudah punya akun, masuk?", "signup.password.label" : "Sandi", "signup.submit.label" : "Buat akun", - "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial", - "subscription.cta.allOptions" : "See all options", - "subscription.cta.choosePlan" : "Choose your plan", - "subscription.includedProFeatures" : "The Franz Professional Plan includes:", - "subscription.teaser.includedFeatures" : "Paid Franz Plans include:", - "subscription.teaser.intro" : "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!", + "subscription.cta.activateTrial" : "Ya, mulai uji coba gratis Franz Professional", + "subscription.cta.allOptions" : "Lihat semua opsi", + "subscription.cta.choosePlan" : "Pilih paket Anda", + "subscription.includedProFeatures" : "Paket Franz Professional menyertakan:", + "subscription.teaser.includedFeatures" : "Paket Franz Berbayar mencakup:", + "subscription.teaser.intro" : "Franz 5 menyertakan berbagai macan fitur baru untuk mempercanggih komunikasi sehari-hari. Lihat paket baru kami dan temukan yang cocok untuk Anda!", "subscriptionPopup.buttonCancel" : "Batalkan", "subscriptionPopup.buttonDone" : "Selesai", "tabs.item.deleteService" : "Hapus layanan", @@ -371,10 +371,10 @@ "validation.oneRequired" : "Setidaknya diperlukan satu", "validation.required" : "{field} wajib diisi", "validation.url" : "{field} bukan URL yang benar", - "webControls.back" : "Back", - "webControls.forward" : "Forward", - "webControls.goHome" : "Home", - "webControls.openInBrowser" : "Open in Browser", + "webControls.back" : "Mundur", + "webControls.forward" : "Maju", + "webControls.goHome" : "Beranda", + "webControls.openInBrowser" : "Buka di Browser", "webControls.reload" : "Muat Ulang", "welcome.loginButton" : "Masuk ke akun Anda", "welcome.signupButton" : "Buat akun gratis", -- cgit v1.2.3-54-g00ecf From 7f11dff0588c975bf8dec6c98799ba7f92a5a9cc Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 8 Oct 2019 19:35:27 +0200 Subject: fix(Services): Restore services after 10 minutes system suspension --- src/stores/AppStore.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index 0398b7533..87a661b2a 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -27,7 +27,9 @@ import { sleep } from '../helpers/async-helpers'; const debug = require('debug')('Franz:AppStore'); -const { app, systemPreferences, screen } = remote; +const { + app, systemPreferences, screen, powerMonitor, +} = remote; const mainWindow = remote.getCurrentWindow(); @@ -55,6 +57,8 @@ export default class AppStore extends Store { @observable isOnline = navigator.onLine; + @observable timeSuspensionStart; + @observable timeOfflineStart; @observable updateStatus = null; @@ -180,6 +184,27 @@ export default class AppStore extends Store { gaPage(pathname); }); + powerMonitor.on('suspend', () => { + debug('System suspended starting timer'); + + this.timeSuspensionStart = moment(); + }); + + powerMonitor.on('resume', () => { + debug('System resumed, last suspended on', this.timeSuspensionStart.toString()); + + if (this.timeSuspensionStart.add(10, 'm').isBefore(moment())) { + debug('Reloading services, user info and features'); + + this.actions.service.reloadAll(); + + this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); + this.stores.features.featuresRequest.invalidate({ immediately: true }); + + statsEvent('resumed-app'); + } + }); + statsEvent('app-start'); } -- cgit v1.2.3-54-g00ecf From 9e539a8be8368ed5f44cfd8e92e66afc06140cb5 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 8 Oct 2019 19:35:29 +0200 Subject: remove external url event --- src/stores/AppStore.js | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index 87a661b2a..4a00cb294 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -304,8 +304,6 @@ export default class AppStore extends Store { if (isValidExternalURL(url)) { shell.openExternal(url); } - - gaEvent('External URL', 'open', parsedUrl.host); } @action _checkForUpdates() { -- cgit v1.2.3-54-g00ecf From e037b740972e6930d3e6693207db6af094e5813d Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 8 Oct 2019 23:44:15 +0200 Subject: Add macOS catalina notifications hack --- src/stores/AppStore.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src') diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index 4a00cb294..f102fc370 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -38,6 +38,8 @@ const autoLauncher = new AutoLaunch({ name: 'Franz', }); +const CATALINA_NOTIFICATION_HACK_KEY = '_temp_askedForCatalinaNotificationPermissions'; + export default class AppStore extends Store { updateStatusTypes = { CHECKING: 'CHECKING', @@ -205,6 +207,18 @@ export default class AppStore extends Store { } }); + // macOS catalina notifications hack + // notifications got stuck after upgrade but forcing a notification + // via `new Notification` triggered the permission request + if (isMac && !localStorage.getItem(CATALINA_NOTIFICATION_HACK_KEY)) { + // eslint-disable-next-line no-new + new window.Notification('Welcome to Franz 5', { + body: 'Have a wonderful day & happy messaging.', + }); + + localStorage.setItem(CATALINA_NOTIFICATION_HACK_KEY, true); + } + statsEvent('app-start'); } -- cgit v1.2.3-54-g00ecf From 6a1676cb9f4765185d388656f5350ca664a42bef Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 9 Oct 2019 10:12:20 +0200 Subject: only use window.open when url exists --- src/webview/recipe.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/webview/recipe.js b/src/webview/recipe.js index e3e13b726..027d22c0a 100644 --- a/src/webview/recipe.js +++ b/src/webview/recipe.js @@ -207,7 +207,9 @@ window.open = (url, frameName, features) => { return ipcRenderer.sendToHost('new-window', url); } - return originalWindowOpen(url, frameName, features); + if (url) { + return originalWindowOpen(url, frameName, features); + } }; if (isDevMode) { -- cgit v1.2.3-54-g00ecf From 69f0a063fd64ee10984f1c7ed0b6fa0cd26bbf5c Mon Sep 17 00:00:00 2001 From: FranzBot Date: Wed, 9 Oct 2019 12:00:21 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/fr.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 5ba652004..7bfa523f1 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -9,7 +9,7 @@ "feature.delayApp.trial.headline" : "Obtenir l'essai gratuit de 14 jours pour Franz Professionnel et éviter la file d'attente", "feature.delayApp.upgrade.action" : "Acheter une license Franz", "feature.delayApp.upgrade.actionShort" : "Augmenter le niveau de mon compte", - "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", + "feature.serviceLimit.limitReached" : "Vous avez ajouté {amount} services sur les {limit} qui sont inclus dans votre offre. Veuillez améliorer votre compte pour ajouter plus de services.", "feature.shareFranz.action.email" : "Envoyer par mail", "feature.shareFranz.action.facebook" : "Partager sur Facebook", "feature.shareFranz.action.twitter" : "Partager sur Twitter", @@ -17,9 +17,9 @@ "feature.shareFranz.shareText.email" : "J'ai ajouté {count} services sur Franz ! Télécharger l'appli gratuite pour WhatsApp, Messenger, Skype et autres sur www.meetfranz.com", "feature.shareFranz.shareText.twitter" : "J'ai ajouté {count} services à Franz! Télécharge l'application gratuite pour WhatsApp, Messenger, Slack, Skype et autres sur www.meetfranz.com \/cc @FranzMessenger", "feature.shareFranz.text" : "Dites à vos amis et collègues a quel point Franz est super et aidez nous à faire passer le mot.", - "feature.todos.premium.info" : "Franz Todos are available to premium users now!", - "feature.todos.premium.rollout" : "Everyone else will have to wait a little longer.", - "feature.todos.premium.upgrade" : "Upgrade Account", + "feature.todos.premium.info" : "Franz Todos est maintenant disponible pour les utilisateurs premium !", + "feature.todos.premium.rollout" : "Tous les autres doivent encore attendre un peu.", + "feature.todos.premium.upgrade" : "Améliorer son Compte", "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz", "global.franzProRequired" : "Un abonnement Franz Professionnel est requis", "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.", @@ -27,7 +27,7 @@ "global.spellchecking.autodetect" : "Detecter automatiquement la langue", "global.spellchecking.autodetect.short" : "Automatiquement", "global.spellchecking.language" : "Langue de la vérification orthographique", - "global.upgradeButton.upgradeToPro" : "Upgrade to Franz Professional", + "global.upgradeButton.upgradeToPro" : "Passer à Franz Professional", "import.headline" : "Importez vos services depuis la version 4 de Franz.", "import.notSupportedHeadline" : "Ces services ne sont pas encore supportés par la version 5 de Franz", "import.skip.label" : "Je veux ajouter des services manuellement", @@ -37,7 +37,7 @@ "infobar.buttonReloadServices" : "Recharger les services", "infobar.requiredRequestsFailed" : "Impossible d'accéder aux services et informations de l'utilisateur", "infobar.servicesUpdated" : "Vos services ont été mis à jour.", - "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!", + "infobar.trialActivated" : "Votre essai a été activé avec succès. Bon tchat !", "infobar.updateAvailable" : "Une nouvelle mise à jour de Franz est disponible.", "invite.email.label" : "Adresse Email", "invite.headline.friends" : "Invitez 3 amis ou collègues", @@ -54,8 +54,8 @@ "login.serverLogout" : "Votre session a expiré. Reconnectez-vous s'il vous plaît.", "login.submit.label" : "Se connecter", "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.", - "menu.Todoss.closeTodosDrawer" : "Close Todos drawer", - "menu.Todoss.openTodosDrawer" : "Open Todos drawer", + "menu.Todoss.closeTodosDrawer" : "Fermer Todos", + "menu.Todoss.openTodosDrawer" : "Ouvrir Todos", "menu.app.about" : "À propos de Franz", "menu.app.announcement" : "Quoi de neuf ? ", "menu.app.checkForUpdates" : "Vérifier les mises à jour", @@ -82,8 +82,8 @@ "menu.help" : "Aide", "menu.help.changelog" : "Liste des modifications", "menu.help.debugInfo" : "Copier les information de débogage", - "menu.help.debugInfoCopiedBody" : "Your Debug Information has been copied to your clipboard.", - "menu.help.debugInfoCopiedHeadline" : "Franz Debug Information", + "menu.help.debugInfoCopiedBody" : "Vos informations de débogage ont été copiées dans le presse-papier.", + "menu.help.debugInfoCopiedHeadline" : "Information de débogage", "menu.help.learnMore" : "En savoir plus", "menu.help.privacy" : "Déclaration de confidentialité", "menu.help.support" : "Assistance", @@ -91,10 +91,10 @@ "menu.services" : "Services", "menu.services.activatePreviousService" : "Activer le service précédent", "menu.services.addNewService" : "Ajouter un nouveau service...", - "menu.services.goHome" : "Home", + "menu.services.goHome" : "Accueil", "menu.services.setNextServiceActive" : "Activer le service suivant", - "menu.todos" : "Todos", - "menu.todos.enableTodos" : "Enable Todos", + "menu.todos" : "Tâches", + "menu.todos.enableTodos" : "Activers les Tâches", "menu.view" : "Aperçu", "menu.view.enterFullScreen" : "Entrer en mode plein écran", "menu.view.exitFullScreen" : "Sortir du mode plein écran", @@ -161,7 +161,7 @@ "service.errorHandler.headline" : "Oh non !", "service.errorHandler.message" : "Erreur", "service.errorHandler.text" : "Le chargement de {name} a échoué.", - "service.restrictedHandler.action" : "Upgrade Account", + "service.restrictedHandler.action" : "Améliorer son Compte", "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required", "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.", "service.restrictedHandler.serviceLimit.headline" : "Vous avez atteint votre limite de services.", @@ -193,7 +193,7 @@ "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.", "settings.account.tryReloadServices" : "Réessayer", "settings.account.tryReloadUserInfoRequest" : "Réessayer", - "settings.account.upgradeToPro.label" : "Upgrade to Franz Professional", + "settings.account.upgradeToPro.label" : "Passer à Franz Professional", "settings.account.userInfoRequestFailed" : "Impossible de charger les informations de l'utilisateur", "settings.account.yourLicense" : "Your Franz License", "settings.app.buttonClearAllCache" : "Vider le cache", @@ -373,7 +373,7 @@ "validation.url" : "{field} n'est pas une URL valide", "webControls.back" : "Back", "webControls.forward" : "Forward", - "webControls.goHome" : "Home", + "webControls.goHome" : "Accueil", "webControls.openInBrowser" : "Open in Browser", "webControls.reload" : "Reload", "welcome.loginButton" : "Se connecter sur son compte", -- cgit v1.2.3-54-g00ecf From 106174c56df9dee1647a9e14d0ffdee7336737b0 Mon Sep 17 00:00:00 2001 From: FranzBot Date: Fri, 11 Oct 2019 00:00:21 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/pt-BR.json | 64 ++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json index dfdaaa1ee..df5404ccf 100644 --- a/src/i18n/locales/pt-BR.json +++ b/src/i18n/locales/pt-BR.json @@ -6,7 +6,7 @@ "feature.delayApp.text" : "Franz continuará em {seconds} segundos.", "feature.delayApp.trial.action" : "Sim, eu quero o período de testes gratuito de 14 dias do Franz Professional", "feature.delayApp.trial.actionShort" : "Ativar período de testes gratuito do Franz Professional", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", + "feature.delayApp.trial.headline" : "Teste o Franz Professional por 14 dias grátis e fure a fila.", "feature.delayApp.upgrade.action" : "Adquira uma licença de suporte Franz", "feature.delayApp.upgrade.actionShort" : "Atualizar conta", "feature.serviceLimit.limitReached" : "Você adicionou {amount} serviços de um total de {limit} que estão inclusos no seu plano. Por favor, atualize sua conta para adicionar mais serviços.", @@ -19,9 +19,9 @@ "feature.shareFranz.text" : "Conte aos seus amigos e colegas o quanto incrível o Franz é e nos ajude a espalhar a mensagem. ", "feature.todos.premium.info" : "As Listas de Tarefa do Franz estão disponíveis para usuários premium!", "feature.todos.premium.rollout" : "As outras pessoas terão que esperar um pouquinho mais.", - "feature.todos.premium.upgrade" : "Upgrade Account", + "feature.todos.premium.upgrade" : "Melhore sua conta", "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.", - "global.franzProRequired" : "Franz Professional Required", + "global.franzProRequired" : "Franz Profissional necessário", "global.notConnectedToTheInternet" : "Você não está conectado à internet", "global.spellchecker.useDefault" : "Use o padrão do sistema ({default})", "global.spellchecking.autodetect" : "Detectar idioma automaticamente.", @@ -91,10 +91,10 @@ "menu.services" : "Serviços", "menu.services.activatePreviousService" : "Pular para serviço anterior", "menu.services.addNewService" : "Adicionar Novo Serviço", - "menu.services.goHome" : "Home", + "menu.services.goHome" : "Inicio", "menu.services.setNextServiceActive" : "Pular para próximo serviço", - "menu.todos" : "Todos", - "menu.todos.enableTodos" : "Enable Todos", + "menu.todos" : "A fazer", + "menu.todos.enableTodos" : "Habilitar logs", "menu.view" : "Visualizar ", "menu.view.enterFullScreen" : "Modo Tela Cheia", "menu.view.exitFullScreen" : "Sair da Tela Cheia", @@ -123,15 +123,15 @@ "password.submit.label" : "Enviar", "password.successInfo" : "Por favor, verifique o seu e-mail", "premiumFeature.button.upgradeAccount" : "Atualizar conta", - "pricing.features.adFree" : "Forever ad-free", + "pricing.features.adFree" : "Pra sempre sem propagandas", "pricing.features.appDelays" : "Sem Telas de Espera", "pricing.features.customWebsites" : "Adicionar Websites Personalizados", "pricing.features.onPremise" : "On-premise & other Hosted Services", "pricing.features.serviceProxies" : "Service Proxies", "pricing.features.spellchecker" : "Spellchecker support", "pricing.features.teamManagement" : "Gestão de Time", - "pricing.features.thirdPartyServices" : "Install 3rd party services", - "pricing.features.unlimitedServices" : "Add unlimited services", + "pricing.features.thirdPartyServices" : "Instalar serviços de terceiros", + "pricing.features.unlimitedServices" : "Adicione ilimitados serviços", "pricing.features.workspaces" : "Áreas de Trabalho", "pricing.plan.free" : "Franz Gratuito", "pricing.plan.legacy" : "Franz Premium", @@ -149,7 +149,7 @@ "pricing.trial.subheadline" : "Sua oferta pessoal de boas-vindas:", "pricing.trial.terms.automaticTrialEnd" : "Seu período de testes encerra automaticamente em 14 dias", "pricing.trial.terms.headline" : "Sem vínculos", - "pricing.trial.terms.noCreditCard" : "No credit card required", + "pricing.trial.terms.noCreditCard" : "Cartão de crédito não exigido", "service.crashHandler.action" : "Recarregar {name}", "service.crashHandler.autoReload" : "Tentando reestabelecer {name} automaticamente em {seconds} segundos", "service.crashHandler.headline" : "Ah, não!", @@ -161,11 +161,11 @@ "service.errorHandler.headline" : "Ah, não!", "service.errorHandler.message" : "Erro", "service.errorHandler.text" : "{name} não pôde ser carregado.", - "service.restrictedHandler.action" : "Upgrade Account", - "service.restrictedHandler.customUrl.headline" : "Franz Professional Plan required", - "service.restrictedHandler.customUrl.text" : "Please upgrade to the Franz Professional plan to use custom urls & self hosted services.", - "service.restrictedHandler.serviceLimit.headline" : "You have reached your service limit.", - "service.restrictedHandler.serviceLimit.text" : "Please upgrade your account to use more than {count} services.", + "service.restrictedHandler.action" : "Melhorar sua conta", + "service.restrictedHandler.customUrl.headline" : "Franz Professional exigido", + "service.restrictedHandler.customUrl.text" : "Por favor, atualize para o Franz Professional para usar urls customizadas e serviços próprios", + "service.restrictedHandler.serviceLimit.headline" : "Você atingiu seu limite de serviço", + "service.restrictedHandler.serviceLimit.text" : "Por favor, atualize sua conta para usar mais do que {count} serviços", "service.webviewLoader.loading" : "Carregando", "services.getStarted" : "Iniciar", "services.welcome" : "Bem-vindo ao Franz!", @@ -183,19 +183,19 @@ "settings.account.headlinePassword" : "Mudar senha", "settings.account.headlineProfile" : "Atualizar perfil", "settings.account.headlineSubscription" : "Sua assinatura", - "settings.account.headlineTrialUpgrade" : "Get the free 14 day Franz Professional Trial", - "settings.account.headlineUpgradeAccount" : "Upgrade your account & get the full Franz experience", + "settings.account.headlineTrialUpgrade" : "Teste o Franz Professional por 14 dias de graça.", + "settings.account.headlineUpgradeAccount" : "Dê um upgrade na sua conta e tenha uma completa experiência do Franz", "settings.account.invoiceDownload" : "Baixar", "settings.account.manageSubscription.label" : "Gerencie a sua assinatura", "settings.account.successInfo" : "Suas alterações foram gravadas", - "settings.account.trial" : "Free Trial", - "settings.account.trialEndsIn" : "Your free trial ends in {duration}.", - "settings.account.trialUpdateBillingInfo" : "Please update your billing info to continue using {license} after your trial period.", + "settings.account.trial" : "Teste grátis", + "settings.account.trialEndsIn" : "Seu teste grátis acaba em {duration}", + "settings.account.trialUpdateBillingInfo" : "Por favor, atualize suas informações de compra para continuar usando {license} depois do período de teste grátis", "settings.account.tryReloadServices" : "Tente novamente", "settings.account.tryReloadUserInfoRequest" : "Tentar novamente", - "settings.account.upgradeToPro.label" : "Atualizar para o Franz Profissional", + "settings.account.upgradeToPro.label" : "Upgrade para o Franz Professional", "settings.account.userInfoRequestFailed" : "Não foi possível carregar as informações do usuário", - "settings.account.yourLicense" : "Your Franz License", + "settings.account.yourLicense" : "Sua lincença do Franz", "settings.app.buttonClearAllCache" : "Limpar cache", "settings.app.buttonInstallUpdate" : "Reiniciar e instalar atualização", "settings.app.buttonSearchForUpdate" : "Verificar por atualizações", @@ -209,7 +209,7 @@ "settings.app.form.enableSpellchecking" : "Ativar correção ortográfica", "settings.app.form.enableSystemTray" : "Exibir o Franz na barra de sistema", "settings.app.form.enableTodos" : "Enable Franz Todos", - "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded", + "settings.app.form.keepAllWorkspacesLoaded" : "Matenha todos os workspaces carregados", "settings.app.form.language" : "Idioma", "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a área de sistema", "settings.app.form.runInBackground" : "Manter o Franz no fundo quando fechar a janela", @@ -238,13 +238,13 @@ "settings.navigation.yourServices" : "Seus serviços", "settings.navigation.yourWorkspaces" : "Suas áreas de trabalho", "settings.recipes.all" : "Todos os serviços", - "settings.recipes.custom" : "Custom Services", + "settings.recipes.custom" : "Serviços customizados", "settings.recipes.customService.headline.communityRecipes" : "Community 3rd Party Recipes", "settings.recipes.customService.headline.customRecipes" : "Custom 3rd Party Recipes", "settings.recipes.customService.headline.devRecipes" : "Your Development Service Recipes", "settings.recipes.customService.intro" : "To add a custom service, copy the service recipe to:", - "settings.recipes.customService.openDevDocs" : "Developer Documentation", - "settings.recipes.customService.openFolder" : "Open folder", + "settings.recipes.customService.openDevDocs" : "Documentação do desenvolvedor", + "settings.recipes.customService.openFolder" : "Abrir pasta", "settings.recipes.headline" : "Serviços disponíveis", "settings.recipes.missingService" : "Sentiu falta de algum serviço?", "settings.recipes.mostPopular" : "Mais populares", @@ -350,9 +350,9 @@ "signup.password.label" : "Senha", "signup.submit.label" : "Criar uma conta", "subscription.cta.activateTrial" : "Yes, start the free Franz Professional trial", - "subscription.cta.allOptions" : "See all options", - "subscription.cta.choosePlan" : "Choose your plan", - "subscription.includedProFeatures" : "The Franz Professional Plan includes:", + "subscription.cta.allOptions" : "Ver todas as opções", + "subscription.cta.choosePlan" : "Escolha seu plano", + "subscription.includedProFeatures" : "O Franz Professional inclui:", "subscription.teaser.includedFeatures" : "Paid Franz Plans include:", "subscription.teaser.intro" : "O Franz 5 vem com uma variedade de novas funcionalidades para melhorar a sua comunicação diária - pilhas inclusas. Confira os nossos novos planos e encontre aquele que melhor serve para você!", "subscriptionPopup.buttonCancel" : "Cancelar", @@ -371,10 +371,10 @@ "validation.oneRequired" : "Necessário pelo menos um", "validation.required" : "{campo} obrigatório", "validation.url" : "{campo} essa URL não é válida", - "webControls.back" : "Back", - "webControls.forward" : "Forward", + "webControls.back" : "Voltar", + "webControls.forward" : "Avançar", "webControls.goHome" : "Home", - "webControls.openInBrowser" : "Open in Browser", + "webControls.openInBrowser" : "Abrir no navegador", "webControls.reload" : "Recarregar", "welcome.loginButton" : "Entrar na sua conta", "welcome.signupButton" : "Criar uma conta grátis", -- cgit v1.2.3-54-g00ecf From 65b0912c4595b0b3cfad0f1d19255f70ba2bc48a Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Mon, 14 Oct 2019 13:59:48 +0200 Subject: Move checkout to in app instead of external handling --- .../settings/account/AccountDashboard.js | 6 +++- src/components/subscription/SubscriptionPopup.js | 2 ++ src/containers/settings/AccountScreen.js | 5 +++- .../subscription/SubscriptionFormScreen.js | 32 ++++++++++++++++++++-- src/styles/subscription-popup.scss | 5 +++- 5 files changed, 45 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js index ac2594604..08e86fda6 100644 --- a/src/components/settings/account/AccountDashboard.js +++ b/src/components/settings/account/AccountDashboard.js @@ -109,6 +109,7 @@ class AccountDashboard extends Component { openBilling: PropTypes.func.isRequired, upgradeToPro: PropTypes.func.isRequired, openInvoices: PropTypes.func.isRequired, + onCloseSubscriptionWindow: PropTypes.func.isRequired, }; static contextTypes = { @@ -130,6 +131,7 @@ class AccountDashboard extends Component { openBilling, upgradeToPro, openInvoices, + onCloseSubscriptionWindow, } = this.props; const { intl } = this.context; @@ -263,7 +265,9 @@ class AccountDashboard extends Component { {!user.isPremium && (
- +
)} diff --git a/src/components/subscription/SubscriptionPopup.js b/src/components/subscription/SubscriptionPopup.js index 12ef8a6e9..12a51ad7b 100644 --- a/src/components/subscription/SubscriptionPopup.js +++ b/src/components/subscription/SubscriptionPopup.js @@ -59,8 +59,10 @@ export default @observer class SubscriptionPopup extends Component { className="subscription-popup__webview" autosize + allowpopups src={encodeURI(url)} onDidNavigate={completeCheck} + onDidNavigateInPage={completeCheck} />
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js index 9c74cf2ab..b0354c86b 100644 --- a/src/containers/settings/AccountScreen.js +++ b/src/containers/settings/AccountScreen.js @@ -5,6 +5,7 @@ import { inject, observer } from 'mobx-react'; import PaymentStore from '../../stores/PaymentStore'; import UserStore from '../../stores/UserStore'; import AppStore from '../../stores/AppStore'; +import FeaturesStore from '../../stores/FeaturesStore'; import AccountDashboard from '../../components/settings/account/AccountDashboard'; import ErrorBoundary from '../../components/util/ErrorBoundary'; @@ -12,8 +13,9 @@ import { WEBSITE } from '../../environment'; export default @inject('stores', 'actions') @observer class AccountScreen extends Component { onCloseWindow() { - const { user } = this.props.stores; + const { user, features } = this.props.stores; user.getUserInfoRequest.invalidate({ immediately: true }); + features.featuresRequest.invalidate({ immediately: true }); } reloadData() { @@ -65,6 +67,7 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend AccountScreen.wrappedComponent.propTypes = { stores: PropTypes.shape({ user: PropTypes.instanceOf(UserStore).isRequired, + features: PropTypes.instanceOf(FeaturesStore).isRequired, payment: PropTypes.instanceOf(PaymentStore).isRequired, app: PropTypes.instanceOf(AppStore).isRequired, }).isRequired, diff --git a/src/containers/subscription/SubscriptionFormScreen.js b/src/containers/subscription/SubscriptionFormScreen.js index 726b10628..38e46a7ba 100644 --- a/src/containers/subscription/SubscriptionFormScreen.js +++ b/src/containers/subscription/SubscriptionFormScreen.js @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import { remote } from 'electron'; import PropTypes from 'prop-types'; import { inject, observer } from 'mobx-react'; @@ -7,11 +8,21 @@ import PaymentStore from '../../stores/PaymentStore'; import SubscriptionForm from '../../components/subscription/SubscriptionForm'; import TrialForm from '../../components/subscription/TrialForm'; +const { BrowserWindow } = remote; + export default @inject('stores', 'actions') @observer class SubscriptionFormScreen extends Component { + static propTypes = { + onCloseWindow: PropTypes.func, + } + + static defaultProps = { + onCloseWindow: () => null, + } + async openBrowser() { const { - actions, stores, + onCloseWindow, } = this.props; const { @@ -22,7 +33,24 @@ export default @inject('stores', 'actions') @observer class SubscriptionFormScre let hostedPageURL = features.features.planSelectionURL; hostedPageURL = user.getAuthURL(hostedPageURL); - actions.app.openExternalUrl({ url: hostedPageURL }); + const paymentWindow = new BrowserWindow({ + parent: remote.getCurrentWindow(), + modal: true, + title: '🔒 Franz Supporter License', + width: 800, + height: window.innerHeight - 100, + maxWidth: 800, + minWidth: 600, + webPreferences: { + nodeIntegration: true, + webviewTag: true, + }, + }); + paymentWindow.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPageURL)}`); + + paymentWindow.on('closed', () => { + onCloseWindow(); + }); } render() { diff --git a/src/styles/subscription-popup.scss b/src/styles/subscription-popup.scss index fb4795d6c..14e05e65d 100644 --- a/src/styles/subscription-popup.scss +++ b/src/styles/subscription-popup.scss @@ -2,7 +2,10 @@ height: 100%; &__content { height: calc(100% - 60px); } - &__webview { height: 100%; } + &__webview { + height: 100%; + background: #FFF; + } &__toolbar { background: $theme-gray-lightest; -- cgit v1.2.3-54-g00ecf From 7d365619170852b328252220c9d5ac1cf8980f81 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Mon, 14 Oct 2019 15:19:40 +0200 Subject: Optimize button width --- src/components/subscription/SubscriptionForm.js | 4 ++-- src/components/subscription/TrialForm.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/components/subscription/SubscriptionForm.js b/src/components/subscription/SubscriptionForm.js index cdfbbe60d..5f268a322 100644 --- a/src/components/subscription/SubscriptionForm.js +++ b/src/components/subscription/SubscriptionForm.js @@ -30,7 +30,8 @@ const messages = defineMessages({ const styles = () => ({ activateTrialButton: { - margin: [40, 0, 50], + margin: [40, 'auto', 50], + display: 'flex', }, }); @@ -62,7 +63,6 @@ export default @observer @injectSheet(styles) class SubscriptionForm extends Com className={classes.activateTrialButton} busy={isActivatingTrial} onClick={selectPlan} - stretch />

diff --git a/src/components/subscription/TrialForm.js b/src/components/subscription/TrialForm.js index 9ed548f16..f3f3458f3 100644 --- a/src/components/subscription/TrialForm.js +++ b/src/components/subscription/TrialForm.js @@ -43,7 +43,8 @@ const messages = defineMessages({ const styles = theme => ({ activateTrialButton: { - margin: [40, 0, 10], + margin: [40, 'auto', 10], + display: 'flex', }, allOptionsButton: { margin: [0, 0, 40], @@ -93,7 +94,6 @@ export default @observer @injectSheet(styles) class TrialForm extends Component className={classes.activateTrialButton} busy={isActivatingTrial} onClick={activateTrial} - stretch />

diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index 200777ae6..fe81b1911 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -19,6 +19,7 @@ import { workspaceStore } from '../../features/workspaces'; import AppUpdateInfoBar from '../AppUpdateInfoBar'; import TrialActivationInfoBar from '../TrialActivationInfoBar'; import Todos from '../../features/todos/containers/TodosScreen'; +import PlanSelection from '../../features/planSelection/containers/PlanSelectionScreen'; function createMarkup(HTMLString) { return { __html: HTMLString }; @@ -176,6 +177,7 @@ class AppLayout extends Component {
+ ); diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js index 08e86fda6..9a1b31d0f 100644 --- a/src/components/settings/account/AccountDashboard.js +++ b/src/components/settings/account/AccountDashboard.js @@ -217,7 +217,8 @@ class AccountDashboard extends Component { {intl.formatMessage(messages.yourLicense)}

- {isPremiumOverrideUser ? 'Franz Premium' : planName} + Franz + {isPremiumOverrideUser ? 'Premium' : planName} {user.team.isTrial && ( <> {' – '} diff --git a/src/components/ui/FeatureItem.js b/src/components/ui/FeatureItem.js index 7c482c4d4..4926df470 100644 --- a/src/components/ui/FeatureItem.js +++ b/src/components/ui/FeatureItem.js @@ -10,6 +10,7 @@ const styles = theme => ({ padding: [8, 0], display: 'flex', alignItems: 'center', + textAlign: 'left', }, featureIcon: { fill: theme.brandSuccess, diff --git a/src/components/ui/FeatureList.js b/src/components/ui/FeatureList.js index 62944ad75..732b40e40 100644 --- a/src/components/ui/FeatureList.js +++ b/src/components/ui/FeatureList.js @@ -3,12 +3,33 @@ import PropTypes from 'prop-types'; import { defineMessages, intlShape } from 'react-intl'; import { FeatureItem } from './FeatureItem'; +import { PLANS } from '../../config'; const messages = defineMessages({ + availableRecipes: { + id: 'pricing.features.recipes', + defaultMessage: '!!!Choose from more than 70 Services', + }, + accountSync: { + id: 'pricing.features.accountSync', + defaultMessage: '!!!Account Synchronisation', + }, + desktopNotifications: { + id: 'pricing.features.desktopNotifications', + defaultMessage: '!!!Desktop Notifications', + }, unlimitedServices: { id: 'pricing.features.unlimitedServices', defaultMessage: '!!!Add unlimited services', }, + upToThreeServices: { + id: 'pricing.features.upToThreeServices', + defaultMessage: '!!!Add up to 3 services', + }, + upToSixServices: { + id: 'pricing.features.upToSixServices', + defaultMessage: '!!!Add up to 6 services', + }, spellchecker: { id: 'pricing.features.spellchecker', defaultMessage: '!!!Spellchecker support', @@ -51,6 +72,7 @@ export class FeatureList extends Component { static propTypes = { className: PropTypes.string, featureClassName: PropTypes.string, + plan: PropTypes.oneOf(PLANS).isRequired, }; static defaultProps = { @@ -66,21 +88,52 @@ export class FeatureList extends Component { const { className, featureClassName, + plan, } = this.props; const { intl } = this.context; + const features = []; + if (plan === PLANS.FREE) { + features.push( + messages.upToThreeServices, + messages.availableRecipes, + messages.accountSync, + messages.desktopNotifications, + ); + } else if (plan === PLANS.PERSONAL) { + features.push( + messages.upToSixServices, + messages.spellchecker, + messages.appDelays, + messages.adFree, + ); + } else if (plan === PLANS.PRO) { + features.push( + messages.unlimitedServices, + messages.workspaces, + messages.customWebsites, + // messages.onPremise, + messages.thirdPartyServices, + // messages.serviceProxies, + ); + } else { + features.push( + messages.unlimitedServices, + messages.spellchecker, + messages.workspaces, + messages.customWebsites, + messages.onPremise, + messages.thirdPartyServices, + messages.serviceProxies, + messages.teamManagement, + messages.appDelays, + messages.adFree, + ); + } + return (

    - - - - - - - - - - + {features.map(feature => )}
); } diff --git a/src/config.js b/src/config.js index 78a92d948..11e6cb91f 100644 --- a/src/config.js +++ b/src/config.js @@ -91,10 +91,10 @@ export const ALLOWED_PROTOCOLS = [ ]; export const PLANS = { - PERSONAL: 'PERSONAL', - PRO: 'PRO', - LEGACY: 'LEGACY', - FREE: 'FREE', + PERSONAL: 'personal', + PRO: 'pro', + LEGACY: 'legacy', + FREE: 'free', }; export const PLANS_MAPPING = { diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js index af1651931..8e0ded16a 100644 --- a/src/containers/auth/PricingScreen.js +++ b/src/containers/auth/PricingScreen.js @@ -38,7 +38,7 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend } = this.props; const { getUserInfoRequest, activateTrialRequest } = stores.user; - const { featuresRequest } = stores.features; + const { featuresRequest, features } = stores.features; return ( ); diff --git a/src/features/planSelection/actions.js b/src/features/planSelection/actions.js new file mode 100644 index 000000000..21aa38ace --- /dev/null +++ b/src/features/planSelection/actions.js @@ -0,0 +1,13 @@ +import PropTypes from 'prop-types'; +import { createActionsFromDefinitions } from '../../actions/lib/actions'; + +export const planSelectionActions = createActionsFromDefinitions({ + upgradeAccount: { + planId: PropTypes.string.isRequired, + onCloseWindow: PropTypes.func.isRequired, + }, + downgradeAccount: {}, + hideOverlay: {}, +}, PropTypes.checkPropTypes); + +export default planSelectionActions; diff --git a/src/features/planSelection/api.js b/src/features/planSelection/api.js new file mode 100644 index 000000000..734643f10 --- /dev/null +++ b/src/features/planSelection/api.js @@ -0,0 +1,26 @@ +import { sendAuthRequest } from '../../api/utils/auth'; +import { API, API_VERSION } from '../../environment'; +import Request from '../../stores/lib/Request'; + +const debug = require('debug')('Franz:feature:planSelection:api'); + +export const planSelectionApi = { + downgrade: async () => { + const url = `${API}/${API_VERSION}/payment/downgrade`; + const options = { + method: 'PUT', + }; + debug('downgrade UPDATE', url, options); + const result = await sendAuthRequest(url, options); + debug('downgrade RESULT', result); + if (!result.ok) throw result; + + return result.ok; + }, +}; + +export const downgradeUserRequest = new Request(planSelectionApi, 'downgrade'); + +export const resetApiRequests = () => { + downgradeUserRequest.reset(); +}; diff --git a/src/features/planSelection/components/PlanItem.js b/src/features/planSelection/components/PlanItem.js new file mode 100644 index 000000000..a49cd40d3 --- /dev/null +++ b/src/features/planSelection/components/PlanItem.js @@ -0,0 +1,186 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; +import injectSheet from 'react-jss'; +import classnames from 'classnames'; +import color from 'color'; + +import { H2 } from '@meetfranz/ui'; + +import { Button } from '@meetfranz/forms'; +import { mdiArrowRight } from '@mdi/js'; +// import { FeatureList } from '../ui/FeatureList'; +// import { PLANS, PAYMENT_INTERVAL } from '../../config'; +// import { i18nPlanName, i18nIntervalName } from '../../helpers/plan-helpers'; +// import { PLAN_INTERVAL_CONFIG_TYPE } from './types'; + +const messages = defineMessages({ + perMonth: { + id: 'subscription.interval.perMonth', + defaultMessage: '!!!per month', + }, + perMonthPerUser: { + id: 'subscription.interval.perMonthPerUser', + defaultMessage: '!!!per month & user', + }, +}); + +const styles = theme => ({ + root: { + display: 'flex', + flexDirection: 'column', + borderRadius: theme.borderRadius, + flex: 1, + color: theme.styleTypes.primary.accent, + overflow: 'hidden', + textAlign: 'center', + + '& h2': { + textAlign: 'center', + marginBottom: 20, + fontSize: 30, + color: theme.styleTypes.primary.contrast, + // fontWeight: 'bold', + }, + }, + currency: { + fontSize: 35, + }, + priceWrapper: { + height: 50, + }, + price: { + fontSize: 50, + + '& sup': { + fontSize: 20, + verticalAlign: 20, + }, + }, + interval: { + // paddingBottom: 40, + }, + text: { + marginBottom: 'auto', + }, + cta: { + background: theme.styleTypes.primary.accent, + color: theme.styleTypes.primary.contrast, + margin: [40, 'auto', 0, 'auto'], + + // '&:active': { + // opacity: 0.7, + // }, + }, + divider: { + width: 40, + border: 0, + borderTop: [1, 'solid', theme.styleTypes.primary.contrast], + margin: [30, 'auto'], + }, + header: { + padding: 20, + background: color(theme.styleTypes.primary.accent).darken(0.25).hex(), + color: theme.styleTypes.primary.contrast, + }, + content: { + padding: 20, + // border: [1, 'solid', 'red'], + background: '#EFEFEF', + }, + simpleCTA: { + background: 'none', + color: theme.styleTypes.primary.accent, + + '& svg': { + fill: theme.styleTypes.primary.accent, + }, + }, +}); + + +export default @observer @injectSheet(styles) class PlanItem extends Component { + static propTypes = { + name: PropTypes.string.isRequired, + text: PropTypes.string.isRequired, + price: PropTypes.number.isRequired, + currency: PropTypes.string.isRequired, + upgrade: PropTypes.func.isRequired, + ctaLabel: PropTypes.string.isRequired, + simpleCTA: PropTypes.bool, + perUser: PropTypes.bool, + classes: PropTypes.object.isRequired, + children: PropTypes.element, + }; + + static defaultProps = { + simpleCTA: false, + perUser: false, + children: null, + } + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { + name, + text, + price, + currency, + classes, + upgrade, + ctaLabel, + simpleCTA, + perUser, + children, + } = this.props; + const { intl } = this.context; + + const priceParts = `${price}`.split('.'); + // const intervalName = i18nIntervalName(PAYMENT_INTERVAL.MONTHLY, intl); + + return ( +
+
+

{name}

+

+ {text} +

+
+

+ {currency} + + {priceParts[0]} + {priceParts[1]} + +

+

+ {intl.formatMessage(perUser ? messages.perMonthPerUser : messages.perMonth)} +

+
+ +
+ {children} + +
+ +
+ ); + } +} diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js new file mode 100644 index 000000000..84d2d9e89 --- /dev/null +++ b/src/features/planSelection/components/PlanSelection.js @@ -0,0 +1,233 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import injectSheet from 'react-jss'; +import { defineMessages, intlShape } from 'react-intl'; +import { H1, H2, Icon } from '@meetfranz/ui'; +import color from 'color'; + +import { mdiRocket } from '@mdi/js'; +import PlanItem from './PlanItem'; +import { i18nPlanName } from '../../../helpers/plan-helpers'; +import { PLANS } from '../../../config'; +import { FeatureList } from '../../../components/ui/FeatureList'; + +const messages = defineMessages({ + welcome: { + id: 'feature.planSelection.fullscreen.welcome', + defaultMessage: '!!!Welcome back, {name}', + }, + subheadline: { + id: 'feature.planSelection.fullscreen.subheadline', + defaultMessage: '!!!It\'s time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.', + }, + textFree: { + id: 'feature.planSelection.free.text', + defaultMessage: '!!!Basic functionality', + }, + textPersonal: { + id: 'feature.planSelection.personal.text', + defaultMessage: '!!!More services, no waiting - ideal for personal use.', + }, + textProfessional: { + id: 'feature.planSelection.pro.text', + defaultMessage: '!!!Unlimited services and professional features for you - and your team.', + }, + ctaStayOnFree: { + id: 'feature.planSelection.cta.stayOnFree', + defaultMessage: '!!!Stay on Free', + }, + ctaDowngradeFree: { + id: 'feature.planSelection.cta.ctaDowngradeFree', + defaultMessage: '!!!Downgrade to Free', + }, + actionTrial: { + id: 'feature.planSelection.cta.trial', + defaultMessage: '!!!Start my free 14-days Trial', + }, + shortActionPersonal: { + id: 'feature.planSelection.cta.upgradePersonal', + defaultMessage: '!!!Choose Personal', + }, + shortActionPro: { + id: 'feature.planSelection.cta.upgradePro', + defaultMessage: '!!!Choose Professional', + }, + fullFeatureList: { + id: 'feature.planSelection.fullFeatureList', + defaultMessage: '!!!Complete comparison of all plans', + }, +}); + +const styles = theme => ({ + root: { + background: theme.colorModalOverlayBackground, + width: '100%', + height: '100%', + position: 'absolute', + top: 0, + left: 0, + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + zIndex: 999999, + }, + container: { + width: '80%', + height: 'auto', + background: theme.styleTypes.primary.accent, + padding: 40, + borderRadius: theme.borderRadius, + maxWidth: 1000, + + '& h1, & h2': { + textAlign: 'center', + }, + }, + plans: { + display: 'flex', + margin: [40, 0, 0], + height: 'auto', + + '& > div': { + margin: [0, 15], + flex: 1, + height: 'auto', + background: theme.styleTypes.primary.contrast, + boxShadow: [0, 2, 30, color('#000').alpha(0.1).rgb().string()], + }, + }, + bigIcon: { + background: theme.styleTypes.danger.accent, + width: 120, + height: 120, + display: 'flex', + alignItems: 'center', + borderRadius: '100%', + justifyContent: 'center', + margin: [-100, 'auto', 20], + + '& svg': { + width: '80px !important', + }, + }, + headline: { + fontSize: 40, + }, + subheadline: { + maxWidth: 660, + fontSize: 22, + lineHeight: 1.1, + margin: [0, 'auto'], + }, + featureList: { + '& li': { + borderBottom: [1, 'solid', '#CECECE'], + }, + }, + fullFeatureList: { + marginTop: 40, + textAlign: 'center', + display: 'block', + color: `${theme.styleTypes.primary.contrast} !important`, + }, +}); + +@injectSheet(styles) @observer +class PlanSelection extends Component { + static propTypes = { + classes: PropTypes.object.isRequired, + firstname: PropTypes.string.isRequired, + plans: PropTypes.object.isRequired, + currency: PropTypes.string.isRequired, + subscriptionExpired: PropTypes.bool.isRequired, + upgradeAccount: PropTypes.func.isRequired, + stayOnFree: PropTypes.func.isRequired, + hadSubscription: PropTypes.bool.isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { + classes, + firstname, + plans, + currency, + subscriptionExpired, + upgradeAccount, + stayOnFree, + hadSubscription, + } = this.props; + + const { intl } = this.context; + + return ( +
+
+
+ +
+

{intl.formatMessage(messages.welcome, { name: firstname })}

+

{intl.formatMessage(messages.subheadline)}

+
+ stayOnFree()} + simpleCTA + > + + + upgradeAccount(plans.personal.yearly.id)} + > + + + upgradeAccount(plans.personal.yearly.id)} + perUser + > + + +
+ + {intl.formatMessage(messages.fullFeatureList)} + +
+
+ ); + } +} + +export default PlanSelection; diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js new file mode 100644 index 000000000..b0d9b5ab5 --- /dev/null +++ b/src/features/planSelection/containers/PlanSelectionScreen.js @@ -0,0 +1,138 @@ +import React, { Component } from 'react'; +import { observer, inject } from 'mobx-react'; +import PropTypes from 'prop-types'; +import { remote } from 'electron'; +import { defineMessages, intlShape } from 'react-intl'; + +import FeaturesStore from '../../../stores/FeaturesStore'; +import UserStore from '../../../stores/UserStore'; +import PlanSelection from '../components/PlanSelection'; +import ErrorBoundary from '../../../components/util/ErrorBoundary'; +import { planSelectionStore } from '..'; + +const { dialog, app } = remote; + +const messages = defineMessages({ + dialogTitle: { + id: 'feature.planSelection.fullscreen.dialog.title', + defaultMessage: '!!!Downgrade your Franz Plan', + }, + dialogMessage: { + id: 'feature.planSelection.fullscreen.dialog.message', + defaultMessage: '!!!You\'re about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.', + }, + dialogCTADowngrade: { + id: 'feature.planSelection.fullscreen.dialog.cta.downgrade', + defaultMessage: '!!!Downgrade to Free', + }, + dialogCTAUpgrade: { + id: 'feature.planSelection.fullscreen.dialog.cta.upgrade', + defaultMessage: '!!!Choose Personal', + }, +}); + +@inject('stores', 'actions') @observer +class PlanSelectionScreen extends Component { + static contextTypes = { + intl: intlShape, + }; + + upgradeAccount(planId) { + const { user, features } = this.props.stores; + const { upgradeAccount, hideOverlay } = this.props.actions.planSelection; + + upgradeAccount({ + planId, + onCloseWindow: () => { + hideOverlay(); + user.getUserInfoRequest.invalidate({ immediately: true }); + features.featuresRequest.invalidate({ immediately: true }); + }, + }); + } + + render() { + if (!planSelectionStore || !planSelectionStore.isFeatureActive || !planSelectionStore.showPlanSelectionOverlay) { + return null; + } + + const { intl } = this.context; + + const { user, features } = this.props.stores; + const { plans, currency } = features.features.pricingConfig; + const { activateTrial } = this.props.actions.user; + const { upgradeAccount, downgradeAccount, hideOverlay } = this.props.actions.planSelection; + + // const planConfig = [{ + // id: 'free', + // price: 0, + // }, { + // id: plans.personal.yearly.id, + // price: plans.personal.yearly.price, + // }, { + // id: plans.pro.yearly.id, + // price: plans.pro.yearly.price, + // }]; + + return ( + + { + if (user.data.hadSubscription) { + this.upgradeAccount(planId); + } else { + activateTrial({ + planId, + }); + } + }} + stayOnFree={() => { + const selection = dialog.showMessageBoxSync(app.mainWindow, { + type: 'question', + message: intl.formatMessage(messages.dialogTitle), + detail: intl.formatMessage(messages.dialogMessage, { + currency, + price: plans.personal.yearly.price, + }), + buttons: [ + intl.formatMessage(messages.dialogCTADowngrade), + intl.formatMessage(messages.dialogCTAUpgrade), + ], + }); + + if (selection === 0) { + downgradeAccount(); + hideOverlay(); + } else { + upgradeAccount(plans.personal.yearly.id); + } + }} + subscriptionExpired={user.team && user.team.state === 'expired' && !user.team.userHasDowngraded} + hadSubscription={user.data.hadSubscription} + /> + + ); + } +} + +export default PlanSelectionScreen; + +PlanSelectionScreen.wrappedComponent.propTypes = { + stores: PropTypes.shape({ + features: PropTypes.instanceOf(FeaturesStore).isRequired, + user: PropTypes.instanceOf(UserStore).isRequired, + }).isRequired, + actions: PropTypes.shape({ + planSelection: PropTypes.shape({ + upgradeAccount: PropTypes.func.isRequired, + downgradeAccount: PropTypes.func.isRequired, + hideOverlay: PropTypes.func.isRequired, + }), + user: PropTypes.shape({ + activateTrial: PropTypes.func.isRequired, + }), + }).isRequired, +}; diff --git a/src/features/planSelection/index.js b/src/features/planSelection/index.js new file mode 100644 index 000000000..81189207a --- /dev/null +++ b/src/features/planSelection/index.js @@ -0,0 +1,30 @@ +import { reaction } from 'mobx'; +import PlanSelectionStore from './store'; + +const debug = require('debug')('Franz:feature:planSelection'); + +export const GA_CATEGORY_PLAN_SELECTION = 'planSelection'; + +export const planSelectionStore = new PlanSelectionStore(); + +export default function initPlanSelection(stores, actions) { + stores.planSelection = planSelectionStore; + const { features } = stores; + + // Toggle planSelection feature + reaction( + () => features.features.isPlanSelectionEnabled, + (isEnabled) => { + if (isEnabled) { + debug('Initializing `planSelection` feature'); + planSelectionStore.start(stores, actions); + } else if (planSelectionStore.isFeatureActive) { + debug('Disabling `planSelection` feature'); + planSelectionStore.stop(); + } + }, + { + fireImmediately: true, + }, + ); +} diff --git a/src/features/planSelection/store.js b/src/features/planSelection/store.js new file mode 100644 index 000000000..50e46dfb3 --- /dev/null +++ b/src/features/planSelection/store.js @@ -0,0 +1,113 @@ +import { + action, + observable, + computed, +} from 'mobx'; +import { remote } from 'electron'; + +import { planSelectionActions } from './actions'; +import { FeatureStore } from '../utils/FeatureStore'; +// import { createReactions } from '../../stores/lib/Reaction'; +import { createActionBindings } from '../utils/ActionBinding'; +import { downgradeUserRequest } from './api'; + +const debug = require('debug')('Franz:feature:planSelection:store'); + +const { BrowserWindow } = remote; + +export default class PlanSelectionStore extends FeatureStore { + @observable isFeatureEnabled = false; + + @observable isFeatureActive = false; + + @observable hideOverlay = false; + + @computed get showPlanSelectionOverlay() { + const { team } = this.stores.user; + if (team && !this.hideOverlay) { + return team.state === 'expired' && !team.userHasDowngraded; + } + + return false; + } + + // ========== PUBLIC API ========= // + + @action start(stores, actions, api) { + debug('PlanSelectionStore::start'); + this.stores = stores; + this.actions = actions; + this.api = api; + + // ACTIONS + + this._registerActions(createActionBindings([ + [planSelectionActions.upgradeAccount, this._upgradeAccount], + [planSelectionActions.downgradeAccount, this._downgradeAccount], + [planSelectionActions.hideOverlay, this._hideOverlay], + ])); + + // REACTIONS + + // this._allReactions = createReactions([ + // this._setFeatureEnabledReaction, + // this._updateTodosConfig, + // this._firstLaunchReaction, + // this._routeCheckReaction, + // ]); + + // this._registerReactions(this._allReactions); + + this.isFeatureActive = true; + } + + @action stop() { + super.stop(); + debug('PlanSelectionStore::stop'); + this.reset(); + this.isFeatureActive = false; + } + + // ========== PRIVATE METHODS ========= // + + // Actions + + @action _upgradeAccount = ({ planId, onCloseWindow = () => null }) => { + let hostedPageURL = this.stores.features.features.subscribeURL; + + const parsedUrl = new URL(hostedPageURL); + const params = new URLSearchParams(parsedUrl.search.slice(1)); + + params.set('plan', planId); + + hostedPageURL = this.stores.user.getAuthURL(`${parsedUrl.origin}${parsedUrl.pathname}?${params.toString()}`); + + const win = new BrowserWindow({ + parent: remote.getCurrentWindow(), + modal: true, + title: '🔒 Upgrade Your Franz Account', + width: 800, + height: window.innerHeight - 100, + maxWidth: 800, + minWidth: 600, + webPreferences: { + nodeIntegration: true, + webviewTag: true, + }, + }); + win.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPageURL)}`); + + win.on('closed', () => { + onCloseWindow(); + }); + }; + + @action _downgradeAccount = () => { + console.log('downgrade to free', downgradeUserRequest); + downgradeUserRequest.execute(); + } + + @action _hideOverlay = () => { + this.hideOverlay = true; + } +} diff --git a/src/features/shareFranz/index.js b/src/features/shareFranz/index.js index 87deacef4..a39d7a6e6 100644 --- a/src/features/shareFranz/index.js +++ b/src/features/shareFranz/index.js @@ -3,6 +3,7 @@ import ms from 'ms'; import { state as delayAppState } from '../delayApp'; import { gaEvent, gaPage } from '../../lib/analytics'; +import { planSelectionStore } from '../planSelection'; export { default as Component } from './Component'; @@ -35,7 +36,7 @@ export default function initialize(stores) { () => stores.user.isLoggedIn, () => { setTimeout(() => { - if (stores.settings.stats.appStarts % 50 === 0) { + if (stores.settings.stats.appStarts % 50 === 0 && !planSelectionStore.showPlanSelectionOverlay) { if (delayAppState.isDelayAppScreenVisible) { debug('Delaying share modal by 5 minutes'); setTimeout(() => showModal(), ms('5m')); diff --git a/src/helpers/plan-helpers.js b/src/helpers/plan-helpers.js index e0f1fd89a..ee22e4471 100644 --- a/src/helpers/plan-helpers.js +++ b/src/helpers/plan-helpers.js @@ -4,19 +4,19 @@ import { PLANS_MAPPING, PLANS } from '../config'; const messages = defineMessages({ [PLANS.PRO]: { id: 'pricing.plan.pro', - defaultMessage: '!!!Franz Professional', + defaultMessage: '!!!Professional', }, [PLANS.PERSONAL]: { id: 'pricing.plan.personal', - defaultMessage: '!!!Franz Personal', + defaultMessage: '!!!Personal', }, [PLANS.FREE]: { id: 'pricing.plan.free', - defaultMessage: '!!!Franz Free', + defaultMessage: '!!!Free', }, [PLANS.LEGACY]: { id: 'pricing.plan.legacy', - defaultMessage: '!!!Franz Premium', + defaultMessage: '!!!Premium', }, }); diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 703f800f9..210ea001a 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -430,7 +430,7 @@ } }, { - "defaultMessage": "!!!Your personal welcome offer:", + "defaultMessage": "!!!Here's a special welcome for you:", "end": { "column": 3, "line": 22 @@ -495,7 +495,7 @@ } }, { - "defaultMessage": "!!!Yes, upgrade my account to Franz Professional", + "defaultMessage": "!!!Start my 14-day Franz Professional Trial", "end": { "column": 3, "line": 42 @@ -721,39 +721,39 @@ "defaultMessage": "!!!Your services have been updated.", "end": { "column": 3, - "line": 31 + "line": 32 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.servicesUpdated", "start": { "column": 19, - "line": 28 + "line": 29 } }, { "defaultMessage": "!!!Reload services", "end": { "column": 3, - "line": 35 + "line": 36 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.buttonReloadServices", "start": { "column": 24, - "line": 32 + "line": 33 } }, { "defaultMessage": "!!!Could not load services and user information", "end": { "column": 3, - "line": 39 + "line": 40 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.requiredRequestsFailed", "start": { "column": 26, - "line": 36 + "line": 37 } } ], @@ -3016,134 +3016,199 @@ }, { "descriptors": [ + { + "defaultMessage": "!!!Choose from more than 70 Services", + "end": { + "column": 3, + "line": 12 + }, + "file": "src/components/ui/FeatureList.js", + "id": "pricing.features.recipes", + "start": { + "column": 20, + "line": 9 + } + }, + { + "defaultMessage": "!!!Account Synchronisation", + "end": { + "column": 3, + "line": 16 + }, + "file": "src/components/ui/FeatureList.js", + "id": "pricing.features.accountSync", + "start": { + "column": 15, + "line": 13 + } + }, + { + "defaultMessage": "!!!Desktop Notifications", + "end": { + "column": 3, + "line": 20 + }, + "file": "src/components/ui/FeatureList.js", + "id": "pricing.features.desktopNotifications", + "start": { + "column": 24, + "line": 17 + } + }, { "defaultMessage": "!!!Add unlimited services", "end": { "column": 3, - "line": 11 + "line": 24 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.unlimitedServices", "start": { "column": 21, - "line": 8 + "line": 21 + } + }, + { + "defaultMessage": "!!!Add up to 3 services", + "end": { + "column": 3, + "line": 28 + }, + "file": "src/components/ui/FeatureList.js", + "id": "pricing.features.upToThreeServices", + "start": { + "column": 21, + "line": 25 + } + }, + { + "defaultMessage": "!!!Add up to 6 services", + "end": { + "column": 3, + "line": 32 + }, + "file": "src/components/ui/FeatureList.js", + "id": "pricing.features.upToSixServices", + "start": { + "column": 19, + "line": 29 } }, { "defaultMessage": "!!!Spellchecker support", "end": { "column": 3, - "line": 15 + "line": 36 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.spellchecker", "start": { "column": 16, - "line": 12 + "line": 33 } }, { "defaultMessage": "!!!Workspaces", "end": { "column": 3, - "line": 19 + "line": 40 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.workspaces", "start": { "column": 14, - "line": 16 + "line": 37 } }, { "defaultMessage": "!!!Add Custom Websites", "end": { "column": 3, - "line": 23 + "line": 44 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.customWebsites", "start": { "column": 18, - "line": 20 + "line": 41 } }, { "defaultMessage": "!!!On-premise & other Hosted Services", "end": { "column": 3, - "line": 27 + "line": 48 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.onPremise", "start": { "column": 13, - "line": 24 + "line": 45 } }, { "defaultMessage": "!!!Install 3rd party services", "end": { "column": 3, - "line": 31 + "line": 52 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.thirdPartyServices", "start": { "column": 22, - "line": 28 + "line": 49 } }, { "defaultMessage": "!!!Service Proxies", "end": { "column": 3, - "line": 35 + "line": 56 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.serviceProxies", "start": { "column": 18, - "line": 32 + "line": 53 } }, { "defaultMessage": "!!!Team Management", "end": { "column": 3, - "line": 39 + "line": 60 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.teamManagement", "start": { "column": 18, - "line": 36 + "line": 57 } }, { "defaultMessage": "!!!No Waiting Screens", "end": { "column": 3, - "line": 43 + "line": 64 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.appDelays", "start": { "column": 13, - "line": 40 + "line": 61 } }, { "defaultMessage": "!!!Forever ad-free", "end": { "column": 3, - "line": 47 + "line": 68 }, "file": "src/components/ui/FeatureList.js", "id": "pricing.features.adFree", "start": { "column": 10, - "line": 44 + "line": 65 } } ], @@ -3831,6 +3896,273 @@ ], "path": "src/features/delayApp/Component.json" }, + { + "descriptors": [ + { + "defaultMessage": "!!!per month", + "end": { + "column": 3, + "line": 22 + }, + "file": "src/features/planSelection/components/PlanItem.js", + "id": "subscription.interval.perMonth", + "start": { + "column": 12, + "line": 19 + } + }, + { + "defaultMessage": "!!!per month & user", + "end": { + "column": 3, + "line": 26 + }, + "file": "src/features/planSelection/components/PlanItem.js", + "id": "subscription.interval.perMonthPerUser", + "start": { + "column": 19, + "line": 23 + } + } + ], + "path": "src/features/planSelection/components/PlanItem.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Welcome back, {name}", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.fullscreen.welcome", + "start": { + "column": 11, + "line": 16 + } + }, + { + "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.fullscreen.subheadline", + "start": { + "column": 15, + "line": 20 + } + }, + { + "defaultMessage": "!!!Basic functionality", + "end": { + "column": 3, + "line": 27 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.free.text", + "start": { + "column": 12, + "line": 24 + } + }, + { + "defaultMessage": "!!!More services, no waiting - ideal for personal use.", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.personal.text", + "start": { + "column": 16, + "line": 28 + } + }, + { + "defaultMessage": "!!!Unlimited services and professional features for you - and your team.", + "end": { + "column": 3, + "line": 35 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.pro.text", + "start": { + "column": 20, + "line": 32 + } + }, + { + "defaultMessage": "!!!Stay on Free", + "end": { + "column": 3, + "line": 39 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.cta.stayOnFree", + "start": { + "column": 17, + "line": 36 + } + }, + { + "defaultMessage": "!!!Downgrade to Free", + "end": { + "column": 3, + "line": 43 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.cta.ctaDowngradeFree", + "start": { + "column": 20, + "line": 40 + } + }, + { + "defaultMessage": "!!!Start my free 14-days Trial", + "end": { + "column": 3, + "line": 47 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.cta.trial", + "start": { + "column": 15, + "line": 44 + } + }, + { + "defaultMessage": "!!!Choose Personal", + "end": { + "column": 3, + "line": 51 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.cta.upgradePersonal", + "start": { + "column": 23, + "line": 48 + } + }, + { + "defaultMessage": "!!!Choose Professional", + "end": { + "column": 3, + "line": 55 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.cta.upgradePro", + "start": { + "column": 18, + "line": 52 + } + }, + { + "defaultMessage": "!!!Complete comparison of all plans", + "end": { + "column": 3, + "line": 59 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.fullFeatureList", + "start": { + "column": 19, + "line": 56 + } + } + ], + "path": "src/features/planSelection/components/PlanSelection.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!per {interval}", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/features/planSelection/components/PlanTeaser.js", + "id": "subscription.interval.per", + "start": { + "column": 7, + "line": 16 + } + }, + { + "defaultMessage": "!!!Upgrade Account", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/features/planSelection/components/PlanTeaser.js", + "id": "subscription.planItem.upgradeAccount", + "start": { + "column": 7, + "line": 20 + } + } + ], + "path": "src/features/planSelection/components/PlanTeaser.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Downgrade your Franz Plan", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/features/planSelection/containers/PlanSelectionScreen.js", + "id": "feature.planSelection.fullscreen.dialog.title", + "start": { + "column": 15, + "line": 16 + } + }, + { + "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/features/planSelection/containers/PlanSelectionScreen.js", + "id": "feature.planSelection.fullscreen.dialog.message", + "start": { + "column": 17, + "line": 20 + } + }, + { + "defaultMessage": "!!!Downgrade to Free", + "end": { + "column": 3, + "line": 27 + }, + "file": "src/features/planSelection/containers/PlanSelectionScreen.js", + "id": "feature.planSelection.fullscreen.dialog.cta.downgrade", + "start": { + "column": 22, + "line": 24 + } + }, + { + "defaultMessage": "!!!Choose Personal", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/features/planSelection/containers/PlanSelectionScreen.js", + "id": "feature.planSelection.fullscreen.dialog.cta.upgrade", + "start": { + "column": 20, + "line": 28 + } + } + ], + "path": "src/features/planSelection/containers/PlanSelectionScreen.json" + }, { "descriptors": [ { @@ -4487,7 +4819,7 @@ { "descriptors": [ { - "defaultMessage": "!!!Franz Professional", + "defaultMessage": "!!!Professional", "end": { "column": 3, "line": 8 @@ -4500,7 +4832,7 @@ } }, { - "defaultMessage": "!!!Franz Personal", + "defaultMessage": "!!!Personal", "end": { "column": 3, "line": 12 @@ -4513,7 +4845,7 @@ } }, { - "defaultMessage": "!!!Franz Free", + "defaultMessage": "!!!Free", "end": { "column": 3, "line": 16 @@ -4526,7 +4858,7 @@ } }, { - "defaultMessage": "!!!Franz Premium", + "defaultMessage": "!!!Premium", "end": { "column": 3, "line": 20 diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index aea74768d..4e1b01419 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -9,6 +9,21 @@ "feature.delayApp.trial.headline": "Get the free Franz Professional 14 day trial and skip the line", "feature.delayApp.upgrade.action": "Get a Franz Supporter License", "feature.delayApp.upgrade.actionShort": "Upgrade account", + "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", + "feature.planSelection.cta.stayOnFree": "Stay on Free", + "feature.planSelection.cta.trial": "Start my free 14-days Trial", + "feature.planSelection.cta.upgradePersonal": "Choose Personal", + "feature.planSelection.cta.upgradePro": "Choose Professional", + "feature.planSelection.free.text": "Basic functionality", + "feature.planSelection.fullFeatureList": "Complete comparison of all plans", + "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free", + "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal", + "feature.planSelection.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", + "feature.planSelection.fullscreen.dialog.title": "Downgrade your Franz Plan", + "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", + "feature.planSelection.fullscreen.welcome": "Welcome back, {name}", + "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.", + "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached": "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email": "Send as email", "feature.shareFranz.action.facebook": "Share on Facebook", @@ -123,30 +138,35 @@ "password.submit.label": "Submit", "password.successInfo": "Please check your email", "premiumFeature.button.upgradeAccount": "Upgrade account", + "pricing.features.accountSync": "Account Synchronisation", "pricing.features.adFree": "Forever ad-free", "pricing.features.appDelays": "No Waiting Screens", "pricing.features.customWebsites": "Add Custom Websites", + "pricing.features.desktopNotifications": "Desktop Notifications", "pricing.features.onPremise": "On-premise & other Hosted Services", + "pricing.features.recipes": "Choose from more than 70 Services", "pricing.features.serviceProxies": "Service Proxies", "pricing.features.spellchecker": "Spellchecker support", "pricing.features.teamManagement": "Team Management", "pricing.features.thirdPartyServices": "Install 3rd party services", "pricing.features.unlimitedServices": "Add unlimited services", + "pricing.features.upToSixServices": "Add up to 6 services", + "pricing.features.upToThreeServices": "Add up to 3 services", "pricing.features.workspaces": "Workspaces", - "pricing.plan.free": "Franz Free", - "pricing.plan.legacy": "Franz Premium", - "pricing.plan.personal": "Franz Personal", - "pricing.plan.personal-monthly": "Franz Personal Monthly", - "pricing.plan.personal-yearly": "Franz Personal Yearly", - "pricing.plan.pro": "Franz Professional", - "pricing.plan.pro-monthly": "Franz Professional Monthly", - "pricing.plan.pro-yearly": "Franz Professional Yearly", - "pricing.trial.cta.accept": "Yes, upgrade my account to Franz Professional", + "pricing.plan.free": "Free", + "pricing.plan.legacy": "Premium", + "pricing.plan.personal": "Personal", + "pricing.plan.personal-monthly": "Personal Monthly", + "pricing.plan.personal-yearly": "Personal Yearly", + "pricing.plan.pro": "Professional", + "pricing.plan.pro-monthly": "Professional Monthly", + "pricing.plan.pro-yearly": "Professional Yearly", + "pricing.trial.cta.accept": "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip": "Continue to Franz", "pricing.trial.error": "Sorry, we could not activate your trial!", "pricing.trial.features.headline": "Franz Professional includes:", "pricing.trial.headline": "Franz Professional", - "pricing.trial.subheadline": "Your personal welcome offer:", + "pricing.trial.subheadline": "Here's a special welcome for you:", "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline": "No strings attached", "pricing.trial.terms.noCreditCard": "No credit card required", @@ -353,6 +373,10 @@ "subscription.cta.allOptions": "See all options", "subscription.cta.choosePlan": "Choose your plan", "subscription.includedProFeatures": "The Franz Professional Plan includes:", + "subscription.interval.per": "per {interval}", + "subscription.interval.perMonth": "per month", + "subscription.interval.perMonthPerUser": "per month & user", + "subscription.planItem.upgradeAccount": "Upgrade Account", "subscription.teaser.includedFeatures": "Paid Franz Plans include:", "subscription.teaser.intro": "Franz 5 comes with a wide range of new features to boost up your everyday communication - batteries included. Check out our new plans and find out which one suits you most!", "subscriptionPopup.buttonCancel": "Cancel", @@ -389,4 +413,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} \ No newline at end of file +} diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json index f15617ca5..2d09c9ebb 100644 --- a/src/i18n/messages/src/components/auth/Pricing.json +++ b/src/i18n/messages/src/components/auth/Pricing.json @@ -14,7 +14,7 @@ }, { "id": "pricing.trial.subheadline", - "defaultMessage": "!!!Your personal welcome offer:", + "defaultMessage": "!!!Here's a special welcome for you:", "file": "src/components/auth/Pricing.js", "start": { "line": 19, @@ -79,7 +79,7 @@ }, { "id": "pricing.trial.cta.accept", - "defaultMessage": "!!!Yes, upgrade my account to Franz Professional", + "defaultMessage": "!!!Start my 14-day Franz Professional Trial", "file": "src/components/auth/Pricing.js", "start": { "line": 39, diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json index 44cf4fab9..22f11cedd 100644 --- a/src/i18n/messages/src/components/layout/AppLayout.json +++ b/src/i18n/messages/src/components/layout/AppLayout.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Your services have been updated.", "file": "src/components/layout/AppLayout.js", "start": { - "line": 28, + "line": 29, "column": 19 }, "end": { - "line": 31, + "line": 32, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!Reload services", "file": "src/components/layout/AppLayout.js", "start": { - "line": 32, + "line": 33, "column": 24 }, "end": { - "line": 35, + "line": 36, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Could not load services and user information", "file": "src/components/layout/AppLayout.js", "start": { - "line": 36, + "line": 37, "column": 26 }, "end": { - "line": 39, + "line": 40, "column": 3 } } diff --git a/src/i18n/messages/src/components/ui/FeatureList.json b/src/i18n/messages/src/components/ui/FeatureList.json index 497e299a4..3201115b3 100644 --- a/src/i18n/messages/src/components/ui/FeatureList.json +++ b/src/i18n/messages/src/components/ui/FeatureList.json @@ -1,14 +1,79 @@ [ + { + "id": "pricing.features.recipes", + "defaultMessage": "!!!Choose from more than 70 Services", + "file": "src/components/ui/FeatureList.js", + "start": { + "line": 9, + "column": 20 + }, + "end": { + "line": 12, + "column": 3 + } + }, + { + "id": "pricing.features.accountSync", + "defaultMessage": "!!!Account Synchronisation", + "file": "src/components/ui/FeatureList.js", + "start": { + "line": 13, + "column": 15 + }, + "end": { + "line": 16, + "column": 3 + } + }, + { + "id": "pricing.features.desktopNotifications", + "defaultMessage": "!!!Desktop Notifications", + "file": "src/components/ui/FeatureList.js", + "start": { + "line": 17, + "column": 24 + }, + "end": { + "line": 20, + "column": 3 + } + }, { "id": "pricing.features.unlimitedServices", "defaultMessage": "!!!Add unlimited services", "file": "src/components/ui/FeatureList.js", "start": { - "line": 8, + "line": 21, "column": 21 }, "end": { - "line": 11, + "line": 24, + "column": 3 + } + }, + { + "id": "pricing.features.upToThreeServices", + "defaultMessage": "!!!Add up to 3 services", + "file": "src/components/ui/FeatureList.js", + "start": { + "line": 25, + "column": 21 + }, + "end": { + "line": 28, + "column": 3 + } + }, + { + "id": "pricing.features.upToSixServices", + "defaultMessage": "!!!Add up to 6 services", + "file": "src/components/ui/FeatureList.js", + "start": { + "line": 29, + "column": 19 + }, + "end": { + "line": 32, "column": 3 } }, @@ -17,11 +82,11 @@ "defaultMessage": "!!!Spellchecker support", "file": "src/components/ui/FeatureList.js", "start": { - "line": 12, + "line": 33, "column": 16 }, "end": { - "line": 15, + "line": 36, "column": 3 } }, @@ -30,11 +95,11 @@ "defaultMessage": "!!!Workspaces", "file": "src/components/ui/FeatureList.js", "start": { - "line": 16, + "line": 37, "column": 14 }, "end": { - "line": 19, + "line": 40, "column": 3 } }, @@ -43,11 +108,11 @@ "defaultMessage": "!!!Add Custom Websites", "file": "src/components/ui/FeatureList.js", "start": { - "line": 20, + "line": 41, "column": 18 }, "end": { - "line": 23, + "line": 44, "column": 3 } }, @@ -56,11 +121,11 @@ "defaultMessage": "!!!On-premise & other Hosted Services", "file": "src/components/ui/FeatureList.js", "start": { - "line": 24, + "line": 45, "column": 13 }, "end": { - "line": 27, + "line": 48, "column": 3 } }, @@ -69,11 +134,11 @@ "defaultMessage": "!!!Install 3rd party services", "file": "src/components/ui/FeatureList.js", "start": { - "line": 28, + "line": 49, "column": 22 }, "end": { - "line": 31, + "line": 52, "column": 3 } }, @@ -82,11 +147,11 @@ "defaultMessage": "!!!Service Proxies", "file": "src/components/ui/FeatureList.js", "start": { - "line": 32, + "line": 53, "column": 18 }, "end": { - "line": 35, + "line": 56, "column": 3 } }, @@ -95,11 +160,11 @@ "defaultMessage": "!!!Team Management", "file": "src/components/ui/FeatureList.js", "start": { - "line": 36, + "line": 57, "column": 18 }, "end": { - "line": 39, + "line": 60, "column": 3 } }, @@ -108,11 +173,11 @@ "defaultMessage": "!!!No Waiting Screens", "file": "src/components/ui/FeatureList.js", "start": { - "line": 40, + "line": 61, "column": 13 }, "end": { - "line": 43, + "line": 64, "column": 3 } }, @@ -121,11 +186,11 @@ "defaultMessage": "!!!Forever ad-free", "file": "src/components/ui/FeatureList.js", "start": { - "line": 44, + "line": 65, "column": 10 }, "end": { - "line": 47, + "line": 68, "column": 3 } } diff --git a/src/i18n/messages/src/features/planSelection/components/PlanItem.json b/src/i18n/messages/src/features/planSelection/components/PlanItem.json new file mode 100644 index 000000000..839686390 --- /dev/null +++ b/src/i18n/messages/src/features/planSelection/components/PlanItem.json @@ -0,0 +1,28 @@ +[ + { + "id": "subscription.interval.perMonth", + "defaultMessage": "!!!per month", + "file": "src/features/planSelection/components/PlanItem.js", + "start": { + "line": 19, + "column": 12 + }, + "end": { + "line": 22, + "column": 3 + } + }, + { + "id": "subscription.interval.perMonthPerUser", + "defaultMessage": "!!!per month & user", + "file": "src/features/planSelection/components/PlanItem.js", + "start": { + "line": 23, + "column": 19 + }, + "end": { + "line": 26, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json b/src/i18n/messages/src/features/planSelection/components/PlanSelection.json new file mode 100644 index 000000000..3dc4f74f4 --- /dev/null +++ b/src/i18n/messages/src/features/planSelection/components/PlanSelection.json @@ -0,0 +1,145 @@ +[ + { + "id": "feature.planSelection.fullscreen.welcome", + "defaultMessage": "!!!Welcome back, {name}", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 16, + "column": 11 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "feature.planSelection.fullscreen.subheadline", + "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 20, + "column": 15 + }, + "end": { + "line": 23, + "column": 3 + } + }, + { + "id": "feature.planSelection.free.text", + "defaultMessage": "!!!Basic functionality", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 24, + "column": 12 + }, + "end": { + "line": 27, + "column": 3 + } + }, + { + "id": "feature.planSelection.personal.text", + "defaultMessage": "!!!More services, no waiting - ideal for personal use.", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 28, + "column": 16 + }, + "end": { + "line": 31, + "column": 3 + } + }, + { + "id": "feature.planSelection.pro.text", + "defaultMessage": "!!!Unlimited services and professional features for you - and your team.", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 32, + "column": 20 + }, + "end": { + "line": 35, + "column": 3 + } + }, + { + "id": "feature.planSelection.cta.stayOnFree", + "defaultMessage": "!!!Stay on Free", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 36, + "column": 17 + }, + "end": { + "line": 39, + "column": 3 + } + }, + { + "id": "feature.planSelection.cta.ctaDowngradeFree", + "defaultMessage": "!!!Downgrade to Free", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 40, + "column": 20 + }, + "end": { + "line": 43, + "column": 3 + } + }, + { + "id": "feature.planSelection.cta.trial", + "defaultMessage": "!!!Start my free 14-days Trial", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 44, + "column": 15 + }, + "end": { + "line": 47, + "column": 3 + } + }, + { + "id": "feature.planSelection.cta.upgradePersonal", + "defaultMessage": "!!!Choose Personal", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 48, + "column": 23 + }, + "end": { + "line": 51, + "column": 3 + } + }, + { + "id": "feature.planSelection.cta.upgradePro", + "defaultMessage": "!!!Choose Professional", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 52, + "column": 18 + }, + "end": { + "line": 55, + "column": 3 + } + }, + { + "id": "feature.planSelection.fullFeatureList", + "defaultMessage": "!!!Complete comparison of all plans", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 56, + "column": 19 + }, + "end": { + "line": 59, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/planSelection/components/PlanTeaser.json b/src/i18n/messages/src/features/planSelection/components/PlanTeaser.json new file mode 100644 index 000000000..015304a2e --- /dev/null +++ b/src/i18n/messages/src/features/planSelection/components/PlanTeaser.json @@ -0,0 +1,28 @@ +[ + { + "id": "subscription.interval.per", + "defaultMessage": "!!!per {interval}", + "file": "src/features/planSelection/components/PlanTeaser.js", + "start": { + "line": 16, + "column": 7 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "subscription.planItem.upgradeAccount", + "defaultMessage": "!!!Upgrade Account", + "file": "src/features/planSelection/components/PlanTeaser.js", + "start": { + "line": 20, + "column": 7 + }, + "end": { + "line": 23, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json b/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json new file mode 100644 index 000000000..04b2144b4 --- /dev/null +++ b/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json @@ -0,0 +1,54 @@ +[ + { + "id": "feature.planSelection.fullscreen.dialog.title", + "defaultMessage": "!!!Downgrade your Franz Plan", + "file": "src/features/planSelection/containers/PlanSelectionScreen.js", + "start": { + "line": 16, + "column": 15 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "feature.planSelection.fullscreen.dialog.message", + "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", + "file": "src/features/planSelection/containers/PlanSelectionScreen.js", + "start": { + "line": 20, + "column": 17 + }, + "end": { + "line": 23, + "column": 3 + } + }, + { + "id": "feature.planSelection.fullscreen.dialog.cta.downgrade", + "defaultMessage": "!!!Downgrade to Free", + "file": "src/features/planSelection/containers/PlanSelectionScreen.js", + "start": { + "line": 24, + "column": 22 + }, + "end": { + "line": 27, + "column": 3 + } + }, + { + "id": "feature.planSelection.fullscreen.dialog.cta.upgrade", + "defaultMessage": "!!!Choose Personal", + "file": "src/features/planSelection/containers/PlanSelectionScreen.js", + "start": { + "line": 28, + "column": 20 + }, + "end": { + "line": 31, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/helpers/plan-helpers.json b/src/i18n/messages/src/helpers/plan-helpers.json index df8ee19e3..3f3e7e85d 100644 --- a/src/i18n/messages/src/helpers/plan-helpers.json +++ b/src/i18n/messages/src/helpers/plan-helpers.json @@ -1,7 +1,7 @@ [ { "id": "pricing.plan.pro", - "defaultMessage": "!!!Franz Professional", + "defaultMessage": "!!!Professional", "file": "src/helpers/plan-helpers.js", "start": { "line": 5, @@ -14,7 +14,7 @@ }, { "id": "pricing.plan.personal", - "defaultMessage": "!!!Franz Personal", + "defaultMessage": "!!!Personal", "file": "src/helpers/plan-helpers.js", "start": { "line": 9, @@ -27,7 +27,7 @@ }, { "id": "pricing.plan.free", - "defaultMessage": "!!!Franz Free", + "defaultMessage": "!!!Free", "file": "src/helpers/plan-helpers.js", "start": { "line": 13, @@ -40,7 +40,7 @@ }, { "id": "pricing.plan.legacy", - "defaultMessage": "!!!Franz Premium", + "defaultMessage": "!!!Premium", "file": "src/helpers/plan-helpers.js", "start": { "line": 17, diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index cf28b6bec..bffcb01bc 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js @@ -19,6 +19,7 @@ import settingsWS from '../features/settingsWS'; import serviceLimit from '../features/serviceLimit'; import communityRecipes from '../features/communityRecipes'; import todos from '../features/todos'; +import planSelection from '../features/planSelection'; import { DEFAULT_FEATURES_CONFIG } from '../config'; @@ -81,5 +82,6 @@ export default class FeaturesStore extends Store { serviceLimit(this.stores, this.actions); communityRecipes(this.stores, this.actions); todos(this.stores, this.actions); + planSelection(this.stores, this.actions); } } diff --git a/src/stores/index.js b/src/stores/index.js index 10dd56665..4eeef7982 100644 --- a/src/stores/index.js +++ b/src/stores/index.js @@ -15,6 +15,7 @@ import { announcementsStore } from '../features/announcements'; import { serviceLimitStore } from '../features/serviceLimit'; import { communityRecipesStore } from '../features/communityRecipes'; import { todosStore } from '../features/todos'; +import { planSelectionStore } from '../features/planSelection'; export default (api, actions, router) => { const stores = {}; @@ -37,6 +38,7 @@ export default (api, actions, router) => { serviceLimit: serviceLimitStore, communityRecipes: communityRecipesStore, todos: todosStore, + planSelection: planSelectionStore, }); // Initialize all stores Object.keys(stores).forEach((name) => { -- cgit v1.2.3-54-g00ecf From 010211fe85fbd3d7ef9b221aa00c06e315ecb7d2 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 15 Oct 2019 21:56:03 +0200 Subject: icon polishing --- src/features/planSelection/components/PlanSelection.js | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js index 84d2d9e89..d26cc08a2 100644 --- a/src/features/planSelection/components/PlanSelection.js +++ b/src/features/planSelection/components/PlanSelection.js @@ -109,6 +109,7 @@ const styles = theme => ({ '& svg': { width: '80px !important', + filter: 'drop-shadow( 0px 2px 3px rgba(0, 0, 0, 0.3))', }, }, headline: { -- cgit v1.2.3-54-g00ecf From 726b18b12bb62932bab4107f7f1e685f48989a5d Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 15 Oct 2019 21:56:09 +0200 Subject: remove console log --- src/features/planSelection/store.js | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/features/planSelection/store.js b/src/features/planSelection/store.js index 50e46dfb3..57d71011b 100644 --- a/src/features/planSelection/store.js +++ b/src/features/planSelection/store.js @@ -103,7 +103,6 @@ export default class PlanSelectionStore extends FeatureStore { }; @action _downgradeAccount = () => { - console.log('downgrade to free', downgradeUserRequest); downgradeUserRequest.execute(); } -- cgit v1.2.3-54-g00ecf From 939c00860ae65231070338b5bc0b09db7af0e149 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 15 Oct 2019 22:28:44 +0200 Subject: plan selection polishing --- .../planSelection/components/PlanSelection.js | 123 +++++++++++---------- .../containers/PlanSelectionScreen.js | 13 ++- src/i18n/locales/en-US.json | 2 +- .../planSelection/components/PlanSelection.json | 44 ++++---- .../containers/PlanSelectionScreen.json | 16 +-- 5 files changed, 108 insertions(+), 90 deletions(-) (limited to 'src') diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js index d26cc08a2..9cd592083 100644 --- a/src/features/planSelection/components/PlanSelection.js +++ b/src/features/planSelection/components/PlanSelection.js @@ -11,6 +11,7 @@ import PlanItem from './PlanItem'; import { i18nPlanName } from '../../../helpers/plan-helpers'; import { PLANS } from '../../../config'; import { FeatureList } from '../../../components/ui/FeatureList'; +import Appear from '../../../components/ui/effects/Appear'; const messages = defineMessages({ welcome: { @@ -132,6 +133,10 @@ const styles = theme => ({ display: 'block', color: `${theme.styleTypes.primary.contrast} !important`, }, + scrollContainer: { + border: '1px solid red', + overflow: 'scroll-x', + }, }); @injectSheet(styles) @observer @@ -166,67 +171,69 @@ class PlanSelection extends Component { const { intl } = this.context; return ( -
-
-
- -
-

{intl.formatMessage(messages.welcome, { name: firstname })}

-

{intl.formatMessage(messages.subheadline)}

-
- stayOnFree()} - simpleCTA - > - - - upgradeAccount(plans.personal.yearly.id)} - > - - - upgradeAccount(plans.personal.yearly.id)} - perUser + +
+
+
+ +
+

{intl.formatMessage(messages.welcome, { name: firstname })}

+

{intl.formatMessage(messages.subheadline)}

+
+ stayOnFree()} + simpleCTA + > + + + upgradeAccount(plans.personal.yearly.id)} + > + + + upgradeAccount(plans.personal.yearly.id)} + perUser + > + + +
+ - - + {intl.formatMessage(messages.fullFeatureList)} +
- - {intl.formatMessage(messages.fullFeatureList)} -
-
+ ); } } diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js index b0d9b5ab5..01b357861 100644 --- a/src/features/planSelection/containers/PlanSelectionScreen.js +++ b/src/features/planSelection/containers/PlanSelectionScreen.js @@ -8,7 +8,8 @@ import FeaturesStore from '../../../stores/FeaturesStore'; import UserStore from '../../../stores/UserStore'; import PlanSelection from '../components/PlanSelection'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; -import { planSelectionStore } from '..'; +import { planSelectionStore, GA_CATEGORY_PLAN_SELECTION } from '..'; +import { gaEvent } from '../../../lib/analytics'; const { dialog, app } = remote; @@ -37,6 +38,10 @@ class PlanSelectionScreen extends Component { intl: intlShape, }; + componentDidMount() { + gaEvent(GA_CATEGORY_PLAN_SELECTION, 'show'); + } + upgradeAccount(planId) { const { user, features } = this.props.stores; const { upgradeAccount, hideOverlay } = this.props.actions.planSelection; @@ -83,6 +88,8 @@ class PlanSelectionScreen extends Component { upgradeAccount={(planId) => { if (user.data.hadSubscription) { this.upgradeAccount(planId); + + gaEvent(GA_CATEGORY_PLAN_SELECTION, 'SelectPlan', planId); } else { activateTrial({ planId, @@ -103,11 +110,15 @@ class PlanSelectionScreen extends Component { ], }); + gaEvent(GA_CATEGORY_PLAN_SELECTION, 'SelectPlan', 'Stay on Free'); + if (selection === 0) { downgradeAccount(); hideOverlay(); } else { upgradeAccount(plans.personal.yearly.id); + + gaEvent(GA_CATEGORY_PLAN_SELECTION, 'SelectPlan', 'Revoke'); } }} subscriptionExpired={user.team && user.team.state === 'expired' && !user.team.userHasDowngraded} diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 4e1b01419..f2fd7a52a 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -413,4 +413,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file diff --git a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json b/src/i18n/messages/src/features/planSelection/components/PlanSelection.json index 3dc4f74f4..76f4ed50b 100644 --- a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json +++ b/src/i18n/messages/src/features/planSelection/components/PlanSelection.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Welcome back, {name}", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 16, + "line": 17, "column": 11 }, "end": { - "line": 19, + "line": 20, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 20, + "line": 21, "column": 15 }, "end": { - "line": 23, + "line": 24, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Basic functionality", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 24, + "line": 25, "column": 12 }, "end": { - "line": 27, + "line": 28, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!More services, no waiting - ideal for personal use.", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 28, + "line": 29, "column": 16 }, "end": { - "line": 31, + "line": 32, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Unlimited services and professional features for you - and your team.", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 32, + "line": 33, "column": 20 }, "end": { - "line": 35, + "line": 36, "column": 3 } }, @@ -69,11 +69,11 @@ "defaultMessage": "!!!Stay on Free", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 36, + "line": 37, "column": 17 }, "end": { - "line": 39, + "line": 40, "column": 3 } }, @@ -82,11 +82,11 @@ "defaultMessage": "!!!Downgrade to Free", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 40, + "line": 41, "column": 20 }, "end": { - "line": 43, + "line": 44, "column": 3 } }, @@ -95,11 +95,11 @@ "defaultMessage": "!!!Start my free 14-days Trial", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 44, + "line": 45, "column": 15 }, "end": { - "line": 47, + "line": 48, "column": 3 } }, @@ -108,11 +108,11 @@ "defaultMessage": "!!!Choose Personal", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 48, + "line": 49, "column": 23 }, "end": { - "line": 51, + "line": 52, "column": 3 } }, @@ -121,11 +121,11 @@ "defaultMessage": "!!!Choose Professional", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 52, + "line": 53, "column": 18 }, "end": { - "line": 55, + "line": 56, "column": 3 } }, @@ -134,11 +134,11 @@ "defaultMessage": "!!!Complete comparison of all plans", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 56, + "line": 57, "column": 19 }, "end": { - "line": 59, + "line": 60, "column": 3 } } diff --git a/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json b/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json index 04b2144b4..905c6e09a 100644 --- a/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json +++ b/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Downgrade your Franz Plan", "file": "src/features/planSelection/containers/PlanSelectionScreen.js", "start": { - "line": 16, + "line": 17, "column": 15 }, "end": { - "line": 19, + "line": 20, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "file": "src/features/planSelection/containers/PlanSelectionScreen.js", "start": { - "line": 20, + "line": 21, "column": 17 }, "end": { - "line": 23, + "line": 24, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Downgrade to Free", "file": "src/features/planSelection/containers/PlanSelectionScreen.js", "start": { - "line": 24, + "line": 25, "column": 22 }, "end": { - "line": 27, + "line": 28, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Choose Personal", "file": "src/features/planSelection/containers/PlanSelectionScreen.js", "start": { - "line": 28, + "line": 29, "column": 20 }, "end": { - "line": 31, + "line": 32, "column": 3 } } -- cgit v1.2.3-54-g00ecf From a7c222298e07800d0e09fa064ad257df4e0b6515 Mon Sep 17 00:00:00 2001 From: FranzBot Date: Wed, 16 Oct 2019 00:00:21 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/pl.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json index 13207f0ef..e803cc282 100644 --- a/src/i18n/locales/pl.json +++ b/src/i18n/locales/pl.json @@ -37,7 +37,7 @@ "infobar.buttonReloadServices" : "Odśwież usługi", "infobar.requiredRequestsFailed" : "Nie można załadować usług i informacji użytkownika", "infobar.servicesUpdated" : "Usługi zostały zaktualizowane.", - "infobar.trialActivated" : "Your trial was successfully activated. Happy messaging!", + "infobar.trialActivated" : "Twój okres próbny właśnie się rozpoczął.Pozytywnych wrażeń!", "infobar.updateAvailable" : "Dostępna jest nowa wersja Franza.", "invite.email.label" : "Adres email", "invite.headline.friends" : "Zaproś 3 znajomych lub kolegów", @@ -91,7 +91,7 @@ "menu.services" : "Usługi", "menu.services.activatePreviousService" : "Poprzednia usługa", "menu.services.addNewService" : "Dodaj nową usługę...", - "menu.services.goHome" : "Home", + "menu.services.goHome" : "Strona główna", "menu.services.setNextServiceActive" : "Następna usługa", "menu.todos" : "Lista zadań", "menu.todos.enableTodos" : "Enable Todos", @@ -124,7 +124,7 @@ "password.successInfo" : "Proszę sprawdzić swój email", "premiumFeature.button.upgradeAccount" : "Ulepsz konto", "pricing.features.adFree" : "Na zawsze bez reklam", - "pricing.features.appDelays" : "No Waiting Screens", + "pricing.features.appDelays" : "Bez czekania", "pricing.features.customWebsites" : "Dodawanie dowolnych stron internetowych", "pricing.features.onPremise" : "On-premise & other Hosted Services", "pricing.features.serviceProxies" : "Service Proxies", @@ -373,7 +373,7 @@ "validation.url" : "Pole {field} nie jest poprawnym ciągiem URL.", "webControls.back" : "Back", "webControls.forward" : "Forward", - "webControls.goHome" : "Home", + "webControls.goHome" : "Strona główna", "webControls.openInBrowser" : "Open in Browser", "webControls.reload" : "Reload", "welcome.loginButton" : "Zaloguj się na swoje konto", -- cgit v1.2.3-54-g00ecf From ba578b8a6df8d31136fb170e78b70a71dad85e31 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 16 Oct 2019 10:22:00 +0200 Subject: polishing --- src/components/auth/Pricing.js | 15 +++ src/containers/auth/PricingScreen.js | 11 +++ src/features/planSelection/components/PlanItem.js | 50 +++++++--- .../planSelection/components/PlanSelection.js | 27 +++--- .../containers/PlanSelectionScreen.js | 14 --- src/features/planSelection/store.js | 3 + src/i18n/locales/defaultMessages.json | 102 +++++++++++++-------- src/i18n/locales/en-US.json | 4 +- src/i18n/messages/src/components/auth/Pricing.json | 29 ++++-- .../planSelection/components/PlanItem.json | 19 +++- 10 files changed, 184 insertions(+), 90 deletions(-) (limited to 'src') diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js index 40ce49814..67af04470 100644 --- a/src/components/auth/Pricing.js +++ b/src/components/auth/Pricing.js @@ -32,6 +32,10 @@ const messages = defineMessages({ id: 'pricing.trial.terms.automaticTrialEnd', defaultMessage: '!!!Your free trial ends automatically after 14 days', }, + trialWorth: { + id: 'pricing.trial.terms.trialWorth', + defaultMessage: '!!!Free trial (normally {currency}{price} per month)', + }, activationError: { id: 'pricing.trial.error', defaultMessage: '!!!Sorry, we could not activate your trial!', @@ -104,6 +108,8 @@ export default @observer @injectSheet(styles) class Signup extends Component { trialActivationError: PropTypes.bool.isRequired, canSkipTrial: PropTypes.bool.isRequired, classes: PropTypes.object.isRequired, + currency: PropTypes.string.isRequired, + price: PropTypes.number.isRequired, }; static contextTypes = { @@ -118,6 +124,8 @@ export default @observer @injectSheet(styles) class Signup extends Component { trialActivationError, canSkipTrial, classes, + currency, + price, } = this.props; const { intl } = this.context; @@ -156,6 +164,13 @@ export default @observer @injectSheet(styles) class Signup extends Component { {intl.formatMessage(messages.noStringsAttachedHeadline)}
    +
diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js index 8e0ded16a..ff378bd8b 100644 --- a/src/containers/auth/PricingScreen.js +++ b/src/containers/auth/PricingScreen.js @@ -40,6 +40,15 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend const { getUserInfoRequest, activateTrialRequest } = stores.user; const { featuresRequest, features } = stores.features; + const { pricingConfig } = features; + + let currency = '$'; + let price = '5.99'; + if (pricingConfig) { + ({ currency } = pricingConfig); + ({ price } = pricingConfig.plans.pro.yearly); + } + return ( ); } diff --git a/src/features/planSelection/components/PlanItem.js b/src/features/planSelection/components/PlanItem.js index a49cd40d3..ea04c8448 100644 --- a/src/features/planSelection/components/PlanItem.js +++ b/src/features/planSelection/components/PlanItem.js @@ -10,10 +10,6 @@ import { H2 } from '@meetfranz/ui'; import { Button } from '@meetfranz/forms'; import { mdiArrowRight } from '@mdi/js'; -// import { FeatureList } from '../ui/FeatureList'; -// import { PLANS, PAYMENT_INTERVAL } from '../../config'; -// import { i18nPlanName, i18nIntervalName } from '../../helpers/plan-helpers'; -// import { PLAN_INTERVAL_CONFIG_TYPE } from './types'; const messages = defineMessages({ perMonth: { @@ -24,6 +20,10 @@ const messages = defineMessages({ id: 'subscription.interval.perMonthPerUser', defaultMessage: '!!!per month & user', }, + bestValue: { + id: 'subscription.bestValue', + defaultMessage: '!!!Best value', + }, }); const styles = theme => ({ @@ -41,7 +41,6 @@ const styles = theme => ({ marginBottom: 20, fontSize: 30, color: theme.styleTypes.primary.contrast, - // fontWeight: 'bold', }, }, currency: { @@ -58,9 +57,6 @@ const styles = theme => ({ verticalAlign: 20, }, }, - interval: { - // paddingBottom: 40, - }, text: { marginBottom: 'auto', }, @@ -68,10 +64,6 @@ const styles = theme => ({ background: theme.styleTypes.primary.accent, color: theme.styleTypes.primary.contrast, margin: [40, 'auto', 0, 'auto'], - - // '&:active': { - // opacity: 0.7, - // }, }, divider: { width: 40, @@ -83,10 +75,10 @@ const styles = theme => ({ padding: 20, background: color(theme.styleTypes.primary.accent).darken(0.25).hex(), color: theme.styleTypes.primary.contrast, + position: 'relative', }, content: { padding: 20, - // border: [1, 'solid', 'red'], background: '#EFEFEF', }, simpleCTA: { @@ -97,6 +89,20 @@ const styles = theme => ({ fill: theme.styleTypes.primary.accent, }, }, + bestValue: { + background: theme.styleTypes.success.accent, + color: theme.styleTypes.success.contrast, + right: -66, + top: -40, + height: 'auto', + position: 'absolute', + transform: 'rotateZ(45deg)', + textAlign: 'center', + padding: [5, 50], + transformOrigin: 'left bottom', + fontSize: 12, + boxShadow: '0 2px 6px rgba(0,0,0,0.15)', + }, }); @@ -111,6 +117,8 @@ export default @observer @injectSheet(styles) class PlanItem extends Component { simpleCTA: PropTypes.bool, perUser: PropTypes.bool, classes: PropTypes.object.isRequired, + bestValue: PropTypes.bool, + className: PropTypes.string, children: PropTypes.element, }; @@ -118,6 +126,8 @@ export default @observer @injectSheet(styles) class PlanItem extends Component { simpleCTA: false, perUser: false, children: null, + bestValue: false, + className: '', } static contextTypes = { @@ -135,16 +145,26 @@ export default @observer @injectSheet(styles) class PlanItem extends Component { ctaLabel, simpleCTA, perUser, + bestValue, + className, children, } = this.props; const { intl } = this.context; const priceParts = `${price}`.split('.'); - // const intervalName = i18nIntervalName(PAYMENT_INTERVAL.MONTHLY, intl); return ( -
+
+ {bestValue && ( +
+ {intl.formatMessage(messages.bestValue)} +
+ )}

{name}

{text} diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js index 9cd592083..1a45cf035 100644 --- a/src/features/planSelection/components/PlanSelection.js +++ b/src/features/planSelection/components/PlanSelection.js @@ -137,6 +137,9 @@ const styles = theme => ({ border: '1px solid red', overflow: 'scroll-x', }, + featuredPlan: { + transform: 'scale(1.05)', + }, }); @injectSheet(styles) @observer @@ -197,29 +200,31 @@ class PlanSelection extends Component { /> upgradeAccount(plans.personal.yearly.id)} + className={classes.featuredPlan} + perUser + bestValue > upgradeAccount(plans.personal.yearly.id)} - perUser > diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js index 01b357861..dff9051d8 100644 --- a/src/features/planSelection/containers/PlanSelectionScreen.js +++ b/src/features/planSelection/containers/PlanSelectionScreen.js @@ -43,15 +43,12 @@ class PlanSelectionScreen extends Component { } upgradeAccount(planId) { - const { user, features } = this.props.stores; const { upgradeAccount, hideOverlay } = this.props.actions.planSelection; upgradeAccount({ planId, onCloseWindow: () => { hideOverlay(); - user.getUserInfoRequest.invalidate({ immediately: true }); - features.featuresRequest.invalidate({ immediately: true }); }, }); } @@ -68,17 +65,6 @@ class PlanSelectionScreen extends Component { const { activateTrial } = this.props.actions.user; const { upgradeAccount, downgradeAccount, hideOverlay } = this.props.actions.planSelection; - // const planConfig = [{ - // id: 'free', - // price: 0, - // }, { - // id: plans.personal.yearly.id, - // price: plans.personal.yearly.price, - // }, { - // id: plans.pro.yearly.id, - // price: plans.pro.yearly.price, - // }]; - return ( { + this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); + this.stores.features.featuresRequest.invalidate({ immediately: true }); + onCloseWindow(); }); }; diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 210ea001a..eafac1f87 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -482,55 +482,68 @@ } }, { - "defaultMessage": "!!!Sorry, we could not activate your trial!", + "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", "end": { "column": 3, "line": 38 }, "file": "src/components/auth/Pricing.js", + "id": "pricing.trial.terms.trialWorth", + "start": { + "column": 14, + "line": 35 + } + }, + { + "defaultMessage": "!!!Sorry, we could not activate your trial!", + "end": { + "column": 3, + "line": 42 + }, + "file": "src/components/auth/Pricing.js", "id": "pricing.trial.error", "start": { "column": 19, - "line": 35 + "line": 39 } }, { "defaultMessage": "!!!Start my 14-day Franz Professional Trial", "end": { "column": 3, - "line": 42 + "line": 46 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.cta.accept", "start": { "column": 13, - "line": 39 + "line": 43 } }, { "defaultMessage": "!!!Continue to Franz", "end": { "column": 3, - "line": 46 + "line": 50 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.cta.skip", "start": { "column": 11, - "line": 43 + "line": 47 } }, { "defaultMessage": "!!!Franz Professional includes:", "end": { "column": 3, - "line": 50 + "line": 54 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.features.headline", "start": { "column": 20, - "line": 47 + "line": 51 } } ], @@ -3923,6 +3936,19 @@ "column": 19, "line": 23 } + }, + { + "defaultMessage": "!!!Best value", + "end": { + "column": 3, + "line": 30 + }, + "file": "src/features/planSelection/components/PlanItem.js", + "id": "subscription.bestValue", + "start": { + "column": 13, + "line": 27 + } } ], "path": "src/features/planSelection/components/PlanItem.json" @@ -3933,143 +3959,143 @@ "defaultMessage": "!!!Welcome back, {name}", "end": { "column": 3, - "line": 19 + "line": 20 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.fullscreen.welcome", "start": { "column": 11, - "line": 16 + "line": 17 } }, { "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "end": { "column": 3, - "line": 23 + "line": 24 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.fullscreen.subheadline", "start": { "column": 15, - "line": 20 + "line": 21 } }, { "defaultMessage": "!!!Basic functionality", "end": { "column": 3, - "line": 27 + "line": 28 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.free.text", "start": { "column": 12, - "line": 24 + "line": 25 } }, { "defaultMessage": "!!!More services, no waiting - ideal for personal use.", "end": { "column": 3, - "line": 31 + "line": 32 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.personal.text", "start": { "column": 16, - "line": 28 + "line": 29 } }, { "defaultMessage": "!!!Unlimited services and professional features for you - and your team.", "end": { "column": 3, - "line": 35 + "line": 36 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.pro.text", "start": { "column": 20, - "line": 32 + "line": 33 } }, { "defaultMessage": "!!!Stay on Free", "end": { "column": 3, - "line": 39 + "line": 40 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.stayOnFree", "start": { "column": 17, - "line": 36 + "line": 37 } }, { "defaultMessage": "!!!Downgrade to Free", "end": { "column": 3, - "line": 43 + "line": 44 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.ctaDowngradeFree", "start": { "column": 20, - "line": 40 + "line": 41 } }, { "defaultMessage": "!!!Start my free 14-days Trial", "end": { "column": 3, - "line": 47 + "line": 48 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.trial", "start": { "column": 15, - "line": 44 + "line": 45 } }, { "defaultMessage": "!!!Choose Personal", "end": { "column": 3, - "line": 51 + "line": 52 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.upgradePersonal", "start": { "column": 23, - "line": 48 + "line": 49 } }, { "defaultMessage": "!!!Choose Professional", "end": { "column": 3, - "line": 55 + "line": 56 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.upgradePro", "start": { "column": 18, - "line": 52 + "line": 53 } }, { "defaultMessage": "!!!Complete comparison of all plans", "end": { "column": 3, - "line": 59 + "line": 60 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.fullFeatureList", "start": { "column": 19, - "line": 56 + "line": 57 } } ], @@ -4112,52 +4138,52 @@ "defaultMessage": "!!!Downgrade your Franz Plan", "end": { "column": 3, - "line": 19 + "line": 20 }, "file": "src/features/planSelection/containers/PlanSelectionScreen.js", "id": "feature.planSelection.fullscreen.dialog.title", "start": { "column": 15, - "line": 16 + "line": 17 } }, { "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "end": { "column": 3, - "line": 23 + "line": 24 }, "file": "src/features/planSelection/containers/PlanSelectionScreen.js", "id": "feature.planSelection.fullscreen.dialog.message", "start": { "column": 17, - "line": 20 + "line": 21 } }, { "defaultMessage": "!!!Downgrade to Free", "end": { "column": 3, - "line": 27 + "line": 28 }, "file": "src/features/planSelection/containers/PlanSelectionScreen.js", "id": "feature.planSelection.fullscreen.dialog.cta.downgrade", "start": { "column": 22, - "line": 24 + "line": 25 } }, { "defaultMessage": "!!!Choose Personal", "end": { "column": 3, - "line": 31 + "line": 32 }, "file": "src/features/planSelection/containers/PlanSelectionScreen.js", "id": "feature.planSelection.fullscreen.dialog.cta.upgrade", "start": { "column": 20, - "line": 28 + "line": 29 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index f2fd7a52a..6977ec096 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -170,6 +170,7 @@ "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline": "No strings attached", "pricing.trial.terms.noCreditCard": "No credit card required", + "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)", "service.crashHandler.action": "Reload {name}", "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", "service.crashHandler.headline": "Oh no!", @@ -369,6 +370,7 @@ "signup.link.login": "Already have an account, sign in?", "signup.password.label": "Password", "signup.submit.label": "Create account", + "subscription.bestValue": "Best value", "subscription.cta.activateTrial": "Yes, start the free Franz Professional trial", "subscription.cta.allOptions": "See all options", "subscription.cta.choosePlan": "Choose your plan", @@ -413,4 +415,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} \ No newline at end of file +} diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json index 2d09c9ebb..3f0cf4e86 100644 --- a/src/i18n/messages/src/components/auth/Pricing.json +++ b/src/i18n/messages/src/components/auth/Pricing.json @@ -64,16 +64,29 @@ "column": 3 } }, + { + "id": "pricing.trial.terms.trialWorth", + "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", + "file": "src/components/auth/Pricing.js", + "start": { + "line": 35, + "column": 14 + }, + "end": { + "line": 38, + "column": 3 + } + }, { "id": "pricing.trial.error", "defaultMessage": "!!!Sorry, we could not activate your trial!", "file": "src/components/auth/Pricing.js", "start": { - "line": 35, + "line": 39, "column": 19 }, "end": { - "line": 38, + "line": 42, "column": 3 } }, @@ -82,11 +95,11 @@ "defaultMessage": "!!!Start my 14-day Franz Professional Trial", "file": "src/components/auth/Pricing.js", "start": { - "line": 39, + "line": 43, "column": 13 }, "end": { - "line": 42, + "line": 46, "column": 3 } }, @@ -95,11 +108,11 @@ "defaultMessage": "!!!Continue to Franz", "file": "src/components/auth/Pricing.js", "start": { - "line": 43, + "line": 47, "column": 11 }, "end": { - "line": 46, + "line": 50, "column": 3 } }, @@ -108,11 +121,11 @@ "defaultMessage": "!!!Franz Professional includes:", "file": "src/components/auth/Pricing.js", "start": { - "line": 47, + "line": 51, "column": 20 }, "end": { - "line": 50, + "line": 54, "column": 3 } } diff --git a/src/i18n/messages/src/features/planSelection/components/PlanItem.json b/src/i18n/messages/src/features/planSelection/components/PlanItem.json index 839686390..5a94f32ee 100644 --- a/src/i18n/messages/src/features/planSelection/components/PlanItem.json +++ b/src/i18n/messages/src/features/planSelection/components/PlanItem.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!per month", "file": "src/features/planSelection/components/PlanItem.js", "start": { - "line": 19, + "line": 15, "column": 12 }, "end": { - "line": 22, + "line": 18, "column": 3 } }, @@ -17,9 +17,22 @@ "defaultMessage": "!!!per month & user", "file": "src/features/planSelection/components/PlanItem.js", "start": { - "line": 23, + "line": 19, "column": 19 }, + "end": { + "line": 22, + "column": 3 + } + }, + { + "id": "subscription.bestValue", + "defaultMessage": "!!!Best value", + "file": "src/features/planSelection/components/PlanItem.js", + "start": { + "line": 23, + "column": 13 + }, "end": { "line": 26, "column": 3 -- cgit v1.2.3-54-g00ecf From 0b08e1e7e6a07acd21af71fd27f4c4acfa34dbba Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 16 Oct 2019 15:16:26 +0200 Subject: Add trialStatusBar & polishing --- packages/theme/src/themes/dark/index.ts | 13 +- packages/theme/src/themes/default/index.ts | 11 ++ src/actions/index.js | 2 + src/actions/payment.js | 4 + src/components/layout/AppLayout.js | 2 + src/components/ui/FeatureList.js | 3 +- src/features/planSelection/actions.js | 4 - .../planSelection/components/PlanSelection.js | 2 +- .../containers/PlanSelectionScreen.js | 13 +- src/features/planSelection/store.js | 40 +----- src/features/trialStatusBar/actions.js | 13 ++ .../trialStatusBar/components/ProgressBar.js | 46 +++++++ .../trialStatusBar/components/TrialStatusBar.js | 135 +++++++++++++++++++++ .../containers/TrialStatusBarScreen.js | 101 +++++++++++++++ src/features/trialStatusBar/index.js | 30 +++++ src/features/trialStatusBar/store.js | 72 +++++++++++ src/i18n/locales/defaultMessages.json | 125 +++++++++++++++++-- src/i18n/locales/en-US.json | 7 ++ .../messages/src/components/layout/AppLayout.json | 12 +- .../trialStatusBar/components/TrialStatusBar.json | 41 +++++++ .../containers/TrialStatusBarScreen.json | 54 +++++++++ src/stores/AppStore.js | 14 +++ src/stores/FeaturesStore.js | 2 + src/stores/PaymentStore.js | 37 ++++++ src/stores/UserStore.js | 4 +- 25 files changed, 718 insertions(+), 69 deletions(-) create mode 100644 src/features/trialStatusBar/actions.js create mode 100644 src/features/trialStatusBar/components/ProgressBar.js create mode 100644 src/features/trialStatusBar/components/TrialStatusBar.js create mode 100644 src/features/trialStatusBar/containers/TrialStatusBarScreen.js create mode 100644 src/features/trialStatusBar/index.js create mode 100644 src/features/trialStatusBar/store.js create mode 100644 src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json create mode 100644 src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json (limited to 'src') diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts index 9a66f3463..30cc19d99 100644 --- a/packages/theme/src/themes/dark/index.ts +++ b/packages/theme/src/themes/dark/index.ts @@ -65,7 +65,7 @@ export const selectOptionItemHoverColor = selectColor; export const selectSearchColor = inputBackground; // Modal -export const colorModalOverlayBackground = color(legacyStyles.darkThemeBlack).alpha(0.5).rgb().string(); +export const colorModalOverlayBackground = color(legacyStyles.darkThemeBlack).alpha(0.8).rgb().string(); export const colorModalBackground = legacyStyles.darkThemeGrayDark; // Services @@ -146,3 +146,14 @@ export const todos = merge({}, defaultStyles.todos, { background: legacyStyles.themeGrayLight, }, }); + +// TrialStatusBar +export const trialStatusBar = merge({}, defaultStyles.trialStatusBar, { + bar: { + background: legacyStyles.darkThemeGray, + }, + progressBar: { + background: legacyStyles.darkThemeGrayLighter, + progressIndicator: legacyStyles.darkThemeGrayLightest, + }, +}); diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts index 057fde72f..b484d9972 100644 --- a/packages/theme/src/themes/default/index.ts +++ b/packages/theme/src/themes/default/index.ts @@ -238,3 +238,14 @@ export const todos = { backgroundHover: styleTypes.primary.accent, }, }; + +// TrialStatusBar +export const trialStatusBar = { + bar: { + background: legacyStyles.themeGray, + }, + progressBar: { + background: legacyStyles.themeGrayLight, + progressIndicator: legacyStyles.themeGrayLighter, + }, +}; diff --git a/src/actions/index.js b/src/actions/index.js index 1c033fb96..9d3684edc 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -15,6 +15,7 @@ import announcements from '../features/announcements/actions'; import workspaces from '../features/workspaces/actions'; import todos from '../features/todos/actions'; import planSelection from '../features/planSelection/actions'; +import trialStatusBar from '../features/trialStatusBar/actions'; const actions = Object.assign({}, { service, @@ -35,4 +36,5 @@ export default Object.assign( { workspaces }, { todos }, { planSelection }, + { trialStatusBar }, ); diff --git a/src/actions/payment.js b/src/actions/payment.js index 2aaefc025..f61faf197 100644 --- a/src/actions/payment.js +++ b/src/actions/payment.js @@ -4,5 +4,9 @@ export default { createHostedPage: { planId: PropTypes.string.isRequired, }, + upgradeAccount: { + planId: PropTypes.string.isRequired, + onCloseWindow: PropTypes.func, + }, createDashboardUrl: {}, }; diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index fe81b1911..9b110262a 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -20,6 +20,7 @@ import AppUpdateInfoBar from '../AppUpdateInfoBar'; import TrialActivationInfoBar from '../TrialActivationInfoBar'; import Todos from '../../features/todos/containers/TodosScreen'; import PlanSelection from '../../features/planSelection/containers/PlanSelectionScreen'; +import TrialStatusBar from '../../features/trialStatusBar/containers/TrialStatusBarScreen'; function createMarkup(HTMLString) { return { __html: HTMLString }; @@ -174,6 +175,7 @@ class AppLayout extends Component { {services} {children} +
diff --git a/src/components/ui/FeatureList.js b/src/components/ui/FeatureList.js index 732b40e40..7ba8b54d7 100644 --- a/src/components/ui/FeatureList.js +++ b/src/components/ui/FeatureList.js @@ -72,12 +72,13 @@ export class FeatureList extends Component { static propTypes = { className: PropTypes.string, featureClassName: PropTypes.string, - plan: PropTypes.oneOf(PLANS).isRequired, + plan: PropTypes.oneOf(PLANS), }; static defaultProps = { className: '', featureClassName: '', + plan: false, } static contextTypes = { diff --git a/src/features/planSelection/actions.js b/src/features/planSelection/actions.js index 21aa38ace..83f58bfd7 100644 --- a/src/features/planSelection/actions.js +++ b/src/features/planSelection/actions.js @@ -2,10 +2,6 @@ import PropTypes from 'prop-types'; import { createActionsFromDefinitions } from '../../actions/lib/actions'; export const planSelectionActions = createActionsFromDefinitions({ - upgradeAccount: { - planId: PropTypes.string.isRequired, - onCloseWindow: PropTypes.func.isRequired, - }, downgradeAccount: {}, hideOverlay: {}, }, PropTypes.checkPropTypes); diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js index 1a45cf035..cf4474114 100644 --- a/src/features/planSelection/components/PlanSelection.js +++ b/src/features/planSelection/components/PlanSelection.js @@ -205,7 +205,7 @@ class PlanSelection extends Component { price={plans.pro.yearly.price} currency={currency} ctaLabel={intl.formatMessage(hadSubscription ? messages.shortActionPro : messages.actionTrial)} - upgrade={() => upgradeAccount(plans.personal.yearly.id)} + upgrade={() => upgradeAccount(plans.pro.yearly.id)} className={classes.featuredPlan} perUser bestValue diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js index dff9051d8..6e8cdbf47 100644 --- a/src/features/planSelection/containers/PlanSelectionScreen.js +++ b/src/features/planSelection/containers/PlanSelectionScreen.js @@ -43,13 +43,10 @@ class PlanSelectionScreen extends Component { } upgradeAccount(planId) { - const { upgradeAccount, hideOverlay } = this.props.actions.planSelection; + const { upgradeAccount } = this.props.actions.payment; upgradeAccount({ planId, - onCloseWindow: () => { - hideOverlay(); - }, }); } @@ -63,7 +60,7 @@ class PlanSelectionScreen extends Component { const { user, features } = this.props.stores; const { plans, currency } = features.features.pricingConfig; const { activateTrial } = this.props.actions.user; - const { upgradeAccount, downgradeAccount, hideOverlay } = this.props.actions.planSelection; + const { downgradeAccount, hideOverlay } = this.props.actions.planSelection; return ( @@ -102,7 +99,7 @@ class PlanSelectionScreen extends Component { downgradeAccount(); hideOverlay(); } else { - upgradeAccount(plans.personal.yearly.id); + this.upgradeAccount(plans.personal.yearly.id); gaEvent(GA_CATEGORY_PLAN_SELECTION, 'SelectPlan', 'Revoke'); } @@ -123,8 +120,10 @@ PlanSelectionScreen.wrappedComponent.propTypes = { user: PropTypes.instanceOf(UserStore).isRequired, }).isRequired, actions: PropTypes.shape({ - planSelection: PropTypes.shape({ + payment: PropTypes.shape({ upgradeAccount: PropTypes.func.isRequired, + }), + planSelection: PropTypes.shape({ downgradeAccount: PropTypes.func.isRequired, hideOverlay: PropTypes.func.isRequired, }), diff --git a/src/features/planSelection/store.js b/src/features/planSelection/store.js index e229c37e5..0d4672722 100644 --- a/src/features/planSelection/store.js +++ b/src/features/planSelection/store.js @@ -42,7 +42,6 @@ export default class PlanSelectionStore extends FeatureStore { // ACTIONS this._registerActions(createActionBindings([ - [planSelectionActions.upgradeAccount, this._upgradeAccount], [planSelectionActions.downgradeAccount, this._downgradeAccount], [planSelectionActions.hideOverlay, this._hideOverlay], ])); @@ -64,47 +63,12 @@ export default class PlanSelectionStore extends FeatureStore { @action stop() { super.stop(); debug('PlanSelectionStore::stop'); - this.reset(); this.isFeatureActive = false; } // ========== PRIVATE METHODS ========= // // Actions - - @action _upgradeAccount = ({ planId, onCloseWindow = () => null }) => { - let hostedPageURL = this.stores.features.features.subscribeURL; - - const parsedUrl = new URL(hostedPageURL); - const params = new URLSearchParams(parsedUrl.search.slice(1)); - - params.set('plan', planId); - - hostedPageURL = this.stores.user.getAuthURL(`${parsedUrl.origin}${parsedUrl.pathname}?${params.toString()}`); - - const win = new BrowserWindow({ - parent: remote.getCurrentWindow(), - modal: true, - title: '🔒 Upgrade Your Franz Account', - width: 800, - height: window.innerHeight - 100, - maxWidth: 800, - minWidth: 600, - webPreferences: { - nodeIntegration: true, - webviewTag: true, - }, - }); - win.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPageURL)}`); - - win.on('closed', () => { - this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); - this.stores.features.featuresRequest.invalidate({ immediately: true }); - - onCloseWindow(); - }); - }; - @action _downgradeAccount = () => { downgradeUserRequest.execute(); } @@ -112,4 +76,8 @@ export default class PlanSelectionStore extends FeatureStore { @action _hideOverlay = () => { this.hideOverlay = true; } + + @action _showOverlay = () => { + this.hideOverlay = false; + } } diff --git a/src/features/trialStatusBar/actions.js b/src/features/trialStatusBar/actions.js new file mode 100644 index 000000000..38df76458 --- /dev/null +++ b/src/features/trialStatusBar/actions.js @@ -0,0 +1,13 @@ +import PropTypes from 'prop-types'; +import { createActionsFromDefinitions } from '../../actions/lib/actions'; + +export const trialStatusBarActions = createActionsFromDefinitions({ + upgradeAccount: { + planId: PropTypes.string.isRequired, + onCloseWindow: PropTypes.func.isRequired, + }, + downgradeAccount: {}, + hideOverlay: {}, +}, PropTypes.checkPropTypes); + +export default trialStatusBarActions; diff --git a/src/features/trialStatusBar/components/ProgressBar.js b/src/features/trialStatusBar/components/ProgressBar.js new file mode 100644 index 000000000..80d478d8c --- /dev/null +++ b/src/features/trialStatusBar/components/ProgressBar.js @@ -0,0 +1,46 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import injectSheet from 'react-jss'; + +const styles = theme => ({ + root: { + background: theme.trialStatusBar.progressBar.background, + width: '25%', + maxWidth: 200, + height: 8, + display: 'flex', + alignItems: 'center', + borderRadius: theme.borderRadius, + overflow: 'hidden', + }, + progress: { + background: theme.trialStatusBar.progressBar.progressIndicator, + width: ({ percent }) => `${percent}%`, + height: '100%', + }, +}); + +@injectSheet(styles) @observer +class ProgressBar extends Component { + static propTypes = { + classes: PropTypes.object.isRequired, + percent: PropTypes.number.isRequired, + }; + + render() { + const { + classes, + } = this.props; + + return ( +
+
+
+ ); + } +} + +export default ProgressBar; diff --git a/src/features/trialStatusBar/components/TrialStatusBar.js b/src/features/trialStatusBar/components/TrialStatusBar.js new file mode 100644 index 000000000..b8fe4acc9 --- /dev/null +++ b/src/features/trialStatusBar/components/TrialStatusBar.js @@ -0,0 +1,135 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import injectSheet from 'react-jss'; +import { defineMessages, intlShape } from 'react-intl'; +import { Icon } from '@meetfranz/ui'; +import { mdiArrowRight, mdiWindowClose } from '@mdi/js'; +import classnames from 'classnames'; + +import ProgressBar from './ProgressBar'; + +const messages = defineMessages({ + restTime: { + id: 'feature.trialStatusBar.restTime', + defaultMessage: '!!!Your Free Franz {plan} Trial ends in {time}.', + }, + expired: { + id: 'feature.trialStatusBar.expired', + defaultMessage: '!!!Your free Franz {plan} Trial has expired, please upgrade your account.', + }, + cta: { + id: 'feature.trialStatusBar.cta', + defaultMessage: '!!!Upgrade now', + }, +}); + +const styles = theme => ({ + root: { + background: theme.trialStatusBar.bar.background, + width: '100%', + height: 25, + order: 10, + display: 'flex', + alignItems: 'center', + fontSize: 12, + padding: [0, 10], + justifyContent: 'flex-end', + }, + ended: { + background: theme.styleTypes.warning.accent, + color: theme.styleTypes.warning.contrast, + }, + message: { + marginLeft: 20, + }, + action: { + marginLeft: 20, + fontSize: 12, + color: theme.colorText, + textDecoration: 'underline', + display: 'flex', + + '& svg': { + margin: [1, 2, 0, 0], + }, + }, +}); + +@injectSheet(styles) @observer +class TrialStatusBar extends Component { + static propTypes = { + planName: PropTypes.string.isRequired, + percent: PropTypes.number.isRequired, + upgradeAccount: PropTypes.func.isRequired, + hideOverlay: PropTypes.func.isRequired, + trialEnd: PropTypes.string.isRequired, + hasEnded: PropTypes.bool.isRequired, + classes: PropTypes.object.isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { + planName, + percent, + upgradeAccount, + hideOverlay, + trialEnd, + hasEnded, + classes, + } = this.props; + + const { intl } = this.context; + + return ( +
+ + {' '} + + {!hasEnded ? ( + intl.formatMessage(messages.restTime, { + plan: planName, + time: trialEnd, + }) + ) : ( + intl.formatMessage(messages.expired, { + plan: planName, + }) + )} + + + +
+ ); + } +} + +export default TrialStatusBar; diff --git a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js new file mode 100644 index 000000000..eb0aafaea --- /dev/null +++ b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js @@ -0,0 +1,101 @@ +import React, { Component } from 'react'; +import { observer, inject } from 'mobx-react'; +import PropTypes from 'prop-types'; +import ms from 'ms'; + +import FeaturesStore from '../../../stores/FeaturesStore'; +import UserStore from '../../../stores/UserStore'; +import TrialStatusBar from '../components/TrialStatusBar'; +import ErrorBoundary from '../../../components/util/ErrorBoundary'; +import { trialStatusBarStore } from '..'; + +@inject('stores', 'actions') @observer +class TrialStatusBarScreen extends Component { + state = { + showOverlay: true, + percent: 0, + restTime: '', + hasEnded: false, + }; + + percentInterval = null; + + componentDidMount() { + this.percentInterval = setInterval(() => { + this.calculateRestTime(); + }, ms('1m')); + + this.calculateRestTime(); + } + + componentWillUnmount() { + clearInterval(this.percentInterval); + } + + calculateRestTime() { + const { trialEndTime } = trialStatusBarStore; + const percent = Math.abs(100 - Math.abs(trialEndTime.asMilliseconds()) * 100 / ms('14d')).toFixed(2); + const restTime = trialEndTime.humanize(); + const hasEnded = trialEndTime.asMilliseconds() > 0; + + this.setState({ + percent, + restTime, + hasEnded, + }); + } + + hideOverlay() { + this.setState({ + showOverlay: false, + }); + } + + + render() { + const { + showOverlay, + percent, + restTime, + hasEnded, + } = this.state; + + if (!trialStatusBarStore || !trialStatusBarStore.isFeatureActive || !showOverlay || !trialStatusBarStore.showTrialStatusBarOverlay) { + return null; + } + + const { user } = this.props.stores; + const { upgradeAccount } = this.props.actions.payment; + + console.log('hasEnded', hasEnded); + + return ( + + upgradeAccount({ + planId: user.team.plan, + })} + hideOverlay={() => this.hideOverlay()} + hasEnded={hasEnded} + /> + + ); + } +} + +export default TrialStatusBarScreen; + +TrialStatusBarScreen.wrappedComponent.propTypes = { + stores: PropTypes.shape({ + features: PropTypes.instanceOf(FeaturesStore).isRequired, + user: PropTypes.instanceOf(UserStore).isRequired, + }).isRequired, + actions: PropTypes.shape({ + payment: PropTypes.shape({ + upgradeAccount: PropTypes.func.isRequired, + }), + }).isRequired, +}; diff --git a/src/features/trialStatusBar/index.js b/src/features/trialStatusBar/index.js new file mode 100644 index 000000000..ec84cdfd7 --- /dev/null +++ b/src/features/trialStatusBar/index.js @@ -0,0 +1,30 @@ +import { reaction } from 'mobx'; +import TrialStatusBarStore from './store'; + +const debug = require('debug')('Franz:feature:trialStatusBar'); + +export const GA_CATEGORY_TRIAL_STATUS_BAR = 'trialStatusBar'; + +export const trialStatusBarStore = new TrialStatusBarStore(); + +export default function initTrialStatusBar(stores, actions) { + stores.trialStatusBar = trialStatusBarStore; + const { features } = stores; + + // Toggle trialStatusBar feature + reaction( + () => features.features.isTrialStatusBarEnabled, + (isEnabled) => { + if (isEnabled) { + debug('Initializing `trialStatusBar` feature'); + trialStatusBarStore.start(stores, actions); + } else if (trialStatusBarStore.isFeatureActive) { + debug('Disabling `trialStatusBar` feature'); + trialStatusBarStore.stop(); + } + }, + { + fireImmediately: true, + }, + ); +} diff --git a/src/features/trialStatusBar/store.js b/src/features/trialStatusBar/store.js new file mode 100644 index 000000000..89cf32392 --- /dev/null +++ b/src/features/trialStatusBar/store.js @@ -0,0 +1,72 @@ +import { + action, + observable, + computed, +} from 'mobx'; +import moment from 'moment'; + +import { trialStatusBarActions } from './actions'; +import { FeatureStore } from '../utils/FeatureStore'; +import { createActionBindings } from '../utils/ActionBinding'; + +const debug = require('debug')('Franz:feature:trialStatusBar:store'); + +export default class TrialStatusBarStore extends FeatureStore { + @observable isFeatureActive = false; + + @observable isFeatureEnabled = false; + + @computed get showTrialStatusBarOverlay() { + if (this.isFeatureActive) { + const { team } = this.stores.user; + if (team && !this.hideOverlay) { + return team.state !== 'expired' && team.isTrial; + } + } + + return false; + } + + @computed get trialEndTime() { + if (this.isFeatureActive) { + const { team } = this.stores.user; + + if (team && !this.hideOverlay) { + return moment.duration(moment().diff(team.trialEnd)); + } + } + + return moment.duration(); + } + + // ========== PUBLIC API ========= // + + @action start(stores, actions, api) { + debug('TrialStatusBarStore::start'); + this.stores = stores; + this.actions = actions; + this.api = api; + + // ACTIONS + + this._registerActions(createActionBindings([ + [trialStatusBarActions.hideOverlay, this._hideOverlay], + ])); + + this.isFeatureActive = true; + } + + @action stop() { + super.stop(); + debug('TrialStatusBarStore::stop'); + this.isFeatureActive = false; + } + + // ========== PRIVATE METHODS ========= // + + // Actions + + @action _hideOverlay = () => { + this.hideOverlay = true; + } +} diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index eafac1f87..98f37cf8a 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -734,39 +734,39 @@ "defaultMessage": "!!!Your services have been updated.", "end": { "column": 3, - "line": 32 + "line": 33 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.servicesUpdated", "start": { "column": 19, - "line": 29 + "line": 30 } }, { "defaultMessage": "!!!Reload services", "end": { "column": 3, - "line": 36 + "line": 37 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.buttonReloadServices", "start": { "column": 24, - "line": 33 + "line": 34 } }, { "defaultMessage": "!!!Could not load services and user information", "end": { "column": 3, - "line": 40 + "line": 41 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.requiredRequestsFailed", "start": { "column": 26, - "line": 37 + "line": 38 } } ], @@ -3915,39 +3915,39 @@ "defaultMessage": "!!!per month", "end": { "column": 3, - "line": 22 + "line": 18 }, "file": "src/features/planSelection/components/PlanItem.js", "id": "subscription.interval.perMonth", "start": { "column": 12, - "line": 19 + "line": 15 } }, { "defaultMessage": "!!!per month & user", "end": { "column": 3, - "line": 26 + "line": 22 }, "file": "src/features/planSelection/components/PlanItem.js", "id": "subscription.interval.perMonthPerUser", "start": { "column": 19, - "line": 23 + "line": 19 } }, { "defaultMessage": "!!!Best value", "end": { "column": 3, - "line": 30 + "line": 26 }, "file": "src/features/planSelection/components/PlanItem.js", "id": "subscription.bestValue", "start": { "column": 13, - "line": 27 + "line": 23 } } ], @@ -4378,6 +4378,107 @@ ], "path": "src/features/todos/components/TodosWebview.json" }, + { + "descriptors": [ + { + "defaultMessage": "!!!Your Free Franz {plan} Trial ends in {time}.", + "end": { + "column": 3, + "line": 16 + }, + "file": "src/features/trialStatusBar/components/TrialStatusBar.js", + "id": "feature.trialStatusBar.restTime", + "start": { + "column": 12, + "line": 13 + } + }, + { + "defaultMessage": "!!!Your free Franz {plan} Trial has expired, please upgrade your account.", + "end": { + "column": 3, + "line": 20 + }, + "file": "src/features/trialStatusBar/components/TrialStatusBar.js", + "id": "feature.trialStatusBar.expired", + "start": { + "column": 11, + "line": 17 + } + }, + { + "defaultMessage": "!!!Upgrade now", + "end": { + "column": 3, + "line": 24 + }, + "file": "src/features/trialStatusBar/components/TrialStatusBar.js", + "id": "feature.trialStatusBar.cta", + "start": { + "column": 7, + "line": 21 + } + } + ], + "path": "src/features/trialStatusBar/components/TrialStatusBar.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Downgrade your Franz Plan", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js", + "id": "feature.trialStatusBar.fullscreen.dialog.title", + "start": { + "column": 15, + "line": 16 + } + }, + { + "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js", + "id": "feature.trialStatusBar.fullscreen.dialog.message", + "start": { + "column": 17, + "line": 20 + } + }, + { + "defaultMessage": "!!!Downgrade to Free", + "end": { + "column": 3, + "line": 27 + }, + "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js", + "id": "feature.trialStatusBar.fullscreen.dialog.cta.downgrade", + "start": { + "column": 22, + "line": 24 + } + }, + { + "defaultMessage": "!!!Choose Personal", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js", + "id": "feature.trialStatusBar.fullscreen.dialog.cta.upgrade", + "start": { + "column": 20, + "line": 28 + } + } + ], + "path": "src/features/trialStatusBar/containers/TrialStatusBarScreen.json" + }, { "descriptors": [ { diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 6977ec096..1ba91bdfa 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -35,6 +35,13 @@ "feature.todos.premium.info": "Franz Todos are available to premium users now!", "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.", "feature.todos.premium.upgrade": "Upgrade Account", + "feature.trialStatusBar.cta": "Upgrade now", + "feature.trialStatusBar.expired": "Your free Franz {plan} Trial has expired, please upgrade your account.", + "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free", + "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal", + "feature.trialStatusBar.fullscreen.dialog.message": "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", + "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Franz Plan", + "feature.trialStatusBar.restTime": "Your Free Franz {plan} Trial ends in {time}.", "global.api.unhealthy": "Can't connect to Franz online services", "global.franzProRequired": "Franz Professional Required", "global.notConnectedToTheInternet": "You are not connected to the internet.", diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json index 22f11cedd..95da24042 100644 --- a/src/i18n/messages/src/components/layout/AppLayout.json +++ b/src/i18n/messages/src/components/layout/AppLayout.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Your services have been updated.", "file": "src/components/layout/AppLayout.js", "start": { - "line": 29, + "line": 30, "column": 19 }, "end": { - "line": 32, + "line": 33, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!Reload services", "file": "src/components/layout/AppLayout.js", "start": { - "line": 33, + "line": 34, "column": 24 }, "end": { - "line": 36, + "line": 37, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Could not load services and user information", "file": "src/components/layout/AppLayout.js", "start": { - "line": 37, + "line": 38, "column": 26 }, "end": { - "line": 40, + "line": 41, "column": 3 } } diff --git a/src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json b/src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json new file mode 100644 index 000000000..bf211a016 --- /dev/null +++ b/src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json @@ -0,0 +1,41 @@ +[ + { + "id": "feature.trialStatusBar.restTime", + "defaultMessage": "!!!Your Free Franz {plan} Trial ends in {time}.", + "file": "src/features/trialStatusBar/components/TrialStatusBar.js", + "start": { + "line": 13, + "column": 12 + }, + "end": { + "line": 16, + "column": 3 + } + }, + { + "id": "feature.trialStatusBar.expired", + "defaultMessage": "!!!Your free Franz {plan} Trial has expired, please upgrade your account.", + "file": "src/features/trialStatusBar/components/TrialStatusBar.js", + "start": { + "line": 17, + "column": 11 + }, + "end": { + "line": 20, + "column": 3 + } + }, + { + "id": "feature.trialStatusBar.cta", + "defaultMessage": "!!!Upgrade now", + "file": "src/features/trialStatusBar/components/TrialStatusBar.js", + "start": { + "line": 21, + "column": 7 + }, + "end": { + "line": 24, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json b/src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json new file mode 100644 index 000000000..306cd0fee --- /dev/null +++ b/src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json @@ -0,0 +1,54 @@ +[ + { + "id": "feature.trialStatusBar.fullscreen.dialog.title", + "defaultMessage": "!!!Downgrade your Franz Plan", + "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js", + "start": { + "line": 16, + "column": 15 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "feature.trialStatusBar.fullscreen.dialog.message", + "defaultMessage": "!!!You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", + "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js", + "start": { + "line": 20, + "column": 17 + }, + "end": { + "line": 23, + "column": 3 + } + }, + { + "id": "feature.trialStatusBar.fullscreen.dialog.cta.downgrade", + "defaultMessage": "!!!Downgrade to Free", + "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js", + "start": { + "line": 24, + "column": 22 + }, + "end": { + "line": 27, + "column": 3 + } + }, + { + "id": "feature.trialStatusBar.fullscreen.dialog.cta.upgrade", + "defaultMessage": "!!!Choose Personal", + "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js", + "start": { + "line": 28, + "column": 20 + }, + "end": { + "line": 31, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index f102fc370..329c43f32 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -81,6 +81,8 @@ export default class AppStore extends Store { dictionaries = []; + fetchDataInterval = null; + constructor(...args) { super(...args); @@ -102,6 +104,7 @@ export default class AppStore extends Store { this._setLocale.bind(this), this._muteAppHandler.bind(this), this._handleFullScreen.bind(this), + this._handleLogout.bind(this), ]); } @@ -129,6 +132,11 @@ export default class AppStore extends Store { this._systemDND(); setInterval(() => this._systemDND(), ms('5s')); + this.fetchDataInterval = setInterval(() => { + this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); + this.stores.features.featuresRequest.invalidate({ immediately: true }); + }, ms('10s')); + // Check for updates once every 4 hours setInterval(() => this._checkForUpdates(), CHECK_INTERVAL); // Check for an update in 30s (need a delay to prevent Squirrel Installer lock file issues) @@ -430,6 +438,12 @@ export default class AppStore extends Store { } } + _handleLogout() { + if (!this.stores.user.isLoggedIn) { + clearInterval(this.fetchDataInterval); + } + } + // Helpers _appStartsCounter() { this.actions.settings.update({ diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index bffcb01bc..5d379fd3e 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js @@ -20,6 +20,7 @@ import serviceLimit from '../features/serviceLimit'; import communityRecipes from '../features/communityRecipes'; import todos from '../features/todos'; import planSelection from '../features/planSelection'; +import trialStatusBar from '../features/trialStatusBar'; import { DEFAULT_FEATURES_CONFIG } from '../config'; @@ -83,5 +84,6 @@ export default class FeaturesStore extends Store { communityRecipes(this.stores, this.actions); todos(this.stores, this.actions); planSelection(this.stores, this.actions); + trialStatusBar(this.stores, this.actions); } } diff --git a/src/stores/PaymentStore.js b/src/stores/PaymentStore.js index d4de476c8..b90e8f006 100644 --- a/src/stores/PaymentStore.js +++ b/src/stores/PaymentStore.js @@ -1,10 +1,13 @@ import { action, observable, computed } from 'mobx'; +import { remote } from 'electron'; import Store from './lib/Store'; import CachedRequest from './lib/CachedRequest'; import Request from './lib/Request'; import { gaEvent } from '../lib/analytics'; +const { BrowserWindow } = remote; + export default class PaymentStore extends Store { @observable plansRequest = new CachedRequest(this.api.payment, 'plans'); @@ -14,6 +17,7 @@ export default class PaymentStore extends Store { super(...args); this.actions.payment.createHostedPage.listen(this._createHostedPage.bind(this)); + this.actions.payment.upgradeAccount.listen(this._upgradeAccount.bind(this)); } @computed get plan() { @@ -30,4 +34,37 @@ export default class PaymentStore extends Store { return request; } + + @action _upgradeAccount({ planId, onCloseWindow = () => null }) { + let hostedPageURL = this.stores.features.features.subscribeURL; + + const parsedUrl = new URL(hostedPageURL); + const params = new URLSearchParams(parsedUrl.search.slice(1)); + + params.set('plan', planId); + + hostedPageURL = this.stores.user.getAuthURL(`${parsedUrl.origin}${parsedUrl.pathname}?${params.toString()}`); + + const win = new BrowserWindow({ + parent: remote.getCurrentWindow(), + modal: true, + title: '🔒 Upgrade Your Franz Account', + width: 800, + height: window.innerHeight - 100, + maxWidth: 800, + minWidth: 600, + webPreferences: { + nodeIntegration: true, + webviewTag: true, + }, + }); + win.loadURL(`file://${__dirname}/../index.html#/payment/${encodeURIComponent(hostedPageURL)}`); + + win.on('closed', () => { + this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); + this.stores.features.featuresRequest.invalidate({ immediately: true }); + + onCloseWindow(); + }); + } } diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js index b652098f9..735e8f886 100644 --- a/src/stores/UserStore.js +++ b/src/stores/UserStore.js @@ -77,6 +77,8 @@ export default class UserStore extends Store { @observable logoutReason = null; + fetchUserInfoInterval = null; + constructor(...args) { super(...args); @@ -161,7 +163,7 @@ export default class UserStore extends Store { } @computed get isPremiumOverride() { - return ((!this.team || !this.team.plan) && this.isPremium) || (this.team.state === 'expired' && this.isPremium); + return ((!this.team || !this.team.plan) && this.isPremium) || (this.team && this.team.state === 'expired' && this.isPremium); } @computed get isPersonal() { -- cgit v1.2.3-54-g00ecf From fad0c62765b697e2a973368ff4cca862f99e70c9 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 16 Oct 2019 15:29:19 +0200 Subject: fix linting issues --- src/features/planSelection/store.js | 15 --------------- src/features/trialStatusBar/components/ProgressBar.js | 1 - 2 files changed, 16 deletions(-) (limited to 'src') diff --git a/src/features/planSelection/store.js b/src/features/planSelection/store.js index 0d4672722..8622d4e5a 100644 --- a/src/features/planSelection/store.js +++ b/src/features/planSelection/store.js @@ -3,18 +3,14 @@ import { observable, computed, } from 'mobx'; -import { remote } from 'electron'; import { planSelectionActions } from './actions'; import { FeatureStore } from '../utils/FeatureStore'; -// import { createReactions } from '../../stores/lib/Reaction'; import { createActionBindings } from '../utils/ActionBinding'; import { downgradeUserRequest } from './api'; const debug = require('debug')('Franz:feature:planSelection:store'); -const { BrowserWindow } = remote; - export default class PlanSelectionStore extends FeatureStore { @observable isFeatureEnabled = false; @@ -46,17 +42,6 @@ export default class PlanSelectionStore extends FeatureStore { [planSelectionActions.hideOverlay, this._hideOverlay], ])); - // REACTIONS - - // this._allReactions = createReactions([ - // this._setFeatureEnabledReaction, - // this._updateTodosConfig, - // this._firstLaunchReaction, - // this._routeCheckReaction, - // ]); - - // this._registerReactions(this._allReactions); - this.isFeatureActive = true; } diff --git a/src/features/trialStatusBar/components/ProgressBar.js b/src/features/trialStatusBar/components/ProgressBar.js index 80d478d8c..41b74d396 100644 --- a/src/features/trialStatusBar/components/ProgressBar.js +++ b/src/features/trialStatusBar/components/ProgressBar.js @@ -25,7 +25,6 @@ const styles = theme => ({ class ProgressBar extends Component { static propTypes = { classes: PropTypes.object.isRequired, - percent: PropTypes.number.isRequired, }; render() { -- cgit v1.2.3-54-g00ecf From 55f833c6e5cdbc9679795699433065afb7046d5b Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 16 Oct 2019 16:13:52 +0200 Subject: Update text --- src/i18n/locales/en-US.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 1ba91bdfa..16f4bff46 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -2,12 +2,12 @@ "app.errorHandler.action": "Reload", "app.errorHandler.headline": "Something went wrong", "feature.announcements.changelog.headline": "Changes in Franz {version}", - "feature.delayApp.headline": "Please purchase a Franz Supporter License to skip waiting", + "feature.delayApp.headline": "Upgrade your Franz plan to skip the wait", "feature.delayApp.text": "Franz will continue in {seconds} seconds.", "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort": "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline": "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action": "Get a Franz Supporter License", + "feature.delayApp.trial.headline": "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action": "Upgrade Franz", "feature.delayApp.upgrade.actionShort": "Upgrade account", "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free", "feature.planSelection.cta.stayOnFree": "Stay on Free", -- cgit v1.2.3-54-g00ecf From 8c194bb9c5423fb9b44d11609dae72ac8497eb85 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 16 Oct 2019 16:54:59 +0200 Subject: add space --- src/components/settings/account/AccountDashboard.js | 1 + src/i18n/locales/en-US.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js index 9a1b31d0f..776a8fd08 100644 --- a/src/components/settings/account/AccountDashboard.js +++ b/src/components/settings/account/AccountDashboard.js @@ -218,6 +218,7 @@ class AccountDashboard extends Component {

Franz + {' '} {isPremiumOverrideUser ? 'Premium' : planName} {user.team.isTrial && ( <> diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 16f4bff46..ce35c29a8 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -422,4 +422,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf From 066dd3639676c07ed61f9d8eb3f1a1f85cae9db4 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 16 Oct 2019 22:05:07 +0200 Subject: polishing --- src/features/delayApp/Component.js | 2 +- src/i18n/messages/src/features/delayApp/Component.json | 2 +- src/styles/settings.scss | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/features/delayApp/Component.js b/src/features/delayApp/Component.js index 6344edb89..fcc27c75c 100644 --- a/src/features/delayApp/Component.js +++ b/src/features/delayApp/Component.js @@ -24,7 +24,7 @@ const messages = defineMessages({ }, action: { id: 'feature.delayApp.upgrade.action', - defaultMessage: '!!!Get a Franz Supporter License', + defaultMessage: '!!!Upgrade Franz', }, actionTrial: { id: 'feature.delayApp.trial.action', diff --git a/src/i18n/messages/src/features/delayApp/Component.json b/src/i18n/messages/src/features/delayApp/Component.json index 0d345a47b..f6bf9369a 100644 --- a/src/i18n/messages/src/features/delayApp/Component.json +++ b/src/i18n/messages/src/features/delayApp/Component.json @@ -27,7 +27,7 @@ }, { "id": "feature.delayApp.upgrade.action", - "defaultMessage": "!!!Get a Franz Supporter License", + "defaultMessage": "!!!Upgrade Franz", "file": "src/features/delayApp/Component.js", "start": { "line": 25, diff --git a/src/styles/settings.scss b/src/styles/settings.scss index bb95ab5d2..150d58e76 100644 --- a/src/styles/settings.scss +++ b/src/styles/settings.scss @@ -366,7 +366,7 @@ .account__subscription-button { margin-left: auto; } .franz-form__button { white-space: nowrap; } div { height: auto; } - [data-type="franz-button"] div { height: 100% } + [data-type="franz-button"] div { height: 20px } .invoices { width: 100%; -- cgit v1.2.3-54-g00ecf From c8457a6e48a384c8ae2f2d206558759bc12f519c Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 16 Oct 2019 22:05:13 +0200 Subject: fix interval time --- src/stores/AppStore.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index 329c43f32..ca5cad836 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -135,7 +135,8 @@ export default class AppStore extends Store { this.fetchDataInterval = setInterval(() => { this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); this.stores.features.featuresRequest.invalidate({ immediately: true }); - }, ms('10s')); + this.stores.news.latestNewsRequest.invalidate({ immediately: true }); + }, ms('10m')); // Check for updates once every 4 hours setInterval(() => this._checkForUpdates(), CHECK_INTERVAL); -- cgit v1.2.3-54-g00ecf From 800ef0bad64d21e2f4c93221f984dafe6fee7bec Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 16 Oct 2019 22:09:50 +0200 Subject: Update defaultMessages.json --- src/i18n/locales/defaultMessages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 98f37cf8a..cd876c0ea 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3868,7 +3868,7 @@ } }, { - "defaultMessage": "!!!Get a Franz Supporter License", + "defaultMessage": "!!!Upgrade Franz", "end": { "column": 3, "line": 28 -- cgit v1.2.3-54-g00ecf From 86b692b8e6c9710f216b17a04d96a815a8715387 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 16 Oct 2019 22:24:40 +0200 Subject: polishing --- src/components/settings/account/AccountDashboard.js | 8 +++++--- src/containers/settings/AccountScreen.js | 7 +++++-- src/features/trialStatusBar/containers/TrialStatusBarScreen.js | 2 -- 3 files changed, 10 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js index 776a8fd08..b4ff072ab 100644 --- a/src/components/settings/account/AccountDashboard.js +++ b/src/components/settings/account/AccountDashboard.js @@ -242,14 +242,16 @@ class AccountDashboard extends Component {

)} -
- {!isProUser && ( + {!isProUser && ( +
+ )} +
diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js index ff378bd8b..55811ed23 100644 --- a/src/containers/auth/PricingScreen.js +++ b/src/containers/auth/PricingScreen.js @@ -20,14 +20,19 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend } = this.props; const { activateTrialRequest } = stores.user; - const { defaultTrialPlan } = stores.features.features; + const { defaultTrialPlan, canSkipTrial } = stores.features.anonymousFeatures; - actions.user.activateTrial({ planId: defaultTrialPlan }); - await activateTrialRequest._promise; - - if (!activateTrialRequest.isError) { + if (!canSkipTrial) { stores.router.push('/'); stores.user.hasCompletedSignup = true; + } else { + actions.user.activateTrial({ planId: defaultTrialPlan }); + await activateTrialRequest._promise; + + if (!activateTrialRequest.isError) { + stores.router.push('/'); + stores.user.hasCompletedSignup = true; + } } } @@ -43,7 +48,7 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend const { pricingConfig } = features; let currency = '$'; - let price = '5.99'; + let price = 5.99; if (pricingConfig) { ({ currency } = pricingConfig); ({ price } = pricingConfig.plans.pro.yearly); diff --git a/src/containers/auth/SignupScreen.js b/src/containers/auth/SignupScreen.js index efc7ea4c1..f93498be2 100644 --- a/src/containers/auth/SignupScreen.js +++ b/src/containers/auth/SignupScreen.js @@ -4,6 +4,7 @@ import { inject, observer } from 'mobx-react'; import Signup from '../../components/auth/Signup'; import UserStore from '../../stores/UserStore'; +import FeaturesStore from '../../stores/FeaturesStore'; import { globalError as globalErrorPropType } from '../../prop-types'; @@ -12,11 +13,27 @@ export default @inject('stores', 'actions') @observer class SignupScreen extends error: globalErrorPropType.isRequired, }; + onSignup(values) { + const { actions, stores } = this.props; + + const { canSkipTrial, defaultTrialPlan, pricingConfig } = stores.features.anonymousFeatures; + + if (!canSkipTrial) { + Object.assign(values, { + plan: defaultTrialPlan, + currency: pricingConfig.currencyID, + }); + } + + actions.user.signup(values); + } + render() { - const { actions, stores, error } = this.props; + const { stores, error } = this.props; + return ( this.onSignup(values)} isSubmitting={stores.user.signupRequest.isExecuting} loginRoute={stores.user.loginRoute} error={error} @@ -33,5 +50,6 @@ SignupScreen.wrappedComponent.propTypes = { }).isRequired, stores: PropTypes.shape({ user: PropTypes.instanceOf(UserStore).isRequired, + features: PropTypes.instanceOf(FeaturesStore).isRequired, }).isRequired, }; diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index cd876c0ea..e46c69d67 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -417,133 +417,185 @@ { "descriptors": [ { - "defaultMessage": "!!!Franz Professional", + "defaultMessage": "!!!Hi {name}, welcome to Franz", "end": { "column": 3, "line": 18 }, "file": "src/components/auth/Pricing.js", - "id": "pricing.trial.headline", + "id": "pricing.trial.headline.pro", "start": { "column": 12, "line": 15 } }, { - "defaultMessage": "!!!Here's a special welcome for you:", + "defaultMessage": "!!!We have a special treat for you.", "end": { "column": 3, "line": 22 }, "file": "src/components/auth/Pricing.js", + "id": "pricing.trial.intro.specialTreat", + "start": { + "column": 16, + "line": 19 + } + }, + { + "defaultMessage": "!!!Try out the full Franz Professional experience completely free for 14 days.", + "end": { + "column": 3, + "line": 26 + }, + "file": "src/components/auth/Pricing.js", + "id": "pricing.trial.intro.tryPro", + "start": { + "column": 10, + "line": 23 + } + }, + { + "defaultMessage": "!!!Happy messaging,", + "end": { + "column": 3, + "line": 30 + }, + "file": "src/components/auth/Pricing.js", + "id": "pricing.trial.intro.happyMessaging", + "start": { + "column": 18, + "line": 27 + } + }, + { + "defaultMessage": "!!!Here's a special welcome for you:", + "end": { + "column": 3, + "line": 34 + }, + "file": "src/components/auth/Pricing.js", "id": "pricing.trial.subheadline", "start": { "column": 17, - "line": 19 + "line": 31 } }, { "defaultMessage": "!!!No strings attached", "end": { "column": 3, - "line": 26 + "line": 38 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.terms.headline", "start": { "column": 29, - "line": 23 + "line": 35 } }, { "defaultMessage": "!!!No credit card required", "end": { "column": 3, - "line": 30 + "line": 42 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.terms.noCreditCard", "start": { "column": 16, - "line": 27 + "line": 39 } }, { "defaultMessage": "!!!Your free trial ends automatically after 14 days", "end": { "column": 3, - "line": 34 + "line": 46 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.terms.automaticTrialEnd", "start": { "column": 21, - "line": 31 + "line": 43 } }, { "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", "end": { "column": 3, - "line": 38 + "line": 50 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.terms.trialWorth", "start": { "column": 14, - "line": 35 + "line": 47 } }, { "defaultMessage": "!!!Sorry, we could not activate your trial!", "end": { "column": 3, - "line": 42 + "line": 54 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.error", "start": { "column": 19, - "line": 39 + "line": 51 } }, { "defaultMessage": "!!!Start my 14-day Franz Professional Trial", "end": { "column": 3, - "line": 46 + "line": 58 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.cta.accept", "start": { "column": 13, - "line": 43 + "line": 55 + } + }, + { + "defaultMessage": "!!!Start using Franz", + "end": { + "column": 3, + "line": 62 + }, + "file": "src/components/auth/Pricing.js", + "id": "pricing.trial.cta.start", + "start": { + "column": 12, + "line": 59 } }, { "defaultMessage": "!!!Continue to Franz", "end": { "column": 3, - "line": 50 + "line": 66 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.cta.skip", "start": { "column": 11, - "line": 47 + "line": 63 } }, { "defaultMessage": "!!!Franz Professional includes:", "end": { "column": 3, - "line": 54 + "line": 70 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.features.headline", "start": { "column": 20, - "line": 51 + "line": 67 } } ], @@ -3956,7 +4008,7 @@ { "descriptors": [ { - "defaultMessage": "!!!Welcome back, {name}", + "defaultMessage": "!!!Are you ready to choose, {name}", "end": { "column": 3, "line": 20 diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 8af42554b..6b0aebb13 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -170,9 +170,13 @@ "pricing.plan.pro-yearly": "Professional Yearly", "pricing.trial.cta.accept": "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip": "Continue to Franz", + "pricing.trial.cta.start": "Start using Franz", "pricing.trial.error": "Sorry, we could not activate your trial!", "pricing.trial.features.headline": "Franz Professional includes:", - "pricing.trial.headline": "Franz Professional", + "pricing.trial.headline.pro": "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging": "Happy messaging,", + "pricing.trial.intro.specialTreat": "We have a special treat for you.", + "pricing.trial.intro.tryPro": "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.subheadline": "Here's a special welcome for you:", "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline": "No strings attached", diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json index 3f0cf4e86..6db39148c 100644 --- a/src/i18n/messages/src/components/auth/Pricing.json +++ b/src/i18n/messages/src/components/auth/Pricing.json @@ -1,7 +1,7 @@ [ { - "id": "pricing.trial.headline", - "defaultMessage": "!!!Franz Professional", + "id": "pricing.trial.headline.pro", + "defaultMessage": "!!!Hi {name}, welcome to Franz", "file": "src/components/auth/Pricing.js", "start": { "line": 15, @@ -13,28 +13,54 @@ } }, { - "id": "pricing.trial.subheadline", - "defaultMessage": "!!!Here's a special welcome for you:", + "id": "pricing.trial.intro.specialTreat", + "defaultMessage": "!!!We have a special treat for you.", "file": "src/components/auth/Pricing.js", "start": { "line": 19, - "column": 17 + "column": 16 }, "end": { "line": 22, "column": 3 } }, + { + "id": "pricing.trial.intro.tryPro", + "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.", + "file": "src/components/auth/Pricing.js", + "start": { + "line": 23, + "column": 10 + }, + "end": { + "line": 26, + "column": 3 + } + }, + { + "id": "pricing.trial.intro.happyMessaging", + "defaultMessage": "!!!Happy messaging,", + "file": "src/components/auth/Pricing.js", + "start": { + "line": 27, + "column": 18 + }, + "end": { + "line": 30, + "column": 3 + } + }, { "id": "pricing.trial.terms.headline", "defaultMessage": "!!!No strings attached", "file": "src/components/auth/Pricing.js", "start": { - "line": 23, + "line": 31, "column": 29 }, "end": { - "line": 26, + "line": 34, "column": 3 } }, @@ -43,11 +69,11 @@ "defaultMessage": "!!!No credit card required", "file": "src/components/auth/Pricing.js", "start": { - "line": 27, + "line": 35, "column": 16 }, "end": { - "line": 30, + "line": 38, "column": 3 } }, @@ -56,11 +82,11 @@ "defaultMessage": "!!!Your free trial ends automatically after 14 days", "file": "src/components/auth/Pricing.js", "start": { - "line": 31, + "line": 39, "column": 21 }, "end": { - "line": 34, + "line": 42, "column": 3 } }, @@ -69,11 +95,11 @@ "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", "file": "src/components/auth/Pricing.js", "start": { - "line": 35, + "line": 43, "column": 14 }, "end": { - "line": 38, + "line": 46, "column": 3 } }, @@ -82,11 +108,11 @@ "defaultMessage": "!!!Sorry, we could not activate your trial!", "file": "src/components/auth/Pricing.js", "start": { - "line": 39, + "line": 47, "column": 19 }, "end": { - "line": 42, + "line": 50, "column": 3 } }, @@ -95,11 +121,24 @@ "defaultMessage": "!!!Start my 14-day Franz Professional Trial", "file": "src/components/auth/Pricing.js", "start": { - "line": 43, + "line": 51, "column": 13 }, "end": { - "line": 46, + "line": 54, + "column": 3 + } + }, + { + "id": "pricing.trial.cta.start", + "defaultMessage": "!!!Start using Franz", + "file": "src/components/auth/Pricing.js", + "start": { + "line": 55, + "column": 12 + }, + "end": { + "line": 58, "column": 3 } }, @@ -108,11 +147,11 @@ "defaultMessage": "!!!Continue to Franz", "file": "src/components/auth/Pricing.js", "start": { - "line": 47, + "line": 59, "column": 11 }, "end": { - "line": 50, + "line": 62, "column": 3 } }, @@ -121,11 +160,11 @@ "defaultMessage": "!!!Franz Professional includes:", "file": "src/components/auth/Pricing.js", "start": { - "line": 51, + "line": 63, "column": 20 }, "end": { - "line": 54, + "line": 66, "column": 3 } } diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index 5d379fd3e..adbd401b4 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js @@ -67,6 +67,7 @@ export default class FeaturesStore extends Store { if (this.stores.user.isLoggedIn) { this.featuresRequest.invalidate({ immediately: true }); } else { + this.defaultFeaturesRequest.execute(); this.defaultFeaturesRequest.invalidate({ immediately: true }); } } diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js index 735e8f886..297ea1121 100644 --- a/src/stores/UserStore.js +++ b/src/stores/UserStore.js @@ -205,7 +205,7 @@ export default class UserStore extends Store { } @action async _signup({ - firstname, lastname, email, password, accountType, company, + firstname, lastname, email, password, accountType, company, plan, currency, }) { const authToken = await this.signupRequest.execute({ firstname, @@ -215,6 +215,8 @@ export default class UserStore extends Store { accountType, company, locale: this.stores.app.locale, + plan, + currency, }); this.hasCompletedSignup = false; -- cgit v1.2.3-54-g00ecf From 501790b55625a59831e369ed263f14c72164fa70 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Thu, 17 Oct 2019 14:14:24 +0200 Subject: update strings --- src/i18n/locales/defaultMessages.json | 51 +++++++++++++---------------------- src/i18n/locales/en-US.json | 3 +-- 2 files changed, 20 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index e46c69d67..e283614d2 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -443,7 +443,7 @@ } }, { - "defaultMessage": "!!!Try out the full Franz Professional experience completely free for 14 days.", + "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.", "end": { "column": 3, "line": 26 @@ -468,134 +468,121 @@ "line": 27 } }, - { - "defaultMessage": "!!!Here's a special welcome for you:", - "end": { - "column": 3, - "line": 34 - }, - "file": "src/components/auth/Pricing.js", - "id": "pricing.trial.subheadline", - "start": { - "column": 17, - "line": 31 - } - }, { "defaultMessage": "!!!No strings attached", "end": { "column": 3, - "line": 38 + "line": 34 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.terms.headline", "start": { "column": 29, - "line": 35 + "line": 31 } }, { "defaultMessage": "!!!No credit card required", "end": { "column": 3, - "line": 42 + "line": 38 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.terms.noCreditCard", "start": { "column": 16, - "line": 39 + "line": 35 } }, { "defaultMessage": "!!!Your free trial ends automatically after 14 days", "end": { "column": 3, - "line": 46 + "line": 42 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.terms.automaticTrialEnd", "start": { "column": 21, - "line": 43 + "line": 39 } }, { "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", "end": { "column": 3, - "line": 50 + "line": 46 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.terms.trialWorth", "start": { "column": 14, - "line": 47 + "line": 43 } }, { "defaultMessage": "!!!Sorry, we could not activate your trial!", "end": { "column": 3, - "line": 54 + "line": 50 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.error", "start": { "column": 19, - "line": 51 + "line": 47 } }, { "defaultMessage": "!!!Start my 14-day Franz Professional Trial", "end": { "column": 3, - "line": 58 + "line": 54 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.cta.accept", "start": { "column": 13, - "line": 55 + "line": 51 } }, { "defaultMessage": "!!!Start using Franz", "end": { "column": 3, - "line": 62 + "line": 58 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.cta.start", "start": { "column": 12, - "line": 59 + "line": 55 } }, { "defaultMessage": "!!!Continue to Franz", "end": { "column": 3, - "line": 66 + "line": 62 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.cta.skip", "start": { "column": 11, - "line": 63 + "line": 59 } }, { "defaultMessage": "!!!Franz Professional includes:", "end": { "column": 3, - "line": 70 + "line": 66 }, "file": "src/components/auth/Pricing.js", "id": "pricing.trial.features.headline", "start": { "column": 20, - "line": 67 + "line": 63 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 6b0aebb13..8bef09d4d 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -177,7 +177,6 @@ "pricing.trial.intro.happyMessaging": "Happy messaging,", "pricing.trial.intro.specialTreat": "We have a special treat for you.", "pricing.trial.intro.tryPro": "Enjoy the full Franz Professional experience completely free for 14 days.", - "pricing.trial.subheadline": "Here's a special welcome for you:", "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline": "No strings attached", "pricing.trial.terms.noCreditCard": "No credit card required", @@ -426,4 +425,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf From a220bcde9585ca611f591622c675b2e8b7ab6924 Mon Sep 17 00:00:00 2001 From: FranzBot Date: Thu, 17 Oct 2019 12:20:31 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/ca.json | 15 +++++++++------ src/i18n/locales/cs.json | 15 +++++++++------ src/i18n/locales/de.json | 15 +++++++++------ src/i18n/locales/el.json | 15 +++++++++------ src/i18n/locales/es.json | 15 +++++++++------ src/i18n/locales/fr.json | 15 +++++++++------ src/i18n/locales/ga.json | 15 +++++++++------ src/i18n/locales/hr.json | 15 +++++++++------ src/i18n/locales/hu.json | 15 +++++++++------ src/i18n/locales/id.json | 15 +++++++++------ src/i18n/locales/it.json | 15 +++++++++------ src/i18n/locales/ja.json | 15 +++++++++------ src/i18n/locales/ka.json | 15 +++++++++------ src/i18n/locales/nl-BE.json | 15 +++++++++------ src/i18n/locales/nl.json | 15 +++++++++------ src/i18n/locales/pl.json | 15 +++++++++------ src/i18n/locales/pt-BR.json | 15 +++++++++------ src/i18n/locales/pt.json | 15 +++++++++------ src/i18n/locales/ru.json | 15 +++++++++------ src/i18n/locales/sk.json | 15 +++++++++------ src/i18n/locales/sr.json | 15 +++++++++------ src/i18n/locales/tr.json | 15 +++++++++------ src/i18n/locales/uk.json | 15 +++++++++------ src/i18n/locales/zh-TW.json | 15 +++++++++------ 24 files changed, 216 insertions(+), 144 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json index 1495f2d44..79deb7c87 100644 --- a/src/i18n/locales/ca.json +++ b/src/i18n/locales/ca.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Recarrega", "app.errorHandler.headline" : "Quelcom ha anat malament", "feature.announcements.changelog.headline" : "Canvis en Franz {version}", - "feature.delayApp.headline" : "Si us plau, compra una llicència de suport per a Franz per saltar l'espera", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz continuarà en {seconds} segons", "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Aconsegueix una llicència de suport per a Franz", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Millorar el teu compte", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json index 4064372c4..658c813e6 100644 --- a/src/i18n/locales/cs.json +++ b/src/i18n/locales/cs.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Obnovit", "app.errorHandler.headline" : "Něco se pokazilo", "feature.announcements.changelog.headline" : "Změny ve Franz {version}", - "feature.delayApp.headline" : "Kup si Franz Supporter licenci a nebudeš už muset čekat", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz bude pokračovat v {seconds} sekundách.", "feature.delayApp.trial.action" : "Ano, chci vyzkoušet Franz Professional na 14 dní zdarma.", "feature.delayApp.trial.actionShort" : "Aktivovat zdarma zkušební verzi Franz Professional", - "feature.delayApp.trial.headline" : "Získejte zdarma zkušební verzi Franz Profesionnal na 14 dní a už nečekejte", - "feature.delayApp.upgrade.action" : "Podpoř Franz a získej Supporter licenci", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Vylepši si svůj účet", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Přidali jste {amount} z {limit} služeb, které jsou součástí vašeho předplatného. Pro přidání dalších služeb proveďte upgrade vašeho účtu.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 589d7fa4d..74579592a 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Neu laden", "app.errorHandler.headline" : "Es ist ein Fehler aufgetreten", "feature.announcements.changelog.headline" : "Was ist neu in Franz {version}", - "feature.delayApp.headline" : "Erspare dir das Warten mit Franz Premium!", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "In {seconds} Sekunden geht's weiter!", "feature.delayApp.trial.action" : "Ja, ich möchte Franz Professional 14 Tage gratis testen", "feature.delayApp.trial.actionShort" : "Aktiviere die kostenlose Franz Professional Testlizenz", - "feature.delayApp.trial.headline" : "Hol dir die kostenlose Franz Professional Testlizenz und es geht ohne Warten weiter!", - "feature.delayApp.upgrade.action" : "Hol dir Franz Premium!", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Account upgraden", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Du hast {amount} von {limit} in deiner Lizenz inkludierten Services hinzugefügt. Bitte führe ein Upgrade deines Accounts durch, um mehr Services hinzuzufügen.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Weiter zu Franz!", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Tut uns leid, wir konnten deine kostenlose Testlizenz nicht aktivieren.", "pricing.trial.features.headline" : "Franz Professional beinhaltet:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Deine kostenlose Testlizenz endet automatisch nach 14 Tagen", "pricing.trial.terms.headline" : "Ohne Bindung, ohne Haken", "pricing.trial.terms.noCreditCard" : "Keine Kreditkarte notwendig", diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json index b53b21c86..b9995de0b 100644 --- a/src/i18n/locales/el.json +++ b/src/i18n/locales/el.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Επαναφόρτωση", "app.errorHandler.headline" : "Κάτι δεν λειτουργεί", "feature.announcements.changelog.headline" : "Changes in Franz {version}", - "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz θα συνεχίσει σε {seconds} δευτερόλεπτα.", "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Get a Franz Supporter License", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Upgrade account", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index dfd843098..fdc3b22af 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Volver a cargar", "app.errorHandler.headline" : "Algo salió mal.", "feature.announcements.changelog.headline" : "Cambios en Franz {version}", - "feature.delayApp.headline" : "Por favor compra una Licencia de Soporte de Franz para omitir la espera", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz continuará en {seconds} segundos.", "feature.delayApp.trial.action" : "Si! Quiero probar Franz Profesional por 14 días, gratis!", "feature.delayApp.trial.actionShort" : "Activar el período de prueba de Franz Profesional", - "feature.delayApp.trial.headline" : "Empieza el periodo de prueba de Franz Profesional por 14 días y cruza la linea.", - "feature.delayApp.upgrade.action" : "Consigue una Licencia de Soporte de Franz", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Mejora tu cuenta", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Has sumado {amount} servicios más de los que están incluídos en tu plan. Por favor mejora tu cuenta para sumar más servicios.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continuar a Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Disculpe, no pudimos activar su prueba!", "pricing.trial.features.headline" : "Franz Profesional incluye:", - "pricing.trial.headline" : "Franz Profesional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Su prueba gratis finaliza automáticamente después de 14 días", "pricing.trial.terms.headline" : "Sin condiciones", "pricing.trial.terms.noCreditCard" : "No necesita tarjeta de crédito", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 127df0334..ee4df697a 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Actualiser", "app.errorHandler.headline" : "On dirait que quelque chose ne va pas", "feature.announcements.changelog.headline" : "Les nouveaux changements dans Franz {version}", - "feature.delayApp.headline" : "Achetez la licence Franz pour ne plus avoir de temps d'attente", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz s'ouvrira dans {seconds} secondes.", "feature.delayApp.trial.action" : "Oui, je veux les 14 jours d'essai gratuits de Franz Professionnel", "feature.delayApp.trial.actionShort" : "Activer l'essai gratuit de Franz Professionnel ", - "feature.delayApp.trial.headline" : "Obtenir l'essai gratuit de 14 jours pour Franz Professionnel et éviter la file d'attente", - "feature.delayApp.upgrade.action" : "Acheter une license Franz", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Augmenter le niveau de mon compte", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Vous avez ajouté {amount} services sur les {limit} qui sont inclus dans votre offre. Veuillez améliorer votre compte pour ajouter plus de services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json index 7aed75d4b..d206c04e1 100644 --- a/src/i18n/locales/ga.json +++ b/src/i18n/locales/ga.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Athlódáil", "app.errorHandler.headline" : "Chuaigh cúrsaí chun donais", "feature.announcements.changelog.headline" : "Athraithe i Franz {version}", - "feature.delayApp.headline" : "Ceannaigh Franz Premium chun am a spáráil, le do thoil", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Leanfaidh Franz ar aghaidh i gceann {seconds} soicind.", "feature.delayApp.trial.action" : "Sea, ba mhaith liom Franz Professional a thástáil le feadh 14 lá", "feature.delayApp.trial.actionShort" : "Cuir tástáil saor Franz Professional i bhfeidhm", - "feature.delayApp.trial.headline" : "Tástáil Franz Professional le feadh 14 lá agus gearr isteach sa scuaine!", - "feature.delayApp.upgrade.action" : "Faigh Franz Premium!", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Uasghrádaigh cuntas", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Tá {amount} as {limit} seirbhísí atá san áireamh i do phlean curtha agat cheana féin. Uasghrádaigh do chuntas chun tuilleadh seirbhísí a chur leis, le do thoil.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json index 61e5c3f01..7fb3169e5 100644 --- a/src/i18n/locales/hr.json +++ b/src/i18n/locales/hr.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Ponovno učitavanje", "app.errorHandler.headline" : "Something went wrong", "feature.announcements.changelog.headline" : "Changes in Franz {version}", - "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Get a Franz Supporter License", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Upgrade account", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json index 38c3c1197..4bf6fc0e3 100644 --- a/src/i18n/locales/hu.json +++ b/src/i18n/locales/hu.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Újratöltés", "app.errorHandler.headline" : "Valami nem jött össze", "feature.announcements.changelog.headline" : "Franz {version} változásai", - "feature.delayApp.headline" : "Kérjük vásárolj egy Franc Támogatói Liszencet a várakozás átugrásához", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "A Franz továbblép {seconds} másodperc múlva.", "feature.delayApp.trial.action" : "Igen, szeretném kipróbálni 14 napig a Franz Professional-t ingyen", "feature.delayApp.trial.actionShort" : "Aktiválom az ingyenes Franz Professional próbaidőszakot", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Szerezz egy Franz Támogatói Liszencet", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Fiók frissítése", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json index 203bf5185..40cffb49d 100644 --- a/src/i18n/locales/id.json +++ b/src/i18n/locales/id.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Muat Ulang", "app.errorHandler.headline" : "Terjadi kesalahan", "feature.announcements.changelog.headline" : "Perubahan dalam Franz {version}", - "feature.delayApp.headline" : "Beli Lisensi Pendukung Franz agar tidak perlu menunggu", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz akan melanjutkan dalam {seconds} detik.", "feature.delayApp.trial.action" : "Ya, saya ingin menguji gratis 14 hari Franz Professional", "feature.delayApp.trial.actionShort" : "Aktifkan uji coba gratis Franz Professional", - "feature.delayApp.trial.headline" : "Dapatkan uji coba gratis 14 hari Franz Professional dan tak perlu lagi menunggu!", - "feature.delayApp.upgrade.action" : "Dapatkan Lisensi Pendukung Franz", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Tingkatkan akun", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Anda telah menambahkan {amount} dari kuota {limit} layanan yang tersedia untuk paket Anda. Tingkatkan akun untuk menambahkan layanan lain.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Lanjutkan ke Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Maaf, kami tidak bisa mengaktifkan uji coba Anda!", "pricing.trial.features.headline" : "Franz Professional menyertakan:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Uji coba gratis Anda berakhir secara otomatis dalam 14 hari", "pricing.trial.terms.headline" : "Tanpa embel-embel", "pricing.trial.terms.noCreditCard" : "Tidak memerlukan kartu kredit", diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index a9a814412..2edbfd2e8 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Ricarica", "app.errorHandler.headline" : "Qualcosa è andato storto", "feature.announcements.changelog.headline" : "Modifiche in Franz {Version}", - "feature.delayApp.headline" : "Per favore, compra una Licenza Supporter di Franz per saltare l'attesa", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz continuerà tra {seconds} secondi.", "feature.delayApp.trial.action" : "Sì, voglio la prova gratuita di 14 giorni di Franz Professional", "feature.delayApp.trial.actionShort" : "Attiva la prova gratuita di Franz Professional", - "feature.delayApp.trial.headline" : "Ottieni la prova gratuita per 14 giorni di Franz Professional e salta la coda", - "feature.delayApp.upgrade.action" : "Ricevi una Licenza Supporter di Franz", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Effettua l'upgrade del tuo account", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Hai aggiunto {amount} su {limit} servizi che sono inclusi nel tuo piano. Per favore potenzia il tuo account per aggiungere più servizi.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continua su Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Ci dispiace, non abbiamo potuto attivare la tua prova!", "pricing.trial.features.headline" : "Franz Professional include:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "La tua prova gratuita finirà automaticamente dopo 14 giorni", "pricing.trial.terms.headline" : "Senza impegno", "pricing.trial.terms.noCreditCard" : "Nessuna carta di credito richiesta", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 27cb6a3c7..98132854f 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "再読み込み", "app.errorHandler.headline" : "間違えている部分があります", "feature.announcements.changelog.headline" : "Changes in Franz {version}", - "feature.delayApp.headline" : "Franzをすぐに起動するには、Franz サポーターライセンスを購入してください。", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franzはあと{seconds}秒後に起動します。", "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Franzサポーターライセンスを購入する", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "アカウントをアップグレード", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json index 7440fd916..c9236622d 100644 --- a/src/i18n/locales/ka.json +++ b/src/i18n/locales/ka.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "ჩატვირთვა", "app.errorHandler.headline" : "Something went wrong", "feature.announcements.changelog.headline" : "Changes in Franz {version}", - "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Get a Franz Supporter License", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Upgrade account", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json index 349e4f80c..d5cf9ac1e 100644 --- a/src/i18n/locales/nl-BE.json +++ b/src/i18n/locales/nl-BE.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Herladen", "app.errorHandler.headline" : "Er ging iets mis", "feature.announcements.changelog.headline" : "Wijzigingen in Franz {versie}", - "feature.delayApp.headline" : "Neem een Franz Supporter Licentie om niet meer te hoeven wachten", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.", "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Neem een Franz Supporter Licentie ", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Upgrade account", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json index 61a212335..a80f80674 100644 --- a/src/i18n/locales/nl.json +++ b/src/i18n/locales/nl.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Herladen", "app.errorHandler.headline" : "Er is iets mis gegaan", "feature.announcements.changelog.headline" : "Wijzigingen in Franz {version}", - "feature.delayApp.headline" : "Sponsor Franz om wachten over te slaan", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.", "feature.delayApp.trial.action" : "Ja, ik wil graag 14 dagen lang Franz Professional uitproberen", "feature.delayApp.trial.actionShort" : "Activeer de gratis Franz Professional probeerversie", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Sponsor Franz", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Upgrade Account", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json index 2ea92b2b3..71b35f626 100644 --- a/src/i18n/locales/pl.json +++ b/src/i18n/locales/pl.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Odśwież", "app.errorHandler.headline" : "Coś poszło nie tak.", "feature.announcements.changelog.headline" : "Zmiany we Franzie {version}", - "feature.delayApp.headline" : "Aby nie czekać, kup licencję Franz Supporter", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz będzie kontynuował za {seconds} sekund.", "feature.delayApp.trial.action" : "Tak, chcę darmową 14-dniową wersję próbną Franz Professional", "feature.delayApp.trial.actionShort" : "Aktywuj darmową wersję próbną Franz Professional", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Uzyskaj licencję Franz Supporter", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Ulepsz swoje konto", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Dodałeś {amount} z {limit} usług, które oferuje twój plan. Ulepsz swoje konto, aby dodać więcej usług.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json index 1ee7c04de..e42f68a8f 100644 --- a/src/i18n/locales/pt-BR.json +++ b/src/i18n/locales/pt-BR.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Recarregar", "app.errorHandler.headline" : "Opa! Algo deu errado.", "feature.announcements.changelog.headline" : "Mudanças no Franz {version}", - "feature.delayApp.headline" : "Por favor, adquira uma licença para pular o tempo de espera", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz continuará em {seconds} segundos.", "feature.delayApp.trial.action" : "Sim, eu quero o período de testes gratuito de 14 dias do Franz Professional", "feature.delayApp.trial.actionShort" : "Ativar período de testes gratuito do Franz Professional", - "feature.delayApp.trial.headline" : "Teste o Franz Professional por 14 dias grátis e fure a fila.", - "feature.delayApp.upgrade.action" : "Adquira uma licença de suporte Franz", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Atualizar conta", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Você adicionou {amount} serviços de um total de {limit} que estão inclusos no seu plano. Por favor, atualize sua conta para adicionar mais serviços.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continuar para o Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Desculpe, não conseguimos ativar o seu período de testes", "pricing.trial.features.headline" : "Incluso no Franz Profissional:", - "pricing.trial.headline" : "Franz Profissional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Seu período de testes encerra automaticamente em 14 dias", "pricing.trial.terms.headline" : "Sem vínculos", "pricing.trial.terms.noCreditCard" : "Cartão de crédito não exigido", diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index 0b553b049..0224668d7 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Recarregar", "app.errorHandler.headline" : "Alguma coisa correu mal", "feature.announcements.changelog.headline" : "Alterações no Franz {version}", - "feature.delayApp.headline" : "Por favor compre uma licença Franz Supporter para saltar a fila de espera", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz irá continuar em {seconds} segundos.", "feature.delayApp.trial.action" : "Sim, Quero a versão experimental do Franz Profissional de 14 dias", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Faz parte do grupo de apoio do Franz", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Atualiza a tua conta", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 37dcd4712..133614cf1 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Перезагрузить", "app.errorHandler.headline" : "Что-то пошло не так", "feature.announcements.changelog.headline" : "Изменения в версии Franz {version}", - "feature.delayApp.headline" : "Пожалуйста приобретите лицензию Franz Supporter чтобы убрать ожидание", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz продолжит работу через {seconds} секунд.", "feature.delayApp.trial.action" : "Да, я хочу бесплатную 14-дневную триальную версию Franz Professional", "feature.delayApp.trial.actionShort" : "Активировать бесплатную триальную версию Franz Professional", - "feature.delayApp.trial.headline" : "Получить бесплатную 14-дневную триальную версию Franz Professional и перейти к следующему полю", - "feature.delayApp.upgrade.action" : "Получите лицензию поддержки Franz", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Апгрейдить аккаунт", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Вы добавили {amount} максимальное {limit} количество сервисов, входящих в ваш план. Пожалуйста, обновите свой план чтобы добавить больше сервисов.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json index e853dac7f..35752c4ad 100644 --- a/src/i18n/locales/sk.json +++ b/src/i18n/locales/sk.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Obnoviť", "app.errorHandler.headline" : "Niečo sa pokazilo", "feature.announcements.changelog.headline" : "Zmeny vo Franz {version}", - "feature.delayApp.headline" : "Prosím, kúp si licenciu Franz Supporter a nebudeš musieť čakať", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz bude pokračovať v {seconds} sekundách.", "feature.delayApp.trial.action" : "Áno, chcem bezplatnú 14-dňovú skúšobnú verziu Franz Professional", "feature.delayApp.trial.actionShort" : "Aktivujte bezplatnú skúšobnú verziu Franz Professional", - "feature.delayApp.trial.headline" : "Získajte bezplatnú 14 dňovú skúšobnú verziu Franz Professional a preskočte riadok", - "feature.delayApp.upgrade.action" : "Získajte licenciu pre Franz podporu", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Upgradovať účet", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Pridali ste {amount} z {limit} služieb, ktoré sú zahrnuté vo vašom pláne. Ak chcete pridať ďalšie služby, inovujte svoj účet.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json index dc2d0af08..889f3e526 100644 --- a/src/i18n/locales/sr.json +++ b/src/i18n/locales/sr.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Ponovno učitavanje", "app.errorHandler.headline" : "Something went wrong", "feature.announcements.changelog.headline" : "Changes in Franz {version}", - "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Get a Franz Supporter License", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Upgrade account", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json index d40d3323d..e20266cd8 100644 --- a/src/i18n/locales/tr.json +++ b/src/i18n/locales/tr.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Tekrar Yükle", "app.errorHandler.headline" : "Bir terslik çıktı", "feature.announcements.changelog.headline" : "Changes in Franz {version}", - "feature.delayApp.headline" : "Beklememek için Franz Destek Lisansı'nı satın alın", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz {seconds} saniye sonra devam edecek.", "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "Franz Destek Lisansı'nı alın", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Hesabı Yükselt", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json index c20b3b6b9..69b608e94 100644 --- a/src/i18n/locales/uk.json +++ b/src/i18n/locales/uk.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "Перезавантажити", "app.errorHandler.headline" : "Щось пішло не так", "feature.announcements.changelog.headline" : "Зміни у версії Franz {version}", - "feature.delayApp.headline" : "Будь ласка, придбайте ліцензію Franz Supporter аби пропустити очікування", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz відновить роботу за {seconds} секунд", "feature.delayApp.trial.action" : "Так, я хочу безкоштовну 14-денну триальную версію Franz Professional", "feature.delayApp.trial.actionShort" : "Активувати безкоштовну триальную версію Franz Professional", - "feature.delayApp.trial.headline" : "Отримати безкоштовну 14-денну триальную версію Franz Professional і перейти до наступного поля", - "feature.delayApp.upgrade.action" : "Отримати ліцензію Franz Supporter ", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Преміум акаунт", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Ви додали {amount} максимальну {limit} кількість сервісів, що входять в ваш план. Будь ласка, поновіть свій план щоб додати більше сервісів.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json index 17dadebdf..e24b3a6f4 100644 --- a/src/i18n/locales/zh-TW.json +++ b/src/i18n/locales/zh-TW.json @@ -2,12 +2,12 @@ "app.errorHandler.action" : "重新整理", "app.errorHandler.headline" : "糟糕!有些地方出問題了。", "feature.announcements.changelog.headline" : "透過 email 傳送", - "feature.delayApp.headline" : "請購買 Franz 支援授權以跳過等候", + "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", "feature.delayApp.text" : "Franz 會在 {seconds} 秒後繼續。", "feature.delayApp.trial.action" : "Yes, I want the free 14 day trial of Franz Professional", "feature.delayApp.trial.actionShort" : "Activate the free Franz Professional trial", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14 day trial and skip the line", - "feature.delayApp.upgrade.action" : "取得 Franz 支援授權", + "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", + "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "升級帳號", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", @@ -21,7 +21,7 @@ "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Welcome back, {name}", + "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", @@ -170,10 +170,13 @@ "pricing.plan.pro-yearly" : "Professional Yearly", "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", "pricing.trial.cta.skip" : "Continue to Franz", + "pricing.trial.cta.start" : "Start using Franz", "pricing.trial.error" : "Sorry, we could not activate your trial!", "pricing.trial.features.headline" : "Franz Professional includes:", - "pricing.trial.headline" : "Franz Professional", - "pricing.trial.subheadline" : "Here's a special welcome for you:", + "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", + "pricing.trial.intro.happyMessaging" : "Happy messaging,", + "pricing.trial.intro.specialTreat" : "We have a special treat for you.", + "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", "pricing.trial.terms.automaticTrialEnd" : "Your free trial ends automatically after 14 days", "pricing.trial.terms.headline" : "No strings attached", "pricing.trial.terms.noCreditCard" : "No credit card required", -- cgit v1.2.3-54-g00ecf From 2469be543048b575c0cd8e8fccdef2a73e6046d3 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Thu, 17 Oct 2019 14:57:57 +0200 Subject: Add debugging logs --- src/webview/lib/RecipeWebview.js | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src') diff --git a/src/webview/lib/RecipeWebview.js b/src/webview/lib/RecipeWebview.js index be29142af..e3212d0e6 100644 --- a/src/webview/lib/RecipeWebview.js +++ b/src/webview/lib/RecipeWebview.js @@ -2,6 +2,8 @@ const { ipcRenderer } = require('electron'); const fs = require('fs-extra'); +const debug = require('debug')('Franz:Plugin:RecipeWebview'); + class RecipeWebview { constructor() { this.countCache = { @@ -11,6 +13,8 @@ class RecipeWebview { ipcRenderer.on('poll', () => { this.loopFunc(); + + debug('Poll event'); }); } @@ -44,8 +48,11 @@ class RecipeWebview { indirect: indirect > 0 ? indirect : 0, }; + ipcRenderer.sendToHost('messages', count); Object.assign(this.countCache, count); + + debug('Sending badge count to host', count); } /** @@ -61,6 +68,8 @@ class RecipeWebview { styles.innerHTML = data.toString(); document.querySelector('head').appendChild(styles); + + debug('Append styles', styles); }); } -- cgit v1.2.3-54-g00ecf From d33fd710cce0a40469de513df7fe79cdef306730 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Thu, 17 Oct 2019 16:57:21 +0200 Subject: fix icon size --- src/features/planSelection/components/PlanSelection.js | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js index 9407f6dd3..74f90868a 100644 --- a/src/features/planSelection/components/PlanSelection.js +++ b/src/features/planSelection/components/PlanSelection.js @@ -111,6 +111,7 @@ const styles = theme => ({ '& svg': { width: '80px !important', + height: '80px !important', filter: 'drop-shadow( 0px 2px 3px rgba(0, 0, 0, 0.3))', fill: theme.styleTypes.danger.contrast, }, -- cgit v1.2.3-54-g00ecf From 9a5f64fbf0ca1d8c73614d03dc7ed3b4cd285387 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Thu, 17 Oct 2019 20:41:58 +0200 Subject: test to reload app after resume --- src/stores/AppStore.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'src') diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index ca5cad836..c38e84639 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -207,10 +207,7 @@ export default class AppStore extends Store { if (this.timeSuspensionStart.add(10, 'm').isBefore(moment())) { debug('Reloading services, user info and features'); - this.actions.service.reloadAll(); - - this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); - this.stores.features.featuresRequest.invalidate({ immediately: true }); + window.location.reload(); statsEvent('resumed-app'); } -- cgit v1.2.3-54-g00ecf From 66e43c5d21f90893b047a7cabbc31bb0e83035d5 Mon Sep 17 00:00:00 2001 From: Bennett Date: Thu, 17 Oct 2019 21:20:01 +0200 Subject: Fix disable spell checker method for Electron 6 While Electron <6 still [required a second "autoCorrectWord" argument](https://github.com/electron/electron/blob/v3.1.0/docs/api/web-frame.md#webframesetspellcheckproviderlanguage-autocorrectword-provider), Electron 6 [no longer needs this argument](https://electronjs.org/docs/api/web-frame#webframesetspellcheckproviderlanguage-provider). Because of this, Franz's service webview when trying to disable the Spellchecker. --- src/webview/spellchecker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/webview/spellchecker.js b/src/webview/spellchecker.js index 06cbd283a..d8f71f61f 100644 --- a/src/webview/spellchecker.js +++ b/src/webview/spellchecker.js @@ -96,7 +96,7 @@ export function isEnabled() { export function disable() { if (isEnabled()) { - webFrame.setSpellCheckProvider(currentDict, true, { spellCheck: () => true }); + webFrame.setSpellCheckProvider(currentDict, { spellCheck: () => true }); _isEnabled = false; currentDict = null; } -- cgit v1.2.3-54-g00ecf From 452ff4a35af6df43e6f76d2e5db8de2e1b194ccc Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 18 Oct 2019 09:25:22 +0200 Subject: make plan selection scrollable --- src/features/planSelection/components/PlanSelection.js | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js index 74f90868a..355187516 100644 --- a/src/features/planSelection/components/PlanSelection.js +++ b/src/features/planSelection/components/PlanSelection.js @@ -72,6 +72,7 @@ const styles = theme => ({ justifyContent: 'center', alignItems: 'center', zIndex: 999999, + overflowY: 'scroll', }, container: { width: '80%', -- cgit v1.2.3-54-g00ecf From 3f150f9863672e61cdbe1310c70d22e12042cc73 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 18 Oct 2019 09:25:33 +0200 Subject: apply diet --- src/features/planSelection/components/PlanItem.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/features/planSelection/components/PlanItem.js b/src/features/planSelection/components/PlanItem.js index ea04c8448..ec061377b 100644 --- a/src/features/planSelection/components/PlanItem.js +++ b/src/features/planSelection/components/PlanItem.js @@ -38,7 +38,7 @@ const styles = theme => ({ '& h2': { textAlign: 'center', - marginBottom: 20, + marginBottom: 10, fontSize: 30, color: theme.styleTypes.primary.contrast, }, @@ -48,6 +48,7 @@ const styles = theme => ({ }, priceWrapper: { height: 50, + marginBottom: 0, }, price: { fontSize: 50, @@ -69,7 +70,7 @@ const styles = theme => ({ width: 40, border: 0, borderTop: [1, 'solid', theme.styleTypes.primary.contrast], - margin: [30, 'auto'], + margin: [15, 'auto', 20], }, header: { padding: 20, @@ -78,7 +79,7 @@ const styles = theme => ({ position: 'relative', }, content: { - padding: 20, + padding: [10, 20, 20], background: '#EFEFEF', }, simpleCTA: { -- cgit v1.2.3-54-g00ecf From 5c1c0db73ba1317ed138b1db8831677ef27c1633 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 18 Oct 2019 12:00:43 +0200 Subject: fix(Workspaces): Allow scrolling in Workspaces drawer --- src/features/workspaces/components/WorkspaceDrawer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js index ee6f8416c..d5616b4da 100644 --- a/src/features/workspaces/components/WorkspaceDrawer.js +++ b/src/features/workspaces/components/WorkspaceDrawer.js @@ -52,6 +52,8 @@ const styles = theme => ({ drawer: { background: theme.workspaces.drawer.background, width: `${theme.workspaces.drawer.width}px`, + display: 'flex', + flexDirection: 'column', }, headline: { fontSize: '24px', @@ -75,6 +77,7 @@ const styles = theme => ({ }, workspaces: { height: 'auto', + overflowY: 'scroll', }, premiumAnnouncement: { padding: '20px', @@ -89,7 +92,7 @@ const styles = theme => ({ addNewWorkspaceLabel: { height: 'auto', color: theme.workspaces.drawer.buttons.color, - marginTop: 40, + margin: [40, 0], textAlign: 'center', '& > svg': { fill: theme.workspaces.drawer.buttons.color, -- cgit v1.2.3-54-g00ecf From 9e92cff901522f438c34543836a8c2dc6578f5c1 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 18 Oct 2019 12:00:51 +0200 Subject: remove flow tag --- src/webview/lib/RecipeWebview.js | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/webview/lib/RecipeWebview.js b/src/webview/lib/RecipeWebview.js index e3212d0e6..859f7787f 100644 --- a/src/webview/lib/RecipeWebview.js +++ b/src/webview/lib/RecipeWebview.js @@ -1,4 +1,3 @@ -// @flow const { ipcRenderer } = require('electron'); const fs = require('fs-extra'); -- cgit v1.2.3-54-g00ecf From ed071ba4e298d19c69c7994194f118cf3b75b277 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 18 Oct 2019 14:30:16 +0200 Subject: share app version with webview --- src/stores/ServicesStore.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index 70b775503..65e68e4d7 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -6,6 +6,7 @@ import { } from 'mobx'; import { debounce, remove } from 'lodash'; import ms from 'ms'; +import { remote } from 'electron'; import Store from './lib/Store'; import Request from './lib/Request'; @@ -18,6 +19,8 @@ import { RESTRICTION_TYPES } from '../models/Service'; const debug = require('debug')('Franz:ServiceStore'); +const { app } = remote; + export default class ServicesStore extends Store { @observable allServicesRequest = new CachedRequest(this.api.services, 'all'); @@ -728,7 +731,9 @@ export default class ServicesStore extends Store { if (service.webview) { debug('Initialize recipe', service.recipe.id, service.name); - service.webview.send('initialize-recipe', service.shareWithWebview, service.recipe); + service.webview.send('initialize-recipe', Object.assign({ + franzVersion: app.getVersion(), + }, service.shareWithWebview), service.recipe); } } -- cgit v1.2.3-54-g00ecf From 71b9e05d45bac8a592b859dbb707fe4ac8ff4ffd Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 18 Oct 2019 14:30:29 +0200 Subject: Fix name in pricing screen --- src/components/auth/Pricing.js | 4 +++- src/containers/auth/PricingScreen.js | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js index 86b6a4263..53ae046a0 100644 --- a/src/components/auth/Pricing.js +++ b/src/components/auth/Pricing.js @@ -150,6 +150,7 @@ export default @observer @injectSheet(styles) class Signup extends Component { classes: PropTypes.object.isRequired, currency: PropTypes.string.isRequired, price: PropTypes.number.isRequired, + name: PropTypes.string.isRequired, }; static contextTypes = { @@ -166,6 +167,7 @@ export default @observer @injectSheet(styles) class Signup extends Component { classes, currency, price, + name, } = this.props; const { intl } = this.context; @@ -182,7 +184,7 @@ export default @observer @injectSheet(styles) class Signup extends Component { alt="" /> )} -

{intl.formatMessage(messages.headline, { name: 'Stefan' })}

+

{intl.formatMessage(messages.headline, { name })}

{intl.formatMessage(messages.specialTreat)} diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js index 55811ed23..21c859c12 100644 --- a/src/containers/auth/PricingScreen.js +++ b/src/containers/auth/PricingScreen.js @@ -42,7 +42,7 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend stores, } = this.props; - const { getUserInfoRequest, activateTrialRequest } = stores.user; + const { getUserInfoRequest, activateTrialRequest, data } = stores.user; const { featuresRequest, features } = stores.features; const { pricingConfig } = features; @@ -64,6 +64,7 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend error={error} currency={currency} price={price} + name={data.firstname} /> ); } -- cgit v1.2.3-54-g00ecf From 452cb3dcf7fd2f40a1b9006110f93001749bf578 Mon Sep 17 00:00:00 2001 From: FranzBot Date: Sun, 20 Oct 2019 00:00:21 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/pt-BR.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json index e42f68a8f..ef38e6e0a 100644 --- a/src/i18n/locales/pt-BR.json +++ b/src/i18n/locales/pt-BR.json @@ -10,20 +10,20 @@ "feature.delayApp.upgrade.action" : "Upgrade Franz", "feature.delayApp.upgrade.actionShort" : "Atualizar conta", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", - "feature.planSelection.cta.stayOnFree" : "Stay on Free", - "feature.planSelection.cta.trial" : "Start my free 14-days Trial", - "feature.planSelection.cta.upgradePersonal" : "Choose Personal", - "feature.planSelection.cta.upgradePro" : "Choose Professional", - "feature.planSelection.free.text" : "Basic functionality", - "feature.planSelection.fullFeatureList" : "Complete comparison of all plans", + "feature.planSelection.cta.stayOnFree" : "Continuar no plano grátis", + "feature.planSelection.cta.trial" : "Iniciar minha avaliação gratuita de 14 dias", + "feature.planSelection.cta.upgradePersonal" : "Escolha o plano Pessoal", + "feature.planSelection.cta.upgradePro" : "Escolha o plano Profissional", + "feature.planSelection.free.text" : "Funcionalidade básica", + "feature.planSelection.fullFeatureList" : "Comparação completa de todos os planos", "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free", - "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal", - "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", - "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", - "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", - "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", - "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", + "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Escolha o plano Pessoal", + "feature.planSelection.fullscreen.dialog.message" : "Você está prestes a mudar para o plano Gratuito. Você tem certeza? Se não, clique aqui para obter mais serviços e funcionalidade por apenas {currency}{price} por mês.", + "feature.planSelection.fullscreen.dialog.title" : "Alterar seu Plano Franz", + "feature.planSelection.fullscreen.subheadline" : "É hora de fazer uma escolha. O Franz trabalha melhor nos nossos planos Pessoal e Profissional. Por favor, dê uma olhada e veja qual a melhor opção para você.", + "feature.planSelection.fullscreen.welcome" : "Você está pronto para escolher, {name}?", + "feature.planSelection.personal.text" : "Mais serviços, sem espera - ideal para uso pessoal.", + "feature.planSelection.pro.text" : "Serviços ilimitados e funcionalidades profissionais para você - e seu time.", "feature.serviceLimit.limitReached" : "Você adicionou {amount} serviços de um total de {limit} que estão inclusos no seu plano. Por favor, atualize sua conta para adicionar mais serviços.", "feature.shareFranz.action.email" : "Enviar por e-mail", "feature.shareFranz.action.facebook" : "Compartilhar no Facebook", @@ -35,12 +35,12 @@ "feature.todos.premium.info" : "As Listas de Tarefa do Franz estão disponíveis para usuários premium!", "feature.todos.premium.rollout" : "As outras pessoas terão que esperar um pouquinho mais.", "feature.todos.premium.upgrade" : "Melhore sua conta", - "feature.trialStatusBar.cta" : "Upgrade now", + "feature.trialStatusBar.cta" : "Atualizar agora", "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.", "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free", - "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal", - "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", - "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan", + "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Escolha o plano Pessoal", + "feature.trialStatusBar.fullscreen.dialog.message" : "Você está prestes a mudar para o plano Gratuito. Você tem certeza? Se não, clique aqui para obter mais serviços e funcionalidade por apenas {currency}{price} por mês.", + "feature.trialStatusBar.fullscreen.dialog.title" : "Alterar seu Plano Franz", "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.", "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.", "global.franzProRequired" : "Franz Profissional necessário", -- cgit v1.2.3-54-g00ecf From f468e55f5dc3c08b48e4526e0fc7b5040b07ca44 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 20 Oct 2019 13:53:05 +0200 Subject: Fix hard coded plan name --- .../trialStatusBar/containers/TrialStatusBarScreen.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js index 15201496b..35b70a5bc 100644 --- a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js +++ b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js @@ -2,15 +2,21 @@ import React, { Component } from 'react'; import { observer, inject } from 'mobx-react'; import PropTypes from 'prop-types'; import ms from 'ms'; +import { intlShape } from 'react-intl'; import FeaturesStore from '../../../stores/FeaturesStore'; import UserStore from '../../../stores/UserStore'; import TrialStatusBar from '../components/TrialStatusBar'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; import { trialStatusBarStore } from '..'; +import { i18nPlanName } from '../../../helpers/plan-helpers'; @inject('stores', 'actions') @observer class TrialStatusBarScreen extends Component { + static contextTypes = { + intl: intlShape, + }; + state = { showOverlay: true, percent: 0, @@ -53,6 +59,8 @@ class TrialStatusBarScreen extends Component { render() { + const { intl } = this.context; + const { showOverlay, percent, @@ -67,10 +75,12 @@ class TrialStatusBarScreen extends Component { const { user } = this.props.stores; const { upgradeAccount } = this.props.actions.payment; + const planName = i18nPlanName(user.team.plan, intl); + return ( upgradeAccount({ -- cgit v1.2.3-54-g00ecf From 43b3f2ac532016cea1fe21f527564564e8eddd86 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Sun, 20 Oct 2019 19:39:39 +0200 Subject: Revert "test to reload app after resume" This reverts commit 9a5f64fbf0ca1d8c73614d03dc7ed3b4cd285387. --- src/stores/AppStore.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index c38e84639..ca5cad836 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -207,7 +207,10 @@ export default class AppStore extends Store { if (this.timeSuspensionStart.add(10, 'm').isBefore(moment())) { debug('Reloading services, user info and features'); - window.location.reload(); + this.actions.service.reloadAll(); + + this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); + this.stores.features.featuresRequest.invalidate({ immediately: true }); statsEvent('resumed-app'); } -- cgit v1.2.3-54-g00ecf From bd4c19826e936667962f410c9957b6259ebe8c06 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Mon, 21 Oct 2019 13:29:55 +0200 Subject: reload app after sleep with 2s waiting time --- src/stores/AppStore.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index ca5cad836..0a6309092 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -207,10 +207,9 @@ export default class AppStore extends Store { if (this.timeSuspensionStart.add(10, 'm').isBefore(moment())) { debug('Reloading services, user info and features'); - this.actions.service.reloadAll(); - - this.stores.user.getUserInfoRequest.invalidate({ immediately: true }); - this.stores.features.featuresRequest.invalidate({ immediately: true }); + setTimeout(() => { + window.location.reload(); + }, ms('2s')); statsEvent('resumed-app'); } -- cgit v1.2.3-54-g00ecf From 10ec328015c586ae937e936a477c02b2e0728373 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Mon, 21 Oct 2019 14:18:15 +0200 Subject: Hide menu bar in popups --- src/stores/PaymentStore.js | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/stores/PaymentStore.js b/src/stores/PaymentStore.js index b90e8f006..eb42ae10e 100644 --- a/src/stores/PaymentStore.js +++ b/src/stores/PaymentStore.js @@ -53,6 +53,7 @@ export default class PaymentStore extends Store { height: window.innerHeight - 100, maxWidth: 800, minWidth: 600, + autoHideMenuBar: true, webPreferences: { nodeIntegration: true, webviewTag: true, -- cgit v1.2.3-54-g00ecf From 828e6aad2a3eb661af3065289730a26a3764a4f4 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Mon, 21 Oct 2019 15:25:32 +0200 Subject: Fix missing icons --- .../workspaces/components/WorkspaceDrawer.js | 4 +-- .../workspaces/components/WorkspacesDashboard.js | 5 ++-- .../workspaces/components/WorkspacesDashboard.json | 32 +++++++++++----------- 3 files changed, 21 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js index d5616b4da..07100f5a1 100644 --- a/src/features/workspaces/components/WorkspaceDrawer.js +++ b/src/features/workspaces/components/WorkspaceDrawer.js @@ -7,7 +7,7 @@ import { H1, Icon, ProBadge } from '@meetfranz/ui'; import { Button } from '@meetfranz/forms/lib'; import ReactTooltip from 'react-tooltip'; -import { mdiPlusBox, mdiSettings } from '@mdi/js'; +import { mdiPlusBox, mdiSettings, mdiStar } from '@mdi/js'; import WorkspaceDrawerItem from './WorkspaceDrawerItem'; import { workspaceActions } from '../actions'; import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../index'; @@ -177,7 +177,7 @@ class WorkspaceDrawer extends Component { className={classes.premiumCtaButton} buttonType="primary" label={intl.formatMessage(messages.reactivatePremiumAccount)} - icon="mdiStar" + icon={mdiStar} onClick={() => { onUpgradeAccountClick(); gaEvent('User', 'upgrade', 'workspaceDrawer'); diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js index 70e213912..4fb302be2 100644 --- a/src/features/workspaces/components/WorkspacesDashboard.js +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -5,6 +5,7 @@ import { defineMessages, intlShape } from 'react-intl'; import injectSheet from 'react-jss'; import { Infobox, Badge } from '@meetfranz/ui'; +import { mdiCheckboxMarkedCircleOutline } from '@mdi/js'; import Loader from '../../../components/ui/Loader'; import WorkspaceItem from './WorkspaceItem'; import CreateWorkspaceForm from './CreateWorkspaceForm'; @@ -128,7 +129,7 @@ class WorkspacesDashboard extends Component { @@ -142,7 +143,7 @@ class WorkspacesDashboard extends Component { diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json index 7eb4fab50..8a20eb8e8 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Your workspaces", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 19, + "line": 20, "column": 12 }, "end": { - "line": 22, + "line": 23, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!You haven't added any workspaces yet.", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 23, + "line": 24, "column": 19 }, "end": { - "line": 26, + "line": 27, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Could not load your workspaces", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 27, + "line": 28, "column": 27 }, "end": { - "line": 30, + "line": 31, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Try again", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 31, + "line": 32, "column": 23 }, "end": { - "line": 34, + "line": 35, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Your changes have been saved", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 35, + "line": 36, "column": 15 }, "end": { - "line": 38, + "line": 39, "column": 3 } }, @@ -69,11 +69,11 @@ "defaultMessage": "!!!Workspace has been deleted", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 39, + "line": 40, "column": 15 }, "end": { - "line": 42, + "line": 43, "column": 3 } }, @@ -82,11 +82,11 @@ "defaultMessage": "!!!Info about workspace feature", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 43, + "line": 44, "column": 24 }, "end": { - "line": 46, + "line": 47, "column": 3 } }, @@ -95,11 +95,11 @@ "defaultMessage": "!!!Less is More: Introducing Franz Workspaces", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 47, + "line": 48, "column": 28 }, "end": { - "line": 50, + "line": 51, "column": 3 } } -- cgit v1.2.3-54-g00ecf From 8a4a5c3d3545f295ba99761308697c9f27a6bf29 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Mon, 21 Oct 2019 15:26:47 +0200 Subject: Update defaultMessages.json --- src/i18n/locales/defaultMessages.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index e283614d2..9818dca87 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -4861,104 +4861,104 @@ "defaultMessage": "!!!Your workspaces", "end": { "column": 3, - "line": 22 + "line": 23 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.headline", "start": { "column": 12, - "line": 19 + "line": 20 } }, { "defaultMessage": "!!!You haven't added any workspaces yet.", "end": { "column": 3, - "line": 26 + "line": 27 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.noWorkspacesAdded", "start": { "column": 19, - "line": 23 + "line": 24 } }, { "defaultMessage": "!!!Could not load your workspaces", "end": { "column": 3, - "line": 30 + "line": 31 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.workspacesRequestFailed", "start": { "column": 27, - "line": 27 + "line": 28 } }, { "defaultMessage": "!!!Try again", "end": { "column": 3, - "line": 34 + "line": 35 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.tryReloadWorkspaces", "start": { "column": 23, - "line": 31 + "line": 32 } }, { "defaultMessage": "!!!Your changes have been saved", "end": { "column": 3, - "line": 38 + "line": 39 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.updatedInfo", "start": { "column": 15, - "line": 35 + "line": 36 } }, { "defaultMessage": "!!!Workspace has been deleted", "end": { "column": 3, - "line": 42 + "line": 43 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.deletedInfo", "start": { "column": 15, - "line": 39 + "line": 40 } }, { "defaultMessage": "!!!Info about workspace feature", "end": { "column": 3, - "line": 46 + "line": 47 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.workspaceFeatureInfo", "start": { "column": 24, - "line": 43 + "line": 44 } }, { "defaultMessage": "!!!Less is More: Introducing Franz Workspaces", "end": { "column": 3, - "line": 50 + "line": 51 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.workspaceFeatureHeadline", "start": { "column": 28, - "line": 47 + "line": 48 } } ], -- cgit v1.2.3-54-g00ecf From 71f67c07d25919d6f6ba6655479b6c17c394a69c Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Mon, 21 Oct 2019 16:13:31 +0200 Subject: don't initialize menu & touchbar on /payment/ routes --- src/lib/Menu.js | 4 +++- src/lib/TouchBar.js | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib/Menu.js b/src/lib/Menu.js index cda33baef..c0c9d940d 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js @@ -636,7 +636,9 @@ export default class FranzMenu { // need to clone object so we don't modify computed (cached) object const serviceTpl = Object.assign([], this.serviceTpl()); - if (window.franz === undefined) { + // Don't initialize when window.franz is undefined or when we are on a payment window route + if (window.franz === undefined || this.stores.router.location.pathname.startsWith('/payment/')) { + console.log('skipping menu init'); return; } diff --git a/src/lib/TouchBar.js b/src/lib/TouchBar.js index 1de46d2a3..32f546644 100644 --- a/src/lib/TouchBar.js +++ b/src/lib/TouchBar.js @@ -24,6 +24,10 @@ export default class FranzTouchBar { _build() { const currentWindow = remote.getCurrentWindow(); + if (this.stores.router.location.pathname.startsWith('/payment/')) { + return; + } + if (this.stores.user.isLoggedIn) { const { TouchBar } = remote; const { TouchBarButton, TouchBarSpacer } = TouchBar; -- cgit v1.2.3-54-g00ecf From 0a0a076e593ede83dc3ad70ec131491834253752 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Mon, 21 Oct 2019 16:29:04 +0200 Subject: provide a float instead of mixed string and int --- src/features/trialStatusBar/containers/TrialStatusBarScreen.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js index 35b70a5bc..e15a1204f 100644 --- a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js +++ b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js @@ -81,7 +81,7 @@ class TrialStatusBarScreen extends Component { upgradeAccount({ planId: user.team.plan, -- cgit v1.2.3-54-g00ecf From a36d3c0b14aa2cb4813d072182396f1f1975ef8c Mon Sep 17 00:00:00 2001 From: FranzBot Date: Tue, 22 Oct 2019 00:00:21 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/es.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index fdc3b22af..46992b183 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -6,8 +6,8 @@ "feature.delayApp.text" : "Franz continuará en {seconds} segundos.", "feature.delayApp.trial.action" : "Si! Quiero probar Franz Profesional por 14 días, gratis!", "feature.delayApp.trial.actionShort" : "Activar el período de prueba de Franz Profesional", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", - "feature.delayApp.upgrade.action" : "Upgrade Franz", + "feature.delayApp.trial.headline" : "Prueba gratuitamente Franz Professional por 14 días", + "feature.delayApp.upgrade.action" : "Actualizar Franz", "feature.delayApp.upgrade.actionShort" : "Mejora tu cuenta", "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", "feature.planSelection.cta.stayOnFree" : "Stay on Free", -- cgit v1.2.3-54-g00ecf From 612ed5d3ea1d4c382f7a52b4ed9350eb68849085 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 22 Oct 2019 10:12:36 +0200 Subject: don't show plan selection when user is premium (edge case) --- src/features/planSelection/store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/features/planSelection/store.js b/src/features/planSelection/store.js index 8622d4e5a..448e323ff 100644 --- a/src/features/planSelection/store.js +++ b/src/features/planSelection/store.js @@ -19,8 +19,8 @@ export default class PlanSelectionStore extends FeatureStore { @observable hideOverlay = false; @computed get showPlanSelectionOverlay() { - const { team } = this.stores.user; - if (team && !this.hideOverlay) { + const { team, isPremium } = this.stores.user; + if (team && !this.hideOverlay && !isPremium) { return team.state === 'expired' && !team.userHasDowngraded; } -- cgit v1.2.3-54-g00ecf From a164ecbdc849e86e9453633bc640dcb6fe75a688 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 22 Oct 2019 10:12:55 +0200 Subject: refine analytics events --- src/features/planSelection/components/PlanSelection.js | 5 +++++ src/features/planSelection/containers/PlanSelectionScreen.js | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js index 355187516..aff6bf94f 100644 --- a/src/features/planSelection/components/PlanSelection.js +++ b/src/features/planSelection/components/PlanSelection.js @@ -12,6 +12,7 @@ import { i18nPlanName } from '../../../helpers/plan-helpers'; import { PLANS } from '../../../config'; import { FeatureList } from '../../../components/ui/FeatureList'; import Appear from '../../../components/ui/effects/Appear'; +import { gaPage } from '../../../lib/analytics'; const messages = defineMessages({ welcome: { @@ -163,6 +164,10 @@ class PlanSelection extends Component { intl: intlShape, }; + componentDidMount() { + gaPage('/select-plan'); + } + render() { const { classes, diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js index 6e8cdbf47..3f9638e9d 100644 --- a/src/features/planSelection/containers/PlanSelectionScreen.js +++ b/src/features/planSelection/containers/PlanSelectionScreen.js @@ -9,7 +9,7 @@ import UserStore from '../../../stores/UserStore'; import PlanSelection from '../components/PlanSelection'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; import { planSelectionStore, GA_CATEGORY_PLAN_SELECTION } from '..'; -import { gaEvent } from '../../../lib/analytics'; +import { gaEvent, gaPage } from '../../../lib/analytics'; const { dialog, app } = remote; @@ -80,6 +80,8 @@ class PlanSelectionScreen extends Component { } }} stayOnFree={() => { + gaPage('/select-plan/downgrade'); + const selection = dialog.showMessageBoxSync(app.mainWindow, { type: 'question', message: intl.formatMessage(messages.dialogTitle), @@ -101,7 +103,7 @@ class PlanSelectionScreen extends Component { } else { this.upgradeAccount(plans.personal.yearly.id); - gaEvent(GA_CATEGORY_PLAN_SELECTION, 'SelectPlan', 'Revoke'); + gaEvent(GA_CATEGORY_PLAN_SELECTION, 'SelectPlan', 'Downgrade'); } }} subscriptionExpired={user.team && user.team.state === 'expired' && !user.team.userHasDowngraded} -- cgit v1.2.3-54-g00ecf From 2ce12f33ac9692d5b126b94f8073ce80a0de7596 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 22 Oct 2019 10:32:06 +0200 Subject: beautify settings --- src/electron/Settings.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/electron/Settings.js b/src/electron/Settings.js index 63f43b6b7..e4ad6b612 100644 --- a/src/electron/Settings.js +++ b/src/electron/Settings.js @@ -47,7 +47,9 @@ export default class Settings { } _writeFile() { - outputJsonSync(this.settingsFile, this.store); + outputJsonSync(this.settingsFile, this.store, { + spaces: 2, + }); debug('Write settings file', this.type, toJS(this.store)); } -- cgit v1.2.3-54-g00ecf From 806b0a086312ca12ed46bc1a634be6694e277308 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 22 Oct 2019 10:32:15 +0200 Subject: Add `liftSingleInstanceLock` to settings --- src/index.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/index.js b/src/index.js index 7de7a5e1c..3056a8bec 100644 --- a/src/index.js +++ b/src/index.js @@ -64,8 +64,15 @@ if (isWindows) { app.setAppUserModelId(appId); } +// Initialize Settings +const settings = new Settings('app', DEFAULT_APP_SETTINGS); +const proxySettings = new Settings('proxy'); + +// add `liftSingleInstanceLock` to settings.json to override the single instance lock +const liftSingleInstanceLock = settings.get('liftSingleInstanceLock') || false; + // Force single window -const gotTheLock = app.requestSingleInstanceLock(); +const gotTheLock = liftSingleInstanceLock ? true : app.requestSingleInstanceLock(); if (!gotTheLock) { app.quit(); } else { @@ -112,10 +119,6 @@ if (isLinux && ['Pantheon', 'Unity:Unity7'].indexOf(process.env.XDG_CURRENT_DESK process.env.XDG_CURRENT_DESKTOP = 'Unity'; } -// Initialize Settings -const settings = new Settings('app', DEFAULT_APP_SETTINGS); -const proxySettings = new Settings('proxy'); - // Disable GPU acceleration if (!settings.get('enableGPUAcceleration')) { debug('Disable GPU Acceleration'); -- cgit v1.2.3-54-g00ecf From a7615ae9550e6456b4e08843891f45ab503f4cc4 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Tue, 22 Oct 2019 11:50:15 +0200 Subject: update strings --- src/i18n/locales/defaultMessages.json | 44 +++++++++++----------- .../planSelection/components/PlanSelection.json | 44 +++++++++++----------- 2 files changed, 44 insertions(+), 44 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 9818dca87..9b77fe34c 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3998,143 +3998,143 @@ "defaultMessage": "!!!Are you ready to choose, {name}", "end": { "column": 3, - "line": 20 + "line": 21 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.fullscreen.welcome", "start": { "column": 11, - "line": 17 + "line": 18 } }, { "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "end": { "column": 3, - "line": 24 + "line": 25 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.fullscreen.subheadline", "start": { "column": 15, - "line": 21 + "line": 22 } }, { "defaultMessage": "!!!Basic functionality", "end": { "column": 3, - "line": 28 + "line": 29 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.free.text", "start": { "column": 12, - "line": 25 + "line": 26 } }, { "defaultMessage": "!!!More services, no waiting - ideal for personal use.", "end": { "column": 3, - "line": 32 + "line": 33 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.personal.text", "start": { "column": 16, - "line": 29 + "line": 30 } }, { "defaultMessage": "!!!Unlimited services and professional features for you - and your team.", "end": { "column": 3, - "line": 36 + "line": 37 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.pro.text", "start": { "column": 20, - "line": 33 + "line": 34 } }, { "defaultMessage": "!!!Stay on Free", "end": { "column": 3, - "line": 40 + "line": 41 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.stayOnFree", "start": { "column": 17, - "line": 37 + "line": 38 } }, { "defaultMessage": "!!!Downgrade to Free", "end": { "column": 3, - "line": 44 + "line": 45 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.ctaDowngradeFree", "start": { "column": 20, - "line": 41 + "line": 42 } }, { "defaultMessage": "!!!Start my free 14-days Trial", "end": { "column": 3, - "line": 48 + "line": 49 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.trial", "start": { "column": 15, - "line": 45 + "line": 46 } }, { "defaultMessage": "!!!Choose Personal", "end": { "column": 3, - "line": 52 + "line": 53 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.upgradePersonal", "start": { "column": 23, - "line": 49 + "line": 50 } }, { "defaultMessage": "!!!Choose Professional", "end": { "column": 3, - "line": 56 + "line": 57 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.cta.upgradePro", "start": { "column": 18, - "line": 53 + "line": 54 } }, { "defaultMessage": "!!!Complete comparison of all plans", "end": { "column": 3, - "line": 60 + "line": 61 }, "file": "src/features/planSelection/components/PlanSelection.js", "id": "feature.planSelection.fullFeatureList", "start": { "column": 19, - "line": 57 + "line": 58 } } ], diff --git a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json b/src/i18n/messages/src/features/planSelection/components/PlanSelection.json index 2e66c8dfe..685e81e82 100644 --- a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json +++ b/src/i18n/messages/src/features/planSelection/components/PlanSelection.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Are you ready to choose, {name}", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 17, + "line": 18, "column": 11 }, "end": { - "line": 20, + "line": 21, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 21, + "line": 22, "column": 15 }, "end": { - "line": 24, + "line": 25, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Basic functionality", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 25, + "line": 26, "column": 12 }, "end": { - "line": 28, + "line": 29, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!More services, no waiting - ideal for personal use.", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 29, + "line": 30, "column": 16 }, "end": { - "line": 32, + "line": 33, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Unlimited services and professional features for you - and your team.", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 33, + "line": 34, "column": 20 }, "end": { - "line": 36, + "line": 37, "column": 3 } }, @@ -69,11 +69,11 @@ "defaultMessage": "!!!Stay on Free", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 37, + "line": 38, "column": 17 }, "end": { - "line": 40, + "line": 41, "column": 3 } }, @@ -82,11 +82,11 @@ "defaultMessage": "!!!Downgrade to Free", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 41, + "line": 42, "column": 20 }, "end": { - "line": 44, + "line": 45, "column": 3 } }, @@ -95,11 +95,11 @@ "defaultMessage": "!!!Start my free 14-days Trial", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 45, + "line": 46, "column": 15 }, "end": { - "line": 48, + "line": 49, "column": 3 } }, @@ -108,11 +108,11 @@ "defaultMessage": "!!!Choose Personal", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 49, + "line": 50, "column": 23 }, "end": { - "line": 52, + "line": 53, "column": 3 } }, @@ -121,11 +121,11 @@ "defaultMessage": "!!!Choose Professional", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 53, + "line": 54, "column": 18 }, "end": { - "line": 56, + "line": 57, "column": 3 } }, @@ -134,11 +134,11 @@ "defaultMessage": "!!!Complete comparison of all plans", "file": "src/features/planSelection/components/PlanSelection.js", "start": { - "line": 57, + "line": 58, "column": 19 }, "end": { - "line": 60, + "line": 61, "column": 3 } } -- cgit v1.2.3-54-g00ecf From 184c1f0ad49173ac7094c23405cb00287d110e5b Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 23 Oct 2019 11:51:48 +0200 Subject: Remove analytics event in componentDidMount --- src/features/planSelection/containers/PlanSelectionScreen.js | 4 ---- 1 file changed, 4 deletions(-) (limited to 'src') diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js index 3f9638e9d..cb62f45d3 100644 --- a/src/features/planSelection/containers/PlanSelectionScreen.js +++ b/src/features/planSelection/containers/PlanSelectionScreen.js @@ -38,10 +38,6 @@ class PlanSelectionScreen extends Component { intl: intlShape, }; - componentDidMount() { - gaEvent(GA_CATEGORY_PLAN_SELECTION, 'show'); - } - upgradeAccount(planId) { const { upgradeAccount } = this.props.actions.payment; -- cgit v1.2.3-54-g00ecf From 65e68cfce042b238f4d2a1f9cd79fa11426186ea Mon Sep 17 00:00:00 2001 From: FranzBot Date: Wed, 23 Oct 2019 12:00:21 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/de.json | 104 +++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 52 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 74579592a..0042d0596 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -2,28 +2,28 @@ "app.errorHandler.action" : "Neu laden", "app.errorHandler.headline" : "Es ist ein Fehler aufgetreten", "feature.announcements.changelog.headline" : "Was ist neu in Franz {version}", - "feature.delayApp.headline" : "Upgrade your Franz plan to skip the wait", + "feature.delayApp.headline" : "Führe ein Upgrade deines Accounts durch, um nicht mehr warten zu müssen", "feature.delayApp.text" : "In {seconds} Sekunden geht's weiter!", "feature.delayApp.trial.action" : "Ja, ich möchte Franz Professional 14 Tage gratis testen", "feature.delayApp.trial.actionShort" : "Aktiviere die kostenlose Franz Professional Testlizenz", - "feature.delayApp.trial.headline" : "Get the free Franz Professional 14-days trial and skip the wait", - "feature.delayApp.upgrade.action" : "Upgrade Franz", + "feature.delayApp.trial.headline" : "Hol dir eine 14-tägige kostenlose Franz Professional Testlizenz und überspringe die Wartezeit", + "feature.delayApp.upgrade.action" : "Franz Upgrade durchführen", "feature.delayApp.upgrade.actionShort" : "Account upgraden", - "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade to Free", - "feature.planSelection.cta.stayOnFree" : "Stay on Free", - "feature.planSelection.cta.trial" : "Start my free 14-days Trial", - "feature.planSelection.cta.upgradePersonal" : "Choose Personal", - "feature.planSelection.cta.upgradePro" : "Choose Professional", - "feature.planSelection.free.text" : "Basic functionality", - "feature.planSelection.fullFeatureList" : "Complete comparison of all plans", - "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade to Free", - "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Choose Personal", - "feature.planSelection.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", - "feature.planSelection.fullscreen.dialog.title" : "Downgrade your Franz Plan", - "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", - "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", - "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", - "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", + "feature.planSelection.cta.ctaDowngradeFree" : "Downgrade zu Free", + "feature.planSelection.cta.stayOnFree" : "Ich bleibe bei Free", + "feature.planSelection.cta.trial" : "Starte meine 14-tägige kostenlose Testlizenz", + "feature.planSelection.cta.upgradePersonal" : "Ich will Franz Personal", + "feature.planSelection.cta.upgradePro" : "Ich will Franz Professional", + "feature.planSelection.free.text" : "Das Minimum", + "feature.planSelection.fullFeatureList" : "Alle Lizenzen im Vergleich", + "feature.planSelection.fullscreen.dialog.cta.downgrade" : "Downgrade zu Free", + "feature.planSelection.fullscreen.dialog.cta.upgrade" : "Ich will Franz Personal", + "feature.planSelection.fullscreen.dialog.message" : "Dein Account wird auf Free herabgestuft - bist du sicher? Klicke hier für mehr Services und Funktionen für nur {currency}{price} pro Monat.", + "feature.planSelection.fullscreen.dialog.title" : "Downgrade deines Franz Accounts", + "feature.planSelection.fullscreen.subheadline" : "Es ist Zeit für eine Entscheidung! Mit Personal und Professional holst du das Beste aus Franz heraus. Hier ist ein Überblick für dich, wähle aus was zu dir passt.", + "feature.planSelection.fullscreen.welcome" : "{name}, bist du bereit?", + "feature.planSelection.personal.text" : "Mehr Services, kein Warten - ideal für private Nutzung.", + "feature.planSelection.pro.text" : "Unlimitierte Services und alle Features für dich - und dein Team.", "feature.serviceLimit.limitReached" : "Du hast {amount} von {limit} in deiner Lizenz inkludierten Services hinzugefügt. Bitte führe ein Upgrade deines Accounts durch, um mehr Services hinzuzufügen.", "feature.shareFranz.action.email" : "Als E-Mail senden", "feature.shareFranz.action.facebook" : "Auf Facebook teilen", @@ -35,13 +35,13 @@ "feature.todos.premium.info" : "Franz ToDos sind jetzt für Premium User verfügbar!", "feature.todos.premium.rollout" : "Alle anderen müssen sich noch ein wenig gedulden.", "feature.todos.premium.upgrade" : "Account Upgrade", - "feature.trialStatusBar.cta" : "Upgrade now", - "feature.trialStatusBar.expired" : "Your free Franz {plan} Trial has expired, please upgrade your account.", - "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade to Free", - "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Choose Personal", - "feature.trialStatusBar.fullscreen.dialog.message" : "You're about to downgrade to our Free account. Are you sure? Click here instead to get more services and functionality for just {currency}{price} a month.", - "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade your Franz Plan", - "feature.trialStatusBar.restTime" : "Your Free Franz {plan} Trial ends in {time}.", + "feature.trialStatusBar.cta" : "Upgrade jetzt durchführen", + "feature.trialStatusBar.expired" : "Deine kostenlose Franz {plan} Testlizenz ist abgelaufen, bitte führe ein Upgrade deines Accounts durch.", + "feature.trialStatusBar.fullscreen.dialog.cta.downgrade" : "Downgrade zu Free", + "feature.trialStatusBar.fullscreen.dialog.cta.upgrade" : "Ich will Franz Personal", + "feature.trialStatusBar.fullscreen.dialog.message" : "Dein Account wird zu Free herabgestuft, bist du sicher? Klicke hier für mehr Services und Funktionen für nur {currency}{price} im Monat.", + "feature.trialStatusBar.fullscreen.dialog.title" : "Downgrade durchführen", + "feature.trialStatusBar.restTime" : "Deine kostenlose Franz {plan} Testlizenz endet in {time}.", "global.api.unhealthy" : "Verbindung zum Franz-Online-Service fehlgeschlagen", "global.franzProRequired" : "Franz Professional benötigt", "global.notConnectedToTheInternet" : "Du bist nicht mit dem Internet verbunden.", @@ -116,7 +116,7 @@ "menu.services.goHome" : "Home", "menu.services.setNextServiceActive" : "Nächster Dienst", "menu.todos" : "ToDos", - "menu.todos.enableTodos" : "Enable Todos", + "menu.todos.enableTodos" : "Todos aktivieren", "menu.view" : "Darstellung", "menu.view.enterFullScreen" : "Vollbildmodus", "menu.view.exitFullScreen" : "Vollbildmodus aus", @@ -145,42 +145,42 @@ "password.submit.label" : "Absenden", "password.successInfo" : "Wir haben Dir eine E-Mail mit weiteren Anweisungen geschickt.", "premiumFeature.button.upgradeAccount" : "Account upgraden", - "pricing.features.accountSync" : "Account Synchronisation", + "pricing.features.accountSync" : "Account Synchronisierung", "pricing.features.adFree" : "Keine Werbung", "pricing.features.appDelays" : "Keine unnötigen Unterbrechungen", "pricing.features.customWebsites" : "Hinzufügen von eigenen Websites", - "pricing.features.desktopNotifications" : "Desktop Notifications", + "pricing.features.desktopNotifications" : "Desktop Benachrichtigungen", "pricing.features.onPremise" : "On-premise & andere Hosted Services", - "pricing.features.recipes" : "Choose from more than 70 Services", + "pricing.features.recipes" : "Wähle aus über 70 Services", "pricing.features.serviceProxies" : "Service Proxies", "pricing.features.spellchecker" : "Rechtschreibprüfung", "pricing.features.teamManagement" : "Team Management", "pricing.features.thirdPartyServices" : "Integration von Services über Drittanbieter", "pricing.features.unlimitedServices" : "Unbegrenztes hinzufügen von Services", - "pricing.features.upToSixServices" : "Add up to 6 services", - "pricing.features.upToThreeServices" : "Add up to 3 services", + "pricing.features.upToSixServices" : "Füge bis zu 6 Services hinzu", + "pricing.features.upToThreeServices" : "Füge bis zu 3 Services hinzu", "pricing.features.workspaces" : "Workspaces", "pricing.plan.free" : "Free", "pricing.plan.legacy" : "Premium", "pricing.plan.personal" : "Personal", - "pricing.plan.personal-monthly" : "Personal Monthly", - "pricing.plan.personal-yearly" : "Personal Yearly", + "pricing.plan.personal-monthly" : "Personal monatlich", + "pricing.plan.personal-yearly" : "Personal jährlich", "pricing.plan.pro" : "Professional", - "pricing.plan.pro-monthly" : "Professional Monthly", - "pricing.plan.pro-yearly" : "Professional Yearly", - "pricing.trial.cta.accept" : "Start my 14-day Franz Professional Trial ", + "pricing.plan.pro-monthly" : "Professional monatlich", + "pricing.plan.pro-yearly" : "Professional jährlich", + "pricing.trial.cta.accept" : "Starte meine 14-tägige Franz Professional Testlizenz", "pricing.trial.cta.skip" : "Weiter zu Franz!", - "pricing.trial.cta.start" : "Start using Franz", + "pricing.trial.cta.start" : "Los geht's mit Franz!", "pricing.trial.error" : "Tut uns leid, wir konnten deine kostenlose Testlizenz nicht aktivieren.", "pricing.trial.features.headline" : "Franz Professional beinhaltet:", - "pricing.trial.headline.pro" : "Hi {name}, welcome to Franz", - "pricing.trial.intro.happyMessaging" : "Happy messaging,", - "pricing.trial.intro.specialTreat" : "We have a special treat for you.", - "pricing.trial.intro.tryPro" : "Enjoy the full Franz Professional experience completely free for 14 days.", + "pricing.trial.headline.pro" : "Hi {name}, willkommen bei Franz", + "pricing.trial.intro.happyMessaging" : "Viel Spaß,", + "pricing.trial.intro.specialTreat" : "Wir haben ein besonderes Geschenk für dich.", + "pricing.trial.intro.tryPro" : "Hol dir Franz Professional kostenlos für 14 Tage.", "pricing.trial.terms.automaticTrialEnd" : "Deine kostenlose Testlizenz endet automatisch nach 14 Tagen", "pricing.trial.terms.headline" : "Ohne Bindung, ohne Haken", "pricing.trial.terms.noCreditCard" : "Keine Kreditkarte notwendig", - "pricing.trial.terms.trialWorth" : "Free trial (normally {currency}{price} per month)", + "pricing.trial.terms.trialWorth" : "Kostenlose Testlizenz (sonst {currency}{price} im Monat)", "service.crashHandler.action" : "{name} neu laden", "service.crashHandler.autoReload" : "{name} wird in {seconds} Sekunden automatisch wiederhergestellt", "service.crashHandler.headline" : "Oh nein!", @@ -240,7 +240,7 @@ "settings.app.form.enableSpellchecking" : "Rechtschreibprüfung aktivieren", "settings.app.form.enableSystemTray" : "Franz im Infobereich anzeigen", "settings.app.form.enableTodos" : "Franz Todos aktivieren", - "settings.app.form.keepAllWorkspacesLoaded" : "Keep all workspaces loaded", + "settings.app.form.keepAllWorkspacesLoaded" : "Alle Dienste in den Workspaces aktiv lassen", "settings.app.form.language" : "Sprache", "settings.app.form.minimizeToSystemTray" : "Franz in den Infobereich minimieren", "settings.app.form.runInBackground" : "Franz im Hintergrund behalten, wenn das Fenster geschlossen wird", @@ -362,10 +362,10 @@ "settings.workspaces.workspaceFeatureInfo" : "Mit Franz Workspaces hast du alles im Blick, was gerade wichtig ist - und nur das. Erstelle unterschiedliche Sets von Services, und wechsle jederzeit zwischen ihnen hin und her. Du entscheidest welche Services du wann und wo brauchst, um ungestört arbeiten zu können - oder zu Hause besser abzuschalten.", "settings.workspaces.workspacesRequestFailed" : "Workspaces konnte nicht geladen werden", "sidebar.addNewService" : "Neuen Dienst hinzufügen", - "sidebar.closeTodosDrawer" : "Close Franz Todos", + "sidebar.closeTodosDrawer" : "Franz Todos schließen", "sidebar.closeWorkspaceDrawer" : "Workspaces schließen", "sidebar.muteApp" : "Benachrichtigungen & Audio deaktivieren", - "sidebar.openTodosDrawer" : "Open Franz Todos", + "sidebar.openTodosDrawer" : "Franz Todos öffnen", "sidebar.openWorkspaceDrawer" : "Workspaces öffnen", "sidebar.settings" : "Einstellungen", "sidebar.unmuteApp" : "Benachrichtigungen & Audio aktivieren", @@ -380,14 +380,14 @@ "signup.link.login" : "Du hast bereits ein Konto? Melde Dich an.", "signup.password.label" : "Passwort", "signup.submit.label" : "Konto erstellen", - "subscription.bestValue" : "Best value", + "subscription.bestValue" : "Bester Preis", "subscription.cta.activateTrial" : "Ja, kostenlose Franz Professional Testlizenz starten", "subscription.cta.allOptions" : "Alle Optionen anzeigen", "subscription.cta.choosePlan" : "Wähle deine Lizenz", "subscription.includedProFeatures" : "Die Franz Professional Lizenz beinhaltet:", - "subscription.interval.per" : "per {interval}", - "subscription.interval.perMonth" : "per month", - "subscription.interval.perMonthPerUser" : "per month & user", + "subscription.interval.per" : "pro {interval}", + "subscription.interval.perMonth" : "pro Monat", + "subscription.interval.perMonthPerUser" : "pro Monat & User", "subscription.planItem.upgradeAccount" : "Account Upgrade", "subscription.teaser.includedFeatures" : "Bezahlte Franz Lizenzen beinhalten:", "subscription.teaser.intro" : "Franz 5 ist voll gepackt mit vielen neuen Features, damit du für jegliche kommunikative Eventualität gerüstet bist. Nimm dir was du brauchst und leg los!", @@ -407,10 +407,10 @@ "validation.oneRequired" : "Mindestens ein Wert wird benötigt", "validation.required" : "{field} wird benötigt", "validation.url" : "{field} ist keine gültige URL", - "webControls.back" : "Back", - "webControls.forward" : "Forward", + "webControls.back" : "Zurück", + "webControls.forward" : "Weiter", "webControls.goHome" : "Home", - "webControls.openInBrowser" : "Open in Browser", + "webControls.openInBrowser" : "Im Browser öffnen", "webControls.reload" : "Neu laden", "welcome.loginButton" : "Bei Franz einloggen", "welcome.signupButton" : "Kostenloses Konto erstellen", -- cgit v1.2.3-54-g00ecf From c4f369510632704114c3f162ac61b81a47dad7c5 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 23 Oct 2019 14:06:39 +0200 Subject: Add price disclaimer --- .../planSelection/components/PlanSelection.js | 46 +++++++++++++++++----- src/i18n/locales/defaultMessages.json | 13 ++++++ src/i18n/locales/en-US.json | 3 +- .../planSelection/components/PlanSelection.json | 13 ++++++ 4 files changed, 64 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js index aff6bf94f..b6bb9d32d 100644 --- a/src/features/planSelection/components/PlanSelection.js +++ b/src/features/planSelection/components/PlanSelection.js @@ -6,7 +6,7 @@ import { defineMessages, intlShape } from 'react-intl'; import { H1, H2, Icon } from '@meetfranz/ui'; import color from 'color'; -import { mdiRocket } from '@mdi/js'; +import { mdiRocket, mdiArrowRight } from '@mdi/js'; import PlanItem from './PlanItem'; import { i18nPlanName } from '../../../helpers/plan-helpers'; import { PLANS } from '../../../config'; @@ -59,6 +59,10 @@ const messages = defineMessages({ id: 'feature.planSelection.fullFeatureList', defaultMessage: '!!!Complete comparison of all plans', }, + pricesBasedOnAnnualPayment: { + id: 'feature.planSelection.pricesBasedOnAnnualPayment', + defaultMessage: '!!!All prices based on yearly payment', + }, }); const styles = theme => ({ @@ -132,11 +136,23 @@ const styles = theme => ({ borderBottom: [1, 'solid', '#CECECE'], }, }, + footer: { + display: 'flex', + color: theme.styleTypes.primary.contrast, + marginTop: 20, + padding: [0, 15], + }, fullFeatureList: { - marginTop: 40, + marginRight: 'auto', textAlign: 'center', - display: 'block', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', color: `${theme.styleTypes.primary.contrast} !important`, + + '& svg': { + marginRight: 5, + }, }, scrollContainer: { border: '1px solid red', @@ -145,6 +161,10 @@ const styles = theme => ({ featuredPlan: { transform: 'scale(1.05)', }, + disclaimer: { + textAlign: 'right', + margin: [10, 15, 0, 0], + }, }); @injectSheet(styles) @observer @@ -238,13 +258,19 @@ class PlanSelection extends Component { />

- - {intl.formatMessage(messages.fullFeatureList)} - +
+ + + {intl.formatMessage(messages.fullFeatureList)} + + {/*

*/} + {intl.formatMessage(messages.pricesBasedOnAnnualPayment)} + {/*

*/} +
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 9b77fe34c..9dfaf959d 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -4136,6 +4136,19 @@ "column": 19, "line": 58 } + }, + { + "defaultMessage": "!!!All prices are based on the yearly plan", + "end": { + "column": 3, + "line": 65 + }, + "file": "src/features/planSelection/components/PlanSelection.js", + "id": "feature.planSelection.pricesBasedOnAnnualPayment", + "start": { + "column": 30, + "line": 62 + } } ], "path": "src/features/planSelection/components/PlanSelection.json" diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 8bef09d4d..6e84d47f7 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}?", "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment", "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached": "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email": "Send as email", @@ -425,4 +426,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} \ No newline at end of file +} diff --git a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json b/src/i18n/messages/src/features/planSelection/components/PlanSelection.json index 685e81e82..7f1de6cfd 100644 --- a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json +++ b/src/i18n/messages/src/features/planSelection/components/PlanSelection.json @@ -141,5 +141,18 @@ "line": 61, "column": 3 } + }, + { + "id": "feature.planSelection.pricesBasedOnAnnualPayment", + "defaultMessage": "!!!All prices based on yearly payment", + "file": "src/features/planSelection/components/PlanSelection.js", + "start": { + "line": 62, + "column": 30 + }, + "end": { + "line": 65, + "column": 3 + } } ] \ No newline at end of file -- cgit v1.2.3-54-g00ecf From ea9249028dd3561fb630a1c0a2ec250c994f1947 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 23 Oct 2019 14:17:12 +0200 Subject: Update strings --- src/i18n/locales/defaultMessages.json | 2 +- src/i18n/locales/en-US.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 9dfaf959d..9cfeaed42 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -4138,7 +4138,7 @@ } }, { - "defaultMessage": "!!!All prices are based on the yearly plan", + "defaultMessage": "!!!All prices based on yearly payment", "end": { "column": 3, "line": 65 diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 6e84d47f7..a701836dc 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -426,4 +426,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf From 0baa9572d905a225451fe26ebcdbcef78e270cbd Mon Sep 17 00:00:00 2001 From: FranzBot Date: Wed, 23 Oct 2019 12:21:00 +0000 Subject: Automatic i18n update (i18n.meetfranz.com) --- src/i18n/locales/ca.json | 1 + src/i18n/locales/cs.json | 1 + src/i18n/locales/de.json | 1 + src/i18n/locales/el.json | 1 + src/i18n/locales/es.json | 1 + src/i18n/locales/fr.json | 1 + src/i18n/locales/ga.json | 1 + src/i18n/locales/hr.json | 1 + src/i18n/locales/hu.json | 1 + src/i18n/locales/id.json | 1 + src/i18n/locales/it.json | 1 + src/i18n/locales/ja.json | 1 + src/i18n/locales/ka.json | 1 + src/i18n/locales/nl-BE.json | 1 + src/i18n/locales/nl.json | 1 + src/i18n/locales/pl.json | 1 + src/i18n/locales/pt-BR.json | 1 + src/i18n/locales/pt.json | 1 + src/i18n/locales/ru.json | 1 + src/i18n/locales/sk.json | 1 + src/i18n/locales/sr.json | 1 + src/i18n/locales/tr.json | 1 + src/i18n/locales/uk.json | 1 + src/i18n/locales/zh-TW.json | 1 + 24 files changed, 24 insertions(+) (limited to 'src') diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json index 79deb7c87..897bcbf8f 100644 --- a/src/i18n/locales/ca.json +++ b/src/i18n/locales/ca.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Envia com a correu", diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json index 658c813e6..636c2f12a 100644 --- a/src/i18n/locales/cs.json +++ b/src/i18n/locales/cs.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Přidali jste {amount} z {limit} služeb, které jsou součástí vašeho předplatného. Pro přidání dalších služeb proveďte upgrade vašeho účtu.", "feature.shareFranz.action.email" : "Poslat jako e-mail", diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 0042d0596..dd2fa5554 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "Es ist Zeit für eine Entscheidung! Mit Personal und Professional holst du das Beste aus Franz heraus. Hier ist ein Überblick für dich, wähle aus was zu dir passt.", "feature.planSelection.fullscreen.welcome" : "{name}, bist du bereit?", "feature.planSelection.personal.text" : "Mehr Services, kein Warten - ideal für private Nutzung.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimitierte Services und alle Features für dich - und dein Team.", "feature.serviceLimit.limitReached" : "Du hast {amount} von {limit} in deiner Lizenz inkludierten Services hinzugefügt. Bitte führe ein Upgrade deines Accounts durch, um mehr Services hinzuzufügen.", "feature.shareFranz.action.email" : "Als E-Mail senden", diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json index b9995de0b..dc6d27849 100644 --- a/src/i18n/locales/el.json +++ b/src/i18n/locales/el.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Send as email", diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 46992b183..0b5f60ef7 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Has sumado {amount} servicios más de los que están incluídos en tu plan. Por favor mejora tu cuenta para sumar más servicios.", "feature.shareFranz.action.email" : "Enviar como correo", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index ee4df697a..cef9a4e76 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Vous avez ajouté {amount} services sur les {limit} qui sont inclus dans votre offre. Veuillez améliorer votre compte pour ajouter plus de services.", "feature.shareFranz.action.email" : "Envoyer par mail", diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json index d206c04e1..d7520e27b 100644 --- a/src/i18n/locales/ga.json +++ b/src/i18n/locales/ga.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Tá {amount} as {limit} seirbhísí atá san áireamh i do phlean curtha agat cheana féin. Uasghrádaigh do chuntas chun tuilleadh seirbhísí a chur leis, le do thoil.", "feature.shareFranz.action.email" : "Seol mar ríomhphost", diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json index 7fb3169e5..8640a215b 100644 --- a/src/i18n/locales/hr.json +++ b/src/i18n/locales/hr.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Send as email", diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json index 4bf6fc0e3..b537b869b 100644 --- a/src/i18n/locales/hu.json +++ b/src/i18n/locales/hu.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Küldés email-ben", diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json index 40cffb49d..0e1dc7815 100644 --- a/src/i18n/locales/id.json +++ b/src/i18n/locales/id.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Anda telah menambahkan {amount} dari kuota {limit} layanan yang tersedia untuk paket Anda. Tingkatkan akun untuk menambahkan layanan lain.", "feature.shareFranz.action.email" : "Kirim sebagai email", diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json index 2edbfd2e8..350c0ce56 100644 --- a/src/i18n/locales/it.json +++ b/src/i18n/locales/it.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Hai aggiunto {amount} su {limit} servizi che sono inclusi nel tuo piano. Per favore potenzia il tuo account per aggiungere più servizi.", "feature.shareFranz.action.email" : "Manda come email", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 98132854f..f3fe9d59c 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "メールで送信", diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json index c9236622d..7222deb06 100644 --- a/src/i18n/locales/ka.json +++ b/src/i18n/locales/ka.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Send as email", diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json index d5cf9ac1e..c23788237 100644 --- a/src/i18n/locales/nl-BE.json +++ b/src/i18n/locales/nl-BE.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Verstuur als e-mail", diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json index a80f80674..42d4fe995 100644 --- a/src/i18n/locales/nl.json +++ b/src/i18n/locales/nl.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Verstuur als e-mail", diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json index 71b35f626..ae2a62d05 100644 --- a/src/i18n/locales/pl.json +++ b/src/i18n/locales/pl.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Dodałeś {amount} z {limit} usług, które oferuje twój plan. Ulepsz swoje konto, aby dodać więcej usług.", "feature.shareFranz.action.email" : "Wyślij jako email", diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json index ef38e6e0a..3ebbee605 100644 --- a/src/i18n/locales/pt-BR.json +++ b/src/i18n/locales/pt-BR.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "É hora de fazer uma escolha. O Franz trabalha melhor nos nossos planos Pessoal e Profissional. Por favor, dê uma olhada e veja qual a melhor opção para você.", "feature.planSelection.fullscreen.welcome" : "Você está pronto para escolher, {name}?", "feature.planSelection.personal.text" : "Mais serviços, sem espera - ideal para uso pessoal.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Serviços ilimitados e funcionalidades profissionais para você - e seu time.", "feature.serviceLimit.limitReached" : "Você adicionou {amount} serviços de um total de {limit} que estão inclusos no seu plano. Por favor, atualize sua conta para adicionar mais serviços.", "feature.shareFranz.action.email" : "Enviar por e-mail", diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json index 0224668d7..ff2d46b83 100644 --- a/src/i18n/locales/pt.json +++ b/src/i18n/locales/pt.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Enviar por e-mail", diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 133614cf1..725ff0576 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Вы добавили {amount} максимальное {limit} количество сервисов, входящих в ваш план. Пожалуйста, обновите свой план чтобы добавить больше сервисов.", "feature.shareFranz.action.email" : "Отправить по email", diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json index 35752c4ad..df8ee4b47 100644 --- a/src/i18n/locales/sk.json +++ b/src/i18n/locales/sk.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Pridali ste {amount} z {limit} služieb, ktoré sú zahrnuté vo vašom pláne. Ak chcete pridať ďalšie služby, inovujte svoj účet.", "feature.shareFranz.action.email" : "Odoslať ako e-mail", diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json index 889f3e526..97de357ec 100644 --- a/src/i18n/locales/sr.json +++ b/src/i18n/locales/sr.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Send as email", diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json index e20266cd8..c91ade6bb 100644 --- a/src/i18n/locales/tr.json +++ b/src/i18n/locales/tr.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "Mail olarak gönder", diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json index 69b608e94..4cf53d7c4 100644 --- a/src/i18n/locales/uk.json +++ b/src/i18n/locales/uk.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "Ви додали {amount} максимальну {limit} кількість сервісів, що входять в ваш план. Будь ласка, поновіть свій план щоб додати більше сервісів.", "feature.shareFranz.action.email" : "Надіслати по email", diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json index e24b3a6f4..a8000c13d 100644 --- a/src/i18n/locales/zh-TW.json +++ b/src/i18n/locales/zh-TW.json @@ -23,6 +23,7 @@ "feature.planSelection.fullscreen.subheadline" : "It's time to make a choice. Franz works best on our Personal and Professional plans. Please have a look and choose the best one for you.", "feature.planSelection.fullscreen.welcome" : "Are you ready to choose, {name}?", "feature.planSelection.personal.text" : "More services, no waiting - ideal for personal use.", + "feature.planSelection.pricesBasedOnAnnualPayment" : "All prices based on yearly payment", "feature.planSelection.pro.text" : "Unlimited services and professional features for you - and your team.", "feature.serviceLimit.limitReached" : "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", "feature.shareFranz.action.email" : "以電子郵件傳送", -- cgit v1.2.3-54-g00ecf