aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar Vijay A <avijayr@protonmail.com>2021-08-13 00:45:01 +0530
committerLibravatar Vijay A <avijayr@protonmail.com>2021-08-13 00:45:01 +0530
commit2d27d5e66649d4f5baf127a53ee5ae524eae3a59 (patch)
treec592ea219ac8cd987fc367f57b54034c450ab2ab /src
parentFerdi v5.6.0 (diff)
parent5.6.1-nightly.24 [skip ci] (diff)
downloadferdium-app-2d27d5e66649d4f5baf127a53ee5ae524eae3a59.tar.gz
ferdium-app-2d27d5e66649d4f5baf127a53ee5ae524eae3a59.tar.zst
ferdium-app-2d27d5e66649d4f5baf127a53ee5ae524eae3a59.zip
chore: merge from nightly branch into release branch in prep for next beta
Diffstat (limited to 'src')
-rw-r--r--src/actions/index.js6
-rw-r--r--src/actions/lib/actions.js4
-rw-r--r--src/actions/payment.js12
-rw-r--r--src/actions/service.js3
-rw-r--r--src/actions/user.js4
-rw-r--r--src/api/PaymentApi.js14
-rw-r--r--src/api/ServicesApi.js8
-rw-r--r--src/api/UserApi.js4
-rw-r--r--src/api/apiBase.js15
-rw-r--r--src/api/index.js2
-rw-r--r--src/api/server/LocalApi.js20
-rw-r--r--src/api/server/ServerApi.js358
-rw-r--r--src/app.js5
-rw-r--r--src/assets/themeInfo.json2
-rw-r--r--src/components/TrialActivationInfoBar.js94
-rw-r--r--src/components/auth/AuthLayout.js28
-rw-r--r--src/components/auth/ChangeServer.js4
-rw-r--r--src/components/auth/Locked.js2
-rw-r--r--src/components/auth/Login.js2
-rw-r--r--src/components/auth/Password.js2
-rw-r--r--src/components/auth/Pricing.js270
-rw-r--r--src/components/auth/SetupAssistant.js104
-rw-r--r--src/components/auth/Signup.js5
-rw-r--r--src/components/auth/Welcome.js2
-rw-r--r--src/components/layout/AppLayout.js94
-rw-r--r--src/components/layout/Sidebar.js35
-rw-r--r--src/components/services/content/ConnectionLostBanner.js34
-rw-r--r--src/components/services/content/ErrorHandlers/styles.js2
-rw-r--r--src/components/services/content/ServiceRestricted.js78
-rw-r--r--src/components/services/content/ServiceView.js16
-rw-r--r--src/components/services/content/ServiceWebview.js6
-rw-r--r--src/components/services/content/Services.js9
-rw-r--r--src/components/services/content/WebviewCrashHandler.js2
-rw-r--r--src/components/services/tabs/TabBarSortableList.js18
-rw-r--r--src/components/services/tabs/TabItem.js221
-rw-r--r--src/components/services/tabs/Tabbar.js25
-rw-r--r--src/components/settings/account/AccountDashboard.js159
-rw-r--r--src/components/settings/navigation/SettingsNavigation.js16
-rw-r--r--src/components/settings/recipes/RecipeItem.js5
-rw-r--r--src/components/settings/recipes/RecipesDashboard.js77
-rw-r--r--src/components/settings/services/EditServiceForm.js142
-rw-r--r--src/components/settings/services/ServicesDashboard.js6
-rw-r--r--src/components/settings/settings/EditSettingsForm.js91
-rw-r--r--src/components/settings/supportFerdi/SupportFerdiDashboard.js18
-rw-r--r--src/components/settings/team/TeamDashboard.js39
-rw-r--r--src/components/settings/user/EditUserForm.js2
-rw-r--r--src/components/subscription/SubscriptionForm.js78
-rw-r--r--src/components/subscription/SubscriptionPopup.js84
-rw-r--r--src/components/subscription/TrialForm.js115
-rw-r--r--src/components/ui/ActivateTrialButton/index.js107
-rw-r--r--src/components/ui/AppLoader/index.js2
-rw-r--r--src/components/ui/AppLoader/styles.js8
-rw-r--r--src/components/ui/FeatureItem.js2
-rw-r--r--src/components/ui/FeatureList.js83
-rw-r--r--src/components/ui/ImageUpload.js7
-rw-r--r--src/components/ui/Link.js2
-rw-r--r--src/components/ui/Modal/styles.js2
-rw-r--r--src/components/ui/PremiumFeatureContainer/index.js101
-rw-r--r--src/components/ui/PremiumFeatureContainer/styles.js34
-rw-r--r--src/components/ui/Radio.js2
-rw-r--r--src/components/ui/SearchInput.js2
-rw-r--r--src/components/ui/Select.js4
-rw-r--r--src/components/ui/ServiceIcon.js2
-rw-r--r--src/components/ui/Slider.js2
-rw-r--r--src/components/ui/Tabs/TabItem.js8
-rw-r--r--src/components/ui/Tabs/Tabs.js2
-rw-r--r--src/components/ui/Toggle.js2
-rw-r--r--src/components/ui/ToggleRaw.js2
-rw-r--r--src/components/ui/UpgradeButton/index.js83
-rw-r--r--src/components/ui/WebviewLoader/styles.js2
-rw-r--r--src/components/util/ErrorBoundary/styles.js2
-rw-r--r--src/config.js47
-rw-r--r--src/containers/auth/PricingScreen.js83
-rw-r--r--src/containers/auth/SetupAssistantScreen.js35
-rw-r--r--src/containers/auth/SignupScreen.js13
-rw-r--r--src/containers/auth/WelcomeScreen.js2
-rw-r--r--src/containers/layout/AppLayoutContainer.js15
-rw-r--r--src/containers/settings/AccountScreen.js25
-rw-r--r--src/containers/settings/EditServiceScreen.js10
-rw-r--r--src/containers/settings/EditSettingsScreen.js41
-rw-r--r--src/containers/settings/EditUserScreen.js2
-rw-r--r--src/containers/settings/RecipesScreen.js38
-rw-r--r--src/containers/settings/TeamScreen.js3
-rw-r--r--src/containers/subscription/SubscriptionFormScreen.js99
-rw-r--r--src/containers/subscription/SubscriptionPopupScreen.js41
-rw-r--r--src/electron/Settings.js10
-rw-r--r--src/electron/ipc-api/appIndicator.js4
-rw-r--r--src/electron/ipc-api/download.js4
-rw-r--r--src/electron/ipc-api/localServer.js14
-rw-r--r--src/electron/macOSPermissions.js67
-rw-r--r--src/electron/webview-ime-focus.js4
-rw-r--r--src/environment.js60
-rw-r--r--src/features/announcements/api.js8
-rw-r--r--src/features/announcements/components/AnnouncementScreen.js2
-rw-r--r--src/features/communityRecipes/index.js19
-rw-r--r--src/features/communityRecipes/store.js7
-rw-r--r--src/features/delayApp/Component.js120
-rw-r--r--src/features/delayApp/constants.js6
-rw-r--r--src/features/delayApp/index.js80
-rw-r--r--src/features/delayApp/styles.js22
-rw-r--r--src/features/planSelection/actions.js9
-rw-r--r--src/features/planSelection/api.js26
-rw-r--r--src/features/planSelection/components/PlanItem.js215
-rw-r--r--src/features/planSelection/components/PlanSelection.js269
-rw-r--r--src/features/planSelection/containers/PlanSelectionScreen.js120
-rw-r--r--src/features/planSelection/index.js28
-rw-r--r--src/features/planSelection/store.js68
-rw-r--r--src/features/publishDebugInfo/Component.js6
-rw-r--r--src/features/quickSwitch/Component.js4
-rw-r--r--src/features/serviceLimit/components/LimitReachedInfobox.js75
-rw-r--r--src/features/serviceLimit/index.js31
-rw-r--r--src/features/serviceLimit/store.js42
-rw-r--r--src/features/serviceProxy/index.js2
-rw-r--r--src/features/shareFranz/Component.js6
-rw-r--r--src/features/shareFranz/index.js13
-rw-r--r--src/features/spellchecker/index.js27
-rw-r--r--src/features/todos/components/TodosWebview.js20
-rw-r--r--src/features/todos/containers/TodosScreen.js4
-rw-r--r--src/features/todos/store.js15
-rw-r--r--src/features/trialStatusBar/actions.js13
-rw-r--r--src/features/trialStatusBar/components/ProgressBar.js45
-rw-r--r--src/features/trialStatusBar/components/TrialStatusBar.js135
-rw-r--r--src/features/trialStatusBar/containers/TrialStatusBarScreen.js112
-rw-r--r--src/features/trialStatusBar/index.js30
-rw-r--r--src/features/trialStatusBar/store.js72
-rw-r--r--src/features/utils/ActionBinding.js4
-rw-r--r--src/features/utils/FeatureStore.js8
-rw-r--r--src/features/webControls/components/WebControls.js63
-rw-r--r--src/features/webControls/containers/WebControlsScreen.js2
-rw-r--r--src/features/workspaces/api.js2
-rw-r--r--src/features/workspaces/components/WorkspaceDrawer.js143
-rw-r--r--src/features/workspaces/components/WorkspaceDrawerItem.js47
-rw-r--r--src/features/workspaces/components/WorkspaceItem.js2
-rw-r--r--src/features/workspaces/components/WorkspaceServiceListItem.js2
-rw-r--r--src/features/workspaces/components/WorkspaceSwitchingIndicator.js21
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.js129
-rw-r--r--src/features/workspaces/containers/WorkspacesScreen.js4
-rw-r--r--src/features/workspaces/models/Workspace.js4
-rw-r--r--src/features/workspaces/store.js47
-rw-r--r--src/helpers/array-helpers.js6
-rw-r--r--src/helpers/async-helpers.js2
-rw-r--r--src/helpers/plan-helpers.js53
-rw-r--r--src/helpers/recipe-helpers.js11
-rw-r--r--src/helpers/service-helpers.js18
-rw-r--r--src/helpers/userAgent-helpers.js5
-rw-r--r--src/helpers/validation-helpers.js2
-rw-r--r--src/i18n/globalMessages.js4
-rw-r--r--src/i18n/locales/af.json119
-rw-r--r--src/i18n/locales/ar.json155
-rw-r--r--src/i18n/locales/be.json119
-rw-r--r--src/i18n/locales/bg.json92
-rw-r--r--src/i18n/locales/bs.json119
-rw-r--r--src/i18n/locales/ca.json155
-rw-r--r--src/i18n/locales/cs.json155
-rw-r--r--src/i18n/locales/da.json155
-rw-r--r--src/i18n/locales/de.json155
-rw-r--r--src/i18n/locales/defaultMessages.json2882
-rw-r--r--src/i18n/locales/el.json155
-rw-r--r--src/i18n/locales/en-US.json119
-rw-r--r--src/i18n/locales/es.json171
-rw-r--r--src/i18n/locales/et.json92
-rw-r--r--src/i18n/locales/fa.json92
-rw-r--r--src/i18n/locales/fi.json155
-rw-r--r--src/i18n/locales/fil.json92
-rw-r--r--src/i18n/locales/fr.json155
-rw-r--r--src/i18n/locales/ga.json155
-rw-r--r--src/i18n/locales/he.json169
-rw-r--r--src/i18n/locales/hi.json92
-rw-r--r--src/i18n/locales/hr.json119
-rw-r--r--src/i18n/locales/hu.json155
-rw-r--r--src/i18n/locales/id.json155
-rw-r--r--src/i18n/locales/it.json167
-rw-r--r--src/i18n/locales/ja.json155
-rw-r--r--src/i18n/locales/ka.json133
-rw-r--r--src/i18n/locales/kk.json92
-rw-r--r--src/i18n/locales/ko.json199
-rw-r--r--src/i18n/locales/ms.json92
-rw-r--r--src/i18n/locales/nb.json26
-rw-r--r--src/i18n/locales/nl-BE.json153
-rw-r--r--src/i18n/locales/nl.json155
-rw-r--r--src/i18n/locales/no.json155
-rw-r--r--src/i18n/locales/pl.json155
-rw-r--r--src/i18n/locales/pt-BR.json139
-rw-r--r--src/i18n/locales/pt.json155
-rw-r--r--src/i18n/locales/ro.json119
-rw-r--r--src/i18n/locales/ru.json155
-rw-r--r--src/i18n/locales/si.json90
-rw-r--r--src/i18n/locales/sk.json155
-rw-r--r--src/i18n/locales/sl.json119
-rw-r--r--src/i18n/locales/sq.json90
-rw-r--r--src/i18n/locales/sr.json155
-rw-r--r--src/i18n/locales/sv.json155
-rw-r--r--src/i18n/locales/tr.json155
-rw-r--r--src/i18n/locales/uk.json155
-rw-r--r--src/i18n/locales/vi.json155
-rw-r--r--src/i18n/locales/zh-CN.json97
-rw-r--r--src/i18n/locales/zh-HANS.json90
-rw-r--r--src/i18n/locales/zh-HANT.json155
-rw-r--r--src/i18n/locales/zh-TW.json58
-rw-r--r--src/i18n/locales/zh.json151
-rw-r--r--src/i18n/messages/src/components/TrialActivationInfoBar.json15
-rw-r--r--src/i18n/messages/src/components/auth/Pricing.json171
-rw-r--r--src/i18n/messages/src/components/auth/SetupAssistant.json10
-rw-r--r--src/i18n/messages/src/components/auth/Signup.json52
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json16
-rw-r--r--src/i18n/messages/src/components/layout/Sidebar.json36
-rw-r--r--src/i18n/messages/src/components/services/content/ConnectionLostBanner.json12
-rw-r--r--src/i18n/messages/src/components/services/content/ServiceRestricted.json67
-rw-r--r--src/i18n/messages/src/components/services/content/Services.json2
-rw-r--r--src/i18n/messages/src/components/services/tabs/TabItem.json68
-rw-r--r--src/i18n/messages/src/components/settings/account/AccountDashboard.json165
-rw-r--r--src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json32
-rw-r--r--src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json65
-rw-r--r--src/i18n/messages/src/components/settings/services/EditServiceForm.json130
-rw-r--r--src/i18n/messages/src/components/settings/services/ServicesDashboard.json36
-rw-r--r--src/i18n/messages/src/components/settings/settings/EditSettingsForm.json132
-rw-r--r--src/i18n/messages/src/components/settings/team/TeamDashboard.json41
-rw-r--r--src/i18n/messages/src/components/subscription/SubscriptionForm.json54
-rw-r--r--src/i18n/messages/src/components/subscription/SubscriptionPopup.json28
-rw-r--r--src/i18n/messages/src/components/subscription/TrialForm.json93
-rw-r--r--src/i18n/messages/src/components/ui/ActivateTrialButton/index.json93
-rw-r--r--src/i18n/messages/src/components/ui/FeatureList.json109
-rw-r--r--src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json15
-rw-r--r--src/i18n/messages/src/components/ui/UpgradeButton/index.json15
-rw-r--r--src/i18n/messages/src/containers/settings/EditServiceScreen.json76
-rw-r--r--src/i18n/messages/src/containers/settings/EditSettingsScreen.json198
-rw-r--r--src/i18n/messages/src/features/delayApp/Component.json67
-rw-r--r--src/i18n/messages/src/features/planSelection/components/PlanItem.json41
-rw-r--r--src/i18n/messages/src/features/planSelection/components/PlanSelection.json158
-rw-r--r--src/i18n/messages/src/features/planSelection/components/PlanTeaser.json28
-rw-r--r--src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json54
-rw-r--r--src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json15
-rw-r--r--src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json28
-rw-r--r--src/i18n/messages/src/features/shareFranz/Component.json4
-rw-r--r--src/i18n/messages/src/features/todos/components/TodosWebview.json41
-rw-r--r--src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json41
-rw-r--r--src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json54
-rw-r--r--src/i18n/messages/src/features/webControls/components/WebControls.json20
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json59
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json32
-rw-r--r--src/i18n/messages/src/helpers/plan-helpers.json54
-rw-r--r--src/i18n/messages/src/helpers/pricing-helpers.json80
-rw-r--r--src/i18n/messages/src/i18n/globalMessages.json13
-rw-r--r--src/i18n/messages/src/lib/Menu.json327
-rw-r--r--src/index.html122
-rw-r--r--src/index.js199
m---------src/internal-server0
-rw-r--r--src/internal-server/ace21
-rw-r--r--src/internal-server/app/Controllers/Http/RecipeController.js120
-rw-r--r--src/internal-server/app/Controllers/Http/ServiceController.js292
-rw-r--r--src/internal-server/app/Controllers/Http/StaticController.js37
-rw-r--r--src/internal-server/app/Controllers/Http/UserController.js370
-rw-r--r--src/internal-server/app/Controllers/Http/WorkspaceController.js148
-rw-r--r--src/internal-server/app/Exceptions/Handler.js40
-rw-r--r--src/internal-server/app/Middleware/ConvertEmptyStringsToNull.js15
-rw-r--r--src/internal-server/app/Models/Recipe.js7
-rw-r--r--src/internal-server/app/Models/Service.js7
-rw-r--r--src/internal-server/app/Models/Token.js7
-rw-r--r--src/internal-server/app/Models/Traits/NoTimestamp.js14
-rw-r--r--src/internal-server/app/Models/User.js8
-rw-r--r--src/internal-server/app/Models/Workspace.js7
-rw-r--r--src/internal-server/config/app.js240
-rw-r--r--src/internal-server/config/auth.js92
-rw-r--r--src/internal-server/config/bodyParser.js155
-rw-r--r--src/internal-server/config/cors.js85
-rw-r--r--src/internal-server/config/database.js82
-rw-r--r--src/internal-server/config/drive.js45
-rw-r--r--src/internal-server/config/hash.js47
-rw-r--r--src/internal-server/config/session.js97
-rw-r--r--src/internal-server/config/shield.js143
-rw-r--r--src/internal-server/database/factory.js19
-rw-r--r--src/internal-server/database/migrations/1503250034279_user.js18
-rw-r--r--src/internal-server/database/migrations/1566385379883_service_schema.js21
-rw-r--r--src/internal-server/database/migrations/1566554231482_recipe_schema.js20
-rw-r--r--src/internal-server/database/migrations/1566554359294_workspace_schema.js22
-rw-r--r--src/internal-server/database/template.sqlitebin0 -> 40960 bytes
-rw-r--r--src/internal-server/env.ini16
-rw-r--r--src/internal-server/package.json3
-rw-r--r--src/internal-server/public/css/main.css72
-rw-r--r--src/internal-server/public/css/vanilla.css138
-rw-r--r--src/internal-server/public/images/logo.pngbin0 -> 298671 bytes
-rw-r--r--src/internal-server/public/js/transfer.js13
-rw-r--r--src/internal-server/resources/views/import.edge18
-rw-r--r--src/internal-server/resources/views/index.edge19
-rw-r--r--src/internal-server/resources/views/layouts/main.edge19
-rw-r--r--src/internal-server/resources/views/transfer.edge32
-rw-r--r--src/internal-server/start.js51
-rw-r--r--src/internal-server/start/app.js61
-rw-r--r--src/internal-server/start/kernel.js55
-rw-r--r--src/internal-server/start/migrate.js46
-rw-r--r--src/internal-server/start/routes.js86
-rw-r--r--src/internal-server/test.js9
-rw-r--r--src/lib/Menu.js441
-rw-r--r--src/lib/TouchBar.js4
-rw-r--r--src/lib/Tray.js4
-rw-r--r--src/models/Plan.js17
-rw-r--r--src/models/Recipe.js21
-rw-r--r--src/models/RecipePreview.js3
-rw-r--r--src/models/Service.js53
-rw-r--r--src/models/User.js3
-rw-r--r--src/models/UserAgent.js4
-rw-r--r--src/routes.js4
-rw-r--r--src/scripts/add-crowdin-contributors.js2
-rw-r--r--src/scripts/build-theme-info.js4
-rw-r--r--src/scripts/link-readme.js2
-rw-r--r--src/stores/AppStore.js105
-rw-r--r--src/stores/FeaturesStore.js18
-rw-r--r--src/stores/NewsStore.js2
-rw-r--r--src/stores/PaymentStore.js68
-rw-r--r--src/stores/RecipePreviewsStore.js8
-rw-r--r--src/stores/RecipesStore.js17
-rw-r--r--src/stores/ServicesStore.js452
-rw-r--r--src/stores/SettingsStore.js109
-rw-r--r--src/stores/UIStore.js2
-rw-r--r--src/stores/UserStore.js69
-rw-r--r--src/stores/index.js6
-rw-r--r--src/stores/lib/CachedRequest.js4
-rw-r--r--src/stores/lib/Reaction.js4
-rw-r--r--src/stores/lib/Request.js2
-rw-r--r--src/stores/lib/Store.js6
-rw-r--r--src/styles/badge.scss6
-rw-r--r--src/styles/button.scss91
-rw-r--r--src/styles/content-tabs.scss29
-rw-r--r--src/styles/fonts.scss19
-rw-r--r--src/styles/image-upload.scss32
-rw-r--r--src/styles/layout.scss70
-rw-r--r--src/styles/main.scss11
-rw-r--r--src/styles/radio.scss19
-rw-r--r--src/styles/recipes.scss41
-rw-r--r--src/styles/settings.scss235
-rw-r--r--src/styles/slider.scss29
-rw-r--r--src/styles/subscription-popup.scss18
-rw-r--r--src/styles/subscription.scss49
-rw-r--r--src/styles/tabs.scss58
-rw-r--r--src/styles/toggle.scss4
-rw-r--r--src/styles/type.scss46
-rw-r--r--src/styles/welcome.scss36
-rw-r--r--src/webview/badge.js33
-rw-r--r--src/webview/contextMenuBuilder.js25
-rw-r--r--src/webview/darkmode.js10
-rw-r--r--src/webview/find.js23
-rw-r--r--src/webview/lib/RecipeWebview.js50
-rw-r--r--src/webview/notifications.js88
-rw-r--r--src/webview/recipe.js294
-rw-r--r--src/webview/screenshare.js91
-rw-r--r--src/webview/spellchecker.js6
346 files changed, 8040 insertions, 16254 deletions
diff --git a/src/actions/index.js b/src/actions/index.js
index 6f32732b9..ed8283d6c 100644
--- a/src/actions/index.js
+++ b/src/actions/index.js
@@ -7,15 +7,12 @@ import recipePreview from './recipePreview';
7import ui from './ui'; 7import ui from './ui';
8import app from './app'; 8import app from './app';
9import user from './user'; 9import user from './user';
10import payment from './payment';
11import news from './news'; 10import news from './news';
12import settings from './settings'; 11import settings from './settings';
13import requests from './requests'; 12import requests from './requests';
14import announcements from '../features/announcements/actions'; 13import announcements from '../features/announcements/actions';
15import workspaces from '../features/workspaces/actions'; 14import workspaces from '../features/workspaces/actions';
16import todos from '../features/todos/actions'; 15import todos from '../features/todos/actions';
17import planSelection from '../features/planSelection/actions';
18import trialStatusBar from '../features/trialStatusBar/actions';
19 16
20const actions = { 17const actions = {
21 service, 18 service,
@@ -24,7 +21,6 @@ const actions = {
24 ui, 21 ui,
25 app, 22 app,
26 user, 23 user,
27 payment,
28 news, 24 news,
29 settings, 25 settings,
30 requests, 26 requests,
@@ -35,6 +31,4 @@ export default Object.assign(
35 { announcements }, 31 { announcements },
36 { workspaces }, 32 { workspaces },
37 { todos }, 33 { todos },
38 { planSelection },
39 { trialStatusBar },
40); 34);
diff --git a/src/actions/lib/actions.js b/src/actions/lib/actions.js
index b38db9946..7be40f1cf 100644
--- a/src/actions/lib/actions.js
+++ b/src/actions/lib/actions.js
@@ -8,12 +8,12 @@ export const createActionsFromDefinitions = (actionDefinitions, validate) => {
8 }; 8 };
9 actions[actionName] = action; 9 actions[actionName] = action;
10 action.listeners = []; 10 action.listeners = [];
11 action.listen = listener => action.listeners.push(listener); 11 action.listen = (listener) => action.listeners.push(listener);
12 action.off = (listener) => { 12 action.off = (listener) => {
13 const { listeners } = action; 13 const { listeners } = action;
14 listeners.splice(listeners.indexOf(listener), 1); 14 listeners.splice(listeners.indexOf(listener), 1);
15 }; 15 };
16 action.notify = params => action.listeners.forEach(listener => listener(params)); 16 action.notify = (params) => action.listeners.forEach((listener) => listener(params));
17 }); 17 });
18 return actions; 18 return actions;
19}; 19};
diff --git a/src/actions/payment.js b/src/actions/payment.js
deleted file mode 100644
index f61faf197..000000000
--- a/src/actions/payment.js
+++ /dev/null
@@ -1,12 +0,0 @@
1import PropTypes from 'prop-types';
2
3export default {
4 createHostedPage: {
5 planId: PropTypes.string.isRequired,
6 },
7 upgradeAccount: {
8 planId: PropTypes.string.isRequired,
9 onCloseWindow: PropTypes.func,
10 },
11 createDashboardUrl: {},
12};
diff --git a/src/actions/service.js b/src/actions/service.js
index 578fdeca8..e56513f8f 100644
--- a/src/actions/service.js
+++ b/src/actions/service.js
@@ -91,6 +91,9 @@ export default {
91 toggleAudio: { 91 toggleAudio: {
92 serviceId: PropTypes.string.isRequired, 92 serviceId: PropTypes.string.isRequired,
93 }, 93 },
94 toggleDarkMode: {
95 serviceId: PropTypes.string.isRequired,
96 },
94 openDevTools: { 97 openDevTools: {
95 serviceId: PropTypes.string.isRequired, 98 serviceId: PropTypes.string.isRequired,
96 }, 99 },
diff --git a/src/actions/user.js b/src/actions/user.js
index 7061a367a..20d27ee53 100644
--- a/src/actions/user.js
+++ b/src/actions/user.js
@@ -13,15 +13,11 @@ export default {
13 password: PropTypes.string.isRequired, 13 password: PropTypes.string.isRequired,
14 accountType: PropTypes.string, 14 accountType: PropTypes.string,
15 company: PropTypes.string, 15 company: PropTypes.string,
16 plan: PropTypes.string,
17 currency: PropTypes.string, 16 currency: PropTypes.string,
18 }, 17 },
19 retrievePassword: { 18 retrievePassword: {
20 email: PropTypes.string.isRequired, 19 email: PropTypes.string.isRequired,
21 }, 20 },
22 activateTrial: {
23 planId: PropTypes.string.isRequired,
24 },
25 invite: { 21 invite: {
26 invites: PropTypes.array.isRequired, 22 invites: PropTypes.array.isRequired,
27 }, 23 },
diff --git a/src/api/PaymentApi.js b/src/api/PaymentApi.js
deleted file mode 100644
index 7325151e9..000000000
--- a/src/api/PaymentApi.js
+++ /dev/null
@@ -1,14 +0,0 @@
1export default class PaymentApi {
2 constructor(server, local) {
3 this.server = server;
4 this.local = local;
5 }
6
7 plans() {
8 return this.server.getPlans();
9 }
10
11 getHostedPage(planId) {
12 return this.server.getHostedPage(planId);
13 }
14}
diff --git a/src/api/ServicesApi.js b/src/api/ServicesApi.js
index 36ed9482f..85efd26a6 100644
--- a/src/api/ServicesApi.js
+++ b/src/api/ServicesApi.js
@@ -8,14 +8,6 @@ export default class ServicesApi {
8 return this.server.getServices(); 8 return this.server.getServices();
9 } 9 }
10 10
11 // one(customerId) {
12 // return this.server.getCustomer(customerId);
13 // }
14 //
15 // search(needle) {
16 // return this.server.searchCustomers(needle);
17 // }
18 //
19 create(recipeId, data) { 11 create(recipeId, data) {
20 return this.server.createService(recipeId, data); 12 return this.server.createService(recipeId, data);
21 } 13 }
diff --git a/src/api/UserApi.js b/src/api/UserApi.js
index 8ba8cd1e9..edfb88988 100644
--- a/src/api/UserApi.js
+++ b/src/api/UserApi.js
@@ -25,10 +25,6 @@ export default class UserApi {
25 return this.server.retrievePassword(email); 25 return this.server.retrievePassword(email);
26 } 26 }
27 27
28 activateTrial(data) {
29 return this.server.activateTrial(data);
30 }
31
32 invite(data) { 28 invite(data) {
33 return this.server.inviteUser(data); 29 return this.server.inviteUser(data);
34 } 30 }
diff --git a/src/api/apiBase.js b/src/api/apiBase.js
index 842c85e56..ad37ca02c 100644
--- a/src/api/apiBase.js
+++ b/src/api/apiBase.js
@@ -5,6 +5,9 @@ import {
5 API_VERSION, 5 API_VERSION,
6} from '../environment'; 6} from '../environment';
7import { 7import {
8 DEV_API_FRANZ_WEBSITE,
9 LIVE_FRANZ_API,
10 LOCAL_HOSTNAME,
8 LOCAL_SERVER, 11 LOCAL_SERVER,
9 SERVER_NOT_LOADED, 12 SERVER_NOT_LOADED,
10} from '../config'; 13} from '../config';
@@ -21,16 +24,18 @@ const apiBase = (withVersion = true) => {
21 } 24 }
22 if (window.ferdi.stores.settings.all.app.server === LOCAL_SERVER) { 25 if (window.ferdi.stores.settings.all.app.server === LOCAL_SERVER) {
23 // Use URL for local server 26 // Use URL for local server
24 url = `http://127.0.0.1:${window.ferdi.stores.requests.localServerPort}`; 27 url = `http://${LOCAL_HOSTNAME}:${window.ferdi.stores.requests.localServerPort}`;
25 } else { 28 } else {
26 // Load URL from store 29 // Load URL from store
27 url = window.ferdi.stores.settings.all.app.server; 30 url = window.ferdi.stores.settings.all.app.server;
28 } 31 }
29 32
30 if (withVersion) { 33 return withVersion ? `${url}/${API_VERSION}` : url;
31 return `${url}/${API_VERSION}`;
32 }
33 return url;
34}; 34};
35 35
36export default apiBase; 36export default apiBase;
37
38export function termsBase() {
39 // TODO: This needs to handle local vs ferdi vs franz servers
40 return window.ferdi.stores.settings.all.app.server !== LIVE_FRANZ_API ? window.ferdi.stores.settings.all.app.server : DEV_API_FRANZ_WEBSITE;
41}
diff --git a/src/api/index.js b/src/api/index.js
index 3c87cc087..ed6c13488 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -4,7 +4,6 @@ import RecipePreviewsApi from './RecipePreviewsApi';
4import RecipesApi from './RecipesApi'; 4import RecipesApi from './RecipesApi';
5import UserApi from './UserApi'; 5import UserApi from './UserApi';
6import LocalApi from './LocalApi'; 6import LocalApi from './LocalApi';
7import PaymentApi from './PaymentApi';
8import NewsApi from './NewsApi'; 7import NewsApi from './NewsApi';
9import FeaturesApi from './FeaturesApi'; 8import FeaturesApi from './FeaturesApi';
10 9
@@ -16,6 +15,5 @@ export default (server, local) => ({
16 features: new FeaturesApi(server, local), 15 features: new FeaturesApi(server, local),
17 user: new UserApi(server, local), 16 user: new UserApi(server, local),
18 local: new LocalApi(server, local), 17 local: new LocalApi(server, local),
19 payment: new PaymentApi(server, local),
20 news: new NewsApi(server, local), 18 news: new NewsApi(server, local),
21}); 19});
diff --git a/src/api/server/LocalApi.js b/src/api/server/LocalApi.js
index 4b1f03f22..644f15b93 100644
--- a/src/api/server/LocalApi.js
+++ b/src/api/server/LocalApi.js
@@ -2,14 +2,14 @@ import { ipcRenderer } from 'electron';
2import { session } from '@electron/remote'; 2import { session } from '@electron/remote';
3import du from 'du'; 3import du from 'du';
4 4
5import { getServicePartitionsDirectory } from '../../helpers/service-helpers.js'; 5import { getServicePartitionsDirectory } from '../../helpers/service-helpers';
6 6
7const debug = require('debug')('Ferdi:LocalApi'); 7const debug = require('debug')('Ferdi:LocalApi');
8 8
9export default class LocalApi { 9export default class LocalApi {
10 // Settings 10 // Settings
11 getAppSettings(type) { 11 getAppSettings(type) {
12 return new Promise((resolve) => { 12 return new Promise(resolve => {
13 ipcRenderer.once('appSettings', (event, resp) => { 13 ipcRenderer.once('appSettings', (event, resp) => {
14 debug('LocalApi::getAppSettings resolves', resp.type, resp.data); 14 debug('LocalApi::getAppSettings resolves', resp.type, resp.data);
15 resolve(resp); 15 resolve(resp);
@@ -41,11 +41,21 @@ export default class LocalApi {
41 } 41 }
42 42
43 async clearCache(serviceId = null) { 43 async clearCache(serviceId = null) {
44 const s = serviceId ? session.fromPartition(`persist:service-${serviceId}`) : session.defaultSession; 44 const s = serviceId
45 ? session.fromPartition(`persist:service-${serviceId}`)
46 : session.defaultSession;
45 47
46 debug('LocalApi::clearCache resolves', (serviceId || 'clearAppCache')); 48 debug('LocalApi::clearCache resolves', serviceId || 'clearAppCache');
47 await s.clearStorageData({ 49 await s.clearStorageData({
48 storages: ['appcache', 'cookies', 'filesystem', 'indexdb', 'localstorage', 'shadercache', 'websql', 'serviceworkers', 'cachestorage'], 50 storages: [
51 'appcache',
52 'filesystem',
53 'indexdb',
54 'shadercache',
55 'websql',
56 'serviceworkers',
57 'cachestorage',
58 ],
49 quotas: ['temporary', 'persistent', 'syncable'], 59 quotas: ['temporary', 'persistent', 'syncable'],
50 }); 60 });
51 return s.clearCache(); 61 return s.clearCache();
diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js
index c63aa7dda..bc0b0dff9 100644
--- a/src/api/server/ServerApi.js
+++ b/src/api/server/ServerApi.js
@@ -1,12 +1,11 @@
1import path from 'path'; 1import { join } from 'path';
2import tar from 'tar'; 2import tar from 'tar';
3import fs from 'fs-extra'; 3import { readdirSync, statSync, writeFileSync, copySync, ensureDirSync, pathExistsSync, readJsonSync, removeSync } from 'fs-extra';
4import { app, require as remoteRequire } from '@electron/remote'; 4import { app, require as remoteRequire } from '@electron/remote';
5 5
6import ServiceModel from '../../models/Service'; 6import ServiceModel from '../../models/Service';
7import RecipePreviewModel from '../../models/RecipePreview'; 7import RecipePreviewModel from '../../models/RecipePreview';
8import RecipeModel from '../../models/Recipe'; 8import RecipeModel from '../../models/Recipe';
9import PlanModel from '../../models/Plan';
10import NewsModel from '../../models/News'; 9import NewsModel from '../../models/News';
11import UserModel from '../../models/User'; 10import UserModel from '../../models/User';
12import OrderModel from '../../models/Order'; 11import OrderModel from '../../models/Order';
@@ -14,7 +13,7 @@ import OrderModel from '../../models/Order';
14import { sleep } from '../../helpers/async-helpers'; 13import { sleep } from '../../helpers/async-helpers';
15 14
16import { SERVER_NOT_LOADED } from '../../config'; 15import { SERVER_NOT_LOADED } from '../../config';
17import { osArch, osPlatform, RECIPES_PATH } from '../../environment'; 16import { osArch, osPlatform, asarRecipesPath, userDataRecipesPath, userDataPath } from '../../environment';
18import apiBase from '../apiBase'; 17import apiBase from '../apiBase';
19import { prepareAuthRequest, sendAuthRequest } from '../utils/auth'; 18import { prepareAuthRequest, sendAuthRequest } from '../utils/auth';
20 19
@@ -24,16 +23,11 @@ import {
24 loadRecipeConfig, 23 loadRecipeConfig,
25} from '../../helpers/recipe-helpers'; 24} from '../../helpers/recipe-helpers';
26 25
27import { 26import { removeServicePartitionDirectory } from '../../helpers/service-helpers';
28 removeServicePartitionDirectory,
29} from '../../helpers/service-helpers.js';
30 27
31const debug = require('debug')('Ferdi:ServerApi'); 28const debug = require('debug')('Ferdi:ServerApi');
32 29
33module.paths.unshift( 30module.paths.unshift(getDevRecipeDirectory(), getRecipeDirectory());
34 getDevRecipeDirectory(),
35 getRecipeDirectory(),
36);
37 31
38const { default: fetch } = remoteRequire('electron-fetch'); 32const { default: fetch } = remoteRequire('electron-fetch');
39 33
@@ -44,12 +38,16 @@ export default class ServerApi {
44 38
45 // User 39 // User
46 async login(email, passwordHash) { 40 async login(email, passwordHash) {
47 const request = await sendAuthRequest(`${apiBase()}/auth/login`, { 41 const request = await sendAuthRequest(
48 method: 'POST', 42 `${apiBase()}/auth/login`,
49 headers: { 43 {
50 Authorization: `Basic ${window.btoa(`${email}:${passwordHash}`)}`, 44 method: 'POST',
45 headers: {
46 Authorization: `Basic ${window.btoa(`${email}:${passwordHash}`)}`,
47 },
51 }, 48 },
52 }, false); 49 false,
50 );
53 if (!request.ok) { 51 if (!request.ok) {
54 throw request; 52 throw request;
55 } 53 }
@@ -60,10 +58,14 @@ export default class ServerApi {
60 } 58 }
61 59
62 async signup(data) { 60 async signup(data) {
63 const request = await sendAuthRequest(`${apiBase()}/auth/signup`, { 61 const request = await sendAuthRequest(
64 method: 'POST', 62 `${apiBase()}/auth/signup`,
65 body: JSON.stringify(data), 63 {
66 }, false); 64 method: 'POST',
65 body: JSON.stringify(data),
66 },
67 false,
68 );
67 if (!request.ok) { 69 if (!request.ok) {
68 throw request; 70 throw request;
69 } 71 }
@@ -73,20 +75,6 @@ export default class ServerApi {
73 return u.token; 75 return u.token;
74 } 76 }
75 77
76 async activateTrial(data) {
77 const request = await sendAuthRequest(`${apiBase()}/payment/trial`, {
78 method: 'POST',
79 body: JSON.stringify(data),
80 });
81 if (!request.ok) {
82 throw request;
83 }
84 const trial = await request.json();
85
86 debug('ServerApi::activateTrial resolves', trial);
87 return true;
88 }
89
90 async inviteUser(data) { 78 async inviteUser(data) {
91 const request = await sendAuthRequest(`${apiBase()}/invite`, { 79 const request = await sendAuthRequest(`${apiBase()}/invite`, {
92 method: 'POST', 80 method: 'POST',
@@ -101,12 +89,16 @@ export default class ServerApi {
101 } 89 }
102 90
103 async retrievePassword(email) { 91 async retrievePassword(email) {
104 const request = await sendAuthRequest(`${apiBase()}/auth/password`, { 92 const request = await sendAuthRequest(
105 method: 'POST', 93 `${apiBase()}/auth/password`,
106 body: JSON.stringify({ 94 {
107 email, 95 method: 'POST',
108 }), 96 body: JSON.stringify({
109 }, false); 97 email,
98 }),
99 },
100 false,
101 );
110 if (!request.ok) { 102 if (!request.ok) {
111 throw request; 103 throw request;
112 } 104 }
@@ -143,7 +135,9 @@ export default class ServerApi {
143 } 135 }
144 const updatedData = await request.json(); 136 const updatedData = await request.json();
145 137
146 const user = Object.assign(updatedData, { data: new UserModel(updatedData.data) }); 138 const user = Object.assign(updatedData, {
139 data: new UserModel(updatedData.data),
140 });
147 debug('ServerApi::updateUserInfo resolves', user); 141 debug('ServerApi::updateUserInfo resolves', user);
148 return user; 142 return user;
149 } 143 }
@@ -173,10 +167,10 @@ export default class ServerApi {
173 } 167 }
174 const data = await request.json(); 168 const data = await request.json();
175 169
176 let services = await this._mapServiceModels(data); 170 const services = await this._mapServiceModels(data);
177 services = services.filter(service => service !== null); 171 const filteredServices = services.filter(service => !!service);
178 debug('ServerApi::getServices resolves', services); 172 debug('ServerApi::getServices resolves', filteredServices);
179 return services; 173 return filteredServices;
180 } 174 }
181 175
182 async createService(recipeId, data) { 176 async createService(recipeId, data) {
@@ -190,12 +184,17 @@ export default class ServerApi {
190 const serviceData = await request.json(); 184 const serviceData = await request.json();
191 185
192 if (data.iconFile) { 186 if (data.iconFile) {
193 const iconData = await this.uploadServiceIcon(serviceData.data.id, data.iconFile); 187 const iconData = await this.uploadServiceIcon(
188 serviceData.data.id,
189 data.iconFile,
190 );
194 191
195 serviceData.data = iconData; 192 serviceData.data = iconData;
196 } 193 }
197 194
198 const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) }); 195 const service = Object.assign(serviceData, {
196 data: await this._prepareServiceModel(serviceData.data),
197 });
199 198
200 debug('ServerApi::createService resolves', service); 199 debug('ServerApi::createService resolves', service);
201 return service; 200 return service;
@@ -219,7 +218,9 @@ export default class ServerApi {
219 218
220 const serviceData = await request.json(); 219 const serviceData = await request.json();
221 220
222 const service = Object.assign(serviceData, { data: await this._prepareServiceModel(serviceData.data) }); 221 const service = Object.assign(serviceData, {
222 data: await this._prepareServiceModel(serviceData.data),
223 });
223 224
224 debug('ServerApi::updateService resolves', service); 225 debug('ServerApi::updateService resolves', service);
225 return service; 226 return service;
@@ -236,7 +237,10 @@ export default class ServerApi {
236 237
237 delete requestData.headers['Content-Type']; 238 delete requestData.headers['Content-Type'];
238 239
239 const request = await window.fetch(`${apiBase()}/service/${serviceId}`, requestData); 240 const request = await window.fetch(
241 `${apiBase()}/service/${serviceId}`,
242 requestData,
243 );
240 244
241 if (!request.ok) { 245 if (!request.ok) {
242 throw request; 246 throw request;
@@ -307,18 +311,21 @@ export default class ServerApi {
307 // Recipes 311 // Recipes
308 async getInstalledRecipes() { 312 async getInstalledRecipes() {
309 const recipesDirectory = getRecipeDirectory(); 313 const recipesDirectory = getRecipeDirectory();
310 const paths = fs.readdirSync(recipesDirectory) 314 const paths = readdirSync(recipesDirectory)
311 .filter(file => ( 315 .filter(
312 fs.statSync(path.join(recipesDirectory, file)).isDirectory() 316 file =>
313 && file !== 'temp' 317 statSync(join(recipesDirectory, file)).isDirectory() &&
314 && file !== 'dev' 318 file !== 'temp' &&
315 )); 319 file !== 'dev',
316 320 );
317 this.recipes = paths.map((id) => { 321
318 // eslint-disable-next-line 322 this.recipes = paths
319 const Recipe = require(id)(RecipeModel); 323 .map(id => {
320 return new Recipe(loadRecipeConfig(id)); 324 // eslint-disable-next-line
321 }).filter(recipe => recipe.id); 325 const Recipe = require(id)(RecipeModel);
326 return new Recipe(loadRecipeConfig(id));
327 })
328 .filter(recipe => recipe.id);
322 329
323 this.recipes = this.recipes.concat(this._getDevRecipes()); 330 this.recipes = this.recipes.concat(this._getDevRecipes());
324 331
@@ -350,12 +357,11 @@ export default class ServerApi {
350 } 357 }
351 358
352 async getFeaturedRecipePreviews() { 359 async getFeaturedRecipePreviews() {
360 // TODO: If we are hitting the internal-server, we need to return an empty list, else we can hit the remote server and get the data
353 const request = await sendAuthRequest(`${apiBase()}/recipes/popular`); 361 const request = await sendAuthRequest(`${apiBase()}/recipes/popular`);
354 if (!request.ok) throw request; 362 if (!request.ok) throw request;
355 363
356 const data = await request.json(); 364 const data = await request.json();
357 // data = this._addLocalRecipesToPreviews(data);
358
359 const recipePreviews = this._mapRecipePreviewModel(data); 365 const recipePreviews = this._mapRecipePreviewModel(data);
360 debug('ServerApi::getFeaturedRecipes resolves', recipePreviews); 366 debug('ServerApi::getFeaturedRecipes resolves', recipePreviews);
361 return recipePreviews; 367 return recipePreviews;
@@ -374,21 +380,21 @@ export default class ServerApi {
374 380
375 async getRecipePackage(recipeId) { 381 async getRecipePackage(recipeId) {
376 try { 382 try {
377 const recipesDirectory = path.join(app.getPath('userData'), 'recipes'); 383 const recipesDirectory = userDataRecipesPath();
378 const recipeTempDirectory = path.join(recipesDirectory, 'temp', recipeId); 384 const recipeTempDirectory = join(recipesDirectory, 'temp', recipeId);
379 const tempArchivePath = path.join(recipeTempDirectory, 'recipe.tar.gz'); 385 const tempArchivePath = join(recipeTempDirectory, 'recipe.tar.gz');
380 386
381 const internalRecipeFile = path.join(RECIPES_PATH, `${recipeId}.tar.gz`); 387 const internalRecipeFile = asarRecipesPath(`${recipeId}.tar.gz`);
382 388
383 fs.ensureDirSync(recipeTempDirectory); 389 ensureDirSync(recipeTempDirectory);
384 390
385 let archivePath; 391 let archivePath;
386 392
387 if (await fs.exists(internalRecipeFile)) { 393 if (pathExistsSync(internalRecipeFile)) {
388 console.log('[ServerApi::getRecipePackage] Using internal recipe file'); 394 debug('[ServerApi::getRecipePackage] Using internal recipe file');
389 archivePath = internalRecipeFile; 395 archivePath = internalRecipeFile;
390 } else { 396 } else {
391 console.log('[ServerApi::getRecipePackage] Downloading recipe from server'); 397 debug('[ServerApi::getRecipePackage] Downloading recipe from server');
392 archivePath = tempArchivePath; 398 archivePath = tempArchivePath;
393 399
394 const packageUrl = `${apiBase()}/recipes/download/${recipeId}`; 400 const packageUrl = `${apiBase()}/recipes/download/${recipeId}`;
@@ -396,9 +402,9 @@ export default class ServerApi {
396 const res = await fetch(packageUrl); 402 const res = await fetch(packageUrl);
397 debug('Recipe downloaded', recipeId); 403 debug('Recipe downloaded', recipeId);
398 const buffer = await res.buffer(); 404 const buffer = await res.buffer();
399 fs.writeFileSync(archivePath, buffer); 405 writeFileSync(archivePath, buffer);
400 } 406 }
401 console.log(archivePath); 407 debug(archivePath);
402 408
403 await sleep(10); 409 await sleep(10);
404 410
@@ -408,16 +414,16 @@ export default class ServerApi {
408 preservePaths: true, 414 preservePaths: true,
409 unlink: true, 415 unlink: true,
410 preserveOwner: false, 416 preserveOwner: false,
411 onwarn: x => console.log('warn', recipeId, x), 417 onwarn: x => debug('warn', recipeId, x),
412 }); 418 });
413 419
414 await sleep(10); 420 await sleep(10);
415 421
416 const { id } = fs.readJsonSync(path.join(recipeTempDirectory, 'package.json')); 422 const { id } = readJsonSync(join(recipeTempDirectory, 'package.json'));
417 const recipeDirectory = path.join(recipesDirectory, id); 423 const recipeDirectory = join(recipesDirectory, id);
418 fs.copySync(recipeTempDirectory, recipeDirectory); 424 copySync(recipeTempDirectory, recipeDirectory);
419 fs.remove(recipeTempDirectory); 425 removeSync(recipeTempDirectory);
420 fs.remove(path.join(recipesDirectory, recipeId, 'recipe.tar.gz')); 426 removeSync(join(recipesDirectory, recipeId, 'recipe.tar.gz'));
421 427
422 return id; 428 return id;
423 } catch (err) { 429 } catch (err) {
@@ -427,35 +433,11 @@ export default class ServerApi {
427 } 433 }
428 } 434 }
429 435
430 // Payment
431 async getPlans() {
432 const request = await sendAuthRequest(`${apiBase()}/payment/plans`);
433 if (!request.ok) throw request;
434 const data = await request.json();
435 const plan = new PlanModel(data);
436 debug('ServerApi::getPlans resolves', plan);
437 return plan;
438 }
439
440 async getHostedPage(planId) {
441 const request = await sendAuthRequest(`${apiBase()}/payment/init`, {
442 method: 'POST',
443 body: JSON.stringify({
444 planId,
445 }),
446 });
447 if (!request.ok) {
448 throw request;
449 }
450 const data = await request.json();
451
452 debug('ServerApi::getHostedPage resolves', data);
453 return data;
454 }
455
456 // News 436 // News
457 async getLatestNews() { 437 async getLatestNews() {
458 const url = `${apiBase(true)}/news?platform=${osPlatform}&arch=${osArch}&version=${app.getVersion()}`; 438 const url = `${apiBase(
439 true,
440 )}/news?platform=${osPlatform}&arch=${osArch}&version=${app.getVersion()}`;
459 const request = await sendAuthRequest(url); 441 const request = await sendAuthRequest(url);
460 if (!request.ok) throw request; 442 if (!request.ok) throw request;
461 const data = await request.json(); 443 const data = await request.json();
@@ -465,7 +447,7 @@ export default class ServerApi {
465 } 447 }
466 448
467 async hideNews(id) { 449 async hideNews(id) {
468 const request = await sendAuthRequest(`${apiBase(true)}/news/${id}/read`); 450 const request = await sendAuthRequest(`${apiBase()}/news/${id}/read`);
469 if (!request.ok) throw request; 451 if (!request.ok) throw request;
470 debug('ServerApi::hideNews resolves', id); 452 debug('ServerApi::hideNews resolves', id);
471 } 453 }
@@ -476,9 +458,13 @@ export default class ServerApi {
476 throw new Error('Server not loaded'); 458 throw new Error('Server not loaded');
477 } 459 }
478 460
479 const request = await sendAuthRequest(`${apiBase(false)}/health`, { 461 const request = await sendAuthRequest(
480 method: 'GET', 462 `${apiBase(false)}/health`,
481 }, false); 463 {
464 method: 'GET',
465 },
466 false,
467 );
482 if (!request.ok) { 468 if (!request.ok) {
483 throw request; 469 throw request;
484 } 470 }
@@ -486,23 +472,27 @@ export default class ServerApi {
486 } 472 }
487 473
488 async getLegacyServices() { 474 async getLegacyServices() {
489 const file = path.join(app.getPath('userData'), 'settings', 'services.json'); 475 const file = userDataPath('settings', 'services.json');
490 476
491 try { 477 try {
492 const config = fs.readJsonSync(file); 478 const config = readJsonSync(file);
493 479
494 if (Object.prototype.hasOwnProperty.call(config, 'services')) { 480 if (Object.prototype.hasOwnProperty.call(config, 'services')) {
495 const services = await Promise.all(config.services.map(async (s) => { 481 const services = await Promise.all(
496 const service = s; 482 config.services.map(async s => {
497 const request = await sendAuthRequest(`${apiBase()}/recipes/${s.service}`); 483 const service = s;
498 484 const request = await sendAuthRequest(
499 if (request.status === 200) { 485 `${apiBase()}/recipes/${s.service}`,
500 const data = await request.json(); 486 );
501 service.recipe = new RecipePreviewModel(data); 487
502 } 488 if (request.status === 200) {
503 489 const data = await request.json();
504 return service; 490 service.recipe = new RecipePreviewModel(data);
505 })); 491 }
492
493 return service;
494 }),
495 );
506 496
507 debug('ServerApi::getLegacyServices resolves', services); 497 debug('ServerApi::getLegacyServices resolves', services);
508 return services; 498 return services;
@@ -519,7 +509,9 @@ export default class ServerApi {
519 const recipes = services.map(s => s.recipeId); 509 const recipes = services.map(s => s.recipeId);
520 await this._bulkRecipeCheck(recipes); 510 await this._bulkRecipeCheck(recipes);
521 /* eslint-disable no-return-await */ 511 /* eslint-disable no-return-await */
522 return Promise.all(services.map(async service => await this._prepareServiceModel(service))); 512 return Promise.all(
513 services.map(async service => await this._prepareServiceModel(service)),
514 );
523 /* eslint-enable no-return-await */ 515 /* eslint-enable no-return-await */
524 } 516 }
525 517
@@ -542,14 +534,18 @@ export default class ServerApi {
542 534
543 async _bulkRecipeCheck(unfilteredRecipes) { 535 async _bulkRecipeCheck(unfilteredRecipes) {
544 // Filter recipe duplicates as we don't need to download 3 Slack recipes 536 // Filter recipe duplicates as we don't need to download 3 Slack recipes
545 const recipes = unfilteredRecipes.filter((elem, pos, arr) => arr.indexOf(elem) === pos); 537 const recipes = unfilteredRecipes.filter(
538 (elem, pos, arr) => arr.indexOf(elem) === pos,
539 );
546 540
547 return Promise.all(recipes 541 return Promise.all(
548 .map(async (recipeId) => { 542 recipes.map(async recipeId => {
549 let recipe = this.recipes.find(r => r.id === recipeId); 543 let recipe = this.recipes.find(r => r.id === recipeId);
550 544
551 if (!recipe) { 545 if (!recipe) {
552 console.warn(`Recipe '${recipeId}' not installed, trying to fetch from server`); 546 console.warn(
547 `Recipe '${recipeId}' not installed, trying to fetch from server`,
548 );
553 549
554 await this.getRecipePackage(recipeId); 550 await this.getRecipePackage(recipeId);
555 551
@@ -565,69 +561,83 @@ export default class ServerApi {
565 } 561 }
566 562
567 return recipe; 563 return recipe;
568 })).catch(err => console.error('Can\'t load recipe', err)); 564 }),
565 ).catch(err => console.error("Can't load recipe", err));
569 } 566 }
570 567
571 _mapRecipePreviewModel(recipes) { 568 _mapRecipePreviewModel(recipes) {
572 return recipes.map((recipe) => { 569 return recipes
573 try { 570 .map(recipe => {
574 return new RecipePreviewModel(recipe); 571 try {
575 } catch (e) { 572 return new RecipePreviewModel(recipe);
576 console.error(e); 573 } catch (e) {
577 return null; 574 console.error(e);
578 } 575 return null;
579 }).filter(recipe => recipe !== null); 576 }
577 })
578 .filter(recipe => recipe !== null);
580 } 579 }
581 580
582 _mapNewsModels(news) { 581 _mapNewsModels(news) {
583 return news.map((newsItem) => { 582 return news
584 try { 583 .map(newsItem => {
585 return new NewsModel(newsItem); 584 try {
586 } catch (e) { 585 return new NewsModel(newsItem);
587 console.error(e); 586 } catch (e) {
588 return null; 587 console.error(e);
589 } 588 return null;
590 }).filter(newsItem => newsItem !== null); 589 }
590 })
591 .filter(newsItem => newsItem !== null);
591 } 592 }
592 593
593 _mapOrderModels(orders) { 594 _mapOrderModels(orders) {
594 return orders.map((orderItem) => { 595 return orders
595 try { 596 .map(orderItem => {
596 return new OrderModel(orderItem); 597 try {
597 } catch (e) { 598 return new OrderModel(orderItem);
598 console.error(e); 599 } catch (e) {
599 return null; 600 console.error(e);
600 } 601 return null;
601 }).filter(orderItem => orderItem !== null); 602 }
603 })
604 .filter(orderItem => orderItem !== null);
602 } 605 }
603 606
604 _getDevRecipes() { 607 _getDevRecipes() {
605 const recipesDirectory = getDevRecipeDirectory(); 608 const recipesDirectory = getDevRecipeDirectory();
606 try { 609 try {
607 const paths = fs.readdirSync(recipesDirectory) 610 const paths = readdirSync(recipesDirectory)
608 .filter(file => fs.statSync(path.join(recipesDirectory, file)).isDirectory() && file !== 'temp'); 611 .filter(
609 612 file =>
610 const recipes = paths.map((id) => { 613 statSync(join(recipesDirectory, file)).isDirectory() &&
611 let Recipe; 614 file !== 'temp',
612 try { 615 );
613 // eslint-disable-next-line 616
614 Recipe = require(id)(RecipeModel); 617 const recipes = paths
615 return new Recipe(loadRecipeConfig(id)); 618 .map(id => {
616 } catch (err) { 619 let Recipe;
617 console.error(err); 620 try {
618 } 621 // eslint-disable-next-line
622 Recipe = require(id)(RecipeModel);
623 return new Recipe(loadRecipeConfig(id));
624 } catch (err) {
625 console.error(err);
626 }
619 627
620 return false; 628 return false;
621 }).filter(recipe => recipe.id).map((data) => { 629 })
622 const recipe = data; 630 .filter(recipe => recipe.id)
631 .map(data => {
632 const recipe = data;
623 633
624 recipe.icons = { 634 recipe.icons = {
625 svg: `${recipe.path}/icon.svg`, 635 svg: `${recipe.path}/icon.svg`,
626 }; 636 };
627 recipe.local = true; 637 recipe.local = true;
628 638
629 return data; 639 return data;
630 }); 640 });
631 641
632 return recipes; 642 return recipes;
633 } catch (err) { 643 } catch (err) {
diff --git a/src/app.js b/src/app.js
index aab1729d7..39b50cb33 100644
--- a/src/app.js
+++ b/src/app.js
@@ -4,11 +4,8 @@ import React from 'react';
4import { render } from 'react-dom'; 4import { render } from 'react-dom';
5import { Provider } from 'mobx-react'; 5import { Provider } from 'mobx-react';
6import { syncHistoryWithStore, RouterStore } from 'mobx-react-router'; 6import { syncHistoryWithStore, RouterStore } from 'mobx-react-router';
7import { 7import { hashHistory } from 'react-router';
8 hashHistory,
9} from 'react-router';
10 8
11import '@babel/polyfill';
12import smoothScroll from 'smoothscroll-polyfill'; 9import smoothScroll from 'smoothscroll-polyfill';
13 10
14import ServerApi from './api/server/ServerApi'; 11import ServerApi from './api/server/ServerApi';
diff --git a/src/assets/themeInfo.json b/src/assets/themeInfo.json
index 0791cf459..54e833789 100644
--- a/src/assets/themeInfo.json
+++ b/src/assets/themeInfo.json
@@ -1 +1 @@
{"color":".theme__dark .app .sidebar .sidebar__button.is-muted, .theme__dark .app .sidebar .sidebar__button.is-active, .sidebar .sidebar__button.is-muted, .sidebar .sidebar__button.is-active, .tab-item.is-active, .settings .account .invoices .invoices__action button, .settings-navigation .settings-navigation__link.is-active .badge, a.link, button.link, .auth .welcome .button:hover, .auth .welcome .button__inverted, .franz-form .franz-form__radio.is-selected, .theme__dark .franz-form__button.franz-form__button--inverted, .franz-form__button.franz-form__button--inverted","border-color":".theme__dark .settings .premium-info, .franz-form .franz-form__radio.is-selected","background":".settings .settings__header, .settings .settings__close, .settings-navigation .settings-navigation__link.is-active, a.button, button.button, .auth, .info-bar, .info-bar.info-bar--primary, .infobox.infobox--primary, .theme__dark .badge.badge--primary, .theme__dark .badge.badge--premium, .badge.badge--primary, .badge.badge--premium, .content-tabs .content-tabs__tabs .content-tabs__item.is-active, #electron-app-title-bar .toolbar-dropdown:not(.open) > .toolbar-button > button:hover, #electron-app-title-bar .list-item.selected .menu-item, #electron-app-title-bar .list-item.selected:focus .menu-item, .theme__dark .quick-switch .active, .franz-form .franz-form__toggle-wrapper .franz-form__toggle.is-active .franz-form__toggle-button, .theme__dark .franz-form__button, .franz-form__button, .ferdi__fab, .franz-form .franz-form__slider-wrapper .slider::-webkit-slider-thumb","border-right-color":".settings .settings__header .separator"} \ No newline at end of file {"color":".theme__dark .app .sidebar .sidebar__button.is-muted, .theme__dark .app .sidebar .sidebar__button.is-active, .sidebar .sidebar__button.is-muted, .sidebar .sidebar__button.is-active, .tab-item.is-active, .settings .account .invoices .invoices__action button, .settings-navigation .settings-navigation__link.is-active .badge, a.link, button.link, .auth .welcome .button:hover, .auth .welcome .button__inverted, .franz-form .franz-form__radio.is-selected, .theme__dark .franz-form__button.franz-form__button--inverted, .franz-form__button.franz-form__button--inverted","border-color":".theme__dark .settings, .franz-form .franz-form__radio.is-selected","background":".settings .settings__header, .settings .settings__close, .settings-navigation .settings-navigation__link.is-active, a.button, button.button, .auth, .info-bar, .info-bar.info-bar--primary, .infobox.infobox--primary, .theme__dark .badge.badge--primary, .theme__dark, .badge.badge--primary, .content-tabs .content-tabs__tabs .content-tabs__item.is-active, #electron-app-title-bar .toolbar-dropdown:not(.open) > .toolbar-button > button:hover, #electron-app-title-bar .list-item.selected .menu-item, #electron-app-title-bar .list-item.selected:focus .menu-item, .theme__dark .quick-switch .active, .franz-form .franz-form__toggle-wrapper .franz-form__toggle.is-active .franz-form__toggle-button, .theme__dark .franz-form__button, .franz-form__button, .ferdi__fab, .franz-form .franz-form__slider-wrapper .slider::-webkit-slider-thumb","border-right-color":".settings .settings__header .separator"}
diff --git a/src/components/TrialActivationInfoBar.js b/src/components/TrialActivationInfoBar.js
deleted file mode 100644
index 77ab97565..000000000
--- a/src/components/TrialActivationInfoBar.js
+++ /dev/null
@@ -1,94 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl';
4import ms from 'ms';
5import injectSheet from 'react-jss';
6import classnames from 'classnames';
7
8import InfoBar from './ui/InfoBar';
9
10const messages = defineMessages({
11 message: {
12 id: 'infobar.trialActivated',
13 defaultMessage: '!!!Your trial was successfully activated. Happy messaging!',
14 },
15});
16
17const styles = {
18 notification: {
19 height: 'auto',
20 position: 'absolute',
21 top: -50,
22 transition: 'top 0.3s',
23 zIndex: 500,
24 width: 'calc(100% - 300px)',
25 },
26 show: {
27 top: 0,
28 },
29};
30
31@injectSheet(styles)
32class TrialActivationInfoBar extends Component {
33 static propTypes = {
34 // eslint-disable-next-line
35 classes: PropTypes.object.isRequired,
36 };
37
38 static contextTypes = {
39 intl: intlShape,
40 };
41
42 state = {
43 showing: false,
44 removed: false,
45 }
46
47 componentDidMount() {
48 setTimeout(() => {
49 this.setState({
50 showing: true,
51 });
52 }, 0);
53
54 setTimeout(() => {
55 this.setState({
56 showing: false,
57 });
58 }, ms('6s'));
59
60 setTimeout(() => {
61 this.setState({
62 removed: true,
63 });
64 }, ms('7s'));
65 }
66
67 render() {
68 const { classes } = this.props;
69 const { showing, removed } = this.state;
70 const { intl } = this.context;
71
72 if (removed) return null;
73
74 return (
75 <div
76 className={classnames({
77 [classes.notification]: true,
78 [classes.show]: showing,
79 })}
80 >
81 <InfoBar
82 type="primary"
83 position="top"
84 sticky
85 >
86 <span className="mdi mdi-information" />
87 {intl.formatMessage(messages.message)}
88 </InfoBar>
89 </div>
90 );
91 }
92}
93
94export default TrialActivationInfoBar;
diff --git a/src/components/auth/AuthLayout.js b/src/components/auth/AuthLayout.js
index 6fa3adf92..c0e6b982b 100644
--- a/src/components/auth/AuthLayout.js
+++ b/src/components/auth/AuthLayout.js
@@ -7,14 +7,19 @@ import { TitleBar } from 'electron-react-titlebar';
7import Link from '../ui/Link'; 7import Link from '../ui/Link';
8import InfoBar from '../ui/InfoBar'; 8import InfoBar from '../ui/InfoBar';
9 9
10import { oneOrManyChildElements, globalError as globalErrorPropType } from '../../prop-types'; 10import {
11 oneOrManyChildElements,
12 globalError as globalErrorPropType,
13} from '../../prop-types';
11import globalMessages from '../../i18n/globalMessages'; 14import globalMessages from '../../i18n/globalMessages';
12 15
13import { isWindows } from '../../environment'; 16import { isWindows } from '../../environment';
14import AppUpdateInfoBar from '../AppUpdateInfoBar'; 17import AppUpdateInfoBar from '../AppUpdateInfoBar';
15import { GITHUB_FERDI_URL } from '../../config'; 18import { GITHUB_FERDI_URL } from '../../config';
16 19
17export default @observer class AuthLayout extends Component { 20export default
21@observer
22class AuthLayout extends Component {
18 static propTypes = { 23 static propTypes = {
19 children: oneOrManyChildElements.isRequired, 24 children: oneOrManyChildElements.isRequired,
20 error: globalErrorPropType.isRequired, 25 error: globalErrorPropType.isRequired,
@@ -30,7 +35,7 @@ export default @observer class AuthLayout extends Component {
30 35
31 state = { 36 state = {
32 shouldShowAppUpdateInfoBar: true, 37 shouldShowAppUpdateInfoBar: true,
33 } 38 };
34 39
35 static defaultProps = { 40 static defaultProps = {
36 nextAppReleaseVersion: null, 41 nextAppReleaseVersion: null,
@@ -57,12 +62,15 @@ export default @observer class AuthLayout extends Component {
57 62
58 return ( 63 return (
59 <> 64 <>
60 {isWindows && !isFullScreen && <TitleBar menu={window.ferdi.menu.template} icon="assets/images/logo.svg" />} 65 {isWindows && !isFullScreen && (
66 <TitleBar
67 menu={window.ferdi.menu.template}
68 icon="assets/images/logo.svg"
69 />
70 )}
61 <div className="auth"> 71 <div className="auth">
62 {!isOnline && ( 72 {!isOnline && (
63 <InfoBar 73 <InfoBar type="warning">
64 type="warning"
65 >
66 <span className="mdi mdi-flash" /> 74 <span className="mdi mdi-flash" />
67 {intl.formatMessage(globalMessages.notConnectedToTheInternet)} 75 {intl.formatMessage(globalMessages.notConnectedToTheInternet)}
68 </InfoBar> 76 </InfoBar>
@@ -95,7 +103,11 @@ export default @observer class AuthLayout extends Component {
95 })} 103 })}
96 </div> 104 </div>
97 {/* </div> */} 105 {/* </div> */}
98 <Link to={`${GITHUB_FERDI_URL}/ferdi`} className="auth__adlk" target="_blank"> 106 <Link
107 to={`${GITHUB_FERDI_URL}/ferdi`}
108 className="auth__adlk"
109 target="_blank"
110 >
99 <img src="./assets/images/adlk.svg" alt="" /> 111 <img src="./assets/images/adlk.svg" alt="" />
100 </Link> 112 </Link>
101 </div> 113 </div>
diff --git a/src/components/auth/ChangeServer.js b/src/components/auth/ChangeServer.js
index 0dedd825a..7bab80280 100644
--- a/src/components/auth/ChangeServer.js
+++ b/src/components/auth/ChangeServer.js
@@ -100,7 +100,7 @@ export default @observer class ChangeServer extends Component {
100 const { intl } = this.context; 100 const { intl } = this.context;
101 return ( 101 return (
102 <div className="auth__container"> 102 <div className="auth__container">
103 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}> 103 <form className="franz-form auth__form" onSubmit={(e) => this.submit(e)}>
104 <h1>{intl.formatMessage(messages.headline)}</h1> 104 <h1>{intl.formatMessage(messages.headline)}</h1>
105 {form.$('server').value === this.franzServer 105 {form.$('server').value === this.franzServer
106 && ( 106 && (
@@ -113,7 +113,7 @@ export default @observer class ChangeServer extends Component {
113 && ( 113 && (
114 <Input 114 <Input
115 placeholder="Custom Server" 115 placeholder="Custom Server"
116 onChange={e => this.submit(e)} 116 onChange={(e) => this.submit(e)}
117 field={form.$('customServer')} 117 field={form.$('customServer')}
118 /> 118 />
119 )} 119 )}
diff --git a/src/components/auth/Locked.js b/src/components/auth/Locked.js
index 1fdbea595..2ad8a2409 100644
--- a/src/components/auth/Locked.js
+++ b/src/components/auth/Locked.js
@@ -102,7 +102,7 @@ export default @observer class Locked extends Component {
102 102
103 return ( 103 return (
104 <div className="auth__container"> 104 <div className="auth__container">
105 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}> 105 <form className="franz-form auth__form" onSubmit={(e) => this.submit(e)}>
106 <img 106 <img
107 src="./assets/images/logo.svg" 107 src="./assets/images/logo.svg"
108 className="auth__logo" 108 className="auth__logo"
diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js
index 52b09eab6..9e6a8d046 100644
--- a/src/components/auth/Login.js
+++ b/src/components/auth/Login.js
@@ -135,7 +135,7 @@ export default @inject('actions') @observer class Login extends Component {
135 135
136 return ( 136 return (
137 <div className="auth__container"> 137 <div className="auth__container">
138 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}> 138 <form className="franz-form auth__form" onSubmit={(e) => this.submit(e)}>
139 <img 139 <img
140 src="./assets/images/logo.svg" 140 src="./assets/images/logo.svg"
141 className="auth__logo" 141 className="auth__logo"
diff --git a/src/components/auth/Password.js b/src/components/auth/Password.js
index ad34e39af..eafc48502 100644
--- a/src/components/auth/Password.js
+++ b/src/components/auth/Password.js
@@ -86,7 +86,7 @@ export default @observer class Password extends Component {
86 86
87 return ( 87 return (
88 <div className="auth__container"> 88 <div className="auth__container">
89 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}> 89 <form className="franz-form auth__form" onSubmit={(e) => this.submit(e)}>
90 <img 90 <img
91 src="./assets/images/logo.svg" 91 src="./assets/images/logo.svg"
92 className="auth__logo" 92 className="auth__logo"
diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js
deleted file mode 100644
index 2fcabe54d..000000000
--- a/src/components/auth/Pricing.js
+++ /dev/null
@@ -1,270 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6import { H2, Loader } from '@meetfranz/ui';
7import classnames from 'classnames';
8
9import { Button } from '@meetfranz/forms';
10import { FeatureItem } from '../ui/FeatureItem';
11import { FeatureList } from '../ui/FeatureList';
12
13const messages = defineMessages({
14 headline: {
15 id: 'pricing.trial.headline.pro',
16 defaultMessage: '!!!Hi {name}, welcome to Franz',
17 },
18 specialTreat: {
19 id: 'pricing.trial.intro.specialTreat',
20 defaultMessage: '!!!We have a special treat for you.',
21 },
22 tryPro: {
23 id: 'pricing.trial.intro.tryPro',
24 defaultMessage: '!!!Enjoy the full Franz Professional experience completely free for 14 days.',
25 },
26 happyMessaging: {
27 id: 'pricing.trial.intro.happyMessaging',
28 defaultMessage: '!!!Happy messaging,',
29 },
30 noStringsAttachedHeadline: {
31 id: 'pricing.trial.terms.headline',
32 defaultMessage: '!!!No strings attached',
33 },
34 noCreditCard: {
35 id: 'pricing.trial.terms.noCreditCard',
36 defaultMessage: '!!!No credit card required',
37 },
38 automaticTrialEnd: {
39 id: 'pricing.trial.terms.automaticTrialEnd',
40 defaultMessage: '!!!Your free trial ends automatically after 14 days',
41 },
42 trialWorth: {
43 id: 'pricing.trial.terms.trialWorth',
44 defaultMessage: '!!!Free trial (normally {currency}{price} per month)',
45 },
46 activationError: {
47 id: 'pricing.trial.error',
48 defaultMessage: '!!!Sorry, we could not activate your trial!',
49 },
50 ctaAccept: {
51 id: 'pricing.trial.cta.accept',
52 defaultMessage: '!!!Start my 14-day Franz Professional Trial ',
53 },
54 ctaStart: {
55 id: 'pricing.trial.cta.start',
56 defaultMessage: '!!!Start using Franz',
57 },
58 ctaSkip: {
59 id: 'pricing.trial.cta.skip',
60 defaultMessage: '!!!Continue to Ferdi',
61 },
62 featuresHeadline: {
63 id: 'pricing.trial.features.headline',
64 defaultMessage: '!!!Franz Professional includes:',
65 },
66});
67
68const styles = theme => ({
69 root: {
70 width: '500px !important',
71 textAlign: 'center',
72 padding: 20,
73 zIndex: 100,
74
75 '& h1': {
76 },
77 },
78 container: {
79 position: 'relative',
80 marginLeft: -150,
81 },
82 welcomeOffer: {
83 textAlign: 'center',
84 fontWeight: 'bold',
85 marginBottom: '6 !important',
86 },
87 keyTerms: {
88 textAlign: 'center',
89 },
90 content: {
91 position: 'relative',
92 zIndex: 20,
93 },
94 featureContainer: {
95 width: 300,
96 position: 'absolute',
97 left: 'calc(100% / 2 + 250px)',
98 marginTop: 20,
99 background: theme.signup.pricing.feature.background,
100 height: 'auto',
101 padding: 20,
102 borderTopRightRadius: theme.borderRadius,
103 borderBottomRightRadius: theme.borderRadius,
104 zIndex: 10,
105 },
106 featureItem: {
107 borderBottom: [1, 'solid', theme.signup.pricing.feature.border],
108 },
109 cta: {
110 marginTop: 40,
111 width: '100%',
112 },
113 skipLink: {
114 textAlign: 'center',
115 marginTop: 10,
116 },
117 error: {
118 margin: [20, 0, 0],
119 color: theme.styleTypes.danger.accent,
120 },
121 priceContainer: {
122 display: 'flex',
123 justifyContent: 'space-evenly',
124 margin: [10, 0, 15],
125 },
126 price: {
127 '& sup': {
128 verticalAlign: 14,
129 fontSize: 20,
130 },
131 },
132 figure: {
133 fontSize: 40,
134 },
135 regularPrice: {
136 position: 'relative',
137
138 '&:before': {
139 content: '" "',
140 position: 'absolute',
141 width: '130%',
142 height: 1,
143 top: 14,
144 left: -12,
145 borderBottom: [3, 'solid', 'red'],
146 transform: 'rotateZ(-20deg)',
147 },
148 },
149});
150
151export default @injectSheet(styles) @observer class Signup extends Component {
152 static propTypes = {
153 onSubmit: PropTypes.func.isRequired,
154 isLoadingRequiredData: PropTypes.bool.isRequired,
155 isActivatingTrial: PropTypes.bool.isRequired,
156 trialActivationError: PropTypes.bool.isRequired,
157 canSkipTrial: PropTypes.bool.isRequired,
158 classes: PropTypes.object.isRequired,
159 currency: PropTypes.string.isRequired,
160 price: PropTypes.number.isRequired,
161 name: PropTypes.string.isRequired,
162 };
163
164 static contextTypes = {
165 intl: intlShape,
166 };
167
168 render() {
169 const {
170 onSubmit,
171 isLoadingRequiredData,
172 isActivatingTrial,
173 trialActivationError,
174 canSkipTrial,
175 classes,
176 currency,
177 price,
178 name,
179 } = this.props;
180 const { intl } = this.context;
181
182 const [intPart, fractionPart] = (price).toString().split('.');
183
184 return (
185 <>
186 <div className={classnames('auth__container', classes.root, classes.container)}>
187 <form className="franz-form auth__form">
188 {isLoadingRequiredData ? <Loader /> : (
189 <img
190 src="./assets/images/sm.png"
191 className="auth__logo auth__logo--sm"
192 alt=""
193 />
194 )}
195 <h1>{intl.formatMessage(messages.headline, { name })}</h1>
196 <div className="auth__letter">
197 <p>
198 {intl.formatMessage(messages.specialTreat)}
199 <br />
200 </p>
201 <p>
202 {intl.formatMessage(messages.tryPro)}
203 <br />
204 </p>
205 <p>
206 {intl.formatMessage(messages.happyMessaging)}
207 </p>
208 <p>
209 <strong>Stefan Malzner</strong>
210 </p>
211 </div>
212 <div className={classes.priceContainer}>
213 <p className={classnames(classes.price, classes.regularPrice)}>
214 <span className={classes.figure}>
215 {currency}
216 {intPart}
217 </span>
218 <sup>{fractionPart}</sup>
219 </p>
220 <p className={classnames(classes.price, classes.trialPrice)}>
221 <span className={classes.figure}>
222 {currency}
223 0
224 </span>
225 <sup>00</sup>
226 </p>
227 </div>
228 <div className={classes.keyTerms}>
229 <H2>
230 {intl.formatMessage(messages.noStringsAttachedHeadline)}
231 </H2>
232 <ul className={classes.keyTermsList}>
233 <FeatureItem
234 icon="👉"
235 name={intl.formatMessage(messages.trialWorth, {
236 currency,
237 price,
238 })}
239 />
240 <FeatureItem icon="👉" name={intl.formatMessage(messages.noCreditCard)} />
241 <FeatureItem icon="👉" name={intl.formatMessage(messages.automaticTrialEnd)} />
242 </ul>
243 </div>
244 {trialActivationError && (
245 <p className={classes.error}>{intl.formatMessage(messages.activationError)}</p>
246 )}
247 <Button
248 label={intl.formatMessage(!canSkipTrial ? messages.ctaStart : messages.ctaAccept)}
249 className={classes.cta}
250 onClick={onSubmit}
251 busy={isActivatingTrial}
252 disabled={isLoadingRequiredData || isActivatingTrial}
253 />
254 {canSkipTrial && (
255 <p className={classes.skipLink}>
256 <a href="#/">{intl.formatMessage(messages.ctaSkip)}</a>
257 </p>
258 )}
259 </form>
260 </div>
261 <div className={classes.featureContainer}>
262 <H2>
263 {intl.formatMessage(messages.featuresHeadline)}
264 </H2>
265 <FeatureList />
266 </div>
267 </>
268 );
269 }
270}
diff --git a/src/components/auth/SetupAssistant.js b/src/components/auth/SetupAssistant.js
index e03cf9101..0f821d4fc 100644
--- a/src/components/auth/SetupAssistant.js
+++ b/src/components/auth/SetupAssistant.js
@@ -18,15 +18,16 @@ const SLACK_ID = 'slack';
18const messages = defineMessages({ 18const messages = defineMessages({
19 headline: { 19 headline: {
20 id: 'setupAssistant.headline', 20 id: 'setupAssistant.headline',
21 defaultMessage: '!!!Let\'s get started', 21 defaultMessage: "!!!Let's get started",
22 }, 22 },
23 subHeadline: { 23 subHeadline: {
24 id: 'setupAssistant.subheadline', 24 id: 'setupAssistant.subheadline',
25 defaultMessage: '!!!Choose from our most used services and get back on top of your messaging now.', 25 defaultMessage:
26 '!!!Choose from our most used services and get back on top of your messaging now.',
26 }, 27 },
27 submitButtonLabel: { 28 submitButtonLabel: {
28 id: 'setupAssistant.submit.label', 29 id: 'setupAssistant.submit.label',
29 defaultMessage: '!!!Let\'s go', 30 defaultMessage: "!!!Let's go",
30 }, 31 },
31 inviteSuccessInfo: { 32 inviteSuccessInfo: {
32 id: 'invite.successInfo', 33 id: 'invite.successInfo',
@@ -34,14 +35,19 @@ const messages = defineMessages({
34 }, 35 },
35}); 36});
36 37
38let transition = 'none';
39
40if (window && window.matchMedia('(prefers-reduced-motion: no-preference)')) {
41 transition = 'all 0.25s';
42}
43
37const styles = theme => ({ 44const styles = theme => ({
38 root: { 45 root: {
39 width: '500px !important', 46 width: '500px !important',
40 textAlign: 'center', 47 textAlign: 'center',
41 padding: 20, 48 padding: 20,
42 49
43 '& h1': { 50 '& h1': {},
44 },
45 }, 51 },
46 servicesGrid: { 52 servicesGrid: {
47 display: 'flex', 53 display: 'flex',
@@ -60,7 +66,7 @@ const styles = theme => ({
60 borderRadius: theme.borderRadius, 66 borderRadius: theme.borderRadius,
61 marginBottom: 10, 67 marginBottom: 10,
62 opacity: 0.5, 68 opacity: 0.5,
63 transition: 'all 0.25s', 69 transition,
64 border: [3, 'solid', 'transparent'], 70 border: [3, 'solid', 'transparent'],
65 71
66 '& h2': { 72 '& h2': {
@@ -70,10 +76,8 @@ const styles = theme => ({
70 76
71 '&:hover': { 77 '&:hover': {
72 border: [3, 'solid', theme.brandPrimary], 78 border: [3, 'solid', theme.brandPrimary],
73 '& $serviceIcon': { 79 '& $serviceIcon': {},
74 },
75 }, 80 },
76
77 }, 81 },
78 selected: { 82 selected: {
79 border: [3, 'solid', theme.brandPrimary], 83 border: [3, 'solid', theme.brandPrimary],
@@ -82,7 +86,7 @@ const styles = theme => ({
82 }, 86 },
83 serviceIcon: { 87 serviceIcon: {
84 width: 50, 88 width: 50,
85 transition: 'all 0.25s', 89 transition,
86 }, 90 },
87 91
88 slackModalContent: { 92 slackModalContent: {
@@ -125,7 +129,8 @@ const styles = theme => ({
125 }, 129 },
126}); 130});
127 131
128@injectSheet(styles) @observer 132@injectSheet(styles)
133@observer
129class SetupAssistant extends Component { 134class SetupAssistant extends Component {
130 static propTypes = { 135 static propTypes = {
131 classes: PropTypes.object.isRequired, 136 classes: PropTypes.object.isRequired,
@@ -144,13 +149,17 @@ class SetupAssistant extends Component {
144 }; 149 };
145 150
146 state = { 151 state = {
147 services: [{ 152 services: [
148 id: 'whatsapp', 153 {
149 }, { 154 id: 'whatsapp',
150 id: 'messenger', 155 },
151 }, { 156 {
152 id: 'gmail', 157 id: 'messenger',
153 }], 158 },
159 {
160 id: 'gmail',
161 },
162 ],
154 isSlackModalOpen: false, 163 isSlackModalOpen: false,
155 slackWorkspace: '', 164 slackWorkspace: '',
156 }; 165 };
@@ -158,7 +167,9 @@ class SetupAssistant extends Component {
158 slackWorkspaceHandler() { 167 slackWorkspaceHandler() {
159 const { slackWorkspace = '', services } = this.state; 168 const { slackWorkspace = '', services } = this.state;
160 169
161 const sanitizedWorkspace = slackWorkspace.trim().replace(/^https?:\/\//, ''); 170 const sanitizedWorkspace = slackWorkspace
171 .trim()
172 .replace(/^https?:\/\//, '');
162 173
163 if (sanitizedWorkspace) { 174 if (sanitizedWorkspace) {
164 const index = services.findIndex(s => s.id === SLACK_ID); 175 const index = services.findIndex(s => s.id === SLACK_ID);
@@ -179,9 +190,17 @@ class SetupAssistant extends Component {
179 render() { 190 render() {
180 const { intl } = this.context; 191 const { intl } = this.context;
181 const { 192 const {
182 classes, isInviteSuccessful, onSubmit, services, isSettingUpServices, 193 classes,
194 isInviteSuccessful,
195 onSubmit,
196 services,
197 isSettingUpServices,
183 } = this.props; 198 } = this.props;
184 const { isSlackModalOpen, slackWorkspace, services: addedServices } = this.state; 199 const {
200 isSlackModalOpen,
201 slackWorkspace,
202 services: addedServices,
203 } = this.state;
185 204
186 return ( 205 return (
187 <div className={`auth__container ${classes.root}`}> 206 <div className={`auth__container ${classes.root}`}>
@@ -197,25 +216,18 @@ class SetupAssistant extends Component {
197 </Appear> 216 </Appear>
198 )} 217 )}
199 218
200 <img 219 <img src="./assets/images/logo.svg" className="auth__logo" alt="" />
201 src="./assets/images/logo.svg" 220 <h1>{intl.formatMessage(messages.headline)}</h1>
202 className="auth__logo" 221 <h2>{intl.formatMessage(messages.subHeadline)}</h2>
203 alt=""
204 />
205 <h1>
206 {intl.formatMessage(messages.headline)}
207 </h1>
208 <h2>
209 {intl.formatMessage(messages.subHeadline)}
210 </h2>
211 <div className={classnames('grid', classes.servicesGrid)}> 222 <div className={classnames('grid', classes.servicesGrid)}>
212 {Object.keys(services).map((id) => { 223 {Object.keys(services).map(id => {
213 const service = services[id]; 224 const service = services[id];
214 return ( 225 return (
215 <button 226 <button
216 className={classnames({ 227 className={classnames({
217 [classes.serviceContainer]: true, 228 [classes.serviceContainer]: true,
218 [classes.selected]: this.state.services.findIndex(s => s.id === id) !== -1, 229 [classes.selected]:
230 this.state.services.findIndex(s => s.id === id) !== -1,
219 })} 231 })}
220 key={id} 232 key={id}
221 onClick={() => { 233 onClick={() => {
@@ -244,9 +256,7 @@ class SetupAssistant extends Component {
244 className={classes.serviceIcon} 256 className={classes.serviceIcon}
245 alt="" 257 alt=""
246 /> 258 />
247 <h2> 259 <h2>{service.name}</h2>
248 {service.name}
249 </h2>
250 {id === SLACK_ID && slackWorkspace && ( 260 {id === SLACK_ID && slackWorkspace && (
251 <Badge type="secondary" className={classes.slackBadge}> 261 <Badge type="secondary" className={classes.slackBadge}>
252 {slackWorkspace} 262 {slackWorkspace}
@@ -275,22 +285,22 @@ class SetupAssistant extends Component {
275 <div className={classes.slackModalContent}> 285 <div className={classes.slackModalContent}>
276 <img src={`${CDN_URL}/recipes/dist/slack/src/icon.svg`} alt="" /> 286 <img src={`${CDN_URL}/recipes/dist/slack/src/icon.svg`} alt="" />
277 <h1>Create your first Slack workspace</h1> 287 <h1>Create your first Slack workspace</h1>
278 <form onSubmit={(e) => { 288 <form
279 e.preventDefault(); 289 onSubmit={e => {
280 this.slackWorkspaceHandler(); 290 e.preventDefault();
281 }} 291 this.slackWorkspaceHandler();
292 }}
282 > 293 >
283 <Input 294 <Input
284 suffix=".slack.com" 295 suffix=".slack.com"
285 placeholder="workspace-url" 296 placeholder="workspace-url"
286 onChange={e => this.setState({ slackWorkspace: e.target.value })} 297 onChange={e =>
298 this.setState({ slackWorkspace: e.target.value })
299 }
287 value={slackWorkspace} 300 value={slackWorkspace}
288 /> 301 />
289 <div className={classes.modalActionContainer}> 302 <div className={classes.modalActionContainer}>
290 <Button 303 <Button type="submit" label="Save" />
291 type="submit"
292 label="Save"
293 />
294 <Button 304 <Button
295 type="link" 305 type="link"
296 buttonType="secondary" 306 buttonType="secondary"
@@ -305,7 +315,7 @@ class SetupAssistant extends Component {
305 <Button 315 <Button
306 type="button" 316 type="button"
307 className="auth__button" 317 className="auth__button"
308 // disabled={!atLeastOneEmailAddress} 318 // disabled={!atLeastOneEmailAddress}
309 label={intl.formatMessage(messages.submitButtonLabel)} 319 label={intl.formatMessage(messages.submitButtonLabel)}
310 onClick={() => onSubmit(this.state.services)} 320 onClick={() => onSubmit(this.state.services)}
311 busy={isSettingUpServices} 321 busy={isSettingUpServices}
diff --git a/src/components/auth/Signup.js b/src/components/auth/Signup.js
index 140867ea1..6fb41a164 100644
--- a/src/components/auth/Signup.js
+++ b/src/components/auth/Signup.js
@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
4import { observer, inject } from 'mobx-react'; 4import { observer, inject } from 'mobx-react';
5import { defineMessages, intlShape } from 'react-intl'; 5import { defineMessages, intlShape } from 'react-intl';
6 6
7import { isDevMode, termsBase, useLiveAPI } from '../../environment'; 7import { isDevMode, useLiveAPI } from '../../environment';
8import Form from '../../lib/Form'; 8import Form from '../../lib/Form';
9import { required, email, minLength } from '../../helpers/validation-helpers'; 9import { required, email, minLength } from '../../helpers/validation-helpers';
10import serverlessLogin from '../../helpers/serverless-helpers'; 10import serverlessLogin from '../../helpers/serverless-helpers';
@@ -14,6 +14,7 @@ import Link from '../ui/Link';
14import Infobox from '../ui/Infobox'; 14import Infobox from '../ui/Infobox';
15 15
16import { globalError as globalErrorPropType } from '../../prop-types'; 16import { globalError as globalErrorPropType } from '../../prop-types';
17import { termsBase } from '../../api/apiBase';
17 18
18const messages = defineMessages({ 19const messages = defineMessages({
19 headline: { 20 headline: {
@@ -138,7 +139,7 @@ export default @inject('actions') @observer class Signup extends Component {
138 return ( 139 return (
139 <div className="auth__scroll-container"> 140 <div className="auth__scroll-container">
140 <div className="auth__container auth__container--signup"> 141 <div className="auth__container auth__container--signup">
141 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}> 142 <form className="franz-form auth__form" onSubmit={(e) => this.submit(e)}>
142 <img 143 <img
143 src="./assets/images/logo.svg" 144 src="./assets/images/logo.svg"
144 className="auth__logo" 145 className="auth__logo"
diff --git a/src/components/auth/Welcome.js b/src/components/auth/Welcome.js
index 5f2fac64b..cb522e26e 100644
--- a/src/components/auth/Welcome.js
+++ b/src/components/auth/Welcome.js
@@ -84,7 +84,7 @@ export default @inject('actions') @observer class Login extends Component {
84 </Link> 84 </Link>
85 </div> 85 </div>
86 <div className="welcome__featured-services"> 86 <div className="welcome__featured-services">
87 {recipes.map(recipe => ( 87 {recipes.map((recipe) => (
88 <div 88 <div
89 key={recipe.id} 89 key={recipe.id}
90 className="welcome__featured-service" 90 className="welcome__featured-service"
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index a60270a6f..d5e1deb39 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -19,10 +19,7 @@ import { isWindows } from '../../environment';
19import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; 19import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator';
20import { workspaceStore } from '../../features/workspaces'; 20import { workspaceStore } from '../../features/workspaces';
21import AppUpdateInfoBar from '../AppUpdateInfoBar'; 21import AppUpdateInfoBar from '../AppUpdateInfoBar';
22import TrialActivationInfoBar from '../TrialActivationInfoBar';
23import Todos from '../../features/todos/containers/TodosScreen'; 22import Todos from '../../features/todos/containers/TodosScreen';
24import PlanSelection from '../../features/planSelection/containers/PlanSelectionScreen';
25import TrialStatusBar from '../../features/trialStatusBar/containers/TrialStatusBarScreen';
26 23
27function createMarkup(HTMLString) { 24function createMarkup(HTMLString) {
28 return { __html: HTMLString }; 25 return { __html: HTMLString };
@@ -43,22 +40,32 @@ const messages = defineMessages({
43 }, 40 },
44 authRequestFailed: { 41 authRequestFailed: {
45 id: 'infobar.authRequestFailed', 42 id: 'infobar.authRequestFailed',
46 defaultMessage: '!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.', 43 defaultMessage:
44 '!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.',
47 }, 45 },
48}); 46});
49 47
48let transition = 'none';
49
50if (window && window.matchMedia('(prefers-reduced-motion: no-preference)')) {
51 transition = 'transform 0.5s ease';
52}
53
50const styles = theme => ({ 54const styles = theme => ({
51 appContent: { 55 appContent: {
52 // width: `calc(100% + ${theme.workspaces.drawer.width}px)`, 56 // width: `calc(100% + ${theme.workspaces.drawer.width}px)`,
53 width: '100%', 57 width: '100%',
54 transition: 'transform 0.5s ease', 58 transition,
55 transform() { 59 transform() {
56 return workspaceStore.isWorkspaceDrawerOpen ? 'translateX(0)' : `translateX(-${theme.workspaces.drawer.width}px)`; 60 return workspaceStore.isWorkspaceDrawerOpen
61 ? 'translateX(0)'
62 : `translateX(-${theme.workspaces.drawer.width}px)`;
57 }, 63 },
58 }, 64 },
59}); 65});
60 66
61@injectSheet(styles) @observer 67@injectSheet(styles)
68@observer
62class AppLayout extends Component { 69class AppLayout extends Component {
63 static propTypes = { 70 static propTypes = {
64 classes: PropTypes.object.isRequired, 71 classes: PropTypes.object.isRequired,
@@ -79,12 +86,11 @@ class AppLayout extends Component {
79 areRequiredRequestsSuccessful: PropTypes.bool.isRequired, 86 areRequiredRequestsSuccessful: PropTypes.bool.isRequired,
80 retryRequiredRequests: PropTypes.func.isRequired, 87 retryRequiredRequests: PropTypes.func.isRequired,
81 areRequiredRequestsLoading: PropTypes.bool.isRequired, 88 areRequiredRequestsLoading: PropTypes.bool.isRequired,
82 hasActivatedTrial: PropTypes.bool.isRequired,
83 }; 89 };
84 90
85 state = { 91 state = {
86 shouldShowAppUpdateInfoBar: true, 92 shouldShowAppUpdateInfoBar: true,
87 } 93 };
88 94
89 static defaultProps = { 95 static defaultProps = {
90 children: [], 96 children: [],
@@ -115,7 +121,6 @@ class AppLayout extends Component {
115 areRequiredRequestsSuccessful, 121 areRequiredRequestsSuccessful,
116 retryRequiredRequests, 122 retryRequiredRequests,
117 areRequiredRequestsLoading, 123 areRequiredRequestsLoading,
118 hasActivatedTrial,
119 } = this.props; 124 } = this.props;
120 125
121 const { intl } = this.context; 126 const { intl } = this.context;
@@ -123,45 +128,48 @@ class AppLayout extends Component {
123 return ( 128 return (
124 <ErrorBoundary> 129 <ErrorBoundary>
125 <div className="app"> 130 <div className="app">
126 {isWindows && !isFullScreen && <TitleBar menu={window.ferdi.menu.template} icon="assets/images/logo.svg" />} 131 {isWindows && !isFullScreen && (
132 <TitleBar
133 menu={window.ferdi.menu.template}
134 icon="assets/images/logo.svg"
135 />
136 )}
127 <div className={`app__content ${classes.appContent}`}> 137 <div className={`app__content ${classes.appContent}`}>
128 {workspacesDrawer} 138 {workspacesDrawer}
129 {sidebar} 139 {sidebar}
130 <div className="app__service"> 140 <div className="app__service">
131 <WorkspaceSwitchingIndicator /> 141 <WorkspaceSwitchingIndicator />
132 {news.length > 0 && news.map(item => ( 142 {news.length > 0 &&
143 news.map(item => (
144 <InfoBar
145 key={item.id}
146 position="top"
147 type={item.type}
148 sticky={item.sticky}
149 onHide={() => removeNewsItem({ newsId: item.id })}
150 >
151 <span
152 dangerouslySetInnerHTML={createMarkup(item.message)}
153 onClick={event => {
154 const { target } = event;
155 if (target && target.hasAttribute('data-is-news-cta')) {
156 removeNewsItem({ newsId: item.id });
157 }
158 }}
159 />
160 </InfoBar>
161 ))}
162 {!areRequiredRequestsSuccessful && showRequiredRequestsError && (
133 <InfoBar 163 <InfoBar
134 key={item.id} 164 type="danger"
135 position="top" 165 ctaLabel="Try again"
136 type={item.type} 166 ctaLoading={areRequiredRequestsLoading}
137 sticky={item.sticky} 167 sticky
138 onHide={() => removeNewsItem({ newsId: item.id })} 168 onClick={retryRequiredRequests}
139 > 169 >
140 <span 170 <span className="mdi mdi-flash" />
141 dangerouslySetInnerHTML={createMarkup(item.message)} 171 {intl.formatMessage(messages.requiredRequestsFailed)}
142 onClick={(event) => {
143 const { target } = event;
144 if (target && target.hasAttribute('data-is-news-cta')) {
145 removeNewsItem({ newsId: item.id });
146 }
147 }}
148 />
149 </InfoBar> 172 </InfoBar>
150 ))}
151 {hasActivatedTrial && (
152 <TrialActivationInfoBar />
153 )}
154 {!areRequiredRequestsSuccessful && showRequiredRequestsError && (
155 <InfoBar
156 type="danger"
157 ctaLabel="Try again"
158 ctaLoading={areRequiredRequestsLoading}
159 sticky
160 onClick={retryRequiredRequests}
161 >
162 <span className="mdi mdi-flash" />
163 {intl.formatMessage(messages.requiredRequestsFailed)}
164 </InfoBar>
165 )} 173 )}
166 {authRequestFailed && ( 174 {authRequestFailed && (
167 <InfoBar 175 <InfoBar
@@ -186,7 +194,7 @@ class AppLayout extends Component {
186 {intl.formatMessage(messages.servicesUpdated)} 194 {intl.formatMessage(messages.servicesUpdated)}
187 </InfoBar> 195 </InfoBar>
188 )} 196 )}
189 { appUpdateIsDownloaded && this.state.shouldShowAppUpdateInfoBar && ( 197 {appUpdateIsDownloaded && this.state.shouldShowAppUpdateInfoBar && (
190 <AppUpdateInfoBar 198 <AppUpdateInfoBar
191 nextAppReleaseVersion={nextAppReleaseVersion} 199 nextAppReleaseVersion={nextAppReleaseVersion}
192 onInstallUpdate={installAppUpdate} 200 onInstallUpdate={installAppUpdate}
@@ -202,11 +210,9 @@ class AppLayout extends Component {
202 <PublishDebugInfo /> 210 <PublishDebugInfo />
203 {services} 211 {services}
204 {children} 212 {children}
205 <TrialStatusBar />
206 </div> 213 </div>
207 <Todos /> 214 <Todos />
208 </div> 215 </div>
209 <PlanSelection />
210 </div> 216 </div>
211 </ErrorBoundary> 217 </ErrorBoundary>
212 ); 218 );
diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js
index 802538eba..daa5642c3 100644
--- a/src/components/layout/Sidebar.js
+++ b/src/components/layout/Sidebar.js
@@ -6,16 +6,13 @@ import { inject, observer } from 'mobx-react';
6import { Link } from 'react-router'; 6import { Link } from 'react-router';
7 7
8import Tabbar from '../services/tabs/Tabbar'; 8import Tabbar from '../services/tabs/Tabbar';
9import { ctrlKey, isMac } from '../../environment'; 9import { settingsShortcutKey, lockFerdiShortcutKey, todosToggleShortcutKey, workspaceToggleShortcutKey, addNewServiceShortcutKey, muteFerdiShortcutKey } from '../../environment';
10import { workspaceStore } from '../../features/workspaces'; 10import { workspaceStore } from '../../features/workspaces';
11import { todosStore } from '../../features/todos'; 11import { todosStore } from '../../features/todos';
12import { todoActions } from '../../features/todos/actions'; 12import { todoActions } from '../../features/todos/actions';
13import AppStore from '../../stores/AppStore'; 13import AppStore from '../../stores/AppStore';
14import SettingsStore from '../../stores/SettingsStore'; 14import SettingsStore from '../../stores/SettingsStore';
15 15
16// Platform specific shortcut keys
17const settingsShortcutKey = isMac ? ',' : 'P';
18
19const messages = defineMessages({ 16const messages = defineMessages({
20 settings: { 17 settings: {
21 id: 'sidebar.settings', 18 id: 'sidebar.settings',
@@ -58,6 +55,19 @@ const messages = defineMessages({
58export default @inject('stores', 'actions') @observer class Sidebar extends Component { 55export default @inject('stores', 'actions') @observer class Sidebar extends Component {
59 static propTypes = { 56 static propTypes = {
60 openSettings: PropTypes.func.isRequired, 57 openSettings: PropTypes.func.isRequired,
58 closeSettings: PropTypes.func.isRequired,
59 setActive: PropTypes.func.isRequired,
60 reorder: PropTypes.func.isRequired,
61 reload: PropTypes.func.isRequired,
62 toggleNotifications: PropTypes.func.isRequired,
63 toggleAudio: PropTypes.func.isRequired,
64 toggleDarkMode: PropTypes.func.isRequired,
65 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
66 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
67 deleteService: PropTypes.func.isRequired,
68 updateService: PropTypes.func.isRequired,
69 hibernateService: PropTypes.func.isRequired,
70 wakeUpService: PropTypes.func.isRequired,
61 toggleMuteApp: PropTypes.func.isRequired, 71 toggleMuteApp: PropTypes.func.isRequired,
62 isAppMuted: PropTypes.bool.isRequired, 72 isAppMuted: PropTypes.bool.isRequired,
63 isWorkspaceDrawerOpen: PropTypes.bool.isRequired, 73 isWorkspaceDrawerOpen: PropTypes.bool.isRequired,
@@ -139,7 +149,7 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
139 }, 149 },
140 }); 150 });
141 }} 151 }}
142 data-tip={`${intl.formatMessage(messages.lockFerdi)} (${ctrlKey}+Shift+L)`} 152 data-tip={`${intl.formatMessage(messages.lockFerdi)} (${lockFerdiShortcutKey(false)})`}
143 > 153 >
144 <i className="mdi mdi-lock" /> 154 <i className="mdi mdi-lock" />
145 </button> 155 </button>
@@ -152,8 +162,8 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
152 this.updateToolTip(); 162 this.updateToolTip();
153 }} 163 }}
154 disabled={isTodosServiceActive} 164 disabled={isTodosServiceActive}
155 className={`sidebar__button sidebar__button--todos ${todosStore.isTodosPanelVisible ? 'is-active' : ''}`} 165 className={`sidebar__button sidebar__button--todos ${todosStore.isTodosPanelVisible ? 'is-active' : ''}`}
156 data-tip={`${intl.formatMessage(todosToggleMessage)} (${ctrlKey}+T)`} 166 data-tip={`${intl.formatMessage(todosToggleMessage)} (${todosToggleShortcutKey(false)})`}
157 > 167 >
158 <i className="mdi mdi-check-all" /> 168 <i className="mdi mdi-check-all" />
159 </button> 169 </button>
@@ -166,7 +176,7 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
166 this.updateToolTip(); 176 this.updateToolTip();
167 }} 177 }}
168 className={`sidebar__button sidebar__button--workspaces ${isWorkspaceDrawerOpen ? 'is-active' : ''}`} 178 className={`sidebar__button sidebar__button--workspaces ${isWorkspaceDrawerOpen ? 'is-active' : ''}`}
169 data-tip={`${intl.formatMessage(workspaceToggleMessage)} (${ctrlKey}+D)`} 179 data-tip={`${intl.formatMessage(workspaceToggleMessage)} (${workspaceToggleShortcutKey(false)})`}
170 > 180 >
171 <i className="mdi mdi-view-grid" /> 181 <i className="mdi mdi-view-grid" />
172 </button> 182 </button>
@@ -178,7 +188,7 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
178 this.updateToolTip(); 188 this.updateToolTip();
179 }} 189 }}
180 className={`sidebar__button sidebar__button--audio ${isAppMuted ? 'is-muted' : ''}`} 190 className={`sidebar__button sidebar__button--audio ${isAppMuted ? 'is-muted' : ''}`}
181 data-tip={`${intl.formatMessage(isAppMuted ? messages.unmute : messages.mute)} (${ctrlKey}+Shift+M)`} 191 data-tip={`${intl.formatMessage(isAppMuted ? messages.unmute : messages.mute)} (${muteFerdiShortcutKey(false)})`}
182 > 192 >
183 <i className={`mdi mdi-bell${isAppMuted ? '-off' : ''}`} /> 193 <i className={`mdi mdi-bell${isAppMuted ? '-off' : ''}`} />
184 </button> 194 </button>
@@ -186,7 +196,7 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
186 type="button" 196 type="button"
187 onClick={() => openSettings({ path: 'recipes' })} 197 onClick={() => openSettings({ path: 'recipes' })}
188 className="sidebar__button sidebar__button--new-service" 198 className="sidebar__button sidebar__button--new-service"
189 data-tip={`${intl.formatMessage(messages.addNewService)} (${ctrlKey}+N)`} 199 data-tip={`${intl.formatMessage(messages.addNewService)} (${addNewServiceShortcutKey(false)})`}
190 > 200 >
191 <i className="mdi mdi-plus-box" /> 201 <i className="mdi mdi-plus-box" />
192 </button> 202 </button>
@@ -204,9 +214,10 @@ export default @inject('stores', 'actions') @observer class Sidebar extends Comp
204 type="button" 214 type="button"
205 onClick={() => openSettings({ path: 'app' })} 215 onClick={() => openSettings({ path: 'app' })}
206 className="sidebar__button sidebar__button--settings" 216 className="sidebar__button sidebar__button--settings"
207 data-tip={`${intl.formatMessage(messages.settings)} (${ctrlKey}+${settingsShortcutKey})`} 217 data-tip={`${intl.formatMessage(messages.settings)} (${settingsShortcutKey(false)})`}
208 > 218 >
209 <i className="mdi mdi-settings" /> 219 {/* TODO: Because of https://github.com/Templarian/MaterialDesign-Webfont/issues/81 bug in @mdi/font in 5.9.55, added `mdi-memory` as a fallback */}
220 <i className="mdi mdi-settings mdi-memory" />
210 { (this.props.stores.app.updateStatus === this.props.stores.app.updateStatusTypes.AVAILABLE 221 { (this.props.stores.app.updateStatus === this.props.stores.app.updateStatusTypes.AVAILABLE
211 || this.props.stores.app.updateStatus === this.props.stores.app.updateStatusTypes.DOWNLOADED) && ( 222 || this.props.stores.app.updateStatus === this.props.stores.app.updateStatusTypes.DOWNLOADED) && (
212 <span className="update-available"> 223 <span className="update-available">
diff --git a/src/components/services/content/ConnectionLostBanner.js b/src/components/services/content/ConnectionLostBanner.js
index e54a88faa..ebe863333 100644
--- a/src/components/services/content/ConnectionLostBanner.js
+++ b/src/components/services/content/ConnectionLostBanner.js
@@ -5,9 +5,7 @@ import injectSheet from 'react-jss';
5import { Icon } from '@meetfranz/ui'; 5import { Icon } from '@meetfranz/ui';
6import { intlShape, defineMessages } from 'react-intl'; 6import { intlShape, defineMessages } from 'react-intl';
7 7
8import { 8import { mdiAlert } from '@mdi/js';
9 mdiAlert,
10} from '@mdi/js';
11import { LIVE_API_FERDI_WEBSITE } from '../../../config'; 9import { LIVE_API_FERDI_WEBSITE } from '../../../config';
12// import { Button } from '@meetfranz/forms'; 10// import { Button } from '@meetfranz/forms';
13 11
@@ -26,6 +24,12 @@ const messages = defineMessages({
26 }, 24 },
27}); 25});
28 26
27let buttonTransition = 'none';
28
29if (window && window.matchMedia('(prefers-reduced-motion: no-preference)')) {
30 buttonTransition = 'opacity 0.25s';
31}
32
29const styles = theme => ({ 33const styles = theme => ({
30 root: { 34 root: {
31 background: theme.colorBackground, 35 background: theme.colorBackground,
@@ -47,7 +51,7 @@ const styles = theme => ({
47 opacity: 0.7, 51 opacity: 0.7,
48 }, 52 },
49 button: { 53 button: {
50 transition: 'opacity 0.25s', 54 transition: buttonTransition,
51 color: theme.colorText, 55 color: theme.colorText,
52 border: [1, 'solid', theme.colorText], 56 border: [1, 'solid', theme.colorText],
53 borderRadius: theme.borderRadiusSmall, 57 borderRadius: theme.borderRadiusSmall,
@@ -65,13 +69,14 @@ const styles = theme => ({
65 }, 69 },
66}); 70});
67 71
68@injectSheet(styles) @observer 72@injectSheet(styles)
73@observer
69class ConnectionLostBanner extends Component { 74class ConnectionLostBanner extends Component {
70 static propTypes = { 75 static propTypes = {
71 classes: PropTypes.object.isRequired, 76 classes: PropTypes.object.isRequired,
72 name: PropTypes.string.isRequired, 77 name: PropTypes.string.isRequired,
73 reload: PropTypes.func.isRequired, 78 reload: PropTypes.func.isRequired,
74 } 79 };
75 80
76 static contextTypes = { 81 static contextTypes = {
77 intl: intlShape, 82 intl: intlShape,
@@ -80,20 +85,13 @@ class ConnectionLostBanner extends Component {
80 inputRef = React.createRef(); 85 inputRef = React.createRef();
81 86
82 render() { 87 render() {
83 const { 88 const { classes, name, reload } = this.props;
84 classes,
85 name,
86 reload,
87 } = this.props;
88 89
89 const { intl } = this.context; 90 const { intl } = this.context;
90 91
91 return ( 92 return (
92 <div className={classes.root}> 93 <div className={classes.root}>
93 <Icon 94 <Icon icon={mdiAlert} className={classes.icon} />
94 icon={mdiAlert}
95 className={classes.icon}
96 />
97 <p> 95 <p>
98 {intl.formatMessage(messages.text, { name })} 96 {intl.formatMessage(messages.text, { name })}
99 <br /> 97 <br />
@@ -104,11 +102,7 @@ class ConnectionLostBanner extends Component {
104 {intl.formatMessage(messages.moreInformation)} 102 {intl.formatMessage(messages.moreInformation)}
105 </a> 103 </a>
106 </p> 104 </p>
107 <button 105 <button type="button" className={classes.button} onClick={reload}>
108 type="button"
109 className={classes.button}
110 onClick={reload}
111 >
112 {intl.formatMessage(messages.cta)} 106 {intl.formatMessage(messages.cta)}
113 </button> 107 </button>
114 </div> 108 </div>
diff --git a/src/components/services/content/ErrorHandlers/styles.js b/src/components/services/content/ErrorHandlers/styles.js
index 9e2509ee5..72d62f5e3 100644
--- a/src/components/services/content/ErrorHandlers/styles.js
+++ b/src/components/services/content/ErrorHandlers/styles.js
@@ -1,4 +1,4 @@
1export default theme => ({ 1export default (theme) => ({
2 component: { 2 component: {
3 left: 0, 3 left: 0,
4 position: 'absolute', 4 position: 'absolute',
diff --git a/src/components/services/content/ServiceRestricted.js b/src/components/services/content/ServiceRestricted.js
deleted file mode 100644
index 4b8d926aa..000000000
--- a/src/components/services/content/ServiceRestricted.js
+++ /dev/null
@@ -1,78 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5
6import { serviceLimitStore } from '../../../features/serviceLimit';
7import Button from '../../ui/Button';
8import { RESTRICTION_TYPES } from '../../../models/Service';
9
10const messages = defineMessages({
11 headlineServiceLimit: {
12 id: 'service.restrictedHandler.serviceLimit.headline',
13 defaultMessage: '!!!You have reached your service limit.',
14 },
15 textServiceLimit: {
16 id: 'service.restrictedHandler.serviceLimit.text',
17 defaultMessage: '!!!Please upgrade your account to use more than {count} services.',
18 },
19 headlineCustomUrl: {
20 id: 'service.restrictedHandler.customUrl.headline',
21 defaultMessage: '!!!Franz Professional Plan required',
22 },
23 textCustomUrl: {
24 id: 'service.restrictedHandler.customUrl.text',
25 defaultMessage: '!!!Please upgrade to the Franz Professional plan to use custom urls & self hosted services.',
26 },
27 action: {
28 id: 'service.restrictedHandler.action',
29 defaultMessage: '!!!Upgrade Account',
30 },
31});
32
33export default @observer class ServiceRestricted extends Component {
34 static propTypes = {
35 name: PropTypes.string.isRequired,
36 upgrade: PropTypes.func.isRequired,
37 type: PropTypes.number.isRequired,
38 };
39
40 static contextTypes = {
41 intl: intlShape,
42 };
43
44 countdownInterval = null;
45
46 countdownIntervalTimeout = 1000;
47
48 render() {
49 const {
50 name,
51 upgrade,
52 type,
53 } = this.props;
54 const { intl } = this.context;
55
56 return (
57 <div className="services__info-layer">
58 {type === RESTRICTION_TYPES.SERVICE_LIMIT && (
59 <>
60 <h1>{intl.formatMessage(messages.headlineServiceLimit)}</h1>
61 <p>{intl.formatMessage(messages.textServiceLimit, { count: serviceLimitStore.serviceLimit })}</p>
62 </>
63 )}
64 {type === RESTRICTION_TYPES.CUSTOM_URL && (
65 <>
66 <h1>{intl.formatMessage(messages.headlineCustomUrl)}</h1>
67 <p>{intl.formatMessage(messages.textCustomUrl)}</p>
68 </>
69 )}
70 <Button
71 label={intl.formatMessage(messages.action, { name })}
72 buttonType="inverted"
73 onClick={() => upgrade()}
74 />
75 </div>
76 );
77 }
78}
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
index 17d2db5a0..3fc084ff0 100644
--- a/src/components/services/content/ServiceView.js
+++ b/src/components/services/content/ServiceView.js
@@ -145,19 +145,17 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
145 </> 145 </>
146 ) : ( 146 ) : (
147 <> 147 <>
148 {(!service.isHibernating || service.isHibernationEnabled) ? ( 148 {!service.isHibernating ? (
149 <> 149 <>
150 {showNavBar && ( 150 {showNavBar && (
151 <WebControlsScreen service={service} /> 151 <WebControlsScreen service={service} />
152 )} 152 )}
153 {!service.isHibernating && ( 153 <ServiceWebview
154 <ServiceWebview 154 service={service}
155 service={service} 155 setWebviewReference={setWebviewReference}
156 setWebviewReference={setWebviewReference} 156 detachService={detachService}
157 detachService={detachService} 157 isSpellcheckerEnabled={isSpellcheckerEnabled}
158 isSpellcheckerEnabled={isSpellcheckerEnabled} 158 />
159 />
160 )}
161 </> 159 </>
162 ) : ( 160 ) : (
163 <div> 161 <div>
diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js
index 9e5fed996..3b499a5db 100644
--- a/src/components/services/content/ServiceWebview.js
+++ b/src/components/services/content/ServiceWebview.js
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { observable, reaction } from 'mobx'; 4import { observable, reaction } from 'mobx';
5import ElectronWebView from 'react-electron-web-view'; 5import ElectronWebView from 'react-electron-web-view';
6import path from 'path'; 6import { join } from 'path';
7 7
8import ServiceModel from '../../../models/Service'; 8import ServiceModel from '../../../models/Service';
9 9
@@ -59,7 +59,7 @@ class ServiceWebview extends Component {
59 isSpellcheckerEnabled, 59 isSpellcheckerEnabled,
60 } = this.props; 60 } = this.props;
61 61
62 const preloadScript = path.join(__dirname, '../../../', 'webview', 'recipe.js'); 62 const preloadScript = join(__dirname, '..', '..', '..', 'webview', 'recipe.js');
63 63
64 return ( 64 return (
65 <ElectronWebView 65 <ElectronWebView
@@ -83,7 +83,7 @@ class ServiceWebview extends Component {
83 useragent={service.userAgent} 83 useragent={service.userAgent}
84 disablewebsecurity={service.recipe.disablewebsecurity ? true : undefined} 84 disablewebsecurity={service.recipe.disablewebsecurity ? true : undefined}
85 allowpopups 85 allowpopups
86 webpreferences={`spellcheck=${isSpellcheckerEnabled ? 1 : 0}, contextIsolation=false`} 86 webpreferences={`spellcheck=${isSpellcheckerEnabled ? 1 : 0}`}
87 /> 87 />
88 ); 88 );
89 } 89 }
diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js
index caa3cf9aa..bb93ff7d4 100644
--- a/src/components/services/content/Services.js
+++ b/src/components/services/content/Services.js
@@ -30,7 +30,7 @@ const messages = defineMessages({
30 }, 30 },
31 serverInfo: { 31 serverInfo: {
32 id: 'services.serverInfo', 32 id: 'services.serverInfo',
33 defaultMessage: '!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.', 33 defaultMessage: '!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!',
34 }, 34 },
35}); 35});
36 36
@@ -54,7 +54,6 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
54 openSettings: PropTypes.func.isRequired, 54 openSettings: PropTypes.func.isRequired,
55 update: PropTypes.func.isRequired, 55 update: PropTypes.func.isRequired,
56 userHasCompletedSignup: PropTypes.bool.isRequired, 56 userHasCompletedSignup: PropTypes.bool.isRequired,
57 hasActivatedTrial: PropTypes.bool.isRequired,
58 classes: PropTypes.object.isRequired, 57 classes: PropTypes.object.isRequired,
59 actions: PropTypes.object.isRequired, 58 actions: PropTypes.object.isRequired,
60 isSpellcheckerEnabled: PropTypes.bool.isRequired, 59 isSpellcheckerEnabled: PropTypes.bool.isRequired,
@@ -109,7 +108,6 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
109 openSettings, 108 openSettings,
110 update, 109 update,
111 userHasCompletedSignup, 110 userHasCompletedSignup,
112 hasActivatedTrial,
113 classes, 111 classes,
114 isSpellcheckerEnabled, 112 isSpellcheckerEnabled,
115 } = this.props; 113 } = this.props;
@@ -123,7 +121,7 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
123 121
124 return ( 122 return (
125 <div className="services"> 123 <div className="services">
126 {(userHasCompletedSignup || hasActivatedTrial) && ( 124 {userHasCompletedSignup && (
127 <div className={classes.confettiContainer}> 125 <div className={classes.confettiContainer}>
128 <Confetti 126 <Confetti
129 width={window.width} 127 width={window.width}
@@ -169,7 +167,7 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
169 </div> 167 </div>
170 </Appear> 168 </Appear>
171 )} 169 )}
172 {services.filter(service => !service.isTodosService).map(service => ( 170 {services.filter((service) => !service.isTodosService).map((service) => (
173 <ServiceView 171 <ServiceView
174 key={service.id} 172 key={service.id}
175 service={service} 173 service={service}
@@ -186,7 +184,6 @@ export default @injectSheet(styles) @inject('actions') @observer class Services
186 }, 184 },
187 redirect: false, 185 redirect: false,
188 })} 186 })}
189 upgrade={() => openSettings({ path: 'user' })}
190 isSpellcheckerEnabled={isSpellcheckerEnabled} 187 isSpellcheckerEnabled={isSpellcheckerEnabled}
191 /> 188 />
192 ))} 189 ))}
diff --git a/src/components/services/content/WebviewCrashHandler.js b/src/components/services/content/WebviewCrashHandler.js
index b62940c06..10ff0bbbb 100644
--- a/src/components/services/content/WebviewCrashHandler.js
+++ b/src/components/services/content/WebviewCrashHandler.js
@@ -47,7 +47,7 @@ export default @observer class WebviewCrashHandler extends Component {
47 const { reload } = this.props; 47 const { reload } = this.props;
48 48
49 this.countdownInterval = setInterval(() => { 49 this.countdownInterval = setInterval(() => {
50 this.setState(prevState => ({ 50 this.setState((prevState) => ({
51 countdown: prevState.countdown - this.countdownIntervalTimeout, 51 countdown: prevState.countdown - this.countdownIntervalTimeout,
52 })); 52 }));
53 53
diff --git a/src/components/services/tabs/TabBarSortableList.js b/src/components/services/tabs/TabBarSortableList.js
index 489027d57..1a389991d 100644
--- a/src/components/services/tabs/TabBarSortableList.js
+++ b/src/components/services/tabs/TabBarSortableList.js
@@ -14,9 +14,12 @@ class TabBarSortableList extends Component {
14 reload: PropTypes.func.isRequired, 14 reload: PropTypes.func.isRequired,
15 toggleNotifications: PropTypes.func.isRequired, 15 toggleNotifications: PropTypes.func.isRequired,
16 toggleAudio: PropTypes.func.isRequired, 16 toggleAudio: PropTypes.func.isRequired,
17 toggleDarkMode: PropTypes.func.isRequired,
17 deleteService: PropTypes.func.isRequired, 18 deleteService: PropTypes.func.isRequired,
18 disableService: PropTypes.func.isRequired, 19 disableService: PropTypes.func.isRequired,
19 enableService: PropTypes.func.isRequired, 20 enableService: PropTypes.func.isRequired,
21 hibernateService: PropTypes.func.isRequired,
22 wakeUpService: PropTypes.func.isRequired,
20 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, 23 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
21 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, 24 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
22 } 25 }
@@ -28,9 +31,12 @@ class TabBarSortableList extends Component {
28 reload, 31 reload,
29 toggleNotifications, 32 toggleNotifications,
30 toggleAudio, 33 toggleAudio,
34 toggleDarkMode,
31 deleteService, 35 deleteService,
32 disableService, 36 disableService,
33 enableService, 37 enableService,
38 hibernateService,
39 wakeUpService,
34 openSettings, 40 openSettings,
35 showMessageBadgeWhenMutedSetting, 41 showMessageBadgeWhenMutedSetting,
36 showMessageBadgesEvenWhenMuted, 42 showMessageBadgesEvenWhenMuted,
@@ -50,23 +56,17 @@ class TabBarSortableList extends Component {
50 reload={() => reload({ serviceId: service.id })} 56 reload={() => reload({ serviceId: service.id })}
51 toggleNotifications={() => toggleNotifications({ serviceId: service.id })} 57 toggleNotifications={() => toggleNotifications({ serviceId: service.id })}
52 toggleAudio={() => toggleAudio({ serviceId: service.id })} 58 toggleAudio={() => toggleAudio({ serviceId: service.id })}
59 toggleDarkMode={() => toggleDarkMode({ serviceId: service.id })}
53 deleteService={() => deleteService({ serviceId: service.id })} 60 deleteService={() => deleteService({ serviceId: service.id })}
54 disableService={() => disableService({ serviceId: service.id })} 61 disableService={() => disableService({ serviceId: service.id })}
55 enableService={() => enableService({ serviceId: service.id })} 62 enableService={() => enableService({ serviceId: service.id })}
63 hibernateService={() => hibernateService({ serviceId: service.id })}
64 wakeUpService={() => wakeUpService({ serviceId: service.id })}
56 openSettings={openSettings} 65 openSettings={openSettings}
57 showMessageBadgeWhenMutedSetting={showMessageBadgeWhenMutedSetting} 66 showMessageBadgeWhenMutedSetting={showMessageBadgeWhenMutedSetting}
58 showMessageBadgesEvenWhenMuted={showMessageBadgesEvenWhenMuted} 67 showMessageBadgesEvenWhenMuted={showMessageBadgesEvenWhenMuted}
59 /> 68 />
60 ))} 69 ))}
61 {/* <li>
62 <button
63 className="sidebar__add-service"
64 onClick={() => openSettings({ path: 'recipes' })}
65 data-tip={`${intl.formatMessage(messages.addNewService)} (${ctrlKey}+N)`}
66 >
67 <span className="mdi mdi-plus" />
68 </button>
69 </li> */}
70 </ul> 70 </ul>
71 ); 71 );
72 } 72 }
diff --git a/src/components/services/tabs/TabItem.js b/src/components/services/tabs/TabItem.js
index 5c3149a11..6a6d2c8c5 100644
--- a/src/components/services/tabs/TabItem.js
+++ b/src/components/services/tabs/TabItem.js
@@ -1,6 +1,4 @@
1import { 1import { Menu, dialog, app, getCurrentWindow } from '@electron/remote';
2 Menu, dialog, app, getCurrentWindow,
3} from '@electron/remote';
4import React, { Component } from 'react'; 2import React, { Component } from 'react';
5import { defineMessages, intlShape } from 'react-intl'; 3import { defineMessages, intlShape } from 'react-intl';
6import PropTypes from 'prop-types'; 4import PropTypes from 'prop-types';
@@ -12,9 +10,11 @@ import ms from 'ms';
12 10
13import { observable, autorun } from 'mobx'; 11import { observable, autorun } from 'mobx';
14import ServiceModel from '../../../models/Service'; 12import ServiceModel from '../../../models/Service';
15import { ctrlKey, cmdKey } from '../../../environment'; 13import { shortcutKey } from '../../../environment';
16 14
17const IS_SERVICE_DEBUGGING_ENABLED = (localStorage.getItem('debug') || '').includes('Ferdi:Service'); 15const IS_SERVICE_DEBUGGING_ENABLED = (
16 localStorage.getItem('debug') || ''
17).includes('Ferdi:Service');
18 18
19const messages = defineMessages({ 19const messages = defineMessages({
20 reload: { 20 reload: {
@@ -41,6 +41,14 @@ const messages = defineMessages({
41 id: 'tabs.item.enableAudio', 41 id: 'tabs.item.enableAudio',
42 defaultMessage: '!!!Enable audio', 42 defaultMessage: '!!!Enable audio',
43 }, 43 },
44 enableDarkMode: {
45 id: 'tabs.item.enableDarkMode',
46 defaultMessage: '!!!Enable Dark mode',
47 },
48 disableDarkMode: {
49 id: 'tabs.item.disableDarkMode',
50 defaultMessage: '!!!Disable Dark mode',
51 },
44 disableService: { 52 disableService: {
45 id: 'tabs.item.disableService', 53 id: 'tabs.item.disableService',
46 defaultMessage: '!!!Disable Service', 54 defaultMessage: '!!!Disable Service',
@@ -49,16 +57,35 @@ const messages = defineMessages({
49 id: 'tabs.item.enableService', 57 id: 'tabs.item.enableService',
50 defaultMessage: '!!!Enable Service', 58 defaultMessage: '!!!Enable Service',
51 }, 59 },
60 hibernateService: {
61 id: 'tabs.item.hibernateService',
62 defaultMessage: '!!!Hibernate Service',
63 },
64 wakeUpService: {
65 id: 'tabs.item.wakeUpService',
66 defaultMessage: '!!!Wake Up Service',
67 },
52 deleteService: { 68 deleteService: {
53 id: 'tabs.item.deleteService', 69 id: 'tabs.item.deleteService',
54 defaultMessage: '!!!Delete Service', 70 defaultMessage: '!!!Delete Service',
55 }, 71 },
56 confirmDeleteService: { 72 confirmDeleteService: {
57 id: 'tabs.item.confirmDeleteService', 73 id: 'tabs.item.confirmDeleteService',
58 defaultMessage: '!!!Do you really want to delete the {serviceName} service?', 74 defaultMessage:
75 '!!!Do you really want to delete the {serviceName} service?',
59 }, 76 },
60}); 77});
61 78
79let pollIndicatorTransition = 'none';
80let polledTransition = 'none';
81let pollAnsweredTransition = 'none';
82
83if (window && window.matchMedia('(prefers-reduced-motion: no-preference)')) {
84 pollIndicatorTransition = 'background 0.5s';
85 polledTransition = 'background 0.1s';
86 pollAnsweredTransition = 'background 0.1s';
87}
88
62const styles = { 89const styles = {
63 pollIndicator: { 90 pollIndicator: {
64 position: 'absolute', 91 position: 'absolute',
@@ -67,7 +94,7 @@ const styles = {
67 height: 10, 94 height: 10,
68 borderRadius: 5, 95 borderRadius: 5,
69 background: 'gray', 96 background: 'gray',
70 transition: 'background 0.5s', 97 transition: pollIndicatorTransition,
71 }, 98 },
72 pollIndicatorPoll: { 99 pollIndicatorPoll: {
73 left: 2, 100 left: 2,
@@ -77,18 +104,20 @@ const styles = {
77 }, 104 },
78 polled: { 105 polled: {
79 background: 'yellow !important', 106 background: 'yellow !important',
80 transition: 'background 0.1s', 107 transition: polledTransition,
81 }, 108 },
82 pollAnswered: { 109 pollAnswered: {
83 background: 'green !important', 110 background: 'green !important',
84 transition: 'background 0.1s', 111 transition: pollAnsweredTransition,
85 }, 112 },
86 stale: { 113 stale: {
87 background: 'red !important', 114 background: 'red !important',
88 }, 115 },
89}; 116};
90 117
91@injectSheet(styles) @observer class TabItem extends Component { 118@injectSheet(styles)
119@observer
120class TabItem extends Component {
92 static propTypes = { 121 static propTypes = {
93 classes: PropTypes.object.isRequired, 122 classes: PropTypes.object.isRequired,
94 service: PropTypes.instanceOf(ServiceModel).isRequired, 123 service: PropTypes.instanceOf(ServiceModel).isRequired,
@@ -97,10 +126,13 @@ const styles = {
97 reload: PropTypes.func.isRequired, 126 reload: PropTypes.func.isRequired,
98 toggleNotifications: PropTypes.func.isRequired, 127 toggleNotifications: PropTypes.func.isRequired,
99 toggleAudio: PropTypes.func.isRequired, 128 toggleAudio: PropTypes.func.isRequired,
129 toggleDarkMode: PropTypes.func.isRequired,
100 openSettings: PropTypes.func.isRequired, 130 openSettings: PropTypes.func.isRequired,
101 deleteService: PropTypes.func.isRequired, 131 deleteService: PropTypes.func.isRequired,
102 disableService: PropTypes.func.isRequired, 132 disableService: PropTypes.func.isRequired,
103 enableService: PropTypes.func.isRequired, 133 enableService: PropTypes.func.isRequired,
134 hibernateService: PropTypes.func.isRequired,
135 wakeUpService: PropTypes.func.isRequired,
104 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, 136 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
105 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, 137 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
106 }; 138 };
@@ -121,13 +153,17 @@ const styles = {
121 if (Date.now() - service.lastPoll < ms('0.2s')) { 153 if (Date.now() - service.lastPoll < ms('0.2s')) {
122 this.isPolled = true; 154 this.isPolled = true;
123 155
124 setTimeout(() => { this.isPolled = false; }, ms('1s')); 156 setTimeout(() => {
157 this.isPolled = false;
158 }, ms('1s'));
125 } 159 }
126 160
127 if (Date.now() - service.lastPollAnswer < ms('0.2s')) { 161 if (Date.now() - service.lastPollAnswer < ms('0.2s')) {
128 this.isPollAnswered = true; 162 this.isPollAnswered = true;
129 163
130 setTimeout(() => { this.isPollAnswered = false; }, ms('1s')); 164 setTimeout(() => {
165 this.isPollAnswered = false;
166 }, ms('1s'));
131 } 167 }
132 }); 168 });
133 } 169 }
@@ -142,67 +178,103 @@ const styles = {
142 reload, 178 reload,
143 toggleNotifications, 179 toggleNotifications,
144 toggleAudio, 180 toggleAudio,
181 toggleDarkMode,
145 deleteService, 182 deleteService,
146 disableService, 183 disableService,
147 enableService, 184 enableService,
185 hibernateService,
186 wakeUpService,
148 openSettings, 187 openSettings,
149 showMessageBadgeWhenMutedSetting, 188 showMessageBadgeWhenMutedSetting,
150 showMessageBadgesEvenWhenMuted, 189 showMessageBadgesEvenWhenMuted,
151 } = this.props; 190 } = this.props;
152 const { intl } = this.context; 191 const { intl } = this.context;
153 192
154 const menuTemplate = [{ 193 const menuTemplate = [
155 label: service.name || service.recipe.name, 194 {
156 enabled: false, 195 label: service.name || service.recipe.name,
157 }, { 196 enabled: false,
158 type: 'separator', 197 },
159 }, { 198 {
160 label: intl.formatMessage(messages.reload), 199 type: 'separator',
161 click: reload, 200 },
162 accelerator: `${cmdKey}+R`, 201 {
163 }, { 202 label: intl.formatMessage(messages.reload),
164 label: intl.formatMessage(messages.edit), 203 click: reload,
165 click: () => openSettings({ 204 accelerator: `${shortcutKey()}+R`,
166 path: `services/edit/${service.id}`, 205 },
167 }), 206 {
168 }, { 207 label: intl.formatMessage(messages.edit),
169 type: 'separator', 208 click: () =>
170 }, { 209 openSettings({
171 label: service.isNotificationEnabled 210 path: `services/edit/${service.id}`,
172 ? intl.formatMessage(messages.disableNotifications) 211 }),
173 : intl.formatMessage(messages.enableNotifications),
174 click: () => toggleNotifications(),
175 }, {
176 label: service.isMuted
177 ? intl.formatMessage(messages.enableAudio)
178 : intl.formatMessage(messages.disableAudio),
179 click: () => toggleAudio(),
180 }, {
181 label: intl.formatMessage(service.isEnabled ? messages.disableService : messages.enableService),
182 click: () => (service.isEnabled ? disableService() : enableService()),
183 }, {
184 type: 'separator',
185 }, {
186 label: intl.formatMessage(messages.deleteService),
187 click: () => {
188 const selection = dialog.showMessageBoxSync(app.mainWindow, {
189 type: 'question',
190 message: intl.formatMessage(messages.deleteService),
191 detail: intl.formatMessage(messages.confirmDeleteService, { serviceName: service.name || service.recipe.name }),
192 buttons: [
193 'Yes',
194 'No',
195 ],
196 });
197 if (selection === 0) {
198 deleteService();
199 }
200 }, 212 },
201 }]; 213 {
214 type: 'separator',
215 },
216 {
217 label: service.isNotificationEnabled
218 ? intl.formatMessage(messages.disableNotifications)
219 : intl.formatMessage(messages.enableNotifications),
220 click: () => toggleNotifications(),
221 },
222 {
223 label: service.isMuted
224 ? intl.formatMessage(messages.enableAudio)
225 : intl.formatMessage(messages.disableAudio),
226 click: () => toggleAudio(),
227 },
228 {
229 label: service.isDarkModeEnabled
230 ? intl.formatMessage(messages.enableDarkMode)
231 : intl.formatMessage(messages.disableDarkMode),
232 click: () => toggleDarkMode(),
233 },
234 {
235 label: intl.formatMessage(
236 service.isEnabled ? messages.disableService : messages.enableService,
237 ),
238 click: () => (service.isEnabled ? disableService() : enableService()),
239 },
240 {
241 label: intl.formatMessage(
242 service.isHibernating
243 ? messages.wakeUpService
244 : messages.hibernateService,
245 ),
246 click: () =>
247 (service.isHibernating ? wakeUpService() : hibernateService()),
248 enabled: service.canHibernate,
249 },
250 {
251 type: 'separator',
252 },
253 {
254 label: intl.formatMessage(messages.deleteService),
255 click: () => {
256 const selection = dialog.showMessageBoxSync(app.mainWindow, {
257 type: 'question',
258 message: intl.formatMessage(messages.deleteService),
259 detail: intl.formatMessage(messages.confirmDeleteService, {
260 serviceName: service.name || service.recipe.name,
261 }),
262 buttons: ['Yes', 'No'],
263 });
264 if (selection === 0) {
265 deleteService();
266 }
267 },
268 },
269 ];
202 const menu = Menu.buildFromTemplate(menuTemplate); 270 const menu = Menu.buildFromTemplate(menuTemplate);
203 271
204 let notificationBadge = null; 272 let notificationBadge = null;
205 if ((showMessageBadgeWhenMutedSetting || service.isNotificationEnabled) && showMessageBadgesEvenWhenMuted && service.isBadgeEnabled) { 273 if (
274 (showMessageBadgeWhenMutedSetting || service.isNotificationEnabled) &&
275 showMessageBadgesEvenWhenMuted &&
276 service.isBadgeEnabled
277 ) {
206 notificationBadge = ( 278 notificationBadge = (
207 <span> 279 <span>
208 {service.unreadDirectMessageCount > 0 && ( 280 {service.unreadDirectMessageCount > 0 && (
@@ -210,17 +282,13 @@ const styles = {
210 {service.unreadDirectMessageCount} 282 {service.unreadDirectMessageCount}
211 </span> 283 </span>
212 )} 284 )}
213 {service.unreadIndirectMessageCount > 0 285 {service.unreadIndirectMessageCount > 0 &&
214 && service.unreadDirectMessageCount === 0 286 service.unreadDirectMessageCount === 0 &&
215 && service.isIndirectMessageBadgeEnabled && ( 287 service.isIndirectMessageBadgeEnabled && (
216 <span className="tab-item__message-count is-indirect"> 288 <span className="tab-item__message-count is-indirect">•</span>
217
218 </span>
219 )} 289 )}
220 {service.isHibernating && !service.isHibernationEnabled && ( 290 {service.isHibernating && (
221 <span className="tab-item__message-count hibernating"> 291 <span className="tab-item__message-count hibernating">•</span>
222
223 </span>
224 )} 292 )}
225 </span> 293 </span>
226 ); 294 );
@@ -229,7 +297,8 @@ const styles = {
229 return ( 297 return (
230 <li 298 <li
231 className={classnames({ 299 className={classnames({
232 [classes.stale]: IS_SERVICE_DEBUGGING_ENABLED && service.lostRecipeConnection, 300 [classes.stale]:
301 IS_SERVICE_DEBUGGING_ENABLED && service.lostRecipeConnection,
233 'tab-item': true, 302 'tab-item': true,
234 'is-active': service.isActive, 303 'is-active': service.isActive,
235 'has-custom-icon': service.hasCustomIcon, 304 'has-custom-icon': service.hasCustomIcon,
@@ -237,13 +306,11 @@ const styles = {
237 })} 306 })}
238 onClick={clickHandler} 307 onClick={clickHandler}
239 onContextMenu={() => menu.popup(getCurrentWindow())} 308 onContextMenu={() => menu.popup(getCurrentWindow())}
240 data-tip={`${service.name} ${shortcutIndex <= 9 ? `(${ctrlKey}+${shortcutIndex})` : ''}`} 309 data-tip={`${service.name} ${
310 shortcutIndex <= 9 ? `(${shortcutKey(false)}+${shortcutIndex})` : ''
311 }`}
241 > 312 >
242 <img 313 <img src={service.icon} className="tab-item__icon" alt="" />
243 src={service.icon}
244 className="tab-item__icon"
245 alt=""
246 />
247 {notificationBadge} 314 {notificationBadge}
248 {IS_SERVICE_DEBUGGING_ENABLED && ( 315 {IS_SERVICE_DEBUGGING_ENABLED && (
249 <> 316 <>
diff --git a/src/components/services/tabs/Tabbar.js b/src/components/services/tabs/Tabbar.js
index 5e8260ad0..ab1e46c9f 100644
--- a/src/components/services/tabs/Tabbar.js
+++ b/src/components/services/tabs/Tabbar.js
@@ -15,8 +15,11 @@ export default @observer class TabBar extends Component {
15 reload: PropTypes.func.isRequired, 15 reload: PropTypes.func.isRequired,
16 toggleNotifications: PropTypes.func.isRequired, 16 toggleNotifications: PropTypes.func.isRequired,
17 toggleAudio: PropTypes.func.isRequired, 17 toggleAudio: PropTypes.func.isRequired,
18 toggleDarkMode: PropTypes.func.isRequired,
18 deleteService: PropTypes.func.isRequired, 19 deleteService: PropTypes.func.isRequired,
19 updateService: PropTypes.func.isRequired, 20 updateService: PropTypes.func.isRequired,
21 hibernateService: PropTypes.func.isRequired,
22 wakeUpService: PropTypes.func.isRequired,
20 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, 23 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
21 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, 24 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
22 }; 25 };
@@ -31,7 +34,7 @@ export default @observer class TabBar extends Component {
31 reorder({ oldIndex, newIndex }); 34 reorder({ oldIndex, newIndex });
32 }; 35 };
33 36
34 shouldPreventSorting = event => event.target.tagName !== 'LI'; 37 shouldPreventSorting = (event) => event.target.tagName !== 'LI';
35 38
36 toggleService = ({ serviceId, isEnabled }) => { 39 toggleService = ({ serviceId, isEnabled }) => {
37 const { updateService } = this.props; 40 const { updateService } = this.props;
@@ -55,6 +58,18 @@ export default @observer class TabBar extends Component {
55 this.toggleService({ serviceId, isEnabled: true }); 58 this.toggleService({ serviceId, isEnabled: true });
56 } 59 }
57 60
61 hibernateService({ serviceId }) {
62 if (serviceId) {
63 this.props.hibernateService({ serviceId });
64 }
65 }
66
67 wakeUpService({ serviceId }) {
68 if (serviceId) {
69 this.props.wakeUpService({ serviceId });
70 }
71 }
72
58 render() { 73 render() {
59 const { 74 const {
60 services, 75 services,
@@ -64,6 +79,7 @@ export default @observer class TabBar extends Component {
64 reload, 79 reload,
65 toggleNotifications, 80 toggleNotifications,
66 toggleAudio, 81 toggleAudio,
82 toggleDarkMode,
67 deleteService, 83 deleteService,
68 showMessageBadgeWhenMutedSetting, 84 showMessageBadgeWhenMutedSetting,
69 showMessageBadgesEvenWhenMuted, 85 showMessageBadgesEvenWhenMuted,
@@ -80,9 +96,12 @@ export default @observer class TabBar extends Component {
80 reload={reload} 96 reload={reload}
81 toggleNotifications={toggleNotifications} 97 toggleNotifications={toggleNotifications}
82 toggleAudio={toggleAudio} 98 toggleAudio={toggleAudio}
99 toggleDarkMode={toggleDarkMode}
83 deleteService={deleteService} 100 deleteService={deleteService}
84 disableService={args => this.disableService(args)} 101 disableService={(args) => this.disableService(args)}
85 enableService={args => this.enableService(args)} 102 enableService={(args) => this.enableService(args)}
103 hibernateService={(args) => this.hibernateService(args)}
104 wakeUpService={(args) => this.wakeUpService(args)}
86 openSettings={openSettings} 105 openSettings={openSettings}
87 distance={20} 106 distance={20}
88 axis="y" 107 axis="y"
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js
index 68d88e218..ef7748343 100644
--- a/src/components/settings/account/AccountDashboard.js
+++ b/src/components/settings/account/AccountDashboard.js
@@ -3,14 +3,11 @@ import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import ReactTooltip from 'react-tooltip'; 5import ReactTooltip from 'react-tooltip';
6import { ProBadge, H1, H2 } from '@meetfranz/ui'; 6import { H1, H2 } from '@meetfranz/ui';
7import moment from 'moment';
8 7
9import Loader from '../../ui/Loader'; 8import Loader from '../../ui/Loader';
10import Button from '../../ui/Button'; 9import Button from '../../ui/Button';
11import Infobox from '../../ui/Infobox'; 10import Infobox from '../../ui/Infobox';
12import SubscriptionForm from '../../../containers/subscription/SubscriptionFormScreen';
13import { i18nPlanName } from '../../../helpers/plan-helpers';
14import { LOCAL_SERVER, LIVE_FRANZ_API } from '../../../config'; 11import { LOCAL_SERVER, LIVE_FRANZ_API } from '../../../config';
15 12
16const messages = defineMessages({ 13const messages = defineMessages({
@@ -18,30 +15,10 @@ const messages = defineMessages({
18 id: 'settings.account.headline', 15 id: 'settings.account.headline',
19 defaultMessage: '!!!Account', 16 defaultMessage: '!!!Account',
20 }, 17 },
21 headlineSubscription: {
22 id: 'settings.account.headlineSubscription',
23 defaultMessage: '!!!Your Subscription',
24 },
25 headlineDangerZone: { 18 headlineDangerZone: {
26 id: 'settings.account.headlineDangerZone', 19 id: 'settings.account.headlineDangerZone',
27 defaultMessage: '!!Danger Zone', 20 defaultMessage: '!!Danger Zone',
28 }, 21 },
29 manageSubscriptionButtonLabel: {
30 id: 'settings.account.manageSubscription.label',
31 defaultMessage: '!!!Manage your subscription',
32 },
33 upgradeAccountToPro: {
34 id: 'settings.account.upgradeToPro.label',
35 defaultMessage: '!!!Upgrade to Franz Professional',
36 },
37 accountTypeBasic: {
38 id: 'settings.account.accountType.basic',
39 defaultMessage: '!!!Basic Account',
40 },
41 accountTypePremium: {
42 id: 'settings.account.accountType.premium',
43 defaultMessage: '!!!Premium Supporter Account',
44 },
45 accountEditButton: { 22 accountEditButton: {
46 id: 'settings.account.account.editButton', 23 id: 'settings.account.account.editButton',
47 defaultMessage: '!!!Edit Account', 24 defaultMessage: '!!!Edit Account',
@@ -50,10 +27,6 @@ const messages = defineMessages({
50 id: 'settings.account.headlineInvoices', 27 id: 'settings.account.headlineInvoices',
51 defaultMessage: '!!Invoices', 28 defaultMessage: '!!Invoices',
52 }, 29 },
53 invoiceDownload: {
54 id: 'settings.account.invoiceDownload',
55 defaultMessage: '!!!Download',
56 },
57 userInfoRequestFailed: { 30 userInfoRequestFailed: {
58 id: 'settings.account.userInfoRequestFailed', 31 id: 'settings.account.userInfoRequestFailed',
59 defaultMessage: '!!!Could not load user information', 32 defaultMessage: '!!!Could not load user information',
@@ -76,23 +49,10 @@ const messages = defineMessages({
76 defaultMessage: 49 defaultMessage:
77 '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!', 50 '!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!',
78 }, 51 },
79 trial: {
80 id: 'settings.account.trial',
81 defaultMessage: '!!!Free Trial',
82 },
83 yourLicense: { 52 yourLicense: {
84 id: 'settings.account.yourLicense', 53 id: 'settings.account.yourLicense',
85 defaultMessage: '!!!Your Franz License:', 54 defaultMessage: '!!!Your Franz License:',
86 }, 55 },
87 trialEndsIn: {
88 id: 'settings.account.trialEndsIn',
89 defaultMessage: '!!!Your free trial ends in {duration}.',
90 },
91 trialUpdateBillingInformation: {
92 id: 'settings.account.trialUpdateBillingInfo',
93 defaultMessage:
94 '!!!Please update your billing info to continue using {license} after your trial period.',
95 },
96 accountUnavailable: { 56 accountUnavailable: {
97 id: 'settings.account.accountUnavailable', 57 id: 'settings.account.accountUnavailable',
98 defaultMessage: 'Account is unavailable', 58 defaultMessage: 'Account is unavailable',
@@ -107,8 +67,6 @@ const messages = defineMessages({
107class AccountDashboard extends Component { 67class AccountDashboard extends Component {
108 static propTypes = { 68 static propTypes = {
109 user: MobxPropTypes.observableObject.isRequired, 69 user: MobxPropTypes.observableObject.isRequired,
110 isPremiumOverrideUser: PropTypes.bool.isRequired,
111 isProUser: PropTypes.bool.isRequired,
112 isLoading: PropTypes.bool.isRequired, 70 isLoading: PropTypes.bool.isRequired,
113 userInfoRequestFailed: PropTypes.bool.isRequired, 71 userInfoRequestFailed: PropTypes.bool.isRequired,
114 retryUserInfoRequest: PropTypes.func.isRequired, 72 retryUserInfoRequest: PropTypes.func.isRequired,
@@ -116,10 +74,7 @@ class AccountDashboard extends Component {
116 isLoadingDeleteAccount: PropTypes.bool.isRequired, 74 isLoadingDeleteAccount: PropTypes.bool.isRequired,
117 isDeleteAccountSuccessful: PropTypes.bool.isRequired, 75 isDeleteAccountSuccessful: PropTypes.bool.isRequired,
118 openEditAccount: PropTypes.func.isRequired, 76 openEditAccount: PropTypes.func.isRequired,
119 openBilling: PropTypes.func.isRequired,
120 upgradeToPro: PropTypes.func.isRequired,
121 openInvoices: PropTypes.func.isRequired, 77 openInvoices: PropTypes.func.isRequired,
122 onCloseSubscriptionWindow: PropTypes.func.isRequired,
123 server: PropTypes.string.isRequired, 78 server: PropTypes.string.isRequired,
124 }; 79 };
125 80
@@ -130,8 +85,6 @@ class AccountDashboard extends Component {
130 render() { 85 render() {
131 const { 86 const {
132 user, 87 user,
133 isPremiumOverrideUser,
134 isProUser,
135 isLoading, 88 isLoading,
136 userInfoRequestFailed, 89 userInfoRequestFailed,
137 retryUserInfoRequest, 90 retryUserInfoRequest,
@@ -139,20 +92,11 @@ class AccountDashboard extends Component {
139 isLoadingDeleteAccount, 92 isLoadingDeleteAccount,
140 isDeleteAccountSuccessful, 93 isDeleteAccountSuccessful,
141 openEditAccount, 94 openEditAccount,
142 openBilling,
143 upgradeToPro,
144 openInvoices, 95 openInvoices,
145 onCloseSubscriptionWindow,
146 server, 96 server,
147 } = this.props; 97 } = this.props;
148 const { intl } = this.context; 98 const { intl } = this.context;
149 99
150 let planName = '';
151
152 if (user.team && user.team.plan) {
153 planName = i18nPlanName(user.team.plan, intl);
154 }
155
156 const isUsingWithoutAccount = server === LOCAL_SERVER; 100 const isUsingWithoutAccount = server === LOCAL_SERVER;
157 const isUsingFranzServer = server === LIVE_FRANZ_API; 101 const isUsingFranzServer = server === LIVE_FRANZ_API;
158 102
@@ -210,98 +154,40 @@ class AccountDashboard extends Component {
210 <div className="account__info"> 154 <div className="account__info">
211 <H1> 155 <H1>
212 <span className="username">{`${user.firstname} ${user.lastname}`}</span> 156 <span className="username">{`${user.firstname} ${user.lastname}`}</span>
213 {user.isPremium && (
214 <>
215 {' '}
216 <ProBadge />
217 </>
218 )}
219 </H1> 157 </H1>
220 <p> 158 <p>
221 {user.organization && `${user.organization}, `} 159 {user.organization && `${user.organization}, `}
222 {user.email} 160 {user.email}
223 </p> 161 </p>
224 {user.isPremium && ( 162 <div className="manage-user-links">
225 <div className="manage-user-links"> 163 <Button
226 <Button 164 label={intl.formatMessage(
227 label={intl.formatMessage( 165 messages.accountEditButton,
228 messages.accountEditButton, 166 )}
229 )} 167 className="franz-form__button--inverted"
230 className="franz-form__button--inverted" 168 onClick={openEditAccount}
231 onClick={openEditAccount} 169 />
232 /> 170 </div>
233 </div>
234 )}
235 </div> 171 </div>
236 {!user.isPremium && ( 172 <Button
237 <Button 173 label={intl.formatMessage(
238 label={intl.formatMessage( 174 messages.accountEditButton,
239 messages.accountEditButton, 175 )}
240 )} 176 className="franz-form__button--inverted"
241 className="franz-form__button--inverted" 177 onClick={openEditAccount}
242 onClick={openEditAccount} 178 />
243 />
244 )}
245 </div> 179 </div>
246 </div> 180 </div>
247 {user.isPremium && user.isSubscriptionOwner && isUsingFranzServer && ( 181 {user.isSubscriptionOwner && isUsingFranzServer && (
248 <div className="account"> 182 <div className="account">
249 <div className="account__box"> 183 <div className="account__box">
250 <H2>{intl.formatMessage(messages.yourLicense)}</H2> 184 <H2>{intl.formatMessage(messages.yourLicense)}</H2>
251 <p> 185 <p>
252 Franz 186 Franz
253 {' '}
254 {isPremiumOverrideUser ? 'Premium' : planName}
255 {user.team.isTrial && (
256 <>
257 {' – '}
258 {intl.formatMessage(messages.trial)}
259 </>
260 )}
261 </p> 187 </p>
262 {user.team.isTrial && (
263 <>
264 <br />
265 <p>
266 {intl.formatMessage(messages.trialEndsIn, {
267 duration: moment
268 .duration(
269 moment().diff(user.team.trialEnd),
270 )
271 .humanize(),
272 })}
273 </p>
274 <p>
275 {intl.formatMessage(
276 messages.trialUpdateBillingInformation,
277 {
278 license: planName,
279 },
280 )}
281 </p>
282 </>
283 )}
284 {!isProUser && (
285 <div className="manage-user-links">
286 <Button
287 label={intl.formatMessage(
288 messages.upgradeAccountToPro,
289 )}
290 className="franz-form__button--primary"
291 onClick={upgradeToPro}
292 />
293 </div>
294 )}
295 <div className="manage-user-links"> 188 <div className="manage-user-links">
296 <Button 189 <Button
297 label={intl.formatMessage( 190 label={intl.formatMessage(
298 messages.manageSubscriptionButtonLabel,
299 )}
300 className="franz-form__button--inverted"
301 onClick={openBilling}
302 />
303 <Button
304 label={intl.formatMessage(
305 messages.invoicesButton, 191 messages.invoicesButton,
306 )} 192 )}
307 className="franz-form__button--inverted" 193 className="franz-form__button--inverted"
@@ -311,15 +197,6 @@ class AccountDashboard extends Component {
311 </div> 197 </div>
312 </div> 198 </div>
313 )} 199 )}
314 {!user.isPremium && (
315 <div className="account franz-form">
316 <div className="account__box">
317 <SubscriptionForm
318 onCloseWindow={onCloseSubscriptionWindow}
319 />
320 </div>
321 </div>
322 )}
323 </> 200 </>
324 )} 201 )}
325 202
diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js
index cebab2f12..02cae6b69 100644
--- a/src/components/settings/navigation/SettingsNavigation.js
+++ b/src/components/settings/navigation/SettingsNavigation.js
@@ -2,7 +2,6 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl'; 3import { defineMessages, intlShape } from 'react-intl';
4import { inject, observer } from 'mobx-react'; 4import { inject, observer } from 'mobx-react';
5import { ProBadge } from '@meetfranz/ui';
6import { RouterStore } from 'mobx-react-router'; 5import { RouterStore } from 'mobx-react-router';
7 6
8import { LOCAL_SERVER, LIVE_FERDI_API, LIVE_FRANZ_API } from '../../../config'; 7import { LOCAL_SERVER, LIVE_FERDI_API, LIVE_FRANZ_API } from '../../../config';
@@ -11,7 +10,6 @@ import { workspaceStore } from '../../../features/workspaces';
11import UIStore from '../../../stores/UIStore'; 10import UIStore from '../../../stores/UIStore';
12import SettingsStore from '../../../stores/SettingsStore'; 11import SettingsStore from '../../../stores/SettingsStore';
13import UserStore from '../../../stores/UserStore'; 12import UserStore from '../../../stores/UserStore';
14import { serviceLimitStore } from '../../../features/serviceLimit';
15 13
16const messages = defineMessages({ 14const messages = defineMessages({
17 availableServices: { 15 availableServices: {
@@ -98,8 +96,6 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e
98 96
99 render() { 97 render() {
100 const { serviceCount, workspaceCount, stores } = this.props; 98 const { serviceCount, workspaceCount, stores } = this.props;
101 const { isDarkThemeActive } = stores.ui;
102 const { router, user } = stores;
103 const { intl } = this.context; 99 const { intl } = this.context;
104 const isLoggedIn = Boolean(localStorage.getItem('authToken')); 100 const isLoggedIn = Boolean(localStorage.getItem('authToken'));
105 const isUsingWithoutAccount = stores.settings.app.server === LOCAL_SERVER; 101 const isUsingWithoutAccount = stores.settings.app.server === LOCAL_SERVER;
@@ -124,9 +120,6 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e
124 {' '} 120 {' '}
125 <span className="badge"> 121 <span className="badge">
126 {serviceCount} 122 {serviceCount}
127 {serviceLimitStore.serviceLimit !== 0 && (
128 `/${serviceLimitStore.serviceLimit}`
129 )}
130 </span> 123 </span>
131 </Link> 124 </Link>
132 {workspaceStore.isFeatureEnabled ? ( 125 {workspaceStore.isFeatureEnabled ? (
@@ -138,11 +131,7 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e
138 > 131 >
139 {intl.formatMessage(messages.yourWorkspaces)} 132 {intl.formatMessage(messages.yourWorkspaces)}
140 {' '} 133 {' '}
141 {workspaceStore.isPremiumUpgradeRequired ? ( 134 <span className="badge">{workspaceCount}</span>
142 <ProBadge inverted={!isDarkThemeActive && workspaceStore.isSettingsRouteActive} />
143 ) : (
144 <span className="badge">{workspaceCount}</span>
145 )}
146 </Link> 135 </Link>
147 ) : null} 136 ) : null}
148 {!isUsingWithoutAccount && ( 137 {!isUsingWithoutAccount && (
@@ -163,9 +152,6 @@ export default @inject('stores', 'actions') @observer class SettingsNavigation e
163 disabled={!isLoggedIn} 152 disabled={!isLoggedIn}
164 > 153 >
165 {intl.formatMessage(messages.team)} 154 {intl.formatMessage(messages.team)}
166 {!user.data.isPremium && (
167 <ProBadge inverted={!isDarkThemeActive && router.location.pathname === '/settings/team'} />
168 )}
169 </Link> 155 </Link>
170 )} 156 )}
171 <Link 157 <Link
diff --git a/src/components/settings/recipes/RecipeItem.js b/src/components/settings/recipes/RecipeItem.js
index 12e3775f6..55f415bd5 100644
--- a/src/components/settings/recipes/RecipeItem.js
+++ b/src/components/settings/recipes/RecipeItem.js
@@ -28,6 +28,11 @@ export default @observer class RecipeItem extends Component {
28 alt="" 28 alt=""
29 /> 29 />
30 <span className="recipe-teaser__label">{recipe.name}</span> 30 <span className="recipe-teaser__label">{recipe.name}</span>
31 {recipe.aliases && recipe.aliases.length > 0 && (
32 <span className="recipe-teaser__alias_label">
33 {`Aliases: ${recipe.aliases.join(', ')}`}
34 </span>
35 )}
31 </button> 36 </button>
32 ); 37 );
33 } 38 }
diff --git a/src/components/settings/recipes/RecipesDashboard.js b/src/components/settings/recipes/RecipesDashboard.js
index b4e2fc05c..44ff2d0d7 100644
--- a/src/components/settings/recipes/RecipesDashboard.js
+++ b/src/components/settings/recipes/RecipesDashboard.js
@@ -6,15 +6,13 @@ import { Link } from 'react-router';
6 6
7import { Button, Input } from '@meetfranz/forms'; 7import { Button, Input } from '@meetfranz/forms';
8import injectSheet from 'react-jss'; 8import injectSheet from 'react-jss';
9import { H3, H2, ProBadge } from '@meetfranz/ui'; 9import { H3, H2 } from '@meetfranz/ui';
10import SearchInput from '../../ui/SearchInput'; 10import SearchInput from '../../ui/SearchInput';
11import Infobox from '../../ui/Infobox'; 11import Infobox from '../../ui/Infobox';
12import RecipeItem from './RecipeItem'; 12import RecipeItem from './RecipeItem';
13import Loader from '../../ui/Loader'; 13import Loader from '../../ui/Loader';
14import Appear from '../../ui/effects/Appear'; 14import Appear from '../../ui/effects/Appear';
15import { FRANZ_SERVICE_REQUEST } from '../../../config'; 15import { FRANZ_SERVICE_REQUEST } from '../../../config';
16import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
17import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
18import RecipePreview from '../../../models/RecipePreview'; 16import RecipePreview from '../../../models/RecipePreview';
19 17
20const messages = defineMessages({ 18const messages = defineMessages({
@@ -26,10 +24,6 @@ const messages = defineMessages({
26 id: 'settings.searchService', 24 id: 'settings.searchService',
27 defaultMessage: '!!!Search service', 25 defaultMessage: '!!!Search service',
28 }, 26 },
29 mostPopularRecipes: {
30 id: 'settings.recipes.mostPopular',
31 defaultMessage: '!!!Most popular',
32 },
33 allRecipes: { 27 allRecipes: {
34 id: 'settings.recipes.all', 28 id: 'settings.recipes.all',
35 defaultMessage: '!!!All services', 29 defaultMessage: '!!!All services',
@@ -109,7 +103,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
109 recipes: MobxPropTypes.arrayOrObservableArray.isRequired, 103 recipes: MobxPropTypes.arrayOrObservableArray.isRequired,
110 customWebsiteRecipe: PropTypes.instanceOf(RecipePreview).isRequired, 104 customWebsiteRecipe: PropTypes.instanceOf(RecipePreview).isRequired,
111 isLoading: PropTypes.bool.isRequired, 105 isLoading: PropTypes.bool.isRequired,
112 hasLoadedRecipes: PropTypes.bool.isRequired,
113 showAddServiceInterface: PropTypes.func.isRequired, 106 showAddServiceInterface: PropTypes.func.isRequired,
114 searchRecipes: PropTypes.func.isRequired, 107 searchRecipes: PropTypes.func.isRequired,
115 resetSearch: PropTypes.func.isRequired, 108 resetSearch: PropTypes.func.isRequired,
@@ -120,7 +113,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
120 openRecipeDirectory: PropTypes.func.isRequired, 113 openRecipeDirectory: PropTypes.func.isRequired,
121 openDevDocs: PropTypes.func.isRequired, 114 openDevDocs: PropTypes.func.isRequired,
122 classes: PropTypes.object.isRequired, 115 classes: PropTypes.object.isRequired,
123 isCommunityRecipesIncludedInCurrentPlan: PropTypes.bool.isRequired,
124 }; 116 };
125 117
126 static defaultProps = { 118 static defaultProps = {
@@ -137,7 +129,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
137 recipes, 129 recipes,
138 customWebsiteRecipe, 130 customWebsiteRecipe,
139 isLoading, 131 isLoading,
140 hasLoadedRecipes,
141 showAddServiceInterface, 132 showAddServiceInterface,
142 searchRecipes, 133 searchRecipes,
143 resetSearch, 134 resetSearch,
@@ -148,11 +139,9 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
148 openRecipeDirectory, 139 openRecipeDirectory,
149 openDevDocs, 140 openDevDocs,
150 classes, 141 classes,
151 isCommunityRecipesIncludedInCurrentPlan,
152 } = this.props; 142 } = this.props;
153 const { intl } = this.context; 143 const { intl } = this.context;
154 144
155
156 const communityRecipes = recipes.filter(r => !r.isDevRecipe); 145 const communityRecipes = recipes.filter(r => !r.isDevRecipe);
157 const devRecipes = recipes.filter(r => r.isDevRecipe); 146 const devRecipes = recipes.filter(r => r.isDevRecipe);
158 147
@@ -163,7 +152,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
163 <div className="settings__header"> 152 <div className="settings__header">
164 <h1>{intl.formatMessage(messages.headline)}</h1> 153 <h1>{intl.formatMessage(messages.headline)}</h1>
165 </div> 154 </div>
166 <LimitReachedInfobox />
167 <div className="settings__body recipes"> 155 <div className="settings__body recipes">
168 {serviceStatus.length > 0 && serviceStatus.includes('created') && ( 156 {serviceStatus.length > 0 && serviceStatus.includes('created') && (
169 <Appear> 157 <Appear>
@@ -190,14 +178,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
190 activeClassName={`${!searchNeedle ? 'badge--primary' : ''}`} 178 activeClassName={`${!searchNeedle ? 'badge--primary' : ''}`}
191 onClick={() => resetSearch()} 179 onClick={() => resetSearch()}
192 > 180 >
193 {intl.formatMessage(messages.mostPopularRecipes)}
194 </Link>
195 <Link
196 to="/settings/recipes/all"
197 className="badge"
198 activeClassName={`${!searchNeedle ? 'badge--primary' : ''}`}
199 onClick={() => resetSearch()}
200 >
201 {intl.formatMessage(messages.allRecipes)} 181 {intl.formatMessage(messages.allRecipes)}
202 </Link> 182 </Link>
203 <Link 183 <Link
@@ -208,7 +188,7 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
208 > 188 >
209 {intl.formatMessage(messages.customRecipes)} 189 {intl.formatMessage(messages.customRecipes)}
210 </Link> 190 </Link>
211 <a href={FRANZ_SERVICE_REQUEST} target="_blank" className="link recipes__service-request"> 191 <a href={FRANZ_SERVICE_REQUEST} target="_blank" className="link recipes__service-request" rel="noreferrer">
212 {intl.formatMessage(messages.missingService)} 192 {intl.formatMessage(messages.missingService)}
213 {' '} 193 {' '}
214 <i className="mdi mdi-open-in-new" /> 194 <i className="mdi mdi-open-in-new" />
@@ -223,9 +203,6 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
223 <> 203 <>
224 <H2> 204 <H2>
225 {intl.formatMessage(messages.headlineCustomRecipes)} 205 {intl.formatMessage(messages.headlineCustomRecipes)}
226 {!isCommunityRecipesIncludedInCurrentPlan && (
227 <ProBadge className={classes.proBadge} />
228 )}
229 </H2> 206 </H2>
230 <div className={classes.devRecipeIntroContainer}> 207 <div className={classes.devRecipeIntroContainer}>
231 <p> 208 <p>
@@ -251,37 +228,33 @@ export default @injectSheet(styles) @observer class RecipesDashboard extends Com
251 </div> 228 </div>
252 </> 229 </>
253 )} 230 )}
254 <PremiumFeatureContainer 231 {recipeFilter === 'dev' && communityRecipes.length > 0 && (
255 condition={(recipeFilter === 'dev' && communityRecipes.length > 0) && !isCommunityRecipesIncludedInCurrentPlan} 232 <H3>{intl.formatMessage(messages.headlineCommunityRecipes)}</H3>
256 > 233 )}
257 {recipeFilter === 'dev' && communityRecipes.length > 0 && ( 234 <div className="recipes__list">
258 <H3>{intl.formatMessage(messages.headlineCommunityRecipes)}</H3> 235 {recipes.length === 0 && recipeFilter !== 'dev' && (
259 )} 236 <div className="align-middle settings__empty-state">
260 <div className="recipes__list"> 237 <span className="emoji">
261 {hasLoadedRecipes && recipes.length === 0 && recipeFilter !== 'dev' && ( 238 <img src="./assets/images/emoji/dontknow.png" alt="" />
262 <div className="align-middle settings__empty-state"> 239 </span>
263 <span className="emoji">
264 <img src="./assets/images/emoji/dontknow.png" alt="" />
265 </span>
266 240
267 <p className="settings__empty-state-text">{intl.formatMessage(messages.nothingFound)}</p> 241 <p className="settings__empty-state-text">{intl.formatMessage(messages.nothingFound)}</p>
268 242
269 <RecipeItem
270 key={customWebsiteRecipe.id}
271 recipe={customWebsiteRecipe}
272 onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: customWebsiteRecipe.id })}
273 />
274 </div>
275 )}
276 {communityRecipes.map(recipe => (
277 <RecipeItem 243 <RecipeItem
278 key={recipe.id} 244 key={customWebsiteRecipe.id}
279 recipe={recipe} 245 recipe={customWebsiteRecipe}
280 onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: recipe.id })} 246 onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: customWebsiteRecipe.id })}
281 /> 247 />
282 ))} 248 </div>
283 </div> 249 )}
284 </PremiumFeatureContainer> 250 {communityRecipes.map(recipe => (
251 <RecipeItem
252 key={recipe.id}
253 recipe={recipe}
254 onClick={() => isLoggedIn && showAddServiceInterface({ recipeId: recipe.id })}
255 />
256 ))}
257 </div>
285 {recipeFilter === 'dev' && devRecipes.length > 0 && ( 258 {recipeFilter === 'dev' && devRecipes.length > 0 && (
286 <div className={classes.devRecipeList}> 259 <div className={classes.devRecipeList}>
287 <H3>{intl.formatMessage(messages.headlineDevRecipes)}</H3> 260 <H3>{intl.formatMessage(messages.headlineDevRecipes)}</H3>
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js
index 513c75eed..c41cdd56a 100644
--- a/src/components/settings/services/EditServiceForm.js
+++ b/src/components/settings/services/EditServiceForm.js
@@ -1,4 +1,4 @@
1import React, { Component, Fragment } from 'react'; 1import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { Link } from 'react-router'; 4import { Link } from 'react-router';
@@ -6,7 +6,6 @@ import { defineMessages, intlShape } from 'react-intl';
6import normalizeUrl from 'normalize-url'; 6import normalizeUrl from 'normalize-url';
7 7
8import Form from '../../../lib/Form'; 8import Form from '../../../lib/Form';
9import User from '../../../models/User';
10import Recipe from '../../../models/Recipe'; 9import Recipe from '../../../models/Recipe';
11import Service from '../../../models/Service'; 10import Service from '../../../models/Service';
12import Tabs, { TabItem } from '../../ui/Tabs'; 11import Tabs, { TabItem } from '../../ui/Tabs';
@@ -17,9 +16,6 @@ import Button from '../../ui/Button';
17import ImageUpload from '../../ui/ImageUpload'; 16import ImageUpload from '../../ui/ImageUpload';
18import Select from '../../ui/Select'; 17import Select from '../../ui/Select';
19 18
20import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
21import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
22import { serviceLimitStore } from '../../../features/serviceLimit';
23import { isMac } from '../../../environment'; 19import { isMac } from '../../../environment';
24import globalMessages from '../../../i18n/globalMessages'; 20import globalMessages from '../../../i18n/globalMessages';
25 21
@@ -80,14 +76,6 @@ const messages = defineMessages({
80 id: 'settings.service.form.customUrlValidationError', 76 id: 'settings.service.form.customUrlValidationError',
81 defaultMessage: '!!!Could not validate custom {name} server.', 77 defaultMessage: '!!!Could not validate custom {name} server.',
82 }, 78 },
83 customUrlPremiumInfo: {
84 id: 'settings.service.form.customUrlPremiumInfo',
85 defaultMessage: '!!!To add self hosted services, you need a Ferdi Premium Supporter Account.',
86 },
87 customUrlUpgradeAccount: {
88 id: 'settings.service.form.customUrlUpgradeAccount',
89 defaultMessage: '!!!Upgrade your account',
90 },
91 indirectMessageInfo: { 79 indirectMessageInfo: {
92 id: 'settings.service.form.indirectMessageInfo', 80 id: 'settings.service.form.indirectMessageInfo',
93 defaultMessage: '!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...', 81 defaultMessage: '!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...',
@@ -149,7 +137,6 @@ export default @observer class EditServiceForm extends Component {
149 137
150 return null; 138 return null;
151 }, 139 },
152 user: PropTypes.instanceOf(User).isRequired,
153 action: PropTypes.string.isRequired, 140 action: PropTypes.string.isRequired,
154 form: PropTypes.instanceOf(Form).isRequired, 141 form: PropTypes.instanceOf(Form).isRequired,
155 onSubmit: PropTypes.func.isRequired, 142 onSubmit: PropTypes.func.isRequired,
@@ -158,9 +145,6 @@ export default @observer class EditServiceForm extends Component {
158 isSaving: PropTypes.bool.isRequired, 145 isSaving: PropTypes.bool.isRequired,
159 isDeleting: PropTypes.bool.isRequired, 146 isDeleting: PropTypes.bool.isRequired,
160 isProxyFeatureEnabled: PropTypes.bool.isRequired, 147 isProxyFeatureEnabled: PropTypes.bool.isRequired,
161 isServiceProxyIncludedInCurrentPlan: PropTypes.bool.isRequired,
162 isSpellcheckerIncludedInCurrentPlan: PropTypes.bool.isRequired,
163 isHibernationFeatureActive: PropTypes.bool.isRequired,
164 }; 148 };
165 149
166 static defaultProps = { 150 static defaultProps = {
@@ -217,16 +201,12 @@ export default @observer class EditServiceForm extends Component {
217 recipe, 201 recipe,
218 service, 202 service,
219 action, 203 action,
220 user,
221 form, 204 form,
222 isSaving, 205 isSaving,
223 isDeleting, 206 isDeleting,
224 onDelete, 207 onDelete,
225 openRecipeFile, 208 openRecipeFile,
226 isProxyFeatureEnabled, 209 isProxyFeatureEnabled,
227 isServiceProxyIncludedInCurrentPlan,
228 isSpellcheckerIncludedInCurrentPlan,
229 isHibernationFeatureActive,
230 } = this.props; 210 } = this.props;
231 const { intl } = this.context; 211 const { intl } = this.context;
232 212
@@ -285,9 +265,8 @@ export default @observer class EditServiceForm extends Component {
285 )} 265 )}
286 </span> 266 </span>
287 </div> 267 </div>
288 <LimitReachedInfobox />
289 <div className="settings__body"> 268 <div className="settings__body">
290 <form onSubmit={e => this.submit(e)} id="form"> 269 <form onSubmit={(e) => this.submit(e)} id="form">
291 <div className="service-name"> 270 <div className="service-name">
292 <Input field={form.$('name')} focus /> 271 <Input field={form.$('name')} focus />
293 </div> 272 </div>
@@ -311,24 +290,11 @@ export default @observer class EditServiceForm extends Component {
311 )} 290 )}
312 {recipe.hasCustomUrl && ( 291 {recipe.hasCustomUrl && (
313 <TabItem title={intl.formatMessage(messages.tabOnPremise)}> 292 <TabItem title={intl.formatMessage(messages.tabOnPremise)}>
314 {user.isPremium || recipe.author.find(a => a.email === user.email) ? ( 293 <Input field={form.$('customUrl')} />
315 <> 294 {form.error === 'url-validation-error' && (
316 <Input field={form.$('customUrl')} /> 295 <p className="franz-form__error">
317 {form.error === 'url-validation-error' && ( 296 {intl.formatMessage(messages.customUrlValidationError, { name: recipe.name })}
318 <p className="franz-form__error"> 297 </p>
319 {intl.formatMessage(messages.customUrlValidationError, { name: recipe.name })}
320 </p>
321 )}
322 </>
323 ) : (
324 <div className="center premium-info">
325 <p>{intl.formatMessage(messages.customUrlPremiumInfo)}</p>
326 <p>
327 <Link to="/settings/user" className="button">
328 {intl.formatMessage(messages.customUrlUpgradeAccount)}
329 </Link>
330 </p>
331 </div>
332 )} 298 )}
333 </TabItem> 299 </TabItem>
334 )} 300 )}
@@ -373,14 +339,10 @@ export default @observer class EditServiceForm extends Component {
373 <div className="settings__settings-group"> 339 <div className="settings__settings-group">
374 <h3>{intl.formatMessage(messages.headlineGeneral)}</h3> 340 <h3>{intl.formatMessage(messages.headlineGeneral)}</h3>
375 <Toggle field={form.$('isEnabled')} /> 341 <Toggle field={form.$('isEnabled')} />
376 {isHibernationFeatureActive && ( 342 <Toggle field={form.$('isHibernationEnabled')} />
377 <> 343 <p className="settings__help indented__help">
378 <Toggle field={form.$('isHibernationEnabled')} /> 344 {intl.formatMessage(messages.isHibernationEnabledInfo)}
379 <p className="settings__help indented__help"> 345 </p>
380 {intl.formatMessage(messages.isHibernationEnabledInfo)}
381 </p>
382 </>
383 )}
384 <Toggle field={form.$('isDarkModeEnabled')} /> 346 <Toggle field={form.$('isDarkModeEnabled')} />
385 {form.$('isDarkModeEnabled').value 347 {form.$('isDarkModeEnabled').value
386 && ( 348 && (
@@ -403,56 +365,46 @@ export default @observer class EditServiceForm extends Component {
403 </div> 365 </div>
404 366
405 {!isMac && ( 367 {!isMac && (
406 <PremiumFeatureContainer 368 <div className="settings__settings-group">
407 condition={!isSpellcheckerIncludedInCurrentPlan} 369 <Select field={form.$('spellcheckerLanguage')} />
408 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }} 370 </div>
409 >
410 <div className="settings__settings-group">
411 <Select field={form.$('spellcheckerLanguage')} />
412 </div>
413 </PremiumFeatureContainer>
414 )} 371 )}
415 372
416 {isProxyFeatureEnabled && ( 373 {isProxyFeatureEnabled && (
417 <PremiumFeatureContainer 374 <div className="settings__settings-group">
418 condition={!isServiceProxyIncludedInCurrentPlan} 375 <h3>
419 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'proxy' }} 376 {intl.formatMessage(messages.headlineProxy)}
420 > 377 <span className="badge badge--success">beta</span>
421 <div className="settings__settings-group"> 378 </h3>
422 <h3> 379 <Toggle field={form.$('proxy.isEnabled')} />
423 {intl.formatMessage(messages.headlineProxy)} 380 {form.$('proxy.isEnabled').value && (
424 <span className="badge badge--success">beta</span> 381 <>
425 </h3> 382 <div className="grid">
426 <Toggle field={form.$('proxy.isEnabled')} /> 383 <div className="grid__row">
427 {form.$('proxy.isEnabled').value && ( 384 <Input field={form.$('proxy.host')} className="proxyHost" />
428 <> 385 <Input field={form.$('proxy.port')} />
429 <div className="grid">
430 <div className="grid__row">
431 <Input field={form.$('proxy.host')} className="proxyHost" />
432 <Input field={form.$('proxy.port')} />
433 </div>
434 </div> 386 </div>
435 <div className="grid"> 387 </div>
436 <div className="grid__row"> 388 <div className="grid">
437 <Input field={form.$('proxy.user')} /> 389 <div className="grid__row">
438 <Input 390 <Input field={form.$('proxy.user')} />
439 field={form.$('proxy.password')} 391 <Input
440 showPasswordToggle 392 field={form.$('proxy.password')}
441 /> 393 showPasswordToggle
442 </div> 394 />
443 </div> 395 </div>
444 <p> 396 </div>
445 <span className="mdi mdi-information" /> 397 <p>
446 {intl.formatMessage(messages.proxyRestartInfo)} 398 <span className="mdi mdi-information" />
447 </p> 399 {intl.formatMessage(messages.proxyRestartInfo)}
448 <p> 400 </p>
449 <span className="mdi mdi-information" /> 401 <p>
450 {intl.formatMessage(messages.proxyInfo)} 402 <span className="mdi mdi-information" />
451 </p> 403 {intl.formatMessage(messages.proxyInfo)}
452 </> 404 </p>
453 )} 405 </>
454 </div> 406 )}
455 </PremiumFeatureContainer> 407 </div>
456 )} 408 )}
457 409
458 <div className="user-agent"> 410 <div className="user-agent">
@@ -512,7 +464,7 @@ export default @observer class EditServiceForm extends Component {
512 type="submit" 464 type="submit"
513 label={intl.formatMessage(messages.saveService)} 465 label={intl.formatMessage(messages.saveService)}
514 htmlForm="form" 466 htmlForm="form"
515 disabled={action !== 'edit' && ((form.isPristine && requiresUserInput) || serviceLimitStore.userHasReachedServiceLimit)} 467 disabled={action !== 'edit' && (form.isPristine && requiresUserInput)}
516 /> 468 />
517 )} 469 )}
518 </div> 470 </div>
diff --git a/src/components/settings/services/ServicesDashboard.js b/src/components/settings/services/ServicesDashboard.js
index a0f05fd20..11d3eaa79 100644
--- a/src/components/settings/services/ServicesDashboard.js
+++ b/src/components/settings/services/ServicesDashboard.js
@@ -10,7 +10,6 @@ import Loader from '../../ui/Loader';
10import FAB from '../../ui/FAB'; 10import FAB from '../../ui/FAB';
11import ServiceItem from './ServiceItem'; 11import ServiceItem from './ServiceItem';
12import Appear from '../../ui/effects/Appear'; 12import Appear from '../../ui/effects/Appear';
13import LimitReachedInfobox from '../../../features/serviceLimit/components/LimitReachedInfobox';
14 13
15const messages = defineMessages({ 14const messages = defineMessages({
16 headline: { 15 headline: {
@@ -93,12 +92,11 @@ export default @observer class ServicesDashboard extends Component {
93 <div className="settings__header"> 92 <div className="settings__header">
94 <h1>{intl.formatMessage(messages.headline)}</h1> 93 <h1>{intl.formatMessage(messages.headline)}</h1>
95 </div> 94 </div>
96 <LimitReachedInfobox />
97 <div className="settings__body"> 95 <div className="settings__body">
98 {(services.length !== 0 || searchNeedle) && !isLoading && ( 96 {(services.length !== 0 || searchNeedle) && !isLoading && (
99 <SearchInput 97 <SearchInput
100 placeholder={intl.formatMessage(messages.searchService)} 98 placeholder={intl.formatMessage(messages.searchService)}
101 onChange={needle => filterServices({ needle })} 99 onChange={(needle) => filterServices({ needle })}
102 onReset={() => resetFilter()} 100 onReset={() => resetFilter()}
103 autoFocus 101 autoFocus
104 /> 102 />
@@ -165,7 +163,7 @@ export default @observer class ServicesDashboard extends Component {
165 ) : ( 163 ) : (
166 <table className="service-table"> 164 <table className="service-table">
167 <tbody> 165 <tbody>
168 {services.map(service => ( 166 {services.map((service) => (
169 <ServiceItem 167 <ServiceItem
170 key={service.id} 168 key={service.id}
171 service={service} 169 service={service}
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 52b26d65b..87a4ada27 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -1,5 +1,5 @@
1import { app, systemPreferences } from '@electron/remote'; 1import { app, systemPreferences } from '@electron/remote';
2import React, { Component, Fragment } from 'react'; 2import React, { Component } from 'react';
3import PropTypes from 'prop-types'; 3import PropTypes from 'prop-types';
4import { observer } from 'mobx-react'; 4import { observer } from 'mobx-react';
5import prettyBytes from 'pretty-bytes'; 5import prettyBytes from 'pretty-bytes';
@@ -10,14 +10,13 @@ import Button from '../../ui/Button';
10import Toggle from '../../ui/Toggle'; 10import Toggle from '../../ui/Toggle';
11import ToggleRaw from '../../ui/ToggleRaw'; 11import ToggleRaw from '../../ui/ToggleRaw';
12import Select from '../../ui/Select'; 12import Select from '../../ui/Select';
13import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
14import Input from '../../ui/Input'; 13import Input from '../../ui/Input';
15 14
16import { 15import {
17 FRANZ_TRANSLATION, 16 FRANZ_TRANSLATION,
18 GITHUB_FRANZ_URL, 17 GITHUB_FRANZ_URL,
19} from '../../../config'; 18} from '../../../config';
20import { DEFAULT_APP_SETTINGS, isMac, isWindows } from '../../../environment'; 19import { DEFAULT_APP_SETTINGS, isMac, isWindows, lockFerdiShortcutKey } from '../../../environment';
21import globalMessages from '../../../i18n/globalMessages'; 20import globalMessages from '../../../i18n/globalMessages';
22 21
23const messages = defineMessages({ 22const messages = defineMessages({
@@ -31,7 +30,7 @@ const messages = defineMessages({
31 }, 30 },
32 sentryInfo: { 31 sentryInfo: {
33 id: 'settings.app.sentryInfo', 32 id: 'settings.app.sentryInfo',
34 defaultMessage: '!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.', 33 defaultMessage: '!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!',
35 }, 34 },
36 hibernateInfo: { 35 hibernateInfo: {
37 id: 'settings.app.hibernateInfo', 36 id: 'settings.app.hibernateInfo',
@@ -55,7 +54,7 @@ const messages = defineMessages({
55 }, 54 },
56 lockInfo: { 55 lockInfo: {
57 id: 'settings.app.lockInfo', 56 id: 'settings.app.lockInfo',
58 defaultMessage: '!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.', 57 defaultMessage: '!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.',
59 }, 58 },
60 scheduledDNDTimeInfo: { 59 scheduledDNDTimeInfo: {
61 id: 'settings.app.scheduledDNDTimeInfo', 60 id: 'settings.app.scheduledDNDTimeInfo',
@@ -168,12 +167,10 @@ export default @observer class EditSettingsForm extends Component {
168 isClearingAllCache: PropTypes.bool.isRequired, 167 isClearingAllCache: PropTypes.bool.isRequired,
169 onClearAllCache: PropTypes.func.isRequired, 168 onClearAllCache: PropTypes.func.isRequired,
170 getCacheSize: PropTypes.func.isRequired, 169 getCacheSize: PropTypes.func.isRequired,
171 isSpellcheckerIncludedInCurrentPlan: PropTypes.bool.isRequired,
172 isTodosEnabled: PropTypes.bool.isRequired, 170 isTodosEnabled: PropTypes.bool.isRequired,
173 isTodosActivated: PropTypes.bool.isRequired, 171 isTodosActivated: PropTypes.bool.isRequired,
174 isWorkspaceEnabled: PropTypes.bool.isRequired, 172 isWorkspaceEnabled: PropTypes.bool.isRequired,
175 automaticUpdates: PropTypes.bool.isRequired, 173 automaticUpdates: PropTypes.bool.isRequired,
176 hibernationEnabled: PropTypes.bool.isRequired,
177 isDarkmodeEnabled: PropTypes.bool.isRequired, 174 isDarkmodeEnabled: PropTypes.bool.isRequired,
178 isAdaptableDarkModeEnabled: PropTypes.bool.isRequired, 175 isAdaptableDarkModeEnabled: PropTypes.bool.isRequired,
179 isNightlyEnabled: PropTypes.bool.isRequired, 176 isNightlyEnabled: PropTypes.bool.isRequired,
@@ -224,11 +221,9 @@ export default @observer class EditSettingsForm extends Component {
224 isClearingAllCache, 221 isClearingAllCache,
225 onClearAllCache, 222 onClearAllCache,
226 getCacheSize, 223 getCacheSize,
227 isSpellcheckerIncludedInCurrentPlan,
228 isTodosEnabled, 224 isTodosEnabled,
229 isWorkspaceEnabled, 225 isWorkspaceEnabled,
230 automaticUpdates, 226 automaticUpdates,
231 hibernationEnabled,
232 isDarkmodeEnabled, 227 isDarkmodeEnabled,
233 isTodosActivated, 228 isTodosActivated,
234 isNightlyEnabled, 229 isNightlyEnabled,
@@ -271,8 +266,8 @@ export default @observer class EditSettingsForm extends Component {
271 </div> 266 </div>
272 <div className="settings__body"> 267 <div className="settings__body">
273 <form 268 <form
274 onSubmit={e => this.submit(e)} 269 onSubmit={(e) => this.submit(e)}
275 onChange={e => this.submit(e)} 270 onChange={(e) => this.submit(e)}
276 id="form" 271 id="form"
277 > 272 >
278 {/* Titles */} 273 {/* Titles */}
@@ -339,13 +334,8 @@ export default @observer class EditSettingsForm extends Component {
339 334
340 <Hr /> 335 <Hr />
341 336
342 <Toggle field={form.$('hibernate')} /> 337 <Select field={form.$('hibernationStrategy')} />
343 {hibernationEnabled && ( 338 <Toggle field={form.$('hibernateOnStartup')} />
344 <>
345 <Select field={form.$('hibernationStrategy')} />
346 <Toggle field={form.$('hibernateOnStartup')} />
347 </>
348 )}
349 <p 339 <p
350 className="settings__message" 340 className="settings__message"
351 style={{ 341 style={{
@@ -357,14 +347,17 @@ export default @observer class EditSettingsForm extends Component {
357 </span> 347 </span>
358 </p> 348 </p>
359 349
350 <Select field={form.$('wakeUpStrategy')} />
351
360 <Hr /> 352 <Hr />
361 353
362 {isWorkspaceEnabled && ( 354 {isWorkspaceEnabled && (
363 <Toggle field={form.$('keepAllWorkspacesLoaded')} /> 355 <>
356 <Toggle field={form.$('keepAllWorkspacesLoaded')} />
357 <Hr />
358 </>
364 )} 359 )}
365 360
366 <Hr />
367
368 {isTodosEnabled && !hasAddedTodosAsService && ( 361 {isTodosEnabled && !hasAddedTodosAsService && (
369 <> 362 <>
370 <Toggle field={form.$('enableTodos')} /> 363 <Toggle field={form.$('enableTodos')} />
@@ -375,7 +368,7 @@ export default @observer class EditSettingsForm extends Component {
375 <div> 368 <div>
376 <Input 369 <Input
377 placeholder="Todo Server" 370 placeholder="Todo Server"
378 onChange={e => this.submit(e)} 371 onChange={(e) => this.submit(e)}
379 field={form.$('customTodoServer')} 372 field={form.$('customTodoServer')}
380 /> 373 />
381 <p 374 <p
@@ -409,7 +402,7 @@ export default @observer class EditSettingsForm extends Component {
409 > 402 >
410 <Input 403 <Input
411 placeholder="17:00" 404 placeholder="17:00"
412 onChange={e => this.submit(e)} 405 onChange={(e) => this.submit(e)}
413 field={form.$('scheduledDNDStart')} 406 field={form.$('scheduledDNDStart')}
414 type="time" 407 type="time"
415 /> 408 />
@@ -421,7 +414,7 @@ export default @observer class EditSettingsForm extends Component {
421 > 414 >
422 <Input 415 <Input
423 placeholder="09:00" 416 placeholder="09:00"
424 onChange={e => this.submit(e)} 417 onChange={(e) => this.submit(e)}
425 field={form.$('scheduledDNDEnd')} 418 field={form.$('scheduledDNDEnd')}
426 type="time" 419 type="time"
427 /> 420 />
@@ -488,7 +481,7 @@ export default @observer class EditSettingsForm extends Component {
488 481
489 <Input 482 <Input
490 placeholder="Accent Color" 483 placeholder="Accent Color"
491 onChange={e => this.submit(e)} 484 onChange={(e) => this.submit(e)}
492 field={form.$('accentColor')} 485 field={form.$('accentColor')}
493 /> 486 />
494 <p> 487 <p>
@@ -509,8 +502,12 @@ export default @observer class EditSettingsForm extends Component {
509 <Hr /> 502 <Hr />
510 503
511 <Select field={form.$('searchEngine')} /> 504 <Select field={form.$('searchEngine')} />
505
506 <Hr />
507
512 <Toggle field={form.$('sentry')} /> 508 <Toggle field={form.$('sentry')} />
513 <p>{intl.formatMessage(messages.sentryInfo)}</p> 509 <p className="settings__help">{intl.formatMessage(messages.sentryInfo)}</p>
510 <p className="settings__help">{intl.formatMessage(messages.appRestartRequired)}</p>
514 511
515 <Hr /> 512 <Hr />
516 513
@@ -523,7 +520,7 @@ export default @observer class EditSettingsForm extends Component {
523 520
524 <Input 521 <Input
525 placeholder={intl.formatMessage(messages.lockedPassword)} 522 placeholder={intl.formatMessage(messages.lockedPassword)}
526 onChange={e => this.submit(e)} 523 onChange={(e) => this.submit(e)}
527 field={form.$('lockedPassword')} 524 field={form.$('lockedPassword')}
528 type="password" 525 type="password"
529 scorePassword 526 scorePassword
@@ -535,7 +532,7 @@ export default @observer class EditSettingsForm extends Component {
535 532
536 <Input 533 <Input
537 placeholder="Lock after inactivity" 534 placeholder="Lock after inactivity"
538 onChange={e => this.submit(e)} 535 onChange={(e) => this.submit(e)}
539 field={form.$('inactivityLock')} 536 field={form.$('inactivityLock')}
540 autoFocus 537 autoFocus
541 /> 538 />
@@ -551,7 +548,7 @@ export default @observer class EditSettingsForm extends Component {
551 }} 548 }}
552 > 549 >
553 <span> 550 <span>
554 { intl.formatMessage(messages.lockInfo) } 551 { intl.formatMessage(messages.lockInfo, { lockShortcut: `${lockFerdiShortcutKey(false)}` }) }
555 </span> 552 </span>
556 </p> 553 </p>
557 </div> 554 </div>
@@ -564,26 +561,24 @@ export default @observer class EditSettingsForm extends Component {
564 561
565 <Hr /> 562 <Hr />
566 563
567 <PremiumFeatureContainer 564 <Toggle
568 condition={!isSpellcheckerIncludedInCurrentPlan} 565 field={form.$('enableSpellchecking')}
569 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }} 566 />
570 > 567 {!isMac && form.$('enableSpellchecking').value && (
571 <> 568 <Select field={form.$('spellcheckerLanguage')} />
572 <Toggle 569 )}
573 field={form.$('enableSpellchecking')} 570 {isMac && form.$('enableSpellchecking').value && (
574 /> 571 <p className="settings__help">{intl.formatMessage(messages.spellCheckerLanguageInfo)}</p>
575 {!isMac && form.$('enableSpellchecking').value && ( 572 )}
576 <Select field={form.$('spellcheckerLanguage')} /> 573 <p className="settings__help">{intl.formatMessage(messages.appRestartRequired)}</p>
577 )} 574
578 {isMac && form.$('enableSpellchecking').value && ( 575 <Hr />
579 <p>{intl.formatMessage(messages.spellCheckerLanguageInfo)}</p> 576
580 )}
581 </>
582 </PremiumFeatureContainer>
583 <a 577 <a
584 href={FRANZ_TRANSLATION} 578 href={FRANZ_TRANSLATION}
585 target="_blank" 579 target="_blank"
586 className="link" 580 className="link"
581 rel="noreferrer"
587 > 582 >
588 {intl.formatMessage(messages.translationHelp)} 583 {intl.formatMessage(messages.translationHelp)}
589 {' '} 584 {' '}
@@ -602,7 +597,7 @@ export default @observer class EditSettingsForm extends Component {
602 597
603 <Input 598 <Input
604 placeholder="User Agent" 599 placeholder="User Agent"
605 onChange={e => this.submit(e)} 600 onChange={(e) => this.submit(e)}
606 field={form.$('userAgentPref')} 601 field={form.$('userAgentPref')}
607 /> 602 />
608 <p className="settings__help">{intl.formatMessage(globalMessages.userAgentHelp)}</p> 603 <p className="settings__help">{intl.formatMessage(globalMessages.userAgentHelp)}</p>
@@ -688,12 +683,12 @@ export default @observer class EditSettingsForm extends Component {
688 683
689 Ferdi is based on 684 Ferdi is based on
690 {' '} 685 {' '}
691 <a href={`${GITHUB_FRANZ_URL}/franz`} target="_blank">Franz</a> 686 <a href={`${GITHUB_FRANZ_URL}/franz`} target="_blank" rel="noreferrer">Franz</a>
692 687
693 , a project published 688 , a project published
694 under the 689 under the
695 {' '} 690 {' '}
696 <a href={`${GITHUB_FRANZ_URL}/franz/blob/master/LICENSE`} target="_blank">Apache-2.0 License</a> 691 <a href={`${GITHUB_FRANZ_URL}/franz/blob/master/LICENSE`} target="_blank" rel="noreferrer">Apache-2.0 License</a>
697 </span> 692 </span>
698 <br /> 693 <br />
699 <span className="mdi mdi-information" /> 694 <span className="mdi mdi-information" />
diff --git a/src/components/settings/supportFerdi/SupportFerdiDashboard.js b/src/components/settings/supportFerdi/SupportFerdiDashboard.js
index 36c126565..b84e06739 100644
--- a/src/components/settings/supportFerdi/SupportFerdiDashboard.js
+++ b/src/components/settings/supportFerdi/SupportFerdiDashboard.js
@@ -94,10 +94,10 @@ class SupportFerdiDashboard extends Component {
94 <h1>{intl.formatMessage(messages.title)}</h1> 94 <h1>{intl.formatMessage(messages.title)}</h1>
95 <div> 95 <div>
96 <p className="settings__support-badges"> 96 <p className="settings__support-badges">
97 <a href="https://github.com/getferdi/ferdi" target="_blank"><img alt="GitHub Stars" src="https://img.shields.io/github/stars/getferdi/ferdi?style=social" /></a> 97 <a href="https://github.com/getferdi/ferdi" target="_blank" rel="noreferrer"><img alt="GitHub Stars" src="https://img.shields.io/github/stars/getferdi/ferdi?style=social" /></a>
98 <a href="https://twitter.com/getferdi/" target="_blank"><img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/getferdi?label=Follow&style=social" /></a> 98 <a href="https://twitter.com/getferdi/" target="_blank" rel="noreferrer"><img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/getferdi?label=Follow&style=social" /></a>
99 <a href="https://opencollective.com/getferdi#section-contributors" target="_blank"><img alt="Open Collective backers" src="https://img.shields.io/opencollective/backers/getferdi?logo=open-collective" /></a> 99 <a href="https://opencollective.com/getferdi#section-contributors" target="_blank" rel="noreferrer"><img alt="Open Collective backers" src="https://img.shields.io/opencollective/backers/getferdi?logo=open-collective" /></a>
100 <a href="https://opencollective.com/getferdi#section-contributors" target="_blank"><img alt="Open Collective sponsors" src="https://img.shields.io/opencollective/sponsors/getferdi?logo=open-collective" /></a> 100 <a href="https://opencollective.com/getferdi#section-contributors" target="_blank" rel="noreferrer"><img alt="Open Collective sponsors" src="https://img.shields.io/opencollective/sponsors/getferdi?logo=open-collective" /></a>
101 </p> 101 </p>
102 <FormattedHTMLMessage {...messages.aboutIntro} /> 102 <FormattedHTMLMessage {...messages.aboutIntro} />
103 <br /> 103 <br />
@@ -109,7 +109,7 @@ class SupportFerdiDashboard extends Component {
109 </p> 109 </p>
110 <p> 110 <p>
111 {intl.formatMessage(messages.textListContributors)} 111 {intl.formatMessage(messages.textListContributors)}
112 <a href="https://github.com/getferdi/ferdi#contributors-" target="_blank" className="link"> 112 <a href="https://github.com/getferdi/ferdi#contributors-" target="_blank" className="link" rel="noreferrer">
113 {' '} 113 {' '}
114 {intl.formatMessage(messages.textListContributorsHere)} 114 {intl.formatMessage(messages.textListContributorsHere)}
115 <i className="mdi mdi-open-in-new" /> 115 <i className="mdi mdi-open-in-new" />
@@ -122,7 +122,7 @@ class SupportFerdiDashboard extends Component {
122 </p> 122 </p>
123 <p> 123 <p>
124 {intl.formatMessage(messages.textSupportWelcome)} 124 {intl.formatMessage(messages.textSupportWelcome)}
125 <a href="https://help.getferdi.com/general/support" target="_blank" className="link"> 125 <a href="https://help.getferdi.com/general/support" target="_blank" className="link" rel="noreferrer">
126 {' '} 126 {' '}
127 {intl.formatMessage(messages.textSupportWelcomeHere)} 127 {intl.formatMessage(messages.textSupportWelcomeHere)}
128 <i className="mdi mdi-open-in-new" /> 128 <i className="mdi mdi-open-in-new" />
@@ -130,7 +130,7 @@ class SupportFerdiDashboard extends Component {
130 </p> 130 </p>
131 <p> 131 <p>
132 {intl.formatMessage(messages.textExpenses)} 132 {intl.formatMessage(messages.textExpenses)}
133 <a href="https://opencollective.com/getferdi#section-budget" target="_blank" className="link"> 133 <a href="https://opencollective.com/getferdi#section-budget" target="_blank" className="link" rel="noreferrer">
134 {' '} 134 {' '}
135 {intl.formatMessage(messages.textOpenCollective)} 135 {intl.formatMessage(messages.textOpenCollective)}
136 <i className="mdi mdi-open-in-new" /> 136 <i className="mdi mdi-open-in-new" />
@@ -138,14 +138,14 @@ class SupportFerdiDashboard extends Component {
138 </p> 138 </p>
139 <p> 139 <p>
140 {intl.formatMessage(messages.textDonation)} 140 {intl.formatMessage(messages.textDonation)}
141 <a href="https://opencollective.com/getferdi#section-contribute" target="_blank" className="link"> 141 <a href="https://opencollective.com/getferdi#section-contribute" target="_blank" className="link" rel="noreferrer">
142 {' '} 142 {' '}
143 {intl.formatMessage(messages.textOpenCollective)} 143 {intl.formatMessage(messages.textOpenCollective)}
144 <i className="mdi mdi-open-in-new" /> 144 <i className="mdi mdi-open-in-new" />
145 </a> 145 </a>
146 {' '} 146 {' '}
147 {intl.formatMessage(messages.textDonationAnd)} 147 {intl.formatMessage(messages.textDonationAnd)}
148 <a href="https://github.com/sponsors/getferdi" target="_blank" className="link"> 148 <a href="https://github.com/sponsors/getferdi" target="_blank" className="link" rel="noreferrer">
149 {' '} 149 {' '}
150 {intl.formatMessage(messages.textGitHubSponsors)} 150 {intl.formatMessage(messages.textGitHubSponsors)}
151 <i className="mdi mdi-open-in-new" /> 151 <i className="mdi mdi-open-in-new" />
diff --git a/src/components/settings/team/TeamDashboard.js b/src/components/settings/team/TeamDashboard.js
index 602d6e490..437225058 100644
--- a/src/components/settings/team/TeamDashboard.js
+++ b/src/components/settings/team/TeamDashboard.js
@@ -6,12 +6,9 @@ import ReactTooltip from 'react-tooltip';
6import injectSheet from 'react-jss'; 6import injectSheet from 'react-jss';
7import classnames from 'classnames'; 7import classnames from 'classnames';
8 8
9import { Badge } from '@meetfranz/ui';
10import Loader from '../../ui/Loader'; 9import Loader from '../../ui/Loader';
11import Button from '../../ui/Button'; 10import Button from '../../ui/Button';
12import Infobox from '../../ui/Infobox'; 11import Infobox from '../../ui/Infobox';
13import globalMessages from '../../../i18n/globalMessages';
14import UpgradeButton from '../../ui/UpgradeButton';
15import { LIVE_FRANZ_API } from '../../../config'; 12import { LIVE_FRANZ_API } from '../../../config';
16 13
17const messages = defineMessages({ 14const messages = defineMessages({
@@ -35,10 +32,6 @@ const messages = defineMessages({
35 id: 'settings.team.manageAction', 32 id: 'settings.team.manageAction',
36 defaultMessage: '!!!Manage your Team on meetfranz.com', 33 defaultMessage: '!!!Manage your Team on meetfranz.com',
37 }, 34 },
38 upgradeButton: {
39 id: 'settings.team.upgradeAction',
40 defaultMessage: '!!!Upgrade your Account',
41 },
42 teamsUnavailable: { 35 teamsUnavailable: {
43 id: 'settings.team.teamsUnavailable', 36 id: 'settings.team.teamsUnavailable',
44 defaultMessage: '!!!Teams are unavailable', 37 defaultMessage: '!!!Teams are unavailable',
@@ -88,10 +81,6 @@ const styles = {
88 headlineWithSpacing: { 81 headlineWithSpacing: {
89 marginBottom: 'inherit', 82 marginBottom: 'inherit',
90 }, 83 },
91 proRequired: {
92 margin: [10, 0, 40],
93 height: 'auto',
94 },
95 buttonContainer: { 84 buttonContainer: {
96 display: 'flex', 85 display: 'flex',
97 height: 'auto', 86 height: 'auto',
@@ -105,7 +94,6 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
105 retryUserInfoRequest: PropTypes.func.isRequired, 94 retryUserInfoRequest: PropTypes.func.isRequired,
106 openTeamManagement: PropTypes.func.isRequired, 95 openTeamManagement: PropTypes.func.isRequired,
107 classes: PropTypes.object.isRequired, 96 classes: PropTypes.object.isRequired,
108 isProUser: PropTypes.bool.isRequired,
109 server: PropTypes.string.isRequired, 97 server: PropTypes.string.isRequired,
110 }; 98 };
111 99
@@ -119,7 +107,6 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
119 userInfoRequestFailed, 107 userInfoRequestFailed,
120 retryUserInfoRequest, 108 retryUserInfoRequest,
121 openTeamManagement, 109 openTeamManagement,
122 isProUser,
123 classes, 110 classes,
124 server, 111 server,
125 } = this.props; 112 } = this.props;
@@ -157,37 +144,25 @@ export default @injectSheet(styles) @observer class TeamDashboard extends Compon
157 <> 144 <>
158 <h1 className={classnames({ 145 <h1 className={classnames({
159 [classes.headline]: true, 146 [classes.headline]: true,
160 [classes.headlineWithSpacing]: isProUser, 147 [classes.headlineWithSpacing]: true,
161 })} 148 })}
162 > 149 >
163 {intl.formatMessage(messages.contentHeadline)} 150 {intl.formatMessage(messages.contentHeadline)}
164 151
165 </h1> 152 </h1>
166 {!isProUser && (
167 <Badge className={classes.proRequired}>{intl.formatMessage(globalMessages.proRequired)}</Badge>
168 )}
169 <div className={classes.container}> 153 <div className={classes.container}>
170 <div className={classes.content}> 154 <div className={classes.content}>
171 <p>{intl.formatMessage(messages.intro)}</p> 155 <p>{intl.formatMessage(messages.intro)}</p>
172 <p>{intl.formatMessage(messages.copy)}</p> 156 <p>{intl.formatMessage(messages.copy)}</p>
173 </div> 157 </div>
174 <img className={classes.image} src="https://cdn.franzinfra.com/announcements/assets/teams.png" alt="Franz for Teams" /> 158 <img className={classes.image} src="https://cdn.franzinfra.com/announcements/assets/teams.png" alt="Ferdi for Teams" />
175 </div> 159 </div>
176 <div className={classes.buttonContainer}> 160 <div className={classes.buttonContainer}>
177 {!isProUser ? ( 161 <Button
178 <UpgradeButton 162 label={intl.formatMessage(messages.manageButton)}
179 className={classes.cta} 163 onClick={openTeamManagement}
180 gaEventInfo={{ category: 'Todos', event: 'upgrade' }} 164 className={classes.cta}
181 requiresPro 165 />
182 short
183 />
184 ) : (
185 <Button
186 label={intl.formatMessage(messages.manageButton)}
187 onClick={openTeamManagement}
188 className={classes.cta}
189 />
190 )}
191 </div> 166 </div>
192 </> 167 </>
193 </> 168 </>
diff --git a/src/components/settings/user/EditUserForm.js b/src/components/settings/user/EditUserForm.js
index a1a353e57..db78acb69 100644
--- a/src/components/settings/user/EditUserForm.js
+++ b/src/components/settings/user/EditUserForm.js
@@ -84,7 +84,7 @@ export default @observer class EditUserForm extends Component {
84 </span> 84 </span>
85 </div> 85 </div>
86 <div className="settings__body"> 86 <div className="settings__body">
87 <form onSubmit={e => this.submit(e)} id="form"> 87 <form onSubmit={(e) => this.submit(e)} id="form">
88 {status.length > 0 && status.includes('data-updated') && ( 88 {status.length > 0 && status.includes('data-updated') && (
89 <Infobox 89 <Infobox
90 type="success" 90 type="success"
diff --git a/src/components/subscription/SubscriptionForm.js b/src/components/subscription/SubscriptionForm.js
deleted file mode 100644
index ec486e5d0..000000000
--- a/src/components/subscription/SubscriptionForm.js
+++ /dev/null
@@ -1,78 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { H3, H2 } from '@meetfranz/ui';
8
9import { Button } from '@meetfranz/forms';
10import { FeatureList } from '../ui/FeatureList';
11
12const messages = defineMessages({
13 submitButtonLabel: {
14 id: 'subscription.cta.choosePlan',
15 defaultMessage: '!!!Choose your plan',
16 },
17 teaserHeadline: {
18 id: 'settings.account.headlineUpgradeAccount',
19 defaultMessage: '!!!Upgrade your account and get the full Franz experience',
20 },
21 teaserText: {
22 id: 'subscription.teaser.intro',
23 defaultMessage: '!!!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!',
24 },
25 includedFeatures: {
26 id: 'subscription.teaser.includedFeatures',
27 defaultMessage: '!!!Paid Franz Plans include:',
28 },
29});
30
31const styles = () => ({
32 activateTrialButton: {
33 margin: [40, 'auto', 50],
34 display: 'flex',
35 },
36});
37
38export default @injectSheet(styles) @observer class SubscriptionForm extends Component {
39 static propTypes = {
40 selectPlan: PropTypes.func.isRequired,
41 isActivatingTrial: PropTypes.bool.isRequired,
42 classes: PropTypes.object.isRequired,
43 };
44
45 static contextTypes = {
46 intl: intlShape,
47 };
48
49 render() {
50 const {
51 isActivatingTrial,
52 selectPlan,
53 classes,
54 } = this.props;
55 const { intl } = this.context;
56
57 return (
58 <>
59 <H2>{intl.formatMessage(messages.teaserHeadline)}</H2>
60 <p>{intl.formatMessage(messages.teaserText)}</p>
61 <Button
62 label={intl.formatMessage(messages.submitButtonLabel)}
63 className={classes.activateTrialButton}
64 busy={isActivatingTrial}
65 onClick={selectPlan}
66 />
67 <div className="subscription__premium-info">
68 <H3>
69 {intl.formatMessage(messages.includedFeatures)}
70 </H3>
71 <div className="subscription">
72 <FeatureList />
73 </div>
74 </div>
75 </>
76 );
77 }
78}
diff --git a/src/components/subscription/SubscriptionPopup.js b/src/components/subscription/SubscriptionPopup.js
deleted file mode 100644
index 0df43fd4b..000000000
--- a/src/components/subscription/SubscriptionPopup.js
+++ /dev/null
@@ -1,84 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import Webview from 'react-electron-web-view';
6import ms from 'ms';
7
8import Button from '../ui/Button';
9
10const messages = defineMessages({
11 buttonCancel: {
12 id: 'subscriptionPopup.buttonCancel',
13 defaultMessage: '!!!Cancel',
14 },
15 buttonDone: {
16 id: 'subscriptionPopup.buttonDone',
17 defaultMessage: '!!!Done',
18 },
19});
20
21export default @observer class SubscriptionPopup extends Component {
22 static propTypes = {
23 url: PropTypes.string.isRequired,
24 closeWindow: PropTypes.func.isRequired,
25 completeCheck: PropTypes.func.isRequired,
26 isCompleted: PropTypes.bool.isRequired,
27 };
28
29 static contextTypes = {
30 intl: intlShape,
31 };
32
33 state = {
34 isFakeLoading: false,
35 };
36
37 // We delay the window closing a bit in order to give
38 // the Recurly webhook a few seconds to do it's magic
39 delayedCloseWindow() {
40 this.setState({
41 isFakeLoading: true,
42 });
43
44 setTimeout(() => {
45 this.props.closeWindow();
46 }, ms('1s'));
47 }
48
49 render() {
50 const {
51 url, closeWindow, completeCheck, isCompleted,
52 } = this.props;
53 const { intl } = this.context;
54
55 return (
56 <div className="subscription-popup">
57 <div className="subscription-popup__content">
58 <Webview
59 className="subscription-popup__webview"
60 autosize
61 allowpopups
62 src={encodeURI(url)}
63 onDidNavigate={completeCheck}
64 onDidNavigateInPage={completeCheck}
65 />
66 </div>
67 <div className="subscription-popup__toolbar franz-form">
68 <Button
69 label={intl.formatMessage(messages.buttonCancel)}
70 buttonType="secondary"
71 onClick={closeWindow}
72 disabled={isCompleted}
73 />
74 <Button
75 label={intl.formatMessage(messages.buttonDone)}
76 onClick={() => this.delayedCloseWindow()}
77 disabled={!isCompleted}
78 loaded={!this.state.isFakeLoading}
79 />
80 </div>
81 </div>
82 );
83 }
84}
diff --git a/src/components/subscription/TrialForm.js b/src/components/subscription/TrialForm.js
deleted file mode 100644
index d61b779ed..000000000
--- a/src/components/subscription/TrialForm.js
+++ /dev/null
@@ -1,115 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { H3, H2 } from '@meetfranz/ui';
8
9import { Button } from '@meetfranz/forms';
10import { FeatureList } from '../ui/FeatureList';
11import { FeatureItem } from '../ui/FeatureItem';
12
13const messages = defineMessages({
14 submitButtonLabel: {
15 id: 'subscription.cta.activateTrial',
16 defaultMessage: '!!!Yes, start the free Franz Professional trial',
17 },
18 allOptionsButton: {
19 id: 'subscription.cta.allOptions',
20 defaultMessage: '!!!See all options',
21 },
22 teaserHeadline: {
23 id: 'settings.account.headlineTrialUpgrade',
24 defaultMessage: '!!!Get the free 14 day Franz Professional Trial',
25 },
26 includedFeatures: {
27 id: 'subscription.includedProFeatures',
28 defaultMessage: '!!!The Franz Professional Plan includes:',
29 },
30 noStringsAttachedHeadline: {
31 id: 'pricing.trial.terms.headline',
32 defaultMessage: '!!!No strings attached',
33 },
34 noCreditCard: {
35 id: 'pricing.trial.terms.noCreditCard',
36 defaultMessage: '!!!No credit card required',
37 },
38 automaticTrialEnd: {
39 id: 'pricing.trial.terms.automaticTrialEnd',
40 defaultMessage: '!!!Your free trial ends automatically after 14 days',
41 },
42});
43
44const styles = theme => ({
45 activateTrialButton: {
46 margin: [40, 'auto', 10],
47 display: 'flex',
48 },
49 allOptionsButton: {
50 margin: [0, 0, 40],
51 background: 'none',
52 border: 'none',
53 color: theme.colorText,
54 },
55 keyTerms: {
56 marginTop: 20,
57 },
58});
59
60export default @injectSheet(styles) @observer class TrialForm extends Component {
61 static propTypes = {
62 activateTrial: PropTypes.func.isRequired,
63 isActivatingTrial: PropTypes.bool.isRequired,
64 showAllOptions: PropTypes.func.isRequired,
65 classes: PropTypes.object.isRequired,
66 };
67
68 static contextTypes = {
69 intl: intlShape,
70 };
71
72 render() {
73 const {
74 isActivatingTrial,
75 activateTrial,
76 showAllOptions,
77 classes,
78 } = this.props;
79 const { intl } = this.context;
80
81 return (
82 <>
83 <H2>{intl.formatMessage(messages.teaserHeadline)}</H2>
84 <H3 className={classes.keyTerms}>
85 {intl.formatMessage(messages.noStringsAttachedHeadline)}
86 </H3>
87 <ul>
88 <FeatureItem icon="👉" name={intl.formatMessage(messages.noCreditCard)} />
89 <FeatureItem icon="👉" name={intl.formatMessage(messages.automaticTrialEnd)} />
90 </ul>
91
92 <Button
93 label={intl.formatMessage(messages.submitButtonLabel)}
94 className={classes.activateTrialButton}
95 busy={isActivatingTrial}
96 onClick={activateTrial}
97 />
98 <Button
99 label={intl.formatMessage(messages.allOptionsButton)}
100 className={classes.allOptionsButton}
101 onClick={showAllOptions}
102 stretch
103 />
104 <div className="subscription__premium-info">
105 <H3>
106 {intl.formatMessage(messages.includedFeatures)}
107 </H3>
108 <div className="subscription">
109 <FeatureList />
110 </div>
111 </div>
112 </>
113 );
114 }
115}
diff --git a/src/components/ui/ActivateTrialButton/index.js b/src/components/ui/ActivateTrialButton/index.js
deleted file mode 100644
index 8f4d21f64..000000000
--- a/src/components/ui/ActivateTrialButton/index.js
+++ /dev/null
@@ -1,107 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import classnames from 'classnames';
6
7import { Button } from '@meetfranz/forms';
8
9import UserStore from '../../../stores/UserStore';
10import UIStore from '../../../stores/UIStore';
11
12const messages = defineMessages({
13 action: {
14 id: 'feature.delayApp.upgrade.action',
15 defaultMessage: '!!!Get a Franz Supporter License',
16 },
17 actionTrial: {
18 id: 'feature.delayApp.trial.action',
19 defaultMessage: '!!!Yes, I want the free 14 day trial of Franz Professional',
20 },
21 shortAction: {
22 id: 'feature.delayApp.upgrade.actionShort',
23 defaultMessage: '!!!Upgrade account',
24 },
25 shortActionTrial: {
26 id: 'feature.delayApp.trial.actionShort',
27 defaultMessage: '!!!Activate the free Franz Professional trial',
28 },
29 noStringsAttachedHeadline: {
30 id: 'pricing.trial.terms.headline',
31 defaultMessage: '!!!No strings attached',
32 },
33 noCreditCard: {
34 id: 'pricing.trial.terms.noCreditCard',
35 defaultMessage: '!!!No credit card required',
36 },
37 automaticTrialEnd: {
38 id: 'pricing.trial.terms.automaticTrialEnd',
39 defaultMessage: '!!!Your free trial ends automatically after 14 days',
40 },
41});
42
43@inject('stores', 'actions') @observer
44class ActivateTrialButton extends Component {
45 static propTypes = {
46 className: PropTypes.string,
47 short: PropTypes.bool,
48 gaEventInfo: PropTypes.shape({
49 category: PropTypes.string.isRequired,
50 event: PropTypes.string.isRequired,
51 label: PropTypes.string,
52 }),
53 };
54
55 static defaultProps = {
56 className: '',
57 short: false,
58 gaEventInfo: null,
59 }
60
61 static contextTypes = {
62 intl: intlShape,
63 };
64
65 handleCTAClick() {
66 const { actions } = this.props;
67
68 actions.ui.openSettings({ path: 'user' });
69 }
70
71 render() {
72 const { stores, className, short } = this.props;
73 const { intl } = this.context;
74
75 const { hadSubscription } = stores.user.data;
76
77 let label;
78 if (hadSubscription) {
79 label = short ? messages.shortAction : messages.action;
80 } else {
81 label = short ? messages.shortActionTrial : messages.actionTrial;
82 }
83
84 return (
85 <Button
86 label={intl.formatMessage(label)}
87 className={classnames({
88 [className]: className,
89 })}
90 buttonType="inverted"
91 onClick={this.handleCTAClick.bind(this)}
92 busy={stores.user.activateTrialRequest.isExecuting}
93 />
94 );
95 }
96}
97
98export default ActivateTrialButton;
99
100ActivateTrialButton.wrappedComponent.propTypes = {
101 stores: PropTypes.shape({
102 user: PropTypes.instanceOf(UserStore).isRequired,
103 }).isRequired,
104 actions: PropTypes.shape({
105 ui: PropTypes.instanceOf(UIStore).isRequired,
106 }).isRequired,
107};
diff --git a/src/components/ui/AppLoader/index.js b/src/components/ui/AppLoader/index.js
index a7f6f4545..31d7ca249 100644
--- a/src/components/ui/AppLoader/index.js
+++ b/src/components/ui/AppLoader/index.js
@@ -37,7 +37,7 @@ export default @injectSheet(styles) @withTheme class AppLoader extends Component
37 37
38 componentDidMount() { 38 componentDidMount() {
39 this.interval = setInterval(() => { 39 this.interval = setInterval(() => {
40 this.setState(prevState => ({ 40 this.setState((prevState) => ({
41 step: prevState.step === textList.length - 1 ? 0 : prevState.step + 1, 41 step: prevState.step === textList.length - 1 ? 0 : prevState.step + 1,
42 })); 42 }));
43 }, 2500); 43 }, 2500);
diff --git a/src/components/ui/AppLoader/styles.js b/src/components/ui/AppLoader/styles.js
index 755a56b40..9891e0387 100644
--- a/src/components/ui/AppLoader/styles.js
+++ b/src/components/ui/AppLoader/styles.js
@@ -1,3 +1,9 @@
1let sloganTransition = 'none';
2
3if (window && window.matchMedia('(prefers-reduced-motion: no-preference)')) {
4 sloganTransition = 'opacity 1s ease';
5}
6
1export default { 7export default {
2 component: { 8 component: {
3 color: '#FFF', 9 color: '#FFF',
@@ -5,7 +11,7 @@ export default {
5 slogan: { 11 slogan: {
6 display: 'block', 12 display: 'block',
7 opacity: 0, 13 opacity: 0,
8 transition: 'opacity 1s ease', 14 transition: sloganTransition,
9 position: 'absolute', 15 position: 'absolute',
10 textAlign: 'center', 16 textAlign: 'center',
11 width: '100%', 17 width: '100%',
diff --git a/src/components/ui/FeatureItem.js b/src/components/ui/FeatureItem.js
index 4926df470..646cf56ca 100644
--- a/src/components/ui/FeatureItem.js
+++ b/src/components/ui/FeatureItem.js
@@ -4,7 +4,7 @@ import { Icon } from '@meetfranz/ui';
4import classnames from 'classnames'; 4import classnames from 'classnames';
5import { mdiCheckCircle } from '@mdi/js'; 5import { mdiCheckCircle } from '@mdi/js';
6 6
7const styles = theme => ({ 7const styles = (theme) => ({
8 featureItem: { 8 featureItem: {
9 borderBottom: [1, 'solid', theme.defaultContentBorder], 9 borderBottom: [1, 'solid', theme.defaultContentBorder],
10 padding: [8, 0], 10 padding: [8, 0],
diff --git a/src/components/ui/FeatureList.js b/src/components/ui/FeatureList.js
index 72c799819..cf2664830 100644
--- a/src/components/ui/FeatureList.js
+++ b/src/components/ui/FeatureList.js
@@ -3,12 +3,11 @@ import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl'; 3import { defineMessages, intlShape } from 'react-intl';
4 4
5import { FeatureItem } from './FeatureItem'; 5import { FeatureItem } from './FeatureItem';
6import { PLANS } from '../../config';
7 6
8const messages = defineMessages({ 7const messages = defineMessages({
9 availableRecipes: { 8 availableRecipes: {
10 id: 'pricing.features.recipes', 9 id: 'pricing.features.recipes',
11 defaultMessage: '!!!Choose from more than 70 Services', 10 defaultMessage: '!!!Choose from more than 70 Services', // TODO: Make this dynamic
12 }, 11 },
13 accountSync: { 12 accountSync: {
14 id: 'pricing.features.accountSync', 13 id: 'pricing.features.accountSync',
@@ -22,14 +21,6 @@ const messages = defineMessages({
22 id: 'pricing.features.unlimitedServices', 21 id: 'pricing.features.unlimitedServices',
23 defaultMessage: '!!!Add unlimited services', 22 defaultMessage: '!!!Add unlimited services',
24 }, 23 },
25 upToThreeServices: {
26 id: 'pricing.features.upToThreeServices',
27 defaultMessage: '!!!Add up to 3 services',
28 },
29 upToSixServices: {
30 id: 'pricing.features.upToSixServices',
31 defaultMessage: '!!!Add up to 6 services',
32 },
33 spellchecker: { 24 spellchecker: {
34 id: 'pricing.features.spellchecker', 25 id: 'pricing.features.spellchecker',
35 defaultMessage: '!!!Spellchecker support', 26 defaultMessage: '!!!Spellchecker support',
@@ -58,31 +49,17 @@ const messages = defineMessages({
58 id: 'pricing.features.teamManagement', 49 id: 'pricing.features.teamManagement',
59 defaultMessage: '!!!Team Management', 50 defaultMessage: '!!!Team Management',
60 }, 51 },
61 appDelays: {
62 id: 'pricing.features.appDelays',
63 defaultMessage: '!!!No Waiting Screens',
64 },
65 adFree: {
66 id: 'pricing.features.adFree',
67 defaultMessage: '!!!Forever ad-free',
68 },
69 appDelayEnabled: {
70 id: 'pricing.features.appDelaysEnabled',
71 defaultMessage: '!!!Occasional Waiting Screens',
72 },
73}); 52});
74 53
75export class FeatureList extends Component { 54export class FeatureList extends Component {
76 static propTypes = { 55 static propTypes = {
77 className: PropTypes.string, 56 className: PropTypes.string,
78 featureClassName: PropTypes.string, 57 featureClassName: PropTypes.string,
79 plan: PropTypes.oneOf(Object.keys(PLANS)),
80 }; 58 };
81 59
82 static defaultProps = { 60 static defaultProps = {
83 className: '', 61 className: '',
84 featureClassName: '', 62 featureClassName: '',
85 plan: false,
86 } 63 }
87 64
88 static contextTypes = { 65 static contextTypes = {
@@ -93,53 +70,29 @@ export class FeatureList extends Component {
93 const { 70 const {
94 className, 71 className,
95 featureClassName, 72 featureClassName,
96 plan,
97 } = this.props; 73 } = this.props;
98 const { intl } = this.context; 74 const { intl } = this.context;
99 75
100 const features = []; 76 const features = [
101 if (plan === PLANS.FREE) { 77 messages.availableRecipes,
102 features.push( 78 messages.accountSync,
103 messages.appDelayEnabled, 79 messages.desktopNotifications,
104 messages.upToThreeServices, 80
105 messages.availableRecipes, 81 messages.spellchecker,
106 messages.accountSync, 82
107 messages.desktopNotifications, 83 messages.workspaces,
108 ); 84 messages.customWebsites,
109 } else if (plan === PLANS.PERSONAL) { 85 messages.thirdPartyServices,
110 features.push( 86
111 messages.upToSixServices, 87 messages.unlimitedServices,
112 messages.spellchecker, 88 messages.onPremise,
113 messages.appDelays, 89 messages.serviceProxies,
114 messages.adFree, 90 messages.teamManagement,
115 ); 91 ];
116 } else if (plan === PLANS.PRO) {
117 features.push(
118 messages.unlimitedServices,
119 messages.workspaces,
120 messages.customWebsites,
121 // messages.onPremise,
122 messages.thirdPartyServices,
123 // messages.serviceProxies,
124 );
125 } else {
126 features.push(
127 messages.unlimitedServices,
128 messages.spellchecker,
129 messages.workspaces,
130 messages.customWebsites,
131 messages.onPremise,
132 messages.thirdPartyServices,
133 messages.serviceProxies,
134 messages.teamManagement,
135 messages.appDelays,
136 messages.adFree,
137 );
138 }
139 92
140 return ( 93 return (
141 <ul className={className}> 94 <ul className={className}>
142 {features.map(feature => <FeatureItem name={intl.formatMessage(feature)} className={featureClassName} />)} 95 {features.map((feature) => <FeatureItem name={intl.formatMessage(feature)} className={featureClassName} />)}
143 </ul> 96 </ul>
144 ); 97 );
145 } 98 }
diff --git a/src/components/ui/ImageUpload.js b/src/components/ui/ImageUpload.js
index 059610aec..bb4ea0565 100644
--- a/src/components/ui/ImageUpload.js
+++ b/src/components/ui/ImageUpload.js
@@ -26,16 +26,13 @@ export default @observer class ImageUpload extends Component {
26 26
27 dropzoneRef = null; 27 dropzoneRef = null;
28 28
29 imgPath = null;
30
31 onDrop(acceptedFiles) { 29 onDrop(acceptedFiles) {
32 const { field } = this.props; 30 const { field } = this.props;
33 31
34 acceptedFiles.forEach((file) => { 32 acceptedFiles.forEach((file) => {
35 this.imgPath = isWindows ? file.path.replace(/\\/g, '/') : file.path; 33 const imgPath = isWindows ? file.path.replace(/\\/g, '/') : file.path;
36
37 this.setState({ 34 this.setState({
38 path: this.imgPath, 35 path: imgPath,
39 }); 36 });
40 37
41 this.props.field.onDrop(file); 38 this.props.field.onDrop(file);
diff --git a/src/components/ui/Link.js b/src/components/ui/Link.js
index 7930d98b4..fd14b7018 100644
--- a/src/components/ui/Link.js
+++ b/src/components/ui/Link.js
@@ -48,7 +48,7 @@ export default @inject('stores') @observer class Link extends Component {
48 href={router.history.createHref(to)} 48 href={router.history.createHref(to)}
49 className={linkClasses} 49 className={linkClasses}
50 style={style} 50 style={style}
51 onClick={e => this.onClick(e)} 51 onClick={(e) => this.onClick(e)}
52 > 52 >
53 {children} 53 {children}
54 </a> 54 </a>
diff --git a/src/components/ui/Modal/styles.js b/src/components/ui/Modal/styles.js
index c2bebf9bb..f32c075ce 100644
--- a/src/components/ui/Modal/styles.js
+++ b/src/components/ui/Modal/styles.js
@@ -1,4 +1,4 @@
1export default theme => ({ 1export default (theme) => ({
2 component: { 2 component: {
3 zIndex: 500, 3 zIndex: 500,
4 position: 'absolute', 4 position: 'absolute',
diff --git a/src/components/ui/PremiumFeatureContainer/index.js b/src/components/ui/PremiumFeatureContainer/index.js
deleted file mode 100644
index 1e100f9d8..000000000
--- a/src/components/ui/PremiumFeatureContainer/index.js
+++ /dev/null
@@ -1,101 +0,0 @@
1import React, { Component } from 'react';
2import { inject, observer } from 'mobx-react';
3import PropTypes from 'prop-types';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { oneOrManyChildElements } from '../../../prop-types';
8
9import UserStore from '../../../stores/UserStore';
10
11import styles from './styles';
12import FeaturesStore from '../../../stores/FeaturesStore';
13import UIStore from '../../../stores/UIStore';
14
15const messages = defineMessages({
16 action: {
17 id: 'premiumFeature.button.upgradeAccount',
18 defaultMessage: '!!!Upgrade account',
19 },
20});
21
22@inject('stores', 'actions') @injectSheet(styles) @observer
23class PremiumFeatureContainer extends Component {
24 static propTypes = {
25 classes: PropTypes.object.isRequired,
26 condition: PropTypes.oneOfType([
27 PropTypes.bool,
28 PropTypes.func,
29 ]),
30 gaEventInfo: PropTypes.shape({
31 category: PropTypes.string.isRequired,
32 event: PropTypes.string.isRequired,
33 label: PropTypes.string,
34 }),
35 };
36
37 static defaultProps = {
38 condition: null,
39 gaEventInfo: null,
40 };
41
42 static contextTypes = {
43 intl: intlShape,
44 };
45
46 render() {
47 const {
48 classes,
49 children,
50 actions,
51 condition,
52 stores,
53 } = this.props;
54
55 const { intl } = this.context;
56
57 let showWrapper = !!condition;
58
59 if (condition === null) {
60 showWrapper = !stores.user.data.isPremium;
61 } else if (typeof condition === 'function') {
62 showWrapper = condition({
63 isPremium: stores.user.data.isPremium,
64 features: stores.features.features,
65 });
66 }
67
68 return showWrapper ? (
69 <div className={classes.container}>
70 <div className={classes.titleContainer}>
71 <p className={classes.title}>Premium Feature</p>
72 <button
73 className={classes.actionButton}
74 type="button"
75 onClick={() => {
76 actions.ui.openSettings({ path: 'user' });
77 }}
78 >
79 {intl.formatMessage(messages.action)}
80 </button>
81 </div>
82 <div className={classes.content}>
83 {children}
84 </div>
85 </div>
86 ) : children;
87 }
88}
89
90PremiumFeatureContainer.wrappedComponent.propTypes = {
91 children: oneOrManyChildElements.isRequired,
92 stores: PropTypes.shape({
93 user: PropTypes.instanceOf(UserStore).isRequired,
94 features: PropTypes.instanceOf(FeaturesStore).isRequired,
95 }).isRequired,
96 actions: PropTypes.shape({
97 ui: PropTypes.instanceOf(UIStore).isRequired,
98 }).isRequired,
99};
100
101export default PremiumFeatureContainer;
diff --git a/src/components/ui/PremiumFeatureContainer/styles.js b/src/components/ui/PremiumFeatureContainer/styles.js
deleted file mode 100644
index 41881e044..000000000
--- a/src/components/ui/PremiumFeatureContainer/styles.js
+++ /dev/null
@@ -1,34 +0,0 @@
1export default theme => ({
2 container: {
3 background: theme.colorSubscriptionContainerBackground,
4 border: theme.colorSubscriptionContainerBorder,
5 margin: [0, 0, 20, -20],
6 padding: 20,
7 'border-radius': theme.borderRadius,
8 pointerEvents: 'none',
9 height: 'auto',
10 },
11 titleContainer: {
12 display: 'flex',
13 },
14 title: {
15 'font-weight': 'bold',
16 color: theme.colorSubscriptionContainerTitle,
17 },
18 actionButton: {
19 background: theme.colorSubscriptionContainerActionButtonBackground,
20 color: theme.colorSubscriptionContainerActionButtonColor,
21 'margin-left': 'auto',
22 'border-radius': theme.borderRadiusSmall,
23 padding: [4, 8],
24 'font-size': 12,
25 pointerEvents: 'initial',
26 },
27 content: {
28 opacity: 0.5,
29 'margin-top': 20,
30 '& > :last-child': {
31 'margin-bottom': 0,
32 },
33 },
34});
diff --git a/src/components/ui/Radio.js b/src/components/ui/Radio.js
index ba13aca63..e77714eb7 100644
--- a/src/components/ui/Radio.js
+++ b/src/components/ui/Radio.js
@@ -54,7 +54,7 @@ export default @observer class Radio extends Component {
54 </label> 54 </label>
55 )} 55 )}
56 <div className="franz-form__radio-wrapper"> 56 <div className="franz-form__radio-wrapper">
57 {field.options.map(type => ( 57 {field.options.map((type) => (
58 <label 58 <label
59 key={type.value} 59 key={type.value}
60 htmlFor={`${field.id}-${type.value}`} 60 htmlFor={`${field.id}-${type.value}`}
diff --git a/src/components/ui/SearchInput.js b/src/components/ui/SearchInput.js
index 78d6aae8b..0b25734dd 100644
--- a/src/components/ui/SearchInput.js
+++ b/src/components/ui/SearchInput.js
@@ -96,7 +96,7 @@ export default @observer class SearchInput extends Component {
96 type="text" 96 type="text"
97 placeholder={placeholder} 97 placeholder={placeholder}
98 value={value} 98 value={value}
99 onChange={e => this.onChange(e)} 99 onChange={(e) => this.onChange(e)}
100 ref={(ref) => { this.input = ref; }} 100 ref={(ref) => { this.input = ref; }}
101 /> 101 />
102 </label> 102 </label>
diff --git a/src/components/ui/Select.js b/src/components/ui/Select.js
index b4511433c..e7a5eafa8 100644
--- a/src/components/ui/Select.js
+++ b/src/components/ui/Select.js
@@ -82,7 +82,7 @@ export default @observer class Select extends Component {
82 </label> 82 </label>
83 )} 83 )}
84 <select 84 <select
85 onChange={multiple ? e => this.multipleChange(e) : field.onChange} 85 onChange={multiple ? (e) => this.multipleChange(e) : field.onChange}
86 id={field.id} 86 id={field.id}
87 defaultValue={selected} 87 defaultValue={selected}
88 className="franz-form__select" 88 className="franz-form__select"
@@ -90,7 +90,7 @@ export default @observer class Select extends Component {
90 multiple={multiple} 90 multiple={multiple}
91 ref={this.element} 91 ref={this.element}
92 > 92 >
93 {field.options.map(type => ( 93 {field.options.map((type) => (
94 <option 94 <option
95 key={type.value} 95 key={type.value}
96 value={type.value} 96 value={type.value}
diff --git a/src/components/ui/ServiceIcon.js b/src/components/ui/ServiceIcon.js
index 0b9155a4e..b2dadeac3 100644
--- a/src/components/ui/ServiceIcon.js
+++ b/src/components/ui/ServiceIcon.js
@@ -6,7 +6,7 @@ import classnames from 'classnames';
6 6
7import ServiceModel from '../../models/Service'; 7import ServiceModel from '../../models/Service';
8 8
9const styles = theme => ({ 9const styles = (theme) => ({
10 root: { 10 root: {
11 height: 'auto', 11 height: 'auto',
12 }, 12 },
diff --git a/src/components/ui/Slider.js b/src/components/ui/Slider.js
index b00a6a3f8..f344449a0 100644
--- a/src/components/ui/Slider.js
+++ b/src/components/ui/Slider.js
@@ -53,7 +53,7 @@ export default @observer class Slider extends Component {
53 value={field.value} 53 value={field.value}
54 min="1" 54 min="1"
55 max="100" 55 max="100"
56 onChange={e => (!disabled ? this.onChange(e) : null)} 56 onChange={(e) => (!disabled ? this.onChange(e) : null)}
57 /> 57 />
58 </div> 58 </div>
59 59
diff --git a/src/components/ui/Tabs/TabItem.js b/src/components/ui/Tabs/TabItem.js
index 546b05a4e..d0ef4e798 100644
--- a/src/components/ui/Tabs/TabItem.js
+++ b/src/components/ui/Tabs/TabItem.js
@@ -1,17 +1,15 @@
1import React, { Component, Fragment } from 'react'; 1import React, { Component } from 'react';
2 2
3import { oneOrManyChildElements } from '../../../prop-types'; 3import { oneOrManyChildElements } from '../../../prop-types';
4 4
5export default class TabItem extends Component { 5export default class TabItem extends Component {
6 static propTypes = { 6 static propTypes = {
7 children: oneOrManyChildElements.isRequired, 7 children: oneOrManyChildElements.isRequired,
8 } 8 };
9 9
10 render() { 10 render() {
11 const { children } = this.props; 11 const { children } = this.props;
12 12
13 return ( 13 return <>{children}</>;
14 <>{children}</>
15 );
16 } 14 }
17} 15}
diff --git a/src/components/ui/Tabs/Tabs.js b/src/components/ui/Tabs/Tabs.js
index e68dc3a1d..56c76f215 100644
--- a/src/components/ui/Tabs/Tabs.js
+++ b/src/components/ui/Tabs/Tabs.js
@@ -28,7 +28,7 @@ class Tab extends Component {
28 28
29 render() { 29 render() {
30 const { children: childElements } = this.props; 30 const { children: childElements } = this.props;
31 const children = childElements.filter(c => !!c); 31 const children = childElements.filter((c) => !!c);
32 32
33 if (children.length === 1) { 33 if (children.length === 1) {
34 return <div>{children}</div>; 34 return <div>{children}</div>;
diff --git a/src/components/ui/Toggle.js b/src/components/ui/Toggle.js
index 78fb77cbe..14330e5c7 100644
--- a/src/components/ui/Toggle.js
+++ b/src/components/ui/Toggle.js
@@ -59,7 +59,7 @@ export default @observer class Toggle extends Component {
59 name={field.name} 59 name={field.name}
60 value={field.name} 60 value={field.name}
61 checked={field.value} 61 checked={field.value}
62 onChange={e => (!disabled ? this.onChange(e) : null)} 62 onChange={(e) => (!disabled ? this.onChange(e) : null)}
63 /> 63 />
64 </label> 64 </label>
65 {field.error && <div className={field.error}>{field.error}</div>} 65 {field.error && <div className={field.error}>{field.error}</div>}
diff --git a/src/components/ui/ToggleRaw.js b/src/components/ui/ToggleRaw.js
index dcaf664e1..4700127d4 100644
--- a/src/components/ui/ToggleRaw.js
+++ b/src/components/ui/ToggleRaw.js
@@ -64,7 +64,7 @@ export default @observer class ToggleRaw extends Component {
64 name={field.name} 64 name={field.name}
65 value={field.name} 65 value={field.name}
66 checked={field.value} 66 checked={field.value}
67 onChange={e => (!disabled ? this.onChange(e) : null)} 67 onChange={(e) => (!disabled ? this.onChange(e) : null)}
68 /> 68 />
69 </label> 69 </label>
70 {field.error && <div className={field.error}>{field.error}</div>} 70 {field.error && <div className={field.error}>{field.error}</div>}
diff --git a/src/components/ui/UpgradeButton/index.js b/src/components/ui/UpgradeButton/index.js
deleted file mode 100644
index eade46cfd..000000000
--- a/src/components/ui/UpgradeButton/index.js
+++ /dev/null
@@ -1,83 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5
6import { Button } from '@meetfranz/forms';
7
8import UserStore from '../../../stores/UserStore';
9import ActivateTrialButton from '../ActivateTrialButton';
10import UIStore from '../../../stores/UIStore';
11
12const messages = defineMessages({
13 upgradeToPro: {
14 id: 'global.upgradeButton.upgradeToPro',
15 defaultMessage: '!!!Upgrade to Franz Professional',
16 },
17});
18
19@inject('stores', 'actions') @observer
20class UpgradeButton extends Component {
21 static propTypes = {
22 // eslint-disable-next-line
23 classes: PropTypes.object.isRequired,
24 className: PropTypes.string,
25 gaEventInfo: PropTypes.shape({
26 category: PropTypes.string.isRequired,
27 event: PropTypes.string.isRequired,
28 label: PropTypes.string,
29 }),
30 requiresPro: PropTypes.bool,
31 };
32
33 static defaultProps = {
34 className: '',
35 gaEventInfo: null,
36 requiresPro: false,
37 }
38
39 static contextTypes = {
40 intl: intlShape,
41 };
42
43 handleCTAClick() {
44 const { actions } = this.props;
45
46 actions.ui.openSettings({ path: 'user' });
47 }
48
49 render() {
50 const { stores, requiresPro } = this.props;
51 const { intl } = this.context;
52
53 const { isPremium, isPersonal } = stores.user;
54
55 if (isPremium && isPersonal && requiresPro) {
56 return (
57 <Button
58 label={intl.formatMessage(messages.upgradeToPro)}
59 onClick={this.handleCTAClick.bind(this)}
60 className={this.props.className}
61 buttonType="inverted"
62 />
63 );
64 }
65
66 if (!isPremium) {
67 return <ActivateTrialButton {...this.props} />;
68 }
69
70 return null;
71 }
72}
73
74export default UpgradeButton;
75
76UpgradeButton.wrappedComponent.propTypes = {
77 stores: PropTypes.shape({
78 user: PropTypes.instanceOf(UserStore).isRequired,
79 }).isRequired,
80 actions: PropTypes.shape({
81 ui: PropTypes.instanceOf(UIStore).isRequired,
82 }).isRequired,
83};
diff --git a/src/components/ui/WebviewLoader/styles.js b/src/components/ui/WebviewLoader/styles.js
index dbd75db8a..5d58011fe 100644
--- a/src/components/ui/WebviewLoader/styles.js
+++ b/src/components/ui/WebviewLoader/styles.js
@@ -1,4 +1,4 @@
1export default theme => ({ 1export default (theme) => ({
2 component: { 2 component: {
3 background: theme.colorWebviewLoaderBackground, 3 background: theme.colorWebviewLoaderBackground,
4 padding: 20, 4 padding: 20,
diff --git a/src/components/util/ErrorBoundary/styles.js b/src/components/util/ErrorBoundary/styles.js
index 0960546ff..51b36fdf3 100644
--- a/src/components/util/ErrorBoundary/styles.js
+++ b/src/components/util/ErrorBoundary/styles.js
@@ -1,4 +1,4 @@
1export default theme => ({ 1export default (theme) => ({
2 component: { 2 component: {
3 display: 'flex', 3 display: 'flex',
4 width: '100%', 4 width: '100%',
diff --git a/src/config.js b/src/config.js
index 7762a8cae..aeaec1089 100644
--- a/src/config.js
+++ b/src/config.js
@@ -4,6 +4,8 @@ import ms from 'ms';
4 4
5export const CHECK_INTERVAL = ms('1h'); // How often should we perform checks 5export const CHECK_INTERVAL = ms('1h'); // How often should we perform checks
6 6
7export const LOCAL_HOSTNAME = 'localhost';
8export const LOCAL_PORT = 45569;
7export const LOCAL_API = 'http://localhost:3000'; 9export const LOCAL_API = 'http://localhost:3000';
8export const DEV_FRANZ_API = 'https://dev.franzinfra.com'; 10export const DEV_FRANZ_API = 'https://dev.franzinfra.com';
9 11
@@ -41,6 +43,17 @@ export const HIBERNATION_STRATEGIES = {
41 3600: 'Extremely Slow Hibernation (1hour)', 43 3600: 'Extremely Slow Hibernation (1hour)',
42}; 44};
43 45
46export const WAKE_UP_STRATEGIES = {
47 0: 'Never wake up',
48 10: 'Wake up after 10sec',
49 30: 'Wake up after 30sec',
50 60: 'Wake up after 1min',
51 300: 'Wake up after 5min',
52 600: 'Wake up after 10min',
53 1800: 'Wake up after 30min',
54 3600: 'Wake up after 1hour',
55};
56
44export const NAVIGATION_BAR_BEHAVIOURS = { 57export const NAVIGATION_BAR_BEHAVIOURS = {
45 custom: 'Show navigation bar on custom websites only', 58 custom: 'Show navigation bar on custom websites only',
46 always: 'Show navigation bar on all services', 59 always: 'Show navigation bar on all services',
@@ -120,18 +133,10 @@ export const ICON_SIZES = {
120export const iconSizeBias = 20; 133export const iconSizeBias = 20;
121 134
122export const DEFAULT_FEATURES_CONFIG = { 135export const DEFAULT_FEATURES_CONFIG = {
123 isSpellcheckerIncludedInCurrentPlan: true,
124 needToWaitToProceed: false,
125 needToWaitToProceedConfig: {
126 delayOffset: ms('1h'),
127 wait: ms('10s'),
128 },
129 isServiceProxyEnabled: false, 136 isServiceProxyEnabled: false,
130 isServiceProxyIncludedInCurrentPlan: true,
131 isAnnouncementsEnabled: true, 137 isAnnouncementsEnabled: true,
132 isWorkspaceIncludedInCurrentPlan: true,
133 isWorkspaceEnabled: false, 138 isWorkspaceEnabled: false,
134 isCommunityRecipesIncludedInCurrentPlan: true, 139 isTodosEnabled: true,
135}; 140};
136 141
137export const DEFAULT_WINDOW_OPTIONS = { 142export const DEFAULT_WINDOW_OPTIONS = {
@@ -166,32 +171,8 @@ export const ALLOWED_PROTOCOLS = [
166 'ferdi:', 171 'ferdi:',
167]; 172];
168 173
169export const PLANS = {
170 PERSONAL: 'personal',
171 PRO: 'pro',
172 LEGACY: 'legacy',
173 FREE: 'free',
174};
175
176export const PLANS_MAPPING = {
177 'franz-personal-monthly': PLANS.PERSONAL,
178 'franz-personal-yearly': PLANS.PERSONAL,
179 'franz-pro-monthly': PLANS.PRO,
180 'franz-pro-yearly': PLANS.PRO,
181 'franz-supporter-license': PLANS.LEGACY,
182 'franz-supporter-license-x1': PLANS.LEGACY,
183 'franz-supporter-license-x2': PLANS.LEGACY,
184 'franz-supporter-license-year': PLANS.LEGACY,
185 'franz-supporter-license-year-x1': PLANS.LEGACY,
186 'franz-supporter-license-year-x2': PLANS.LEGACY,
187 'franz-supporter-license-year-2019': PLANS.LEGACY,
188 free: PLANS.FREE,
189};
190
191export const DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED = false; 174export const DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED = false;
192 175
193export const DEFAULT_SERVICE_LIMIT = 3;
194
195export const DEFAULT_TODOS_WIDTH = 300; 176export const DEFAULT_TODOS_WIDTH = 300;
196export const TODOS_MIN_WIDTH = 200; 177export const TODOS_MIN_WIDTH = 200;
197export const DEFAULT_TODOS_VISIBLE = true; 178export const DEFAULT_TODOS_VISIBLE = true;
diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js
deleted file mode 100644
index 97bf1f6be..000000000
--- a/src/containers/auth/PricingScreen.js
+++ /dev/null
@@ -1,83 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { RouterStore } from 'mobx-react-router';
5
6import Pricing from '../../components/auth/Pricing';
7import UserStore from '../../stores/UserStore';
8
9import { globalError as globalErrorPropType } from '../../prop-types';
10import FeaturesStore from '../../stores/FeaturesStore';
11
12export default @inject('stores', 'actions') @observer class PricingScreen extends Component {
13 static propTypes = {
14 error: globalErrorPropType.isRequired,
15 };
16
17 async submit() {
18 const {
19 actions,
20 stores,
21 } = this.props;
22
23 const { activateTrialRequest } = stores.user;
24 const { defaultTrialPlan, canSkipTrial } = stores.features.anonymousFeatures;
25
26 if (!canSkipTrial) {
27 stores.router.push('/');
28 stores.user.hasCompletedSignup = true;
29 } else {
30 actions.user.activateTrial({ planId: defaultTrialPlan });
31 await activateTrialRequest._promise;
32
33 if (!activateTrialRequest.isError) {
34 stores.router.push('/');
35 stores.user.hasCompletedSignup = true;
36 }
37 }
38 }
39
40 render() {
41 const {
42 error,
43 stores,
44 } = this.props;
45
46 const { getUserInfoRequest, activateTrialRequest, data } = stores.user;
47 const { featuresRequest, features } = stores.features;
48
49 const { pricingConfig } = features;
50
51 let currency = '$';
52 let price = 5.99;
53 if (pricingConfig) {
54 ({ currency } = pricingConfig);
55 ({ price } = pricingConfig.plans.pro.yearly);
56 }
57
58 return (
59 <Pricing
60 onSubmit={this.submit.bind(this)}
61 isLoadingRequiredData={(getUserInfoRequest.isExecuting || !getUserInfoRequest.wasExecuted) || (featuresRequest.isExecuting || !featuresRequest.wasExecuted)}
62 isActivatingTrial={activateTrialRequest.isExecuting}
63 trialActivationError={activateTrialRequest.isError}
64 canSkipTrial={features.canSkipTrial}
65 error={error}
66 currency={currency}
67 price={price}
68 name={data.firstname}
69 />
70 );
71 }
72}
73
74PricingScreen.wrappedComponent.propTypes = {
75 actions: PropTypes.shape({
76 user: PropTypes.instanceOf(UserStore).isRequired,
77 }).isRequired,
78 stores: PropTypes.shape({
79 user: PropTypes.instanceOf(UserStore).isRequired,
80 router: PropTypes.instanceOf(RouterStore).isRequired,
81 features: PropTypes.instanceOf(FeaturesStore).isRequired,
82 }).isRequired,
83};
diff --git a/src/containers/auth/SetupAssistantScreen.js b/src/containers/auth/SetupAssistantScreen.js
index 2a8f2c010..d7036969a 100644
--- a/src/containers/auth/SetupAssistantScreen.js
+++ b/src/containers/auth/SetupAssistantScreen.js
@@ -4,14 +4,28 @@ import PropTypes from 'prop-types';
4import { inject, observer } from 'mobx-react'; 4import { inject, observer } from 'mobx-react';
5 5
6import { RouterStore } from 'mobx-react-router'; 6import { RouterStore } from 'mobx-react-router';
7import { DEFAULT_TODO_RECIPE_ID, DEFAULT_TODO_SERVICE_NAME } from '../../config'; 7import {
8 DEFAULT_TODO_RECIPE_ID,
9 DEFAULT_TODO_SERVICE_NAME,
10} from '../../config';
8import { sleep } from '../../helpers/async-helpers'; 11import { sleep } from '../../helpers/async-helpers';
9import SetupAssistant from '../../components/auth/SetupAssistant'; 12import SetupAssistant from '../../components/auth/SetupAssistant';
10import ServicesStore from '../../stores/ServicesStore'; 13import ServicesStore from '../../stores/ServicesStore';
11import RecipesStore from '../../stores/RecipesStore'; 14import RecipesStore from '../../stores/RecipesStore';
12import UserStore from '../../stores/UserStore'; 15import UserStore from '../../stores/UserStore';
13 16
14export default @inject('stores', 'actions') @observer class SetupAssistantScreen extends Component { 17export default
18@inject('stores', 'actions')
19@observer
20class SetupAssistantScreen extends Component {
21 constructor(props) {
22 super(props);
23 this.state = {
24 isSettingUpServices: false,
25 };
26 }
27
28 // TODO: Why are these hardcoded here? Do they need to conform to specific services in the packaged recipes? If so, its more important to fix this
15 services = { 29 services = {
16 whatsapp: { 30 whatsapp: {
17 name: 'WhatsApp', 31 name: 'WhatsApp',
@@ -49,21 +63,18 @@ export default @inject('stores', 'actions') @observer class SetupAssistantScreen
49 name: 'LinkedIn', 63 name: 'LinkedIn',
50 hasTeamId: false, 64 hasTeamId: false,
51 }, 65 },
52 } 66 };
53
54 state = {
55 isSettingUpServices: false,
56 }
57 67
58 async setupServices(serviceConfig) { 68 async setupServices(serviceConfig) {
59 const { stores: { services, router, user } } = this.props; 69 const {
60 console.log(serviceConfig); 70 stores: { services },
71 } = this.props;
61 72
62 this.setState({ 73 this.setState({
63 isSettingUpServices: true, 74 isSettingUpServices: true,
64 }); 75 });
65 76
66 // The store requests are not build for paralell requests so we need to finish one request after another 77 // The store requests are not build for parallel requests so we need to finish one request after another
67 for (const config of serviceConfig) { 78 for (const config of serviceConfig) {
68 const serviceData = { 79 const serviceData = {
69 name: this.services[config.id].name, 80 name: this.services[config.id].name,
@@ -96,10 +107,6 @@ export default @inject('stores', 'actions') @observer class SetupAssistantScreen
96 this.setState({ 107 this.setState({
97 isSettingUpServices: false, 108 isSettingUpServices: false,
98 }); 109 });
99
100 await sleep(100);
101
102 router.push(user.pricingRoute);
103 } 110 }
104 111
105 render() { 112 render() {
diff --git a/src/containers/auth/SignupScreen.js b/src/containers/auth/SignupScreen.js
index 42ee09f33..38c5dfb43 100644
--- a/src/containers/auth/SignupScreen.js
+++ b/src/containers/auth/SignupScreen.js
@@ -14,16 +14,7 @@ export default @inject('stores', 'actions') @observer class SignupScreen extends
14 }; 14 };
15 15
16 onSignup(values) { 16 onSignup(values) {
17 const { actions, stores } = this.props; 17 const { actions } = this.props;
18
19 const { canSkipTrial, defaultTrialPlan, pricingConfig } = stores.features.anonymousFeatures;
20
21 if (!canSkipTrial) {
22 Object.assign(values, {
23 plan: defaultTrialPlan,
24 currency: pricingConfig.currencyID,
25 });
26 }
27 18
28 actions.user.signup(values); 19 actions.user.signup(values);
29 } 20 }
@@ -33,7 +24,7 @@ export default @inject('stores', 'actions') @observer class SignupScreen extends
33 24
34 return ( 25 return (
35 <Signup 26 <Signup
36 onSubmit={values => this.onSignup(values)} 27 onSubmit={(values) => this.onSignup(values)}
37 isSubmitting={stores.user.signupRequest.isExecuting} 28 isSubmitting={stores.user.signupRequest.isExecuting}
38 loginRoute={stores.user.loginRoute} 29 loginRoute={stores.user.loginRoute}
39 changeServerRoute={stores.user.changeServerRoute} 30 changeServerRoute={stores.user.changeServerRoute}
diff --git a/src/containers/auth/WelcomeScreen.js b/src/containers/auth/WelcomeScreen.js
index 6f2d0eee6..bfcc880d0 100644
--- a/src/containers/auth/WelcomeScreen.js
+++ b/src/containers/auth/WelcomeScreen.js
@@ -15,7 +15,7 @@ export default @inject('stores', 'actions') @observer class LoginScreen extends
15 loginRoute={user.loginRoute} 15 loginRoute={user.loginRoute}
16 signupRoute={user.signupRoute} 16 signupRoute={user.signupRoute}
17 changeServerRoute={user.changeServerRoute} 17 changeServerRoute={user.changeServerRoute}
18 recipes={recipePreviews.featured} 18 recipes={recipePreviews.all}
19 /> 19 />
20 ); 20 );
21 } 21 }
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index 7a12aee83..32b1f1cf7 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -20,7 +20,6 @@ import Sidebar from '../../components/layout/Sidebar';
20import Services from '../../components/services/content/Services'; 20import Services from '../../components/services/content/Services';
21import AppLoader from '../../components/ui/AppLoader'; 21import AppLoader from '../../components/ui/AppLoader';
22 22
23import { state as delayAppState } from '../../features/delayApp';
24import { workspaceActions } from '../../features/workspaces/actions'; 23import { workspaceActions } from '../../features/workspaces/actions';
25import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer'; 24import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer';
26import { workspaceStore } from '../../features/workspaces'; 25import { workspaceStore } from '../../features/workspaces';
@@ -55,8 +54,11 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
55 reload, 54 reload,
56 toggleNotifications, 55 toggleNotifications,
57 toggleAudio, 56 toggleAudio,
57 toggleDarkMode,
58 deleteService, 58 deleteService,
59 updateService, 59 updateService,
60 hibernate,
61 awake,
60 } = this.props.actions.service; 62 } = this.props.actions.service;
61 63
62 const { hide } = this.props.actions.news; 64 const { hide } = this.props.actions.news;
@@ -91,10 +93,9 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
91 93
92 const workspacesDrawer = ( 94 const workspacesDrawer = (
93 <WorkspaceDrawer 95 <WorkspaceDrawer
94 getServicesForWorkspace={workspace => ( 96 getServicesForWorkspace={(workspace) => (
95 workspace ? workspaceStore.getWorkspaceServices(workspace).map(s => s.name) : services.all.map(s => s.name) 97 workspace ? workspaceStore.getWorkspaceServices(workspace).map((s) => s.name) : services.all.map((s) => s.name)
96 )} 98 )}
97 onUpgradeAccountClick={() => openSettings({ path: 'user' })}
98 /> 99 />
99 ); 100 );
100 101
@@ -109,8 +110,11 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
109 reload={reload} 110 reload={reload}
110 toggleNotifications={toggleNotifications} 111 toggleNotifications={toggleNotifications}
111 toggleAudio={toggleAudio} 112 toggleAudio={toggleAudio}
113 toggleDarkMode={toggleDarkMode}
112 deleteService={deleteService} 114 deleteService={deleteService}
113 updateService={updateService} 115 updateService={updateService}
116 hibernateService={hibernate}
117 wakeUpService={awake}
114 toggleMuteApp={toggleMuteApp} 118 toggleMuteApp={toggleMuteApp}
115 toggleWorkspaceDrawer={workspaceActions.toggleWorkspaceDrawer} 119 toggleWorkspaceDrawer={workspaceActions.toggleWorkspaceDrawer}
116 isWorkspaceDrawerOpen={workspaceStore.isWorkspaceDrawerOpen} 120 isWorkspaceDrawerOpen={workspaceStore.isWorkspaceDrawerOpen}
@@ -131,7 +135,6 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
131 openSettings={openSettings} 135 openSettings={openSettings}
132 update={updateService} 136 update={updateService}
133 userHasCompletedSignup={user.hasCompletedSignup} 137 userHasCompletedSignup={user.hasCompletedSignup}
134 hasActivatedTrial={user.hasActivatedTrial}
135 isSpellcheckerEnabled={settings.app.enableSpellchecking} 138 isSpellcheckerEnabled={settings.app.enableSpellchecking}
136 /> 139 />
137 ); 140 );
@@ -157,8 +160,6 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
157 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful} 160 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful}
158 retryRequiredRequests={retryRequiredRequests} 161 retryRequiredRequests={retryRequiredRequests}
159 areRequiredRequestsLoading={requests.areRequiredRequestsLoading} 162 areRequiredRequestsLoading={requests.areRequiredRequestsLoading}
160 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible}
161 hasActivatedTrial={user.hasActivatedTrial}
162 > 163 >
163 {React.Children.count(children) > 0 ? children : null} 164 {React.Children.count(children) > 0 ? children : null}
164 </AppLayout> 165 </AppLayout>
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index db3b2a4a7..8d92b01be 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -2,7 +2,6 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react'; 3import { inject, observer } from 'mobx-react';
4 4
5import PaymentStore from '../../stores/PaymentStore';
6import UserStore from '../../stores/UserStore'; 5import UserStore from '../../stores/UserStore';
7import AppStore from '../../stores/AppStore'; 6import AppStore from '../../stores/AppStore';
8import FeaturesStore from '../../stores/FeaturesStore'; 7import FeaturesStore from '../../stores/FeaturesStore';
@@ -24,10 +23,9 @@ class AccountScreen extends Component {
24 } 23 }
25 24
26 reloadData() { 25 reloadData() {
27 const { user, payment } = this.props.stores; 26 const { user } = this.props.stores;
28 27
29 user.getUserInfoRequest.reload(); 28 user.getUserInfoRequest.reload();
30 payment.plansRequest.reload();
31 } 29 }
32 30
33 handleWebsiteLink(route) { 31 handleWebsiteLink(route) {
@@ -48,28 +46,17 @@ class AccountScreen extends Component {
48 } 46 }
49 47
50 render() { 48 render() {
51 const { 49 const { user, settings } = this.props.stores;
52 user, 50 const { user: userActions } = this.props.actions;
53 payment,
54 features,
55 settings,
56 } = this.props.stores;
57 const { user: userActions, payment: paymentActions } = this.props.actions;
58 51
59 const isLoadingUserInfo = user.getUserInfoRequest.isExecuting; 52 const isLoadingUserInfo = user.getUserInfoRequest.isExecuting;
60 const isLoadingPlans = payment.plansRequest.isExecuting;
61
62 const { upgradeAccount } = paymentActions;
63 53
64 return ( 54 return (
65 <ErrorBoundary> 55 <ErrorBoundary>
66 <AccountDashboard 56 <AccountDashboard
67 server={settings.all.app.server} 57 server={settings.all.app.server}
68 user={user.data} 58 user={user.data}
69 isPremiumOverrideUser={user.isPremiumOverride}
70 isProUser={user.isPro}
71 isLoading={isLoadingUserInfo} 59 isLoading={isLoadingUserInfo}
72 isLoadingPlans={isLoadingPlans}
73 userInfoRequestFailed={ 60 userInfoRequestFailed={
74 user.getUserInfoRequest.wasExecuted 61 user.getUserInfoRequest.wasExecuted
75 && user.getUserInfoRequest.isError 62 && user.getUserInfoRequest.isError
@@ -83,10 +70,6 @@ class AccountScreen extends Component {
83 && !user.deleteAccountRequest.isError 70 && !user.deleteAccountRequest.isError
84 } 71 }
85 openEditAccount={() => this.handleWebsiteLink('/user/profile')} 72 openEditAccount={() => this.handleWebsiteLink('/user/profile')}
86 upgradeToPro={() => upgradeAccount({
87 planId: features.features.pricingConfig.plans.pro.yearly.id,
88 })}
89 openBilling={() => this.handleWebsiteLink('/user/billing')}
90 openInvoices={() => this.handleWebsiteLink('/user/invoices')} 73 openInvoices={() => this.handleWebsiteLink('/user/invoices')}
91 /> 74 />
92 </ErrorBoundary> 75 </ErrorBoundary>
@@ -98,12 +81,10 @@ AccountScreen.wrappedComponent.propTypes = {
98 stores: PropTypes.shape({ 81 stores: PropTypes.shape({
99 user: PropTypes.instanceOf(UserStore).isRequired, 82 user: PropTypes.instanceOf(UserStore).isRequired,
100 features: PropTypes.instanceOf(FeaturesStore).isRequired, 83 features: PropTypes.instanceOf(FeaturesStore).isRequired,
101 payment: PropTypes.instanceOf(PaymentStore).isRequired,
102 settings: PropTypes.instanceOf(SettingsStore).isRequired, 84 settings: PropTypes.instanceOf(SettingsStore).isRequired,
103 app: PropTypes.instanceOf(AppStore).isRequired, 85 app: PropTypes.instanceOf(AppStore).isRequired,
104 }).isRequired, 86 }).isRequired,
105 actions: PropTypes.shape({ 87 actions: PropTypes.shape({
106 payment: PropTypes.instanceOf(PaymentStore).isRequired,
107 app: PropTypes.instanceOf(AppStore).isRequired, 88 app: PropTypes.instanceOf(AppStore).isRequired,
108 user: PropTypes.instanceOf(UserStore).isRequired, 89 user: PropTypes.instanceOf(UserStore).isRequired,
109 }).isRequired, 90 }).isRequired,
diff --git a/src/containers/settings/EditServiceScreen.js b/src/containers/settings/EditServiceScreen.js
index ddf2d2d25..c880e97ae 100644
--- a/src/containers/settings/EditServiceScreen.js
+++ b/src/containers/settings/EditServiceScreen.js
@@ -19,7 +19,6 @@ import { required, url, oneRequired } from '../../helpers/validation-helpers';
19import { getSelectOptions } from '../../helpers/i18n-helpers'; 19import { getSelectOptions } from '../../helpers/i18n-helpers';
20 20
21import { config as proxyFeature } from '../../features/serviceProxy'; 21import { config as proxyFeature } from '../../features/serviceProxy';
22import { config as spellcheckerFeature } from '../../features/spellchecker';
23 22
24import { SPELLCHECKER_LOCALES } from '../../i18n/languages'; 23import { SPELLCHECKER_LOCALES } from '../../i18n/languages';
25 24
@@ -346,7 +345,7 @@ export default @inject('stores', 'actions') @observer class EditServiceScreen ex
346 345
347 render() { 346 render() {
348 const { 347 const {
349 recipes, services, user, settings, 348 recipes, services, user,
350 } = this.props.stores; 349 } = this.props.stores;
351 const { action } = this.props.router.params; 350 const { action } = this.props.router.params;
352 351
@@ -395,13 +394,10 @@ export default @inject('stores', 'actions') @observer class EditServiceScreen ex
395 status={services.actionStatus} 394 status={services.actionStatus}
396 isSaving={services.updateServiceRequest.isExecuting || services.createServiceRequest.isExecuting} 395 isSaving={services.updateServiceRequest.isExecuting || services.createServiceRequest.isExecuting}
397 isDeleting={services.deleteServiceRequest.isExecuting} 396 isDeleting={services.deleteServiceRequest.isExecuting}
398 onSubmit={d => this.onSubmit(d)} 397 onSubmit={(d) => this.onSubmit(d)}
399 onDelete={() => this.deleteService()} 398 onDelete={() => this.deleteService()}
400 openRecipeFile={file => this.openRecipeFile(file)} 399 openRecipeFile={(file) => this.openRecipeFile(file)}
401 isProxyFeatureEnabled={proxyFeature.isEnabled} 400 isProxyFeatureEnabled={proxyFeature.isEnabled}
402 isServiceProxyIncludedInCurrentPlan={proxyFeature.isIncludedInCurrentPlan}
403 isSpellcheckerIncludedInCurrentPlan={spellcheckerFeature.isIncludedInCurrentPlan}
404 isHibernationFeatureActive={settings.app.hibernate}
405 /> 401 />
406 </ErrorBoundary> 402 </ErrorBoundary>
407 ); 403 );
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index d601e03d4..0d718489a 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -11,10 +11,9 @@ import Form from '../../lib/Form';
11import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages'; 11import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages';
12import { 12import {
13 HIBERNATION_STRATEGIES, SIDEBAR_WIDTH, ICON_SIZES, NAVIGATION_BAR_BEHAVIOURS, SEARCH_ENGINE_NAMES, TODO_APPS, 13 HIBERNATION_STRATEGIES, SIDEBAR_WIDTH, ICON_SIZES, NAVIGATION_BAR_BEHAVIOURS, SEARCH_ENGINE_NAMES, TODO_APPS,
14 DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED, DEFAULT_IS_FEATURE_ENABLED_BY_USER, 14 DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED, DEFAULT_IS_FEATURE_ENABLED_BY_USER, WAKE_UP_STRATEGIES,
15} from '../../config'; 15} from '../../config';
16import { DEFAULT_APP_SETTINGS, isMac } from '../../environment'; 16import { DEFAULT_APP_SETTINGS, isMac } from '../../environment';
17import { config as spellcheckerConfig } from '../../features/spellchecker';
18 17
19import { getSelectOptions } from '../../helpers/i18n-helpers'; 18import { getSelectOptions } from '../../helpers/i18n-helpers';
20import { hash } from '../../helpers/password-helpers'; 19import { hash } from '../../helpers/password-helpers';
@@ -27,6 +26,8 @@ import globalMessages from '../../i18n/globalMessages';
27import WorkspacesStore from '../../features/workspaces/store'; 26import WorkspacesStore from '../../features/workspaces/store';
28import ServicesStore from '../../stores/ServicesStore'; 27import ServicesStore from '../../stores/ServicesStore';
29 28
29const debug = require('debug')('Ferdi:EditSettingsScreen');
30
30const messages = defineMessages({ 31const messages = defineMessages({
31 autoLaunchOnStart: { 32 autoLaunchOnStart: {
32 id: 'settings.app.form.autoLaunchOnStart', 33 id: 'settings.app.form.autoLaunchOnStart',
@@ -88,10 +89,6 @@ const messages = defineMessages({
88 id: 'settings.app.form.sentry', 89 id: 'settings.app.form.sentry',
89 defaultMessage: '!!!Send telemetry data', 90 defaultMessage: '!!!Send telemetry data',
90 }, 91 },
91 hibernate: {
92 id: 'settings.app.form.hibernate',
93 defaultMessage: '!!!Enable service hibernation',
94 },
95 hibernateOnStartup: { 92 hibernateOnStartup: {
96 id: 'settings.app.form.hibernateOnStartup', 93 id: 'settings.app.form.hibernateOnStartup',
97 defaultMessage: '!!!Keep services in hibernation on startup', 94 defaultMessage: '!!!Keep services in hibernation on startup',
@@ -100,6 +97,10 @@ const messages = defineMessages({
100 id: 'settings.app.form.hibernationStrategy', 97 id: 'settings.app.form.hibernationStrategy',
101 defaultMessage: '!!!Hibernation strategy', 98 defaultMessage: '!!!Hibernation strategy',
102 }, 99 },
100 wakeUpStrategy: {
101 id: 'settings.app.form.wakeUpStrategy',
102 defaultMessage: '!!!Wake up strategy',
103 },
103 predefinedTodoServer: { 104 predefinedTodoServer: {
104 id: 'settings.app.form.predefinedTodoServer', 105 id: 'settings.app.form.predefinedTodoServer',
105 defaultMessage: '!!!Todo Server', 106 defaultMessage: '!!!Todo Server',
@@ -242,6 +243,8 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
242 openInBackground: settingsData.autoLaunchInBackground, 243 openInBackground: settingsData.autoLaunchInBackground,
243 }); 244 });
244 245
246 debug(`Updating settings store with data: ${settingsData}`);
247
245 settings.update({ 248 settings.update({
246 type: 'app', 249 type: 'app',
247 data: { 250 data: {
@@ -257,9 +260,9 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
257 navigationBarBehaviour: settingsData.navigationBarBehaviour, 260 navigationBarBehaviour: settingsData.navigationBarBehaviour,
258 searchEngine: settingsData.searchEngine, 261 searchEngine: settingsData.searchEngine,
259 sentry: settingsData.sentry, 262 sentry: settingsData.sentry,
260 hibernate: settingsData.hibernate,
261 hibernateOnStartup: settingsData.hibernateOnStartup, 263 hibernateOnStartup: settingsData.hibernateOnStartup,
262 hibernationStrategy: settingsData.hibernationStrategy, 264 hibernationStrategy: settingsData.hibernationStrategy,
265 wakeUpStrategy: settingsData.wakeUpStrategy,
263 predefinedTodoServer: settingsData.predefinedTodoServer, 266 predefinedTodoServer: settingsData.predefinedTodoServer,
264 customTodoServer: settingsData.customTodoServer, 267 customTodoServer: settingsData.customTodoServer,
265 lockingFeatureEnabled: settingsData.lockingFeatureEnabled, 268 lockingFeatureEnabled: settingsData.lockingFeatureEnabled,
@@ -339,6 +342,11 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
339 sort: false, 342 sort: false,
340 }); 343 });
341 344
345 const wakeUpStrategies = getSelectOptions({
346 locales: WAKE_UP_STRATEGIES,
347 sort: false,
348 });
349
342 const todoApp = getSelectOptions({ 350 const todoApp = getSelectOptions({
343 locales: TODO_APPS, 351 locales: TODO_APPS,
344 sort: false, 352 sort: false,
@@ -433,11 +441,6 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
433 value: settings.all.app.sentry, 441 value: settings.all.app.sentry,
434 default: DEFAULT_APP_SETTINGS.sentry, 442 default: DEFAULT_APP_SETTINGS.sentry,
435 }, 443 },
436 hibernate: {
437 label: intl.formatMessage(messages.hibernate),
438 value: settings.all.app.hibernate,
439 default: DEFAULT_APP_SETTINGS.hibernate,
440 },
441 hibernateOnStartup: { 444 hibernateOnStartup: {
442 label: intl.formatMessage(messages.hibernateOnStartup), 445 label: intl.formatMessage(messages.hibernateOnStartup),
443 value: settings.all.app.hibernateOnStartup, 446 value: settings.all.app.hibernateOnStartup,
@@ -449,6 +452,12 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
449 options: hibernationStrategies, 452 options: hibernationStrategies,
450 default: DEFAULT_APP_SETTINGS.hibernationStrategy, 453 default: DEFAULT_APP_SETTINGS.hibernationStrategy,
451 }, 454 },
455 wakeUpStrategy: {
456 label: intl.formatMessage(messages.wakeUpStrategy),
457 value: settings.all.app.wakeUpStrategy,
458 options: wakeUpStrategies,
459 default: DEFAULT_APP_SETTINGS.wakeUpStrategy,
460 },
452 predefinedTodoServer: { 461 predefinedTodoServer: {
453 label: intl.formatMessage(messages.predefinedTodoServer), 462 label: intl.formatMessage(messages.predefinedTodoServer),
454 value: settings.all.app.predefinedTodoServer, 463 value: settings.all.app.predefinedTodoServer,
@@ -516,8 +525,8 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
516 }, 525 },
517 enableSpellchecking: { 526 enableSpellchecking: {
518 label: intl.formatMessage(messages.enableSpellchecking), 527 label: intl.formatMessage(messages.enableSpellchecking),
519 value: !this.props.stores.user.data.isPremium && !spellcheckerConfig.isIncludedInCurrentPlan ? false : settings.all.app.enableSpellchecking, 528 value: settings.all.app.enableSpellchecking,
520 default: !this.props.stores.user.data.isPremium && !spellcheckerConfig.isIncludedInCurrentPlan ? false : DEFAULT_APP_SETTINGS.enableSpellchecking, 529 default: DEFAULT_APP_SETTINGS.enableSpellchecking,
521 }, 530 },
522 spellcheckerLanguage: { 531 spellcheckerLanguage: {
523 label: intl.formatMessage(globalMessages.spellcheckerLanguage), 532 label: intl.formatMessage(globalMessages.spellcheckerLanguage),
@@ -646,16 +655,14 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
646 isUpdateAvailable={updateStatus === updateStatusTypes.AVAILABLE} 655 isUpdateAvailable={updateStatus === updateStatusTypes.AVAILABLE}
647 noUpdateAvailable={updateStatus === updateStatusTypes.NOT_AVAILABLE} 656 noUpdateAvailable={updateStatus === updateStatusTypes.NOT_AVAILABLE}
648 updateIsReadyToInstall={updateStatus === updateStatusTypes.DOWNLOADED} 657 updateIsReadyToInstall={updateStatus === updateStatusTypes.DOWNLOADED}
649 onSubmit={d => this.onSubmit(d)} 658 onSubmit={(d) => this.onSubmit(d)}
650 getCacheSize={() => app.cacheSize} 659 getCacheSize={() => app.cacheSize}
651 isClearingAllCache={isClearingAllCache} 660 isClearingAllCache={isClearingAllCache}
652 onClearAllCache={clearAllCache} 661 onClearAllCache={clearAllCache}
653 isSpellcheckerIncludedInCurrentPlan={spellcheckerConfig.isIncludedInCurrentPlan}
654 isTodosEnabled={todos.isFeatureActive} 662 isTodosEnabled={todos.isFeatureActive}
655 isWorkspaceEnabled={workspaces.isFeatureActive} 663 isWorkspaceEnabled={workspaces.isFeatureActive}
656 lockingFeatureEnabled={lockingFeatureEnabled} 664 lockingFeatureEnabled={lockingFeatureEnabled}
657 automaticUpdates={this.props.stores.settings.app.automaticUpdates} 665 automaticUpdates={this.props.stores.settings.app.automaticUpdates}
658 hibernationEnabled={this.props.stores.settings.app.hibernate}
659 isDarkmodeEnabled={this.props.stores.settings.app.darkMode} 666 isDarkmodeEnabled={this.props.stores.settings.app.darkMode}
660 isAdaptableDarkModeEnabled={this.props.stores.settings.app.adaptableDarkMode} 667 isAdaptableDarkModeEnabled={this.props.stores.settings.app.adaptableDarkMode}
661 isTodosActivated={this.props.stores.todos.isFeatureEnabledByUser} 668 isTodosActivated={this.props.stores.todos.isFeatureEnabledByUser}
diff --git a/src/containers/settings/EditUserScreen.js b/src/containers/settings/EditUserScreen.js
index 8e93164de..820b5e4d3 100644
--- a/src/containers/settings/EditUserScreen.js
+++ b/src/containers/settings/EditUserScreen.js
@@ -141,7 +141,7 @@ export default @inject('stores', 'actions') @observer class EditUserScreen exten
141 status={user.actionStatus} 141 status={user.actionStatus}
142 form={form} 142 form={form}
143 isSaving={user.updateUserInfoRequest.isExecuting} 143 isSaving={user.updateUserInfoRequest.isExecuting}
144 onSubmit={d => this.onSubmit(d)} 144 onSubmit={(d) => this.onSubmit(d)}
145 /> 145 />
146 </ErrorBoundary> 146 </ErrorBoundary>
147 ); 147 );
diff --git a/src/containers/settings/RecipesScreen.js b/src/containers/settings/RecipesScreen.js
index f12f67b1f..52bf31383 100644
--- a/src/containers/settings/RecipesScreen.js
+++ b/src/containers/settings/RecipesScreen.js
@@ -1,11 +1,9 @@
1import { shell } from 'electron'; 1import { shell } from 'electron';
2import { app } from '@electron/remote'; 2import { ensureDirSync, readJsonSync } from 'fs-extra';
3import fs from 'fs-extra';
4import React, { Component } from 'react'; 3import React, { Component } from 'react';
5import PropTypes from 'prop-types'; 4import PropTypes from 'prop-types';
6import { autorun } from 'mobx'; 5import { autorun } from 'mobx';
7import { inject, observer } from 'mobx-react'; 6import { inject, observer } from 'mobx-react';
8import path from 'path';
9 7
10import RecipePreviewsStore from '../../stores/RecipePreviewsStore'; 8import RecipePreviewsStore from '../../stores/RecipePreviewsStore';
11import RecipeStore from '../../stores/RecipesStore'; 9import RecipeStore from '../../stores/RecipesStore';
@@ -15,7 +13,7 @@ import UserStore from '../../stores/UserStore';
15import RecipesDashboard from '../../components/settings/recipes/RecipesDashboard'; 13import RecipesDashboard from '../../components/settings/recipes/RecipesDashboard';
16import ErrorBoundary from '../../components/util/ErrorBoundary'; 14import ErrorBoundary from '../../components/util/ErrorBoundary';
17import { CUSTOM_WEBSITE_RECIPE_ID, FRANZ_DEV_DOCS } from '../../config'; 15import { CUSTOM_WEBSITE_RECIPE_ID, FRANZ_DEV_DOCS } from '../../config';
18import { RECIPES_PATH } from '../../environment'; 16import { asarRecipesPath, userDataRecipesPath } from '../../environment';
19import { communityRecipesStore } from '../../features/communityRecipes'; 17import { communityRecipesStore } from '../../features/communityRecipes';
20import RecipePreview from '../../models/RecipePreview'; 18import RecipePreview from '../../models/RecipePreview';
21import AppStore from '../../stores/AppStore'; 19import AppStore from '../../stores/AppStore';
@@ -45,18 +43,16 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
45 constructor(props) { 43 constructor(props) {
46 super(props); 44 super(props);
47 45
48 this.customRecipes = fs.readJsonSync(path.join(RECIPES_PATH, 'all.json')); 46 this.customRecipes = readJsonSync(asarRecipesPath('all.json'));
49 } 47 }
50 48
51 componentDidMount() { 49 componentDidMount() {
52 this.autorunDisposer = autorun(() => { 50 this.autorunDisposer = autorun(() => {
53 const { filter } = this.props.params; 51 const { filter } = { filter: 'all', ...this.props.params };
54 const { currentFilter } = this.state; 52 const { currentFilter } = this.state;
55 53
56 if (filter === 'all' && currentFilter !== 'all') { 54 if (filter === 'all' && currentFilter !== 'all') {
57 this.setState({ currentFilter: 'all' }); 55 this.setState({ currentFilter: 'all' });
58 } else if (filter === 'featured' && currentFilter !== 'featured') {
59 this.setState({ currentFilter: 'featured' });
60 } else if (filter === 'dev' && currentFilter !== 'dev') { 56 } else if (filter === 'dev' && currentFilter !== 'dev') {
61 this.setState({ currentFilter: 'dev' }); 57 this.setState({ currentFilter: 'dev' });
62 } 58 }
@@ -82,7 +78,7 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
82 return recipes 78 return recipes
83 // Filter out duplicate recipes 79 // Filter out duplicate recipes
84 .filter((recipe, index, self) => { 80 .filter((recipe, index, self) => {
85 const ids = self.map(rec => rec.id); 81 const ids = self.map((rec) => rec.id);
86 return ids.indexOf(recipe.id) === index; 82 return ids.indexOf(recipe.id) === index;
87 83
88 // Sort alphabetically 84 // Sort alphabetically
@@ -95,7 +91,7 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
95 91
96 // Create an array of RecipePreviews from an array of recipe objects 92 // Create an array of RecipePreviews from an array of recipe objects
97 createPreviews(recipes) { 93 createPreviews(recipes) {
98 return recipes.map(recipe => new RecipePreview(recipe)); 94 return recipes.map((recipe) => new RecipePreview(recipe));
99 } 95 }
100 96
101 resetSearch() { 97 resetSearch() {
@@ -107,7 +103,6 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
107 recipePreviews, 103 recipePreviews,
108 recipes, 104 recipes,
109 services, 105 services,
110 user,
111 } = this.props.stores; 106 } = this.props.stores;
112 107
113 const { 108 const {
@@ -115,7 +110,7 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
115 service: serviceActions, 110 service: serviceActions,
116 } = this.props.actions; 111 } = this.props.actions;
117 112
118 const { filter } = this.props.params; 113 const { filter } = { filter: 'all', ...this.props.params };
119 let recipeFilter; 114 let recipeFilter;
120 115
121 if (filter === 'all') { 116 if (filter === 'all') {
@@ -125,8 +120,6 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
125 ]); 120 ]);
126 } else if (filter === 'dev') { 121 } else if (filter === 'dev') {
127 recipeFilter = communityRecipesStore.communityRecipes; 122 recipeFilter = communityRecipesStore.communityRecipes;
128 } else {
129 recipeFilter = recipePreviews.featured;
130 } 123 }
131 124
132 const allRecipes = this.state.needle ? this.prepareRecipes([ 125 const allRecipes = this.state.needle ? this.prepareRecipes([
@@ -135,18 +128,17 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
135 // All search recipes from local recipes 128 // All search recipes from local recipes
136 ...this.createPreviews( 129 ...this.createPreviews(
137 this.customRecipes 130 this.customRecipes
138 .filter(service => service.name.toLowerCase().includes(this.state.needle.toLowerCase())), 131 .filter((service) => service.name.toLowerCase().includes(this.state.needle.toLowerCase()) || (service.aliases || []).some(alias => alias.toLowerCase().includes(this.state.needle.toLowerCase()))),
139 ), 132 ),
140 ]) : recipeFilter; 133 ]) : recipeFilter;
141 134
142 const customWebsiteRecipe = recipePreviews.all.find(service => service.id === CUSTOM_WEBSITE_RECIPE_ID); 135 const customWebsiteRecipe = recipePreviews.all.find((service) => service.id === CUSTOM_WEBSITE_RECIPE_ID);
143 136
144 const isLoading = recipePreviews.featuredRecipePreviewsRequest.isExecuting 137 const isLoading = recipePreviews.allRecipePreviewsRequest.isExecuting
145 || recipePreviews.allRecipePreviewsRequest.isExecuting
146 || recipes.installRecipeRequest.isExecuting 138 || recipes.installRecipeRequest.isExecuting
147 || recipePreviews.searchRecipePreviewsRequest.isExecuting; 139 || recipePreviews.searchRecipePreviewsRequest.isExecuting;
148 140
149 const recipeDirectory = path.join(app.getPath('userData'), 'recipes', 'dev'); 141 const recipeDirectory = userDataRecipesPath('dev');
150 142
151 return ( 143 return (
152 <ErrorBoundary> 144 <ErrorBoundary>
@@ -155,24 +147,20 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
155 customWebsiteRecipe={customWebsiteRecipe} 147 customWebsiteRecipe={customWebsiteRecipe}
156 isLoading={isLoading} 148 isLoading={isLoading}
157 addedServiceCount={services.all.length} 149 addedServiceCount={services.all.length}
158 isPremium={user.data.isPremium}
159 hasLoadedRecipes={recipePreviews.featuredRecipePreviewsRequest.wasExecuted}
160 showAddServiceInterface={serviceActions.showAddServiceInterface} 150 showAddServiceInterface={serviceActions.showAddServiceInterface}
161 searchRecipes={e => this.searchRecipes(e)} 151 searchRecipes={(e) => this.searchRecipes(e)}
162 resetSearch={() => this.resetSearch()} 152 resetSearch={() => this.resetSearch()}
163 searchNeedle={this.state.needle} 153 searchNeedle={this.state.needle}
164 serviceStatus={services.actionStatus} 154 serviceStatus={services.actionStatus}
165 recipeFilter={filter} 155 recipeFilter={filter}
166 recipeDirectory={recipeDirectory} 156 recipeDirectory={recipeDirectory}
167 openRecipeDirectory={async () => { 157 openRecipeDirectory={async () => {
168 await fs.ensureDir(recipeDirectory); 158 ensureDirSync(recipeDirectory);
169 shell.openExternal(`file://${recipeDirectory}`); 159 shell.openExternal(`file://${recipeDirectory}`);
170 }} 160 }}
171 openDevDocs={() => { 161 openDevDocs={() => {
172 appActions.openExternalUrl({ url: FRANZ_DEV_DOCS }); 162 appActions.openExternalUrl({ url: FRANZ_DEV_DOCS });
173 }} 163 }}
174 isCommunityRecipesIncludedInCurrentPlan={communityRecipesStore.isCommunityRecipesIncludedInCurrentPlan}
175 isUserPremiumUser={user.isPremium}
176 /> 164 />
177 </ErrorBoundary> 165 </ErrorBoundary>
178 ); 166 );
diff --git a/src/containers/settings/TeamScreen.js b/src/containers/settings/TeamScreen.js
index a627a047a..10c2e36ef 100644
--- a/src/containers/settings/TeamScreen.js
+++ b/src/containers/settings/TeamScreen.js
@@ -9,7 +9,6 @@ import SettingsStore from '../../stores/SettingsStore';
9import TeamDashboard from '../../components/settings/team/TeamDashboard'; 9import TeamDashboard from '../../components/settings/team/TeamDashboard';
10import ErrorBoundary from '../../components/util/ErrorBoundary'; 10import ErrorBoundary from '../../components/util/ErrorBoundary';
11import { DEV_API_FRANZ_WEBSITE } from '../../config'; 11import { DEV_API_FRANZ_WEBSITE } from '../../config';
12import PaymentStore from '../../stores/PaymentStore';
13 12
14export default @inject('stores', 'actions') @observer class TeamScreen extends Component { 13export default @inject('stores', 'actions') @observer class TeamScreen extends Component {
15 handleWebsiteLink(route) { 14 handleWebsiteLink(route) {
@@ -33,7 +32,6 @@ export default @inject('stores', 'actions') @observer class TeamScreen extends C
33 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError} 32 userInfoRequestFailed={user.getUserInfoRequest.wasExecuted && user.getUserInfoRequest.isError}
34 retryUserInfoRequest={() => this.reloadData()} 33 retryUserInfoRequest={() => this.reloadData()}
35 openTeamManagement={() => this.handleWebsiteLink('/user/team')} 34 openTeamManagement={() => this.handleWebsiteLink('/user/team')}
36 isProUser={user.isPro}
37 server={server} 35 server={server}
38 /> 36 />
39 </ErrorBoundary> 37 </ErrorBoundary>
@@ -48,7 +46,6 @@ TeamScreen.wrappedComponent.propTypes = {
48 settings: PropTypes.instanceOf(SettingsStore).isRequired, 46 settings: PropTypes.instanceOf(SettingsStore).isRequired,
49 }).isRequired, 47 }).isRequired,
50 actions: PropTypes.shape({ 48 actions: PropTypes.shape({
51 payment: PropTypes.instanceOf(PaymentStore).isRequired,
52 app: PropTypes.instanceOf(AppStore).isRequired, 49 app: PropTypes.instanceOf(AppStore).isRequired,
53 user: PropTypes.instanceOf(UserStore).isRequired, 50 user: PropTypes.instanceOf(UserStore).isRequired,
54 }).isRequired, 51 }).isRequired,
diff --git a/src/containers/subscription/SubscriptionFormScreen.js b/src/containers/subscription/SubscriptionFormScreen.js
deleted file mode 100644
index e5c8207be..000000000
--- a/src/containers/subscription/SubscriptionFormScreen.js
+++ /dev/null
@@ -1,99 +0,0 @@
1import React, { Component } from 'react';
2import { BrowserWindow, getCurrentWindow } from '@electron/remote';
3import PropTypes from 'prop-types';
4import { inject, observer } from 'mobx-react';
5
6import PaymentStore from '../../stores/PaymentStore';
7
8import SubscriptionForm from '../../components/subscription/SubscriptionForm';
9import TrialForm from '../../components/subscription/TrialForm';
10import UserStore from '../../stores/UserStore';
11import FeaturesStore from '../../stores/FeaturesStore';
12import AppStore from '../../stores/AppStore';
13
14export default @inject('stores', 'actions') @observer class SubscriptionFormScreen extends Component {
15 static propTypes = {
16 onCloseWindow: PropTypes.func,
17 }
18
19 static defaultProps = {
20 onCloseWindow: () => null,
21 }
22
23 async openBrowser() {
24 const {
25 stores,
26 onCloseWindow,
27 } = this.props;
28
29 const {
30 user,
31 features,
32 } = stores;
33
34 let hostedPageURL = features.features.planSelectionURL;
35 hostedPageURL = user.getAuthURL(hostedPageURL);
36
37 const paymentWindow = new BrowserWindow({
38 parent: getCurrentWindow(),
39 modal: true,
40 title: '🔒 Franz Supporter License',
41 width: 800,
42 height: window.innerHeight - 100,
43 maxWidth: 800,
44 minWidth: 600,
45 webPreferences: {
46 nodeIntegration: true,
47 webviewTag: true,
48 enableRemoteModule: true,
49 contextIsolation: false,
50 },
51 });
52 paymentWindow.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPageURL)}`);
53
54 paymentWindow.on('closed', () => {
55 onCloseWindow();
56 });
57 }
58
59 render() {
60 const {
61 actions,
62 stores,
63 } = this.props;
64
65 const { data: user } = stores.user;
66
67 if (user.hadSubscription) {
68 return (
69 <SubscriptionForm
70 plan={stores.payment.plan}
71 selectPlan={() => this.openBrowser()}
72 isActivatingTrial={stores.user.activateTrialRequest.isExecuting || stores.user.getUserInfoRequest.isExecuting}
73 />
74 );
75 }
76
77 return (
78 <TrialForm
79 plan={stores.payment.plan}
80 activateTrial={() => actions.user.activateTrial({ planId: stores.features.features.defaultTrialPlan })}
81 showAllOptions={() => this.openBrowser()}
82 isActivatingTrial={stores.user.activateTrialRequest.isExecuting || stores.user.getUserInfoRequest.isExecuting}
83 />
84 );
85 }
86}
87
88SubscriptionFormScreen.wrappedComponent.propTypes = {
89 actions: PropTypes.shape({
90 app: PropTypes.instanceOf(AppStore).isRequired,
91 payment: PropTypes.instanceOf(PaymentStore).isRequired,
92 user: PropTypes.instanceOf(UserStore).isRequired,
93 }).isRequired,
94 stores: PropTypes.shape({
95 payment: PropTypes.instanceOf(PaymentStore).isRequired,
96 user: PropTypes.instanceOf(UserStore).isRequired,
97 features: PropTypes.instanceOf(FeaturesStore).isRequired,
98 }).isRequired,
99};
diff --git a/src/containers/subscription/SubscriptionPopupScreen.js b/src/containers/subscription/SubscriptionPopupScreen.js
deleted file mode 100644
index 43966b6a4..000000000
--- a/src/containers/subscription/SubscriptionPopupScreen.js
+++ /dev/null
@@ -1,41 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4
5import SubscriptionPopup from '../../components/subscription/SubscriptionPopup';
6import { isDevMode } from '../../environment';
7
8export default @inject('stores', 'actions') @observer class SubscriptionPopupScreen extends Component {
9 state = {
10 complete: false,
11 };
12
13 completeCheck(event) {
14 const { url } = event;
15
16 if ((url.includes('recurly') && url.includes('confirmation')) || ((url.includes('meetfranz') || isDevMode) && url.includes('success'))) {
17 this.setState({
18 complete: true,
19 });
20 }
21 }
22
23 render() {
24 return (
25 <SubscriptionPopup
26 url={this.props.router.params.url}
27 closeWindow={() => window.close()}
28 completeCheck={e => this.completeCheck(e)}
29 isCompleted={this.state.complete}
30 />
31 );
32 }
33}
34
35SubscriptionPopupScreen.wrappedComponent.propTypes = {
36 router: PropTypes.shape({
37 params: PropTypes.shape({
38 url: PropTypes.string.isRequired,
39 }).isRequired,
40 }).isRequired,
41};
diff --git a/src/electron/Settings.js b/src/electron/Settings.js
index 2f3f8261a..3e11bb175 100644
--- a/src/electron/Settings.js
+++ b/src/electron/Settings.js
@@ -1,8 +1,6 @@
1import { observable, toJS } from 'mobx'; 1import { observable, toJS } from 'mobx';
2import { pathExistsSync, outputJsonSync, readJsonSync } from 'fs-extra'; 2import { pathExistsSync, outputJsonSync, readJsonSync } from 'fs-extra';
3import path from 'path'; 3import { userDataPath } from '../environment';
4
5import { SETTINGS_PATH } from '../environment';
6 4
7const debug = require('debug')('Ferdi:Settings'); 5const debug = require('debug')('Ferdi:Settings');
8 6
@@ -47,17 +45,17 @@ export default class Settings {
47 45
48 _hydrate() { 46 _hydrate() {
49 this.store = this._merge(readJsonSync(this.settingsFile)); 47 this.store = this._merge(readJsonSync(this.settingsFile));
50 debug('Hydrate store', this.type, toJS(this.store)); 48 debug('Hydrate store', this.type, this.allSerialized);
51 } 49 }
52 50
53 _writeFile() { 51 _writeFile() {
54 outputJsonSync(this.settingsFile, this.store, { 52 outputJsonSync(this.settingsFile, this.store, {
55 spaces: 2, 53 spaces: 2,
56 }); 54 });
57 debug('Write settings file', this.type, toJS(this.store)); 55 debug('Write settings file', this.type, this.allSerialized);
58 } 56 }
59 57
60 get settingsFile() { 58 get settingsFile() {
61 return path.join(SETTINGS_PATH, `${this.type === 'app' ? 'settings' : this.type}.json`); 59 return userDataPath('config', `${this.type === 'app' ? 'settings' : this.type}.json`);
62 } 60 }
63} 61}
diff --git a/src/electron/ipc-api/appIndicator.js b/src/electron/ipc-api/appIndicator.js
index 0691e5170..c6c261d0f 100644
--- a/src/electron/ipc-api/appIndicator.js
+++ b/src/electron/ipc-api/appIndicator.js
@@ -1,5 +1,5 @@
1import { app, ipcMain } from 'electron'; 1import { app, ipcMain } from 'electron';
2import path from 'path'; 2import { join } from 'path';
3import { autorun } from 'mobx'; 3import { autorun } from 'mobx';
4import { isMac, isWindows, isLinux } from '../../environment'; 4import { isMac, isWindows, isLinux } from '../../environment';
5 5
@@ -9,7 +9,7 @@ const FILE_EXTENSION = isWindows ? 'ico' : 'png';
9let isTrayIconEnabled; 9let isTrayIconEnabled;
10 10
11function getAsset(type, asset) { 11function getAsset(type, asset) {
12 return path.join( 12 return join(
13 __dirname, '..', '..', 'assets', 'images', type, process.platform, `${asset}.${FILE_EXTENSION}`, 13 __dirname, '..', '..', 'assets', 'images', type, process.platform, `${asset}.${FILE_EXTENSION}`,
14 ); 14 );
15} 15}
diff --git a/src/electron/ipc-api/download.js b/src/electron/ipc-api/download.js
index 7f8718924..ba261ba1e 100644
--- a/src/electron/ipc-api/download.js
+++ b/src/electron/ipc-api/download.js
@@ -1,7 +1,7 @@
1import { ipcMain, dialog, BrowserWindow } from 'electron'; 1import { ipcMain, dialog, BrowserWindow } from 'electron';
2import { download } from 'electron-dl'; 2import { download } from 'electron-dl';
3import mime from 'mime-types'; 3import mime from 'mime-types';
4import fs from 'fs-extra'; 4import { writeFileSync } from 'fs-extra';
5 5
6const debug = require('debug')('Ferdi:ipcApi:download'); 6const debug = require('debug')('Ferdi:ipcApi:download');
7 7
@@ -37,7 +37,7 @@ export default (params) => {
37 if (saveDialog.canceled) return; 37 if (saveDialog.canceled) return;
38 38
39 const binaryImage = decodeBase64Image(content); 39 const binaryImage = decodeBase64Image(content);
40 fs.writeFileSync(saveDialog.filePath, binaryImage, 'binary'); 40 writeFileSync(saveDialog.filePath, binaryImage, 'binary');
41 41
42 debug('File blob saved to', saveDialog.filePath); 42 debug('File blob saved to', saveDialog.filePath);
43 } catch (err) { 43 } catch (err) {
diff --git a/src/electron/ipc-api/localServer.js b/src/electron/ipc-api/localServer.js
index 9b800fdf6..591e70504 100644
--- a/src/electron/ipc-api/localServer.js
+++ b/src/electron/ipc-api/localServer.js
@@ -1,9 +1,9 @@
1import { ipcMain, app } from 'electron'; 1import { ipcMain } from 'electron';
2import net from 'net'; 2import net from 'net';
3import { LOCAL_HOSTNAME, LOCAL_PORT } from '../../config';
4import { userDataPath } from '../../environment';
3import startServer from '../../internal-server/start'; 5import startServer from '../../internal-server/start';
4 6
5const DEFAULT_PORT = 45569;
6
7const portInUse = function (port) { 7const portInUse = function (port) {
8 return new Promise((resolve) => { 8 return new Promise((resolve) => {
9 const server = net.createServer((socket) => { 9 const server = net.createServer((socket) => {
@@ -11,7 +11,7 @@ const portInUse = function (port) {
11 socket.pipe(socket); 11 socket.pipe(socket);
12 }); 12 });
13 13
14 server.listen(port, '127.0.0.1'); 14 server.listen(port, LOCAL_HOSTNAME);
15 server.on('error', () => { 15 server.on('error', () => {
16 resolve(true); 16 resolve(true);
17 }); 17 });
@@ -28,15 +28,15 @@ export default (params) => {
28 ipcMain.on('startLocalServer', () => { 28 ipcMain.on('startLocalServer', () => {
29 if (!localServerStarted) { 29 if (!localServerStarted) {
30 // Find next unused port for server 30 // Find next unused port for server
31 let port = DEFAULT_PORT; 31 let port = LOCAL_PORT;
32 (async () => { 32 (async () => {
33 // eslint-disable-next-line no-await-in-loop 33 // eslint-disable-next-line no-await-in-loop
34 while ((await portInUse(port)) && port < DEFAULT_PORT + 10) { 34 while ((await portInUse(port)) && port < LOCAL_PORT + 10) {
35 port += 1; 35 port += 1;
36 } 36 }
37 console.log('Starting local server on port', port); 37 console.log('Starting local server on port', port);
38 38
39 startServer(app.getPath('userData'), port); 39 startServer(userDataPath(), port);
40 40
41 params.mainWindow.webContents.send('localServerPort', { 41 params.mainWindow.webContents.send('localServerPort', {
42 port, 42 port,
diff --git a/src/electron/macOSPermissions.js b/src/electron/macOSPermissions.js
index 940b16c6e..887af2903 100644
--- a/src/electron/macOSPermissions.js
+++ b/src/electron/macOSPermissions.js
@@ -1,83 +1,80 @@
1import { app, systemPreferences, dialog } from 'electron'; 1import { systemPreferences, dialog } from 'electron';
2import fs from 'fs'; 2import { pathExistsSync, mkdirSync, writeFileSync } from 'fs-extra';
3import macosVersion from 'macos-version'; 3import macosVersion from 'macos-version';
4import path from 'path'; 4import { dirname } from 'path';
5import { isMac } from '../environment'; 5import { askForScreenCaptureAccess } from 'node-mac-permissions';
6 6import { userDataPath } from '../environment';
7let askForScreenCaptureAccess;
8if (isMac) {
9 // eslint-disable-next-line global-require
10 askForScreenCaptureAccess = require('node-mac-permissions').askForScreenCaptureAccess;
11}
12 7
13const debug = require('debug')('Ferdi:macOSPermissions'); 8const debug = require('debug')('Ferdi:macOSPermissions');
14 9
15const permissionExists = macosVersion.isGreaterThanOrEqualTo('10.15'); 10const isExplicitScreenCapturePermissionReqd = macosVersion.isGreaterThanOrEqualTo('10.15');
16const filePath = path.join(app.getPath('userData'), '.has-app-requested-screen-capture-permissions'); 11debug(`Should check explicitly for screen-capture permissions: ${isExplicitScreenCapturePermissionReqd}`);
17 12
18function hasPromptedForPermission() { 13const filePath = userDataPath('.has-app-requested-screen-capture-permissions');
19 if (!permissionExists) {
20 return false;
21 }
22 14
23 if (filePath && fs.existsSync(filePath)) { 15function hasPromptedForScreenCapturePermission() {
24 return true; 16 if (!isExplicitScreenCapturePermissionReqd) {
17 return false;
25 } 18 }
26 19
27 return false; 20 debug('Checking if status file exists');
21 return filePath && pathExistsSync(filePath);
28} 22}
29 23
30function hasScreenCapturePermission() { 24function hasScreenCapturePermissionAlreadyBeenGranted() {
31 if (!permissionExists) { 25 if (!isExplicitScreenCapturePermissionReqd) {
32 return true; 26 return true;
33 } 27 }
34 28
35 const screenCaptureStatus = systemPreferences.getMediaAccessStatus('screen'); 29 const screenCaptureStatus = systemPreferences.getMediaAccessStatus('screen');
30 debug(`screen-capture permissions status: ${screenCaptureStatus}`);
36 return screenCaptureStatus === 'granted'; 31 return screenCaptureStatus === 'granted';
37} 32}
38 33
39function createStatusFile() { 34function createStatusFile() {
40 try { 35 try {
41 fs.writeFileSync(filePath, ''); 36 writeFileSync(filePath, '');
42 } catch (error) { 37 } catch (error) {
43 if (error.code === 'ENOENT') { 38 if (error.code === 'ENOENT') {
44 fs.mkdirSync(path.dirname(filePath)); 39 mkdirSync(dirname(filePath));
45 fs.writeFileSync(filePath, ''); 40 writeFileSync(filePath, '');
46 } 41 }
47 42
48 throw error; 43 throw error;
49 } 44 }
50} 45}
51 46
52export default async function (mainWindow) { 47export const askFormacOSPermissions = async mainWindow => {
53 debug('Checking camera & microphone permissions'); 48 debug('Checking camera & microphone permissions');
54 systemPreferences.askForMediaAccess('camera'); 49 systemPreferences.askForMediaAccess('camera');
55 systemPreferences.askForMediaAccess('microphone'); 50 systemPreferences.askForMediaAccess('microphone');
56 51
57 if (!hasPromptedForPermission() && !hasScreenCapturePermission()) { 52 if (hasScreenCapturePermissionAlreadyBeenGranted()) {
53 debug('Already obtained screen-capture permissions - writing status file');
54 createStatusFile();
55 return;
56 }
57
58 if (!hasPromptedForScreenCapturePermission()) {
58 debug('Checking screen capture permissions'); 59 debug('Checking screen capture permissions');
59 60
60 const { response } = await dialog.showMessageBox(mainWindow, { 61 const { response } = await dialog.showMessageBox(mainWindow, {
61 type: 'info', 62 type: 'info',
62 message: 'Enable Screen Sharing', 63 message: 'Enable Screen Sharing',
63 detail: 'To enable screen sharing for some services, Ferdi needs the permission to record your screen.', 64 detail:
64 buttons: [ 65 'To enable screen sharing for some services, Ferdi needs the permission to record your screen.',
65 'Allow screen sharing', 66 buttons: ['Allow screen sharing', 'No', 'Ask me later'],
66 'No',
67 'Ask me later',
68 ],
69 defaultId: 0, 67 defaultId: 0,
70 cancelId: 2, 68 cancelId: 2,
71 }); 69 });
72 70
73 console.log('result', response);
74 if (response === 0) { 71 if (response === 0) {
75 debug('Asking for access'); 72 debug('Asking for access');
76 askForScreenCaptureAccess(); 73 askForScreenCaptureAccess();
77 createStatusFile(); 74 createStatusFile();
78 } else if (response === 1) { 75 } else if (response === 1) {
79 debug('Don\'t ask again'); 76 debug("Don't ask again");
80 createStatusFile(); 77 createStatusFile();
81 } 78 }
82 } 79 }
83} 80};
diff --git a/src/electron/webview-ime-focus.js b/src/electron/webview-ime-focus.js
index b9421eb06..e187ee0b4 100644
--- a/src/electron/webview-ime-focus.js
+++ b/src/electron/webview-ime-focus.js
@@ -1,5 +1,5 @@
1const { webContents } = require('@electron/remote'); 1import { webContents } from '@electron/remote';
2const { releaseDocumentFocus } = require('./webview-ime-focus-helpers'); 2import { releaseDocumentFocus } from './webview-ime-focus-helpers';
3 3
4function giveWebviewDocumentFocus(element) { 4function giveWebviewDocumentFocus(element) {
5 releaseDocumentFocus(); 5 releaseDocumentFocus();
diff --git a/src/environment.js b/src/environment.js
index 758a33380..42c6b2927 100644
--- a/src/environment.js
+++ b/src/environment.js
@@ -1,10 +1,11 @@
1import os from 'os'; 1import os from 'os';
2import path from 'path'; 2import { join } from 'path';
3 3
4import { is, api as electronApi } from 'electron-util'; 4import { is, api as electronApi } from 'electron-util';
5 5
6import { DEFAULT_ACCENT_COLOR } from '@meetfranz/theme'; 6import { DEFAULT_ACCENT_COLOR } from '@meetfranz/theme';
7 7
8import osName from 'os-name';
8import { 9import {
9 LIVE_FERDI_API, 10 LIVE_FERDI_API,
10 DEV_FRANZ_API, 11 DEV_FRANZ_API,
@@ -17,7 +18,6 @@ import {
17 DEV_WS_API, 18 DEV_WS_API,
18 LOCAL_TODOS_FRONTEND_URL, 19 LOCAL_TODOS_FRONTEND_URL,
19 PRODUCTION_TODOS_FRONTEND_URL, 20 PRODUCTION_TODOS_FRONTEND_URL,
20 LIVE_FRANZ_API,
21 DEFAULT_TODO_SERVICE, 21 DEFAULT_TODO_SERVICE,
22 SEARCH_ENGINE_DDG, 22 SEARCH_ENGINE_DDG,
23 iconSizeBias, 23 iconSizeBias,
@@ -26,8 +26,6 @@ import {
26import { asarPath } from './helpers/asar-helpers'; 26import { asarPath } from './helpers/asar-helpers';
27import * as buildInfo from './buildInfo.json'; // eslint-disable-line import/no-unresolved 27import * as buildInfo from './buildInfo.json'; // eslint-disable-line import/no-unresolved
28 28
29const osName = require('os-name');
30
31export const { app } = electronApi; 29export const { app } = electronApi;
32export const ferdiVersion = app.getVersion(); 30export const ferdiVersion = app.getVersion();
33export const electronVersion = process.versions.electron; 31export const electronVersion = process.versions.electron;
@@ -37,26 +35,35 @@ export const nodeVersion = process.versions.node;
37// Set app directory before loading user modules 35// Set app directory before loading user modules
38if (process.env.FERDI_APPDATA_DIR != null) { 36if (process.env.FERDI_APPDATA_DIR != null) {
39 app.setPath('appData', process.env.FERDI_APPDATA_DIR); 37 app.setPath('appData', process.env.FERDI_APPDATA_DIR);
40 app.setPath('userData', path.join(app.getPath('appData'))); 38 app.setPath('userData', join(app.getPath('appData')));
41} else if (process.env.PORTABLE_EXECUTABLE_DIR != null) { 39} else if (process.env.PORTABLE_EXECUTABLE_DIR != null) {
42 app.setPath('appData', process.env.PORTABLE_EXECUTABLE_DIR, `${app.name}AppData`); 40 app.setPath('appData', process.env.PORTABLE_EXECUTABLE_DIR, `${app.name}AppData`);
43 app.setPath('userData', path.join(app.getPath('appData'), `${app.name}AppData`)); 41 app.setPath('userData', join(app.getPath('appData'), `${app.name}AppData`));
44} else if (is.windows) { 42} else if (is.windows) {
45 app.setPath('appData', process.env.APPDATA); 43 app.setPath('appData', process.env.APPDATA);
46 app.setPath('userData', path.join(app.getPath('appData'), app.name)); 44 app.setPath('userData', join(app.getPath('appData'), app.name));
47} 45}
48 46
49export const isDevMode = is.development; 47export const isDevMode = is.development;
50if (isDevMode) { 48if (isDevMode) {
51 app.setPath('userData', path.join(app.getPath('appData'), `${app.name}Dev`)); 49 app.setPath('userData', join(app.getPath('appData'), `${app.name}Dev`));
52} 50}
53 51
54export const SETTINGS_PATH = path.join(app.getPath('userData'), 'config'); 52export function userDataPath(...segments) {
53 return join(app.getPath('userData'), ...([segments].flat()));
54}
55
56export function userDataRecipesPath(...segments) {
57 return userDataPath('recipes', ...([segments].flat()));
58}
55 59
56// Replacing app.asar is not beautiful but unfortunately necessary 60// Replacing app.asar is not beautiful but unfortunately necessary
57export const RECIPES_PATH = asarPath(path.join(__dirname, 'recipes')); 61export function asarRecipesPath(...segments) {
62 return join(asarPath(join(__dirname, 'recipes')), ...([segments].flat()));
63}
58 64
59export const useLiveAPI = process.env.LIVE_API; 65export const useLiveAPI = process.env.USE_LIVE_API;
66const useLocalAPI = process.env.USE_LOCAL_API;
60 67
61export const isMac = is.macos; 68export const isMac = is.macos;
62export const isWindows = is.windows; 69export const isWindows = is.windows;
@@ -66,8 +73,22 @@ export const osArch = os.arch();
66export const osRelease = os.release(); 73export const osRelease = os.release();
67export const is64Bit = osArch.match(/64/); 74export const is64Bit = osArch.match(/64/);
68 75
69export const ctrlKey = isMac ? '⌘' : 'Ctrl'; 76// for accelerator, show the shortform that electron/OS understands
70export const cmdKey = isMac ? 'Cmd' : 'Ctrl'; 77// for tooltip, show symbol
78const ctrlKey = isMac ? '⌘' : 'Ctrl';
79const cmdKey = isMac ? 'Cmd' : 'Ctrl';
80
81export const altKey = isMac ? '⌥' : 'Alt';
82export const shiftKey = isMac ? '⇧' : 'Shift';
83
84// Platform specific shortcut keys
85export const shortcutKey = (isAccelerator = true) => (isAccelerator ? cmdKey : ctrlKey);
86export const lockFerdiShortcutKey = (isAccelerator = true) => `${shortcutKey(isAccelerator)}+${shiftKey}+L`;
87export const todosToggleShortcutKey = (isAccelerator = true) => `${shortcutKey(isAccelerator)}+T`;
88export const workspaceToggleShortcutKey = (isAccelerator = true) => `${shortcutKey(isAccelerator)}+D`;
89export const muteFerdiShortcutKey = (isAccelerator = true) => `${shortcutKey(isAccelerator)}+${shiftKey}+M`;
90export const addNewServiceShortcutKey = (isAccelerator = true) => `${shortcutKey(isAccelerator)}+N`;
91export const settingsShortcutKey = (isAccelerator = true) => `${shortcutKey(isAccelerator)}+${isMac ? ',' : 'P'}`;
71 92
72let api; 93let api;
73let wsApi; 94let wsApi;
@@ -75,12 +96,10 @@ let web;
75let todos; 96let todos;
76if (!isDevMode || (isDevMode && useLiveAPI)) { 97if (!isDevMode || (isDevMode && useLiveAPI)) {
77 api = LIVE_FERDI_API; 98 api = LIVE_FERDI_API;
78 // api = DEV_FRANZ_API;
79 wsApi = LIVE_WS_API; 99 wsApi = LIVE_WS_API;
80 web = LIVE_API_FERDI_WEBSITE; 100 web = LIVE_API_FERDI_WEBSITE;
81 // web = DEV_API_FRANZ_WEBSITE;
82 todos = PRODUCTION_TODOS_FRONTEND_URL; 101 todos = PRODUCTION_TODOS_FRONTEND_URL;
83} else if (isDevMode && process.env.LOCAL_API) { 102} else if (isDevMode && useLocalAPI) {
84 api = LOCAL_API; 103 api = LOCAL_API;
85 wsApi = LOCAL_WS_API; 104 wsApi = LOCAL_WS_API;
86 web = LOCAL_API_WEBSITE; 105 web = LOCAL_API_WEBSITE;
@@ -120,7 +139,6 @@ export const DEFAULT_APP_SETTINGS = {
120 beta: false, 139 beta: false,
121 isAppMuted: false, 140 isAppMuted: false,
122 enableGPUAcceleration: true, 141 enableGPUAcceleration: true,
123 serviceLimit: 5,
124 142
125 // Ferdi specific options 143 // Ferdi specific options
126 server: LIVE_FERDI_API, 144 server: LIVE_FERDI_API,
@@ -133,9 +151,9 @@ export const DEFAULT_APP_SETTINGS = {
133 scheduledDNDEnabled: false, 151 scheduledDNDEnabled: false,
134 scheduledDNDStart: '17:00', 152 scheduledDNDStart: '17:00',
135 scheduledDNDEnd: '09:00', 153 scheduledDNDEnd: '09:00',
136 hibernate: false,
137 hibernateOnStartup: true, 154 hibernateOnStartup: true,
138 hibernationStrategy: 300, 155 hibernationStrategy: '300', // seconds
156 wakeUpStrategy: '300', // seconds
139 inactivityLock: 0, 157 inactivityLock: 0,
140 automaticUpdates: true, 158 automaticUpdates: true,
141 showServiceNavigationBar: false, 159 showServiceNavigationBar: false,
@@ -153,10 +171,6 @@ export const DEFAULT_APP_SETTINGS = {
153 alwaysShowWorkspaces: false, 171 alwaysShowWorkspaces: false,
154}; 172};
155 173
156export function termsBase() {
157 return window.ferdi.stores.settings.all.app.server !== LIVE_FRANZ_API ? window.ferdi.stores.settings.all.app.server : DEV_API_FRANZ_WEBSITE;
158}
159
160export function aboutAppDetails() { 174export function aboutAppDetails() {
161 return [ 175 return [
162 `Version: ${ferdiVersion}`, 176 `Version: ${ferdiVersion}`,
diff --git a/src/features/announcements/api.js b/src/features/announcements/api.js
index 53df69eed..a7fe24bb1 100644
--- a/src/features/announcements/api.js
+++ b/src/features/announcements/api.js
@@ -1,7 +1,7 @@
1import { app } from '@electron/remote'; 1import { app } from '@electron/remote';
2import Request from '../../stores/lib/Request'; 2import Request from '../../stores/lib/Request';
3import apiBase from '../../api/apiBase'; 3import apiBase from '../../api/apiBase';
4import { GITHUB_FERDI_REPO_NAME, GITHUB_ORG_NAME } from '../../config'; 4import { GITHUB_FERDI_REPO_NAME, GITHUB_NIGHTLIES_REPO_NAME, GITHUB_ORG_NAME } from '../../config';
5 5
6const debug = require('debug')('Ferdi:feature:announcements:api'); 6const debug = require('debug')('Ferdi:feature:announcements:api');
7 7
@@ -12,8 +12,8 @@ export const announcementsApi = {
12 }, 12 },
13 13
14 async getChangelog(version) { 14 async getChangelog(version) {
15 // TODO: This doesn't seem to handle the different 'nightlies' repo that we currently use. Needs to be fixed. 15 const ferdiRepoName = version.includes('nightly') ? GITHUB_NIGHTLIES_REPO_NAME : GITHUB_FERDI_REPO_NAME;
16 const url = `https://api.github.com/repos/${GITHUB_ORG_NAME}/${GITHUB_FERDI_REPO_NAME}/releases/tags/v${version}`; 16 const url = `https://api.github.com/repos/${GITHUB_ORG_NAME}/${ferdiRepoName}/releases/tags/v${version}`;
17 debug(`fetching release changelog from Github url: ${url}`); 17 debug(`fetching release changelog from Github url: ${url}`);
18 const request = await window.fetch(url, { method: 'GET' }); 18 const request = await window.fetch(url, { method: 'GET' });
19 if (!request.ok) return null; 19 if (!request.ok) return null;
@@ -22,7 +22,7 @@ export const announcementsApi = {
22 }, 22 },
23 23
24 async getAnnouncement(version) { 24 async getAnnouncement(version) {
25 const url = `${apiBase(true)}/announcements/${version}`; 25 const url = `${apiBase()}/announcements/${version}`;
26 debug(`fetching release announcement from api url: ${url}`); 26 debug(`fetching release announcement from api url: ${url}`);
27 const response = await window.fetch(url, { method: 'GET' }); 27 const response = await window.fetch(url, { method: 'GET' });
28 if (!response.ok) return null; 28 if (!response.ok) return null;
diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js
index 21964b108..315843db3 100644
--- a/src/features/announcements/components/AnnouncementScreen.js
+++ b/src/features/announcements/components/AnnouncementScreen.js
@@ -25,7 +25,7 @@ const messages = defineMessages({
25 25
26const smallScreen = '1000px'; 26const smallScreen = '1000px';
27 27
28const styles = theme => ({ 28const styles = (theme) => ({
29 container: { 29 container: {
30 background: theme.colorBackground, 30 background: theme.colorBackground,
31 position: 'relative', 31 position: 'relative',
diff --git a/src/features/communityRecipes/index.js b/src/features/communityRecipes/index.js
index 39f7e9cd6..828c6d867 100644
--- a/src/features/communityRecipes/index.js
+++ b/src/features/communityRecipes/index.js
@@ -1,26 +1,7 @@
1import { reaction } from 'mobx';
2import { CommunityRecipesStore } from './store'; 1import { CommunityRecipesStore } from './store';
3 2
4const debug = require('debug')('Ferdi:feature:communityRecipes');
5
6export const communityRecipesStore = new CommunityRecipesStore(); 3export const communityRecipesStore = new CommunityRecipesStore();
7 4
8export default function initCommunityRecipes(stores, actions) { 5export default function initCommunityRecipes(stores, actions) {
9 const { features } = stores;
10
11 communityRecipesStore.start(stores, actions); 6 communityRecipesStore.start(stores, actions);
12
13 // Toggle communityRecipe premium status
14 reaction(
15 () => (
16 features.features.isCommunityRecipesIncludedInCurrentPlan
17 ),
18 (isPremiumFeature) => {
19 debug('Community recipes is premium feature: ', isPremiumFeature);
20 communityRecipesStore.isCommunityRecipesIncludedInCurrentPlan = true;
21 },
22 {
23 fireImmediately: true,
24 },
25 );
26} 7}
diff --git a/src/features/communityRecipes/store.js b/src/features/communityRecipes/store.js
index 3a60e5449..a3614dd11 100644
--- a/src/features/communityRecipes/store.js
+++ b/src/features/communityRecipes/store.js
@@ -1,11 +1,9 @@
1import { computed, observable } from 'mobx'; 1import { computed } from 'mobx';
2import { FeatureStore } from '../utils/FeatureStore'; 2import { FeatureStore } from '../utils/FeatureStore';
3 3
4const debug = require('debug')('Ferdi:feature:communityRecipes:store'); 4const debug = require('debug')('Ferdi:feature:communityRecipes:store');
5 5
6export class CommunityRecipesStore extends FeatureStore { 6export class CommunityRecipesStore extends FeatureStore {
7 @observable isCommunityRecipesIncludedInCurrentPlan = true;
8
9 start(stores, actions) { 7 start(stores, actions) {
10 debug('start'); 8 debug('start');
11 this.stores = stores; 9 this.stores = stores;
@@ -21,7 +19,8 @@ export class CommunityRecipesStore extends FeatureStore {
21 if (!this.stores) return []; 19 if (!this.stores) return [];
22 20
23 return this.stores.recipePreviews.dev.map((r) => { 21 return this.stores.recipePreviews.dev.map((r) => {
24 r.isDevRecipe = !!r.author.find(a => a.email === this.stores.user.data.email); 22 // TODO: Need to figure out if this is even necessary/used
23 r.isDevRecipe = !!r.author.find((a) => a.email === this.stores.user.data.email);
25 24
26 return r; 25 return r;
27 }); 26 });
diff --git a/src/features/delayApp/Component.js b/src/features/delayApp/Component.js
deleted file mode 100644
index 6471240ab..000000000
--- a/src/features/delayApp/Component.js
+++ /dev/null
@@ -1,120 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { Button } from '@meetfranz/forms';
8
9import { config } from './constants';
10import styles from './styles';
11import UserStore from '../../stores/UserStore';
12import UIStore from '../../stores/UIStore';
13import { FeatureStore } from '../utils/FeatureStore';
14
15const messages = defineMessages({
16 headline: {
17 id: 'feature.delayApp.headline',
18 defaultMessage: '!!!Please purchase license to skip waiting',
19 },
20 headlineTrial: {
21 id: 'feature.delayApp.trial.headline',
22 defaultMessage: '!!!Get the free Franz Professional 14 day trial and skip the line',
23 },
24 action: {
25 id: 'feature.delayApp.upgrade.action',
26 defaultMessage: '!!!Upgrade Franz',
27 },
28 actionTrial: {
29 id: 'feature.delayApp.trial.action',
30 defaultMessage: '!!!Yes, I want the free 14 day trial of Franz Professional',
31 },
32 text: {
33 id: 'feature.delayApp.text',
34 defaultMessage: '!!!Ferdi will continue in {seconds} seconds.',
35 },
36});
37
38export default @inject('stores', 'actions') @injectSheet(styles) @observer class DelayApp extends Component {
39 static propTypes = {
40 // eslint-disable-next-line
41 classes: PropTypes.object.isRequired,
42 };
43
44 static contextTypes = {
45 intl: intlShape,
46 };
47
48 state = {
49 countdown: config.delayDuration,
50 };
51
52 countdownInterval = null;
53
54 countdownIntervalTimeout = 1000;
55
56 componentDidMount() {
57 this.countdownInterval = setInterval(() => {
58 this.setState(prevState => ({
59 countdown: prevState.countdown - this.countdownIntervalTimeout,
60 }));
61
62 if (this.state.countdown <= 0) {
63 // reload();
64 clearInterval(this.countdownInterval);
65 }
66 }, this.countdownIntervalTimeout);
67 }
68
69 componentWillUnmount() {
70 clearInterval(this.countdownInterval);
71 }
72
73 handleCTAClick() {
74 const { actions, stores } = this.props;
75 const { hadSubscription } = stores.user.data;
76 const { defaultTrialPlan } = stores.features.features;
77
78 if (!hadSubscription) {
79 actions.user.activateTrial({ planId: defaultTrialPlan });
80 } else {
81 actions.ui.openSettings({ path: 'user' });
82 }
83 }
84
85 render() {
86 const { classes, stores } = this.props;
87 const { intl } = this.context;
88
89 const { hadSubscription } = stores.user.data;
90
91 return (
92 <div className={`${classes.container}`}>
93 <h1 className={classes.headline}>{intl.formatMessage(hadSubscription ? messages.headline : messages.headlineTrial)}</h1>
94 <Button
95 label={intl.formatMessage(hadSubscription ? messages.action : messages.actionTrial)}
96 className={classes.button}
97 buttonType="inverted"
98 onClick={this.handleCTAClick.bind(this)}
99 busy={stores.user.activateTrialRequest.isExecuting}
100 />
101 <p className="footnote">
102 {intl.formatMessage(messages.text, {
103 seconds: this.state.countdown / 1000,
104 })}
105 </p>
106 </div>
107 );
108 }
109}
110
111DelayApp.wrappedComponent.propTypes = {
112 stores: PropTypes.shape({
113 user: PropTypes.instanceOf(UserStore).isRequired,
114 features: PropTypes.instanceOf(FeatureStore).isRequired,
115 }).isRequired,
116 actions: PropTypes.shape({
117 ui: PropTypes.instanceOf(UIStore).isRequired,
118 user: PropTypes.instanceOf(UserStore).isRequired,
119 }).isRequired,
120};
diff --git a/src/features/delayApp/constants.js b/src/features/delayApp/constants.js
deleted file mode 100644
index 72cc4246e..000000000
--- a/src/features/delayApp/constants.js
+++ /dev/null
@@ -1,6 +0,0 @@
1import { DEFAULT_FEATURES_CONFIG } from '../../config';
2
3export const config = {
4 delayOffset: DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.delayOffset,
5 delayDuration: DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait,
6};
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
deleted file mode 100644
index f0c2bdc82..000000000
--- a/src/features/delayApp/index.js
+++ /dev/null
@@ -1,80 +0,0 @@
1import { autorun, observable, reaction } from 'mobx';
2import moment from 'moment';
3import DelayAppComponent from './Component';
4import { config } from './constants';
5import { DEFAULT_FEATURES_CONFIG } from '../../config';
6import { getUserWorkspacesRequest } from '../workspaces/api';
7
8const debug = require('debug')('Ferdi:feature:delayApp');
9
10export const state = observable({
11 isDelayAppScreenVisible: DEFAULT_FEATURES_CONFIG.needToWaitToProceed,
12});
13
14function setVisibility(value) {
15 Object.assign(state, {
16 isDelayAppScreenVisible: value,
17 });
18}
19
20export default function init(stores) {
21 debug('Initializing `delayApp` feature');
22
23 let shownAfterLaunch = false;
24 let timeLastDelay = moment();
25
26 window.ferdi.features.delayApp = {
27 state,
28 };
29
30 reaction(
31 () => (
32 stores.user.isLoggedIn
33 && stores.services.allServicesRequest.wasExecuted
34 && getUserWorkspacesRequest.wasExecuted
35 && stores.features.features.needToWaitToProceed
36 && !stores.user.data.isPremium
37 ),
38 (isEnabled) => {
39 if (isEnabled) {
40 debug('Enabling `delayApp` feature');
41
42 const { needToWaitToProceedConfig: globalConfig } = stores.features.features;
43
44 config.delayOffset = globalConfig.delayOffset !== undefined ? globalConfig.delayOffset : DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.delayOffset;
45 config.delayDuration = globalConfig.wait !== undefined ? globalConfig.wait : DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait;
46
47 autorun(() => {
48 const { isAnnouncementShown } = stores.announcements;
49 if (stores.services.allDisplayed.length === 0 || isAnnouncementShown) {
50 shownAfterLaunch = true;
51 setVisibility(false);
52 return;
53 }
54
55 const diff = moment().diff(timeLastDelay);
56 const itsTimeToWait = diff >= config.delayOffset;
57 if (!isAnnouncementShown && ((stores.app.isFocused && itsTimeToWait) || !shownAfterLaunch)) {
58 debug(`App will be delayed for ${config.delayDuration / 1000}s`);
59
60 setVisibility(true);
61
62 setTimeout(() => {
63 debug('Resetting app delay');
64
65 shownAfterLaunch = true;
66 timeLastDelay = moment();
67 setVisibility(false);
68 }, config.delayDuration + 1000); // timer needs to be able to hit 0
69 } else {
70 setVisibility(false);
71 }
72 });
73 } else {
74 setVisibility(false);
75 }
76 },
77 );
78}
79
80export const Component = DelayAppComponent;
diff --git a/src/features/delayApp/styles.js b/src/features/delayApp/styles.js
deleted file mode 100644
index 69c3c7a27..000000000
--- a/src/features/delayApp/styles.js
+++ /dev/null
@@ -1,22 +0,0 @@
1export default theme => ({
2 container: {
3 background: theme.colorBackground,
4 top: 0,
5 width: '100%',
6 display: 'flex',
7 'flex-direction': 'column',
8 'align-items': 'center',
9 'justify-content': 'center',
10 'z-index': 150,
11 },
12 headline: {
13 color: theme.colorHeadline,
14 margin: [25, 0, 40],
15 'max-width': 500,
16 'text-align': 'center',
17 'line-height': '1.3em',
18 },
19 button: {
20 margin: [40, 0, 20],
21 },
22});
diff --git a/src/features/planSelection/actions.js b/src/features/planSelection/actions.js
deleted file mode 100644
index 83f58bfd7..000000000
--- a/src/features/planSelection/actions.js
+++ /dev/null
@@ -1,9 +0,0 @@
1import PropTypes from 'prop-types';
2import { createActionsFromDefinitions } from '../../actions/lib/actions';
3
4export const planSelectionActions = createActionsFromDefinitions({
5 downgradeAccount: {},
6 hideOverlay: {},
7}, PropTypes.checkPropTypes);
8
9export default planSelectionActions;
diff --git a/src/features/planSelection/api.js b/src/features/planSelection/api.js
deleted file mode 100644
index 16bf9ff2d..000000000
--- a/src/features/planSelection/api.js
+++ /dev/null
@@ -1,26 +0,0 @@
1import { sendAuthRequest } from '../../api/utils/auth';
2import Request from '../../stores/lib/Request';
3import apiBase from '../../api/apiBase';
4
5const debug = require('debug')('Ferdi:feature:planSelection:api');
6
7export const planSelectionApi = {
8 downgrade: async () => {
9 const url = `${apiBase()}/payment/downgrade`;
10 const options = {
11 method: 'PUT',
12 };
13 debug('downgrade UPDATE', url, options);
14 const result = await sendAuthRequest(url, options);
15 debug('downgrade RESULT', result);
16 if (!result.ok) throw result;
17
18 return result.ok;
19 },
20};
21
22export const downgradeUserRequest = new Request(planSelectionApi, 'downgrade');
23
24export const resetApiRequests = () => {
25 downgradeUserRequest.reset();
26};
diff --git a/src/features/planSelection/components/PlanItem.js b/src/features/planSelection/components/PlanItem.js
deleted file mode 100644
index e90532dec..000000000
--- a/src/features/planSelection/components/PlanItem.js
+++ /dev/null
@@ -1,215 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6import classnames from 'classnames';
7import color from 'color';
8
9import { H2 } from '@meetfranz/ui';
10
11import { Button } from '@meetfranz/forms';
12import { mdiArrowRight } from '@mdi/js';
13
14const messages = defineMessages({
15 perMonth: {
16 id: 'subscription.interval.perMonth',
17 defaultMessage: '!!!per month',
18 },
19 perMonthPerUser: {
20 id: 'subscription.interval.perMonthPerUser',
21 defaultMessage: '!!!per month & user',
22 },
23 bestValue: {
24 id: 'subscription.bestValue',
25 defaultMessage: '!!!Best value',
26 },
27});
28
29const styles = theme => ({
30 root: {
31 display: 'flex',
32 flexDirection: 'column',
33 borderRadius: theme.borderRadius,
34 flex: 1,
35 color: theme.styleTypes.primary.accent,
36 overflow: 'hidden',
37 textAlign: 'center',
38
39 '& h2': {
40 textAlign: 'center',
41 marginBottom: 10,
42 fontSize: 30,
43 color: theme.styleTypes.primary.contrast,
44 },
45 },
46 currency: {
47 fontSize: 35,
48 },
49 priceWrapper: {
50 height: 50,
51 marginBottom: 0,
52 marginTop: ({ text }) => (!text ? 15 : 0),
53 },
54 price: {
55 fontSize: 50,
56
57 '& sup': {
58 fontSize: 20,
59 verticalAlign: 20,
60 },
61 },
62 text: {
63 marginBottom: 'auto',
64 },
65 cta: {
66 background: theme.styleTypes.primary.accent,
67 color: theme.styleTypes.primary.contrast,
68 margin: [30, 'auto', 0, 'auto'],
69 },
70 divider: {
71 width: 40,
72 border: 0,
73 borderTop: [1, 'solid', theme.styleTypes.primary.contrast],
74 margin: [15, 'auto', 20],
75 },
76 header: {
77 padding: 20,
78 background: color(theme.styleTypes.primary.accent).darken(0.25).hex(),
79 color: theme.styleTypes.primary.contrast,
80 position: 'relative',
81 height: 'auto',
82 },
83 content: {
84 padding: [10, 20, 20],
85 background: '#EFEFEF',
86 display: 'flex',
87 flexDirection: 'column',
88 justifyContent: 'space-between',
89 },
90 simpleCTA: {
91 background: 'none',
92 color: theme.styleTypes.primary.accent,
93
94 '& svg': {
95 fill: theme.styleTypes.primary.accent,
96 },
97 },
98 bestValue: {
99 background: theme.styleTypes.success.accent,
100 color: theme.styleTypes.success.contrast,
101 right: -66,
102 top: -40,
103 height: 'auto',
104 position: 'absolute',
105 transform: 'rotateZ(45deg)',
106 textAlign: 'center',
107 padding: [5, 50],
108 transformOrigin: 'left bottom',
109 fontSize: 12,
110 boxShadow: '0 2px 6px rgba(0,0,0,0.15)',
111 },
112});
113
114export default @observer @injectSheet(styles) class PlanItem extends Component {
115 static propTypes = {
116 name: PropTypes.string.isRequired,
117 text: PropTypes.string.isRequired,
118 price: PropTypes.number.isRequired,
119 currency: PropTypes.string.isRequired,
120 upgrade: PropTypes.func.isRequired,
121 ctaLabel: PropTypes.string.isRequired,
122 simpleCTA: PropTypes.bool,
123 perUser: PropTypes.bool,
124 classes: PropTypes.object.isRequired,
125 bestValue: PropTypes.bool,
126 className: PropTypes.string,
127 children: PropTypes.element,
128 };
129
130 static defaultProps = {
131 simpleCTA: false,
132 perUser: false,
133 children: null,
134 bestValue: false,
135 className: '',
136 }
137
138 static contextTypes = {
139 intl: intlShape,
140 };
141
142 render() {
143 const {
144 name,
145 text,
146 price,
147 currency,
148 classes,
149 upgrade,
150 ctaLabel,
151 simpleCTA,
152 perUser,
153 bestValue,
154 className,
155 children,
156 } = this.props;
157 const { intl } = this.context;
158
159 const priceParts = `${price}`.split('.');
160
161 return (
162 <div className={classnames({
163 [classes.root]: true,
164 [className]: className,
165 })}
166 >
167 <div className={classes.header}>
168 {bestValue && (
169 <div className={classes.bestValue}>
170 {intl.formatMessage(messages.bestValue)}
171 </div>
172 )}
173 <H2 className={classes.planName}>{name}</H2>
174 {text && (
175 <>
176 <p className={classes.text}>
177 {text}
178 </p>
179 <hr className={classes.divider} />
180 </>
181 )}
182 <p className={classes.priceWrapper}>
183 <span className={classes.currency}>{currency}</span>
184 <span className={classes.price}>
185 {priceParts[0]}
186 <sup>{priceParts[1]}</sup>
187 </span>
188 </p>
189 <p className={classes.interval}>
190 {intl.formatMessage(perUser ? messages.perMonthPerUser : messages.perMonth)}
191 </p>
192 </div>
193
194 <div className={classes.content}>
195 {children}
196
197 <Button
198 className={classnames({
199 [classes.cta]: true,
200 [classes.simpleCTA]: simpleCTA,
201 })}
202 icon={simpleCTA ? mdiArrowRight : null}
203 label={(
204 <>
205 {ctaLabel}
206 </>
207 )}
208 onClick={upgrade}
209 />
210 </div>
211
212 </div>
213 );
214 }
215}
diff --git a/src/features/planSelection/components/PlanSelection.js b/src/features/planSelection/components/PlanSelection.js
deleted file mode 100644
index 819a9df5b..000000000
--- a/src/features/planSelection/components/PlanSelection.js
+++ /dev/null
@@ -1,269 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { defineMessages, intlShape } from 'react-intl';
6import { H1, H2, Icon } from '@meetfranz/ui';
7import color from 'color';
8
9import { mdiArrowRight } from '@mdi/js';
10import PlanItem from './PlanItem';
11import { i18nPlanName } from '../../../helpers/plan-helpers';
12import { DEV_API_FRANZ_WEBSITE, PLANS } from '../../../config';
13import { FeatureList } from '../../../components/ui/FeatureList';
14import Appear from '../../../components/ui/effects/Appear';
15
16const messages = defineMessages({
17 welcome: {
18 id: 'feature.planSelection.fullscreen.welcome',
19 defaultMessage: '!!!Are you ready to choose, {name}',
20 },
21 subheadline: {
22 id: 'feature.planSelection.fullscreen.subheadline',
23 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.',
24 },
25 textFree: {
26 id: 'feature.planSelection.free.text',
27 defaultMessage: '!!!Basic functionality',
28 },
29 textPersonal: {
30 id: 'feature.planSelection.personal.text',
31 defaultMessage: '!!!More services, no waiting - ideal for personal use.',
32 },
33 textProfessional: {
34 id: 'feature.planSelection.pro.text',
35 defaultMessage: '!!!Unlimited services and professional features for you - and your team.',
36 },
37 ctaStayOnFree: {
38 id: 'feature.planSelection.cta.stayOnFree',
39 defaultMessage: '!!!Stay on Free',
40 },
41 ctaDowngradeFree: {
42 id: 'feature.planSelection.cta.ctaDowngradeFree',
43 defaultMessage: '!!!Downgrade to Free',
44 },
45 actionTrial: {
46 id: 'feature.planSelection.cta.trial',
47 defaultMessage: '!!!Start my free 14-days Trial',
48 },
49 shortActionPersonal: {
50 id: 'feature.planSelection.cta.upgradePersonal',
51 defaultMessage: '!!!Choose Personal',
52 },
53 shortActionPro: {
54 id: 'feature.planSelection.cta.upgradePro',
55 defaultMessage: '!!!Choose Professional',
56 },
57 fullFeatureList: {
58 id: 'feature.planSelection.fullFeatureList',
59 defaultMessage: '!!!Complete comparison of all plans',
60 },
61 pricesBasedOnAnnualPayment: {
62 id: 'feature.planSelection.pricesBasedOnAnnualPayment',
63 defaultMessage: '!!!All prices based on yearly payment',
64 },
65});
66
67const styles = theme => ({
68 root: {
69 background: theme.colorModalOverlayBackground,
70 width: '100%',
71 height: '100%',
72 position: 'absolute',
73 top: 0,
74 left: 0,
75 display: 'flex',
76 justifyContent: 'center',
77 alignItems: 'center',
78 zIndex: 999999,
79 overflowY: 'scroll',
80 },
81 container: {
82 // width: '80%',
83 height: 'auto',
84 // background: theme.styleTypes.primary.accent,
85 // padding: 40,
86 borderRadius: theme.borderRadius,
87 maxWidth: 1000,
88
89 '& h1, & h2': {
90 textAlign: 'center',
91 color: theme.styleTypes.primary.contrast,
92 },
93 },
94 plans: {
95 display: 'flex',
96 margin: [40, 0, 0],
97 height: 'auto',
98
99 '& > div': {
100 margin: [0, 15],
101 flex: 1,
102 height: 'auto',
103 background: theme.styleTypes.primary.contrast,
104 boxShadow: [0, 2, 30, color('#000').alpha(0.1).rgb().string()],
105 },
106 },
107 headline: {
108 fontSize: 40,
109 },
110 subheadline: {
111 maxWidth: 660,
112 fontSize: 22,
113 lineHeight: 1.1,
114 margin: [0, 'auto'],
115 },
116 featureList: {
117 '& li': {
118 borderBottom: [1, 'solid', '#CECECE'],
119 },
120 },
121 footer: {
122 display: 'flex',
123 color: theme.styleTypes.primary.contrast,
124 marginTop: 20,
125 padding: [0, 15],
126 },
127 fullFeatureList: {
128 marginRight: 'auto',
129 textAlign: 'center',
130 display: 'flex',
131 justifyContent: 'center',
132 alignItems: 'center',
133 color: `${theme.styleTypes.primary.contrast} !important`,
134
135 '& svg': {
136 marginRight: 5,
137 },
138 },
139 scrollContainer: {
140 border: '1px solid red',
141 overflow: 'scroll-x',
142 },
143 featuredPlan: {
144 transform: ({ isPersonalPlanAvailable }) => (isPersonalPlanAvailable ? 'scale(1.05)' : null),
145 },
146 disclaimer: {
147 textAlign: 'right',
148 margin: [10, 15, 0, 0],
149 },
150});
151
152@injectSheet(styles) @observer
153class PlanSelection extends Component {
154 static propTypes = {
155 classes: PropTypes.object.isRequired,
156 firstname: PropTypes.string.isRequired,
157 plans: PropTypes.object.isRequired,
158 currency: PropTypes.string.isRequired,
159 subscriptionExpired: PropTypes.bool.isRequired,
160 upgradeAccount: PropTypes.func.isRequired,
161 stayOnFree: PropTypes.func.isRequired,
162 hadSubscription: PropTypes.bool.isRequired,
163 isPersonalPlanAvailable: PropTypes.bool,
164 };
165
166 static defaultProps = {
167 isPersonalPlanAvailable: true,
168 }
169
170 static contextTypes = {
171 intl: intlShape,
172 };
173
174 componentDidMount() {
175 }
176
177 render() {
178 const {
179 classes,
180 firstname,
181 plans,
182 currency,
183 subscriptionExpired,
184 upgradeAccount,
185 stayOnFree,
186 hadSubscription,
187 isPersonalPlanAvailable,
188 } = this.props;
189
190 const { intl } = this.context;
191
192 return (
193 <Appear>
194 <div
195 className={classes.root}
196 >
197 <div className={classes.container}>
198 <H1 className={classes.headline}>{intl.formatMessage(messages.welcome, { name: firstname })}</H1>
199 {isPersonalPlanAvailable && (
200 <H2 className={classes.subheadline}>{intl.formatMessage(messages.subheadline)}</H2>
201 )}
202 <div className={classes.plans}>
203 <PlanItem
204 name={i18nPlanName(PLANS.FREE, intl)}
205 text={isPersonalPlanAvailable ? intl.formatMessage(messages.textFree) : null}
206 price={0}
207 currency={currency}
208 ctaLabel={intl.formatMessage(subscriptionExpired ? messages.ctaDowngradeFree : messages.ctaStayOnFree)}
209 upgrade={() => stayOnFree()}
210 simpleCTA
211 >
212 <FeatureList
213 plan={PLANS.FREE}
214 className={classes.featureList}
215 />
216 </PlanItem>
217 <PlanItem
218 name={i18nPlanName(plans.pro.yearly.id, intl)}
219 text={isPersonalPlanAvailable ? intl.formatMessage(messages.textProfessional) : null}
220 price={plans.pro.yearly.price}
221 currency={currency}
222 ctaLabel={intl.formatMessage(hadSubscription ? messages.shortActionPro : messages.actionTrial)}
223 upgrade={() => upgradeAccount(plans.pro.yearly.id)}
224 className={classes.featuredPlan}
225 perUser
226 bestValue={isPersonalPlanAvailable}
227 >
228 <FeatureList
229 plan={isPersonalPlanAvailable ? PLANS.PRO : null}
230 className={classes.featureList}
231 />
232 </PlanItem>
233 {isPersonalPlanAvailable && (
234 <PlanItem
235 name={i18nPlanName(plans.personal.yearly.id, intl)}
236 text={intl.formatMessage(messages.textPersonal)}
237 price={plans.personal.yearly.price}
238 currency={currency}
239 ctaLabel={intl.formatMessage(hadSubscription ? messages.shortActionPersonal : messages.actionTrial)}
240 upgrade={() => upgradeAccount(plans.personal.yearly.id)}
241 >
242 <FeatureList
243 plan={PLANS.PERSONAL}
244 className={classes.featureList}
245 />
246 </PlanItem>
247 )}
248 </div>
249 <div className={classes.footer}>
250 <a
251 href={`${DEV_API_FRANZ_WEBSITE}/pricing`}
252 target="_blank"
253 className={classes.fullFeatureList}
254 >
255 <Icon icon={mdiArrowRight} />
256 {intl.formatMessage(messages.fullFeatureList)}
257 </a>
258 {/* <p className={classes.disclaimer}> */}
259 {intl.formatMessage(messages.pricesBasedOnAnnualPayment)}
260 {/* </p> */}
261 </div>
262 </div>
263 </div>
264 </Appear>
265 );
266 }
267}
268
269export default PlanSelection;
diff --git a/src/features/planSelection/containers/PlanSelectionScreen.js b/src/features/planSelection/containers/PlanSelectionScreen.js
deleted file mode 100644
index 594829c01..000000000
--- a/src/features/planSelection/containers/PlanSelectionScreen.js
+++ /dev/null
@@ -1,120 +0,0 @@
1import React, { Component } from 'react';
2import { observer, inject } from 'mobx-react';
3import PropTypes from 'prop-types';
4import { dialog, app } from '@electron/remote';
5import { defineMessages, intlShape } from 'react-intl';
6
7import FeaturesStore from '../../../stores/FeaturesStore';
8import UserStore from '../../../stores/UserStore';
9import PlanSelection from '../components/PlanSelection';
10import ErrorBoundary from '../../../components/util/ErrorBoundary';
11import { planSelectionStore } from '..';
12import PaymentStore from '../../../stores/PaymentStore';
13
14const messages = defineMessages({
15 dialogTitle: {
16 id: 'feature.planSelection.fullscreen.dialog.title',
17 defaultMessage: '!!!Downgrade your Franz Plan',
18 },
19 dialogMessage: {
20 id: 'feature.planSelection.fullscreen.dialog.message',
21 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.',
22 },
23 dialogCTADowngrade: {
24 id: 'feature.planSelection.fullscreen.dialog.cta.downgrade',
25 defaultMessage: '!!!Downgrade to Free',
26 },
27 dialogCTAUpgrade: {
28 id: 'feature.planSelection.fullscreen.dialog.cta.upgrade',
29 defaultMessage: '!!!Choose Personal',
30 },
31});
32
33@inject('stores', 'actions') @observer
34class PlanSelectionScreen extends Component {
35 static contextTypes = {
36 intl: intlShape,
37 };
38
39 upgradeAccount(planId) {
40 const { upgradeAccount } = this.props.actions.payment;
41
42 upgradeAccount({
43 planId,
44 });
45 }
46
47 render() {
48 if (!planSelectionStore || !planSelectionStore.isFeatureActive || !planSelectionStore.showPlanSelectionOverlay) {
49 return null;
50 }
51
52 const { intl } = this.context;
53
54 const { user, features } = this.props.stores;
55 const { isPersonalPlanAvailable, pricingConfig } = features.features;
56 const { plans, currency } = pricingConfig;
57 const { activateTrial } = this.props.actions.user;
58 const { downgradeAccount, hideOverlay } = this.props.actions.planSelection;
59
60 return (
61 <ErrorBoundary>
62 <PlanSelection
63 firstname={user.data.firstname}
64 plans={plans}
65 currency={currency}
66 upgradeAccount={(planId) => {
67 if (user.data.hadSubscription) {
68 this.upgradeAccount(planId);
69 } else {
70 activateTrial({
71 planId,
72 });
73 }
74 }}
75 stayOnFree={() => {
76 const selection = dialog.showMessageBoxSync(app.mainWindow, {
77 type: 'question',
78 message: intl.formatMessage(messages.dialogTitle),
79 detail: intl.formatMessage(messages.dialogMessage, {
80 currency,
81 price: plans.personal.yearly.price,
82 }),
83 buttons: [
84 intl.formatMessage(messages.dialogCTADowngrade),
85 intl.formatMessage(messages.dialogCTAUpgrade),
86 ],
87 });
88
89 if (selection === 0) {
90 downgradeAccount();
91 hideOverlay();
92 } else {
93 this.upgradeAccount(plans.personal.yearly.id);
94 }
95 }}
96 subscriptionExpired={user.team && user.team.state === 'expired' && !user.team.userHasDowngraded}
97 hadSubscription={user.data.hadSubscription}
98 isPersonalPlanAvailable={isPersonalPlanAvailable}
99 />
100 </ErrorBoundary>
101 );
102 }
103}
104
105export default PlanSelectionScreen;
106
107PlanSelectionScreen.wrappedComponent.propTypes = {
108 stores: PropTypes.shape({
109 features: PropTypes.instanceOf(FeaturesStore).isRequired,
110 user: PropTypes.instanceOf(UserStore).isRequired,
111 }).isRequired,
112 actions: PropTypes.shape({
113 payment: PropTypes.instanceOf(PaymentStore),
114 planSelection: PropTypes.shape({
115 downgradeAccount: PropTypes.func.isRequired,
116 hideOverlay: PropTypes.func.isRequired,
117 }),
118 user: PropTypes.instanceOf(UserStore).isRequired,
119 }).isRequired,
120};
diff --git a/src/features/planSelection/index.js b/src/features/planSelection/index.js
deleted file mode 100644
index b96ad6d8f..000000000
--- a/src/features/planSelection/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
1import { reaction } from 'mobx';
2import PlanSelectionStore from './store';
3
4const debug = require('debug')('Ferdi:feature:planSelection');
5
6export const planSelectionStore = new PlanSelectionStore();
7
8export default function initPlanSelection(stores, actions) {
9 stores.planSelection = planSelectionStore;
10 const { features } = stores;
11
12 // Toggle planSelection feature
13 reaction(
14 () => features.features.isPlanSelectionEnabled,
15 (isEnabled) => {
16 if (isEnabled) {
17 debug('Initializing `planSelection` feature');
18 planSelectionStore.start(stores, actions);
19 } else if (planSelectionStore.isFeatureActive) {
20 debug('Disabling `planSelection` feature');
21 planSelectionStore.stop();
22 }
23 },
24 {
25 fireImmediately: true,
26 },
27 );
28}
diff --git a/src/features/planSelection/store.js b/src/features/planSelection/store.js
deleted file mode 100644
index de8fc7584..000000000
--- a/src/features/planSelection/store.js
+++ /dev/null
@@ -1,68 +0,0 @@
1import {
2 action,
3 observable,
4 computed,
5} from 'mobx';
6
7import { planSelectionActions } from './actions';
8import { FeatureStore } from '../utils/FeatureStore';
9import { createActionBindings } from '../utils/ActionBinding';
10import { downgradeUserRequest } from './api';
11
12const debug = require('debug')('Ferdi:feature:planSelection:store');
13
14export default class PlanSelectionStore extends FeatureStore {
15 @observable isFeatureEnabled = false;
16
17 @observable isFeatureActive = false;
18
19 @observable hideOverlay = false;
20
21 @computed get showPlanSelectionOverlay() {
22 const { team, isPremium } = this.stores.user;
23 if (team && !this.hideOverlay && !isPremium) {
24 return team.state === 'expired' && !team.userHasDowngraded;
25 }
26
27 return false;
28 }
29
30 // ========== PUBLIC API ========= //
31
32 @action start(stores, actions, api) {
33 debug('PlanSelectionStore::start');
34 this.stores = stores;
35 this.actions = actions;
36 this.api = api;
37
38 // ACTIONS
39
40 this._registerActions(createActionBindings([
41 [planSelectionActions.downgradeAccount, this._downgradeAccount],
42 [planSelectionActions.hideOverlay, this._hideOverlay],
43 ]));
44
45 this.isFeatureActive = true;
46 }
47
48 @action stop() {
49 super.stop();
50 debug('PlanSelectionStore::stop');
51 this.isFeatureActive = false;
52 }
53
54 // ========== PRIVATE METHODS ========= //
55
56 // Actions
57 @action _downgradeAccount = () => {
58 downgradeUserRequest.execute();
59 }
60
61 @action _hideOverlay = () => {
62 this.hideOverlay = true;
63 }
64
65 @action _showOverlay = () => {
66 this.hideOverlay = false;
67 }
68}
diff --git a/src/features/publishDebugInfo/Component.js b/src/features/publishDebugInfo/Component.js
index f97a7c750..5387bd358 100644
--- a/src/features/publishDebugInfo/Component.js
+++ b/src/features/publishDebugInfo/Component.js
@@ -46,7 +46,7 @@ const messages = defineMessages({
46 }, 46 },
47}); 47});
48 48
49const styles = theme => ({ 49const styles = (theme) => ({
50 container: { 50 container: {
51 minWidth: '70vw', 51 minWidth: '70vw',
52 }, 52 },
@@ -186,10 +186,10 @@ export default @injectSheet(styles) @inject('stores', 'actions') @observer class
186 <> 186 <>
187 <p className={classes.info}>{intl.formatMessage(messages.info)}</p> 187 <p className={classes.info}>{intl.formatMessage(messages.info)}</p>
188 188
189 <a href={`${DEBUG_API}/privacy.html`} target="_blank" className={classes.link}> 189 <a href={`${DEBUG_API}/privacy.html`} target="_blank" className={classes.link} rel="noreferrer">
190 {intl.formatMessage(messages.privacy)} 190 {intl.formatMessage(messages.privacy)}
191 </a> 191 </a>
192 <a href={`${DEBUG_API}/terms.html`} target="_blank" className={classes.link}> 192 <a href={`${DEBUG_API}/terms.html`} target="_blank" className={classes.link} rel="noreferrer">
193 {intl.formatMessage(messages.terms)} 193 {intl.formatMessage(messages.terms)}
194 </a> 194 </a>
195 195
diff --git a/src/features/quickSwitch/Component.js b/src/features/quickSwitch/Component.js
index 04822db71..812f2c04b 100644
--- a/src/features/quickSwitch/Component.js
+++ b/src/features/quickSwitch/Component.js
@@ -28,7 +28,7 @@ const messages = defineMessages({
28 }, 28 },
29}); 29});
30 30
31const styles = theme => ({ 31const styles = (theme) => ({
32 modal: { 32 modal: {
33 width: '80%', 33 width: '80%',
34 maxWidth: 600, 34 maxWidth: 600,
@@ -139,7 +139,7 @@ export default @injectSheet(styles) @inject('stores', 'actions') @observer class
139 if (this.state.search && compact(invoke(this.state.search, 'match', /^[a-z0-9]/i)).length > 0) { 139 if (this.state.search && compact(invoke(this.state.search, 'match', /^[a-z0-9]/i)).length > 0) {
140 // Apply simple search algorythm to list of all services 140 // Apply simple search algorythm to list of all services
141 services = this.props.stores.services.allDisplayed; 141 services = this.props.stores.services.allDisplayed;
142 services = services.filter(service => service.name.toLowerCase().search(this.state.search.toLowerCase()) !== -1); 142 services = services.filter((service) => service.name.toLowerCase().search(this.state.search.toLowerCase()) !== -1);
143 } else { 143 } else {
144 // Add the currently active service first 144 // Add the currently active service first
145 const currentService = this.props.stores.services.active; 145 const currentService = this.props.stores.services.active;
diff --git a/src/features/serviceLimit/components/LimitReachedInfobox.js b/src/features/serviceLimit/components/LimitReachedInfobox.js
deleted file mode 100644
index 424c92990..000000000
--- a/src/features/serviceLimit/components/LimitReachedInfobox.js
+++ /dev/null
@@ -1,75 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6import { Infobox } from '@meetfranz/ui';
7
8const messages = defineMessages({
9 limitReached: {
10 id: 'feature.serviceLimit.limitReached',
11 defaultMessage: '!!!You have added {amount} of {limit} services. Please upgrade your account to add more services.',
12 },
13 action: {
14 id: 'premiumFeature.button.upgradeAccount',
15 defaultMessage: '!!!Upgrade account',
16 },
17});
18
19const styles = theme => ({
20 container: {
21 height: 'auto',
22 background: theme.styleTypes.warning.accent,
23 color: theme.styleTypes.warning.contrast,
24 borderRadius: 0,
25 marginBottom: 0,
26
27 '& > div': {
28 marginBottom: 0,
29 },
30
31 '& button': {
32 color: theme.styleTypes.primary.contrast,
33 },
34 },
35});
36
37@inject('stores', 'actions') @injectSheet(styles) @observer
38class LimitReachedInfobox extends Component {
39 static propTypes = {
40 classes: PropTypes.object.isRequired,
41 stores: PropTypes.object.isRequired,
42 actions: PropTypes.object.isRequired,
43 };
44
45 static contextTypes = {
46 intl: intlShape,
47 };
48
49 render() {
50 const { classes, stores, actions } = this.props;
51 const { intl } = this.context;
52
53 const {
54 serviceLimit,
55 } = stores;
56
57 if (!serviceLimit.userHasReachedServiceLimit) return null;
58
59 return (
60 <Infobox
61 icon="mdiInformation"
62 type="warning"
63 className={classes.container}
64 ctaLabel={intl.formatMessage(messages.action)}
65 ctaOnClick={() => {
66 actions.ui.openSettings({ path: 'user' });
67 }}
68 >
69 {intl.formatMessage(messages.limitReached, { amount: serviceLimit.serviceCount, limit: serviceLimit.serviceLimit })}
70 </Infobox>
71 );
72 }
73}
74
75export default LimitReachedInfobox;
diff --git a/src/features/serviceLimit/index.js b/src/features/serviceLimit/index.js
deleted file mode 100644
index f867e3d87..000000000
--- a/src/features/serviceLimit/index.js
+++ /dev/null
@@ -1,31 +0,0 @@
1import { reaction } from 'mobx';
2import { ServiceLimitStore } from './store';
3
4const debug = require('debug')('Ferdi:feature:serviceLimit');
5
6let store = null;
7
8export const serviceLimitStore = new ServiceLimitStore();
9
10export default function initServiceLimit(stores, actions) {
11 const { features } = stores;
12
13 // Toggle serviceLimit feature
14 reaction(
15 () => (
16 features.features.isServiceLimitEnabled
17 ),
18 (isEnabled) => {
19 if (isEnabled) {
20 debug('Initializing `serviceLimit` feature');
21 store = serviceLimitStore.start(stores, actions);
22 } else if (store) {
23 debug('Disabling `serviceLimit` feature');
24 serviceLimitStore.stop();
25 }
26 },
27 {
28 fireImmediately: true,
29 },
30 );
31}
diff --git a/src/features/serviceLimit/store.js b/src/features/serviceLimit/store.js
deleted file mode 100644
index b1e55a1fc..000000000
--- a/src/features/serviceLimit/store.js
+++ /dev/null
@@ -1,42 +0,0 @@
1import { computed, observable } from 'mobx';
2import { FeatureStore } from '../utils/FeatureStore';
3import { DEFAULT_SERVICE_LIMIT } from '../../config';
4
5const debug = require('debug')('Ferdi:feature:serviceLimit:store');
6
7export class ServiceLimitStore extends FeatureStore {
8 @observable isServiceLimitEnabled = false;
9
10 start(stores, actions) {
11 debug('start');
12 this.stores = stores;
13 this.actions = actions;
14
15 this.isServiceLimitEnabled = false;
16 }
17
18 stop() {
19 super.stop();
20
21 this.isServiceLimitEnabled = false;
22 }
23
24 @computed get userHasReachedServiceLimit() {
25 return false;
26 // if (!this.isServiceLimitEnabled) return false;
27
28 // return this.serviceLimit !== 0 && this.serviceCount >= this.serviceLimit;
29 }
30
31 @computed get serviceLimit() {
32 if (!this.isServiceLimitEnabled || this.stores.features.features.serviceLimitCount === 0) return 0;
33
34 return this.stores.features.features.serviceLimitCount || DEFAULT_SERVICE_LIMIT;
35 }
36
37 @computed get serviceCount() {
38 return this.stores.services.all.length;
39 }
40}
41
42export default ServiceLimitStore;
diff --git a/src/features/serviceProxy/index.js b/src/features/serviceProxy/index.js
index f74f5f0b2..eb7116651 100644
--- a/src/features/serviceProxy/index.js
+++ b/src/features/serviceProxy/index.js
@@ -5,7 +5,6 @@ const debug = require('debug')('Ferdi:feature:serviceProxy');
5 5
6export const config = observable({ 6export const config = observable({
7 isEnabled: true, 7 isEnabled: true,
8 isPremium: true,
9}); 8});
10 9
11export default function init(stores) { 10export default function init(stores) {
@@ -13,7 +12,6 @@ export default function init(stores) {
13 12
14 autorun(() => { 13 autorun(() => {
15 config.isEnabled = true; 14 config.isEnabled = true;
16 config.isIncludedInCurrentPlan = true;
17 15
18 const services = stores.services.enabled; 16 const services = stores.services.enabled;
19 const proxySettings = stores.settings.proxy; 17 const proxySettings = stores.settings.proxy;
diff --git a/src/features/shareFranz/Component.js b/src/features/shareFranz/Component.js
index f7f8dc41c..cc2e81b70 100644
--- a/src/features/shareFranz/Component.js
+++ b/src/features/shareFranz/Component.js
@@ -36,15 +36,15 @@ const messages = defineMessages({
36 }, 36 },
37 shareTextEmail: { 37 shareTextEmail: {
38 id: 'feature.shareFranz.shareText.email', 38 id: 'feature.shareFranz.shareText.email',
39 defaultMessage: '!!! I\'ve added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com', 39 defaultMessage: '!!! I\'ve added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com',
40 }, 40 },
41 shareTextTwitter: { 41 shareTextTwitter: {
42 id: 'feature.shareFranz.shareText.twitter', 42 id: 'feature.shareFranz.shareText.twitter',
43 defaultMessage: '!!! I\'ve added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger', 43 defaultMessage: '!!! I\'ve added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger',
44 }, 44 },
45}); 45});
46 46
47const styles = theme => ({ 47const styles = (theme) => ({
48 modal: { 48 modal: {
49 width: '80%', 49 width: '80%',
50 maxWidth: 600, 50 maxWidth: 600,
diff --git a/src/features/shareFranz/index.js b/src/features/shareFranz/index.js
index 34475f674..9add0f65e 100644
--- a/src/features/shareFranz/index.js
+++ b/src/features/shareFranz/index.js
@@ -1,8 +1,6 @@
1import { reaction } from 'mobx'; 1import { reaction } from 'mobx';
2import ms from 'ms'; 2import ms from 'ms';
3import { state as ModalState } from './store'; 3import { state as ModalState } from './store';
4import { state as delayAppState } from '../delayApp';
5import { planSelectionStore } from '../planSelection';
6 4
7export { default as Component } from './Component'; 5export { default as Component } from './Component';
8 6
@@ -19,21 +17,14 @@ export default function initialize(stores) {
19 17
20 function showModal() { 18 function showModal() {
21 debug('Would have showed share window'); 19 debug('Would have showed share window');
22
23 // state.isModalVisible = true;
24 } 20 }
25 21
26 reaction( 22 reaction(
27 () => stores.user.isLoggedIn, 23 () => stores.user.isLoggedIn,
28 () => { 24 () => {
29 setTimeout(() => { 25 setTimeout(() => {
30 if (stores.settings.stats.appStarts % 50 === 0 && !planSelectionStore.showPlanSelectionOverlay) { 26 if (stores.settings.stats.appStarts % 50 === 0) {
31 if (delayAppState.isDelayAppScreenVisible) { 27 showModal();
32 debug('Delaying share modal by 5 minutes');
33 setTimeout(() => showModal(), ms('5m'));
34 } else {
35 showModal();
36 }
37 } 28 }
38 }, ms('2s')); 29 }, ms('2s'));
39 }, 30 },
diff --git a/src/features/spellchecker/index.js b/src/features/spellchecker/index.js
deleted file mode 100644
index 6a393e250..000000000
--- a/src/features/spellchecker/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
1import { autorun, observable } from 'mobx';
2
3import { DEFAULT_FEATURES_CONFIG } from '../../config';
4
5const debug = require('debug')('Ferdi:feature:spellchecker');
6
7export const config = observable({
8 isIncludedInCurrentPlan: DEFAULT_FEATURES_CONFIG.isSpellcheckerIncludedInCurrentPlan,
9});
10
11export default function init() {
12 debug('Initializing `spellchecker` feature');
13
14 autorun(() => {
15 // const { isSpellcheckerIncludedInCurrentPlan } = stores.features.features;
16
17 // config.isIncludedInCurrentPlan = isSpellcheckerIncludedInCurrentPlan !== undefined ? isSpellcheckerIncludedInCurrentPlan : DEFAULT_FEATURES_CONFIG.isSpellcheckerIncludedInCurrentPlan;
18
19 // if (!stores.user.data.isPremium && config.isIncludedInCurrentPlan && stores.settings.app.enableSpellchecking) {
20 // debug('Override settings.spellcheckerEnabled flag to false');
21
22 // Object.assign(stores.settings.app, {
23 // enableSpellchecking: false,
24 // });
25 // }
26 });
27}
diff --git a/src/features/todos/components/TodosWebview.js b/src/features/todos/components/TodosWebview.js
index ca8460f94..2dc30cdf2 100644
--- a/src/features/todos/components/TodosWebview.js
+++ b/src/features/todos/components/TodosWebview.js
@@ -35,26 +35,6 @@ const styles = (theme) => ({
35 zIndex: 400, 35 zIndex: 400,
36 background: theme.todos.dragIndicator.background, 36 background: theme.todos.dragIndicator.background,
37 }, 37 },
38 premiumContainer: {
39 display: 'flex',
40 flexDirection: 'column',
41 justifyContent: 'center',
42 alignItems: 'center',
43 width: '80%',
44 maxWidth: 300,
45 margin: [0, 'auto'],
46 textAlign: 'center',
47 },
48 premiumIcon: {
49 marginBottom: 40,
50 background: theme.styleTypes.primary.accent,
51 fill: theme.styleTypes.primary.contrast,
52 padding: 10,
53 borderRadius: 10,
54 },
55 premiumCTA: {
56 marginTop: 40,
57 },
58 isTodosServiceActive: { 38 isTodosServiceActive: {
59 width: 'calc(100% - 368px)', 39 width: 'calc(100% - 368px)',
60 position: 'absolute', 40 position: 'absolute',
diff --git a/src/features/todos/containers/TodosScreen.js b/src/features/todos/containers/TodosScreen.js
index 6425746e6..d05e24e56 100644
--- a/src/features/todos/containers/TodosScreen.js
+++ b/src/features/todos/containers/TodosScreen.js
@@ -24,10 +24,10 @@ class TodosScreen extends Component {
24 isVisible={todosStore.isTodosPanelVisible} 24 isVisible={todosStore.isTodosPanelVisible}
25 togglePanel={todoActions.toggleTodosPanel} 25 togglePanel={todoActions.toggleTodosPanel}
26 handleClientMessage={todoActions.handleClientMessage} 26 handleClientMessage={todoActions.handleClientMessage}
27 setTodosWebview={webview => todoActions.setTodosWebview({ webview })} 27 setTodosWebview={(webview) => todoActions.setTodosWebview({ webview })}
28 width={todosStore.width} 28 width={todosStore.width}
29 minWidth={TODOS_MIN_WIDTH} 29 minWidth={TODOS_MIN_WIDTH}
30 resize={width => todoActions.resize({ width })} 30 resize={(width) => todoActions.resize({ width })}
31 userAgent={todosStore.userAgent} 31 userAgent={todosStore.userAgent}
32 todoUrl={todosStore.todoUrl} 32 todoUrl={todosStore.todoUrl}
33 isTodoUrlValid={todosStore.isTodoUrlValid} 33 isTodoUrlValid={todosStore.isTodoUrlValid}
diff --git a/src/features/todos/store.js b/src/features/todos/store.js
index 429507927..f283c1e59 100644
--- a/src/features/todos/store.js
+++ b/src/features/todos/store.js
@@ -20,7 +20,6 @@ import { FeatureStore } from '../utils/FeatureStore';
20import { createReactions } from '../../stores/lib/Reaction'; 20import { createReactions } from '../../stores/lib/Reaction';
21import { createActionBindings } from '../utils/ActionBinding'; 21import { createActionBindings } from '../utils/ActionBinding';
22import { IPC, TODOS_ROUTES } from './constants'; 22import { IPC, TODOS_ROUTES } from './constants';
23import { state as delayAppState } from '../delayApp';
24import UserAgent from '../../models/UserAgent'; 23import UserAgent from '../../models/UserAgent';
25 24
26const debug = require('debug')('Ferdi:feature:todos:store'); 25const debug = require('debug')('Ferdi:feature:todos:store');
@@ -46,7 +45,7 @@ export default class TodoStore extends FeatureStore {
46 45
47 @computed get isTodosPanelForceHidden() { 46 @computed get isTodosPanelForceHidden() {
48 const { isAnnouncementShown } = this.stores.announcements; 47 const { isAnnouncementShown } = this.stores.announcements;
49 return delayAppState.isDelayAppScreenVisible || !this.isFeatureEnabledByUser || isAnnouncementShown; 48 return !this.isFeatureEnabledByUser || isAnnouncementShown;
50 } 49 }
51 50
52 @computed get isTodosPanelVisible() { 51 @computed get isTodosPanelVisible() {
@@ -123,12 +122,6 @@ export default class TodoStore extends FeatureStore {
123 this._registerReactions(this._allReactions); 122 this._registerReactions(this._allReactions);
124 123
125 this.isFeatureActive = true; 124 this.isFeatureActive = true;
126
127 if (this.settings.isFeatureEnabledByUser === undefined) {
128 this._updateSettings({
129 isFeatureEnabledByUser: DEFAULT_IS_FEATURE_ENABLED_BY_USER,
130 });
131 }
132 } 125 }
133 126
134 @action stop() { 127 @action stop() {
@@ -266,6 +259,12 @@ export default class TodoStore extends FeatureStore {
266 _firstLaunchReaction = () => { 259 _firstLaunchReaction = () => {
267 const { stats } = this.stores.settings.all; 260 const { stats } = this.stores.settings.all;
268 261
262 if (this.settings.isFeatureEnabledByUser === undefined) {
263 this._updateSettings({
264 isFeatureEnabledByUser: DEFAULT_IS_FEATURE_ENABLED_BY_USER,
265 });
266 }
267
269 // Hide todos layer on first app start but show on second 268 // Hide todos layer on first app start but show on second
270 if (stats.appStarts <= 1) { 269 if (stats.appStarts <= 1) {
271 this._updateSettings({ 270 this._updateSettings({
diff --git a/src/features/trialStatusBar/actions.js b/src/features/trialStatusBar/actions.js
deleted file mode 100644
index 38df76458..000000000
--- a/src/features/trialStatusBar/actions.js
+++ /dev/null
@@ -1,13 +0,0 @@
1import PropTypes from 'prop-types';
2import { createActionsFromDefinitions } from '../../actions/lib/actions';
3
4export const trialStatusBarActions = createActionsFromDefinitions({
5 upgradeAccount: {
6 planId: PropTypes.string.isRequired,
7 onCloseWindow: PropTypes.func.isRequired,
8 },
9 downgradeAccount: {},
10 hideOverlay: {},
11}, PropTypes.checkPropTypes);
12
13export default trialStatusBarActions;
diff --git a/src/features/trialStatusBar/components/ProgressBar.js b/src/features/trialStatusBar/components/ProgressBar.js
deleted file mode 100644
index 41b74d396..000000000
--- a/src/features/trialStatusBar/components/ProgressBar.js
+++ /dev/null
@@ -1,45 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5
6const styles = theme => ({
7 root: {
8 background: theme.trialStatusBar.progressBar.background,
9 width: '25%',
10 maxWidth: 200,
11 height: 8,
12 display: 'flex',
13 alignItems: 'center',
14 borderRadius: theme.borderRadius,
15 overflow: 'hidden',
16 },
17 progress: {
18 background: theme.trialStatusBar.progressBar.progressIndicator,
19 width: ({ percent }) => `${percent}%`,
20 height: '100%',
21 },
22});
23
24@injectSheet(styles) @observer
25class ProgressBar extends Component {
26 static propTypes = {
27 classes: PropTypes.object.isRequired,
28 };
29
30 render() {
31 const {
32 classes,
33 } = this.props;
34
35 return (
36 <div
37 className={classes.root}
38 >
39 <div className={classes.progress} />
40 </div>
41 );
42 }
43}
44
45export default ProgressBar;
diff --git a/src/features/trialStatusBar/components/TrialStatusBar.js b/src/features/trialStatusBar/components/TrialStatusBar.js
deleted file mode 100644
index b8fe4acc9..000000000
--- a/src/features/trialStatusBar/components/TrialStatusBar.js
+++ /dev/null
@@ -1,135 +0,0 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { defineMessages, intlShape } from 'react-intl';
6import { Icon } from '@meetfranz/ui';
7import { mdiArrowRight, mdiWindowClose } from '@mdi/js';
8import classnames from 'classnames';
9
10import ProgressBar from './ProgressBar';
11
12const messages = defineMessages({
13 restTime: {
14 id: 'feature.trialStatusBar.restTime',
15 defaultMessage: '!!!Your Free Franz {plan} Trial ends in {time}.',
16 },
17 expired: {
18 id: 'feature.trialStatusBar.expired',
19 defaultMessage: '!!!Your free Franz {plan} Trial has expired, please upgrade your account.',
20 },
21 cta: {
22 id: 'feature.trialStatusBar.cta',
23 defaultMessage: '!!!Upgrade now',
24 },
25});
26
27const styles = theme => ({
28 root: {
29 background: theme.trialStatusBar.bar.background,
30 width: '100%',
31 height: 25,
32 order: 10,
33 display: 'flex',
34 alignItems: 'center',
35 fontSize: 12,
36 padding: [0, 10],
37 justifyContent: 'flex-end',
38 },
39 ended: {
40 background: theme.styleTypes.warning.accent,
41 color: theme.styleTypes.warning.contrast,
42 },
43 message: {
44 marginLeft: 20,
45 },
46 action: {
47 marginLeft: 20,
48 fontSize: 12,
49 color: theme.colorText,
50 textDecoration: 'underline',
51 display: 'flex',
52
53 '& svg': {
54 margin: [1, 2, 0, 0],
55 },
56 },
57});
58
59@injectSheet(styles) @observer
60class TrialStatusBar extends Component {
61 static propTypes = {
62 planName: PropTypes.string.isRequired,
63 percent: PropTypes.number.isRequired,
64 upgradeAccount: PropTypes.func.isRequired,
65 hideOverlay: PropTypes.func.isRequired,
66 trialEnd: PropTypes.string.isRequired,
67 hasEnded: PropTypes.bool.isRequired,
68 classes: PropTypes.object.isRequired,
69 };
70
71 static contextTypes = {
72 intl: intlShape,
73 };
74
75 render() {
76 const {
77 planName,
78 percent,
79 upgradeAccount,
80 hideOverlay,
81 trialEnd,
82 hasEnded,
83 classes,
84 } = this.props;
85
86 const { intl } = this.context;
87
88 return (
89 <div
90 className={classnames({
91 [classes.root]: true,
92 [classes.ended]: hasEnded,
93 })}
94 >
95 <ProgressBar
96 percent={percent}
97 />
98 {' '}
99 <span className={classes.message}>
100 {!hasEnded ? (
101 intl.formatMessage(messages.restTime, {
102 plan: planName,
103 time: trialEnd,
104 })
105 ) : (
106 intl.formatMessage(messages.expired, {
107 plan: planName,
108 })
109 )}
110 </span>
111 <button
112 className={classes.action}
113 type="button"
114 onClick={() => {
115 upgradeAccount();
116 }}
117 >
118 <Icon icon={mdiArrowRight} />
119 {intl.formatMessage(messages.cta)}
120 </button>
121 <button
122 className={classes.action}
123 type="button"
124 onClick={() => {
125 hideOverlay();
126 }}
127 >
128 <Icon icon={mdiWindowClose} />
129 </button>
130 </div>
131 );
132 }
133}
134
135export default TrialStatusBar;
diff --git a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js
deleted file mode 100644
index e0f5ab5f2..000000000
--- a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js
+++ /dev/null
@@ -1,112 +0,0 @@
1import React, { Component } from 'react';
2import { observer, inject } from 'mobx-react';
3import PropTypes from 'prop-types';
4import ms from 'ms';
5import { intlShape } from 'react-intl';
6
7import FeaturesStore from '../../../stores/FeaturesStore';
8import UserStore from '../../../stores/UserStore';
9import TrialStatusBar from '../components/TrialStatusBar';
10import ErrorBoundary from '../../../components/util/ErrorBoundary';
11import { trialStatusBarStore } from '..';
12import { i18nPlanName } from '../../../helpers/plan-helpers';
13import PaymentStore from '../../../stores/PaymentStore';
14
15@inject('stores', 'actions')
16@observer
17class TrialStatusBarScreen extends Component {
18 static contextTypes = {
19 intl: intlShape,
20 };
21
22 state = {
23 showOverlay: true,
24 percent: 0,
25 restTime: '',
26 hasEnded: false,
27 };
28
29 percentInterval = null;
30
31 componentDidMount() {
32 this.percentInterval = setInterval(() => {
33 this.calculateRestTime();
34 }, ms('1m'));
35
36 this.calculateRestTime();
37 }
38
39 componentWillUnmount() {
40 clearInterval(this.percentInterval);
41 }
42
43 calculateRestTime() {
44 const { trialEndTime } = trialStatusBarStore;
45 const percent = (
46 Math.abs(100 - Math.abs(trialEndTime.asMilliseconds()) * 100) / ms('14d')
47 ).toFixed(2);
48 const restTime = trialEndTime.humanize();
49 const hasEnded = trialEndTime.asMilliseconds() > 0;
50
51 this.setState({
52 percent,
53 restTime,
54 hasEnded,
55 });
56 }
57
58 hideOverlay() {
59 this.setState({
60 showOverlay: false,
61 });
62 }
63
64 render() {
65 const { intl } = this.context;
66
67 const {
68 showOverlay, percent, restTime, hasEnded,
69 } = this.state;
70
71 if (
72 !trialStatusBarStore
73 || !trialStatusBarStore.isFeatureActive
74 || !showOverlay
75 || !trialStatusBarStore.showTrialStatusBarOverlay
76 ) {
77 return null;
78 }
79
80 const { user } = this.props.stores;
81 const { upgradeAccount } = this.props.actions.payment;
82
83 const planName = i18nPlanName(user.team.plan, intl);
84
85 return (
86 <ErrorBoundary>
87 <TrialStatusBar
88 planName={planName}
89 percent={parseFloat(percent < 5 ? 5 : percent)}
90 trialEnd={restTime}
91 upgradeAccount={() => upgradeAccount({
92 planId: user.team.plan,
93 })}
94 hideOverlay={() => this.hideOverlay()}
95 hasEnded={hasEnded}
96 />
97 </ErrorBoundary>
98 );
99 }
100}
101
102export default TrialStatusBarScreen;
103
104TrialStatusBarScreen.wrappedComponent.propTypes = {
105 stores: PropTypes.shape({
106 features: PropTypes.instanceOf(FeaturesStore).isRequired,
107 user: PropTypes.instanceOf(UserStore).isRequired,
108 }).isRequired,
109 actions: PropTypes.shape({
110 payment: PropTypes.instanceOf(PaymentStore),
111 }).isRequired,
112};
diff --git a/src/features/trialStatusBar/index.js b/src/features/trialStatusBar/index.js
deleted file mode 100644
index 987b5c04e..000000000
--- a/src/features/trialStatusBar/index.js
+++ /dev/null
@@ -1,30 +0,0 @@
1import { reaction } from 'mobx';
2import TrialStatusBarStore from './store';
3
4const debug = require('debug')('Ferdi:feature:trialStatusBar');
5
6export const GA_CATEGORY_TRIAL_STATUS_BAR = 'trialStatusBar';
7
8export const trialStatusBarStore = new TrialStatusBarStore();
9
10export default function initTrialStatusBar(stores, actions) {
11 stores.trialStatusBar = trialStatusBarStore;
12 const { features } = stores;
13
14 // Toggle trialStatusBar feature
15 reaction(
16 () => features.features.isTrialStatusBarEnabled,
17 (isEnabled) => {
18 if (isEnabled) {
19 debug('Initializing `trialStatusBar` feature');
20 trialStatusBarStore.start(stores, actions);
21 } else if (trialStatusBarStore.isFeatureActive) {
22 debug('Disabling `trialStatusBar` feature');
23 trialStatusBarStore.stop();
24 }
25 },
26 {
27 fireImmediately: true,
28 },
29 );
30}
diff --git a/src/features/trialStatusBar/store.js b/src/features/trialStatusBar/store.js
deleted file mode 100644
index 858a08238..000000000
--- a/src/features/trialStatusBar/store.js
+++ /dev/null
@@ -1,72 +0,0 @@
1import {
2 action,
3 observable,
4 computed,
5} from 'mobx';
6import moment from 'moment';
7
8import { trialStatusBarActions } from './actions';
9import { FeatureStore } from '../utils/FeatureStore';
10import { createActionBindings } from '../utils/ActionBinding';
11
12const debug = require('debug')('Ferdi:feature:trialStatusBar:store');
13
14export default class TrialStatusBarStore extends FeatureStore {
15 @observable isFeatureActive = false;
16
17 @observable isFeatureEnabled = false;
18
19 @computed get showTrialStatusBarOverlay() {
20 if (this.isFeatureActive) {
21 const { team } = this.stores.user;
22 if (team && !this.hideOverlay) {
23 return team.state !== 'expired' && team.isTrial;
24 }
25 }
26
27 return false;
28 }
29
30 @computed get trialEndTime() {
31 if (this.isFeatureActive) {
32 const { team } = this.stores.user;
33
34 if (team && !this.hideOverlay) {
35 return moment.duration(moment().diff(team.trialEnd));
36 }
37 }
38
39 return moment.duration();
40 }
41
42 // ========== PUBLIC API ========= //
43
44 @action start(stores, actions, api) {
45 debug('TrialStatusBarStore::start');
46 this.stores = stores;
47 this.actions = actions;
48 this.api = api;
49
50 // ACTIONS
51
52 this._registerActions(createActionBindings([
53 [trialStatusBarActions.hideOverlay, this._hideOverlay],
54 ]));
55
56 this.isFeatureActive = true;
57 }
58
59 @action stop() {
60 super.stop();
61 debug('TrialStatusBarStore::stop');
62 this.isFeatureActive = false;
63 }
64
65 // ========== PRIVATE METHODS ========= //
66
67 // Actions
68
69 @action _hideOverlay = () => {
70 this.hideOverlay = true;
71 }
72}
diff --git a/src/features/utils/ActionBinding.js b/src/features/utils/ActionBinding.js
index 497aa071b..787166d44 100644
--- a/src/features/utils/ActionBinding.js
+++ b/src/features/utils/ActionBinding.js
@@ -24,6 +24,6 @@ export default class ActionBinding {
24 } 24 }
25} 25}
26 26
27export const createActionBindings = actions => ( 27export const createActionBindings = (actions) => (
28 actions.map(a => new ActionBinding(a)) 28 actions.map((a) => new ActionBinding(a))
29); 29);
diff --git a/src/features/utils/FeatureStore.js b/src/features/utils/FeatureStore.js
index 0bc10e176..4d4e217a9 100644
--- a/src/features/utils/FeatureStore.js
+++ b/src/features/utils/FeatureStore.js
@@ -16,11 +16,11 @@ export class FeatureStore {
16 } 16 }
17 17
18 _startActions(actions = this._actions) { 18 _startActions(actions = this._actions) {
19 actions.forEach(a => a.start()); 19 actions.forEach((a) => a.start());
20 } 20 }
21 21
22 _stopActions(actions = this._actions) { 22 _stopActions(actions = this._actions) {
23 actions.forEach(a => a.stop()); 23 actions.forEach((a) => a.stop());
24 } 24 }
25 25
26 // REACTIONS 26 // REACTIONS
@@ -31,10 +31,10 @@ export class FeatureStore {
31 } 31 }
32 32
33 _startReactions(reactions = this._reactions) { 33 _startReactions(reactions = this._reactions) {
34 reactions.forEach(r => r.start()); 34 reactions.forEach((r) => r.start());
35 } 35 }
36 36
37 _stopReactions(reactions = this._reactions) { 37 _stopReactions(reactions = this._reactions) {
38 reactions.forEach(r => r.stop()); 38 reactions.forEach((r) => r.stop());
39 } 39 }
40} 40}
diff --git a/src/features/webControls/components/WebControls.js b/src/features/webControls/components/WebControls.js
index b9403bd0d..9a95eb2d2 100644
--- a/src/features/webControls/components/WebControls.js
+++ b/src/features/webControls/components/WebControls.js
@@ -6,7 +6,11 @@ import { Icon } from '@meetfranz/ui';
6import { defineMessages, intlShape } from 'react-intl'; 6import { defineMessages, intlShape } from 'react-intl';
7 7
8import { 8import {
9 mdiReload, mdiArrowRight, mdiArrowLeft, mdiHomeOutline, mdiEarth, 9 mdiReload,
10 mdiArrowRight,
11 mdiArrowLeft,
12 mdiHomeOutline,
13 mdiEarth,
10} from '@mdi/js'; 14} from '@mdi/js';
11 15
12const messages = defineMessages({ 16const messages = defineMessages({
@@ -32,6 +36,12 @@ const messages = defineMessages({
32 }, 36 },
33}); 37});
34 38
39let buttonTransition = 'none';
40
41if (window && window.matchMedia('(prefers-reduced-motion: no-preference)')) {
42 buttonTransition = 'opacity 0.25s';
43}
44
35const styles = theme => ({ 45const styles = theme => ({
36 root: { 46 root: {
37 background: theme.colorBackground, 47 background: theme.colorBackground,
@@ -51,7 +61,7 @@ const styles = theme => ({
51 button: { 61 button: {
52 width: 30, 62 width: 30,
53 height: 50, 63 height: 50,
54 transition: 'opacity 0.25s', 64 transition: buttonTransition,
55 65
56 '&:hover': { 66 '&:hover': {
57 opacity: 0.8, 67 opacity: 0.8,
@@ -83,7 +93,8 @@ const styles = theme => ({
83 }, 93 },
84}); 94});
85 95
86@injectSheet(styles) @observer 96@injectSheet(styles)
97@observer
87class WebControls extends Component { 98class WebControls extends Component {
88 static propTypes = { 99 static propTypes = {
89 classes: PropTypes.object.isRequired, 100 classes: PropTypes.object.isRequired,
@@ -96,7 +107,7 @@ class WebControls extends Component {
96 openInBrowser: PropTypes.func.isRequired, 107 openInBrowser: PropTypes.func.isRequired,
97 url: PropTypes.string.isRequired, 108 url: PropTypes.string.isRequired,
98 navigate: PropTypes.func.isRequired, 109 navigate: PropTypes.func.isRequired,
99 } 110 };
100 111
101 static contextTypes = { 112 static contextTypes = {
102 intl: intlShape, 113 intl: intlShape,
@@ -119,7 +130,7 @@ class WebControls extends Component {
119 state = { 130 state = {
120 inputUrl: '', 131 inputUrl: '',
121 editUrl: false, 132 editUrl: false,
122 } 133 };
123 134
124 render() { 135 render() {
125 const { 136 const {
@@ -135,10 +146,7 @@ class WebControls extends Component {
135 navigate, 146 navigate,
136 } = this.props; 147 } = this.props;
137 148
138 const { 149 const { inputUrl, editUrl } = this.state;
139 inputUrl,
140 editUrl,
141 } = this.state;
142 150
143 const { intl } = this.context; 151 const { intl } = this.context;
144 152
@@ -151,10 +159,7 @@ class WebControls extends Component {
151 data-tip={intl.formatMessage(messages.goHome)} 159 data-tip={intl.formatMessage(messages.goHome)}
152 data-place="bottom" 160 data-place="bottom"
153 > 161 >
154 <Icon 162 <Icon icon={mdiHomeOutline} className={classes.icon} />
155 icon={mdiHomeOutline}
156 className={classes.icon}
157 />
158 </button> 163 </button>
159 <button 164 <button
160 onClick={goBack} 165 onClick={goBack}
@@ -164,10 +169,7 @@ class WebControls extends Component {
164 data-tip={intl.formatMessage(messages.back)} 169 data-tip={intl.formatMessage(messages.back)}
165 data-place="bottom" 170 data-place="bottom"
166 > 171 >
167 <Icon 172 <Icon icon={mdiArrowLeft} className={classes.icon} />
168 icon={mdiArrowLeft}
169 className={classes.icon}
170 />
171 </button> 173 </button>
172 <button 174 <button
173 onClick={goForward} 175 onClick={goForward}
@@ -177,10 +179,7 @@ class WebControls extends Component {
177 data-tip={intl.formatMessage(messages.forward)} 179 data-tip={intl.formatMessage(messages.forward)}
178 data-place="bottom" 180 data-place="bottom"
179 > 181 >
180 <Icon 182 <Icon icon={mdiArrowRight} className={classes.icon} />
181 icon={mdiArrowRight}
182 className={classes.icon}
183 />
184 </button> 183 </button>
185 <button 184 <button
186 onClick={reload} 185 onClick={reload}
@@ -189,25 +188,24 @@ class WebControls extends Component {
189 data-tip={intl.formatMessage(messages.reload)} 188 data-tip={intl.formatMessage(messages.reload)}
190 data-place="bottom" 189 data-place="bottom"
191 > 190 >
192 <Icon 191 <Icon icon={mdiReload} className={classes.icon} />
193 icon={mdiReload}
194 className={classes.icon}
195 />
196 </button> 192 </button>
197 <input 193 <input
198 value={editUrl ? inputUrl : url} 194 value={editUrl ? inputUrl : url}
199 className={classes.input} 195 className={classes.input}
200 onChange={event => this.setState({ 196 onChange={event =>
201 inputUrl: event.target.value, 197 this.setState({
202 })} 198 inputUrl: event.target.value,
203 onFocus={(event) => { 199 })
200 }
201 onFocus={event => {
204 console.log('on focus event'); 202 console.log('on focus event');
205 event.target.select(); 203 event.target.select();
206 this.setState({ 204 this.setState({
207 editUrl: true, 205 editUrl: true,
208 }); 206 });
209 }} 207 }}
210 onKeyDown={(event) => { 208 onKeyDown={event => {
211 if (event.key === 'Enter') { 209 if (event.key === 'Enter') {
212 this.setState({ 210 this.setState({
213 editUrl: false, 211 editUrl: false,
@@ -231,10 +229,7 @@ class WebControls extends Component {
231 data-tip={intl.formatMessage(messages.openInBrowser)} 229 data-tip={intl.formatMessage(messages.openInBrowser)}
232 data-place="bottom" 230 data-place="bottom"
233 > 231 >
234 <Icon 232 <Icon icon={mdiEarth} className={classes.icon} />
235 icon={mdiEarth}
236 className={classes.icon}
237 />
238 </button> 233 </button>
239 </div> 234 </div>
240 ); 235 );
diff --git a/src/features/webControls/containers/WebControlsScreen.js b/src/features/webControls/containers/WebControlsScreen.js
index d638b831c..e1e1b9991 100644
--- a/src/features/webControls/containers/WebControlsScreen.js
+++ b/src/features/webControls/containers/WebControlsScreen.js
@@ -114,7 +114,7 @@ class WebControlsScreen extends Component {
114 goBack={() => this.goBack()} 114 goBack={() => this.goBack()}
115 canGoForward={this.canGoForward} 115 canGoForward={this.canGoForward}
116 goForward={() => this.goForward()} 116 goForward={() => this.goForward()}
117 navigate={url => this.navigate(url)} 117 navigate={(url) => this.navigate(url)}
118 url={this.url} 118 url={this.url}
119 /> 119 />
120 ); 120 );
diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js
index 30fbd84be..322695ed2 100644
--- a/src/features/workspaces/api.js
+++ b/src/features/workspaces/api.js
@@ -14,7 +14,7 @@ export const workspaceApi = {
14 debug('getUserWorkspaces RESULT', result); 14 debug('getUserWorkspaces RESULT', result);
15 if (!result.ok) throw result; 15 if (!result.ok) throw result;
16 const workspaces = await result.json(); 16 const workspaces = await result.json();
17 return workspaces.map(data => new Workspace(data)); 17 return workspaces.map((data) => new Workspace(data));
18 }, 18 },
19 19
20 createWorkspace: async (name) => { 20 createWorkspace: async (name) => {
diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js
index bf7016e2f..1138f23d7 100644
--- a/src/features/workspaces/components/WorkspaceDrawer.js
+++ b/src/features/workspaces/components/WorkspaceDrawer.js
@@ -2,12 +2,11 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss'; 4import injectSheet from 'react-jss';
5import { defineMessages, FormattedHTMLMessage, intlShape } from 'react-intl'; 5import { defineMessages, intlShape } from 'react-intl';
6import { H1, Icon, ProBadge } from '@meetfranz/ui'; 6import { H1, Icon } from '@meetfranz/ui';
7import { Button } from '@meetfranz/forms/lib';
8import ReactTooltip from 'react-tooltip'; 7import ReactTooltip from 'react-tooltip';
9 8
10import { mdiPlusBox, mdiSettings, mdiStar } from '@mdi/js'; 9import { mdiPlusBox, mdiSettings } from '@mdi/js';
11import WorkspaceDrawerItem from './WorkspaceDrawerItem'; 10import WorkspaceDrawerItem from './WorkspaceDrawerItem';
12import { workspaceActions } from '../actions'; 11import { workspaceActions } from '../actions';
13import { workspaceStore } from '../index'; 12import { workspaceStore } from '../index';
@@ -29,25 +28,13 @@ const messages = defineMessages({
29 id: 'workspaceDrawer.workspaceFeatureInfo', 28 id: 'workspaceDrawer.workspaceFeatureInfo',
30 defaultMessage: '!!!Info about workspace feature', 29 defaultMessage: '!!!Info about workspace feature',
31 }, 30 },
32 premiumCtaButtonLabel: {
33 id: 'workspaceDrawer.premiumCtaButtonLabel',
34 defaultMessage: '!!!Create your first workspace',
35 },
36 reactivatePremiumAccount: {
37 id: 'workspaceDrawer.reactivatePremiumAccountLabel',
38 defaultMessage: '!!!Reactivate premium account',
39 },
40 addNewWorkspaceLabel: { 31 addNewWorkspaceLabel: {
41 id: 'workspaceDrawer.addNewWorkspaceLabel', 32 id: 'workspaceDrawer.addNewWorkspaceLabel',
42 defaultMessage: '!!!add new workspace', 33 defaultMessage: '!!!add new workspace',
43 }, 34 },
44 premiumFeatureBadge: {
45 id: 'workspaceDrawer.proFeatureBadge',
46 defaultMessage: '!!!Premium feature',
47 },
48}); 35});
49 36
50const styles = theme => ({ 37const styles = (theme) => ({
51 drawer: { 38 drawer: {
52 background: theme.workspaces.drawer.background, 39 background: theme.workspaces.drawer.background,
53 width: `${theme.workspaces.drawer.width}px`, 40 width: `${theme.workspaces.drawer.width}px`,
@@ -60,9 +47,6 @@ const styles = theme => ({
60 marginBottom: '25px', 47 marginBottom: '25px',
61 marginLeft: theme.workspaces.drawer.padding, 48 marginLeft: theme.workspaces.drawer.padding,
62 }, 49 },
63 headlineProBadge: {
64 marginRight: 15,
65 },
66 workspacesSettingsButton: { 50 workspacesSettingsButton: {
67 float: 'right', 51 float: 'right',
68 marginRight: theme.workspaces.drawer.padding, 52 marginRight: theme.workspaces.drawer.padding,
@@ -78,16 +62,6 @@ const styles = theme => ({
78 height: 'auto', 62 height: 'auto',
79 overflowY: 'auto', 63 overflowY: 'auto',
80 }, 64 },
81 premiumAnnouncement: {
82 padding: '20px',
83 paddingTop: '0',
84 height: 'auto',
85 },
86 premiumCtaButton: {
87 marginTop: '20px',
88 width: '100%',
89 color: 'white !important',
90 },
91 addNewWorkspaceLabel: { 65 addNewWorkspaceLabel: {
92 height: 'auto', 66 height: 'auto',
93 color: theme.workspaces.drawer.buttons.color, 67 color: theme.workspaces.drawer.buttons.color,
@@ -116,7 +90,6 @@ class WorkspaceDrawer extends Component {
116 static propTypes = { 90 static propTypes = {
117 classes: PropTypes.object.isRequired, 91 classes: PropTypes.object.isRequired,
118 getServicesForWorkspace: PropTypes.func.isRequired, 92 getServicesForWorkspace: PropTypes.func.isRequired,
119 onUpgradeAccountClick: PropTypes.func.isRequired,
120 }; 93 };
121 94
122 static contextTypes = { 95 static contextTypes = {
@@ -131,7 +104,6 @@ class WorkspaceDrawer extends Component {
131 const { 104 const {
132 classes, 105 classes,
133 getServicesForWorkspace, 106 getServicesForWorkspace,
134 onUpgradeAccountClick,
135 } = this.props; 107 } = this.props;
136 const { intl } = this.context; 108 const { intl } = this.context;
137 const { 109 const {
@@ -144,14 +116,6 @@ class WorkspaceDrawer extends Component {
144 return ( 116 return (
145 <div className={`${classes.drawer} workspaces-drawer`}> 117 <div className={`${classes.drawer} workspaces-drawer`}>
146 <H1 className={classes.headline}> 118 <H1 className={classes.headline}>
147 {workspaceStore.isPremiumUpgradeRequired && (
148 <span
149 className={classes.headlineProBadge}
150 data-tip={`${intl.formatMessage(messages.premiumFeatureBadge)}`}
151 >
152 <ProBadge />
153 </span>
154 )}
155 {intl.formatMessage(messages.headline)} 119 {intl.formatMessage(messages.headline)}
156 <span 120 <span
157 className={classes.workspacesSettingsButton} 121 className={classes.workspacesSettingsButton}
@@ -167,75 +131,48 @@ class WorkspaceDrawer extends Component {
167 /> 131 />
168 </span> 132 </span>
169 </H1> 133 </H1>
170 {workspaceStore.isPremiumUpgradeRequired ? ( 134 <div className={classes.workspaces}>
171 <div className={classes.premiumAnnouncement}> 135 <WorkspaceDrawerItem
172 <FormattedHTMLMessage {...messages.workspaceFeatureInfo} /> 136 name={intl.formatMessage(messages.allServices)}
173 {workspaceStore.userHasWorkspaces ? ( 137 onClick={() => {
174 <Button 138 workspaceActions.deactivate();
175 className={classes.premiumCtaButton} 139 workspaceActions.toggleWorkspaceDrawer();
176 buttonType="primary" 140 }}
177 label={intl.formatMessage(messages.reactivatePremiumAccount)} 141 services={getServicesForWorkspace(null)}
178 icon={mdiStar} 142 isActive={actualWorkspace == null}
179 onClick={() => { 143 shortcutIndex={0}
180 onUpgradeAccountClick(); 144 />
181 }} 145 {workspaces.map((workspace, index) => (
182 />
183 ) : (
184 <Button
185 className={classes.premiumCtaButton}
186 buttonType="primary"
187 label={intl.formatMessage(messages.premiumCtaButtonLabel)}
188 icon={mdiPlusBox}
189 onClick={() => {
190 workspaceActions.openWorkspaceSettings();
191 }}
192 />
193 )}
194 </div>
195 ) : (
196 <div className={classes.workspaces}>
197 <WorkspaceDrawerItem 146 <WorkspaceDrawerItem
198 name={intl.formatMessage(messages.allServices)} 147 key={workspace.id}
148 name={workspace.name}
149 isActive={actualWorkspace === workspace}
199 onClick={() => { 150 onClick={() => {
200 workspaceActions.deactivate(); 151 if (actualWorkspace === workspace) return;
152 workspaceActions.activate({ workspace });
201 workspaceActions.toggleWorkspaceDrawer(); 153 workspaceActions.toggleWorkspaceDrawer();
202 }} 154 }}
203 services={getServicesForWorkspace(null)} 155 onContextMenuEditClick={() => workspaceActions.edit({ workspace })}
204 isActive={actualWorkspace == null} 156 services={getServicesForWorkspace(workspace)}
205 shortcutIndex={0} 157 shortcutIndex={index + 1}
206 /> 158 />
207 {workspaces.map((workspace, index) => ( 159 ))}
208 <WorkspaceDrawerItem 160 <div
209 key={workspace.id} 161 className={classes.addNewWorkspaceLabel}
210 name={workspace.name} 162 onClick={() => {
211 isActive={actualWorkspace === workspace} 163 workspaceActions.openWorkspaceSettings();
212 onClick={() => { 164 }}
213 if (actualWorkspace === workspace) return; 165 >
214 workspaceActions.activate({ workspace }); 166 <Icon
215 workspaceActions.toggleWorkspaceDrawer(); 167 icon={mdiPlusBox}
216 }} 168 size={1}
217 onContextMenuEditClick={() => workspaceActions.edit({ workspace })} 169 className={classes.workspacesSettingsButtonIcon}
218 services={getServicesForWorkspace(workspace)} 170 />
219 shortcutIndex={index + 1} 171 <span>
220 /> 172 {intl.formatMessage(messages.addNewWorkspaceLabel)}
221 ))} 173 </span>
222 <div
223 className={classes.addNewWorkspaceLabel}
224 onClick={() => {
225 workspaceActions.openWorkspaceSettings();
226 }}
227 >
228 <Icon
229 icon={mdiPlusBox}
230 size={1}
231 className={classes.workspacesSettingsButtonIcon}
232 />
233 <span>
234 {intl.formatMessage(messages.addNewWorkspaceLabel)}
235 </span>
236 </div>
237 </div> 174 </div>
238 )} 175 </div>
239 <ReactTooltip place="right" type="dark" effect="solid" /> 176 <ReactTooltip place="right" type="dark" effect="solid" />
240 </div> 177 </div>
241 ); 178 );
diff --git a/src/features/workspaces/components/WorkspaceDrawerItem.js b/src/features/workspaces/components/WorkspaceDrawerItem.js
index 2e58b70d6..fff607330 100644
--- a/src/features/workspaces/components/WorkspaceDrawerItem.js
+++ b/src/features/workspaces/components/WorkspaceDrawerItem.js
@@ -5,7 +5,7 @@ import { observer } from 'mobx-react';
5import injectSheet from 'react-jss'; 5import injectSheet from 'react-jss';
6import classnames from 'classnames'; 6import classnames from 'classnames';
7import { defineMessages, intlShape } from 'react-intl'; 7import { defineMessages, intlShape } from 'react-intl';
8import { ctrlKey } from '../../../environment'; 8import { altKey, shortcutKey } from '../../../environment';
9 9
10const messages = defineMessages({ 10const messages = defineMessages({
11 noServicesAddedYet: { 11 noServicesAddedYet: {
@@ -18,12 +18,18 @@ const messages = defineMessages({
18 }, 18 },
19}); 19});
20 20
21let itemTransition = 'none';
22
23if (window && window.matchMedia('(prefers-reduced-motion: no-preference)')) {
24 itemTransition = 'background-color 300ms ease-out';
25}
26
21const styles = theme => ({ 27const styles = theme => ({
22 item: { 28 item: {
23 height: '67px', 29 height: '67px',
24 padding: `15px ${theme.workspaces.drawer.padding}px`, 30 padding: `15px ${theme.workspaces.drawer.padding}px`,
25 borderBottom: `1px solid ${theme.workspaces.drawer.listItem.border}`, 31 borderBottom: `1px solid ${theme.workspaces.drawer.listItem.border}`,
26 transition: 'background-color 300ms ease-out', 32 transition: itemTransition,
27 '&:first-child': { 33 '&:first-child': {
28 borderTop: `1px solid ${theme.workspaces.drawer.listItem.border}`, 34 borderTop: `1px solid ${theme.workspaces.drawer.listItem.border}`,
29 }, 35 },
@@ -59,7 +65,8 @@ const styles = theme => ({
59 }, 65 },
60}); 66});
61 67
62@injectSheet(styles) @observer 68@injectSheet(styles)
69@observer
63class WorkspaceDrawerItem extends Component { 70class WorkspaceDrawerItem extends Component {
64 static propTypes = { 71 static propTypes = {
65 classes: PropTypes.object.isRequired, 72 classes: PropTypes.object.isRequired,
@@ -91,15 +98,19 @@ class WorkspaceDrawerItem extends Component {
91 } = this.props; 98 } = this.props;
92 const { intl } = this.context; 99 const { intl } = this.context;
93 100
94 const contextMenuTemplate = [{ 101 const contextMenuTemplate = [
95 label: name, 102 {
96 enabled: false, 103 label: name,
97 }, { 104 enabled: false,
98 type: 'separator', 105 },
99 }, { 106 {
100 label: intl.formatMessage(messages.contextMenuEdit), 107 type: 'separator',
101 click: onContextMenuEditClick, 108 },
102 }]; 109 {
110 label: intl.formatMessage(messages.contextMenuEdit),
111 click: onContextMenuEditClick,
112 },
113 ];
103 114
104 const contextMenu = Menu.buildFromTemplate(contextMenuTemplate); 115 const contextMenu = Menu.buildFromTemplate(contextMenuTemplate);
105 116
@@ -110,10 +121,12 @@ class WorkspaceDrawerItem extends Component {
110 isActive ? classes.isActiveItem : null, 121 isActive ? classes.isActiveItem : null,
111 ])} 122 ])}
112 onClick={onClick} 123 onClick={onClick}
113 onContextMenu={() => ( 124 onContextMenu={() =>
114 onContextMenuEditClick && contextMenu.popup(getCurrentWindow()) 125 onContextMenuEditClick && contextMenu.popup(getCurrentWindow())
115 )} 126 }
116 data-tip={`${shortcutIndex <= 9 ? `(${ctrlKey}+Alt+${shortcutIndex})` : ''}`} 127 data-tip={`${
128 shortcutIndex <= 9 ? `(${shortcutKey(false)}+${altKey}+${shortcutIndex})` : ''
129 }`}
117 > 130 >
118 <span 131 <span
119 className={classnames([ 132 className={classnames([
@@ -129,7 +142,9 @@ class WorkspaceDrawerItem extends Component {
129 isActive ? classes.activeServices : null, 142 isActive ? classes.activeServices : null,
130 ])} 143 ])}
131 > 144 >
132 {services.length ? services.join(', ') : intl.formatMessage(messages.noServicesAddedYet)} 145 {services.length
146 ? services.join(', ')
147 : intl.formatMessage(messages.noServicesAddedYet)}
133 </span> 148 </span>
134 </div> 149 </div>
135 ); 150 );
diff --git a/src/features/workspaces/components/WorkspaceItem.js b/src/features/workspaces/components/WorkspaceItem.js
index cc4b1a3ba..85fc02d51 100644
--- a/src/features/workspaces/components/WorkspaceItem.js
+++ b/src/features/workspaces/components/WorkspaceItem.js
@@ -6,7 +6,7 @@ import injectSheet from 'react-jss';
6 6
7import Workspace from '../models/Workspace'; 7import Workspace from '../models/Workspace';
8 8
9const styles = theme => ({ 9const styles = (theme) => ({
10 row: { 10 row: {
11 height: theme.workspaces.settings.listItems.height, 11 height: theme.workspaces.settings.listItems.height,
12 borderBottom: `1px solid ${theme.workspaces.settings.listItems.borderColor}`, 12 borderBottom: `1px solid ${theme.workspaces.settings.listItems.borderColor}`,
diff --git a/src/features/workspaces/components/WorkspaceServiceListItem.js b/src/features/workspaces/components/WorkspaceServiceListItem.js
index e05b21440..f6e2a2786 100644
--- a/src/features/workspaces/components/WorkspaceServiceListItem.js
+++ b/src/features/workspaces/components/WorkspaceServiceListItem.js
@@ -8,7 +8,7 @@ import { Toggle } from '@meetfranz/forms';
8import Service from '../../../models/Service'; 8import Service from '../../../models/Service';
9import ServiceIcon from '../../../components/ui/ServiceIcon'; 9import ServiceIcon from '../../../components/ui/ServiceIcon';
10 10
11const styles = theme => ({ 11const styles = (theme) => ({
12 listItem: { 12 listItem: {
13 height: theme.workspaces.settings.listItems.height, 13 height: theme.workspaces.settings.listItems.height,
14 borderBottom: `1px solid ${theme.workspaces.settings.listItems.borderColor}`, 14 borderBottom: `1px solid ${theme.workspaces.settings.listItems.borderColor}`,
diff --git a/src/features/workspaces/components/WorkspaceSwitchingIndicator.js b/src/features/workspaces/components/WorkspaceSwitchingIndicator.js
index a70d1d66f..c8ec0bc4c 100644
--- a/src/features/workspaces/components/WorkspaceSwitchingIndicator.js
+++ b/src/features/workspaces/components/WorkspaceSwitchingIndicator.js
@@ -15,12 +15,18 @@ const messages = defineMessages({
15 }, 15 },
16}); 16});
17 17
18let wrapperTransition = 'none';
19
20if (window && window.matchMedia('(prefers-reduced-motion: no-preference)')) {
21 wrapperTransition = 'width 0.5s ease';
22}
23
18const styles = theme => ({ 24const styles = theme => ({
19 wrapper: { 25 wrapper: {
20 display: 'flex', 26 display: 'flex',
21 alignItems: 'flex-start', 27 alignItems: 'flex-start',
22 position: 'absolute', 28 position: 'absolute',
23 transition: 'width 0.5s ease', 29 transition: wrapperTransition,
24 width: `calc(100% - ${theme.workspaces.drawer.width}px)`, 30 width: `calc(100% - ${theme.workspaces.drawer.width}px)`,
25 marginTop: '20px', 31 marginTop: '20px',
26 }, 32 },
@@ -47,7 +53,8 @@ const styles = theme => ({
47 }, 53 },
48}); 54});
49 55
50@injectSheet(styles) @observer 56@injectSheet(styles)
57@observer
51class WorkspaceSwitchingIndicator extends Component { 58class WorkspaceSwitchingIndicator extends Component {
52 static propTypes = { 59 static propTypes = {
53 classes: PropTypes.object.isRequired, 60 classes: PropTypes.object.isRequired,
@@ -63,13 +70,11 @@ class WorkspaceSwitchingIndicator extends Component {
63 const { intl } = this.context; 70 const { intl } = this.context;
64 const { isSwitchingWorkspace, nextWorkspace } = workspaceStore; 71 const { isSwitchingWorkspace, nextWorkspace } = workspaceStore;
65 if (!isSwitchingWorkspace) return null; 72 if (!isSwitchingWorkspace) return null;
66 const nextWorkspaceName = nextWorkspace ? nextWorkspace.name : 'All services'; 73 const nextWorkspaceName = nextWorkspace
74 ? nextWorkspace.name
75 : 'All services';
67 return ( 76 return (
68 <div 77 <div className={classnames([classes.wrapper])}>
69 className={classnames([
70 classes.wrapper,
71 ])}
72 >
73 <div className={classes.component}> 78 <div className={classes.component}>
74 <Loader 79 <Loader
75 className={classes.spinner} 80 className={classes.spinner}
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js
index cfaacd56e..8319d3bc6 100644
--- a/src/features/workspaces/components/WorkspacesDashboard.js
+++ b/src/features/workspaces/components/WorkspacesDashboard.js
@@ -1,9 +1,9 @@
1import React, { Component, Fragment } from 'react'; 1import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes, inject } from 'mobx-react'; 3import { observer, PropTypes as MobxPropTypes, inject } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss'; 5import injectSheet from 'react-jss';
6import { Infobox, Badge } from '@meetfranz/ui'; 6import { Infobox } from '@meetfranz/ui';
7 7
8import { mdiCheckboxMarkedCircleOutline } from '@mdi/js'; 8import { mdiCheckboxMarkedCircleOutline } from '@mdi/js';
9import Loader from '../../../components/ui/Loader'; 9import Loader from '../../../components/ui/Loader';
@@ -11,10 +11,7 @@ import WorkspaceItem from './WorkspaceItem';
11import CreateWorkspaceForm from './CreateWorkspaceForm'; 11import CreateWorkspaceForm from './CreateWorkspaceForm';
12import Request from '../../../stores/lib/Request'; 12import Request from '../../../stores/lib/Request';
13import Appear from '../../../components/ui/effects/Appear'; 13import Appear from '../../../components/ui/effects/Appear';
14import { workspaceStore } from '../index';
15import UIStore from '../../../stores/UIStore'; 14import UIStore from '../../../stores/UIStore';
16import globalMessages from '../../../i18n/globalMessages';
17import UpgradeButton from '../../../components/ui/UpgradeButton';
18 15
19const messages = defineMessages({ 16const messages = defineMessages({
20 headline: { 17 headline: {
@@ -64,12 +61,6 @@ const styles = () => ({
64 appear: { 61 appear: {
65 height: 'auto', 62 height: 'auto',
66 }, 63 },
67 premiumAnnouncement: {
68 height: 'auto',
69 },
70 premiumAnnouncementContainer: {
71 display: 'flex',
72 },
73 announcementHeadline: { 64 announcementHeadline: {
74 marginBottom: 0, 65 marginBottom: 0,
75 }, 66 },
@@ -78,12 +69,6 @@ const styles = () => ({
78 margin: [-8, 0, 0, 20], 69 margin: [-8, 0, 0, 20],
79 alignSelf: 'center', 70 alignSelf: 'center',
80 }, 71 },
81 upgradeCTA: {
82 margin: [40, 'auto'],
83 },
84 proRequired: {
85 margin: [10, 0, 40],
86 },
87}); 72});
88 73
89@inject('stores') @injectSheet(styles) @observer 74@inject('stores') @injectSheet(styles) @observer
@@ -152,77 +137,53 @@ class WorkspacesDashboard extends Component {
152 </Appear> 137 </Appear>
153 )} 138 )}
154 139
155 {workspaceStore.isPremiumUpgradeRequired && ( 140 {/* ===== Create workspace form ===== */}
156 <div className={classes.premiumAnnouncement}> 141 <div className={classes.createForm}>
157 142 <CreateWorkspaceForm
158 <h1 className={classes.announcementHeadline}>{intl.formatMessage(messages.workspaceFeatureHeadline)}</h1> 143 isSubmitting={createWorkspaceRequest.isExecuting}
159 <Badge className={classes.proRequired}>{intl.formatMessage(globalMessages.proRequired)}</Badge> 144 onSubmit={onCreateWorkspaceSubmit}
160 <div className={classes.premiumAnnouncementContainer}> 145 />
161 <div className={classes.premiumAnnouncementContent}> 146 </div>
162 <p>{intl.formatMessage(messages.workspaceFeatureInfo)}</p> 147 {getUserWorkspacesRequest.isExecuting ? (
163 <UpgradeButton 148 <Loader />
164 className={classes.upgradeCTA} 149 ) : (
165 gaEventInfo={{ category: 'Workspaces', event: 'upgrade' }}
166 short
167 requiresPro
168 />
169 </div>
170 <img src={`https://cdn.franzinfra.com/announcements/assets/workspaces_${this.props.stores.ui.isDarkThemeActive ? 'dark' : 'light'}.png`} className={classes.teaserImage} alt="" />
171 </div>
172 </div>
173 )}
174
175 {!workspaceStore.isPremiumUpgradeRequired && (
176 <> 150 <>
177 {/* ===== Create workspace form ===== */} 151 {/* ===== Workspace could not be loaded error ===== */}
178 <div className={classes.createForm}> 152 {getUserWorkspacesRequest.error ? (
179 <CreateWorkspaceForm 153 <Infobox
180 isSubmitting={createWorkspaceRequest.isExecuting} 154 icon="alert"
181 onSubmit={onCreateWorkspaceSubmit} 155 type="danger"
182 /> 156 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)}
183 </div> 157 ctaLoading={getUserWorkspacesRequest.isExecuting}
184 {getUserWorkspacesRequest.isExecuting ? ( 158 ctaOnClick={getUserWorkspacesRequest.retry}
185 <Loader /> 159 >
160 {intl.formatMessage(messages.workspacesRequestFailed)}
161 </Infobox>
186 ) : ( 162 ) : (
187 <> 163 <>
188 {/* ===== Workspace could not be loaded error ===== */} 164 {workspaces.length === 0 ? (
189 {getUserWorkspacesRequest.error ? ( 165 <div className="align-middle settings__empty-state">
190 <Infobox 166 {/* ===== Workspaces empty state ===== */}
191 icon="alert" 167 <p className="settings__empty-text">
192 type="danger" 168 <span className="emoji">
193 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)} 169 <img src="./assets/images/emoji/sad.png" alt="" />
194 ctaLoading={getUserWorkspacesRequest.isExecuting} 170 </span>
195 ctaOnClick={getUserWorkspacesRequest.retry} 171 {intl.formatMessage(messages.noServicesAdded)}
196 > 172 </p>
197 {intl.formatMessage(messages.workspacesRequestFailed)} 173 </div>
198 </Infobox>
199 ) : ( 174 ) : (
200 <> 175 <table className={classes.table}>
201 {workspaces.length === 0 ? ( 176 {/* ===== Workspaces list ===== */}
202 <div className="align-middle settings__empty-state"> 177 <tbody>
203 {/* ===== Workspaces empty state ===== */} 178 {workspaces.map((workspace) => (
204 <p className="settings__empty-text"> 179 <WorkspaceItem
205 <span className="emoji"> 180 key={workspace.id}
206 <img src="./assets/images/emoji/sad.png" alt="" /> 181 workspace={workspace}
207 </span> 182 onItemClick={(w) => onWorkspaceClick(w)}
208 {intl.formatMessage(messages.noServicesAdded)} 183 />
209 </p> 184 ))}
210 </div> 185 </tbody>
211 ) : ( 186 </table>
212 <table className={classes.table}>
213 {/* ===== Workspaces list ===== */}
214 <tbody>
215 {workspaces.map(workspace => (
216 <WorkspaceItem
217 key={workspace.id}
218 workspace={workspace}
219 onItemClick={w => onWorkspaceClick(w)}
220 />
221 ))}
222 </tbody>
223 </table>
224 )}
225 </>
226 )} 187 )}
227 </> 188 </>
228 )} 189 )}
diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js
index c241cd622..4828658f9 100644
--- a/src/features/workspaces/containers/WorkspacesScreen.js
+++ b/src/features/workspaces/containers/WorkspacesScreen.js
@@ -30,8 +30,8 @@ class WorkspacesScreen extends Component {
30 createWorkspaceRequest={createWorkspaceRequest} 30 createWorkspaceRequest={createWorkspaceRequest}
31 deleteWorkspaceRequest={deleteWorkspaceRequest} 31 deleteWorkspaceRequest={deleteWorkspaceRequest}
32 updateWorkspaceRequest={updateWorkspaceRequest} 32 updateWorkspaceRequest={updateWorkspaceRequest}
33 onCreateWorkspaceSubmit={data => actions.workspaces.create(data)} 33 onCreateWorkspaceSubmit={(data) => actions.workspaces.create(data)}
34 onWorkspaceClick={w => actions.workspaces.edit({ workspace: w })} 34 onWorkspaceClick={(w) => actions.workspaces.edit({ workspace: w })}
35 /> 35 />
36 </ErrorBoundary> 36 </ErrorBoundary>
37 ); 37 );
diff --git a/src/features/workspaces/models/Workspace.js b/src/features/workspaces/models/Workspace.js
index 77c4e05f4..11ee377cd 100644
--- a/src/features/workspaces/models/Workspace.js
+++ b/src/features/workspaces/models/Workspace.js
@@ -22,13 +22,13 @@ export default class Workspace {
22 this.name = data.name; 22 this.name = data.name;
23 this.order = data.order; 23 this.order = data.order;
24 24
25 let services = data.services; 25 let { services } = data;
26 if (data.saving && data.keepLoaded) { 26 if (data.saving && data.keepLoaded) {
27 // Keep workspaces loaded 27 // Keep workspaces loaded
28 services.push(KEEP_WS_LOADED_USID); 28 services.push(KEEP_WS_LOADED_USID);
29 } else if (data.saving && data.services.includes(KEEP_WS_LOADED_USID)) { 29 } else if (data.saving && data.services.includes(KEEP_WS_LOADED_USID)) {
30 // Don't keep loaded 30 // Don't keep loaded
31 services = services.filter(e => e !== KEEP_WS_LOADED_USID); 31 services = services.filter((e) => e !== KEEP_WS_LOADED_USID);
32 } 32 }
33 this.services.replace(services); 33 this.services.replace(services);
34 34
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js
index 632f3c299..8c73516bc 100644
--- a/src/features/workspaces/store.js
+++ b/src/features/workspaces/store.js
@@ -22,10 +22,6 @@ export default class WorkspacesStore extends FeatureStore {
22 22
23 @observable isFeatureActive = false; 23 @observable isFeatureActive = false;
24 24
25 @observable isPremiumFeature = false;
26
27 @observable isPremiumUpgradeRequired = false;
28
29 @observable activeWorkspace = null; 25 @observable activeWorkspace = null;
30 26
31 @observable nextWorkspace = null; 27 @observable nextWorkspace = null;
@@ -58,7 +54,6 @@ export default class WorkspacesStore extends FeatureStore {
58 54
59 @computed get isUserAllowedToUseFeature() { 55 @computed get isUserAllowedToUseFeature() {
60 return true; 56 return true;
61 // return !this.isPremiumUpgradeRequired;
62 } 57 }
63 58
64 @computed get isAnyWorkspaceActive() { 59 @computed get isAnyWorkspaceActive() {
@@ -69,16 +64,8 @@ export default class WorkspacesStore extends FeatureStore {
69 64
70 _wasDrawerOpenBeforeSettingsRoute = null; 65 _wasDrawerOpenBeforeSettingsRoute = null;
71 66
72 _freeUserActions = [];
73
74 _premiumUserActions = [];
75
76 _allActions = []; 67 _allActions = [];
77 68
78 _freeUserReactions = [];
79
80 _premiumUserReactions = [];
81
82 _allReactions = []; 69 _allReactions = [];
83 70
84 // ========== PUBLIC API ========= // 71 // ========== PUBLIC API ========= //
@@ -90,11 +77,9 @@ export default class WorkspacesStore extends FeatureStore {
90 77
91 // ACTIONS 78 // ACTIONS
92 79
93 this._freeUserActions = createActionBindings([ 80 this._allActions = createActionBindings([
94 [workspaceActions.toggleWorkspaceDrawer, this._toggleWorkspaceDrawer], 81 [workspaceActions.toggleWorkspaceDrawer, this._toggleWorkspaceDrawer],
95 [workspaceActions.openWorkspaceSettings, this._openWorkspaceSettings], 82 [workspaceActions.openWorkspaceSettings, this._openWorkspaceSettings],
96 ]);
97 this._premiumUserActions = createActionBindings([
98 [workspaceActions.edit, this._edit], 83 [workspaceActions.edit, this._edit],
99 [workspaceActions.create, this._create], 84 [workspaceActions.create, this._create],
100 [workspaceActions.delete, this._delete], 85 [workspaceActions.delete, this._delete],
@@ -106,27 +91,18 @@ export default class WorkspacesStore extends FeatureStore {
106 this._toggleKeepAllWorkspacesLoadedSetting, 91 this._toggleKeepAllWorkspacesLoadedSetting,
107 ], 92 ],
108 ]); 93 ]);
109 this._allActions = this._freeUserActions.concat(this._premiumUserActions);
110 this._registerActions(this._allActions); 94 this._registerActions(this._allActions);
111 95
112 // REACTIONS 96 // REACTIONS
113 97
114 this._freeUserReactions = createReactions([ 98 this._allReactions = createReactions([
115 this._disablePremiumFeatures,
116 this._openDrawerWithSettingsReaction, 99 this._openDrawerWithSettingsReaction,
117 this._setFeatureEnabledReaction, 100 this._setFeatureEnabledReaction,
118 this._setIsPremiumFeatureReaction,
119 this._cleanupInvalidServiceReferences, 101 this._cleanupInvalidServiceReferences,
120 ]);
121 this._premiumUserReactions = createReactions([
122 this._setActiveServiceOnWorkspaceSwitchReaction, 102 this._setActiveServiceOnWorkspaceSwitchReaction,
123 this._activateLastUsedWorkspaceReaction, 103 this._activateLastUsedWorkspaceReaction,
124 this._setWorkspaceBeingEditedReaction, 104 this._setWorkspaceBeingEditedReaction,
125 ]); 105 ]);
126 this._allReactions = this._freeUserReactions.concat(
127 this._premiumUserReactions,
128 );
129
130 this._registerReactions(this._allReactions); 106 this._registerReactions(this._allReactions);
131 107
132 getUserWorkspacesRequest.execute(); 108 getUserWorkspacesRequest.execute();
@@ -273,13 +249,6 @@ export default class WorkspacesStore extends FeatureStore {
273 this.isFeatureEnabled = isWorkspaceEnabled; 249 this.isFeatureEnabled = isWorkspaceEnabled;
274 }; 250 };
275 251
276 _setIsPremiumFeatureReaction = () => {
277 // const { features } = this.stores;
278 // const { isWorkspaceIncludedInCurrentPlan } = features.features;
279 // this.isPremiumFeature = !isWorkspaceIncludedInCurrentPlan;
280 // this.isPremiumUpgradeRequired = !isWorkspaceIncludedInCurrentPlan;
281 };
282
283 _setWorkspaceBeingEditedReaction = () => { 252 _setWorkspaceBeingEditedReaction = () => {
284 const { pathname } = this.stores.router.location; 253 const { pathname } = this.stores.router.location;
285 const match = matchRoute('/settings/workspaces/edit/:id', pathname); 254 const match = matchRoute('/settings/workspaces/edit/:id', pathname);
@@ -357,16 +326,4 @@ export default class WorkspacesStore extends FeatureStore {
357 }); 326 });
358 }); 327 });
359 }; 328 };
360
361 _disablePremiumFeatures = () => {
362 if (!this.isUserAllowedToUseFeature) {
363 debug('_disablePremiumFeatures');
364 this._stopActions(this._premiumUserActions);
365 this._stopReactions(this._premiumUserReactions);
366 this.reset();
367 } else {
368 this._startActions(this._premiumUserActions);
369 this._startReactions(this._premiumUserReactions);
370 }
371 };
372} 329}
diff --git a/src/helpers/array-helpers.js b/src/helpers/array-helpers.js
index ffb3b63dc..5e592b7f7 100644
--- a/src/helpers/array-helpers.js
+++ b/src/helpers/array-helpers.js
@@ -1,4 +1,4 @@
1export const shuffleArray = arr => arr 1export const shuffleArray = (arr) => arr
2 .map(a => [Math.random(), a]) 2 .map((a) => [Math.random(), a])
3 .sort((a, b) => a[0] - b[0]) 3 .sort((a, b) => a[0] - b[0])
4 .map(a => a[1]); 4 .map((a) => a[1]);
diff --git a/src/helpers/async-helpers.js b/src/helpers/async-helpers.js
index 2ef01ee09..c6c57e28e 100644
--- a/src/helpers/async-helpers.js
+++ b/src/helpers/async-helpers.js
@@ -1,5 +1,5 @@
1/* eslint-disable import/prefer-default-export */ 1/* eslint-disable import/prefer-default-export */
2 2
3export function sleep(ms = 0) { 3export function sleep(ms = 0) {
4 return new Promise(r => setTimeout(r, ms)); 4 return new Promise((r) => setTimeout(r, ms));
5} 5}
diff --git a/src/helpers/plan-helpers.js b/src/helpers/plan-helpers.js
deleted file mode 100644
index b474f8bbd..000000000
--- a/src/helpers/plan-helpers.js
+++ /dev/null
@@ -1,53 +0,0 @@
1import { defineMessages } from 'react-intl';
2import { PLANS_MAPPING, PLANS } from '../config';
3
4const messages = defineMessages({
5 [PLANS.PRO]: {
6 id: 'pricing.plan.pro',
7 defaultMessage: '!!!Professional',
8 },
9 [PLANS.PERSONAL]: {
10 id: 'pricing.plan.personal',
11 defaultMessage: '!!!Personal',
12 },
13 [PLANS.FREE]: {
14 id: 'pricing.plan.free',
15 defaultMessage: '!!!Free',
16 },
17 [PLANS.LEGACY]: {
18 id: 'pricing.plan.legacy',
19 defaultMessage: '!!!Premium',
20 },
21});
22
23export function cleanupPlanId(id) {
24 return id.replace(/(.*)-x[0-9]/, '$1');
25}
26
27export function i18nPlanName(planId, intl) {
28 if (!planId) {
29 throw new Error('planId is required');
30 }
31
32 if (!intl) {
33 throw new Error('intl context is required');
34 }
35
36 const id = cleanupPlanId(planId);
37
38 const plan = PLANS_MAPPING[id];
39
40 return intl.formatMessage(messages[plan]);
41}
42
43export function getPlan(planId) {
44 if (!planId) {
45 throw new Error('planId is required');
46 }
47
48 const id = cleanupPlanId(planId);
49
50 const plan = PLANS_MAPPING[id];
51
52 return plan;
53}
diff --git a/src/helpers/recipe-helpers.js b/src/helpers/recipe-helpers.js
index 7daa0aaab..7e4bfa85a 100644
--- a/src/helpers/recipe-helpers.js
+++ b/src/helpers/recipe-helpers.js
@@ -1,12 +1,12 @@
1import path from 'path'; 1import { parse } from 'path';
2import { app } from '@electron/remote'; 2import { userDataRecipesPath } from '../environment';
3 3
4export function getRecipeDirectory(id = '') { 4export function getRecipeDirectory(id = '') {
5 return path.join(app.getPath('userData'), 'recipes', id); 5 return userDataRecipesPath(id);
6} 6}
7 7
8export function getDevRecipeDirectory(id = '') { 8export function getDevRecipeDirectory(id = '') {
9 return path.join(app.getPath('userData'), 'recipes', 'dev', id); 9 return userDataRecipesPath('dev', id);
10} 10}
11 11
12export function loadRecipeConfig(recipeId) { 12export function loadRecipeConfig(recipeId) {
@@ -19,8 +19,7 @@ export function loadRecipeConfig(recipeId) {
19 let config = require(configPath); 19 let config = require(configPath);
20 20
21 const moduleConfigPath = require.resolve(configPath); 21 const moduleConfigPath = require.resolve(configPath);
22 const paths = path.parse(moduleConfigPath); 22 config.path = parse(moduleConfigPath).dir;
23 config.path = paths.dir;
24 23
25 return config; 24 return config;
26 } catch (e) { 25 } catch (e) {
diff --git a/src/helpers/service-helpers.js b/src/helpers/service-helpers.js
index f6363aca8..745f40dd9 100644
--- a/src/helpers/service-helpers.js
+++ b/src/helpers/service-helpers.js
@@ -1,18 +1,16 @@
1import path from 'path'; 1import { readdirSync, removeSync } from 'fs-extra';
2import { app } from '@electron/remote'; 2import { userDataPath } from '../environment';
3import fs from 'fs-extra';
4 3
5export function getServicePartitionsDirectory() { 4export function getServicePartitionsDirectory(...segments) {
6 return path.join(app.getPath('userData'), 'Partitions'); 5 return userDataPath('Partitions', ...([segments].flat()));
7} 6}
8 7
9export function removeServicePartitionDirectory(id = '', addServicePrefix = false) { 8export function removeServicePartitionDirectory(id = '', addServicePrefix = false) {
10 const servicePartition = path.join(getServicePartitionsDirectory(), `${addServicePrefix ? 'service-' : ''}${id}`); 9 const servicePartition = getServicePartitionsDirectory(`${addServicePrefix ? 'service-' : ''}${id}`);
11 10 return removeSync(servicePartition);
12 return fs.remove(servicePartition);
13} 11}
14 12
15export async function getServiceIdsFromPartitions() { 13export async function getServiceIdsFromPartitions() {
16 const files = await fs.readdir(getServicePartitionsDirectory()); 14 const files = readdirSync(getServicePartitionsDirectory());
17 return files.filter(n => n !== '__chrome_extension'); 15 return files.filter((n) => n !== '__chrome_extension');
18} 16}
diff --git a/src/helpers/userAgent-helpers.js b/src/helpers/userAgent-helpers.js
index 9c9c8f132..ede5e6dc4 100644
--- a/src/helpers/userAgent-helpers.js
+++ b/src/helpers/userAgent-helpers.js
@@ -1,11 +1,10 @@
1import os from 'os'; 1import os from 'os';
2import macosVersion from 'macos-version'; 2import macosVersion from 'macos-version';
3import { chrome } from 'useragent-generator';
3import { 4import {
4 chromeVersion, isMac, isWindows, is64Bit, osArch, osRelease, 5 chromeVersion, isMac, isWindows, is64Bit, osArch, osRelease,
5} from '../environment'; 6} from '../environment';
6 7
7const uaGenerator = require('useragent-generator');
8
9function macOS() { 8function macOS() {
10 const version = macosVersion(); 9 const version = macosVersion();
11 let cpuName = os.cpus()[0].model.split(' ')[0]; 10 let cpuName = os.cpus()[0].model.split(' ')[0];
@@ -38,5 +37,5 @@ export default function userAgent() {
38 platformString = linux(); 37 platformString = linux();
39 } 38 }
40 39
41 return uaGenerator.chrome({ os: platformString, version: chromeVersion }); 40 return chrome({ os: platformString, version: chromeVersion });
42} 41}
diff --git a/src/helpers/validation-helpers.js b/src/helpers/validation-helpers.js
index f489ec65e..116f19905 100644
--- a/src/helpers/validation-helpers.js
+++ b/src/helpers/validation-helpers.js
@@ -61,7 +61,7 @@ export function minLength(length) {
61 61
62export function oneRequired(targets) { 62export function oneRequired(targets) {
63 return ({ field, form }) => { 63 return ({ field, form }) => {
64 const invalidFields = targets.filter(target => form.$(target).value === ''); 64 const invalidFields = targets.filter((target) => form.$(target).value === '');
65 return [targets.length !== invalidFields.length, window.ferdi.intl.formatMessage(messages.required, { field: field.label })]; 65 return [targets.length !== invalidFields.length, window.ferdi.intl.formatMessage(messages.required, { field: field.label })];
66 }; 66 };
67} 67}
diff --git a/src/i18n/globalMessages.js b/src/i18n/globalMessages.js
index 190417536..cc219957a 100644
--- a/src/i18n/globalMessages.js
+++ b/src/i18n/globalMessages.js
@@ -33,8 +33,4 @@ export default defineMessages({
33 id: 'global.userAgentHelp', 33 id: 'global.userAgentHelp',
34 defaultMessage: "!!!Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 34 defaultMessage: "!!!Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
35 }, 35 },
36 proRequired: {
37 id: 'global.franzProRequired',
38 defaultMessage: '!!!Franz Professional Required',
39 },
40}); 36});
diff --git a/src/i18n/locales/af.json b/src/i18n/locales/af.json
index 3447ea7ac..3e185e73b 100644
--- a/src/i18n/locales/af.json
+++ b/src/i18n/locales/af.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cancel", 16 "feature.nightlyBuilds.cancel": "Cancel",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Can't connect to Ferdi online services", 36 "global.api.unhealthy": "Can't connect to Ferdi online services",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "You are not connected to the internet.", 37 "global.notConnectedToTheInternet": "You are not connected to the internet.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Import your Ferdi 4 services", 44 "import.headline": "Import your Ferdi 4 services",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Hide", 52 "infobar.hide": "Hide",
89 "infobar.requiredRequestsFailed": "Could not load services and user information", 53 "infobar.requiredRequestsFailed": "Could not load services and user information",
90 "infobar.servicesUpdated": "Your services have been updated.", 54 "infobar.servicesUpdated": "Your services have been updated.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "A new update for Ferdi is available.", 55 "infobar.updateAvailable": "A new update for Ferdi is available.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email address", 57 "invite.email.label": "Email address",
@@ -149,6 +112,7 @@
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Learn More", 116 "menu.help.learnMore": "Learn More",
153 "menu.help.privacy": "Privacy Statement", 117 "menu.help.privacy": "Privacy Statement",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,12 +127,10 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Enter Full Screen",
167 "menu.view.exitFullScreen": "Exit Full Screen",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Reload Service", 134 "menu.view.reloadService": "Reload Service",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Actual Size", 136 "menu.view.resetZoom": "Actual Size",
@@ -194,11 +156,7 @@
194 "password.noUser": "No user with that email address was found", 156 "password.noUser": "No user with that email address was found",
195 "password.submit.label": "Submit", 157 "password.submit.label": "Submit",
196 "password.successInfo": "Please check your email", 158 "password.successInfo": "Please check your email",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "Error", 179 "service.errorHandler.message": "Error",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Get started", 182 "services.getStarted": "Get started",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welcome to Ferdi", 186 "services.welcome": "Welcome to Ferdi",
257 "settings.account.account.editButton": "Edit account", 187 "settings.account.account.editButton": "Edit account",
258 "settings.account.accountType.basic": "Basic Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Update profile", 190 "settings.account.buttonSave": "Update profile",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Invoices", 197 "settings.account.headlineInvoices": "Invoices",
270 "settings.account.headlinePassword": "Change password", 198 "settings.account.headlinePassword": "Change password",
271 "settings.account.headlineProfile": "Update profile", 199 "settings.account.headlineProfile": "Update profile",
272 "settings.account.headlineSubscription": "Your subscription",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Manage your subscription",
277 "settings.account.successInfo": "Your changes have been saved", 200 "settings.account.successInfo": "Your changes have been saved",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Try again", 201 "settings.account.tryReloadServices": "Try again",
282 "settings.account.tryReloadUserInfoRequest": "Try again", 202 "settings.account.tryReloadUserInfoRequest": "Try again",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Could not load user information", 203 "settings.account.userInfoRequestFailed": "Could not load user information",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 228 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Settings", 259 "settings.app.headline": "Settings",
341 "settings.app.headlineAdvanced": "Advanced", 260 "settings.app.headlineAdvanced": "Advanced",
342 "settings.app.headlineAppearance": "Appearance", 261 "settings.app.headlineAppearance": "Appearance",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Changes require restart", 272 "settings.app.restartRequired": "Changes require restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Available services", 301 "settings.recipes.headline": "Available services",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "Most popular",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
387 "settings.searchService": "Search service", 305 "settings.searchService": "Search service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Add {name}", 309 "settings.service.form.addServiceHeadline": "Add {name}",
392 "settings.service.form.availableServices": "Available services", 310 "settings.service.form.availableServices": "Available services",
393 "settings.service.form.customUrl": "Custom server", 311 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Company", 385 "settings.user.form.accountType.company": "Company",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Account type", 387 "settings.user.form.accountType.label": "Account type",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Already have an account, sign in?", 431 "signup.link.login": "Already have an account, sign in?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Create account", 433 "signup.submit.label": "Create account",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Cancel",
531 "subscriptionPopup.buttonDone": "Done",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Delete service", 435 "tabs.item.deleteService": "Delete service",
534 "tabs.item.disableAudio": "Disable audio", 436 "tabs.item.disableAudio": "Disable audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Disable notifications", 438 "tabs.item.disableNotifications": "Disable notifications",
536 "tabs.item.disableService": "Disable service", 439 "tabs.item.disableService": "Disable service",
537 "tabs.item.edit": "Edit", 440 "tabs.item.edit": "Edit",
538 "tabs.item.enableAudio": "Enable audio", 441 "tabs.item.enableAudio": "Enable audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Enable notifications", 443 "tabs.item.enableNotification": "Enable notifications",
540 "tabs.item.enableService": "Enable service", 444 "tabs.item.enableService": "Enable service",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Reload", 446 "tabs.item.reload": "Reload",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json
index e2af263a5..1081ace02 100644
--- a/src/i18n/locales/ar.json
+++ b/src/i18n/locales/ar.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "أوه لا! فقد فردي الاتصال بـ.", 12 "connectionLostBanner.message": "أوه لا! فقد فردي الاتصال بـ.",
13 "feature.announcements.changelog.headline": "تغيرات في فريدي {version}", 13 "feature.announcements.changelog.headline": "تغيرات في فريدي {version}",
14 "feature.debugger.title": "نشر معلومات تصحيح الأخطاء", 14 "feature.debugger.title": "نشر معلومات تصحيح الأخطاء",
15 "feature.delayApp.headline": "رجاء قيم بشراء رخصة الدعم لبرنامج فريدي للتخلص من وقت الانتظار",
16 "feature.delayApp.text": "فريدي سوف يستكمل خلال {seconds} ثانية.",
17 "feature.delayApp.trial.action": "أجل, أريد الحصول على 14 يوم تجريبي مجاني من برنامج فريدي بروفشنال",
18 "feature.delayApp.trial.actionShort": "تفعيل الفتره التجريبية لرنامج فريدي بروفشنال",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "الحصول على ترخيص الدعم لفردي",
21 "feature.delayApp.upgrade.actionShort": "ترقية الحساب",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "إلغاء", 16 "feature.nightlyBuilds.cancel": "إلغاء",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "حدث خطأ أثناء محاولة نشر معلومات التصحيح. الرجاء المحاولة مرة أخرى لاحقاً أو عرض وحدة التحكم لمزيد من المعلومات.", 19 "feature.publishDebugInfo.error": "حدث خطأ أثناء محاولة نشر معلومات التصحيح. الرجاء المحاولة مرة أخرى لاحقاً أو عرض وحدة التحكم لمزيد من المعلومات.",
43 "feature.publishDebugInfo.info": "نشر معلومات التصحيح الخاصة بك يساعدنا على العثور على المشاكل والأخطاء في فردي. بنشر معلومات التصحيح الخاصة بك فإنك تقبل سياسة الخصوصية وشروط خدمة مصحح فيردي", 20 "feature.publishDebugInfo.info": "نشر معلومات التصحيح الخاصة بك يساعدنا على العثور على المشاكل والأخطاء في فردي. بنشر معلومات التصحيح الخاصة بك فإنك تقبل سياسة الخصوصية وشروط خدمة مصحح فيردي",
44 "feature.publishDebugInfo.privacy": "سياسة الخصوصية", 21 "feature.publishDebugInfo.privacy": "سياسة الخصوصية",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "حدد خدمة من خلال زر تاب، ↑ و ↓. افتح الخدمة بالظغط على زر الدخول.", 26 "feature.quickSwitch.info": "حدد خدمة من خلال زر تاب، ↑ و ↓. افتح الخدمة بالظغط على زر الدخول.",
50 "feature.quickSwitch.search": "بحث...", 27 "feature.quickSwitch.search": "بحث...",
51 "feature.quickSwitch.title": "تبديل سريع", 28 "feature.quickSwitch.title": "تبديل سريع",
52 "feature.serviceLimit.limitReached": "لقد قمت بإضافة {amount} من {limit} خدمات مدرجة في خطتك. الرجاء ترقية حسابك لإضافة المزيد من الخدمات.",
53 "feature.shareFranz.action.email": "إرسال كبريد إلكتروني", 29 "feature.shareFranz.action.email": "إرسال كبريد إلكتروني",
54 "feature.shareFranz.action.facebook": "شارك على فيسبوك", 30 "feature.shareFranz.action.facebook": "شارك على فيسبوك",
55 "feature.shareFranz.action.twitter": "شارِك على تويتر", 31 "feature.shareFranz.action.twitter": "شارِك على تويتر",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "لقد أضفت {count} خدمات إلى فردي! احصل على التطبيق المجاني لـ WhatsApp، و Messenger، و Slack، و Skype و co على www.getferdi.com", 33 "feature.shareFranz.shareText.email": "لقد أضفت {count} خدمات إلى فردي! احصل على التطبيق المجاني لـ WhatsApp، و Messenger، و Slack، و Skype و co على www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "لقد أضفت {count} خدمات إلى فردي! احصل على التطبيق المجاني لـ WhatsApp، Messenger, Slack, Skype and co على www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "لقد أضفت {count} خدمات إلى فردي! احصل على التطبيق المجاني لـ WhatsApp، Messenger, Slack, Skype and co على www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "أخبر أصدقائك وزملاءك كيف أن فردي رائع وساعدنا على نشر الكلمة.", 35 "feature.shareFranz.text": "أخبر أصدقائك وزملاءك كيف أن فردي رائع وساعدنا على نشر الكلمة.",
60 "feature.todos.premium.info": "فردي للمهام متاح للمستخدمين المتميزين الآن!",
61 "feature.todos.premium.rollout": "سيتعين على كل شخص آخر الانتظار لفترة أطول قليلا.",
62 "feature.todos.premium.upgrade": "ترقية الحساب",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "لا يمكن الإتصال بخدمات فردي عبر الإنترنت", 36 "global.api.unhealthy": "لا يمكن الإتصال بخدمات فردي عبر الإنترنت",
71 "global.franzProRequired": "الخطة الإحترافية لفردي مطلوبة",
72 "global.notConnectedToTheInternet": "أنت غير متصل بالإنترنت.", 37 "global.notConnectedToTheInternet": "أنت غير متصل بالإنترنت.",
73 "global.spellchecker.useDefault": "إستخدم الإعدادت الافتراضية ({default})", 38 "global.spellchecker.useDefault": "إستخدم الإعدادت الافتراضية ({default})",
74 "global.spellchecking.autodetect": "الكشف عن اللغة تلقائياً", 39 "global.spellchecking.autodetect": "الكشف عن اللغة تلقائياً",
75 "global.spellchecking.autodetect.short": "تلقائي", 40 "global.spellchecking.autodetect.short": "تلقائي",
76 "global.spellchecking.language": "لغة التدقيق الإملائي", 41 "global.spellchecking.language": "لغة التدقيق الإملائي",
77 "global.upgradeButton.upgradeToPro": "الترقية إلى الخطة الإحترافية لفردي",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "استيراد خدمات فردي الأربع", 44 "import.headline": "استيراد خدمات فردي الأربع",
@@ -88,7 +52,6 @@
88 "infobar.hide": "إخفاء", 52 "infobar.hide": "إخفاء",
89 "infobar.requiredRequestsFailed": "تعذر تحميل الخدمات ومعلومات المستخدم", 53 "infobar.requiredRequestsFailed": "تعذر تحميل الخدمات ومعلومات المستخدم",
90 "infobar.servicesUpdated": "تم تحديث خدماتك.", 54 "infobar.servicesUpdated": "تم تحديث خدماتك.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "يتوفر تحديث جديد لفردي.", 55 "infobar.updateAvailable": "يتوفر تحديث جديد لفردي.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "البريد الإلكتروني", 57 "invite.email.label": "البريد الإلكتروني",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "إخفاء شريط القوائم تلقائيا", 87 "menu.app.autohideMenuBar": "إخفاء شريط القوائم تلقائيا",
125 "menu.app.checkForUpdates": "التحقق من وجود تحديثات", 88 "menu.app.checkForUpdates": "التحقق من وجود تحديثات",
126 "menu.app.hide": "إخفاء", 89 "menu.app.hide": "إخفاء",
127 "menu.app.hideOthers": "إخفاء الآخرين", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "إغلاق", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "الإعدادات", 92 "menu.app.settings": "الإعدادات",
130 "menu.app.unhide": "إظهار", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "تعديل", 94 "menu.edit": "تعديل",
132 "menu.edit.copy": "نسخ", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "قص", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "حذف", 97 "menu.edit.delete": "حذف",
135 "menu.edit.emojiSymbols": "الابتسامات والرموز التعبيرية", 98 "menu.edit.emojiSymbols": "الابتسامات والرموز التعبيرية",
136 "menu.edit.findInPage": "البحث في الصفحة", 99 "menu.edit.findInPage": "البحث في الصفحة",
137 "menu.edit.paste": "لصق", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "لصق ومطابقة النمط", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "إعادة", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "تحديد الكل", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "الحديث", 104 "menu.edit.speech": "الحديث",
142 "menu.edit.startDictation": "بدء الإملاء", 105 "menu.edit.startDictation": "بدء الإملاء",
143 "menu.edit.startSpeaking": "بدء الحديث", 106 "menu.edit.startSpeaking": "بدء الحديث",
144 "menu.edit.stopSpeaking": "إيقاف الحديث", 107 "menu.edit.stopSpeaking": "إيقاف الحديث",
145 "menu.edit.undo": "تراجع", 108 "menu.edit.undo": "Undo",
146 "menu.file": "الملف", 109 "menu.file": "الملف",
147 "menu.help": "مساعدة", 110 "menu.help": "Help",
148 "menu.help.changelog": "سِجل التغيرات", 111 "menu.help.changelog": "سِجل التغيرات",
149 "menu.help.debugInfo": "نسخ معلومات تصحيح الأخطاء", 112 "menu.help.debugInfo": "نسخ معلومات تصحيح الأخطاء",
150 "menu.help.debugInfoCopiedBody": "تم نسخ معلومات تصحيح الأخطاء الخاصة بك إلى الحافظة.", 113 "menu.help.debugInfoCopiedBody": "تم نسخ معلومات تصحيح الأخطاء الخاصة بك إلى الحافظة.",
151 "menu.help.debugInfoCopiedHeadline": "معلومات تصحيح الأخطاء لفردي", 114 "menu.help.debugInfoCopiedHeadline": "معلومات تصحيح الأخطاء لفردي",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "معرفة المزيد", 116 "menu.help.learnMore": "معرفة المزيد",
153 "menu.help.privacy": "بيان الخصوصية", 117 "menu.help.privacy": "بيان الخصوصية",
154 "menu.help.publishDebugInfo": "نشر معلومات تصحيح الأخطاء", 118 "menu.help.publishDebugInfo": "نشر معلومات تصحيح الأخطاء",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "تفعيل المهام", 127 "menu.todos.enableTodos": "تفعيل المهام",
164 "menu.view": "عرض", 128 "menu.view": "عرض",
165 "menu.view.back": "الرجوع", 129 "menu.view.back": "الرجوع",
166 "menu.view.enterFullScreen": "الدخول إلى وضع ملء الشاشة",
167 "menu.view.exitFullScreen": "الخروج من وضع ملئ للشاشة",
168 "menu.view.forward": "تقدم", 130 "menu.view.forward": "تقدم",
169 "menu.view.lockFerdi": "قفل فردي", 131 "menu.view.lockFerdi": "قفل فردي",
170 "menu.view.openQuickSwitch": "فتح التبديل السريع", 132 "menu.view.openQuickSwitch": "فتح التبديل السريع",
171 "menu.view.reloadFranz": "إعادة تحميل فردي", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "إعادة تحميل الخدمة", 134 "menu.view.reloadService": "إعادة تحميل الخدمة",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "الحجم الأصلي", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "تفعيل الوضع المظلم", 137 "menu.view.toggleDarkMode": "تفعيل الوضع المظلم",
176 "menu.view.toggleDevTools": "فتح أدوات المطور", 138 "menu.view.toggleDevTools": "فتح أدوات المطور",
177 "menu.view.toggleFullScreen": "تفعيل وضع ملء الشاشة", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "فتح أدوات المطور للخدمة", 140 "menu.view.toggleServiceDevTools": "فتح أدوات المطور للخدمة",
179 "menu.view.toggleTodosDevTools": "ادخل إلى أدوات مطوري تودوس", 141 "menu.view.toggleTodosDevTools": "ادخل إلى أدوات مطوري تودوس",
180 "menu.view.zoomIn": "تكبير", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "تصغير", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "النافذة", 144 "menu.window": "Window",
183 "menu.window.close": "إغلاق", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "تصغير النافذة", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "مساحاتُ العمل", 147 "menu.workspaces": "مساحاتُ العمل",
186 "menu.workspaces.addNewWorkspace": "إضافة مساحة عمل جديدة...", 148 "menu.workspaces.addNewWorkspace": "إضافة مساحة عمل جديدة...",
187 "menu.workspaces.closeWorkspaceDrawer": "غلقُ دُرجِ مساحة العمل", 149 "menu.workspaces.closeWorkspaceDrawer": "غلقُ دُرجِ مساحة العمل",
@@ -194,11 +156,7 @@
194 "password.noUser": "لم يُعثر على مُستخدمٍ بعنوانِ البريدِ هذا", 156 "password.noUser": "لم يُعثر على مُستخدمٍ بعنوانِ البريدِ هذا",
195 "password.submit.label": "إرسال", 157 "password.submit.label": "إرسال",
196 "password.successInfo": "رجاءً تحقق من عنوان بريدك الإلكتروني", 158 "password.successInfo": "رجاءً تحقق من عنوان بريدك الإلكتروني",
197 "premiumFeature.button.upgradeAccount": "ترقية الحساب",
198 "pricing.features.accountSync": "مزامنةُ الحساب", 159 "pricing.features.accountSync": "مزامنةُ الحساب",
199 "pricing.features.adFree": "خالٍ من الإعلانات للأبد",
200 "pricing.features.appDelays": "لا شاشاتِ انتظار",
201 "pricing.features.appDelaysEnabled": "شاشاتُ انتظار هنا وهنا",
202 "pricing.features.customWebsites": "إضافة مواقع مخصصة", 160 "pricing.features.customWebsites": "إضافة مواقع مخصصة",
203 "pricing.features.desktopNotifications": "إشعارات سطح المكتب", 161 "pricing.features.desktopNotifications": "إشعارات سطح المكتب",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "فريق الإدارة", 166 "pricing.features.teamManagement": "فريق الإدارة",
209 "pricing.features.thirdPartyServices": "تنصيب خدمات الطرف الثالث", 167 "pricing.features.thirdPartyServices": "تنصيب خدمات الطرف الثالث",
210 "pricing.features.unlimitedServices": "إمكانية إضافة خدمات غير محدودة", 168 "pricing.features.unlimitedServices": "إمكانية إضافة خدمات غير محدودة",
211 "pricing.features.upToSixServices": "إضافة ما يصل إلى 6 خدمات",
212 "pricing.features.upToThreeServices": "إضافة ما يصل إلى 3 خدمات",
213 "pricing.features.workspaces": "مساحاتُ العمل", 169 "pricing.features.workspaces": "مساحاتُ العمل",
214 "pricing.plan.free": "فيردي المجاني",
215 "pricing.plan.legacy": "فيردي الإصدار الممتاز",
216 "pricing.plan.personal": "فيردي الإصدار الشخصي",
217 "pricing.plan.personal-monthly": "فيردي الإصدار الشخصي الشهري",
218 "pricing.plan.personal-yearly": "فيردي الإصدار الشخصي السنوي",
219 "pricing.plan.pro": "فيردي الإصدار الاحترافي",
220 "pricing.plan.pro-monthly": "فيردي الإصدار الاحترافي الشهري",
221 "pricing.plan.pro-yearly": "فيردي الإصدار الاحترافي السنوي",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "أعادة تحميل {name}", 170 "service.crashHandler.action": "أعادة تحميل {name}",
236 "service.crashHandler.autoReload": "محاولة الاستعادة التلقائية {name} في غضون {seconds} ثانية", 171 "service.crashHandler.autoReload": "محاولة الاستعادة التلقائية {name} في غضون {seconds} ثانية",
237 "service.crashHandler.headline": "أوه لا!", 172 "service.crashHandler.headline": "أوه لا!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "أوه لا!", 178 "service.errorHandler.headline": "أوه لا!",
244 "service.errorHandler.message": "خطأ", 179 "service.errorHandler.message": "خطأ",
245 "service.errorHandler.text": "فشل {name} في التحميل.", 180 "service.errorHandler.text": "فشل {name} في التحميل.",
246 "service.restrictedHandler.action": "ترقية الحساب",
247 "service.restrictedHandler.customUrl.headline": "مطلوب الخطة الاحترافية لفيردي",
248 "service.restrictedHandler.customUrl.text": "يرجى الترقية إلى خطة فيردي الاحترافية لاستخدام العناوين الإلكترونية المخصصة وخدمات الاستضافة الذاتية.",
249 "service.restrictedHandler.serviceLimit.headline": "لقد وصلت إلى حد الخدمة الخاص بك.",
250 "service.restrictedHandler.serviceLimit.text": "الرجاء ترقية حسابك لاستخدام أكثر من {count} خدمة.",
251 "service.webviewLoader.loading": "جاري تحميل {service}", 181 "service.webviewLoader.loading": "جاري تحميل {service}",
252 "services.getStarted": "بدأ الإستخدام", 182 "services.getStarted": "بدأ الإستخدام",
253 "services.login": "الرجاء تسجيل الدخول لاستخدام فردي.", 183 "services.login": "الرجاء تسجيل الدخول لاستخدام فردي.",
254 "services.serverInfo": "يمكنك تغيير خادم فردي الخاص بك بالنقر على الكود في أسفل الزاوية اليسار بشكل اختياري.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "استخدام فردي بدون حساب", 185 "services.serverless": "استخدام فردي بدون حساب",
256 "services.welcome": "مرحبا بكم في فردي", 186 "services.welcome": "مرحبا بكم في فردي",
257 "settings.account.account.editButton": "تعديل الحساب", 187 "settings.account.account.editButton": "تعديل الحساب",
258 "settings.account.accountType.basic": "الحساب الأساسي",
259 "settings.account.accountType.premium": "حساب الدعم المدفوع",
260 "settings.account.accountUnavailable": "الحساب غير متوفر", 188 "settings.account.accountUnavailable": "الحساب غير متوفر",
261 "settings.account.accountUnavailableInfo": "أنت تستخدم فردي بدون حساب. إذا كنت ترغب في استخدام فردي مع حساب والحفاظ على مزامنة خدماتك عبر مختلف الحواسيب، الرجاء تحديد خادم في علامة تبويب الإعدادات ثم سجل الدخول.", 189 "settings.account.accountUnavailableInfo": "أنت تستخدم فردي بدون حساب. إذا كنت ترغب في استخدام فردي مع حساب والحفاظ على مزامنة خدماتك عبر مختلف الحواسيب، الرجاء تحديد خادم في علامة تبويب الإعدادات ثم سجل الدخول.",
262 "settings.account.buttonSave": "تحديث الملف الشخصي", 190 "settings.account.buttonSave": "تحديث الملف الشخصي",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "الفواتير", 197 "settings.account.headlineInvoices": "الفواتير",
270 "settings.account.headlinePassword": "تغيير كلمة المرور", 198 "settings.account.headlinePassword": "تغيير كلمة المرور",
271 "settings.account.headlineProfile": "تحديث الملف الشخصي", 199 "settings.account.headlineProfile": "تحديث الملف الشخصي",
272 "settings.account.headlineSubscription": "الاشتراك الخاص بك",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "قم بترقية حسابك واحصل على تجربة فردي الكاملة",
275 "settings.account.invoiceDownload": "تنزيل",
276 "settings.account.manageSubscription.label": "إدارة اشتراكك",
277 "settings.account.successInfo": "تم حفظ التغييرات الخاصة بك", 200 "settings.account.successInfo": "تم حفظ التغييرات الخاصة بك",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "حاول مجددًا", 201 "settings.account.tryReloadServices": "حاول مجددًا",
282 "settings.account.tryReloadUserInfoRequest": "حاول مجددًا", 202 "settings.account.tryReloadUserInfoRequest": "حاول مجددًا",
283 "settings.account.upgradeToPro.label": "الترقية إلى الخطة الإحترافية لفردي",
284 "settings.account.userInfoRequestFailed": "تعذر تحميل معلومات المستخدم", 203 "settings.account.userInfoRequestFailed": "تعذر تحميل معلومات المستخدم",
285 "settings.account.yourLicense": "رخصة فردي الخاصة بك", 204 "settings.account.yourLicense": "رخصة فردي الخاصة بك",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "تفعيل التصحيح الإملائي", 227 "settings.app.form.enableSpellchecking": "تفعيل التصحيح الإملائي",
309 "settings.app.form.enableSystemTray": "إظهار فردي في شريط النظام", 228 "settings.app.form.enableSystemTray": "إظهار فردي في شريط النظام",
310 "settings.app.form.enableTodos": "تفعيل فردي للمهام", 229 "settings.app.form.enableTodos": "تفعيل فردي للمهام",
311 "settings.app.form.hibernate": "تفعيل وضع النوم للخدمة",
312 "settings.app.form.hibernateOnStartup": "الإبقاء على الخدمات في وضع النوم عند بدء التشغيل", 230 "settings.app.form.hibernateOnStartup": "الإبقاء على الخدمات في وضع النوم عند بدء التشغيل",
313 "settings.app.form.hibernationStrategy": "استراتيجية وضع النوم", 231 "settings.app.form.hibernationStrategy": "استراتيجية وضع النوم",
314 "settings.app.form.iconSize": "حجم أيقونة الخدمة", 232 "settings.app.form.iconSize": "حجم أيقونة الخدمة",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "تمكين الوضع المظلم الكامل", 255 "settings.app.form.universalDarkMode": "تمكين الوضع المظلم الكامل",
338 "settings.app.form.useTouchIdToUnlock": "السماح باستخدام TouchID لفتح فردي", 256 "settings.app.form.useTouchIdToUnlock": "السماح باستخدام TouchID لفتح فردي",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "الإعدادات", 259 "settings.app.headline": "الإعدادات",
341 "settings.app.headlineAdvanced": "متقدم", 260 "settings.app.headlineAdvanced": "متقدم",
342 "settings.app.headlineAppearance": "المظهر", 261 "settings.app.headlineAppearance": "المظهر",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "الترجمات الرسمية هي الإنكليزية والألمانية. وجميع اللغات الأخرى مبنية على ترجمات مساهمين.", 268 "settings.app.languageDisclaimer": "الترجمات الرسمية هي الإنكليزية والألمانية. وجميع اللغات الأخرى مبنية على ترجمات مساهمين.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "كلمة المرور", 270 "settings.app.lockedPassword": "كلمة المرور",
352 "settings.app.lockedPasswordInfo": "الرجاء التأكد من تعيين كلمة مرور سوف تتذكرها.\nإذما فقدت كلمة المرور هذه، سوف تضطر إلى إعادة تثبيت فيردي.", 271 "settings.app.lockedPasswordInfo": "الرجاء التأكد من تعيين كلمة مرور سوف تتذكرها.\nإذما فقدت كلمة المرور هذه، سوف تضطر إلى إعادة تثبيت فيردي.",
353 "settings.app.restartRequired": "التغيرات تتطلب إعادة تشغيل", 272 "settings.app.restartRequired": "التغيرات تتطلب إعادة تشغيل",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "الذاكرة المؤقتة", 277 "settings.app.subheadlineCache": "الذاكرة المؤقتة",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "فتح المجلد", 300 "settings.recipes.customService.openFolder": "فتح المجلد",
382 "settings.recipes.headline": "الخدمات المتاحة", 301 "settings.recipes.headline": "الخدمات المتاحة",
383 "settings.recipes.missingService": "خدمة مفقودة؟", 302 "settings.recipes.missingService": "خدمة مفقودة؟",
384 "settings.recipes.mostPopular": "الأكثر شعبية",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "تمت إضافة الخدمة بنجاح", 304 "settings.recipes.servicesSuccessfulAddedInfo": "تمت إضافة الخدمة بنجاح",
387 "settings.searchService": "البحث عن خدمة", 305 "settings.searchService": "البحث عن خدمة",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "إضافة {name}", 309 "settings.service.form.addServiceHeadline": "إضافة {name}",
392 "settings.service.form.availableServices": "الخدمات المتاحة", 310 "settings.service.form.availableServices": "الخدمات المتاحة",
393 "settings.service.form.customUrl": "خادم مخصص", 311 "settings.service.form.customUrl": "خادم مخصص",
394 "settings.service.form.customUrlPremiumInfo": "لإضافة الخدمات المستضافة بنفسك، تحتاج إلى حساب الدعم المدفوع لفردي.",
395 "settings.service.form.customUrlUpgradeAccount": "ترقية حسابك",
396 "settings.service.form.customUrlValidationError": "تعذر التحقق من خادم {name} المخصص.", 312 "settings.service.form.customUrlValidationError": "تعذر التحقق من خادم {name} المخصص.",
397 "settings.service.form.darkReaderBrightness": "سطوع الشاشة في وضع القراءة المظلم", 313 "settings.service.form.darkReaderBrightness": "سطوع الشاشة في وضع القراءة المظلم",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "فريق أدارة فرانز", 378 "settings.team.contentHeadline": "فريق أدارة فرانز",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "فريق", 380 "settings.team.headline": "فريق",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "ادر فريقك على meetfranz.com", 382 "settings.team.manageAction": "ادر فريقك على meetfranz.com",
467 "settings.team.teamsUnavailable": "الفرق غير متوفرة", 383 "settings.team.teamsUnavailable": "الفرق غير متوفرة",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "ترقية حسابك",
470 "settings.user.form.accountType.company": "اسم الشركة", 385 "settings.user.form.accountType.company": "اسم الشركة",
471 "settings.user.form.accountType.individual": "شخصي", 386 "settings.user.form.accountType.individual": "شخصي",
472 "settings.user.form.accountType.label": "نوع الحساب", 387 "settings.user.form.accountType.label": "نوع الحساب",
@@ -516,29 +431,20 @@
516 "signup.link.login": "ألديك حساب, سجل الدخول؟", 431 "signup.link.login": "ألديك حساب, سجل الدخول؟",
517 "signup.password.label": "كلمة المرور", 432 "signup.password.label": "كلمة المرور",
518 "signup.submit.label": "أنشئ حساب", 433 "signup.submit.label": "أنشئ حساب",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "مشاهدة جميع الخيارات",
522 "subscription.cta.choosePlan": "اختر خطة اشتراكك",
523 "subscription.includedProFeatures": "وتشمل خطة اشتراك فيردي الاحترافية ما يلي:",
524 "subscription.interval.per": "لكل {interval}",
525 "subscription.interval.perMonth": "في الشهر",
526 "subscription.interval.perMonthPerUser": "في الشهر وعدد المستخدمين",
527 "subscription.planItem.upgradeAccount": "ترقية الحساب",
528 "subscription.teaser.includedFeatures": "تشمل خطة الاشتراك المدفوعة لفريدي:",
529 "subscription.teaser.intro": "يأتي فردي 5 مع مجموعة واسعة من الميزات الجديدة لتعزيز تواصلك اليومي - ويشمل ذلك البطاريات. تحقق من خطط اشتراكاتنا الجديدة واكتشف أي واحد تناسبك أكثر!",
530 "subscriptionPopup.buttonCancel": "إلغاء",
531 "subscriptionPopup.buttonDone": "تم",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "حذف الخدمة", 435 "tabs.item.deleteService": "حذف الخدمة",
534 "tabs.item.disableAudio": "تعطيل الصوت", 436 "tabs.item.disableAudio": "تعطيل الصوت",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "تعطيل الإشعارات", 438 "tabs.item.disableNotifications": "تعطيل الإشعارات",
536 "tabs.item.disableService": "تعطيل الخدمة", 439 "tabs.item.disableService": "تعطيل الخدمة",
537 "tabs.item.edit": "تعديل", 440 "tabs.item.edit": "تعديل",
538 "tabs.item.enableAudio": "تمكين الصوت", 441 "tabs.item.enableAudio": "تمكين الصوت",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "تفعيل الإشعارات", 443 "tabs.item.enableNotification": "تفعيل الإشعارات",
540 "tabs.item.enableService": "تفعيل الخدمة", 444 "tabs.item.enableService": "تفعيل الخدمة",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "إعادة التحميل", 446 "tabs.item.reload": "إعادة التحميل",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} غير صالح", 448 "validation.email": "{field} غير صالح",
543 "validation.minLength": "{field} يجب أن يكون على الأقل {length} حرفاً", 449 "validation.minLength": "{field} يجب أن يكون على الأقل {length} حرفاً",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "مساحاتُ العمل", 462 "workspaceDrawer.headline": "مساحاتُ العمل",
557 "workspaceDrawer.item.contextMenuEdit": "تعديل", 463 "workspaceDrawer.item.contextMenuEdit": "تعديل",
558 "workspaceDrawer.item.noServicesAddedYet": "لم تضف أي خدمات بعد", 464 "workspaceDrawer.item.noServicesAddedYet": "لم تضف أي خدمات بعد",
559 "workspaceDrawer.premiumCtaButtonLabel": "أنشئ مساحة عملك الأولى",
560 "workspaceDrawer.proFeatureBadge": "المزايا المدفوعة",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "إعادة تنشيط الحساب المدفوع",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>يُمكنك فيردي من التركيز على ما هو مهم لديك الآن. أنشاء مجموعات مختلفة من الخدمات وإداراتها والتنقل بينها بسهولة في أي وقت.<p><p/>أنتَ من يقرر أيّ الخدمات تحتاج ساعة تحتاج وأين تحتاج, لذا نستطيع مساعدتك لتبقى محافظ مع مستجدات ما تقوم به أو تستريح إن شئت.<p/>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>يُمكنك فيردي من التركيز على ما هو مهم لديك الآن. أنشاء مجموعات مختلفة من الخدمات وإداراتها والتنقل بينها بسهولة في أي وقت.<p><p/>أنتَ من يقرر أيّ الخدمات تحتاج ساعة تحتاج وأين تحتاج, لذا نستطيع مساعدتك لتبقى محافظ مع مستجدات ما تقوم به أو تستريح إن شئت.<p/>",
563 "workspaceDrawer.workspacesSettingsTooltip": "تعديل إعدادات مساحات العمل", 466 "workspaceDrawer.workspacesSettingsTooltip": "تعديل إعدادات مساحات العمل",
564 "workspaces.switchingIndicator.switchingTo": "التبديل إلى" 467 "workspaces.switchingIndicator.switchingTo": "التبديل إلى"
diff --git a/src/i18n/locales/be.json b/src/i18n/locales/be.json
index 848450add..8f1141c31 100644
--- a/src/i18n/locales/be.json
+++ b/src/i18n/locales/be.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cancel", 16 "feature.nightlyBuilds.cancel": "Cancel",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Can't connect to Ferdi online services", 36 "global.api.unhealthy": "Can't connect to Ferdi online services",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "You are not connected to the internet.", 37 "global.notConnectedToTheInternet": "You are not connected to the internet.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Import your Ferdi 4 services", 44 "import.headline": "Import your Ferdi 4 services",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Hide", 52 "infobar.hide": "Hide",
89 "infobar.requiredRequestsFailed": "Could not load services and user information", 53 "infobar.requiredRequestsFailed": "Could not load services and user information",
90 "infobar.servicesUpdated": "Your services have been updated.", 54 "infobar.servicesUpdated": "Your services have been updated.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "A new update for Ferdi is available.", 55 "infobar.updateAvailable": "A new update for Ferdi is available.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email address", 57 "invite.email.label": "Email address",
@@ -149,6 +112,7 @@
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Learn More", 116 "menu.help.learnMore": "Learn More",
153 "menu.help.privacy": "Privacy Statement", 117 "menu.help.privacy": "Privacy Statement",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,12 +127,10 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Enter Full Screen",
167 "menu.view.exitFullScreen": "Exit Full Screen",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Reload Service", 134 "menu.view.reloadService": "Reload Service",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Actual Size", 136 "menu.view.resetZoom": "Actual Size",
@@ -194,11 +156,7 @@
194 "password.noUser": "No user with that email address was found", 156 "password.noUser": "No user with that email address was found",
195 "password.submit.label": "Submit", 157 "password.submit.label": "Submit",
196 "password.successInfo": "Please check your email", 158 "password.successInfo": "Please check your email",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "Error", 179 "service.errorHandler.message": "Error",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Get started", 182 "services.getStarted": "Get started",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welcome to Ferdi", 186 "services.welcome": "Welcome to Ferdi",
257 "settings.account.account.editButton": "Edit account", 187 "settings.account.account.editButton": "Edit account",
258 "settings.account.accountType.basic": "Basic Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Update profile", 190 "settings.account.buttonSave": "Update profile",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Invoices", 197 "settings.account.headlineInvoices": "Invoices",
270 "settings.account.headlinePassword": "Change password", 198 "settings.account.headlinePassword": "Change password",
271 "settings.account.headlineProfile": "Update profile", 199 "settings.account.headlineProfile": "Update profile",
272 "settings.account.headlineSubscription": "Your subscription",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Manage your subscription",
277 "settings.account.successInfo": "Your changes have been saved", 200 "settings.account.successInfo": "Your changes have been saved",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Try again", 201 "settings.account.tryReloadServices": "Try again",
282 "settings.account.tryReloadUserInfoRequest": "Try again", 202 "settings.account.tryReloadUserInfoRequest": "Try again",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Could not load user information", 203 "settings.account.userInfoRequestFailed": "Could not load user information",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 228 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Settings", 259 "settings.app.headline": "Settings",
341 "settings.app.headlineAdvanced": "Advanced", 260 "settings.app.headlineAdvanced": "Advanced",
342 "settings.app.headlineAppearance": "Appearance", 261 "settings.app.headlineAppearance": "Appearance",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Changes require restart", 272 "settings.app.restartRequired": "Changes require restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Available services", 301 "settings.recipes.headline": "Available services",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "Most popular",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
387 "settings.searchService": "Search service", 305 "settings.searchService": "Search service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Add {name}", 309 "settings.service.form.addServiceHeadline": "Add {name}",
392 "settings.service.form.availableServices": "Available services", 310 "settings.service.form.availableServices": "Available services",
393 "settings.service.form.customUrl": "Custom server", 311 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Company", 385 "settings.user.form.accountType.company": "Company",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Account type", 387 "settings.user.form.accountType.label": "Account type",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Already have an account, sign in?", 431 "signup.link.login": "Already have an account, sign in?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Create account", 433 "signup.submit.label": "Create account",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Cancel",
531 "subscriptionPopup.buttonDone": "Done",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Delete service", 435 "tabs.item.deleteService": "Delete service",
534 "tabs.item.disableAudio": "Disable audio", 436 "tabs.item.disableAudio": "Disable audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Disable notifications", 438 "tabs.item.disableNotifications": "Disable notifications",
536 "tabs.item.disableService": "Disable service", 439 "tabs.item.disableService": "Disable service",
537 "tabs.item.edit": "Edit", 440 "tabs.item.edit": "Edit",
538 "tabs.item.enableAudio": "Enable audio", 441 "tabs.item.enableAudio": "Enable audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Enable notifications", 443 "tabs.item.enableNotification": "Enable notifications",
540 "tabs.item.enableService": "Enable service", 444 "tabs.item.enableService": "Enable service",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Абнавіць", 446 "tabs.item.reload": "Абнавіць",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/bg.json b/src/i18n/locales/bg.json
index a2a28c856..87d1083a8 100644
--- a/src/i18n/locales/bg.json
+++ b/src/i18n/locales/bg.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
19 "feature.planSelection.cta.upgradePro": "Choose Professional",
20 "feature.planSelection.free.text": "Basic functionality",
21 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
24 "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.",
25 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
26 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
30 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
31 "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.",
32 "feature.shareFranz.action.email": "Send as email", 8 "feature.shareFranz.action.email": "Send as email",
33 "feature.shareFranz.action.facebook": "Share on Facebook", 9 "feature.shareFranz.action.facebook": "Share on Facebook",
34 "feature.shareFranz.action.twitter": "Share on Twitter", 10 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 12 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
37 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 13 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
38 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 14 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
39 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
40 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade": "Upgrade Account",
42 "feature.trialStatusBar.cta": "Upgrade now",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
46 "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.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
49 "global.api.unhealthy": "Няма връзка с онлайн услугите на Франц", 15 "global.api.unhealthy": "Няма връзка с онлайн услугите на Франц",
50 "global.franzProRequired": "Ferdi Professional Required", 16 "global.franzProRequired": "Ferdi Professional Required",
51 "global.notConnectedToTheInternet": "Не сте свързани към интернет", 17 "global.notConnectedToTheInternet": "Не сте свързани към интернет",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "Detect language automatically", 19 "global.spellchecking.autodetect": "Detect language automatically",
54 "global.spellchecking.autodetect.short": "Automatic", 20 "global.spellchecking.autodetect.short": "Automatic",
55 "global.spellchecking.language": "Spell checking language", 21 "global.spellchecking.language": "Spell checking language",
56 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
57 "import.headline": "Вмъкнете вашите услуги на Франц 4", 22 "import.headline": "Вмъкнете вашите услуги на Франц 4",
58 "import.notSupportedHeadline": "Тези услуги не се подържат все още във Франц 5. ", 23 "import.notSupportedHeadline": "Тези услуги не се подържат все още във Франц 5. ",
59 "import.skip.label": "Искам да прибавя ръчно услуги", 24 "import.skip.label": "Искам да прибавя ръчно услуги",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "Презареждане на услугите", 28 "infobar.buttonReloadServices": "Презареждане на услугите",
64 "infobar.requiredRequestsFailed": "Неуспешно зареждане на услугите и информацията на потребителя. ", 29 "infobar.requiredRequestsFailed": "Неуспешно зареждане на услугите и информацията на потребителя. ",
65 "infobar.servicesUpdated": "Вашите услуги са обновени.", 30 "infobar.servicesUpdated": "Вашите услуги са обновени.",
66 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable": "Има нова версия на Франц", 31 "infobar.updateAvailable": "Има нова версия на Франц",
68 "invite.email.label": "Адрес на е-поща:", 32 "invite.email.label": "Адрес на е-поща:",
69 "invite.headline.friends": "Поканете 3 ваши приятели или колеги", 33 "invite.headline.friends": "Поканете 3 ваши приятели или колеги",
@@ -122,9 +86,7 @@
122 "menu.todos": "Todos", 86 "menu.todos": "Todos",
123 "menu.todos.enableTodos": "Enable Todos", 87 "menu.todos.enableTodos": "Enable Todos",
124 "menu.view": "Изглед", 88 "menu.view": "Изглед",
125 "menu.view.enterFullScreen": "Отвории на цял екран", 89 "menu.view.reloadFerdi": "Презареди Ferdi",
126 "menu.view.exitFullScreen": "Излез от цял екран",
127 "menu.view.reloadFranz": "Презареди Ferdi",
128 "menu.view.reloadService": "Презареди услугата", 90 "menu.view.reloadService": "Презареди услугата",
129 "menu.view.reloadTodos": "Reload ToDos", 91 "menu.view.reloadTodos": "Reload ToDos",
130 "menu.view.resetZoom": "Оригинален размер", 92 "menu.view.resetZoom": "Оригинален размер",
@@ -149,7 +111,6 @@
149 "password.noUser": "Абонат с такава е-поща не бе намерен", 111 "password.noUser": "Абонат с такава е-поща не бе намерен",
150 "password.submit.label": "Изпращане", 112 "password.submit.label": "Изпращане",
151 "password.successInfo": "Моля отбележете вашата е-поща", 113 "password.successInfo": "Моля отбележете вашата е-поща",
152 "premiumFeature.button.upgradeAccount": "Upgrade account",
153 "pricing.features.accountSync": "Account Synchronisation", 114 "pricing.features.accountSync": "Account Synchronisation",
154 "pricing.features.adFree": "Forever ad-free", 115 "pricing.features.adFree": "Forever ad-free",
155 "pricing.features.appDelays": "No Waiting Screens", 116 "pricing.features.appDelays": "No Waiting Screens",
@@ -166,27 +127,6 @@
166 "pricing.features.upToSixServices": "Add up to 6 services", 127 "pricing.features.upToSixServices": "Add up to 6 services",
167 "pricing.features.upToThreeServices": "Add up to 3 services", 128 "pricing.features.upToThreeServices": "Add up to 3 services",
168 "pricing.features.workspaces": "Workspaces", 129 "pricing.features.workspaces": "Workspaces",
169 "pricing.plan.free": "Free",
170 "pricing.plan.legacy": "Premium",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal Monthly",
173 "pricing.plan.personal-yearly": "Personal Yearly",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional Monthly",
176 "pricing.plan.pro-yearly": "Professional Yearly",
177 "pricing.trial.cta.accept": "Start my 14-day Ferdi Professional Trial ",
178 "pricing.trial.cta.skip": "Continue to Ferdi",
179 "pricing.trial.cta.start": "Start using Ferdi",
180 "pricing.trial.error": "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline": "Ferdi Professional includes:",
182 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
183 "pricing.trial.intro.happyMessaging": "Happy messaging,",
184 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
185 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline": "No strings attached",
188 "pricing.trial.terms.noCreditCard": "No credit card required",
189 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action": "Презареждане {име}", 130 "service.crashHandler.action": "Презареждане {име}",
191 "service.crashHandler.autoReload": "Опитва се да възтанови автоматично {name} след {seconds} секунди", 131 "service.crashHandler.autoReload": "Опитва се да възтанови автоматично {name} след {seconds} секунди",
192 "service.crashHandler.headline": "О не!", 132 "service.crashHandler.headline": "О не!",
@@ -198,11 +138,6 @@
198 "service.errorHandler.headline": "О не!", 138 "service.errorHandler.headline": "О не!",
199 "service.errorHandler.message": "Грешка", 139 "service.errorHandler.message": "Грешка",
200 "service.errorHandler.text": "{name} has failed to load.", 140 "service.errorHandler.text": "{name} has failed to load.",
201 "service.restrictedHandler.action": "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
203 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading": "Loading", 141 "service.webviewLoader.loading": "Loading",
207 "services.getStarted": "Започване", 142 "services.getStarted": "Започване",
208 "services.welcome": "Добре дошли във Франц", 143 "services.welcome": "Добре дошли във Франц",
@@ -219,18 +154,9 @@
219 "settings.account.headlineInvoices": "Фактури", 154 "settings.account.headlineInvoices": "Фактури",
220 "settings.account.headlinePassword": "Смяна на парола", 155 "settings.account.headlinePassword": "Смяна на парола",
221 "settings.account.headlineProfile": "Обновление на профила", 156 "settings.account.headlineProfile": "Обновление на профила",
222 "settings.account.headlineSubscription": "Вашият абонамент",
223 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
224 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
225 "settings.account.invoiceDownload": "Изтегляне",
226 "settings.account.manageSubscription.label": "Управление на абонамена",
227 "settings.account.successInfo": "Промените бяха запазени", 157 "settings.account.successInfo": "Промените бяха запазени",
228 "settings.account.trial": "Free Trial",
229 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices": "Опитайте отново", 158 "settings.account.tryReloadServices": "Опитайте отново",
232 "settings.account.tryReloadUserInfoRequest": "Опитайте отново", 159 "settings.account.tryReloadUserInfoRequest": "Опитайте отново",
233 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
234 "settings.account.userInfoRequestFailed": "Не може да зареди информацията на абоната", 160 "settings.account.userInfoRequestFailed": "Не може да зареди информацията на абоната",
235 "settings.account.yourLicense": "Your Ferdi License", 161 "settings.account.yourLicense": "Your Ferdi License",
236 "settings.app.buttonClearAllCache": "Изчистване на буфера", 162 "settings.app.buttonClearAllCache": "Изчистване на буфера",
@@ -284,7 +210,6 @@
284 "settings.recipes.customService.openFolder": "Open folder", 210 "settings.recipes.customService.openFolder": "Open folder",
285 "settings.recipes.headline": "Налични услуги", 211 "settings.recipes.headline": "Налични услуги",
286 "settings.recipes.missingService": "Липсващи услуги?", 212 "settings.recipes.missingService": "Липсващи услуги?",
287 "settings.recipes.mostPopular": "Най-разпространените",
288 "settings.recipes.nothingFound": "За съжаление няма услуги съвпадащи с вашето търсене.", 213 "settings.recipes.nothingFound": "За съжаление няма услуги съвпадащи с вашето търсене.",
289 "settings.recipes.servicesSuccessfulAddedInfo": "Услугата беше прибавена успешно", 214 "settings.recipes.servicesSuccessfulAddedInfo": "Услугата беше прибавена успешно",
290 "settings.searchService": "Търсене на услуга", 215 "settings.searchService": "Търсене на услуга",
@@ -295,7 +220,6 @@
295 "settings.service.form.availableServices": "Налични услуги", 220 "settings.service.form.availableServices": "Налични услуги",
296 "settings.service.form.customUrl": "Клиентски сървър", 221 "settings.service.form.customUrl": "Клиентски сървър",
297 "settings.service.form.customUrlPremiumInfo": "За да добавите услуги, разположени на ваш сървър, трябва да имате Ferdi Premium Supporter профил", 222 "settings.service.form.customUrlPremiumInfo": "За да добавите услуги, разположени на ваш сървър, трябва да имате Ferdi Premium Supporter профил",
298 "settings.service.form.customUrlUpgradeAccount": "Надградете вашия профил",
299 "settings.service.form.customUrlValidationError": "Не може да се валидира стандартния {name} сървър", 223 "settings.service.form.customUrlValidationError": "Не може да се валидира стандартния {name} сървър",
300 "settings.service.form.deleteButton": "Изтрий услугата", 224 "settings.service.form.deleteButton": "Изтрий услугата",
301 "settings.service.form.editServiceHeadline": "Редактира {име}", 225 "settings.service.form.editServiceHeadline": "Редактира {име}",
@@ -391,19 +315,6 @@
391 "signup.link.login": "Вече сте регистриран, впишете се?", 315 "signup.link.login": "Вече сте регистриран, впишете се?",
392 "signup.password.label": "Парола", 316 "signup.password.label": "Парола",
393 "signup.submit.label": "Създаване на акаунт", 317 "signup.submit.label": "Създаване на акаунт",
394 "subscription.bestValue": "Best value",
395 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
396 "subscription.cta.allOptions": "See all options",
397 "subscription.cta.choosePlan": "Choose your plan",
398 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
399 "subscription.interval.per": "per {interval}",
400 "subscription.interval.perMonth": "per month",
401 "subscription.interval.perMonthPerUser": "per month & user",
402 "subscription.planItem.upgradeAccount": "Upgrade Account",
403 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
404 "subscription.teaser.intro": "Ferdi 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!",
405 "subscriptionPopup.buttonCancel": "Отказ",
406 "subscriptionPopup.buttonDone": "Готово",
407 "tabs.item.deleteService": "Изтрий услугата", 318 "tabs.item.deleteService": "Изтрий услугата",
408 "tabs.item.disableAudio": "Изключване на звука", 319 "tabs.item.disableAudio": "Изключване на звука",
409 "tabs.item.disableNotifications": "Изключване на известията", 320 "tabs.item.disableNotifications": "Изключване на известията",
@@ -431,7 +342,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "edit", 342 "workspaceDrawer.item.contextMenuEdit": "edit",
432 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 343 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 344 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge": "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 345 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 346 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 347 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
diff --git a/src/i18n/locales/bs.json b/src/i18n/locales/bs.json
index 3447ea7ac..3e185e73b 100644
--- a/src/i18n/locales/bs.json
+++ b/src/i18n/locales/bs.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cancel", 16 "feature.nightlyBuilds.cancel": "Cancel",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Can't connect to Ferdi online services", 36 "global.api.unhealthy": "Can't connect to Ferdi online services",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "You are not connected to the internet.", 37 "global.notConnectedToTheInternet": "You are not connected to the internet.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Import your Ferdi 4 services", 44 "import.headline": "Import your Ferdi 4 services",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Hide", 52 "infobar.hide": "Hide",
89 "infobar.requiredRequestsFailed": "Could not load services and user information", 53 "infobar.requiredRequestsFailed": "Could not load services and user information",
90 "infobar.servicesUpdated": "Your services have been updated.", 54 "infobar.servicesUpdated": "Your services have been updated.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "A new update for Ferdi is available.", 55 "infobar.updateAvailable": "A new update for Ferdi is available.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email address", 57 "invite.email.label": "Email address",
@@ -149,6 +112,7 @@
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Learn More", 116 "menu.help.learnMore": "Learn More",
153 "menu.help.privacy": "Privacy Statement", 117 "menu.help.privacy": "Privacy Statement",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,12 +127,10 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Enter Full Screen",
167 "menu.view.exitFullScreen": "Exit Full Screen",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Reload Service", 134 "menu.view.reloadService": "Reload Service",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Actual Size", 136 "menu.view.resetZoom": "Actual Size",
@@ -194,11 +156,7 @@
194 "password.noUser": "No user with that email address was found", 156 "password.noUser": "No user with that email address was found",
195 "password.submit.label": "Submit", 157 "password.submit.label": "Submit",
196 "password.successInfo": "Please check your email", 158 "password.successInfo": "Please check your email",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "Error", 179 "service.errorHandler.message": "Error",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Get started", 182 "services.getStarted": "Get started",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welcome to Ferdi", 186 "services.welcome": "Welcome to Ferdi",
257 "settings.account.account.editButton": "Edit account", 187 "settings.account.account.editButton": "Edit account",
258 "settings.account.accountType.basic": "Basic Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Update profile", 190 "settings.account.buttonSave": "Update profile",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Invoices", 197 "settings.account.headlineInvoices": "Invoices",
270 "settings.account.headlinePassword": "Change password", 198 "settings.account.headlinePassword": "Change password",
271 "settings.account.headlineProfile": "Update profile", 199 "settings.account.headlineProfile": "Update profile",
272 "settings.account.headlineSubscription": "Your subscription",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Manage your subscription",
277 "settings.account.successInfo": "Your changes have been saved", 200 "settings.account.successInfo": "Your changes have been saved",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Try again", 201 "settings.account.tryReloadServices": "Try again",
282 "settings.account.tryReloadUserInfoRequest": "Try again", 202 "settings.account.tryReloadUserInfoRequest": "Try again",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Could not load user information", 203 "settings.account.userInfoRequestFailed": "Could not load user information",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 228 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Settings", 259 "settings.app.headline": "Settings",
341 "settings.app.headlineAdvanced": "Advanced", 260 "settings.app.headlineAdvanced": "Advanced",
342 "settings.app.headlineAppearance": "Appearance", 261 "settings.app.headlineAppearance": "Appearance",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Changes require restart", 272 "settings.app.restartRequired": "Changes require restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Available services", 301 "settings.recipes.headline": "Available services",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "Most popular",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
387 "settings.searchService": "Search service", 305 "settings.searchService": "Search service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Add {name}", 309 "settings.service.form.addServiceHeadline": "Add {name}",
392 "settings.service.form.availableServices": "Available services", 310 "settings.service.form.availableServices": "Available services",
393 "settings.service.form.customUrl": "Custom server", 311 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Company", 385 "settings.user.form.accountType.company": "Company",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Account type", 387 "settings.user.form.accountType.label": "Account type",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Already have an account, sign in?", 431 "signup.link.login": "Already have an account, sign in?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Create account", 433 "signup.submit.label": "Create account",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Cancel",
531 "subscriptionPopup.buttonDone": "Done",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Delete service", 435 "tabs.item.deleteService": "Delete service",
534 "tabs.item.disableAudio": "Disable audio", 436 "tabs.item.disableAudio": "Disable audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Disable notifications", 438 "tabs.item.disableNotifications": "Disable notifications",
536 "tabs.item.disableService": "Disable service", 439 "tabs.item.disableService": "Disable service",
537 "tabs.item.edit": "Edit", 440 "tabs.item.edit": "Edit",
538 "tabs.item.enableAudio": "Enable audio", 441 "tabs.item.enableAudio": "Enable audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Enable notifications", 443 "tabs.item.enableNotification": "Enable notifications",
540 "tabs.item.enableService": "Enable service", 444 "tabs.item.enableService": "Enable service",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Reload", 446 "tabs.item.reload": "Reload",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index 561fe3c4c..beb7f7f92 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi ha perdut la connexió a {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi ha perdut la connexió a {name}.",
13 "feature.announcements.changelog.headline": "Canvis en Ferdi {version}", 13 "feature.announcements.changelog.headline": "Canvis en Ferdi {version}",
14 "feature.debugger.title": "Registra la informació de depuració", 14 "feature.debugger.title": "Registra la informació de depuració",
15 "feature.delayApp.headline": "Si us plau, compra una llicència de suport per a Ferdi per saltar l'espera",
16 "feature.delayApp.text": "Ferdi continuarà en {seconds} segons",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Aconsegueix una llicència de suport per a Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Millorar el teu compte",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cancel·la", 16 "feature.nightlyBuilds.cancel": "Cancel·la",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "S'ha produït un error en intentar publicar la informació de depuració. Torneu-ho a provar més tard o visualitzeu la consola per obtenir més informació.", 19 "feature.publishDebugInfo.error": "S'ha produït un error en intentar publicar la informació de depuració. Torneu-ho a provar més tard o visualitzeu la consola per obtenir més informació.",
43 "feature.publishDebugInfo.info": "La publicació de la informació de depuració ens ajuda a trobar problemes i errors a Ferdi. En publicar la informació de depuració, accepteu la política de privadesa i els termes del servei de Ferdi Debugger", 20 "feature.publishDebugInfo.info": "La publicació de la informació de depuració ens ajuda a trobar problemes i errors a Ferdi. En publicar la informació de depuració, accepteu la política de privadesa i els termes del servei de Ferdi Debugger",
44 "feature.publishDebugInfo.privacy": "Política de privacitat", 21 "feature.publishDebugInfo.privacy": "Política de privacitat",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Seleccioneu un servei amb TAB, ↑ i ↓. Obriu un servei amb ENTER.", 26 "feature.quickSwitch.info": "Seleccioneu un servei amb TAB, ↑ i ↓. Obriu un servei amb ENTER.",
50 "feature.quickSwitch.search": "Cerca...", 27 "feature.quickSwitch.search": "Cerca...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "feature.serviceLimit.limitReached": "Heu afegit {amount} de {limit} serveis inclosos al vostre pla. Actualitzeu el vostre compte per afegir més serveis.",
53 "feature.shareFranz.action.email": "Envia com a correu", 29 "feature.shareFranz.action.email": "Envia com a correu",
54 "feature.shareFranz.action.facebook": "Compartir en Facebook", 30 "feature.shareFranz.action.facebook": "Compartir en Facebook",
55 "feature.shareFranz.action.twitter": "Compartir a Twitter", 31 "feature.shareFranz.action.twitter": "Compartir a Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "He afegit {count} serveis a Ferdi! Obtén l'aplicació gratuïta per a Whatsapp, Messenger, Slack, Skype a www,getferdi.com", 33 "feature.shareFranz.shareText.email": "He afegit {count} serveis a Ferdi! Obtén l'aplicació gratuïta per a Whatsapp, Messenger, Slack, Skype a www,getferdi.com",
58 "feature.shareFranz.shareText.twitter": "He afegit {count} serveis a Ferdi! Obtén l'aplicació gratuïta de Whatsapp, Messenger, Slack, Skype i altres a www.getferdi.com/cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "He afegit {count} serveis a Ferdi! Obtén l'aplicació gratuïta de Whatsapp, Messenger, Slack, Skype i altres a www.getferdi.com/cc @FerdiMessenger",
59 "feature.shareFranz.text": "Digues als teus amics i col·legues l'increïble que és Ferdi i ajuda'ns a còrrer la veu ", 35 "feature.shareFranz.text": "Digues als teus amics i col·legues l'increïble que és Ferdi i ajuda'ns a còrrer la veu ",
60 "feature.todos.premium.info": "Les Tasques de Ferdi ja estan disponibles per a usuaris premium!",
61 "feature.todos.premium.rollout": "Tothom haurà d'esperar una mica més.",
62 "feature.todos.premium.upgrade": "Actualitzar el compte",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "No es pot connectar amb els serveis en línia de Ferdi", 36 "global.api.unhealthy": "No es pot connectar amb els serveis en línia de Ferdi",
71 "global.franzProRequired": "Professional de Ferdi obligatori",
72 "global.notConnectedToTheInternet": "No esteu connectat a Internet.", 37 "global.notConnectedToTheInternet": "No esteu connectat a Internet.",
73 "global.spellchecker.useDefault": "Utilitzar el predeterminat del sistema ({default})", 38 "global.spellchecker.useDefault": "Utilitzar el predeterminat del sistema ({default})",
74 "global.spellchecking.autodetect": "Detectar l'idioma automàticament", 39 "global.spellchecking.autodetect": "Detectar l'idioma automàticament",
75 "global.spellchecking.autodetect.short": "Automàtic", 40 "global.spellchecking.autodetect.short": "Automàtic",
76 "global.spellchecking.language": "Corrector ortogràfic", 41 "global.spellchecking.language": "Corrector ortogràfic",
77 "global.upgradeButton.upgradeToPro": "Actualitza a Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importa els teus serveis Ferdi 4", 44 "import.headline": "Importa els teus serveis Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Amaga", 52 "infobar.hide": "Amaga",
89 "infobar.requiredRequestsFailed": "No s'han pogut carregar els serveis i la informació de l'usuari", 53 "infobar.requiredRequestsFailed": "No s'han pogut carregar els serveis i la informació de l'usuari",
90 "infobar.servicesUpdated": "Els teus serveis s'han actualitzat.", 54 "infobar.servicesUpdated": "Els teus serveis s'han actualitzat.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Hi ha disponible una nova actualització per a Ferdi.", 55 "infobar.updateAvailable": "Hi ha disponible una nova actualització per a Ferdi.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Correu electrònic", 57 "invite.email.label": "Correu electrònic",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Amaga automàticament la barra de menú", 87 "menu.app.autohideMenuBar": "Amaga automàticament la barra de menú",
125 "menu.app.checkForUpdates": "Comprova si hi ha actualitzacions", 88 "menu.app.checkForUpdates": "Comprova si hi ha actualitzacions",
126 "menu.app.hide": "Amaga", 89 "menu.app.hide": "Amaga",
127 "menu.app.hideOthers": "Amaga altres", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Surt", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Configuració", 92 "menu.app.settings": "Configuració",
130 "menu.app.unhide": "Mostra", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Edita", 94 "menu.edit": "Edita",
132 "menu.edit.copy": "Copia", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Retalla", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Suprimeix", 97 "menu.edit.delete": "Suprimeix",
135 "menu.edit.emojiSymbols": "Emoji i Símbols", 98 "menu.edit.emojiSymbols": "Emoji i Símbols",
136 "menu.edit.findInPage": "Troba a la pàgina", 99 "menu.edit.findInPage": "Troba a la pàgina",
137 "menu.edit.paste": "Enganxa", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Enganxa amb els estils", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Refés", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Selecciona-ho tot", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Pronuncia", 104 "menu.edit.speech": "Pronuncia",
142 "menu.edit.startDictation": "Inicia el dictat", 105 "menu.edit.startDictation": "Inicia el dictat",
143 "menu.edit.startSpeaking": "Inicia la parla", 106 "menu.edit.startSpeaking": "Inicia la parla",
144 "menu.edit.stopSpeaking": "Atura la parla", 107 "menu.edit.stopSpeaking": "Atura la parla",
145 "menu.edit.undo": "Desfés", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Fitxer", 109 "menu.file": "Fitxer",
147 "menu.help": "Ajuda", 110 "menu.help": "Help",
148 "menu.help.changelog": "Registre de canvis", 111 "menu.help.changelog": "Registre de canvis",
149 "menu.help.debugInfo": "Copia la informació de depuració", 112 "menu.help.debugInfo": "Copia la informació de depuració",
150 "menu.help.debugInfoCopiedBody": "La informació de depuració s'ha copiat al porta-retalls.", 113 "menu.help.debugInfoCopiedBody": "La informació de depuració s'ha copiat al porta-retalls.",
151 "menu.help.debugInfoCopiedHeadline": "Informació de depuració de Ferdi", 114 "menu.help.debugInfoCopiedHeadline": "Informació de depuració de Ferdi",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Conegueu-ne més detalls", 116 "menu.help.learnMore": "Conegueu-ne més detalls",
153 "menu.help.privacy": "Declaració de privacitat", 117 "menu.help.privacy": "Declaració de privacitat",
154 "menu.help.publishDebugInfo": "Publicar informació de depuració", 118 "menu.help.publishDebugInfo": "Publicar informació de depuració",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Activar Tasques", 127 "menu.todos.enableTodos": "Activar Tasques",
164 "menu.view": "Visualitza", 128 "menu.view": "Visualitza",
165 "menu.view.back": "Enrere", 129 "menu.view.back": "Enrere",
166 "menu.view.enterFullScreen": "Inicia la pantalla completa",
167 "menu.view.exitFullScreen": "Surt de pantalla completa",
168 "menu.view.forward": "Endavant", 130 "menu.view.forward": "Endavant",
169 "menu.view.lockFerdi": "Bloqueja Ferdi", 131 "menu.view.lockFerdi": "Bloqueja Ferdi",
170 "menu.view.openQuickSwitch": "Obre Quick Switch", 132 "menu.view.openQuickSwitch": "Obre Quick Switch",
171 "menu.view.reloadFranz": "Torna a carregar Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Torna a carregar el servei", 134 "menu.view.reloadService": "Torna a carregar el servei",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Mida real", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Canvia a Mode Fosc", 137 "menu.view.toggleDarkMode": "Canvia a Mode Fosc",
176 "menu.view.toggleDevTools": "Activa serveis per a desenvolupadors", 138 "menu.view.toggleDevTools": "Activa serveis per a desenvolupadors",
177 "menu.view.toggleFullScreen": "Activa la pantalla completa", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Habilita les eines de desenvolupador de serveis", 140 "menu.view.toggleServiceDevTools": "Habilita les eines de desenvolupador de serveis",
179 "menu.view.toggleTodosDevTools": "Activa serveis per a desenvolupadors a Tasques", 141 "menu.view.toggleTodosDevTools": "Activa serveis per a desenvolupadors a Tasques",
180 "menu.view.zoomIn": "Amplia", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Redueix", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Finestra", 144 "menu.window": "Window",
183 "menu.window.close": "Tanca", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimitza", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Espais de treball", 147 "menu.workspaces": "Espais de treball",
186 "menu.workspaces.addNewWorkspace": "Afegir un Espai de Treball...", 148 "menu.workspaces.addNewWorkspace": "Afegir un Espai de Treball...",
187 "menu.workspaces.closeWorkspaceDrawer": "Tancar el calaix d'espais de treball", 149 "menu.workspaces.closeWorkspaceDrawer": "Tancar el calaix d'espais de treball",
@@ -194,11 +156,7 @@
194 "password.noUser": "No s'ha trobat cap usuari amb aquesta adreça de correu electrònic", 156 "password.noUser": "No s'ha trobat cap usuari amb aquesta adreça de correu electrònic",
195 "password.submit.label": "Enviar", 157 "password.submit.label": "Enviar",
196 "password.successInfo": "Comproveu el vostre correu electrònic", 158 "password.successInfo": "Comproveu el vostre correu electrònic",
197 "premiumFeature.button.upgradeAccount": "Millorar el teu compte",
198 "pricing.features.accountSync": "Sincronització de Conte", 159 "pricing.features.accountSync": "Sincronització de Conte",
199 "pricing.features.adFree": "Sense publicitat per sempre",
200 "pricing.features.appDelays": "Cap pantalla d’espera",
201 "pricing.features.appDelaysEnabled": "Pantalles d’espera ocasionals",
202 "pricing.features.customWebsites": "Afegir llocs web personalitzats", 160 "pricing.features.customWebsites": "Afegir llocs web personalitzats",
203 "pricing.features.desktopNotifications": "Notificacions a l'escriptori", 161 "pricing.features.desktopNotifications": "Notificacions a l'escriptori",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Espais de treball", 169 "pricing.features.workspaces": "Espais de treball",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Recarrega {name}", 170 "service.crashHandler.action": "Recarrega {name}",
236 "service.crashHandler.autoReload": "Intentant restablir automàticament {name} en {seconds} segons", 171 "service.crashHandler.autoReload": "Intentant restablir automàticament {name} en {seconds} segons",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "Error", 179 "service.errorHandler.message": "Error",
245 "service.errorHandler.text": "{name} ha fallat al carregar", 180 "service.errorHandler.text": "{name} ha fallat al carregar",
246 "service.restrictedHandler.action": "Actualitzar el compte",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Introducció", 182 "services.getStarted": "Introducció",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Benvingut a Ferdi", 186 "services.welcome": "Benvingut a Ferdi",
257 "settings.account.account.editButton": "Editar Compte", 187 "settings.account.account.editButton": "Editar Compte",
258 "settings.account.accountType.basic": "Compte bàsic",
259 "settings.account.accountType.premium": "Compte de Suport Premium",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Actualitzar el perfil", 190 "settings.account.buttonSave": "Actualitzar el perfil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Factures", 197 "settings.account.headlineInvoices": "Factures",
270 "settings.account.headlinePassword": "Canvia la contrasenya", 198 "settings.account.headlinePassword": "Canvia la contrasenya",
271 "settings.account.headlineProfile": "Actualitzar el perfil", 199 "settings.account.headlineProfile": "Actualitzar el perfil",
272 "settings.account.headlineSubscription": "La vostra subscripció",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Descarregar",
276 "settings.account.manageSubscription.label": "Gestioneu la vostra subscripció",
277 "settings.account.successInfo": "S'han desat els canvis", 200 "settings.account.successInfo": "S'han desat els canvis",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Torna a provar-ho", 201 "settings.account.tryReloadServices": "Torna a provar-ho",
282 "settings.account.tryReloadUserInfoRequest": "Torna a provar-ho", 202 "settings.account.tryReloadUserInfoRequest": "Torna a provar-ho",
283 "settings.account.upgradeToPro.label": "Actualitza a Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "No s'ha pogut carregar la informació de l'usuari", 203 "settings.account.userInfoRequestFailed": "No s'ha pogut carregar la informació de l'usuari",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Habilita la comprobació ortogràfica", 227 "settings.app.form.enableSpellchecking": "Habilita la comprobació ortogràfica",
309 "settings.app.form.enableSystemTray": "Mostra Ferdi a la safata del sistema", 228 "settings.app.form.enableSystemTray": "Mostra Ferdi a la safata del sistema",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Configuració", 259 "settings.app.headline": "Configuració",
341 "settings.app.headlineAdvanced": "Avançat", 260 "settings.app.headlineAdvanced": "Avançat",
342 "settings.app.headlineAppearance": "Aparença", 261 "settings.app.headlineAppearance": "Aparença",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Contrasenya", 270 "settings.app.lockedPassword": "Contrasenya",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Els canvis requereixen reiniciar", 272 "settings.app.restartRequired": "Els canvis requereixen reiniciar",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Memòria cau", 277 "settings.app.subheadlineCache": "Memòria cau",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Serveis disponibles", 301 "settings.recipes.headline": "Serveis disponibles",
383 "settings.recipes.missingService": "Trobes a faltar algun servei?", 302 "settings.recipes.missingService": "Trobes a faltar algun servei?",
384 "settings.recipes.mostPopular": "Els més populars",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "El servei s'ha afegit correctament", 304 "settings.recipes.servicesSuccessfulAddedInfo": "El servei s'ha afegit correctament",
387 "settings.searchService": "Cercar servei", 305 "settings.searchService": "Cercar servei",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Afegir {name}", 309 "settings.service.form.addServiceHeadline": "Afegir {name}",
392 "settings.service.form.availableServices": "Serveis disponibles", 310 "settings.service.form.availableServices": "Serveis disponibles",
393 "settings.service.form.customUrl": "Servidor personalitzat", 311 "settings.service.form.customUrl": "Servidor personalitzat",
394 "settings.service.form.customUrlPremiumInfo": "Per afegir serveis allotjats per vosaltres mateixos, necessiteu un Compte Ferdi Premium Supporter.",
395 "settings.service.form.customUrlUpgradeAccount": "Actualitzeu el vostre compte",
396 "settings.service.form.customUrlValidationError": "No s'ha pogut validar el servidor {name} personalitzat.", 312 "settings.service.form.customUrlValidationError": "No s'ha pogut validar el servidor {name} personalitzat.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Equip", 380 "settings.team.headline": "Equip",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Empresa", 385 "settings.user.form.accountType.company": "Empresa",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Tipus de compte", 387 "settings.user.form.accountType.label": "Tipus de compte",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Ja teniu un compte, iniciar la sessió?", 431 "signup.link.login": "Ja teniu un compte, iniciar la sessió?",
517 "signup.password.label": "Contrasenya", 432 "signup.password.label": "Contrasenya",
518 "signup.submit.label": "Crea un compte", 433 "signup.submit.label": "Crea un compte",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Actualitzar el compte",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Cancel·la",
531 "subscriptionPopup.buttonDone": "Fet",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Suprimeix el servei", 435 "tabs.item.deleteService": "Suprimeix el servei",
534 "tabs.item.disableAudio": "Desactiva l'àudio", 436 "tabs.item.disableAudio": "Desactiva l'àudio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Desactiva les notificacions", 438 "tabs.item.disableNotifications": "Desactiva les notificacions",
536 "tabs.item.disableService": "Desactiva el servei", 439 "tabs.item.disableService": "Desactiva el servei",
537 "tabs.item.edit": "Edita", 440 "tabs.item.edit": "Edita",
538 "tabs.item.enableAudio": "Activa l'àudio", 441 "tabs.item.enableAudio": "Activa l'àudio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Activa les notificacions", 443 "tabs.item.enableNotification": "Activa les notificacions",
540 "tabs.item.enableService": "Activa el servei", 444 "tabs.item.enableService": "Activa el servei",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Recarrega", 446 "tabs.item.reload": "Recarrega",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} no es vàlid", 448 "validation.email": "{field} no es vàlid",
543 "validation.minLength": "{field} ha de ser al menys {length} caràcters de llargada", 449 "validation.minLength": "{field} ha de ser al menys {length} caràcters de llargada",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Espais de treball", 462 "workspaceDrawer.headline": "Espais de treball",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json
index edc73c64c..16c5322aa 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Změny ve Ferdi {version}", 13 "feature.announcements.changelog.headline": "Změny ve Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Kup si Ferdi Supporter licenci a nebudeš už muset čekat",
16 "feature.delayApp.text": "Ferdi bude pokračovat v {seconds} sekundách.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Podpoř Ferdi a získej Supporter licenci",
21 "feature.delayApp.upgrade.actionShort": "Vylepši si svůj účet",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Zrušit", 16 "feature.nightlyBuilds.cancel": "Zrušit",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Poslat jako e-mail", 29 "feature.shareFranz.action.email": "Poslat jako e-mail",
54 "feature.shareFranz.action.facebook": "Sdílet na Facebooku", 30 "feature.shareFranz.action.facebook": "Sdílet na Facebooku",
55 "feature.shareFranz.action.twitter": "Sdílet na Twitteru", 31 "feature.shareFranz.action.twitter": "Sdílet na Twitteru",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Přidali jsme {count} služeb do Ferdie. Získejte zdarma aplikace pro WhatsApp, Messenger, SLack, Skype a další na www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Přidali jsme {count} služeb do Ferdie. Získejte zdarma aplikace pro WhatsApp, Messenger, SLack, Skype a další na www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Nemůžeme připojit Ferdi k online službám", 36 "global.api.unhealthy": "Nemůžeme připojit Ferdi k online službám",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "Připojení k internetu není k dispozici.", 37 "global.notConnectedToTheInternet": "Připojení k internetu není k dispozici.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Automaticky rozpoznat jazyk", 39 "global.spellchecking.autodetect": "Automaticky rozpoznat jazyk",
75 "global.spellchecking.autodetect.short": "Automaticky", 40 "global.spellchecking.autodetect.short": "Automaticky",
76 "global.spellchecking.language": "Oprava překlepů jazyka", 41 "global.spellchecking.language": "Oprava překlepů jazyka",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importovat služby z Ferdi 4", 44 "import.headline": "Importovat služby z Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Skrýt", 52 "infobar.hide": "Skrýt",
89 "infobar.requiredRequestsFailed": "Není možné nahrát služby a informace o uživateli", 53 "infobar.requiredRequestsFailed": "Není možné nahrát služby a informace o uživateli",
90 "infobar.servicesUpdated": "Vaše služby byly aktualizovány", 54 "infobar.servicesUpdated": "Vaše služby byly aktualizovány",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Nová aktualizace Ferdi je k dispozici", 55 "infobar.updateAvailable": "Nová aktualizace Ferdi je k dispozici",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "E-mailová adresa", 57 "invite.email.label": "E-mailová adresa",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "Zkontrolovat aktualizace", 88 "menu.app.checkForUpdates": "Zkontrolovat aktualizace",
126 "menu.app.hide": "Skrýt", 89 "menu.app.hide": "Skrýt",
127 "menu.app.hideOthers": "Skryt ostatní", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Ukončit", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Nastavení", 92 "menu.app.settings": "Nastavení",
130 "menu.app.unhide": "Odkrýt", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Upravit", 94 "menu.edit": "Upravit",
132 "menu.edit.copy": "Kopírovat", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Vyjmout", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Smazat", 97 "menu.edit.delete": "Smazat",
135 "menu.edit.emojiSymbols": "Emoji a znaky", 98 "menu.edit.emojiSymbols": "Emoji a znaky",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Vložit", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Vložitetně formátování", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Vpřed", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Vybrat vše", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Mluvené slovo", 104 "menu.edit.speech": "Mluvené slovo",
142 "menu.edit.startDictation": "Začít diktovat", 105 "menu.edit.startDictation": "Začít diktovat",
143 "menu.edit.startSpeaking": "Začít mluvit", 106 "menu.edit.startSpeaking": "Začít mluvit",
144 "menu.edit.stopSpeaking": "Přestat mluvit", 107 "menu.edit.stopSpeaking": "Přestat mluvit",
145 "menu.edit.undo": "Vrátit zpět", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Soubor", 109 "menu.file": "Soubor",
147 "menu.help": "pověda", 110 "menu.help": "Help",
148 "menu.help.changelog": "Seznam změn", 111 "menu.help.changelog": "Seznam změn",
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Dozvědět se více", 116 "menu.help.learnMore": "Dozvědět se více",
153 "menu.help.privacy": "Prohlášení o ochraně soukromí", 117 "menu.help.privacy": "Prohlášení o ochraně soukromí",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Zobrazení", 128 "menu.view": "Zobrazení",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Spustit režim celé obrazovky",
167 "menu.view.exitFullScreen": "Ukončit celoobrazovkový režim",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Obnovit Ferdie", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Obnovit službu", 134 "menu.view.reloadService": "Obnovit službu",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Skutečná velikost", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Toggle Dark Mode", 137 "menu.view.toggleDarkMode": "Toggle Dark Mode",
176 "menu.view.toggleDevTools": "Zobrazit Vývojářské nástroje", 138 "menu.view.toggleDevTools": "Zobrazit Vývojářské nástroje",
177 "menu.view.toggleFullScreen": "Přepnout na celou obrazovku", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Zobrazit Vývojářské nástroje pro službu", 140 "menu.view.toggleServiceDevTools": "Zobrazit Vývojářské nástroje pro službu",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "Přiblížit", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Oddálit", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Okno", 144 "menu.window": "Window",
183 "menu.window.close": "Zavřít", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimalizovat", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Workspaces", 147 "menu.workspaces": "Workspaces",
186 "menu.workspaces.addNewWorkspace": "Add New Workspace...", 148 "menu.workspaces.addNewWorkspace": "Add New Workspace...",
187 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer", 149 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer",
@@ -194,11 +156,7 @@
194 "password.noUser": "Pro emailovou adresu nebyl nalezený žádný uživatel", 156 "password.noUser": "Pro emailovou adresu nebyl nalezený žádný uživatel",
195 "password.submit.label": "Odeslat", 157 "password.submit.label": "Odeslat",
196 "password.successInfo": "Prosím, zkontrolujte svůj e-mail", 158 "password.successInfo": "Prosím, zkontrolujte svůj e-mail",
197 "premiumFeature.button.upgradeAccount": "Vylepši si svůj účet",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Načíst znovu {name}", 170 "service.crashHandler.action": "Načíst znovu {name}",
236 "service.crashHandler.autoReload": "Pokus o automatické obnovení {name} za {seconds} sekund", 171 "service.crashHandler.autoReload": "Pokus o automatické obnovení {name} za {seconds} sekund",
237 "service.crashHandler.headline": "Ale ne!", 172 "service.crashHandler.headline": "Ale ne!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Ale ne!", 178 "service.errorHandler.headline": "Ale ne!",
244 "service.errorHandler.message": "Chyba", 179 "service.errorHandler.message": "Chyba",
245 "service.errorHandler.text": "{name} se nepodařilo načíst.", 180 "service.errorHandler.text": "{name} se nepodařilo načíst.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Začněme", 182 "services.getStarted": "Začněme",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Vítejte v programu Ferdi", 186 "services.welcome": "Vítejte v programu Ferdi",
257 "settings.account.account.editButton": "Upravit účet", 187 "settings.account.account.editButton": "Upravit účet",
258 "settings.account.accountType.basic": "Základní účet",
259 "settings.account.accountType.premium": "Prémiový účet podporovatele",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Aktualizovat profil", 190 "settings.account.buttonSave": "Aktualizovat profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Faktury", 197 "settings.account.headlineInvoices": "Faktury",
270 "settings.account.headlinePassword": "Změnit heslo", 198 "settings.account.headlinePassword": "Změnit heslo",
271 "settings.account.headlineProfile": "Aktualizovat profil", 199 "settings.account.headlineProfile": "Aktualizovat profil",
272 "settings.account.headlineSubscription": "Vaše předplatné",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Stáhnout",
276 "settings.account.manageSubscription.label": "Spravovat vaše předplatné",
277 "settings.account.successInfo": "Vaše změny byly uloženy", 200 "settings.account.successInfo": "Vaše změny byly uloženy",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Zkusit opět", 201 "settings.account.tryReloadServices": "Zkusit opět",
282 "settings.account.tryReloadUserInfoRequest": "Zkusit opět", 202 "settings.account.tryReloadUserInfoRequest": "Zkusit opět",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Nelze načíst informace o uživateli.", 203 "settings.account.userInfoRequestFailed": "Nelze načíst informace o uživateli.",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Zapnout kontrolu pravopisu", 227 "settings.app.form.enableSpellchecking": "Zapnout kontrolu pravopisu",
309 "settings.app.form.enableSystemTray": "Zobrazit Ferdi v systémové liště", 228 "settings.app.form.enableSystemTray": "Zobrazit Ferdi v systémové liště",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Nastavení", 259 "settings.app.headline": "Nastavení",
341 "settings.app.headlineAdvanced": "Pokročilé", 260 "settings.app.headlineAdvanced": "Pokročilé",
342 "settings.app.headlineAppearance": "Vzhled", 261 "settings.app.headlineAppearance": "Vzhled",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Změny vyžadují restart", 272 "settings.app.restartRequired": "Změny vyžadují restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Mezipaměť", 277 "settings.app.subheadlineCache": "Mezipaměť",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Dostupné služby", 301 "settings.recipes.headline": "Dostupné služby",
383 "settings.recipes.missingService": "Chybějící služba?", 302 "settings.recipes.missingService": "Chybějící služba?",
384 "settings.recipes.mostPopular": "Nejpopulárnější",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Služba byla úspěšně přidána", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Služba byla úspěšně přidána",
387 "settings.searchService": "Vyhledat službu", 305 "settings.searchService": "Vyhledat službu",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Přidat {name}", 309 "settings.service.form.addServiceHeadline": "Přidat {name}",
392 "settings.service.form.availableServices": "Dostupné služby", 310 "settings.service.form.availableServices": "Dostupné služby",
393 "settings.service.form.customUrl": "Vlastní server", 311 "settings.service.form.customUrl": "Vlastní server",
394 "settings.service.form.customUrlPremiumInfo": "Chcete-li přidat vlastní hostované služby, potřebujete účet Ferdi Premium Supporter.",
395 "settings.service.form.customUrlUpgradeAccount": "Aktualizujte svůj účet",
396 "settings.service.form.customUrlValidationError": "Nepodařilo se ověřit vlastní server {name}.", 312 "settings.service.form.customUrlValidationError": "Nepodařilo se ověřit vlastní server {name}.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Tým", 380 "settings.team.headline": "Tým",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Společnost", 385 "settings.user.form.accountType.company": "Společnost",
471 "settings.user.form.accountType.individual": "Jednotlivec", 386 "settings.user.form.accountType.individual": "Jednotlivec",
472 "settings.user.form.accountType.label": "Druh účtu", 387 "settings.user.form.accountType.label": "Druh účtu",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Již máte účet, přihlásit se?", 431 "signup.link.login": "Již máte účet, přihlásit se?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Vytvořit účet", 433 "signup.submit.label": "Vytvořit účet",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Zrušit",
531 "subscriptionPopup.buttonDone": "Dokončit",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Odstranit službu", 435 "tabs.item.deleteService": "Odstranit službu",
534 "tabs.item.disableAudio": "Vypnout zvuk", 436 "tabs.item.disableAudio": "Vypnout zvuk",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Zakázat upozornění", 438 "tabs.item.disableNotifications": "Zakázat upozornění",
536 "tabs.item.disableService": "Zakázat službu", 439 "tabs.item.disableService": "Zakázat službu",
537 "tabs.item.edit": "Upravit", 440 "tabs.item.edit": "Upravit",
538 "tabs.item.enableAudio": "Zapnout zvuk", 441 "tabs.item.enableAudio": "Zapnout zvuk",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Povolit upozornění", 443 "tabs.item.enableNotification": "Povolit upozornění",
540 "tabs.item.enableService": "Povolit službu", 444 "tabs.item.enableService": "Povolit službu",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Obnovit", 446 "tabs.item.reload": "Obnovit",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} není validní", 448 "validation.email": "{field} není validní",
543 "validation.minLength": "{field} musí být alespoň {length} znaků dlouhé", 449 "validation.minLength": "{field} musí být alespoň {length} znaků dlouhé",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/da.json b/src/i18n/locales/da.json
index 8fb2f2f9e..7ea135cb2 100644
--- a/src/i18n/locales/da.json
+++ b/src/i18n/locales/da.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Åh nej! Ferdi mistede forbindelsen til {name}.", 12 "connectionLostBanner.message": "Åh nej! Ferdi mistede forbindelsen til {name}.",
13 "feature.announcements.changelog.headline": "Ændringer i Ferdi {version}", 13 "feature.announcements.changelog.headline": "Ændringer i Ferdi {version}",
14 "feature.debugger.title": "Udgiv fejlfindingsoplysninger", 14 "feature.debugger.title": "Udgiv fejlfindingsoplysninger",
15 "feature.delayApp.headline": "Køb en Ferdi Supporter licens for at slippe for at vente",
16 "feature.delayApp.text": "Ferdi vil fortsætte om {seconds} sekunder.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Få en Ferdi Supporter licens",
21 "feature.delayApp.upgrade.actionShort": "Opgradér konto",
22 "feature.nightlyBuilds.activate": "Aktiver", 15 "feature.nightlyBuilds.activate": "Aktiver",
23 "feature.nightlyBuilds.cancel": "Annuller", 16 "feature.nightlyBuilds.cancel": "Annuller",
24 "feature.nightlyBuilds.info": "Natlige byg af Ferdi er meget eksperimentelle versioner, der kan indeholde ikke polerede eller ufærdige funktioner. Disse natlige byg bruges hovedsageligt af udviklere til at teste deres nyudviklede funktioner, og hvordan de vil opføre sig i den endelige version. Hvis du er usikker, foreslår vi ikke at aktivere natlige byg.", 17 "feature.nightlyBuilds.info": "Natlige byg af Ferdi er meget eksperimentelle versioner, der kan indeholde ikke polerede eller ufærdige funktioner. Disse natlige byg bruges hovedsageligt af udviklere til at teste deres nyudviklede funktioner, og hvordan de vil opføre sig i den endelige version. Hvis du er usikker, foreslår vi ikke at aktivere natlige byg.",
25 "feature.nightlyBuilds.title": "Natlige byg", 18 "feature.nightlyBuilds.title": "Natlige byg",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Der opstod en fejl under forsøg på at udgive fejlfindingsoplysningerne. Prøv igen senere, eller se konsollen for mere information.", 19 "feature.publishDebugInfo.error": "Der opstod en fejl under forsøg på at udgive fejlfindingsoplysningerne. Prøv igen senere, eller se konsollen for mere information.",
43 "feature.publishDebugInfo.info": "At udgive dine fejlfindingsoplysninger hjælper os med at finde problemer og fejl i Ferdi. Ved at udgive dine fejlfindingsoplysninger accepterer du Ferdi Debugger's privatlivspolitik og servicevilkår", 20 "feature.publishDebugInfo.info": "At udgive dine fejlfindingsoplysninger hjælper os med at finde problemer og fejl i Ferdi. Ved at udgive dine fejlfindingsoplysninger accepterer du Ferdi Debugger's privatlivspolitik og servicevilkår",
44 "feature.publishDebugInfo.privacy": "Privatlivspolitik", 21 "feature.publishDebugInfo.privacy": "Privatlivspolitik",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Vælg en tjeneste med TAB, ↑ og ↓. Åbn en tjeneste med ENTER.", 26 "feature.quickSwitch.info": "Vælg en tjeneste med TAB, ↑ og ↓. Åbn en tjeneste med ENTER.",
50 "feature.quickSwitch.search": "Søg...", 27 "feature.quickSwitch.search": "Søg...",
51 "feature.quickSwitch.title": "Hurtigskift", 28 "feature.quickSwitch.title": "Hurtigskift",
52 "feature.serviceLimit.limitReached": "Du har tilføjet {amount} ud af de {limit} tjenester, der er inkluderet i dit abonnement. Opgrader venligst din konto for at tilføje flere tjenester.",
53 "feature.shareFranz.action.email": "Send som mail", 29 "feature.shareFranz.action.email": "Send som mail",
54 "feature.shareFranz.action.facebook": "Del på Facebook", 30 "feature.shareFranz.action.facebook": "Del på Facebook",
55 "feature.shareFranz.action.twitter": "Del på Twitter", 31 "feature.shareFranz.action.twitter": "Del på Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Jeg har tilføjet {count} tjenester til Ferdi! Få den gratis app til WhatsApp, Messenger, Slack, Skype osv. på www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Jeg har tilføjet {count} tjenester til Ferdi! Få den gratis app til WhatsApp, Messenger, Slack, Skype osv. på www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Jeg har tilføjet {count} tjenester til Ferdi! Få den gratis app til WhatsApp, Messenger, Slack, Skype osv. på www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Jeg har tilføjet {count} tjenester til Ferdi! Få den gratis app til WhatsApp, Messenger, Slack, Skype osv. på www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Fortæl dine venner og kolleger, hvor fedt et program Ferdi er, og hjælp os med at sprede ordet.", 35 "feature.shareFranz.text": "Fortæl dine venner og kolleger, hvor fedt et program Ferdi er, og hjælp os med at sprede ordet.",
60 "feature.todos.premium.info": "Ferdi Todos er tilgængelig for betalende brugere nu!",
61 "feature.todos.premium.rollout": "Alle andre må vente lidt længere.",
62 "feature.todos.premium.upgrade": "Opgrader konto",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Kan ikke oprette forbindelse til Ferdi onlinetjenester", 36 "global.api.unhealthy": "Kan ikke oprette forbindelse til Ferdi onlinetjenester",
71 "global.franzProRequired": "Ferdi Professionel påkrævet",
72 "global.notConnectedToTheInternet": "Du har ikke forbindelse til internettet.", 37 "global.notConnectedToTheInternet": "Du har ikke forbindelse til internettet.",
73 "global.spellchecker.useDefault": "Benyt systemstandard ({default})", 38 "global.spellchecker.useDefault": "Benyt systemstandard ({default})",
74 "global.spellchecking.autodetect": "Vælg sprog automatisk", 39 "global.spellchecking.autodetect": "Vælg sprog automatisk",
75 "global.spellchecking.autodetect.short": "Automatisk", 40 "global.spellchecking.autodetect.short": "Automatisk",
76 "global.spellchecking.language": "Stavekontrolsprog", 41 "global.spellchecking.language": "Stavekontrolsprog",
77 "global.upgradeButton.upgradeToPro": "Opgrader til Ferdi Professionel",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importer dine Ferdi 4-tjenester", 44 "import.headline": "Importer dine Ferdi 4-tjenester",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Skjul", 52 "infobar.hide": "Skjul",
89 "infobar.requiredRequestsFailed": "Kunne ikke indlæse tjenester og brugerinformation", 53 "infobar.requiredRequestsFailed": "Kunne ikke indlæse tjenester og brugerinformation",
90 "infobar.servicesUpdated": "Dine tjenester er blevet opdateret.", 54 "infobar.servicesUpdated": "Dine tjenester er blevet opdateret.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "En ny opdatering til Ferdi er tilgængelig.", 55 "infobar.updateAvailable": "En ny opdatering til Ferdi er tilgængelig.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Mailadresse", 57 "invite.email.label": "Mailadresse",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-skjul menulinje", 87 "menu.app.autohideMenuBar": "Auto-skjul menulinje",
125 "menu.app.checkForUpdates": "Søg efter opdateringer", 88 "menu.app.checkForUpdates": "Søg efter opdateringer",
126 "menu.app.hide": "Skjul", 89 "menu.app.hide": "Skjul",
127 "menu.app.hideOthers": "Skjul andre", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Afslut", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Indstillinger", 92 "menu.app.settings": "Indstillinger",
130 "menu.app.unhide": "Vis", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Rediger", 94 "menu.edit": "Rediger",
132 "menu.edit.copy": "Kopier", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Klip", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Slet", 97 "menu.edit.delete": "Slet",
135 "menu.edit.emojiSymbols": "Emojis og symboler", 98 "menu.edit.emojiSymbols": "Emojis og symboler",
136 "menu.edit.findInPage": "Find på side", 99 "menu.edit.findInPage": "Find på side",
137 "menu.edit.paste": "Indsæt", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Indsæt uden formatering", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Gendan", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "lg alle", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Tale", 104 "menu.edit.speech": "Tale",
142 "menu.edit.startDictation": "Start diktering", 105 "menu.edit.startDictation": "Start diktering",
143 "menu.edit.startSpeaking": "Start oplæsning", 106 "menu.edit.startSpeaking": "Start oplæsning",
144 "menu.edit.stopSpeaking": "Stop oplæsning", 107 "menu.edit.stopSpeaking": "Stop oplæsning",
145 "menu.edit.undo": "Fortryd", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Fil", 109 "menu.file": "Fil",
147 "menu.help": "Hlp", 110 "menu.help": "Help",
148 "menu.help.changelog": "Ændringslog", 111 "menu.help.changelog": "Ændringslog",
149 "menu.help.debugInfo": "Kopier fejlfindingsoplysninger", 112 "menu.help.debugInfo": "Kopier fejlfindingsoplysninger",
150 "menu.help.debugInfoCopiedBody": "Dine fejlfindingsoplysninger er blevet kopieret til udklipsholderen.", 113 "menu.help.debugInfoCopiedBody": "Dine fejlfindingsoplysninger er blevet kopieret til udklipsholderen.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi fejlfindingsoplysninger", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi fejlfindingsoplysninger",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Få mere at vide", 116 "menu.help.learnMore": "Få mere at vide",
153 "menu.help.privacy": "Privatlivspolitik", 117 "menu.help.privacy": "Privatlivspolitik",
154 "menu.help.publishDebugInfo": "Udgiv fejlfindingsoplysninger", 118 "menu.help.publishDebugInfo": "Udgiv fejlfindingsoplysninger",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Aktiver Todos", 127 "menu.todos.enableTodos": "Aktiver Todos",
164 "menu.view": "Vis", 128 "menu.view": "Vis",
165 "menu.view.back": "Tilbage", 129 "menu.view.back": "Tilbage",
166 "menu.view.enterFullScreen": "Start fuld skærm",
167 "menu.view.exitFullScreen": "Afslut fuld skærm",
168 "menu.view.forward": "Fremad", 130 "menu.view.forward": "Fremad",
169 "menu.view.lockFerdi": "Lås Ferdi", 131 "menu.view.lockFerdi": "Lås Ferdi",
170 "menu.view.openQuickSwitch": "Åben hurtig skift", 132 "menu.view.openQuickSwitch": "Åben hurtig skift",
171 "menu.view.reloadFranz": "Genindlæs Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Genindlæs tjeneste", 134 "menu.view.reloadService": "Genindlæs tjeneste",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Faktisk størrelse", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Slå mørk tilstand til/fra", 137 "menu.view.toggleDarkMode": "Slå mørk tilstand til/fra",
176 "menu.view.toggleDevTools": "Åbn/luk udviklerværktøjer", 138 "menu.view.toggleDevTools": "Åbn/luk udviklerværktøjer",
177 "menu.view.toggleFullScreen": "Aktiver/deaktiver fuld skærm", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Åbn/luk udviklerværktøjer for tjeneste", 140 "menu.view.toggleServiceDevTools": "Åbn/luk udviklerværktøjer for tjeneste",
179 "menu.view.toggleTodosDevTools": "Åbn/luk udviklerværktøjer for Todos", 141 "menu.view.toggleTodosDevTools": "Åbn/luk udviklerværktøjer for Todos",
180 "menu.view.zoomIn": "Zoom ind", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Zoom ud", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Vindue", 144 "menu.window": "Window",
183 "menu.window.close": "Luk", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimer", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Arbejdsrum", 147 "menu.workspaces": "Arbejdsrum",
186 "menu.workspaces.addNewWorkspace": "Tilføj nyt arbejdsrum...", 148 "menu.workspaces.addNewWorkspace": "Tilføj nyt arbejdsrum...",
187 "menu.workspaces.closeWorkspaceDrawer": "Luk arbejdsrumspanel", 149 "menu.workspaces.closeWorkspaceDrawer": "Luk arbejdsrumspanel",
@@ -194,11 +156,7 @@
194 "password.noUser": "Der blev ikke fundet nogen bruger med den mailadresse", 156 "password.noUser": "Der blev ikke fundet nogen bruger med den mailadresse",
195 "password.submit.label": "Send", 157 "password.submit.label": "Send",
196 "password.successInfo": "Tjek venligst din mail", 158 "password.successInfo": "Tjek venligst din mail",
197 "premiumFeature.button.upgradeAccount": "Opgradér konto",
198 "pricing.features.accountSync": "Kontosynkronisering", 159 "pricing.features.accountSync": "Kontosynkronisering",
199 "pricing.features.adFree": "Reklamefri, altid",
200 "pricing.features.appDelays": "Ingen venteskærme",
201 "pricing.features.appDelaysEnabled": "Lejlighedsvise venteskærme",
202 "pricing.features.customWebsites": "Tilføj brugerdefinerede hjemmesider", 160 "pricing.features.customWebsites": "Tilføj brugerdefinerede hjemmesider",
203 "pricing.features.desktopNotifications": "Skrivebordsnotifikationer", 161 "pricing.features.desktopNotifications": "Skrivebordsnotifikationer",
204 "pricing.features.onPremise": "Lokale- & andre hostede tjenester", 162 "pricing.features.onPremise": "Lokale- & andre hostede tjenester",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Teamhåndtering", 166 "pricing.features.teamManagement": "Teamhåndtering",
209 "pricing.features.thirdPartyServices": "Installer tredjeparts tjenester", 167 "pricing.features.thirdPartyServices": "Installer tredjeparts tjenester",
210 "pricing.features.unlimitedServices": "Tilføj ubegrænsede tjenester", 168 "pricing.features.unlimitedServices": "Tilføj ubegrænsede tjenester",
211 "pricing.features.upToSixServices": "Tilføj op til 6 tjenester",
212 "pricing.features.upToThreeServices": "Tilføj op til 3 tjenester",
213 "pricing.features.workspaces": "Arbejdsrum", 169 "pricing.features.workspaces": "Arbejdsrum",
214 "pricing.plan.free": "Gratis Ferdi",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personlig",
217 "pricing.plan.personal-monthly": "Ferdi Personlig Månedlig",
218 "pricing.plan.personal-yearly": "Ferdi Personlig Årlig",
219 "pricing.plan.pro": "Ferdi Professionel",
220 "pricing.plan.pro-monthly": "Ferdi Professionel månedligt",
221 "pricing.plan.pro-yearly": "Ferdi Professionel arligt",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Genindlæs {name}", 170 "service.crashHandler.action": "Genindlæs {name}",
236 "service.crashHandler.autoReload": "Forsøger automatisk at gendanne {name} om {seconds} sekunder", 171 "service.crashHandler.autoReload": "Forsøger automatisk at gendanne {name} om {seconds} sekunder",
237 "service.crashHandler.headline": "Åh nej!", 172 "service.crashHandler.headline": "Åh nej!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Åh nej!", 178 "service.errorHandler.headline": "Åh nej!",
244 "service.errorHandler.message": "Fejl", 179 "service.errorHandler.message": "Fejl",
245 "service.errorHandler.text": "{name} blev ikke indlæst.", 180 "service.errorHandler.text": "{name} blev ikke indlæst.",
246 "service.restrictedHandler.action": "Opgrader konto",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professionel planen påkrævet",
248 "service.restrictedHandler.customUrl.text": "Opgrader venligst til Ferdi Professionel planen for at bruge egne hjemmesideadresser og selvhostede tjenester.",
249 "service.restrictedHandler.serviceLimit.headline": "Du har nået din tjenestegrænse.",
250 "service.restrictedHandler.serviceLimit.text": "Opgrader din konto for at bruge mere end {count} tjenester.",
251 "service.webviewLoader.loading": "Indlæser {service}", 181 "service.webviewLoader.loading": "Indlæser {service}",
252 "services.getStarted": "Kom godt i gang", 182 "services.getStarted": "Kom godt i gang",
253 "services.login": "Log ind for at bruge Ferdi.", 183 "services.login": "Log ind for at bruge Ferdi.",
254 "services.serverInfo": "Alternativt kan du ændre din Ferdi server ved at klikke på tandhjulet i nederste venstre hjørne.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Brug Ferdi uden en konto", 185 "services.serverless": "Brug Ferdi uden en konto",
256 "services.welcome": "Velkommen til Ferdi", 186 "services.welcome": "Velkommen til Ferdi",
257 "settings.account.account.editButton": "Rediger konto", 187 "settings.account.account.editButton": "Rediger konto",
258 "settings.account.accountType.basic": "Normal konto",
259 "settings.account.accountType.premium": "Premium Supporter konto",
260 "settings.account.accountUnavailable": "Konto utilgængelig", 188 "settings.account.accountUnavailable": "Konto utilgængelig",
261 "settings.account.accountUnavailableInfo": "Du bruger Ferdi uden en konto. Hvis du ønsker at bruge Ferdi med en konto og holde dine tjenester synkroniseret på tværs af enheder, vælg en server under fanen Indstillinger, og log derefter ind.", 189 "settings.account.accountUnavailableInfo": "Du bruger Ferdi uden en konto. Hvis du ønsker at bruge Ferdi med en konto og holde dine tjenester synkroniseret på tværs af enheder, vælg en server under fanen Indstillinger, og log derefter ind.",
262 "settings.account.buttonSave": "Opdater profil", 190 "settings.account.buttonSave": "Opdater profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Fakturaer", 197 "settings.account.headlineInvoices": "Fakturaer",
270 "settings.account.headlinePassword": "Skift adgangskode", 198 "settings.account.headlinePassword": "Skift adgangskode",
271 "settings.account.headlineProfile": "Opdater profil", 199 "settings.account.headlineProfile": "Opdater profil",
272 "settings.account.headlineSubscription": "Dit abonnement",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Opgrader din konto og få den fulde oplevelse",
275 "settings.account.invoiceDownload": "Hent",
276 "settings.account.manageSubscription.label": "Administrer dit abonnement",
277 "settings.account.successInfo": "Dine ændringer er blevet gemt", 200 "settings.account.successInfo": "Dine ændringer er blevet gemt",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Prøv igen", 201 "settings.account.tryReloadServices": "Prøv igen",
282 "settings.account.tryReloadUserInfoRequest": "Prøv igen", 202 "settings.account.tryReloadUserInfoRequest": "Prøv igen",
283 "settings.account.upgradeToPro.label": "Opgrader til Ferdi Professionel",
284 "settings.account.userInfoRequestFailed": "Kunne ikke indlæse brugerinformation", 203 "settings.account.userInfoRequestFailed": "Kunne ikke indlæse brugerinformation",
285 "settings.account.yourLicense": "Din Ferdi-licens", 204 "settings.account.yourLicense": "Din Ferdi-licens",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Aktiver stavekontrol", 227 "settings.app.form.enableSpellchecking": "Aktiver stavekontrol",
309 "settings.app.form.enableSystemTray": "Vis Ferdi i systembakken", 228 "settings.app.form.enableSystemTray": "Vis Ferdi i systembakken",
310 "settings.app.form.enableTodos": "Aktiver Ferdi Todos", 229 "settings.app.form.enableTodos": "Aktiver Ferdi Todos",
311 "settings.app.form.hibernate": "Tillad tjenester at gå i dvale",
312 "settings.app.form.hibernateOnStartup": "Sæt tjenester i dvale ved opstart", 230 "settings.app.form.hibernateOnStartup": "Sæt tjenester i dvale ved opstart",
313 "settings.app.form.hibernationStrategy": "Dvale strategi", 231 "settings.app.form.hibernationStrategy": "Dvale strategi",
314 "settings.app.form.iconSize": "Ikonstørrelse for tjenester", 232 "settings.app.form.iconSize": "Ikonstørrelse for tjenester",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Aktiver universel mørk tilstand", 255 "settings.app.form.universalDarkMode": "Aktiver universel mørk tilstand",
338 "settings.app.form.useTouchIdToUnlock": "Tillad brug af TouchID for at låse Ferdi op", 256 "settings.app.form.useTouchIdToUnlock": "Tillad brug af TouchID for at låse Ferdi op",
339 "settings.app.form.useVerticalStyle": "Brug lodret stil", 257 "settings.app.form.useVerticalStyle": "Brug lodret stil",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Indstillinger", 259 "settings.app.headline": "Indstillinger",
341 "settings.app.headlineAdvanced": "Avanceret", 260 "settings.app.headlineAdvanced": "Avanceret",
342 "settings.app.headlineAppearance": "Udseende", 261 "settings.app.headlineAppearance": "Udseende",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "Som standard vil Ferdi holde alle dine tjenester åbne og indlæste i baggrunden, så de er klar, når du vil bruge dem. Du kan vælge at sætte dine tjenester i dvale efter en angivet mængde tid. Dette er nyttigt til at spare hukommelse eller forhindre tjenester i at bremse din computer.", 266 "settings.app.hibernateInfo": "Som standard vil Ferdi holde alle dine tjenester åbne og indlæste i baggrunden, så de er klar, når du vil bruge dem. Du kan vælge at sætte dine tjenester i dvale efter en angivet mængde tid. Dette er nyttigt til at spare hukommelse eller forhindre tjenester i at bremse din computer.",
348 "settings.app.inactivityLockInfo": "Minutter af inaktivitet, hvorefter Ferdi automatisk skal låse. Brug 0 for at deaktivere", 267 "settings.app.inactivityLockInfo": "Minutter af inaktivitet, hvorefter Ferdi automatisk skal låse. Brug 0 for at deaktivere",
349 "settings.app.languageDisclaimer": "Officielle oversættelser er engelske og tyske. Alle andre sprog er fællesskabsstyrede oversættelser.", 268 "settings.app.languageDisclaimer": "Officielle oversættelser er engelske og tyske. Alle andre sprog er fællesskabsstyrede oversættelser.",
350 "settings.app.lockInfo": "Adgangskode-lås giver dig mulighed for at holde dine beskeder beskyttet.\nVed brug af adgangskode-lås vil du blive bedt om at indtaste din adgangskode, hver gang du starter Ferdi eller låser Ferdi selv ved hjælp af låsesymbolet i nederste venstre hjørne eller genvejen CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Adgangskode", 270 "settings.app.lockedPassword": "Adgangskode",
352 "settings.app.lockedPasswordInfo": "Sørg for at angive en adgangskode, du husker.\nHvis du mister denne adgangskode, vil du blive nødt til at geninstallere Ferdi.", 271 "settings.app.lockedPasswordInfo": "Sørg for at angive en adgangskode, du husker.\nHvis du mister denne adgangskode, vil du blive nødt til at geninstallere Ferdi.",
353 "settings.app.restartRequired": "Ændringer kræver genstart", 272 "settings.app.restartRequired": "Ændringer kræver genstart",
354 "settings.app.scheduledDNDInfo": "Planlagt Forstyr ikke giver dig mulighed for at definere et tidsrum, hvor du ikke ønsker at få meddelelser fra Ferdi.", 273 "settings.app.scheduledDNDInfo": "Planlagt Forstyr ikke giver dig mulighed for at definere et tidsrum, hvor du ikke ønsker at få meddelelser fra Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Tider er i 24-timer format. Sluttidspunktet kan være før starttidspunktet (f.eks. fra 17:00 til 09:00) for at aktivere Forstyr ikke natten over.", 274 "settings.app.scheduledDNDTimeInfo": "Tider er i 24-timer format. Sluttidspunktet kan være før starttidspunktet (f.eks. fra 17:00 til 09:00) for at aktivere Forstyr ikke natten over.",
356 "settings.app.sentryInfo": "At sende telemetri data hjælper os med at finde fejl i Ferdi - vi vil ikke sende nogen personlige oplysninger så som dine besked data! Ændring af denne indstilling kræver, at du genstarter Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi bruger din Macs indbyggede stavekontrol. Hvis du ønsker at ændre de sprog, stavekontrollen kontrollerer for, kan du gøre det i din Macs systemindstillinger.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi bruger din Macs indbyggede stavekontrol. Hvis du ønsker at ændre de sprog, stavekontrollen kontrollerer for, kan du gøre det i din Macs systemindstillinger.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "Denne server vil blive brugt til funktionen \"Ferdi Todo\".", 278 "settings.app.todoServerInfo": "Denne server vil blive brugt til funktionen \"Ferdi Todo\".",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Åbn mappe", 300 "settings.recipes.customService.openFolder": "Åbn mappe",
382 "settings.recipes.headline": "Tilgængelige tjenester", 301 "settings.recipes.headline": "Tilgængelige tjenester",
383 "settings.recipes.missingService": "Mangler du en service?", 302 "settings.recipes.missingService": "Mangler du en service?",
384 "settings.recipes.mostPopular": "Mest populære",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Tjenesten blev tilføjet", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Tjenesten blev tilføjet",
387 "settings.searchService": "Søg tjeneste", 305 "settings.searchService": "Søg tjeneste",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Tilføj {name}", 309 "settings.service.form.addServiceHeadline": "Tilføj {name}",
392 "settings.service.form.availableServices": "Tilgængelige tjenester", 310 "settings.service.form.availableServices": "Tilgængelige tjenester",
393 "settings.service.form.customUrl": "Brugerdefineret server", 311 "settings.service.form.customUrl": "Brugerdefineret server",
394 "settings.service.form.customUrlPremiumInfo": "For at tilføje selvhostede tjenester, skal du bruge en Ferdi Premium Supporter konto.",
395 "settings.service.form.customUrlUpgradeAccount": "Opgrader din konto",
396 "settings.service.form.customUrlValidationError": "Kunne ikke validere brugerdefineret {name} server.", 312 "settings.service.form.customUrlValidationError": "Kunne ikke validere brugerdefineret {name} server.",
397 "settings.service.form.darkReaderBrightness": "Mørk læser lysstyrke", 313 "settings.service.form.darkReaderBrightness": "Mørk læser lysstyrke",
398 "settings.service.form.darkReaderContrast": "Mørk læser kontrast", 314 "settings.service.form.darkReaderContrast": "Mørk læser kontrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Teamstyring", 378 "settings.team.contentHeadline": "Franz Teamstyring",
463 "settings.team.copy": "Franz's teamstyring giver dig mulighed for at administrere Franz abonnementer for flere brugere. Husk på, at hvis du har et Franz Premium-abonnement, får du ingen fordele ved at bruge Ferdi: Den eneste grund til, at du stadig har adgang til teamstyring er, at du kan administrere dine gamle Franz Teams, og så du ikke mister nogen funktionalitet i forvaltningen af din konto.", 379 "settings.team.copy": "Franz's teamstyring giver dig mulighed for at administrere Franz abonnementer for flere brugere. Husk på, at hvis du har et Franz Premium-abonnement, får du ingen fordele ved at bruge Ferdi: Den eneste grund til, at du stadig har adgang til teamstyring er, at du kan administrere dine gamle Franz Teams, og så du ikke mister nogen funktionalitet i forvaltningen af din konto.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Du bruger i øjeblikket Franz Servere, og derfor har du adgang til Teamstyring.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Administrer dit Team på meetfranz.com", 382 "settings.team.manageAction": "Administrer dit Team på meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams er ikke tilgængelige", 383 "settings.team.teamsUnavailable": "Teams er ikke tilgængelige",
468 "settings.team.teamsUnavailableInfo": "Teams er i øjeblikket kun tilgængelige, når du bruger Franz Servere og efter at have betalt for Franz Professionel. Skift venligst din server til https://api.franzinfra.com for at bruge teams.", 384 "settings.team.teamsUnavailableInfo": "Teams er i øjeblikket kun tilgængelige, når du bruger Franz Servere og efter at have betalt for Franz Professionel. Skift venligst din server til https://api.franzinfra.com for at bruge teams.",
469 "settings.team.upgradeAction": "Opgrader din konto",
470 "settings.user.form.accountType.company": "Virksomhed", 385 "settings.user.form.accountType.company": "Virksomhed",
471 "settings.user.form.accountType.individual": "Individuel", 386 "settings.user.form.accountType.individual": "Individuel",
472 "settings.user.form.accountType.label": "Kontotype", 387 "settings.user.form.accountType.label": "Kontotype",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Har du allerede en konto? Log ind.", 431 "signup.link.login": "Har du allerede en konto? Log ind.",
517 "signup.password.label": "Adgangskode", 432 "signup.password.label": "Adgangskode",
518 "signup.submit.label": "Opret konto", 433 "signup.submit.label": "Opret konto",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Se alle valgmuligheder",
522 "subscription.cta.choosePlan": "Vælg dit abonnement",
523 "subscription.includedProFeatures": "Ferdi Professionel planen omfatter:",
524 "subscription.interval.per": "pr. {interval}",
525 "subscription.interval.perMonth": "pr. måned",
526 "subscription.interval.perMonthPerUser": "pr. måned og bruger",
527 "subscription.planItem.upgradeAccount": "Opgrader konto",
528 "subscription.teaser.includedFeatures": "Betalte Ferdi planer omfatter:",
529 "subscription.teaser.intro": "Ferdi 5 kommer med et stort udvalg af nye funktioner til give din daglige kommunikation et løft. Tjek vores nye planer og find ud af, hvilken der passer dig mest!",
530 "subscriptionPopup.buttonCancel": "Annuller",
531 "subscriptionPopup.buttonDone": "Udført",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Slet tjeneste", 435 "tabs.item.deleteService": "Slet tjeneste",
534 "tabs.item.disableAudio": "Deaktiver lyd", 436 "tabs.item.disableAudio": "Deaktiver lyd",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Deaktiver notifikationer", 438 "tabs.item.disableNotifications": "Deaktiver notifikationer",
536 "tabs.item.disableService": "Deaktiver tjeneste", 439 "tabs.item.disableService": "Deaktiver tjeneste",
537 "tabs.item.edit": "Rediger", 440 "tabs.item.edit": "Rediger",
538 "tabs.item.enableAudio": "Aktiver lyd", 441 "tabs.item.enableAudio": "Aktiver lyd",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Aktiver notifikationer", 443 "tabs.item.enableNotification": "Aktiver notifikationer",
540 "tabs.item.enableService": "Aktiverede tjenester", 444 "tabs.item.enableService": "Aktiverede tjenester",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Genindlæs", 446 "tabs.item.reload": "Genindlæs",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} er ugyldigt", 448 "validation.email": "{field} er ugyldigt",
543 "validation.minLength": "{field} skal være på mindst {length} tegn", 449 "validation.minLength": "{field} skal være på mindst {length} tegn",
544 "validation.oneRequired": "Mindst én er påkrævet", 450 "validation.oneRequired": "Mindst én er påkrævet",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Arbejdsrum", 462 "workspaceDrawer.headline": "Arbejdsrum",
557 "workspaceDrawer.item.contextMenuEdit": "rediger", 463 "workspaceDrawer.item.contextMenuEdit": "rediger",
558 "workspaceDrawer.item.noServicesAddedYet": "Ingen tjenester tilføjet endnu", 464 "workspaceDrawer.item.noServicesAddedYet": "Ingen tjenester tilføjet endnu",
559 "workspaceDrawer.premiumCtaButtonLabel": "Opret dit første arbejdsrum",
560 "workspaceDrawer.proFeatureBadge": "Premium-funktion",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Genaktiver premium konto",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Arbejdsrum lader dig fokusere på, hvad der er vigtigt lige nu. Konfigurer forskellige sæt af tjenester og skift nemt mellem dem til enhver tid.</p>\n<p>Du bestemmer hvilke tjenester du har brug for hvor og hvornår, så vi kan hjælpe dig med at holde dig på toppen - eller nemt lukke ned for arbejdet, når du vil.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Arbejdsrum lader dig fokusere på, hvad der er vigtigt lige nu. Konfigurer forskellige sæt af tjenester og skift nemt mellem dem til enhver tid.</p>\n<p>Du bestemmer hvilke tjenester du har brug for hvor og hvornår, så vi kan hjælpe dig med at holde dig på toppen - eller nemt lukke ned for arbejdet, når du vil.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Rediger indstillinger for arbejdsrum", 466 "workspaceDrawer.workspacesSettingsTooltip": "Rediger indstillinger for arbejdsrum",
564 "workspaces.switchingIndicator.switchingTo": "Skifter til" 467 "workspaces.switchingIndicator.switchingTo": "Skifter til"
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index 6f76f74ea..eef9aa21a 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh nein! Ferdi hat die Verbindung zu {name} verloren.", 12 "connectionLostBanner.message": "Oh nein! Ferdi hat die Verbindung zu {name} verloren.",
13 "feature.announcements.changelog.headline": "Was ist neu in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Was ist neu in Ferdi {version}",
14 "feature.debugger.title": "Debug-Informationen veröffentlichen", 14 "feature.debugger.title": "Debug-Informationen veröffentlichen",
15 "feature.delayApp.headline": "Bitte kaufe eine Ferdi Supporter Lizenz, um das Warten zu überspringen",
16 "feature.delayApp.text": "In {seconds} Sekunden geht's weiter!",
17 "feature.delayApp.trial.action": "Ja, ich möchte Ferdi Professional 14 Tage gratis testen",
18 "feature.delayApp.trial.actionShort": "Aktiviere die kostenlose Ferdi Professional Testlizenz",
19 "feature.delayApp.trial.headline": "Hol dir die kostenlose Ferdi Professional Testlizenz und es geht ohne Warten weiter",
20 "feature.delayApp.upgrade.action": "Hol dir Ferdi Premium",
21 "feature.delayApp.upgrade.actionShort": "Account erweitern",
22 "feature.nightlyBuilds.activate": "Aktivieren", 15 "feature.nightlyBuilds.activate": "Aktivieren",
23 "feature.nightlyBuilds.cancel": "Abbrechen", 16 "feature.nightlyBuilds.cancel": "Abbrechen",
24 "feature.nightlyBuilds.info": "Nightly builds sind experimentelle Versionen von Ferdi die unfertige Funktionen enthalten kann. Nightly builds werden hauptsächlich von Entwicklern genutzt um neu entwickelte Features zu testen und zu sehen wie sie sich in der finalen Version verhalten. Wenn du nicht genau weisst was du tust, empfehlen wir dir Nightly Builds nicht zu aktivieren.", 17 "feature.nightlyBuilds.info": "Nightly builds sind experimentelle Versionen von Ferdi die unfertige Funktionen enthalten kann. Nightly builds werden hauptsächlich von Entwicklern genutzt um neu entwickelte Features zu testen und zu sehen wie sie sich in der finalen Version verhalten. Wenn du nicht genau weisst was du tust, empfehlen wir dir Nightly Builds nicht zu aktivieren.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Auf kostenlosen Plan herunterstufen",
27 "feature.planSelection.cta.stayOnFree": "Auf kostenlosem Plan bleiben",
28 "feature.planSelection.cta.trial": "Starte meine 14-Tage Testversion",
29 "feature.planSelection.cta.upgradePersonal": "Personal Plan wählen",
30 "feature.planSelection.cta.upgradePro": "Professional Plan wählen",
31 "feature.planSelection.free.text": "Einfache Funktionalität",
32 "feature.planSelection.fullFeatureList": "Kompletter Vergleich aller Pläne",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Auf kostenlosen Plan herunterstufen",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Personal Plan wählen",
35 "feature.planSelection.fullscreen.dialog.message": "Du bist dabei, auf ein kostenloses Konto herunterzustufen. Bist du sicher? Klicke stattdessen hier, um mehr Dienste und Funktionen für nur {currency}{price} pro Monat zu erhalten.",
36 "feature.planSelection.fullscreen.dialog.title": "Deinen Ferdi Plan herunterstufen",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Bist du bereit zu wählen, {name}",
39 "feature.planSelection.personal.text": "Weitere Dienste, keine Wartezeiten - ideal für den persönlichen Gebrauch.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Beim Veröffentlichen der Debug-Informationen ist ein Fehler aufgetreten. Bitte versuche es später noch einmal oder sehe dir die Konsole für weitere Informationen an.", 19 "feature.publishDebugInfo.error": "Beim Veröffentlichen der Debug-Informationen ist ein Fehler aufgetreten. Bitte versuche es später noch einmal oder sehe dir die Konsole für weitere Informationen an.",
43 "feature.publishDebugInfo.info": "Die Veröffentlichung deiner Debug-Informationen hilft uns, Probleme und Fehler in Ferdi zu finden. Indem du deine Debug-Informationen veröffentlichst, akzeptierst du die Datenschutzbestimmungen und Nutzungsbedingungen vom Ferdi Debugger", 20 "feature.publishDebugInfo.info": "Die Veröffentlichung deiner Debug-Informationen hilft uns, Probleme und Fehler in Ferdi zu finden. Indem du deine Debug-Informationen veröffentlichst, akzeptierst du die Datenschutzbestimmungen und Nutzungsbedingungen vom Ferdi Debugger",
44 "feature.publishDebugInfo.privacy": "Datenschutzrichtlinien", 21 "feature.publishDebugInfo.privacy": "Datenschutzrichtlinien",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Wähle einen Service mit TAB, ↑ und ↓. Um einen Service zu öffnen, drücke ENTER.", 26 "feature.quickSwitch.info": "Wähle einen Service mit TAB, ↑ und ↓. Um einen Service zu öffnen, drücke ENTER.",
50 "feature.quickSwitch.search": "Suchen...", 27 "feature.quickSwitch.search": "Suchen...",
51 "feature.quickSwitch.title": "Schnellauswahl", 28 "feature.quickSwitch.title": "Schnellauswahl",
52 "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.",
53 "feature.shareFranz.action.email": "Als E-Mail senden", 29 "feature.shareFranz.action.email": "Als E-Mail senden",
54 "feature.shareFranz.action.facebook": "Auf Facebook teilen", 30 "feature.shareFranz.action.facebook": "Auf Facebook teilen",
55 "feature.shareFranz.action.twitter": "Auf Twitter teilen", 31 "feature.shareFranz.action.twitter": "Auf Twitter teilen",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Ich habe {count} Services zu Ferdi hinzugefügt! Hol dir jetzt die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Ich habe {count} Services zu Ferdi hinzugefügt! Hol dir jetzt die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Ich habe {count} Services zu Ferdi hinzugefügt! Hol dir die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Ich habe {count} Services zu Ferdi hinzugefügt! Hol dir die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Bitte erzähle deinen Freunden und Kolleginnen, warum du Ferdi toll findest.", 35 "feature.shareFranz.text": "Bitte erzähle deinen Freunden und Kolleginnen, warum du Ferdi toll findest.",
60 "feature.todos.premium.info": "Ferdi Todos sind jetzt für Premium User verfügbar!",
61 "feature.todos.premium.rollout": "Alle anderen müssen sich noch ein wenig gedulden.",
62 "feature.todos.premium.upgrade": "Account Upgrade",
63 "feature.trialStatusBar.cta": "Jetzt upgraden",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Auf kostenlosen Plan herunterstufen",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Personal Plan wählen",
67 "feature.trialStatusBar.fullscreen.dialog.message": "Du bist dabei, auf ein kostenloses Konto herunterzustufen. Bist du sicher? Klicke stattdessen hier, um mehr Dienste und Funktionen für nur {currency}{price} pro Monat zu erhalten.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Deinen Ferdi Plan herunterstufen",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Verbindung zu den Ferdi Online Services fehlgeschlagen", 36 "global.api.unhealthy": "Verbindung zu den Ferdi Online Services fehlgeschlagen",
71 "global.franzProRequired": "Ferdi Professional benötigt",
72 "global.notConnectedToTheInternet": "Du bist nicht mit dem Internet verbunden.", 37 "global.notConnectedToTheInternet": "Du bist nicht mit dem Internet verbunden.",
73 "global.spellchecker.useDefault": "Standard benutzen ({default})", 38 "global.spellchecker.useDefault": "Standard benutzen ({default})",
74 "global.spellchecking.autodetect": "Sprache automatisch erkennen", 39 "global.spellchecking.autodetect": "Sprache automatisch erkennen",
75 "global.spellchecking.autodetect.short": "Automatisch", 40 "global.spellchecking.autodetect.short": "Automatisch",
76 "global.spellchecking.language": "Sprache für Rechtschreibprüfung", 41 "global.spellchecking.language": "Sprache für Rechtschreibprüfung",
77 "global.upgradeButton.upgradeToPro": "Upgrade zu Ferdi Professional",
78 "global.userAgentHelp": "Benutze 'https://whatmyuseragent.com/' (für das Entdecken) oder 'https://developers.whatismybrowser.com/useragents/explore/' (für die Wahl) deines gewünschten User Agenten und kopiere ihn hier hinein.", 42 "global.userAgentHelp": "Benutze 'https://whatmyuseragent.com/' (für das Entdecken) oder 'https://developers.whatismybrowser.com/useragents/explore/' (für die Wahl) deines gewünschten User Agenten und kopiere ihn hier hinein.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Deine Ferdi-4-Dienste importieren", 44 "import.headline": "Deine Ferdi-4-Dienste importieren",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Ausblenden", 52 "infobar.hide": "Ausblenden",
89 "infobar.requiredRequestsFailed": "Dienste und Benutzerinformationen konnten nicht geladen werden", 53 "infobar.requiredRequestsFailed": "Dienste und Benutzerinformationen konnten nicht geladen werden",
90 "infobar.servicesUpdated": "Deine Dienste wurden aktualisiert.", 54 "infobar.servicesUpdated": "Deine Dienste wurden aktualisiert.",
91 "infobar.trialActivated": "Deine kostenlose Testlizenz wurde erfolgreich aktiviert. Viel Spaß!",
92 "infobar.updateAvailable": "Eine neue Version von Ferdi ist verfügbar.", 55 "infobar.updateAvailable": "Eine neue Version von Ferdi ist verfügbar.",
93 "infobox.dismiss": "Verwerfen", 56 "infobox.dismiss": "Verwerfen",
94 "invite.email.label": "E-Mail-Adresse", 57 "invite.email.label": "E-Mail-Adresse",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Menü automatisch verstecken", 87 "menu.app.autohideMenuBar": "Menü automatisch verstecken",
125 "menu.app.checkForUpdates": "Nach Updates suchen", 88 "menu.app.checkForUpdates": "Nach Updates suchen",
126 "menu.app.hide": "Ausblenden", 89 "menu.app.hide": "Ausblenden",
127 "menu.app.hideOthers": "Andere ausblenden", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Beenden", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Einstellungen", 92 "menu.app.settings": "Einstellungen",
130 "menu.app.unhide": "Einblenden", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Bearbeiten", 94 "menu.edit": "Bearbeiten",
132 "menu.edit.copy": "Kopieren", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Ausschneiden", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Löschen", 97 "menu.edit.delete": "Löschen",
135 "menu.edit.emojiSymbols": "Emoji & Symbole", 98 "menu.edit.emojiSymbols": "Emoji & Symbole",
136 "menu.edit.findInPage": "In Seite suchen", 99 "menu.edit.findInPage": "In Seite suchen",
137 "menu.edit.paste": "Einfügen", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Einfügen und Stil anpassen", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Wiederholen", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Alle auswählen", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Sprachausgabe", 104 "menu.edit.speech": "Sprachausgabe",
142 "menu.edit.startDictation": "Diktat starten", 105 "menu.edit.startDictation": "Diktat starten",
143 "menu.edit.startSpeaking": "Sprachausgabe starten", 106 "menu.edit.startSpeaking": "Sprachausgabe starten",
144 "menu.edit.stopSpeaking": "Sprachausgabe stoppen", 107 "menu.edit.stopSpeaking": "Sprachausgabe stoppen",
145 "menu.edit.undo": "Rückgängig", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Datei", 109 "menu.file": "Datei",
147 "menu.help": "Hilfe", 110 "menu.help": "Help",
148 "menu.help.changelog": "Änderungsprotokoll", 111 "menu.help.changelog": "Änderungsprotokoll",
149 "menu.help.debugInfo": "Debugging-Information anzeigen", 112 "menu.help.debugInfo": "Debugging-Information anzeigen",
150 "menu.help.debugInfoCopiedBody": "Deine Debugging-Information wurde in die Zwischenablage kopiert.", 113 "menu.help.debugInfoCopiedBody": "Deine Debugging-Information wurde in die Zwischenablage kopiert.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debugging-Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debugging-Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Mehr erfahren", 116 "menu.help.learnMore": "Mehr erfahren",
153 "menu.help.privacy": "Datenschutzerklärung", 117 "menu.help.privacy": "Datenschutzerklärung",
154 "menu.help.publishDebugInfo": "Debug-Informationen veröffentlichen", 118 "menu.help.publishDebugInfo": "Debug-Informationen veröffentlichen",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Todos aktivieren", 127 "menu.todos.enableTodos": "Todos aktivieren",
164 "menu.view": "Darstellung", 128 "menu.view": "Darstellung",
165 "menu.view.back": "Zurück", 129 "menu.view.back": "Zurück",
166 "menu.view.enterFullScreen": "Vollbildmodus",
167 "menu.view.exitFullScreen": "Vollbildmodus aus",
168 "menu.view.forward": "Vorwärts", 130 "menu.view.forward": "Vorwärts",
169 "menu.view.lockFerdi": "Ferdi sperren", 131 "menu.view.lockFerdi": "Ferdi sperren",
170 "menu.view.openQuickSwitch": "Quick Switch öffnen", 132 "menu.view.openQuickSwitch": "Quick Switch öffnen",
171 "menu.view.reloadFranz": "Ferdi neu laden", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Dienst neu laden", 134 "menu.view.reloadService": "Dienst neu laden",
173 "menu.view.reloadTodos": "ToDos neuladen", 135 "menu.view.reloadTodos": "ToDos neuladen",
174 "menu.view.resetZoom": "Originalgröße", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Dunkles Design umschalten", 137 "menu.view.toggleDarkMode": "Dunkles Design umschalten",
176 "menu.view.toggleDevTools": "Entwicklertools anzeigen", 138 "menu.view.toggleDevTools": "Entwicklertools anzeigen",
177 "menu.view.toggleFullScreen": "Vollbildmodus umschalten", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Entwicklertools für Dienst anzeigen", 140 "menu.view.toggleServiceDevTools": "Entwicklertools für Dienst anzeigen",
179 "menu.view.toggleTodosDevTools": "Todos Developer Tools umschalten", 141 "menu.view.toggleTodosDevTools": "Todos Developer Tools umschalten",
180 "menu.view.zoomIn": "Vergrößern", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Verkleinern", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Fenster", 144 "menu.window": "Window",
183 "menu.window.close": "Schließen", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimieren", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Arbeitsbereiche", 147 "menu.workspaces": "Arbeitsbereiche",
186 "menu.workspaces.addNewWorkspace": "Neuen Workspace hinzufügen...", 148 "menu.workspaces.addNewWorkspace": "Neuen Workspace hinzufügen...",
187 "menu.workspaces.closeWorkspaceDrawer": "Workspaces öffnen", 149 "menu.workspaces.closeWorkspaceDrawer": "Workspaces öffnen",
@@ -194,11 +156,7 @@
194 "password.noUser": "Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden", 156 "password.noUser": "Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden",
195 "password.submit.label": "Absenden", 157 "password.submit.label": "Absenden",
196 "password.successInfo": "Wir haben Dir eine E-Mail mit weiteren Anweisungen geschickt", 158 "password.successInfo": "Wir haben Dir eine E-Mail mit weiteren Anweisungen geschickt",
197 "premiumFeature.button.upgradeAccount": "Account erweitern",
198 "pricing.features.accountSync": "Konto-Synchronisierung", 159 "pricing.features.accountSync": "Konto-Synchronisierung",
199 "pricing.features.adFree": "Keine Werbung",
200 "pricing.features.appDelays": "Keine unnötigen Unterbrechungen",
201 "pricing.features.appDelaysEnabled": "Gelegentliche Wartebildschirme",
202 "pricing.features.customWebsites": "Hinzufügen von eigenen Websites", 160 "pricing.features.customWebsites": "Hinzufügen von eigenen Websites",
203 "pricing.features.desktopNotifications": "Desktop Benachrichtigungen", 161 "pricing.features.desktopNotifications": "Desktop Benachrichtigungen",
204 "pricing.features.onPremise": "On-premise & andere Hosted Services", 162 "pricing.features.onPremise": "On-premise & andere Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team-Management", 166 "pricing.features.teamManagement": "Team-Management",
209 "pricing.features.thirdPartyServices": "Integration von Services über Drittanbieter", 167 "pricing.features.thirdPartyServices": "Integration von Services über Drittanbieter",
210 "pricing.features.unlimitedServices": "Unbegrenztes hinzufügen von Services", 168 "pricing.features.unlimitedServices": "Unbegrenztes hinzufügen von Services",
211 "pricing.features.upToSixServices": "Bis zu 6 Dienste hinzufügen",
212 "pricing.features.upToThreeServices": "Bis zu 3 Dienste hinzufügen",
213 "pricing.features.workspaces": "Arbeitsbereiche", 169 "pricing.features.workspaces": "Arbeitsbereiche",
214 "pricing.plan.free": "Ferdi kostenlos",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal monatlich",
218 "pricing.plan.personal-yearly": "Ferdi Personal jährlich",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional monatlich",
221 "pricing.plan.pro-yearly": "Ferdi Professional jährlich",
222 "pricing.trial.cta.accept": "Ja, Upgrade zu Ferdi Professional durchführen",
223 "pricing.trial.cta.skip": "Weiter zu Ferdi",
224 "pricing.trial.cta.start": "Ferdi verwenden",
225 "pricing.trial.error": "Tut uns leid, wir konnten deine kostenlose Testlizenz nicht aktivieren!",
226 "pricing.trial.features.headline": "Ferdi Professional beinhaltet:",
227 "pricing.trial.headline.pro": "Hi {name}, willkommen bei Ferdi",
228 "pricing.trial.intro.happyMessaging": "Viel Spaß beim Nachrichten schreiben",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Deine kostenlose Testlizenz endet automatisch nach 14 Tagen",
232 "pricing.trial.terms.headline": "Ohne Bindung, ohne Haken",
233 "pricing.trial.terms.noCreditCard": "Keine Kreditkarte notwendig",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "{name} neu laden", 170 "service.crashHandler.action": "{name} neu laden",
236 "service.crashHandler.autoReload": "{name} wird in {seconds} Sekunden automatisch wiederhergestellt", 171 "service.crashHandler.autoReload": "{name} wird in {seconds} Sekunden automatisch wiederhergestellt",
237 "service.crashHandler.headline": "Oh nein!", 172 "service.crashHandler.headline": "Oh nein!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh nein!", 178 "service.errorHandler.headline": "Oh nein!",
244 "service.errorHandler.message": "Fehler", 179 "service.errorHandler.message": "Fehler",
245 "service.errorHandler.text": "{name} konnte nicht geladen werden.", 180 "service.errorHandler.text": "{name} konnte nicht geladen werden.",
246 "service.restrictedHandler.action": "Account Upgrade",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional benötigt",
248 "service.restrictedHandler.customUrl.text": "Bitte ein Upgrade zu Ferdi Professional durchführen um benutzerdefinierte URLs und Self Hosted Services verwenden zu können.",
249 "service.restrictedHandler.serviceLimit.headline": "Du hast deine maximale Anzahl an Services erreicht.",
250 "service.restrictedHandler.serviceLimit.text": "Bitte führe eine Upgrade deines Accounts durch um mehr als {count} Services verwenden zu können.",
251 "service.webviewLoader.loading": "Lade {service}", 181 "service.webviewLoader.loading": "Lade {service}",
252 "services.getStarted": "Los geht's!", 182 "services.getStarted": "Los geht's!",
253 "services.login": "Bitte melde dich an, um Ferdi zu benutzen.", 183 "services.login": "Bitte melde dich an, um Ferdi zu benutzen.",
254 "services.serverInfo": "Optional können Sie Ihren Ferdi-Server durch Klicken auf das Zahnrad unten-links ändern.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Ferdi ohne ein Konto verwenden", 185 "services.serverless": "Ferdi ohne ein Konto verwenden",
256 "services.welcome": "Willkommen bei Ferdi!", 186 "services.welcome": "Willkommen bei Ferdi!",
257 "settings.account.account.editButton": "Konto bearbeiten", 187 "settings.account.account.editButton": "Konto bearbeiten",
258 "settings.account.accountType.basic": "Basis-Konto",
259 "settings.account.accountType.premium": "Premium Lizenz",
260 "settings.account.accountUnavailable": "Konto nicht verfügbar", 188 "settings.account.accountUnavailable": "Konto nicht verfügbar",
261 "settings.account.accountUnavailableInfo": "Du verwendest Ferdi ohne ein Konto. Wenn du Ferdi mit einem Konto verwenden möchtest und deine Dienste über alle verschiedene Computer hinweg synchronisieren möchtest, wählen bitte einen Server in den Einstellungen und melde dich danach an.", 189 "settings.account.accountUnavailableInfo": "Du verwendest Ferdi ohne ein Konto. Wenn du Ferdi mit einem Konto verwenden möchtest und deine Dienste über alle verschiedene Computer hinweg synchronisieren möchtest, wählen bitte einen Server in den Einstellungen und melde dich danach an.",
262 "settings.account.buttonSave": "Profil aktualisieren", 190 "settings.account.buttonSave": "Profil aktualisieren",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Rechnungen", 197 "settings.account.headlineInvoices": "Rechnungen",
270 "settings.account.headlinePassword": "Passwort ändern", 198 "settings.account.headlinePassword": "Passwort ändern",
271 "settings.account.headlineProfile": "Profil aktualisieren", 199 "settings.account.headlineProfile": "Profil aktualisieren",
272 "settings.account.headlineSubscription": "Dein Abonnement",
273 "settings.account.headlineTrialUpgrade": "Hol dir die kostenlose 14-tägige Ferdi Professional Testlizenz!",
274 "settings.account.headlineUpgradeAccount": "Hol dir ein Upgrade deines Kontos und bekomme alle Features von Ferdi",
275 "settings.account.invoiceDownload": "Herunterladen",
276 "settings.account.manageSubscription.label": "Dein Abonnement verwalten",
277 "settings.account.successInfo": "Deine Änderungen wurden gespeichert", 200 "settings.account.successInfo": "Deine Änderungen wurden gespeichert",
278 "settings.account.trial": "Kostenlose Testlizenz",
279 "settings.account.trialEndsIn": "Deine kostenlose Testlizenz endet in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Bitte aktualisiere deine Zahlungsinformation damit du {license} nach der kostenlosen Testphase weiter nutzen kannst.",
281 "settings.account.tryReloadServices": "Erneut versuchen", 201 "settings.account.tryReloadServices": "Erneut versuchen",
282 "settings.account.tryReloadUserInfoRequest": "Erneut versuchen", 202 "settings.account.tryReloadUserInfoRequest": "Erneut versuchen",
283 "settings.account.upgradeToPro.label": "Upgrade zu Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Benutzerinformationen konnten nicht geladen werden", 203 "settings.account.userInfoRequestFailed": "Benutzerinformationen konnten nicht geladen werden",
285 "settings.account.yourLicense": "Deine Ferdi Lizenz", 204 "settings.account.yourLicense": "Deine Ferdi Lizenz",
286 "settings.app.accentColorInfo": "Schreibe deine Akzentfarbe in einem CSS-kompatiblen Format. (Standard: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Schreibe deine Akzentfarbe in einem CSS-kompatiblen Format. (Standard: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Rechtschreibprüfung aktivieren", 227 "settings.app.form.enableSpellchecking": "Rechtschreibprüfung aktivieren",
309 "settings.app.form.enableSystemTray": "Ferdi im Infobereich anzeigen", 228 "settings.app.form.enableSystemTray": "Ferdi im Infobereich anzeigen",
310 "settings.app.form.enableTodos": "Ferdi Todos aktivieren", 229 "settings.app.form.enableTodos": "Ferdi Todos aktivieren",
311 "settings.app.form.hibernate": "\"Service Hibernation\" aktivieren",
312 "settings.app.form.hibernateOnStartup": "Behalte Dienste im Ruhezustand beim Start", 230 "settings.app.form.hibernateOnStartup": "Behalte Dienste im Ruhezustand beim Start",
313 "settings.app.form.hibernationStrategy": "\"Service Hibernation\"-Strategie", 231 "settings.app.form.hibernationStrategy": "\"Service Hibernation\"-Strategie",
314 "settings.app.form.iconSize": "Service Symbolgröße", 232 "settings.app.form.iconSize": "Service Symbolgröße",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Universellen Dark Mode aktivieren", 255 "settings.app.form.universalDarkMode": "Universellen Dark Mode aktivieren",
338 "settings.app.form.useTouchIdToUnlock": "Verwenden von Touch ID zum Entsperren von Ferdi erlauben", 256 "settings.app.form.useTouchIdToUnlock": "Verwenden von Touch ID zum Entsperren von Ferdi erlauben",
339 "settings.app.form.useVerticalStyle": "Vertikalen Stil verwenden", 257 "settings.app.form.useVerticalStyle": "Vertikalen Stil verwenden",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Einstellungen", 259 "settings.app.headline": "Einstellungen",
341 "settings.app.headlineAdvanced": "Erweitert", 260 "settings.app.headlineAdvanced": "Erweitert",
342 "settings.app.headlineAppearance": "Darstellung", 261 "settings.app.headlineAppearance": "Darstellung",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "Standardmäßig öffnet Ferdi alle deine Dienste im Hintergrund, sodass diese bereit sind, wenn du sie verwenden möchtest. \"Service Hibernation\" wird deine Dienste nach einer bestimmten Zeitspanne schließen. Dies ist nützlich, um RAM zu sparen oder Dienste davon abzuhalten, deinen Computer zu verlangsamen.", 266 "settings.app.hibernateInfo": "Standardmäßig öffnet Ferdi alle deine Dienste im Hintergrund, sodass diese bereit sind, wenn du sie verwenden möchtest. \"Service Hibernation\" wird deine Dienste nach einer bestimmten Zeitspanne schließen. Dies ist nützlich, um RAM zu sparen oder Dienste davon abzuhalten, deinen Computer zu verlangsamen.",
348 "settings.app.inactivityLockInfo": "Minuten der Inaktivität, nach denen Ferdi automatisch sperren soll. Verwenden Sie 0, um dies zu deaktivieren", 267 "settings.app.inactivityLockInfo": "Minuten der Inaktivität, nach denen Ferdi automatisch sperren soll. Verwenden Sie 0, um dies zu deaktivieren",
349 "settings.app.languageDisclaimer": "Offizielle Übersetzungen: Englisch & Deutsch. Alle anderen Sprachen sind Übersetzungen der Ferdi Community.", 268 "settings.app.languageDisclaimer": "Offizielle Übersetzungen: Englisch & Deutsch. Alle anderen Sprachen sind Übersetzungen der Ferdi Community.",
350 "settings.app.lockInfo": "Die Passwort-Sperre erlaubt es dir, deine Nachrichten zu schützen.\nMit der Passwort-Sperre wirst du beim Starten von Ferdi und wenn du das Programm manuell sperrst, darum gebeten, dein Passwort einzugeben.\nDu kannst Ferdi über das Sperrsymbol in der unteren linken Ecke oder dem Shortcut CMD/CTRL+Shift+L sperren.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Passwort", 270 "settings.app.lockedPassword": "Passwort",
352 "settings.app.lockedPasswordInfo": "Bitte stelle sicher, dass du ein Passwort setzt, an welches du dich erinnern kannst.\nSolltest du dieses Passwort vergessen, musst du Ferdi neu installieren.", 271 "settings.app.lockedPasswordInfo": "Bitte stelle sicher, dass du ein Passwort setzt, an welches du dich erinnern kannst.\nSolltest du dieses Passwort vergessen, musst du Ferdi neu installieren.",
353 "settings.app.restartRequired": "Änderungen werden erst nach einem Neustart wirksam.", 272 "settings.app.restartRequired": "Änderungen werden erst nach einem Neustart wirksam.",
354 "settings.app.scheduledDNDInfo": "Die geplante \"Nicht-stören\"-Funktion erlaubt es dir eine Zeitspanne festzulegen, in der du keine Benachrichtigungen von Ferdi erhalten möchtest.", 273 "settings.app.scheduledDNDInfo": "Die geplante \"Nicht-stören\"-Funktion erlaubt es dir eine Zeitspanne festzulegen, in der du keine Benachrichtigungen von Ferdi erhalten möchtest.",
355 "settings.app.scheduledDNDTimeInfo": "Zeiten im 24-Stunden-Format (z.B. 18:00). Endzeit kann vor Beginn der Startzeit sein (z.B. 17:00 Uhr, Ende 09:00), um die Funktion über Nacht zu aktivieren.", 274 "settings.app.scheduledDNDTimeInfo": "Zeiten im 24-Stunden-Format (z.B. 18:00). Endzeit kann vor Beginn der Startzeit sein (z.B. 17:00 Uhr, Ende 09:00), um die Funktion über Nacht zu aktivieren.",
356 "settings.app.sentryInfo": "Das Senden von Telemetrie-Daten ermöglicht es uns, Fehler in Ferdi zu finden - wir werden keine persönlichen Informationen wie deine Nachrichten versenden! Ändern dieser Option erfordert einen Neustart von Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi verwendet den eingebauten Rechtschreibprüfer deines Macs, um nach Tippfehlern zu suchen. Wenn du die zu überprüfenden Sprachen ändern möchtest, kannst du das in deinen Systemeinstellungen tun.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi verwendet den eingebauten Rechtschreibprüfer deines Macs, um nach Tippfehlern zu suchen. Wenn du die zu überprüfenden Sprachen ändern möchtest, kannst du das in deinen Systemeinstellungen tun.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "Dieser Server wird für die \"Ferdi Todo\"-Funktion verwendet.", 278 "settings.app.todoServerInfo": "Dieser Server wird für die \"Ferdi Todo\"-Funktion verwendet.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Ordner öffnen", 300 "settings.recipes.customService.openFolder": "Ordner öffnen",
382 "settings.recipes.headline": "Verfügbare Dienste", 301 "settings.recipes.headline": "Verfügbare Dienste",
383 "settings.recipes.missingService": "Fehlt ein Dienst?", 302 "settings.recipes.missingService": "Fehlt ein Dienst?",
384 "settings.recipes.mostPopular": "Am beliebtesten",
385 "settings.recipes.nothingFound": "Leider hat kein Dienst zu deinem Suchbegriff gepasst - aber du kannst ihn wahrscheinlich trotzdem über die Option \"Eigene Website\" hinzufügen. Bitte beachte, dass die Website möglicherweise weitere Dienste anzeigt, die seit deiner aktuellen Version zu Ferdi hinzugefügt wurden. Um diese neuen Dienste zu erhalten, erwäge bitte ein Upgrade auf eine neuere Version von Ferdi.", 303 "settings.recipes.nothingFound": "Leider hat kein Dienst zu deinem Suchbegriff gepasst - aber du kannst ihn wahrscheinlich trotzdem über die Option \"Eigene Website\" hinzufügen. Bitte beachte, dass die Website möglicherweise weitere Dienste anzeigt, die seit deiner aktuellen Version zu Ferdi hinzugefügt wurden. Um diese neuen Dienste zu erhalten, erwäge bitte ein Upgrade auf eine neuere Version von Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Dienst erfolgreich hinzugefügt", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Dienst erfolgreich hinzugefügt",
387 "settings.searchService": "Dienst suchen", 305 "settings.searchService": "Dienst suchen",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "{name} hinzufügen", 309 "settings.service.form.addServiceHeadline": "{name} hinzufügen",
392 "settings.service.form.availableServices": "Verfügbare Dienste", 310 "settings.service.form.availableServices": "Verfügbare Dienste",
393 "settings.service.form.customUrl": "Eigener Server", 311 "settings.service.form.customUrl": "Eigener Server",
394 "settings.service.form.customUrlPremiumInfo": "Um einen selbst gehosteten Dienst hinzuzufügen, brauchst Du ein Ferdi Premium Konto.",
395 "settings.service.form.customUrlUpgradeAccount": "Dein Konto upgraden",
396 "settings.service.form.customUrlValidationError": "Dein {name}-Server konnte nicht verifiziert werden.", 312 "settings.service.form.customUrlValidationError": "Dein {name}-Server konnte nicht verifiziert werden.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Helligkeit", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Helligkeit",
398 "settings.service.form.darkReaderContrast": "Dark Reader Kontrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Kontrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team-Management", 378 "settings.team.contentHeadline": "Franz Team-Management",
463 "settings.team.copy": "Mit Franz's Team Management kannst du Franz Abonnements für mehrere Benutzer verwalten. Bitte beachte, dass dir ein Franz Premium-Abonnement keine Vorteile bei der Nutzung von Ferdi bringt: Der einzige Grund, warum du noch Zugriff auf das Team Management hast, ist, damit du weiterhin Franz Teams verwalten kannst und damit du keine Funktionalität bei der Verwaltung deines Kontos verlierst.", 379 "settings.team.copy": "Mit Franz's Team Management kannst du Franz Abonnements für mehrere Benutzer verwalten. Bitte beachte, dass dir ein Franz Premium-Abonnement keine Vorteile bei der Nutzung von Ferdi bringt: Der einzige Grund, warum du noch Zugriff auf das Team Management hast, ist, damit du weiterhin Franz Teams verwalten kannst und damit du keine Funktionalität bei der Verwaltung deines Kontos verlierst.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Du nutzt derzeit Franz Server und hast deshalb Zugriff auf das Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Verwalte dein Team auf meetfranz.com", 382 "settings.team.manageAction": "Verwalte dein Team auf meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams sind nicht verfügbar", 383 "settings.team.teamsUnavailable": "Teams sind nicht verfügbar",
468 "settings.team.teamsUnavailableInfo": "Teams sind derzeit nur bei der Verwendung des Franz Servers und nach der Zahlung für Franz Professional verfügbar.\nBitte ändern Sie Ihren Server auf https://api.franzinfra.com, um Teams zu verwenden.", 384 "settings.team.teamsUnavailableInfo": "Teams sind derzeit nur bei der Verwendung des Franz Servers und nach der Zahlung für Franz Professional verfügbar.\nBitte ändern Sie Ihren Server auf https://api.franzinfra.com, um Teams zu verwenden.",
469 "settings.team.upgradeAction": "Account Upgrade durchführen",
470 "settings.user.form.accountType.company": "Firma", 385 "settings.user.form.accountType.company": "Firma",
471 "settings.user.form.accountType.individual": "Einzelperson", 386 "settings.user.form.accountType.individual": "Einzelperson",
472 "settings.user.form.accountType.label": "Konto-Typ", 387 "settings.user.form.accountType.label": "Konto-Typ",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Du hast bereits ein Konto? Melde Dich an.", 431 "signup.link.login": "Du hast bereits ein Konto? Melde Dich an.",
517 "signup.password.label": "Passwort", 432 "signup.password.label": "Passwort",
518 "signup.submit.label": "Konto erstellen", 433 "signup.submit.label": "Konto erstellen",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Ja, kostenlose Ferdi Professional Testlizenz starten",
521 "subscription.cta.allOptions": "Alle Optionen anzeigen",
522 "subscription.cta.choosePlan": "Wähle deine Lizenz",
523 "subscription.includedProFeatures": "Die Ferdi Professional Lizenz beinhaltet:",
524 "subscription.interval.per": "pro {interval}",
525 "subscription.interval.perMonth": "pro Monat",
526 "subscription.interval.perMonthPerUser": "pro Monat und Benutzer",
527 "subscription.planItem.upgradeAccount": "Account Upgrade",
528 "subscription.teaser.includedFeatures": "Bezahlte Ferdi Lizenzen beinhalten:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Abbrechen",
531 "subscriptionPopup.buttonDone": "Fertig",
532 "tabs.item.confirmDeleteService": "Willst du den {serviceName} Dienst wirklich löschen?", 434 "tabs.item.confirmDeleteService": "Willst du den {serviceName} Dienst wirklich löschen?",
533 "tabs.item.deleteService": "Dienst löschen", 435 "tabs.item.deleteService": "Dienst löschen",
534 "tabs.item.disableAudio": "Audio deaktivieren", 436 "tabs.item.disableAudio": "Audio deaktivieren",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Benachrichtigungen deaktivieren", 438 "tabs.item.disableNotifications": "Benachrichtigungen deaktivieren",
536 "tabs.item.disableService": "Dienst deaktivieren", 439 "tabs.item.disableService": "Dienst deaktivieren",
537 "tabs.item.edit": "Bearbeiten", 440 "tabs.item.edit": "Bearbeiten",
538 "tabs.item.enableAudio": "Audio aktivieren", 441 "tabs.item.enableAudio": "Audio aktivieren",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Benachrichtigungen aktivieren", 443 "tabs.item.enableNotification": "Benachrichtigungen aktivieren",
540 "tabs.item.enableService": "Dienst aktivieren", 444 "tabs.item.enableService": "Dienst aktivieren",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Neu laden", 446 "tabs.item.reload": "Neu laden",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} ist ungültig", 448 "validation.email": "{field} ist ungültig",
543 "validation.minLength": "{field} muss mindestens {length} Zeichen enthalten", 449 "validation.minLength": "{field} muss mindestens {length} Zeichen enthalten",
544 "validation.oneRequired": "Mindestens ein Wert wird benötigt", 450 "validation.oneRequired": "Mindestens ein Wert wird benötigt",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Arbeitsbereiche", 462 "workspaceDrawer.headline": "Arbeitsbereiche",
557 "workspaceDrawer.item.contextMenuEdit": "Bearbeiten", 463 "workspaceDrawer.item.contextMenuEdit": "Bearbeiten",
558 "workspaceDrawer.item.noServicesAddedYet": "Noch keine Services hinzugefügt", 464 "workspaceDrawer.item.noServicesAddedYet": "Noch keine Services hinzugefügt",
559 "workspaceDrawer.premiumCtaButtonLabel": "Erstelle deinen ersten Workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium Feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Premium Account aktivieren",
562 "workspaceDrawer.workspaceFeatureInfo": "Mit Ferdi 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.", 465 "workspaceDrawer.workspaceFeatureInfo": "Mit Ferdi 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.",
563 "workspaceDrawer.workspacesSettingsTooltip": "Workspaces bearbeiten", 466 "workspaceDrawer.workspacesSettingsTooltip": "Workspaces bearbeiten",
564 "workspaces.switchingIndicator.switchingTo": "Wechsle zu" 467 "workspaces.switchingIndicator.switchingTo": "Wechsle zu"
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 370a6fb92..683ec4628 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -661,180 +661,6 @@
661 { 661 {
662 "descriptors": [ 662 "descriptors": [
663 { 663 {
664 "defaultMessage": "!!!Hi {name}, welcome to Franz",
665 "end": {
666 "column": 3,
667 "line": 17
668 },
669 "file": "src/components/auth/Pricing.js",
670 "id": "pricing.trial.headline.pro",
671 "start": {
672 "column": 12,
673 "line": 14
674 }
675 },
676 {
677 "defaultMessage": "!!!We have a special treat for you.",
678 "end": {
679 "column": 3,
680 "line": 21
681 },
682 "file": "src/components/auth/Pricing.js",
683 "id": "pricing.trial.intro.specialTreat",
684 "start": {
685 "column": 16,
686 "line": 18
687 }
688 },
689 {
690 "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.",
691 "end": {
692 "column": 3,
693 "line": 25
694 },
695 "file": "src/components/auth/Pricing.js",
696 "id": "pricing.trial.intro.tryPro",
697 "start": {
698 "column": 10,
699 "line": 22
700 }
701 },
702 {
703 "defaultMessage": "!!!Happy messaging,",
704 "end": {
705 "column": 3,
706 "line": 29
707 },
708 "file": "src/components/auth/Pricing.js",
709 "id": "pricing.trial.intro.happyMessaging",
710 "start": {
711 "column": 18,
712 "line": 26
713 }
714 },
715 {
716 "defaultMessage": "!!!No strings attached",
717 "end": {
718 "column": 3,
719 "line": 33
720 },
721 "file": "src/components/auth/Pricing.js",
722 "id": "pricing.trial.terms.headline",
723 "start": {
724 "column": 29,
725 "line": 30
726 }
727 },
728 {
729 "defaultMessage": "!!!No credit card required",
730 "end": {
731 "column": 3,
732 "line": 37
733 },
734 "file": "src/components/auth/Pricing.js",
735 "id": "pricing.trial.terms.noCreditCard",
736 "start": {
737 "column": 16,
738 "line": 34
739 }
740 },
741 {
742 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
743 "end": {
744 "column": 3,
745 "line": 41
746 },
747 "file": "src/components/auth/Pricing.js",
748 "id": "pricing.trial.terms.automaticTrialEnd",
749 "start": {
750 "column": 21,
751 "line": 38
752 }
753 },
754 {
755 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)",
756 "end": {
757 "column": 3,
758 "line": 45
759 },
760 "file": "src/components/auth/Pricing.js",
761 "id": "pricing.trial.terms.trialWorth",
762 "start": {
763 "column": 14,
764 "line": 42
765 }
766 },
767 {
768 "defaultMessage": "!!!Sorry, we could not activate your trial!",
769 "end": {
770 "column": 3,
771 "line": 49
772 },
773 "file": "src/components/auth/Pricing.js",
774 "id": "pricing.trial.error",
775 "start": {
776 "column": 19,
777 "line": 46
778 }
779 },
780 {
781 "defaultMessage": "!!!Start my 14-day Franz Professional Trial",
782 "end": {
783 "column": 3,
784 "line": 53
785 },
786 "file": "src/components/auth/Pricing.js",
787 "id": "pricing.trial.cta.accept",
788 "start": {
789 "column": 13,
790 "line": 50
791 }
792 },
793 {
794 "defaultMessage": "!!!Start using Franz",
795 "end": {
796 "column": 3,
797 "line": 57
798 },
799 "file": "src/components/auth/Pricing.js",
800 "id": "pricing.trial.cta.start",
801 "start": {
802 "column": 12,
803 "line": 54
804 }
805 },
806 {
807 "defaultMessage": "!!!Continue to Ferdi",
808 "end": {
809 "column": 3,
810 "line": 61
811 },
812 "file": "src/components/auth/Pricing.js",
813 "id": "pricing.trial.cta.skip",
814 "start": {
815 "column": 11,
816 "line": 58
817 }
818 },
819 {
820 "defaultMessage": "!!!Franz Professional includes:",
821 "end": {
822 "column": 3,
823 "line": 65
824 },
825 "file": "src/components/auth/Pricing.js",
826 "id": "pricing.trial.features.headline",
827 "start": {
828 "column": 20,
829 "line": 62
830 }
831 }
832 ],
833 "path": "src/components/auth/Pricing.json"
834 },
835 {
836 "descriptors": [
837 {
838 "defaultMessage": "!!!Invite Friends", 664 "defaultMessage": "!!!Invite Friends",
839 "end": { 665 "end": {
840 "column": 3, 666 "column": 3,
@@ -947,7 +773,7 @@
947 "defaultMessage": "!!!Choose from our most used services and get back on top of your messaging now.", 773 "defaultMessage": "!!!Choose from our most used services and get back on top of your messaging now.",
948 "end": { 774 "end": {
949 "column": 3, 775 "column": 3,
950 "line": 26 776 "line": 27
951 }, 777 },
952 "file": "src/components/auth/SetupAssistant.js", 778 "file": "src/components/auth/SetupAssistant.js",
953 "id": "setupAssistant.subheadline", 779 "id": "setupAssistant.subheadline",
@@ -960,26 +786,26 @@
960 "defaultMessage": "!!!Let's go", 786 "defaultMessage": "!!!Let's go",
961 "end": { 787 "end": {
962 "column": 3, 788 "column": 3,
963 "line": 30 789 "line": 31
964 }, 790 },
965 "file": "src/components/auth/SetupAssistant.js", 791 "file": "src/components/auth/SetupAssistant.js",
966 "id": "setupAssistant.submit.label", 792 "id": "setupAssistant.submit.label",
967 "start": { 793 "start": {
968 "column": 21, 794 "column": 21,
969 "line": 27 795 "line": 28
970 } 796 }
971 }, 797 },
972 { 798 {
973 "defaultMessage": "!!!Invitations sent successfully", 799 "defaultMessage": "!!!Invitations sent successfully",
974 "end": { 800 "end": {
975 "column": 3, 801 "column": 3,
976 "line": 34 802 "line": 35
977 }, 803 },
978 "file": "src/components/auth/SetupAssistant.js", 804 "file": "src/components/auth/SetupAssistant.js",
979 "id": "invite.successInfo", 805 "id": "invite.successInfo",
980 "start": { 806 "start": {
981 "column": 21, 807 "column": 21,
982 "line": 31 808 "line": 32
983 } 809 }
984 } 810 }
985 ], 811 ],
@@ -991,169 +817,169 @@
991 "defaultMessage": "!!!Sign up", 817 "defaultMessage": "!!!Sign up",
992 "end": { 818 "end": {
993 "column": 3, 819 "column": 3,
994 "line": 22 820 "line": 23
995 }, 821 },
996 "file": "src/components/auth/Signup.js", 822 "file": "src/components/auth/Signup.js",
997 "id": "signup.headline", 823 "id": "signup.headline",
998 "start": { 824 "start": {
999 "column": 12, 825 "column": 12,
1000 "line": 19 826 "line": 20
1001 } 827 }
1002 }, 828 },
1003 { 829 {
1004 "defaultMessage": "!!!Firstname", 830 "defaultMessage": "!!!Firstname",
1005 "end": { 831 "end": {
1006 "column": 3, 832 "column": 3,
1007 "line": 26 833 "line": 27
1008 }, 834 },
1009 "file": "src/components/auth/Signup.js", 835 "file": "src/components/auth/Signup.js",
1010 "id": "signup.firstname.label", 836 "id": "signup.firstname.label",
1011 "start": { 837 "start": {
1012 "column": 18, 838 "column": 18,
1013 "line": 23 839 "line": 24
1014 } 840 }
1015 }, 841 },
1016 { 842 {
1017 "defaultMessage": "!!!Lastname", 843 "defaultMessage": "!!!Lastname",
1018 "end": { 844 "end": {
1019 "column": 3, 845 "column": 3,
1020 "line": 30 846 "line": 31
1021 }, 847 },
1022 "file": "src/components/auth/Signup.js", 848 "file": "src/components/auth/Signup.js",
1023 "id": "signup.lastname.label", 849 "id": "signup.lastname.label",
1024 "start": { 850 "start": {
1025 "column": 17, 851 "column": 17,
1026 "line": 27 852 "line": 28
1027 } 853 }
1028 }, 854 },
1029 { 855 {
1030 "defaultMessage": "!!!Email address", 856 "defaultMessage": "!!!Email address",
1031 "end": { 857 "end": {
1032 "column": 3, 858 "column": 3,
1033 "line": 34 859 "line": 35
1034 }, 860 },
1035 "file": "src/components/auth/Signup.js", 861 "file": "src/components/auth/Signup.js",
1036 "id": "signup.email.label", 862 "id": "signup.email.label",
1037 "start": { 863 "start": {
1038 "column": 14, 864 "column": 14,
1039 "line": 31 865 "line": 32
1040 } 866 }
1041 }, 867 },
1042 { 868 {
1043 "defaultMessage": "!!!Password", 869 "defaultMessage": "!!!Password",
1044 "end": { 870 "end": {
1045 "column": 3, 871 "column": 3,
1046 "line": 42 872 "line": 43
1047 }, 873 },
1048 "file": "src/components/auth/Signup.js", 874 "file": "src/components/auth/Signup.js",
1049 "id": "signup.password.label", 875 "id": "signup.password.label",
1050 "start": { 876 "start": {
1051 "column": 17, 877 "column": 17,
1052 "line": 39 878 "line": 40
1053 } 879 }
1054 }, 880 },
1055 { 881 {
1056 "defaultMessage": "!!!By creating a Ferdi account you accept the", 882 "defaultMessage": "!!!By creating a Ferdi account you accept the",
1057 "end": { 883 "end": {
1058 "column": 3, 884 "column": 3,
1059 "line": 46 885 "line": 47
1060 }, 886 },
1061 "file": "src/components/auth/Signup.js", 887 "file": "src/components/auth/Signup.js",
1062 "id": "signup.legal.info", 888 "id": "signup.legal.info",
1063 "start": { 889 "start": {
1064 "column": 13, 890 "column": 13,
1065 "line": 43 891 "line": 44
1066 } 892 }
1067 }, 893 },
1068 { 894 {
1069 "defaultMessage": "!!!Terms of service", 895 "defaultMessage": "!!!Terms of service",
1070 "end": { 896 "end": {
1071 "column": 3, 897 "column": 3,
1072 "line": 50 898 "line": 51
1073 }, 899 },
1074 "file": "src/components/auth/Signup.js", 900 "file": "src/components/auth/Signup.js",
1075 "id": "signup.legal.terms", 901 "id": "signup.legal.terms",
1076 "start": { 902 "start": {
1077 "column": 9, 903 "column": 9,
1078 "line": 47 904 "line": 48
1079 } 905 }
1080 }, 906 },
1081 { 907 {
1082 "defaultMessage": "!!!Privacy Statement", 908 "defaultMessage": "!!!Privacy Statement",
1083 "end": { 909 "end": {
1084 "column": 3, 910 "column": 3,
1085 "line": 54 911 "line": 55
1086 }, 912 },
1087 "file": "src/components/auth/Signup.js", 913 "file": "src/components/auth/Signup.js",
1088 "id": "signup.legal.privacy", 914 "id": "signup.legal.privacy",
1089 "start": { 915 "start": {
1090 "column": 11, 916 "column": 11,
1091 "line": 51 917 "line": 52
1092 } 918 }
1093 }, 919 },
1094 { 920 {
1095 "defaultMessage": "!!!Create account", 921 "defaultMessage": "!!!Create account",
1096 "end": { 922 "end": {
1097 "column": 3, 923 "column": 3,
1098 "line": 58 924 "line": 59
1099 }, 925 },
1100 "file": "src/components/auth/Signup.js", 926 "file": "src/components/auth/Signup.js",
1101 "id": "signup.submit.label", 927 "id": "signup.submit.label",
1102 "start": { 928 "start": {
1103 "column": 21, 929 "column": 21,
1104 "line": 55 930 "line": 56
1105 } 931 }
1106 }, 932 },
1107 { 933 {
1108 "defaultMessage": "!!!Already have an account, sign in?", 934 "defaultMessage": "!!!Already have an account, sign in?",
1109 "end": { 935 "end": {
1110 "column": 3, 936 "column": 3,
1111 "line": 62 937 "line": 63
1112 }, 938 },
1113 "file": "src/components/auth/Signup.js", 939 "file": "src/components/auth/Signup.js",
1114 "id": "signup.link.login", 940 "id": "signup.link.login",
1115 "start": { 941 "start": {
1116 "column": 13, 942 "column": 13,
1117 "line": 59 943 "line": 60
1118 } 944 }
1119 }, 945 },
1120 { 946 {
1121 "defaultMessage": "!!!Change server", 947 "defaultMessage": "!!!Change server",
1122 "end": { 948 "end": {
1123 "column": 3, 949 "column": 3,
1124 "line": 66 950 "line": 67
1125 }, 951 },
1126 "file": "src/components/auth/Signup.js", 952 "file": "src/components/auth/Signup.js",
1127 "id": "login.changeServer", 953 "id": "login.changeServer",
1128 "start": { 954 "start": {
1129 "column": 16, 955 "column": 16,
1130 "line": 63 956 "line": 64
1131 } 957 }
1132 }, 958 },
1133 { 959 {
1134 "defaultMessage": "!!!Use Ferdi without an Account", 960 "defaultMessage": "!!!Use Ferdi without an Account",
1135 "end": { 961 "end": {
1136 "column": 3, 962 "column": 3,
1137 "line": 70 963 "line": 71
1138 }, 964 },
1139 "file": "src/components/auth/Signup.js", 965 "file": "src/components/auth/Signup.js",
1140 "id": "services.serverless", 966 "id": "services.serverless",
1141 "start": { 967 "start": {
1142 "column": 14, 968 "column": 14,
1143 "line": 67 969 "line": 68
1144 } 970 }
1145 }, 971 },
1146 { 972 {
1147 "defaultMessage": "!!!A user with that email address already exists", 973 "defaultMessage": "!!!A user with that email address already exists",
1148 "end": { 974 "end": {
1149 "column": 3, 975 "column": 3,
1150 "line": 74 976 "line": 75
1151 }, 977 },
1152 "file": "src/components/auth/Signup.js", 978 "file": "src/components/auth/Signup.js",
1153 "id": "signup.emailDuplicate", 979 "id": "signup.emailDuplicate",
1154 "start": { 980 "start": {
1155 "column": 18, 981 "column": 18,
1156 "line": 71 982 "line": 72
1157 } 983 }
1158 } 984 }
1159 ], 985 ],
@@ -1209,52 +1035,52 @@
1209 "defaultMessage": "!!!Your services have been updated.", 1035 "defaultMessage": "!!!Your services have been updated.",
1210 "end": { 1036 "end": {
1211 "column": 3, 1037 "column": 3,
1212 "line": 35 1038 "line": 32
1213 }, 1039 },
1214 "file": "src/components/layout/AppLayout.js", 1040 "file": "src/components/layout/AppLayout.js",
1215 "id": "infobar.servicesUpdated", 1041 "id": "infobar.servicesUpdated",
1216 "start": { 1042 "start": {
1217 "column": 19, 1043 "column": 19,
1218 "line": 32 1044 "line": 29
1219 } 1045 }
1220 }, 1046 },
1221 { 1047 {
1222 "defaultMessage": "!!!Reload services", 1048 "defaultMessage": "!!!Reload services",
1223 "end": { 1049 "end": {
1224 "column": 3, 1050 "column": 3,
1225 "line": 39 1051 "line": 36
1226 }, 1052 },
1227 "file": "src/components/layout/AppLayout.js", 1053 "file": "src/components/layout/AppLayout.js",
1228 "id": "infobar.buttonReloadServices", 1054 "id": "infobar.buttonReloadServices",
1229 "start": { 1055 "start": {
1230 "column": 24, 1056 "column": 24,
1231 "line": 36 1057 "line": 33
1232 } 1058 }
1233 }, 1059 },
1234 { 1060 {
1235 "defaultMessage": "!!!Could not load services and user information", 1061 "defaultMessage": "!!!Could not load services and user information",
1236 "end": { 1062 "end": {
1237 "column": 3, 1063 "column": 3,
1238 "line": 43 1064 "line": 40
1239 }, 1065 },
1240 "file": "src/components/layout/AppLayout.js", 1066 "file": "src/components/layout/AppLayout.js",
1241 "id": "infobar.requiredRequestsFailed", 1067 "id": "infobar.requiredRequestsFailed",
1242 "start": { 1068 "start": {
1243 "column": 26, 1069 "column": 26,
1244 "line": 40 1070 "line": 37
1245 } 1071 }
1246 }, 1072 },
1247 { 1073 {
1248 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 1074 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
1249 "end": { 1075 "end": {
1250 "column": 3, 1076 "column": 3,
1251 "line": 47 1077 "line": 45
1252 }, 1078 },
1253 "file": "src/components/layout/AppLayout.js", 1079 "file": "src/components/layout/AppLayout.js",
1254 "id": "infobar.authRequestFailed", 1080 "id": "infobar.authRequestFailed",
1255 "start": { 1081 "start": {
1256 "column": 21, 1082 "column": 21,
1257 "line": 44 1083 "line": 41
1258 } 1084 }
1259 } 1085 }
1260 ], 1086 ],
@@ -1266,117 +1092,117 @@
1266 "defaultMessage": "!!!Settings", 1092 "defaultMessage": "!!!Settings",
1267 "end": { 1093 "end": {
1268 "column": 3, 1094 "column": 3,
1269 "line": 23 1095 "line": 20
1270 }, 1096 },
1271 "file": "src/components/layout/Sidebar.js", 1097 "file": "src/components/layout/Sidebar.js",
1272 "id": "sidebar.settings", 1098 "id": "sidebar.settings",
1273 "start": { 1099 "start": {
1274 "column": 12, 1100 "column": 12,
1275 "line": 20 1101 "line": 17
1276 } 1102 }
1277 }, 1103 },
1278 { 1104 {
1279 "defaultMessage": "!!!Add new service", 1105 "defaultMessage": "!!!Add new service",
1280 "end": { 1106 "end": {
1281 "column": 3, 1107 "column": 3,
1282 "line": 27 1108 "line": 24
1283 }, 1109 },
1284 "file": "src/components/layout/Sidebar.js", 1110 "file": "src/components/layout/Sidebar.js",
1285 "id": "sidebar.addNewService", 1111 "id": "sidebar.addNewService",
1286 "start": { 1112 "start": {
1287 "column": 17, 1113 "column": 17,
1288 "line": 24 1114 "line": 21
1289 } 1115 }
1290 }, 1116 },
1291 { 1117 {
1292 "defaultMessage": "!!!Disable notifications & audio", 1118 "defaultMessage": "!!!Disable notifications & audio",
1293 "end": { 1119 "end": {
1294 "column": 3, 1120 "column": 3,
1295 "line": 31 1121 "line": 28
1296 }, 1122 },
1297 "file": "src/components/layout/Sidebar.js", 1123 "file": "src/components/layout/Sidebar.js",
1298 "id": "sidebar.muteApp", 1124 "id": "sidebar.muteApp",
1299 "start": { 1125 "start": {
1300 "column": 8, 1126 "column": 8,
1301 "line": 28 1127 "line": 25
1302 } 1128 }
1303 }, 1129 },
1304 { 1130 {
1305 "defaultMessage": "!!!Enable notifications & audio", 1131 "defaultMessage": "!!!Enable notifications & audio",
1306 "end": { 1132 "end": {
1307 "column": 3, 1133 "column": 3,
1308 "line": 35 1134 "line": 32
1309 }, 1135 },
1310 "file": "src/components/layout/Sidebar.js", 1136 "file": "src/components/layout/Sidebar.js",
1311 "id": "sidebar.unmuteApp", 1137 "id": "sidebar.unmuteApp",
1312 "start": { 1138 "start": {
1313 "column": 10, 1139 "column": 10,
1314 "line": 32 1140 "line": 29
1315 } 1141 }
1316 }, 1142 },
1317 { 1143 {
1318 "defaultMessage": "!!!Open workspace drawer", 1144 "defaultMessage": "!!!Open workspace drawer",
1319 "end": { 1145 "end": {
1320 "column": 3, 1146 "column": 3,
1321 "line": 39 1147 "line": 36
1322 }, 1148 },
1323 "file": "src/components/layout/Sidebar.js", 1149 "file": "src/components/layout/Sidebar.js",
1324 "id": "sidebar.openWorkspaceDrawer", 1150 "id": "sidebar.openWorkspaceDrawer",
1325 "start": { 1151 "start": {
1326 "column": 23, 1152 "column": 23,
1327 "line": 36 1153 "line": 33
1328 } 1154 }
1329 }, 1155 },
1330 { 1156 {
1331 "defaultMessage": "!!!Close workspace drawer", 1157 "defaultMessage": "!!!Close workspace drawer",
1332 "end": { 1158 "end": {
1333 "column": 3, 1159 "column": 3,
1334 "line": 43 1160 "line": 40
1335 }, 1161 },
1336 "file": "src/components/layout/Sidebar.js", 1162 "file": "src/components/layout/Sidebar.js",
1337 "id": "sidebar.closeWorkspaceDrawer", 1163 "id": "sidebar.closeWorkspaceDrawer",
1338 "start": { 1164 "start": {
1339 "column": 24, 1165 "column": 24,
1340 "line": 40 1166 "line": 37
1341 } 1167 }
1342 }, 1168 },
1343 { 1169 {
1344 "defaultMessage": "!!!Open Franz Todos", 1170 "defaultMessage": "!!!Open Franz Todos",
1345 "end": { 1171 "end": {
1346 "column": 3, 1172 "column": 3,
1347 "line": 47 1173 "line": 44
1348 }, 1174 },
1349 "file": "src/components/layout/Sidebar.js", 1175 "file": "src/components/layout/Sidebar.js",
1350 "id": "sidebar.openTodosDrawer", 1176 "id": "sidebar.openTodosDrawer",
1351 "start": { 1177 "start": {
1352 "column": 19, 1178 "column": 19,
1353 "line": 44 1179 "line": 41
1354 } 1180 }
1355 }, 1181 },
1356 { 1182 {
1357 "defaultMessage": "!!!Close Franz Todos", 1183 "defaultMessage": "!!!Close Franz Todos",
1358 "end": { 1184 "end": {
1359 "column": 3, 1185 "column": 3,
1360 "line": 51 1186 "line": 48
1361 }, 1187 },
1362 "file": "src/components/layout/Sidebar.js", 1188 "file": "src/components/layout/Sidebar.js",
1363 "id": "sidebar.closeTodosDrawer", 1189 "id": "sidebar.closeTodosDrawer",
1364 "start": { 1190 "start": {
1365 "column": 20, 1191 "column": 20,
1366 "line": 48 1192 "line": 45
1367 } 1193 }
1368 }, 1194 },
1369 { 1195 {
1370 "defaultMessage": "!!!Lock Ferdi", 1196 "defaultMessage": "!!!Lock Ferdi",
1371 "end": { 1197 "end": {
1372 "column": 3, 1198 "column": 3,
1373 "line": 55 1199 "line": 52
1374 }, 1200 },
1375 "file": "src/components/layout/Sidebar.js", 1201 "file": "src/components/layout/Sidebar.js",
1376 "id": "sidebar.lockFerdi", 1202 "id": "sidebar.lockFerdi",
1377 "start": { 1203 "start": {
1378 "column": 13, 1204 "column": 13,
1379 "line": 52 1205 "line": 49
1380 } 1206 }
1381 } 1207 }
1382 ], 1208 ],
@@ -1528,39 +1354,39 @@
1528 "defaultMessage": "!!!Oh no! Ferdi lost the connection to {name}.", 1354 "defaultMessage": "!!!Oh no! Ferdi lost the connection to {name}.",
1529 "end": { 1355 "end": {
1530 "column": 3, 1356 "column": 3,
1531 "line": 18 1357 "line": 16
1532 }, 1358 },
1533 "file": "src/components/services/content/ConnectionLostBanner.js", 1359 "file": "src/components/services/content/ConnectionLostBanner.js",
1534 "id": "connectionLostBanner.message", 1360 "id": "connectionLostBanner.message",
1535 "start": { 1361 "start": {
1536 "column": 8, 1362 "column": 8,
1537 "line": 15 1363 "line": 13
1538 } 1364 }
1539 }, 1365 },
1540 { 1366 {
1541 "defaultMessage": "!!!What happened?", 1367 "defaultMessage": "!!!What happened?",
1542 "end": { 1368 "end": {
1543 "column": 3, 1369 "column": 3,
1544 "line": 22 1370 "line": 20
1545 }, 1371 },
1546 "file": "src/components/services/content/ConnectionLostBanner.js", 1372 "file": "src/components/services/content/ConnectionLostBanner.js",
1547 "id": "connectionLostBanner.informationLink", 1373 "id": "connectionLostBanner.informationLink",
1548 "start": { 1374 "start": {
1549 "column": 19, 1375 "column": 19,
1550 "line": 19 1376 "line": 17
1551 } 1377 }
1552 }, 1378 },
1553 { 1379 {
1554 "defaultMessage": "!!!Reload Service", 1380 "defaultMessage": "!!!Reload Service",
1555 "end": { 1381 "end": {
1556 "column": 3, 1382 "column": 3,
1557 "line": 26 1383 "line": 24
1558 }, 1384 },
1559 "file": "src/components/services/content/ConnectionLostBanner.js", 1385 "file": "src/components/services/content/ConnectionLostBanner.js",
1560 "id": "connectionLostBanner.cta", 1386 "id": "connectionLostBanner.cta",
1561 "start": { 1387 "start": {
1562 "column": 7, 1388 "column": 7,
1563 "line": 23 1389 "line": 21
1564 } 1390 }
1565 } 1391 }
1566 ], 1392 ],
@@ -1670,76 +1496,6 @@
1670 { 1496 {
1671 "descriptors": [ 1497 "descriptors": [
1672 { 1498 {
1673 "defaultMessage": "!!!You have reached your service limit.",
1674 "end": {
1675 "column": 3,
1676 "line": 14
1677 },
1678 "file": "src/components/services/content/ServiceRestricted.js",
1679 "id": "service.restrictedHandler.serviceLimit.headline",
1680 "start": {
1681 "column": 24,
1682 "line": 11
1683 }
1684 },
1685 {
1686 "defaultMessage": "!!!Please upgrade your account to use more than {count} services.",
1687 "end": {
1688 "column": 3,
1689 "line": 18
1690 },
1691 "file": "src/components/services/content/ServiceRestricted.js",
1692 "id": "service.restrictedHandler.serviceLimit.text",
1693 "start": {
1694 "column": 20,
1695 "line": 15
1696 }
1697 },
1698 {
1699 "defaultMessage": "!!!Franz Professional Plan required",
1700 "end": {
1701 "column": 3,
1702 "line": 22
1703 },
1704 "file": "src/components/services/content/ServiceRestricted.js",
1705 "id": "service.restrictedHandler.customUrl.headline",
1706 "start": {
1707 "column": 21,
1708 "line": 19
1709 }
1710 },
1711 {
1712 "defaultMessage": "!!!Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
1713 "end": {
1714 "column": 3,
1715 "line": 26
1716 },
1717 "file": "src/components/services/content/ServiceRestricted.js",
1718 "id": "service.restrictedHandler.customUrl.text",
1719 "start": {
1720 "column": 17,
1721 "line": 23
1722 }
1723 },
1724 {
1725 "defaultMessage": "!!!Upgrade Account",
1726 "end": {
1727 "column": 3,
1728 "line": 30
1729 },
1730 "file": "src/components/services/content/ServiceRestricted.js",
1731 "id": "service.restrictedHandler.action",
1732 "start": {
1733 "column": 10,
1734 "line": 27
1735 }
1736 }
1737 ],
1738 "path": "src/components/services/content/ServiceRestricted.json"
1739 },
1740 {
1741 "descriptors": [
1742 {
1743 "defaultMessage": "!!!Welcome to Ferdi", 1499 "defaultMessage": "!!!Welcome to Ferdi",
1744 "end": { 1500 "end": {
1745 "column": 3, 1501 "column": 3,
@@ -1792,7 +1548,7 @@
1792 } 1548 }
1793 }, 1549 },
1794 { 1550 {
1795 "defaultMessage": "!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 1551 "defaultMessage": "!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
1796 "end": { 1552 "end": {
1797 "column": 3, 1553 "column": 3,
1798 "line": 34 1554 "line": 34
@@ -2015,333 +1771,268 @@
2015 } 1771 }
2016 }, 1772 },
2017 { 1773 {
2018 "defaultMessage": "!!!Disable Service", 1774 "defaultMessage": "!!!Enable Dark mode",
2019 "end": { 1775 "end": {
2020 "column": 3, 1776 "column": 3,
2021 "line": 47 1777 "line": 47
2022 }, 1778 },
2023 "file": "src/components/services/tabs/TabItem.js", 1779 "file": "src/components/services/tabs/TabItem.js",
2024 "id": "tabs.item.disableService", 1780 "id": "tabs.item.enableDarkMode",
2025 "start": { 1781 "start": {
2026 "column": 18, 1782 "column": 18,
2027 "line": 44 1783 "line": 44
2028 } 1784 }
2029 }, 1785 },
2030 { 1786 {
2031 "defaultMessage": "!!!Enable Service", 1787 "defaultMessage": "!!!Disable Dark mode",
2032 "end": { 1788 "end": {
2033 "column": 3, 1789 "column": 3,
2034 "line": 51 1790 "line": 51
2035 }, 1791 },
2036 "file": "src/components/services/tabs/TabItem.js", 1792 "file": "src/components/services/tabs/TabItem.js",
2037 "id": "tabs.item.enableService", 1793 "id": "tabs.item.disableDarkMode",
2038 "start": { 1794 "start": {
2039 "column": 17, 1795 "column": 19,
2040 "line": 48 1796 "line": 48
2041 } 1797 }
2042 }, 1798 },
2043 { 1799 {
2044 "defaultMessage": "!!!Delete Service", 1800 "defaultMessage": "!!!Disable Service",
2045 "end": { 1801 "end": {
2046 "column": 3, 1802 "column": 3,
2047 "line": 55 1803 "line": 55
2048 }, 1804 },
2049 "file": "src/components/services/tabs/TabItem.js", 1805 "file": "src/components/services/tabs/TabItem.js",
2050 "id": "tabs.item.deleteService", 1806 "id": "tabs.item.disableService",
2051 "start": { 1807 "start": {
2052 "column": 17, 1808 "column": 18,
2053 "line": 52 1809 "line": 52
2054 } 1810 }
2055 }, 1811 },
2056 { 1812 {
2057 "defaultMessage": "!!!Do you really want to delete the {serviceName} service?", 1813 "defaultMessage": "!!!Enable Service",
2058 "end": { 1814 "end": {
2059 "column": 3, 1815 "column": 3,
2060 "line": 59 1816 "line": 59
2061 }, 1817 },
2062 "file": "src/components/services/tabs/TabItem.js", 1818 "file": "src/components/services/tabs/TabItem.js",
2063 "id": "tabs.item.confirmDeleteService", 1819 "id": "tabs.item.enableService",
2064 "start": { 1820 "start": {
2065 "column": 24, 1821 "column": 17,
2066 "line": 56 1822 "line": 56
2067 } 1823 }
2068 }
2069 ],
2070 "path": "src/components/services/tabs/TabItem.json"
2071 },
2072 {
2073 "descriptors": [
2074 {
2075 "defaultMessage": "!!!Account",
2076 "end": {
2077 "column": 3,
2078 "line": 20
2079 },
2080 "file": "src/components/settings/account/AccountDashboard.js",
2081 "id": "settings.account.headline",
2082 "start": {
2083 "column": 12,
2084 "line": 17
2085 }
2086 }, 1824 },
2087 { 1825 {
2088 "defaultMessage": "!!!Your Subscription", 1826 "defaultMessage": "!!!Hibernate Service",
2089 "end": { 1827 "end": {
2090 "column": 3, 1828 "column": 3,
2091 "line": 24 1829 "line": 63
2092 }, 1830 },
2093 "file": "src/components/settings/account/AccountDashboard.js", 1831 "file": "src/components/services/tabs/TabItem.js",
2094 "id": "settings.account.headlineSubscription", 1832 "id": "tabs.item.hibernateService",
2095 "start": { 1833 "start": {
2096 "column": 24, 1834 "column": 20,
2097 "line": 21 1835 "line": 60
2098 } 1836 }
2099 }, 1837 },
2100 { 1838 {
2101 "defaultMessage": "!!Danger Zone", 1839 "defaultMessage": "!!!Wake Up Service",
2102 "end": { 1840 "end": {
2103 "column": 3, 1841 "column": 3,
2104 "line": 28 1842 "line": 67
2105 }, 1843 },
2106 "file": "src/components/settings/account/AccountDashboard.js", 1844 "file": "src/components/services/tabs/TabItem.js",
2107 "id": "settings.account.headlineDangerZone", 1845 "id": "tabs.item.wakeUpService",
2108 "start": { 1846 "start": {
2109 "column": 22, 1847 "column": 17,
2110 "line": 25 1848 "line": 64
2111 } 1849 }
2112 }, 1850 },
2113 { 1851 {
2114 "defaultMessage": "!!!Manage your subscription", 1852 "defaultMessage": "!!!Delete Service",
2115 "end": { 1853 "end": {
2116 "column": 3, 1854 "column": 3,
2117 "line": 32 1855 "line": 71
2118 }, 1856 },
2119 "file": "src/components/settings/account/AccountDashboard.js", 1857 "file": "src/components/services/tabs/TabItem.js",
2120 "id": "settings.account.manageSubscription.label", 1858 "id": "tabs.item.deleteService",
2121 "start": { 1859 "start": {
2122 "column": 33, 1860 "column": 17,
2123 "line": 29 1861 "line": 68
2124 } 1862 }
2125 }, 1863 },
2126 { 1864 {
2127 "defaultMessage": "!!!Upgrade to Franz Professional", 1865 "defaultMessage": "!!!Do you really want to delete the {serviceName} service?",
2128 "end": { 1866 "end": {
2129 "column": 3, 1867 "column": 3,
2130 "line": 36 1868 "line": 76
2131 }, 1869 },
2132 "file": "src/components/settings/account/AccountDashboard.js", 1870 "file": "src/components/services/tabs/TabItem.js",
2133 "id": "settings.account.upgradeToPro.label", 1871 "id": "tabs.item.confirmDeleteService",
2134 "start": { 1872 "start": {
2135 "column": 23, 1873 "column": 24,
2136 "line": 33 1874 "line": 72
2137 } 1875 }
2138 }, 1876 }
1877 ],
1878 "path": "src/components/services/tabs/TabItem.json"
1879 },
1880 {
1881 "descriptors": [
2139 { 1882 {
2140 "defaultMessage": "!!!Basic Account", 1883 "defaultMessage": "!!!Account",
2141 "end": { 1884 "end": {
2142 "column": 3, 1885 "column": 3,
2143 "line": 40 1886 "line": 17
2144 }, 1887 },
2145 "file": "src/components/settings/account/AccountDashboard.js", 1888 "file": "src/components/settings/account/AccountDashboard.js",
2146 "id": "settings.account.accountType.basic", 1889 "id": "settings.account.headline",
2147 "start": { 1890 "start": {
2148 "column": 20, 1891 "column": 12,
2149 "line": 37 1892 "line": 14
2150 } 1893 }
2151 }, 1894 },
2152 { 1895 {
2153 "defaultMessage": "!!!Premium Supporter Account", 1896 "defaultMessage": "!!Danger Zone",
2154 "end": { 1897 "end": {
2155 "column": 3, 1898 "column": 3,
2156 "line": 44 1899 "line": 21
2157 }, 1900 },
2158 "file": "src/components/settings/account/AccountDashboard.js", 1901 "file": "src/components/settings/account/AccountDashboard.js",
2159 "id": "settings.account.accountType.premium", 1902 "id": "settings.account.headlineDangerZone",
2160 "start": { 1903 "start": {
2161 "column": 22, 1904 "column": 22,
2162 "line": 41 1905 "line": 18
2163 } 1906 }
2164 }, 1907 },
2165 { 1908 {
2166 "defaultMessage": "!!!Edit Account", 1909 "defaultMessage": "!!!Edit Account",
2167 "end": { 1910 "end": {
2168 "column": 3, 1911 "column": 3,
2169 "line": 48 1912 "line": 25
2170 }, 1913 },
2171 "file": "src/components/settings/account/AccountDashboard.js", 1914 "file": "src/components/settings/account/AccountDashboard.js",
2172 "id": "settings.account.account.editButton", 1915 "id": "settings.account.account.editButton",
2173 "start": { 1916 "start": {
2174 "column": 21, 1917 "column": 21,
2175 "line": 45 1918 "line": 22
2176 } 1919 }
2177 }, 1920 },
2178 { 1921 {
2179 "defaultMessage": "!!Invoices", 1922 "defaultMessage": "!!Invoices",
2180 "end": { 1923 "end": {
2181 "column": 3, 1924 "column": 3,
2182 "line": 52 1925 "line": 29
2183 }, 1926 },
2184 "file": "src/components/settings/account/AccountDashboard.js", 1927 "file": "src/components/settings/account/AccountDashboard.js",
2185 "id": "settings.account.headlineInvoices", 1928 "id": "settings.account.headlineInvoices",
2186 "start": { 1929 "start": {
2187 "column": 18, 1930 "column": 18,
2188 "line": 49 1931 "line": 26
2189 }
2190 },
2191 {
2192 "defaultMessage": "!!!Download",
2193 "end": {
2194 "column": 3,
2195 "line": 56
2196 },
2197 "file": "src/components/settings/account/AccountDashboard.js",
2198 "id": "settings.account.invoiceDownload",
2199 "start": {
2200 "column": 19,
2201 "line": 53
2202 } 1932 }
2203 }, 1933 },
2204 { 1934 {
2205 "defaultMessage": "!!!Could not load user information", 1935 "defaultMessage": "!!!Could not load user information",
2206 "end": { 1936 "end": {
2207 "column": 3, 1937 "column": 3,
2208 "line": 60 1938 "line": 33
2209 }, 1939 },
2210 "file": "src/components/settings/account/AccountDashboard.js", 1940 "file": "src/components/settings/account/AccountDashboard.js",
2211 "id": "settings.account.userInfoRequestFailed", 1941 "id": "settings.account.userInfoRequestFailed",
2212 "start": { 1942 "start": {
2213 "column": 25, 1943 "column": 25,
2214 "line": 57 1944 "line": 30
2215 } 1945 }
2216 }, 1946 },
2217 { 1947 {
2218 "defaultMessage": "!!!Try again", 1948 "defaultMessage": "!!!Try again",
2219 "end": { 1949 "end": {
2220 "column": 3, 1950 "column": 3,
2221 "line": 64 1951 "line": 37
2222 }, 1952 },
2223 "file": "src/components/settings/account/AccountDashboard.js", 1953 "file": "src/components/settings/account/AccountDashboard.js",
2224 "id": "settings.account.tryReloadUserInfoRequest", 1954 "id": "settings.account.tryReloadUserInfoRequest",
2225 "start": { 1955 "start": {
2226 "column": 28, 1956 "column": 28,
2227 "line": 61 1957 "line": 34
2228 } 1958 }
2229 }, 1959 },
2230 { 1960 {
2231 "defaultMessage": "!!!Delete account", 1961 "defaultMessage": "!!!Delete account",
2232 "end": { 1962 "end": {
2233 "column": 3, 1963 "column": 3,
2234 "line": 68 1964 "line": 41
2235 }, 1965 },
2236 "file": "src/components/settings/account/AccountDashboard.js", 1966 "file": "src/components/settings/account/AccountDashboard.js",
2237 "id": "settings.account.deleteAccount", 1967 "id": "settings.account.deleteAccount",
2238 "start": { 1968 "start": {
2239 "column": 17, 1969 "column": 17,
2240 "line": 65 1970 "line": 38
2241 } 1971 }
2242 }, 1972 },
2243 { 1973 {
2244 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.", 1974 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.",
2245 "end": { 1975 "end": {
2246 "column": 3, 1976 "column": 3,
2247 "line": 73 1977 "line": 46
2248 }, 1978 },
2249 "file": "src/components/settings/account/AccountDashboard.js", 1979 "file": "src/components/settings/account/AccountDashboard.js",
2250 "id": "settings.account.deleteInfo", 1980 "id": "settings.account.deleteInfo",
2251 "start": { 1981 "start": {
2252 "column": 14, 1982 "column": 14,
2253 "line": 69 1983 "line": 42
2254 } 1984 }
2255 }, 1985 },
2256 { 1986 {
2257 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 1987 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
2258 "end": { 1988 "end": {
2259 "column": 3, 1989 "column": 3,
2260 "line": 78 1990 "line": 51
2261 }, 1991 },
2262 "file": "src/components/settings/account/AccountDashboard.js", 1992 "file": "src/components/settings/account/AccountDashboard.js",
2263 "id": "settings.account.deleteEmailSent", 1993 "id": "settings.account.deleteEmailSent",
2264 "start": { 1994 "start": {
2265 "column": 19, 1995 "column": 19,
2266 "line": 74 1996 "line": 47
2267 }
2268 },
2269 {
2270 "defaultMessage": "!!!Free Trial",
2271 "end": {
2272 "column": 3,
2273 "line": 82
2274 },
2275 "file": "src/components/settings/account/AccountDashboard.js",
2276 "id": "settings.account.trial",
2277 "start": {
2278 "column": 9,
2279 "line": 79
2280 } 1997 }
2281 }, 1998 },
2282 { 1999 {
2283 "defaultMessage": "!!!Your Franz License:", 2000 "defaultMessage": "!!!Your Franz License:",
2284 "end": { 2001 "end": {
2285 "column": 3, 2002 "column": 3,
2286 "line": 86 2003 "line": 55
2287 }, 2004 },
2288 "file": "src/components/settings/account/AccountDashboard.js", 2005 "file": "src/components/settings/account/AccountDashboard.js",
2289 "id": "settings.account.yourLicense", 2006 "id": "settings.account.yourLicense",
2290 "start": { 2007 "start": {
2291 "column": 15, 2008 "column": 15,
2292 "line": 83 2009 "line": 52
2293 }
2294 },
2295 {
2296 "defaultMessage": "!!!Your free trial ends in {duration}.",
2297 "end": {
2298 "column": 3,
2299 "line": 90
2300 },
2301 "file": "src/components/settings/account/AccountDashboard.js",
2302 "id": "settings.account.trialEndsIn",
2303 "start": {
2304 "column": 15,
2305 "line": 87
2306 }
2307 },
2308 {
2309 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
2310 "end": {
2311 "column": 3,
2312 "line": 95
2313 },
2314 "file": "src/components/settings/account/AccountDashboard.js",
2315 "id": "settings.account.trialUpdateBillingInfo",
2316 "start": {
2317 "column": 33,
2318 "line": 91
2319 } 2010 }
2320 }, 2011 },
2321 { 2012 {
2322 "defaultMessage": "Account is unavailable", 2013 "defaultMessage": "Account is unavailable",
2323 "end": { 2014 "end": {
2324 "column": 3, 2015 "column": 3,
2325 "line": 99 2016 "line": 59
2326 }, 2017 },
2327 "file": "src/components/settings/account/AccountDashboard.js", 2018 "file": "src/components/settings/account/AccountDashboard.js",
2328 "id": "settings.account.accountUnavailable", 2019 "id": "settings.account.accountUnavailable",
2329 "start": { 2020 "start": {
2330 "column": 22, 2021 "column": 22,
2331 "line": 96 2022 "line": 56
2332 } 2023 }
2333 }, 2024 },
2334 { 2025 {
2335 "defaultMessage": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 2026 "defaultMessage": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
2336 "end": { 2027 "end": {
2337 "column": 3, 2028 "column": 3,
2338 "line": 103 2029 "line": 63
2339 }, 2030 },
2340 "file": "src/components/settings/account/AccountDashboard.js", 2031 "file": "src/components/settings/account/AccountDashboard.js",
2341 "id": "settings.account.accountUnavailableInfo", 2032 "id": "settings.account.accountUnavailableInfo",
2342 "start": { 2033 "start": {
2343 "column": 26, 2034 "column": 26,
2344 "line": 100 2035 "line": 60
2345 } 2036 }
2346 } 2037 }
2347 ], 2038 ],
@@ -2353,104 +2044,104 @@
2353 "defaultMessage": "!!!Available services", 2044 "defaultMessage": "!!!Available services",
2354 "end": { 2045 "end": {
2355 "column": 3, 2046 "column": 3,
2356 "line": 20 2047 "line": 18
2357 }, 2048 },
2358 "file": "src/components/settings/navigation/SettingsNavigation.js", 2049 "file": "src/components/settings/navigation/SettingsNavigation.js",
2359 "id": "settings.navigation.availableServices", 2050 "id": "settings.navigation.availableServices",
2360 "start": { 2051 "start": {
2361 "column": 21, 2052 "column": 21,
2362 "line": 17 2053 "line": 15
2363 } 2054 }
2364 }, 2055 },
2365 { 2056 {
2366 "defaultMessage": "!!!Your services", 2057 "defaultMessage": "!!!Your services",
2367 "end": { 2058 "end": {
2368 "column": 3, 2059 "column": 3,
2369 "line": 24 2060 "line": 22
2370 }, 2061 },
2371 "file": "src/components/settings/navigation/SettingsNavigation.js", 2062 "file": "src/components/settings/navigation/SettingsNavigation.js",
2372 "id": "settings.navigation.yourServices", 2063 "id": "settings.navigation.yourServices",
2373 "start": { 2064 "start": {
2374 "column": 16, 2065 "column": 16,
2375 "line": 21 2066 "line": 19
2376 } 2067 }
2377 }, 2068 },
2378 { 2069 {
2379 "defaultMessage": "!!!Your workspaces", 2070 "defaultMessage": "!!!Your workspaces",
2380 "end": { 2071 "end": {
2381 "column": 3, 2072 "column": 3,
2382 "line": 28 2073 "line": 26
2383 }, 2074 },
2384 "file": "src/components/settings/navigation/SettingsNavigation.js", 2075 "file": "src/components/settings/navigation/SettingsNavigation.js",
2385 "id": "settings.navigation.yourWorkspaces", 2076 "id": "settings.navigation.yourWorkspaces",
2386 "start": { 2077 "start": {
2387 "column": 18, 2078 "column": 18,
2388 "line": 25 2079 "line": 23
2389 } 2080 }
2390 }, 2081 },
2391 { 2082 {
2392 "defaultMessage": "!!!Account", 2083 "defaultMessage": "!!!Account",
2393 "end": { 2084 "end": {
2394 "column": 3, 2085 "column": 3,
2395 "line": 32 2086 "line": 30
2396 }, 2087 },
2397 "file": "src/components/settings/navigation/SettingsNavigation.js", 2088 "file": "src/components/settings/navigation/SettingsNavigation.js",
2398 "id": "settings.navigation.account", 2089 "id": "settings.navigation.account",
2399 "start": { 2090 "start": {
2400 "column": 11, 2091 "column": 11,
2401 "line": 29 2092 "line": 27
2402 } 2093 }
2403 }, 2094 },
2404 { 2095 {
2405 "defaultMessage": "!!!Manage Team", 2096 "defaultMessage": "!!!Manage Team",
2406 "end": { 2097 "end": {
2407 "column": 3, 2098 "column": 3,
2408 "line": 36 2099 "line": 34
2409 }, 2100 },
2410 "file": "src/components/settings/navigation/SettingsNavigation.js", 2101 "file": "src/components/settings/navigation/SettingsNavigation.js",
2411 "id": "settings.navigation.team", 2102 "id": "settings.navigation.team",
2412 "start": { 2103 "start": {
2413 "column": 8, 2104 "column": 8,
2414 "line": 33 2105 "line": 31
2415 } 2106 }
2416 }, 2107 },
2417 { 2108 {
2418 "defaultMessage": "!!!Settings", 2109 "defaultMessage": "!!!Settings",
2419 "end": { 2110 "end": {
2420 "column": 3, 2111 "column": 3,
2421 "line": 40 2112 "line": 38
2422 }, 2113 },
2423 "file": "src/components/settings/navigation/SettingsNavigation.js", 2114 "file": "src/components/settings/navigation/SettingsNavigation.js",
2424 "id": "settings.navigation.settings", 2115 "id": "settings.navigation.settings",
2425 "start": { 2116 "start": {
2426 "column": 12, 2117 "column": 12,
2427 "line": 37 2118 "line": 35
2428 } 2119 }
2429 }, 2120 },
2430 { 2121 {
2431 "defaultMessage": "!!!About Ferdi", 2122 "defaultMessage": "!!!About Ferdi",
2432 "end": { 2123 "end": {
2433 "column": 3, 2124 "column": 3,
2434 "line": 44 2125 "line": 42
2435 }, 2126 },
2436 "file": "src/components/settings/navigation/SettingsNavigation.js", 2127 "file": "src/components/settings/navigation/SettingsNavigation.js",
2437 "id": "settings.navigation.supportFerdi", 2128 "id": "settings.navigation.supportFerdi",
2438 "start": { 2129 "start": {
2439 "column": 16, 2130 "column": 16,
2440 "line": 41 2131 "line": 39
2441 } 2132 }
2442 }, 2133 },
2443 { 2134 {
2444 "defaultMessage": "!!!Logout", 2135 "defaultMessage": "!!!Logout",
2445 "end": { 2136 "end": {
2446 "column": 3, 2137 "column": 3,
2447 "line": 48 2138 "line": 46
2448 }, 2139 },
2449 "file": "src/components/settings/navigation/SettingsNavigation.js", 2140 "file": "src/components/settings/navigation/SettingsNavigation.js",
2450 "id": "settings.navigation.logout", 2141 "id": "settings.navigation.logout",
2451 "start": { 2142 "start": {
2452 "column": 10, 2143 "column": 10,
2453 "line": 45 2144 "line": 43
2454 } 2145 }
2455 } 2146 }
2456 ], 2147 ],
@@ -2462,182 +2153,169 @@
2462 "defaultMessage": "!!!Available Services", 2153 "defaultMessage": "!!!Available Services",
2463 "end": { 2154 "end": {
2464 "column": 3, 2155 "column": 3,
2465 "line": 24 2156 "line": 22
2466 }, 2157 },
2467 "file": "src/components/settings/recipes/RecipesDashboard.js", 2158 "file": "src/components/settings/recipes/RecipesDashboard.js",
2468 "id": "settings.recipes.headline", 2159 "id": "settings.recipes.headline",
2469 "start": { 2160 "start": {
2470 "column": 12, 2161 "column": 12,
2471 "line": 21 2162 "line": 19
2472 } 2163 }
2473 }, 2164 },
2474 { 2165 {
2475 "defaultMessage": "!!!Search service", 2166 "defaultMessage": "!!!Search service",
2476 "end": { 2167 "end": {
2477 "column": 3, 2168 "column": 3,
2478 "line": 28 2169 "line": 26
2479 }, 2170 },
2480 "file": "src/components/settings/recipes/RecipesDashboard.js", 2171 "file": "src/components/settings/recipes/RecipesDashboard.js",
2481 "id": "settings.searchService", 2172 "id": "settings.searchService",
2482 "start": { 2173 "start": {
2483 "column": 17, 2174 "column": 17,
2484 "line": 25 2175 "line": 23
2485 }
2486 },
2487 {
2488 "defaultMessage": "!!!Most popular",
2489 "end": {
2490 "column": 3,
2491 "line": 32
2492 },
2493 "file": "src/components/settings/recipes/RecipesDashboard.js",
2494 "id": "settings.recipes.mostPopular",
2495 "start": {
2496 "column": 22,
2497 "line": 29
2498 } 2176 }
2499 }, 2177 },
2500 { 2178 {
2501 "defaultMessage": "!!!All services", 2179 "defaultMessage": "!!!All services",
2502 "end": { 2180 "end": {
2503 "column": 3, 2181 "column": 3,
2504 "line": 36 2182 "line": 30
2505 }, 2183 },
2506 "file": "src/components/settings/recipes/RecipesDashboard.js", 2184 "file": "src/components/settings/recipes/RecipesDashboard.js",
2507 "id": "settings.recipes.all", 2185 "id": "settings.recipes.all",
2508 "start": { 2186 "start": {
2509 "column": 14, 2187 "column": 14,
2510 "line": 33 2188 "line": 27
2511 } 2189 }
2512 }, 2190 },
2513 { 2191 {
2514 "defaultMessage": "!!!Custom Services", 2192 "defaultMessage": "!!!Custom Services",
2515 "end": { 2193 "end": {
2516 "column": 3, 2194 "column": 3,
2517 "line": 40 2195 "line": 34
2518 }, 2196 },
2519 "file": "src/components/settings/recipes/RecipesDashboard.js", 2197 "file": "src/components/settings/recipes/RecipesDashboard.js",
2520 "id": "settings.recipes.custom", 2198 "id": "settings.recipes.custom",
2521 "start": { 2199 "start": {
2522 "column": 17, 2200 "column": 17,
2523 "line": 37 2201 "line": 31
2524 } 2202 }
2525 }, 2203 },
2526 { 2204 {
2527 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 2205 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
2528 "end": { 2206 "end": {
2529 "column": 3, 2207 "column": 3,
2530 "line": 44 2208 "line": 38
2531 }, 2209 },
2532 "file": "src/components/settings/recipes/RecipesDashboard.js", 2210 "file": "src/components/settings/recipes/RecipesDashboard.js",
2533 "id": "settings.recipes.nothingFound", 2211 "id": "settings.recipes.nothingFound",
2534 "start": { 2212 "start": {
2535 "column": 16, 2213 "column": 16,
2536 "line": 41 2214 "line": 35
2537 } 2215 }
2538 }, 2216 },
2539 { 2217 {
2540 "defaultMessage": "!!!Service successfully added", 2218 "defaultMessage": "!!!Service successfully added",
2541 "end": { 2219 "end": {
2542 "column": 3, 2220 "column": 3,
2543 "line": 48 2221 "line": 42
2544 }, 2222 },
2545 "file": "src/components/settings/recipes/RecipesDashboard.js", 2223 "file": "src/components/settings/recipes/RecipesDashboard.js",
2546 "id": "settings.recipes.servicesSuccessfulAddedInfo", 2224 "id": "settings.recipes.servicesSuccessfulAddedInfo",
2547 "start": { 2225 "start": {
2548 "column": 31, 2226 "column": 31,
2549 "line": 45 2227 "line": 39
2550 } 2228 }
2551 }, 2229 },
2552 { 2230 {
2553 "defaultMessage": "!!!Missing a service?", 2231 "defaultMessage": "!!!Missing a service?",
2554 "end": { 2232 "end": {
2555 "column": 3, 2233 "column": 3,
2556 "line": 52 2234 "line": 46
2557 }, 2235 },
2558 "file": "src/components/settings/recipes/RecipesDashboard.js", 2236 "file": "src/components/settings/recipes/RecipesDashboard.js",
2559 "id": "settings.recipes.missingService", 2237 "id": "settings.recipes.missingService",
2560 "start": { 2238 "start": {
2561 "column": 18, 2239 "column": 18,
2562 "line": 49 2240 "line": 43
2563 } 2241 }
2564 }, 2242 },
2565 { 2243 {
2566 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:", 2244 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:",
2567 "end": { 2245 "end": {
2568 "column": 3, 2246 "column": 3,
2569 "line": 56 2247 "line": 50
2570 }, 2248 },
2571 "file": "src/components/settings/recipes/RecipesDashboard.js", 2249 "file": "src/components/settings/recipes/RecipesDashboard.js",
2572 "id": "settings.recipes.customService.intro", 2250 "id": "settings.recipes.customService.intro",
2573 "start": { 2251 "start": {
2574 "column": 21, 2252 "column": 21,
2575 "line": 53 2253 "line": 47
2576 } 2254 }
2577 }, 2255 },
2578 { 2256 {
2579 "defaultMessage": "!!!Open directory", 2257 "defaultMessage": "!!!Open directory",
2580 "end": { 2258 "end": {
2581 "column": 3, 2259 "column": 3,
2582 "line": 60 2260 "line": 54
2583 }, 2261 },
2584 "file": "src/components/settings/recipes/RecipesDashboard.js", 2262 "file": "src/components/settings/recipes/RecipesDashboard.js",
2585 "id": "settings.recipes.customService.openFolder", 2263 "id": "settings.recipes.customService.openFolder",
2586 "start": { 2264 "start": {
2587 "column": 14, 2265 "column": 14,
2588 "line": 57 2266 "line": 51
2589 } 2267 }
2590 }, 2268 },
2591 { 2269 {
2592 "defaultMessage": "!!!Developer Documentation", 2270 "defaultMessage": "!!!Developer Documentation",
2593 "end": { 2271 "end": {
2594 "column": 3, 2272 "column": 3,
2595 "line": 64 2273 "line": 58
2596 }, 2274 },
2597 "file": "src/components/settings/recipes/RecipesDashboard.js", 2275 "file": "src/components/settings/recipes/RecipesDashboard.js",
2598 "id": "settings.recipes.customService.openDevDocs", 2276 "id": "settings.recipes.customService.openDevDocs",
2599 "start": { 2277 "start": {
2600 "column": 15, 2278 "column": 15,
2601 "line": 61 2279 "line": 55
2602 } 2280 }
2603 }, 2281 },
2604 { 2282 {
2605 "defaultMessage": "!!!Custom 3rd Party Recipes", 2283 "defaultMessage": "!!!Custom 3rd Party Recipes",
2606 "end": { 2284 "end": {
2607 "column": 3, 2285 "column": 3,
2608 "line": 68 2286 "line": 62
2609 }, 2287 },
2610 "file": "src/components/settings/recipes/RecipesDashboard.js", 2288 "file": "src/components/settings/recipes/RecipesDashboard.js",
2611 "id": "settings.recipes.customService.headline.customRecipes", 2289 "id": "settings.recipes.customService.headline.customRecipes",
2612 "start": { 2290 "start": {
2613 "column": 25, 2291 "column": 25,
2614 "line": 65 2292 "line": 59
2615 } 2293 }
2616 }, 2294 },
2617 { 2295 {
2618 "defaultMessage": "!!!Community 3rd Party Recipes", 2296 "defaultMessage": "!!!Community 3rd Party Recipes",
2619 "end": { 2297 "end": {
2620 "column": 3, 2298 "column": 3,
2621 "line": 72 2299 "line": 66
2622 }, 2300 },
2623 "file": "src/components/settings/recipes/RecipesDashboard.js", 2301 "file": "src/components/settings/recipes/RecipesDashboard.js",
2624 "id": "settings.recipes.customService.headline.communityRecipes", 2302 "id": "settings.recipes.customService.headline.communityRecipes",
2625 "start": { 2303 "start": {
2626 "column": 28, 2304 "column": 28,
2627 "line": 69 2305 "line": 63
2628 } 2306 }
2629 }, 2307 },
2630 { 2308 {
2631 "defaultMessage": "!!!Your Development Service Recipes", 2309 "defaultMessage": "!!!Your Development Service Recipes",
2632 "end": { 2310 "end": {
2633 "column": 3, 2311 "column": 3,
2634 "line": 76 2312 "line": 70
2635 }, 2313 },
2636 "file": "src/components/settings/recipes/RecipesDashboard.js", 2314 "file": "src/components/settings/recipes/RecipesDashboard.js",
2637 "id": "settings.recipes.customService.headline.devRecipes", 2315 "id": "settings.recipes.customService.headline.devRecipes",
2638 "start": { 2316 "start": {
2639 "column": 22, 2317 "column": 22,
2640 "line": 73 2318 "line": 67
2641 } 2319 }
2642 } 2320 }
2643 ], 2321 ],
@@ -2649,364 +2327,338 @@
2649 "defaultMessage": "!!!Save service", 2327 "defaultMessage": "!!!Save service",
2650 "end": { 2328 "end": {
2651 "column": 3, 2329 "column": 3,
2652 "line": 30 2330 "line": 26
2653 }, 2331 },
2654 "file": "src/components/settings/services/EditServiceForm.js", 2332 "file": "src/components/settings/services/EditServiceForm.js",
2655 "id": "settings.service.form.saveButton", 2333 "id": "settings.service.form.saveButton",
2656 "start": { 2334 "start": {
2657 "column": 15, 2335 "column": 15,
2658 "line": 27 2336 "line": 23
2659 } 2337 }
2660 }, 2338 },
2661 { 2339 {
2662 "defaultMessage": "!!!Delete Service", 2340 "defaultMessage": "!!!Delete Service",
2663 "end": { 2341 "end": {
2664 "column": 3, 2342 "column": 3,
2665 "line": 34 2343 "line": 30
2666 }, 2344 },
2667 "file": "src/components/settings/services/EditServiceForm.js", 2345 "file": "src/components/settings/services/EditServiceForm.js",
2668 "id": "settings.service.form.deleteButton", 2346 "id": "settings.service.form.deleteButton",
2669 "start": { 2347 "start": {
2670 "column": 17, 2348 "column": 17,
2671 "line": 31 2349 "line": 27
2672 } 2350 }
2673 }, 2351 },
2674 { 2352 {
2675 "defaultMessage": "!!!Open darkmode.css", 2353 "defaultMessage": "!!!Open darkmode.css",
2676 "end": { 2354 "end": {
2677 "column": 3, 2355 "column": 3,
2678 "line": 38 2356 "line": 34
2679 }, 2357 },
2680 "file": "src/components/settings/services/EditServiceForm.js", 2358 "file": "src/components/settings/services/EditServiceForm.js",
2681 "id": "settings.service.form.openDarkmodeCss", 2359 "id": "settings.service.form.openDarkmodeCss",
2682 "start": { 2360 "start": {
2683 "column": 19, 2361 "column": 19,
2684 "line": 35 2362 "line": 31
2685 } 2363 }
2686 }, 2364 },
2687 { 2365 {
2688 "defaultMessage": "!!!Open user.css", 2366 "defaultMessage": "!!!Open user.css",
2689 "end": { 2367 "end": {
2690 "column": 3, 2368 "column": 3,
2691 "line": 42 2369 "line": 38
2692 }, 2370 },
2693 "file": "src/components/settings/services/EditServiceForm.js", 2371 "file": "src/components/settings/services/EditServiceForm.js",
2694 "id": "settings.service.form.openUserCss", 2372 "id": "settings.service.form.openUserCss",
2695 "start": { 2373 "start": {
2696 "column": 15, 2374 "column": 15,
2697 "line": 39 2375 "line": 35
2698 } 2376 }
2699 }, 2377 },
2700 { 2378 {
2701 "defaultMessage": "!!!Open user.js", 2379 "defaultMessage": "!!!Open user.js",
2702 "end": { 2380 "end": {
2703 "column": 3, 2381 "column": 3,
2704 "line": 46 2382 "line": 42
2705 }, 2383 },
2706 "file": "src/components/settings/services/EditServiceForm.js", 2384 "file": "src/components/settings/services/EditServiceForm.js",
2707 "id": "settings.service.form.openUserJs", 2385 "id": "settings.service.form.openUserJs",
2708 "start": { 2386 "start": {
2709 "column": 14, 2387 "column": 14,
2710 "line": 43 2388 "line": 39
2711 } 2389 }
2712 }, 2390 },
2713 { 2391 {
2714 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.", 2392 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.",
2715 "end": { 2393 "end": {
2716 "column": 3, 2394 "column": 3,
2717 "line": 50 2395 "line": 46
2718 }, 2396 },
2719 "file": "src/components/settings/services/EditServiceForm.js", 2397 "file": "src/components/settings/services/EditServiceForm.js",
2720 "id": "settings.service.form.recipeFileInfo", 2398 "id": "settings.service.form.recipeFileInfo",
2721 "start": { 2399 "start": {
2722 "column": 18, 2400 "column": 18,
2723 "line": 47 2401 "line": 43
2724 } 2402 }
2725 }, 2403 },
2726 { 2404 {
2727 "defaultMessage": "!!!Available services", 2405 "defaultMessage": "!!!Available services",
2728 "end": { 2406 "end": {
2729 "column": 3, 2407 "column": 3,
2730 "line": 54 2408 "line": 50
2731 }, 2409 },
2732 "file": "src/components/settings/services/EditServiceForm.js", 2410 "file": "src/components/settings/services/EditServiceForm.js",
2733 "id": "settings.service.form.availableServices", 2411 "id": "settings.service.form.availableServices",
2734 "start": { 2412 "start": {
2735 "column": 21, 2413 "column": 21,
2736 "line": 51 2414 "line": 47
2737 } 2415 }
2738 }, 2416 },
2739 { 2417 {
2740 "defaultMessage": "!!!Your services", 2418 "defaultMessage": "!!!Your services",
2741 "end": { 2419 "end": {
2742 "column": 3, 2420 "column": 3,
2743 "line": 58 2421 "line": 54
2744 }, 2422 },
2745 "file": "src/components/settings/services/EditServiceForm.js", 2423 "file": "src/components/settings/services/EditServiceForm.js",
2746 "id": "settings.service.form.yourServices", 2424 "id": "settings.service.form.yourServices",
2747 "start": { 2425 "start": {
2748 "column": 16, 2426 "column": 16,
2749 "line": 55 2427 "line": 51
2750 } 2428 }
2751 }, 2429 },
2752 { 2430 {
2753 "defaultMessage": "!!!Add {name}", 2431 "defaultMessage": "!!!Add {name}",
2754 "end": { 2432 "end": {
2755 "column": 3, 2433 "column": 3,
2756 "line": 62 2434 "line": 58
2757 }, 2435 },
2758 "file": "src/components/settings/services/EditServiceForm.js", 2436 "file": "src/components/settings/services/EditServiceForm.js",
2759 "id": "settings.service.form.addServiceHeadline", 2437 "id": "settings.service.form.addServiceHeadline",
2760 "start": { 2438 "start": {
2761 "column": 22, 2439 "column": 22,
2762 "line": 59 2440 "line": 55
2763 } 2441 }
2764 }, 2442 },
2765 { 2443 {
2766 "defaultMessage": "!!!Edit {name}", 2444 "defaultMessage": "!!!Edit {name}",
2767 "end": { 2445 "end": {
2768 "column": 3, 2446 "column": 3,
2769 "line": 66 2447 "line": 62
2770 }, 2448 },
2771 "file": "src/components/settings/services/EditServiceForm.js", 2449 "file": "src/components/settings/services/EditServiceForm.js",
2772 "id": "settings.service.form.editServiceHeadline", 2450 "id": "settings.service.form.editServiceHeadline",
2773 "start": { 2451 "start": {
2774 "column": 23, 2452 "column": 23,
2775 "line": 63 2453 "line": 59
2776 } 2454 }
2777 }, 2455 },
2778 { 2456 {
2779 "defaultMessage": "!!!Hosted", 2457 "defaultMessage": "!!!Hosted",
2780 "end": { 2458 "end": {
2781 "column": 3, 2459 "column": 3,
2782 "line": 70 2460 "line": 66
2783 }, 2461 },
2784 "file": "src/components/settings/services/EditServiceForm.js", 2462 "file": "src/components/settings/services/EditServiceForm.js",
2785 "id": "settings.service.form.tabHosted", 2463 "id": "settings.service.form.tabHosted",
2786 "start": { 2464 "start": {
2787 "column": 13, 2465 "column": 13,
2788 "line": 67 2466 "line": 63
2789 } 2467 }
2790 }, 2468 },
2791 { 2469 {
2792 "defaultMessage": "!!!Self hosted ⭐️", 2470 "defaultMessage": "!!!Self hosted ⭐️",
2793 "end": { 2471 "end": {
2794 "column": 3, 2472 "column": 3,
2795 "line": 74 2473 "line": 70
2796 }, 2474 },
2797 "file": "src/components/settings/services/EditServiceForm.js", 2475 "file": "src/components/settings/services/EditServiceForm.js",
2798 "id": "settings.service.form.tabOnPremise", 2476 "id": "settings.service.form.tabOnPremise",
2799 "start": { 2477 "start": {
2800 "column": 16, 2478 "column": 16,
2801 "line": 71 2479 "line": 67
2802 } 2480 }
2803 }, 2481 },
2804 { 2482 {
2805 "defaultMessage": "!!!Use the hosted {name} service.", 2483 "defaultMessage": "!!!Use the hosted {name} service.",
2806 "end": { 2484 "end": {
2807 "column": 3, 2485 "column": 3,
2808 "line": 78 2486 "line": 74
2809 }, 2487 },
2810 "file": "src/components/settings/services/EditServiceForm.js", 2488 "file": "src/components/settings/services/EditServiceForm.js",
2811 "id": "settings.service.form.useHostedService", 2489 "id": "settings.service.form.useHostedService",
2812 "start": { 2490 "start": {
2813 "column": 20, 2491 "column": 20,
2814 "line": 75 2492 "line": 71
2815 } 2493 }
2816 }, 2494 },
2817 { 2495 {
2818 "defaultMessage": "!!!Could not validate custom {name} server.", 2496 "defaultMessage": "!!!Could not validate custom {name} server.",
2819 "end": { 2497 "end": {
2820 "column": 3, 2498 "column": 3,
2821 "line": 82 2499 "line": 78
2822 }, 2500 },
2823 "file": "src/components/settings/services/EditServiceForm.js", 2501 "file": "src/components/settings/services/EditServiceForm.js",
2824 "id": "settings.service.form.customUrlValidationError", 2502 "id": "settings.service.form.customUrlValidationError",
2825 "start": { 2503 "start": {
2826 "column": 28, 2504 "column": 28,
2827 "line": 79 2505 "line": 75
2828 }
2829 },
2830 {
2831 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.",
2832 "end": {
2833 "column": 3,
2834 "line": 86
2835 },
2836 "file": "src/components/settings/services/EditServiceForm.js",
2837 "id": "settings.service.form.customUrlPremiumInfo",
2838 "start": {
2839 "column": 24,
2840 "line": 83
2841 }
2842 },
2843 {
2844 "defaultMessage": "!!!Upgrade your account",
2845 "end": {
2846 "column": 3,
2847 "line": 90
2848 },
2849 "file": "src/components/settings/services/EditServiceForm.js",
2850 "id": "settings.service.form.customUrlUpgradeAccount",
2851 "start": {
2852 "column": 27,
2853 "line": 87
2854 } 2506 }
2855 }, 2507 },
2856 { 2508 {
2857 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 2509 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
2858 "end": { 2510 "end": {
2859 "column": 3, 2511 "column": 3,
2860 "line": 94 2512 "line": 82
2861 }, 2513 },
2862 "file": "src/components/settings/services/EditServiceForm.js", 2514 "file": "src/components/settings/services/EditServiceForm.js",
2863 "id": "settings.service.form.indirectMessageInfo", 2515 "id": "settings.service.form.indirectMessageInfo",
2864 "start": { 2516 "start": {
2865 "column": 23, 2517 "column": 23,
2866 "line": 91 2518 "line": 79
2867 } 2519 }
2868 }, 2520 },
2869 { 2521 {
2870 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", 2522 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
2871 "end": { 2523 "end": {
2872 "column": 3, 2524 "column": 3,
2873 "line": 98 2525 "line": 86
2874 }, 2526 },
2875 "file": "src/components/settings/services/EditServiceForm.js", 2527 "file": "src/components/settings/services/EditServiceForm.js",
2876 "id": "settings.service.form.isMutedInfo", 2528 "id": "settings.service.form.isMutedInfo",
2877 "start": { 2529 "start": {
2878 "column": 15, 2530 "column": 15,
2879 "line": 95 2531 "line": 83
2880 } 2532 }
2881 }, 2533 },
2882 { 2534 {
2883 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.", 2535 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.",
2884 "end": { 2536 "end": {
2885 "column": 3, 2537 "column": 3,
2886 "line": 102 2538 "line": 90
2887 }, 2539 },
2888 "file": "src/components/settings/services/EditServiceForm.js", 2540 "file": "src/components/settings/services/EditServiceForm.js",
2889 "id": "settings.service.form.isHibernatedEnabledInfo", 2541 "id": "settings.service.form.isHibernatedEnabledInfo",
2890 "start": { 2542 "start": {
2891 "column": 28, 2543 "column": 28,
2892 "line": 99 2544 "line": 87
2893 } 2545 }
2894 }, 2546 },
2895 { 2547 {
2896 "defaultMessage": "!!!Notifications", 2548 "defaultMessage": "!!!Notifications",
2897 "end": { 2549 "end": {
2898 "column": 3, 2550 "column": 3,
2899 "line": 106 2551 "line": 94
2900 }, 2552 },
2901 "file": "src/components/settings/services/EditServiceForm.js", 2553 "file": "src/components/settings/services/EditServiceForm.js",
2902 "id": "settings.service.form.headlineNotifications", 2554 "id": "settings.service.form.headlineNotifications",
2903 "start": { 2555 "start": {
2904 "column": 25, 2556 "column": 25,
2905 "line": 103 2557 "line": 91
2906 } 2558 }
2907 }, 2559 },
2908 { 2560 {
2909 "defaultMessage": "!!!Unread message badges", 2561 "defaultMessage": "!!!Unread message badges",
2910 "end": { 2562 "end": {
2911 "column": 3, 2563 "column": 3,
2912 "line": 110 2564 "line": 98
2913 }, 2565 },
2914 "file": "src/components/settings/services/EditServiceForm.js", 2566 "file": "src/components/settings/services/EditServiceForm.js",
2915 "id": "settings.service.form.headlineBadges", 2567 "id": "settings.service.form.headlineBadges",
2916 "start": { 2568 "start": {
2917 "column": 18, 2569 "column": 18,
2918 "line": 107 2570 "line": 95
2919 } 2571 }
2920 }, 2572 },
2921 { 2573 {
2922 "defaultMessage": "!!!General", 2574 "defaultMessage": "!!!General",
2923 "end": { 2575 "end": {
2924 "column": 3, 2576 "column": 3,
2925 "line": 114 2577 "line": 102
2926 }, 2578 },
2927 "file": "src/components/settings/services/EditServiceForm.js", 2579 "file": "src/components/settings/services/EditServiceForm.js",
2928 "id": "settings.service.form.headlineGeneral", 2580 "id": "settings.service.form.headlineGeneral",
2929 "start": { 2581 "start": {
2930 "column": 19, 2582 "column": 19,
2931 "line": 111 2583 "line": 99
2932 } 2584 }
2933 }, 2585 },
2934 { 2586 {
2935 "defaultMessage": "!!!Dark Reader Settings", 2587 "defaultMessage": "!!!Dark Reader Settings",
2936 "end": { 2588 "end": {
2937 "column": 3, 2589 "column": 3,
2938 "line": 118 2590 "line": 106
2939 }, 2591 },
2940 "file": "src/components/settings/services/EditServiceForm.js", 2592 "file": "src/components/settings/services/EditServiceForm.js",
2941 "id": "settings.service.form.headlineDarkReaderSettings", 2593 "id": "settings.service.form.headlineDarkReaderSettings",
2942 "start": { 2594 "start": {
2943 "column": 30, 2595 "column": 30,
2944 "line": 115 2596 "line": 103
2945 } 2597 }
2946 }, 2598 },
2947 { 2599 {
2948 "defaultMessage": "!!!Delete", 2600 "defaultMessage": "!!!Delete",
2949 "end": { 2601 "end": {
2950 "column": 3, 2602 "column": 3,
2951 "line": 122 2603 "line": 110
2952 }, 2604 },
2953 "file": "src/components/settings/services/EditServiceForm.js", 2605 "file": "src/components/settings/services/EditServiceForm.js",
2954 "id": "settings.service.form.iconDelete", 2606 "id": "settings.service.form.iconDelete",
2955 "start": { 2607 "start": {
2956 "column": 14, 2608 "column": 14,
2957 "line": 119 2609 "line": 107
2958 } 2610 }
2959 }, 2611 },
2960 { 2612 {
2961 "defaultMessage": "!!!Drop your image, or click here", 2613 "defaultMessage": "!!!Drop your image, or click here",
2962 "end": { 2614 "end": {
2963 "column": 3, 2615 "column": 3,
2964 "line": 126 2616 "line": 114
2965 }, 2617 },
2966 "file": "src/components/settings/services/EditServiceForm.js", 2618 "file": "src/components/settings/services/EditServiceForm.js",
2967 "id": "settings.service.form.iconUpload", 2619 "id": "settings.service.form.iconUpload",
2968 "start": { 2620 "start": {
2969 "column": 14, 2621 "column": 14,
2970 "line": 123 2622 "line": 111
2971 } 2623 }
2972 }, 2624 },
2973 { 2625 {
2974 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", 2626 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
2975 "end": { 2627 "end": {
2976 "column": 3, 2628 "column": 3,
2977 "line": 130 2629 "line": 118
2978 }, 2630 },
2979 "file": "src/components/settings/services/EditServiceForm.js", 2631 "file": "src/components/settings/services/EditServiceForm.js",
2980 "id": "settings.service.form.proxy.headline", 2632 "id": "settings.service.form.proxy.headline",
2981 "start": { 2633 "start": {
2982 "column": 17, 2634 "column": 17,
2983 "line": 127 2635 "line": 115
2984 } 2636 }
2985 }, 2637 },
2986 { 2638 {
2987 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.", 2639 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.",
2988 "end": { 2640 "end": {
2989 "column": 3, 2641 "column": 3,
2990 "line": 134 2642 "line": 122
2991 }, 2643 },
2992 "file": "src/components/settings/services/EditServiceForm.js", 2644 "file": "src/components/settings/services/EditServiceForm.js",
2993 "id": "settings.service.form.proxy.restartInfo", 2645 "id": "settings.service.form.proxy.restartInfo",
2994 "start": { 2646 "start": {
2995 "column": 20, 2647 "column": 20,
2996 "line": 131 2648 "line": 119
2997 } 2649 }
2998 }, 2650 },
2999 { 2651 {
3000 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.", 2652 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.",
3001 "end": { 2653 "end": {
3002 "column": 3, 2654 "column": 3,
3003 "line": 138 2655 "line": 126
3004 }, 2656 },
3005 "file": "src/components/settings/services/EditServiceForm.js", 2657 "file": "src/components/settings/services/EditServiceForm.js",
3006 "id": "settings.service.form.proxy.info", 2658 "id": "settings.service.form.proxy.info",
3007 "start": { 2659 "start": {
3008 "column": 13, 2660 "column": 13,
3009 "line": 135 2661 "line": 123
3010 } 2662 }
3011 } 2663 }
3012 ], 2664 ],
@@ -3119,117 +2771,117 @@
3119 "defaultMessage": "!!!Your services", 2771 "defaultMessage": "!!!Your services",
3120 "end": { 2772 "end": {
3121 "column": 3, 2773 "column": 3,
3122 "line": 19 2774 "line": 18
3123 }, 2775 },
3124 "file": "src/components/settings/services/ServicesDashboard.js", 2776 "file": "src/components/settings/services/ServicesDashboard.js",
3125 "id": "settings.services.headline", 2777 "id": "settings.services.headline",
3126 "start": { 2778 "start": {
3127 "column": 12, 2779 "column": 12,
3128 "line": 16 2780 "line": 15
3129 } 2781 }
3130 }, 2782 },
3131 { 2783 {
3132 "defaultMessage": "!!!Search service", 2784 "defaultMessage": "!!!Search service",
3133 "end": { 2785 "end": {
3134 "column": 3, 2786 "column": 3,
3135 "line": 23 2787 "line": 22
3136 }, 2788 },
3137 "file": "src/components/settings/services/ServicesDashboard.js", 2789 "file": "src/components/settings/services/ServicesDashboard.js",
3138 "id": "settings.searchService", 2790 "id": "settings.searchService",
3139 "start": { 2791 "start": {
3140 "column": 17, 2792 "column": 17,
3141 "line": 20 2793 "line": 19
3142 } 2794 }
3143 }, 2795 },
3144 { 2796 {
3145 "defaultMessage": "!!!Start by adding a service.", 2797 "defaultMessage": "!!!Start by adding a service.",
3146 "end": { 2798 "end": {
3147 "column": 3, 2799 "column": 3,
3148 "line": 27 2800 "line": 26
3149 }, 2801 },
3150 "file": "src/components/settings/services/ServicesDashboard.js", 2802 "file": "src/components/settings/services/ServicesDashboard.js",
3151 "id": "settings.services.noServicesAdded", 2803 "id": "settings.services.noServicesAdded",
3152 "start": { 2804 "start": {
3153 "column": 19, 2805 "column": 19,
3154 "line": 24 2806 "line": 23
3155 } 2807 }
3156 }, 2808 },
3157 { 2809 {
3158 "defaultMessage": "!!!Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 2810 "defaultMessage": "!!!Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
3159 "end": { 2811 "end": {
3160 "column": 3, 2812 "column": 3,
3161 "line": 31 2813 "line": 30
3162 }, 2814 },
3163 "file": "src/components/settings/services/ServicesDashboard.js", 2815 "file": "src/components/settings/services/ServicesDashboard.js",
3164 "id": "settings.recipes.nothingFound", 2816 "id": "settings.recipes.nothingFound",
3165 "start": { 2817 "start": {
3166 "column": 18, 2818 "column": 18,
3167 "line": 28 2819 "line": 27
3168 } 2820 }
3169 }, 2821 },
3170 { 2822 {
3171 "defaultMessage": "!!!Discover services", 2823 "defaultMessage": "!!!Discover services",
3172 "end": { 2824 "end": {
3173 "column": 3, 2825 "column": 3,
3174 "line": 35 2826 "line": 34
3175 }, 2827 },
3176 "file": "src/components/settings/services/ServicesDashboard.js", 2828 "file": "src/components/settings/services/ServicesDashboard.js",
3177 "id": "settings.services.discoverServices", 2829 "id": "settings.services.discoverServices",
3178 "start": { 2830 "start": {
3179 "column": 20, 2831 "column": 20,
3180 "line": 32 2832 "line": 31
3181 } 2833 }
3182 }, 2834 },
3183 { 2835 {
3184 "defaultMessage": "!!!Could not load your services", 2836 "defaultMessage": "!!!Could not load your services",
3185 "end": { 2837 "end": {
3186 "column": 3, 2838 "column": 3,
3187 "line": 39 2839 "line": 38
3188 }, 2840 },
3189 "file": "src/components/settings/services/ServicesDashboard.js", 2841 "file": "src/components/settings/services/ServicesDashboard.js",
3190 "id": "settings.services.servicesRequestFailed", 2842 "id": "settings.services.servicesRequestFailed",
3191 "start": { 2843 "start": {
3192 "column": 25, 2844 "column": 25,
3193 "line": 36 2845 "line": 35
3194 } 2846 }
3195 }, 2847 },
3196 { 2848 {
3197 "defaultMessage": "!!!Try again", 2849 "defaultMessage": "!!!Try again",
3198 "end": { 2850 "end": {
3199 "column": 3, 2851 "column": 3,
3200 "line": 43 2852 "line": 42
3201 }, 2853 },
3202 "file": "src/components/settings/services/ServicesDashboard.js", 2854 "file": "src/components/settings/services/ServicesDashboard.js",
3203 "id": "settings.account.tryReloadServices", 2855 "id": "settings.account.tryReloadServices",
3204 "start": { 2856 "start": {
3205 "column": 21, 2857 "column": 21,
3206 "line": 40 2858 "line": 39
3207 } 2859 }
3208 }, 2860 },
3209 { 2861 {
3210 "defaultMessage": "!!!Your changes have been saved", 2862 "defaultMessage": "!!!Your changes have been saved",
3211 "end": { 2863 "end": {
3212 "column": 3, 2864 "column": 3,
3213 "line": 47 2865 "line": 46
3214 }, 2866 },
3215 "file": "src/components/settings/services/ServicesDashboard.js", 2867 "file": "src/components/settings/services/ServicesDashboard.js",
3216 "id": "settings.services.updatedInfo", 2868 "id": "settings.services.updatedInfo",
3217 "start": { 2869 "start": {
3218 "column": 15, 2870 "column": 15,
3219 "line": 44 2871 "line": 43
3220 } 2872 }
3221 }, 2873 },
3222 { 2874 {
3223 "defaultMessage": "!!!Service has been deleted", 2875 "defaultMessage": "!!!Service has been deleted",
3224 "end": { 2876 "end": {
3225 "column": 3, 2877 "column": 3,
3226 "line": 51 2878 "line": 50
3227 }, 2879 },
3228 "file": "src/components/settings/services/ServicesDashboard.js", 2880 "file": "src/components/settings/services/ServicesDashboard.js",
3229 "id": "settings.services.deletedInfo", 2881 "id": "settings.services.deletedInfo",
3230 "start": { 2882 "start": {
3231 "column": 15, 2883 "column": 15,
3232 "line": 48 2884 "line": 47
3233 } 2885 }
3234 } 2886 }
3235 ], 2887 ],
@@ -3241,416 +2893,416 @@
3241 "defaultMessage": "!!!Settings", 2893 "defaultMessage": "!!!Settings",
3242 "end": { 2894 "end": {
3243 "column": 3, 2895 "column": 3,
3244 "line": 27 2896 "line": 26
3245 }, 2897 },
3246 "file": "src/components/settings/settings/EditSettingsForm.js", 2898 "file": "src/components/settings/settings/EditSettingsForm.js",
3247 "id": "settings.app.headline", 2899 "id": "settings.app.headline",
3248 "start": { 2900 "start": {
3249 "column": 12, 2901 "column": 12,
3250 "line": 24 2902 "line": 23
3251 } 2903 }
3252 }, 2904 },
3253 { 2905 {
3254 "defaultMessage": "!!!General", 2906 "defaultMessage": "!!!General",
3255 "end": { 2907 "end": {
3256 "column": 3, 2908 "column": 3,
3257 "line": 31 2909 "line": 30
3258 }, 2910 },
3259 "file": "src/components/settings/settings/EditSettingsForm.js", 2911 "file": "src/components/settings/settings/EditSettingsForm.js",
3260 "id": "settings.app.headlineGeneral", 2912 "id": "settings.app.headlineGeneral",
3261 "start": { 2913 "start": {
3262 "column": 19, 2914 "column": 19,
3263 "line": 28 2915 "line": 27
3264 } 2916 }
3265 }, 2917 },
3266 { 2918 {
3267 "defaultMessage": "!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 2919 "defaultMessage": "!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
3268 "end": { 2920 "end": {
3269 "column": 3, 2921 "column": 3,
3270 "line": 35 2922 "line": 34
3271 }, 2923 },
3272 "file": "src/components/settings/settings/EditSettingsForm.js", 2924 "file": "src/components/settings/settings/EditSettingsForm.js",
3273 "id": "settings.app.sentryInfo", 2925 "id": "settings.app.sentryInfo",
3274 "start": { 2926 "start": {
3275 "column": 14, 2927 "column": 14,
3276 "line": 32 2928 "line": 31
3277 } 2929 }
3278 }, 2930 },
3279 { 2931 {
3280 "defaultMessage": "!!!By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 2932 "defaultMessage": "!!!By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
3281 "end": { 2933 "end": {
3282 "column": 3, 2934 "column": 3,
3283 "line": 39 2935 "line": 38
3284 }, 2936 },
3285 "file": "src/components/settings/settings/EditSettingsForm.js", 2937 "file": "src/components/settings/settings/EditSettingsForm.js",
3286 "id": "settings.app.hibernateInfo", 2938 "id": "settings.app.hibernateInfo",
3287 "start": { 2939 "start": {
3288 "column": 17, 2940 "column": 17,
3289 "line": 36 2941 "line": 35
3290 } 2942 }
3291 }, 2943 },
3292 { 2944 {
3293 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 2945 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
3294 "end": { 2946 "end": {
3295 "column": 3, 2947 "column": 3,
3296 "line": 43 2948 "line": 42
3297 }, 2949 },
3298 "file": "src/components/settings/settings/EditSettingsForm.js", 2950 "file": "src/components/settings/settings/EditSettingsForm.js",
3299 "id": "settings.app.inactivityLockInfo", 2951 "id": "settings.app.inactivityLockInfo",
3300 "start": { 2952 "start": {
3301 "column": 22, 2953 "column": 22,
3302 "line": 40 2954 "line": 39
3303 } 2955 }
3304 }, 2956 },
3305 { 2957 {
3306 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)", 2958 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)",
3307 "end": { 2959 "end": {
3308 "column": 3, 2960 "column": 3,
3309 "line": 47 2961 "line": 46
3310 }, 2962 },
3311 "file": "src/components/settings/settings/EditSettingsForm.js", 2963 "file": "src/components/settings/settings/EditSettingsForm.js",
3312 "id": "settings.app.todoServerInfo", 2964 "id": "settings.app.todoServerInfo",
3313 "start": { 2965 "start": {
3314 "column": 18, 2966 "column": 18,
3315 "line": 44 2967 "line": 43
3316 } 2968 }
3317 }, 2969 },
3318 { 2970 {
3319 "defaultMessage": "!!!Password", 2971 "defaultMessage": "!!!Password",
3320 "end": { 2972 "end": {
3321 "column": 3, 2973 "column": 3,
3322 "line": 51 2974 "line": 50
3323 }, 2975 },
3324 "file": "src/components/settings/settings/EditSettingsForm.js", 2976 "file": "src/components/settings/settings/EditSettingsForm.js",
3325 "id": "settings.app.lockedPassword", 2977 "id": "settings.app.lockedPassword",
3326 "start": { 2978 "start": {
3327 "column": 18, 2979 "column": 18,
3328 "line": 48 2980 "line": 47
3329 } 2981 }
3330 }, 2982 },
3331 { 2983 {
3332 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 2984 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
3333 "end": { 2985 "end": {
3334 "column": 3, 2986 "column": 3,
3335 "line": 55 2987 "line": 54
3336 }, 2988 },
3337 "file": "src/components/settings/settings/EditSettingsForm.js", 2989 "file": "src/components/settings/settings/EditSettingsForm.js",
3338 "id": "settings.app.lockedPasswordInfo", 2990 "id": "settings.app.lockedPasswordInfo",
3339 "start": { 2991 "start": {
3340 "column": 22, 2992 "column": 22,
3341 "line": 52 2993 "line": 51
3342 } 2994 }
3343 }, 2995 },
3344 { 2996 {
3345 "defaultMessage": "!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 2997 "defaultMessage": "!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
3346 "end": { 2998 "end": {
3347 "column": 3, 2999 "column": 3,
3348 "line": 59 3000 "line": 58
3349 }, 3001 },
3350 "file": "src/components/settings/settings/EditSettingsForm.js", 3002 "file": "src/components/settings/settings/EditSettingsForm.js",
3351 "id": "settings.app.lockInfo", 3003 "id": "settings.app.lockInfo",
3352 "start": { 3004 "start": {
3353 "column": 12, 3005 "column": 12,
3354 "line": 56 3006 "line": 55
3355 } 3007 }
3356 }, 3008 },
3357 { 3009 {
3358 "defaultMessage": "!!!Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 3010 "defaultMessage": "!!!Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
3359 "end": { 3011 "end": {
3360 "column": 3, 3012 "column": 3,
3361 "line": 63 3013 "line": 62
3362 }, 3014 },
3363 "file": "src/components/settings/settings/EditSettingsForm.js", 3015 "file": "src/components/settings/settings/EditSettingsForm.js",
3364 "id": "settings.app.scheduledDNDTimeInfo", 3016 "id": "settings.app.scheduledDNDTimeInfo",
3365 "start": { 3017 "start": {
3366 "column": 24, 3018 "column": 24,
3367 "line": 60 3019 "line": 59
3368 } 3020 }
3369 }, 3021 },
3370 { 3022 {
3371 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 3023 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
3372 "end": { 3024 "end": {
3373 "column": 3, 3025 "column": 3,
3374 "line": 67 3026 "line": 66
3375 }, 3027 },
3376 "file": "src/components/settings/settings/EditSettingsForm.js", 3028 "file": "src/components/settings/settings/EditSettingsForm.js",
3377 "id": "settings.app.scheduledDNDInfo", 3029 "id": "settings.app.scheduledDNDInfo",
3378 "start": { 3030 "start": {
3379 "column": 20, 3031 "column": 20,
3380 "line": 64 3032 "line": 63
3381 } 3033 }
3382 }, 3034 },
3383 { 3035 {
3384 "defaultMessage": "!!!Language", 3036 "defaultMessage": "!!!Language",
3385 "end": { 3037 "end": {
3386 "column": 3, 3038 "column": 3,
3387 "line": 71 3039 "line": 70
3388 }, 3040 },
3389 "file": "src/components/settings/settings/EditSettingsForm.js", 3041 "file": "src/components/settings/settings/EditSettingsForm.js",
3390 "id": "settings.app.headlineLanguage", 3042 "id": "settings.app.headlineLanguage",
3391 "start": { 3043 "start": {
3392 "column": 20, 3044 "column": 20,
3393 "line": 68 3045 "line": 67
3394 } 3046 }
3395 }, 3047 },
3396 { 3048 {
3397 "defaultMessage": "!!!Updates", 3049 "defaultMessage": "!!!Updates",
3398 "end": { 3050 "end": {
3399 "column": 3, 3051 "column": 3,
3400 "line": 75 3052 "line": 74
3401 }, 3053 },
3402 "file": "src/components/settings/settings/EditSettingsForm.js", 3054 "file": "src/components/settings/settings/EditSettingsForm.js",
3403 "id": "settings.app.headlineUpdates", 3055 "id": "settings.app.headlineUpdates",
3404 "start": { 3056 "start": {
3405 "column": 19, 3057 "column": 19,
3406 "line": 72 3058 "line": 71
3407 } 3059 }
3408 }, 3060 },
3409 { 3061 {
3410 "defaultMessage": "!!!Appearance", 3062 "defaultMessage": "!!!Appearance",
3411 "end": { 3063 "end": {
3412 "column": 3, 3064 "column": 3,
3413 "line": 79 3065 "line": 78
3414 }, 3066 },
3415 "file": "src/components/settings/settings/EditSettingsForm.js", 3067 "file": "src/components/settings/settings/EditSettingsForm.js",
3416 "id": "settings.app.headlineAppearance", 3068 "id": "settings.app.headlineAppearance",
3417 "start": { 3069 "start": {
3418 "column": 22, 3070 "column": 22,
3419 "line": 76 3071 "line": 75
3420 } 3072 }
3421 }, 3073 },
3422 { 3074 {
3423 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.", 3075 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.",
3424 "end": { 3076 "end": {
3425 "column": 3, 3077 "column": 3,
3426 "line": 83 3078 "line": 82
3427 }, 3079 },
3428 "file": "src/components/settings/settings/EditSettingsForm.js", 3080 "file": "src/components/settings/settings/EditSettingsForm.js",
3429 "id": "settings.app.universalDarkModeInfo", 3081 "id": "settings.app.universalDarkModeInfo",
3430 "start": { 3082 "start": {
3431 "column": 25, 3083 "column": 25,
3432 "line": 80 3084 "line": 79
3433 } 3085 }
3434 }, 3086 },
3435 { 3087 {
3436 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 3088 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
3437 "end": { 3089 "end": {
3438 "column": 3, 3090 "column": 3,
3439 "line": 87 3091 "line": 86
3440 }, 3092 },
3441 "file": "src/components/settings/settings/EditSettingsForm.js", 3093 "file": "src/components/settings/settings/EditSettingsForm.js",
3442 "id": "settings.app.accentColorInfo", 3094 "id": "settings.app.accentColorInfo",
3443 "start": { 3095 "start": {
3444 "column": 19, 3096 "column": 19,
3445 "line": 84 3097 "line": 83
3446 } 3098 }
3447 }, 3099 },
3448 { 3100 {
3449 "defaultMessage": "!!!Privacy", 3101 "defaultMessage": "!!!Privacy",
3450 "end": { 3102 "end": {
3451 "column": 3, 3103 "column": 3,
3452 "line": 91 3104 "line": 90
3453 }, 3105 },
3454 "file": "src/components/settings/settings/EditSettingsForm.js", 3106 "file": "src/components/settings/settings/EditSettingsForm.js",
3455 "id": "settings.app.headlinePrivacy", 3107 "id": "settings.app.headlinePrivacy",
3456 "start": { 3108 "start": {
3457 "column": 19, 3109 "column": 19,
3458 "line": 88 3110 "line": 87
3459 } 3111 }
3460 }, 3112 },
3461 { 3113 {
3462 "defaultMessage": "!!!Advanced", 3114 "defaultMessage": "!!!Advanced",
3463 "end": { 3115 "end": {
3464 "column": 3, 3116 "column": 3,
3465 "line": 95 3117 "line": 94
3466 }, 3118 },
3467 "file": "src/components/settings/settings/EditSettingsForm.js", 3119 "file": "src/components/settings/settings/EditSettingsForm.js",
3468 "id": "settings.app.headlineAdvanced", 3120 "id": "settings.app.headlineAdvanced",
3469 "start": { 3121 "start": {
3470 "column": 20, 3122 "column": 20,
3471 "line": 92 3123 "line": 91
3472 } 3124 }
3473 }, 3125 },
3474 { 3126 {
3475 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 3127 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
3476 "end": { 3128 "end": {
3477 "column": 3, 3129 "column": 3,
3478 "line": 99 3130 "line": 98
3479 }, 3131 },
3480 "file": "src/components/settings/settings/EditSettingsForm.js", 3132 "file": "src/components/settings/settings/EditSettingsForm.js",
3481 "id": "settings.app.translationHelp", 3133 "id": "settings.app.translationHelp",
3482 "start": { 3134 "start": {
3483 "column": 19, 3135 "column": 19,
3484 "line": 96 3136 "line": 95
3485 } 3137 }
3486 }, 3138 },
3487 { 3139 {
3488 "defaultMessage": "!!!Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 3140 "defaultMessage": "!!!Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
3489 "end": { 3141 "end": {
3490 "column": 3, 3142 "column": 3,
3491 "line": 103 3143 "line": 102
3492 }, 3144 },
3493 "file": "src/components/settings/settings/EditSettingsForm.js", 3145 "file": "src/components/settings/settings/EditSettingsForm.js",
3494 "id": "settings.app.spellCheckerLanguageInfo", 3146 "id": "settings.app.spellCheckerLanguageInfo",
3495 "start": { 3147 "start": {
3496 "column": 28, 3148 "column": 28,
3497 "line": 100 3149 "line": 99
3498 } 3150 }
3499 }, 3151 },
3500 { 3152 {
3501 "defaultMessage": "!!!Cache", 3153 "defaultMessage": "!!!Cache",
3502 "end": { 3154 "end": {
3503 "column": 3, 3155 "column": 3,
3504 "line": 107 3156 "line": 106
3505 }, 3157 },
3506 "file": "src/components/settings/settings/EditSettingsForm.js", 3158 "file": "src/components/settings/settings/EditSettingsForm.js",
3507 "id": "settings.app.subheadlineCache", 3159 "id": "settings.app.subheadlineCache",
3508 "start": { 3160 "start": {
3509 "column": 20, 3161 "column": 20,
3510 "line": 104 3162 "line": 103
3511 } 3163 }
3512 }, 3164 },
3513 { 3165 {
3514 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 3166 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
3515 "end": { 3167 "end": {
3516 "column": 3, 3168 "column": 3,
3517 "line": 111 3169 "line": 110
3518 }, 3170 },
3519 "file": "src/components/settings/settings/EditSettingsForm.js", 3171 "file": "src/components/settings/settings/EditSettingsForm.js",
3520 "id": "settings.app.cacheInfo", 3172 "id": "settings.app.cacheInfo",
3521 "start": { 3173 "start": {
3522 "column": 13, 3174 "column": 13,
3523 "line": 108 3175 "line": 107
3524 } 3176 }
3525 }, 3177 },
3526 { 3178 {
3527 "defaultMessage": "!!!Couldn't clear all cache", 3179 "defaultMessage": "!!!Couldn't clear all cache",
3528 "end": { 3180 "end": {
3529 "column": 3, 3181 "column": 3,
3530 "line": 115 3182 "line": 114
3531 }, 3183 },
3532 "file": "src/components/settings/settings/EditSettingsForm.js", 3184 "file": "src/components/settings/settings/EditSettingsForm.js",
3533 "id": "settings.app.cacheNotCleared", 3185 "id": "settings.app.cacheNotCleared",
3534 "start": { 3186 "start": {
3535 "column": 19, 3187 "column": 19,
3536 "line": 112 3188 "line": 111
3537 } 3189 }
3538 }, 3190 },
3539 { 3191 {
3540 "defaultMessage": "!!!Clear cache", 3192 "defaultMessage": "!!!Clear cache",
3541 "end": { 3193 "end": {
3542 "column": 3, 3194 "column": 3,
3543 "line": 119 3195 "line": 118
3544 }, 3196 },
3545 "file": "src/components/settings/settings/EditSettingsForm.js", 3197 "file": "src/components/settings/settings/EditSettingsForm.js",
3546 "id": "settings.app.buttonClearAllCache", 3198 "id": "settings.app.buttonClearAllCache",
3547 "start": { 3199 "start": {
3548 "column": 23, 3200 "column": 23,
3549 "line": 116 3201 "line": 115
3550 } 3202 }
3551 }, 3203 },
3552 { 3204 {
3553 "defaultMessage": "!!!Check for updates", 3205 "defaultMessage": "!!!Check for updates",
3554 "end": { 3206 "end": {
3555 "column": 3, 3207 "column": 3,
3556 "line": 123 3208 "line": 122
3557 }, 3209 },
3558 "file": "src/components/settings/settings/EditSettingsForm.js", 3210 "file": "src/components/settings/settings/EditSettingsForm.js",
3559 "id": "settings.app.buttonSearchForUpdate", 3211 "id": "settings.app.buttonSearchForUpdate",
3560 "start": { 3212 "start": {
3561 "column": 25, 3213 "column": 25,
3562 "line": 120 3214 "line": 119
3563 } 3215 }
3564 }, 3216 },
3565 { 3217 {
3566 "defaultMessage": "!!!Restart & install update", 3218 "defaultMessage": "!!!Restart & install update",
3567 "end": { 3219 "end": {
3568 "column": 3, 3220 "column": 3,
3569 "line": 127 3221 "line": 126
3570 }, 3222 },
3571 "file": "src/components/settings/settings/EditSettingsForm.js", 3223 "file": "src/components/settings/settings/EditSettingsForm.js",
3572 "id": "settings.app.buttonInstallUpdate", 3224 "id": "settings.app.buttonInstallUpdate",
3573 "start": { 3225 "start": {
3574 "column": 23, 3226 "column": 23,
3575 "line": 124 3227 "line": 123
3576 } 3228 }
3577 }, 3229 },
3578 { 3230 {
3579 "defaultMessage": "!!!Is searching for update", 3231 "defaultMessage": "!!!Is searching for update",
3580 "end": { 3232 "end": {
3581 "column": 3, 3233 "column": 3,
3582 "line": 131 3234 "line": 130
3583 }, 3235 },
3584 "file": "src/components/settings/settings/EditSettingsForm.js", 3236 "file": "src/components/settings/settings/EditSettingsForm.js",
3585 "id": "settings.app.updateStatusSearching", 3237 "id": "settings.app.updateStatusSearching",
3586 "start": { 3238 "start": {
3587 "column": 25, 3239 "column": 25,
3588 "line": 128 3240 "line": 127
3589 } 3241 }
3590 }, 3242 },
3591 { 3243 {
3592 "defaultMessage": "!!!Update available, downloading...", 3244 "defaultMessage": "!!!Update available, downloading...",
3593 "end": { 3245 "end": {
3594 "column": 3, 3246 "column": 3,
3595 "line": 135 3247 "line": 134
3596 }, 3248 },
3597 "file": "src/components/settings/settings/EditSettingsForm.js", 3249 "file": "src/components/settings/settings/EditSettingsForm.js",
3598 "id": "settings.app.updateStatusAvailable", 3250 "id": "settings.app.updateStatusAvailable",
3599 "start": { 3251 "start": {
3600 "column": 25, 3252 "column": 25,
3601 "line": 132 3253 "line": 131
3602 } 3254 }
3603 }, 3255 },
3604 { 3256 {
3605 "defaultMessage": "!!!You are using the latest version of Ferdi", 3257 "defaultMessage": "!!!You are using the latest version of Ferdi",
3606 "end": { 3258 "end": {
3607 "column": 3, 3259 "column": 3,
3608 "line": 139 3260 "line": 138
3609 }, 3261 },
3610 "file": "src/components/settings/settings/EditSettingsForm.js", 3262 "file": "src/components/settings/settings/EditSettingsForm.js",
3611 "id": "settings.app.updateStatusUpToDate", 3263 "id": "settings.app.updateStatusUpToDate",
3612 "start": { 3264 "start": {
3613 "column": 24, 3265 "column": 24,
3614 "line": 136 3266 "line": 135
3615 } 3267 }
3616 }, 3268 },
3617 { 3269 {
3618 "defaultMessage": "!!!Current version:", 3270 "defaultMessage": "!!!Current version:",
3619 "end": { 3271 "end": {
3620 "column": 3, 3272 "column": 3,
3621 "line": 143 3273 "line": 142
3622 }, 3274 },
3623 "file": "src/components/settings/settings/EditSettingsForm.js", 3275 "file": "src/components/settings/settings/EditSettingsForm.js",
3624 "id": "settings.app.currentVersion", 3276 "id": "settings.app.currentVersion",
3625 "start": { 3277 "start": {
3626 "column": 18, 3278 "column": 18,
3627 "line": 140 3279 "line": 139
3628 } 3280 }
3629 }, 3281 },
3630 { 3282 {
3631 "defaultMessage": "!!!Changes require restart", 3283 "defaultMessage": "!!!Changes require restart",
3632 "end": { 3284 "end": {
3633 "column": 3, 3285 "column": 3,
3634 "line": 147 3286 "line": 146
3635 }, 3287 },
3636 "file": "src/components/settings/settings/EditSettingsForm.js", 3288 "file": "src/components/settings/settings/EditSettingsForm.js",
3637 "id": "settings.app.restartRequired", 3289 "id": "settings.app.restartRequired",
3638 "start": { 3290 "start": {
3639 "column": 22, 3291 "column": 22,
3640 "line": 144 3292 "line": 143
3641 } 3293 }
3642 }, 3294 },
3643 { 3295 {
3644 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 3296 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
3645 "end": { 3297 "end": {
3646 "column": 3, 3298 "column": 3,
3647 "line": 151 3299 "line": 150
3648 }, 3300 },
3649 "file": "src/components/settings/settings/EditSettingsForm.js", 3301 "file": "src/components/settings/settings/EditSettingsForm.js",
3650 "id": "settings.app.languageDisclaimer", 3302 "id": "settings.app.languageDisclaimer",
3651 "start": { 3303 "start": {
3652 "column": 22, 3304 "column": 22,
3653 "line": 148 3305 "line": 147
3654 } 3306 }
3655 } 3307 }
3656 ], 3308 ],
@@ -3880,104 +3532,91 @@
3880 "defaultMessage": "!!!Team", 3532 "defaultMessage": "!!!Team",
3881 "end": { 3533 "end": {
3882 "column": 3, 3534 "column": 3,
3883 "line": 21 3535 "line": 18
3884 }, 3536 },
3885 "file": "src/components/settings/team/TeamDashboard.js", 3537 "file": "src/components/settings/team/TeamDashboard.js",
3886 "id": "settings.team.headline", 3538 "id": "settings.team.headline",
3887 "start": { 3539 "start": {
3888 "column": 12, 3540 "column": 12,
3889 "line": 18 3541 "line": 15
3890 } 3542 }
3891 }, 3543 },
3892 { 3544 {
3893 "defaultMessage": "!!!Franz Team Management", 3545 "defaultMessage": "!!!Franz Team Management",
3894 "end": { 3546 "end": {
3895 "column": 3, 3547 "column": 3,
3896 "line": 25 3548 "line": 22
3897 }, 3549 },
3898 "file": "src/components/settings/team/TeamDashboard.js", 3550 "file": "src/components/settings/team/TeamDashboard.js",
3899 "id": "settings.team.contentHeadline", 3551 "id": "settings.team.contentHeadline",
3900 "start": { 3552 "start": {
3901 "column": 19, 3553 "column": 19,
3902 "line": 22 3554 "line": 19
3903 } 3555 }
3904 }, 3556 },
3905 { 3557 {
3906 "defaultMessage": "!!!Your are currently using Franz Servers, which is why you have access to Team Management.", 3558 "defaultMessage": "!!!Your are currently using Franz Servers, which is why you have access to Team Management.",
3907 "end": { 3559 "end": {
3908 "column": 3, 3560 "column": 3,
3909 "line": 29 3561 "line": 26
3910 }, 3562 },
3911 "file": "src/components/settings/team/TeamDashboard.js", 3563 "file": "src/components/settings/team/TeamDashboard.js",
3912 "id": "settings.team.intro", 3564 "id": "settings.team.intro",
3913 "start": { 3565 "start": {
3914 "column": 9, 3566 "column": 9,
3915 "line": 26 3567 "line": 23
3916 } 3568 }
3917 }, 3569 },
3918 { 3570 {
3919 "defaultMessage": "!!!Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 3571 "defaultMessage": "!!!Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
3920 "end": { 3572 "end": {
3921 "column": 3, 3573 "column": 3,
3922 "line": 33 3574 "line": 30
3923 }, 3575 },
3924 "file": "src/components/settings/team/TeamDashboard.js", 3576 "file": "src/components/settings/team/TeamDashboard.js",
3925 "id": "settings.team.copy", 3577 "id": "settings.team.copy",
3926 "start": { 3578 "start": {
3927 "column": 8, 3579 "column": 8,
3928 "line": 30 3580 "line": 27
3929 } 3581 }
3930 }, 3582 },
3931 { 3583 {
3932 "defaultMessage": "!!!Manage your Team on meetfranz.com", 3584 "defaultMessage": "!!!Manage your Team on meetfranz.com",
3933 "end": { 3585 "end": {
3934 "column": 3, 3586 "column": 3,
3935 "line": 37 3587 "line": 34
3936 }, 3588 },
3937 "file": "src/components/settings/team/TeamDashboard.js", 3589 "file": "src/components/settings/team/TeamDashboard.js",
3938 "id": "settings.team.manageAction", 3590 "id": "settings.team.manageAction",
3939 "start": { 3591 "start": {
3940 "column": 16, 3592 "column": 16,
3941 "line": 34 3593 "line": 31
3942 }
3943 },
3944 {
3945 "defaultMessage": "!!!Upgrade your Account",
3946 "end": {
3947 "column": 3,
3948 "line": 41
3949 },
3950 "file": "src/components/settings/team/TeamDashboard.js",
3951 "id": "settings.team.upgradeAction",
3952 "start": {
3953 "column": 17,
3954 "line": 38
3955 } 3594 }
3956 }, 3595 },
3957 { 3596 {
3958 "defaultMessage": "!!!Teams are unavailable", 3597 "defaultMessage": "!!!Teams are unavailable",
3959 "end": { 3598 "end": {
3960 "column": 3, 3599 "column": 3,
3961 "line": 45 3600 "line": 38
3962 }, 3601 },
3963 "file": "src/components/settings/team/TeamDashboard.js", 3602 "file": "src/components/settings/team/TeamDashboard.js",
3964 "id": "settings.team.teamsUnavailable", 3603 "id": "settings.team.teamsUnavailable",
3965 "start": { 3604 "start": {
3966 "column": 20, 3605 "column": 20,
3967 "line": 42 3606 "line": 35
3968 } 3607 }
3969 }, 3608 },
3970 { 3609 {
3971 "defaultMessage": "!!!Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 3610 "defaultMessage": "!!!Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
3972 "end": { 3611 "end": {
3973 "column": 3, 3612 "column": 3,
3974 "line": 49 3613 "line": 42
3975 }, 3614 },
3976 "file": "src/components/settings/team/TeamDashboard.js", 3615 "file": "src/components/settings/team/TeamDashboard.js",
3977 "id": "settings.team.teamsUnavailableInfo", 3616 "id": "settings.team.teamsUnavailableInfo",
3978 "start": { 3617 "start": {
3979 "column": 24, 3618 "column": 24,
3980 "line": 46 3619 "line": 39
3981 } 3620 }
3982 } 3621 }
3983 ], 3622 ],
@@ -4069,509 +3708,146 @@
4069 { 3708 {
4070 "descriptors": [ 3709 "descriptors": [
4071 { 3710 {
4072 "defaultMessage": "!!!Choose your plan",
4073 "end": {
4074 "column": 3,
4075 "line": 16
4076 },
4077 "file": "src/components/subscription/SubscriptionForm.js",
4078 "id": "subscription.cta.choosePlan",
4079 "start": {
4080 "column": 21,
4081 "line": 13
4082 }
4083 },
4084 {
4085 "defaultMessage": "!!!Upgrade your account and get the full Franz experience",
4086 "end": {
4087 "column": 3,
4088 "line": 20
4089 },
4090 "file": "src/components/subscription/SubscriptionForm.js",
4091 "id": "settings.account.headlineUpgradeAccount",
4092 "start": {
4093 "column": 18,
4094 "line": 17
4095 }
4096 },
4097 {
4098 "defaultMessage": "!!!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!",
4099 "end": {
4100 "column": 3,
4101 "line": 24
4102 },
4103 "file": "src/components/subscription/SubscriptionForm.js",
4104 "id": "subscription.teaser.intro",
4105 "start": {
4106 "column": 14,
4107 "line": 21
4108 }
4109 },
4110 {
4111 "defaultMessage": "!!!Paid Franz Plans include:",
4112 "end": {
4113 "column": 3,
4114 "line": 28
4115 },
4116 "file": "src/components/subscription/SubscriptionForm.js",
4117 "id": "subscription.teaser.includedFeatures",
4118 "start": {
4119 "column": 20,
4120 "line": 25
4121 }
4122 }
4123 ],
4124 "path": "src/components/subscription/SubscriptionForm.json"
4125 },
4126 {
4127 "descriptors": [
4128 {
4129 "defaultMessage": "!!!Cancel",
4130 "end": {
4131 "column": 3,
4132 "line": 14
4133 },
4134 "file": "src/components/subscription/SubscriptionPopup.js",
4135 "id": "subscriptionPopup.buttonCancel",
4136 "start": {
4137 "column": 16,
4138 "line": 11
4139 }
4140 },
4141 {
4142 "defaultMessage": "!!!Done",
4143 "end": {
4144 "column": 3,
4145 "line": 18
4146 },
4147 "file": "src/components/subscription/SubscriptionPopup.js",
4148 "id": "subscriptionPopup.buttonDone",
4149 "start": {
4150 "column": 14,
4151 "line": 15
4152 }
4153 }
4154 ],
4155 "path": "src/components/subscription/SubscriptionPopup.json"
4156 },
4157 {
4158 "descriptors": [
4159 {
4160 "defaultMessage": "!!!Yes, start the free Franz Professional trial",
4161 "end": {
4162 "column": 3,
4163 "line": 17
4164 },
4165 "file": "src/components/subscription/TrialForm.js",
4166 "id": "subscription.cta.activateTrial",
4167 "start": {
4168 "column": 21,
4169 "line": 14
4170 }
4171 },
4172 {
4173 "defaultMessage": "!!!See all options",
4174 "end": {
4175 "column": 3,
4176 "line": 21
4177 },
4178 "file": "src/components/subscription/TrialForm.js",
4179 "id": "subscription.cta.allOptions",
4180 "start": {
4181 "column": 20,
4182 "line": 18
4183 }
4184 },
4185 {
4186 "defaultMessage": "!!!Get the free 14 day Franz Professional Trial",
4187 "end": {
4188 "column": 3,
4189 "line": 25
4190 },
4191 "file": "src/components/subscription/TrialForm.js",
4192 "id": "settings.account.headlineTrialUpgrade",
4193 "start": {
4194 "column": 18,
4195 "line": 22
4196 }
4197 },
4198 {
4199 "defaultMessage": "!!!The Franz Professional Plan includes:",
4200 "end": {
4201 "column": 3,
4202 "line": 29
4203 },
4204 "file": "src/components/subscription/TrialForm.js",
4205 "id": "subscription.includedProFeatures",
4206 "start": {
4207 "column": 20,
4208 "line": 26
4209 }
4210 },
4211 {
4212 "defaultMessage": "!!!No strings attached",
4213 "end": {
4214 "column": 3,
4215 "line": 33
4216 },
4217 "file": "src/components/subscription/TrialForm.js",
4218 "id": "pricing.trial.terms.headline",
4219 "start": {
4220 "column": 29,
4221 "line": 30
4222 }
4223 },
4224 {
4225 "defaultMessage": "!!!No credit card required",
4226 "end": {
4227 "column": 3,
4228 "line": 37
4229 },
4230 "file": "src/components/subscription/TrialForm.js",
4231 "id": "pricing.trial.terms.noCreditCard",
4232 "start": {
4233 "column": 16,
4234 "line": 34
4235 }
4236 },
4237 {
4238 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
4239 "end": {
4240 "column": 3,
4241 "line": 41
4242 },
4243 "file": "src/components/subscription/TrialForm.js",
4244 "id": "pricing.trial.terms.automaticTrialEnd",
4245 "start": {
4246 "column": 21,
4247 "line": 38
4248 }
4249 }
4250 ],
4251 "path": "src/components/subscription/TrialForm.json"
4252 },
4253 {
4254 "descriptors": [
4255 {
4256 "defaultMessage": "!!!Your trial was successfully activated. Happy messaging!",
4257 "end": {
4258 "column": 3,
4259 "line": 14
4260 },
4261 "file": "src/components/TrialActivationInfoBar.js",
4262 "id": "infobar.trialActivated",
4263 "start": {
4264 "column": 11,
4265 "line": 11
4266 }
4267 }
4268 ],
4269 "path": "src/components/TrialActivationInfoBar.json"
4270 },
4271 {
4272 "descriptors": [
4273 {
4274 "defaultMessage": "!!!Get a Franz Supporter License",
4275 "end": {
4276 "column": 3,
4277 "line": 16
4278 },
4279 "file": "src/components/ui/ActivateTrialButton/index.js",
4280 "id": "feature.delayApp.upgrade.action",
4281 "start": {
4282 "column": 10,
4283 "line": 13
4284 }
4285 },
4286 {
4287 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
4288 "end": {
4289 "column": 3,
4290 "line": 20
4291 },
4292 "file": "src/components/ui/ActivateTrialButton/index.js",
4293 "id": "feature.delayApp.trial.action",
4294 "start": {
4295 "column": 15,
4296 "line": 17
4297 }
4298 },
4299 {
4300 "defaultMessage": "!!!Upgrade account",
4301 "end": {
4302 "column": 3,
4303 "line": 24
4304 },
4305 "file": "src/components/ui/ActivateTrialButton/index.js",
4306 "id": "feature.delayApp.upgrade.actionShort",
4307 "start": {
4308 "column": 15,
4309 "line": 21
4310 }
4311 },
4312 {
4313 "defaultMessage": "!!!Activate the free Franz Professional trial",
4314 "end": {
4315 "column": 3,
4316 "line": 28
4317 },
4318 "file": "src/components/ui/ActivateTrialButton/index.js",
4319 "id": "feature.delayApp.trial.actionShort",
4320 "start": {
4321 "column": 20,
4322 "line": 25
4323 }
4324 },
4325 {
4326 "defaultMessage": "!!!No strings attached",
4327 "end": {
4328 "column": 3,
4329 "line": 32
4330 },
4331 "file": "src/components/ui/ActivateTrialButton/index.js",
4332 "id": "pricing.trial.terms.headline",
4333 "start": {
4334 "column": 29,
4335 "line": 29
4336 }
4337 },
4338 {
4339 "defaultMessage": "!!!No credit card required",
4340 "end": {
4341 "column": 3,
4342 "line": 36
4343 },
4344 "file": "src/components/ui/ActivateTrialButton/index.js",
4345 "id": "pricing.trial.terms.noCreditCard",
4346 "start": {
4347 "column": 16,
4348 "line": 33
4349 }
4350 },
4351 {
4352 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
4353 "end": {
4354 "column": 3,
4355 "line": 40
4356 },
4357 "file": "src/components/ui/ActivateTrialButton/index.js",
4358 "id": "pricing.trial.terms.automaticTrialEnd",
4359 "start": {
4360 "column": 21,
4361 "line": 37
4362 }
4363 }
4364 ],
4365 "path": "src/components/ui/ActivateTrialButton/index.json"
4366 },
4367 {
4368 "descriptors": [
4369 {
4370 "defaultMessage": "!!!Choose from more than 70 Services", 3711 "defaultMessage": "!!!Choose from more than 70 Services",
4371 "end": { 3712 "end": {
4372 "column": 3, 3713 "column": 3,
4373 "line": 12 3714 "line": 11
4374 }, 3715 },
4375 "file": "src/components/ui/FeatureList.js", 3716 "file": "src/components/ui/FeatureList.js",
4376 "id": "pricing.features.recipes", 3717 "id": "pricing.features.recipes",
4377 "start": { 3718 "start": {
4378 "column": 20, 3719 "column": 20,
4379 "line": 9 3720 "line": 8
4380 } 3721 }
4381 }, 3722 },
4382 { 3723 {
4383 "defaultMessage": "!!!Account Synchronisation", 3724 "defaultMessage": "!!!Account Synchronisation",
4384 "end": { 3725 "end": {
4385 "column": 3, 3726 "column": 3,
4386 "line": 16 3727 "line": 15
4387 }, 3728 },
4388 "file": "src/components/ui/FeatureList.js", 3729 "file": "src/components/ui/FeatureList.js",
4389 "id": "pricing.features.accountSync", 3730 "id": "pricing.features.accountSync",
4390 "start": { 3731 "start": {
4391 "column": 15, 3732 "column": 15,
4392 "line": 13 3733 "line": 12
4393 } 3734 }
4394 }, 3735 },
4395 { 3736 {
4396 "defaultMessage": "!!!Desktop Notifications", 3737 "defaultMessage": "!!!Desktop Notifications",
4397 "end": { 3738 "end": {
4398 "column": 3, 3739 "column": 3,
4399 "line": 20 3740 "line": 19
4400 }, 3741 },
4401 "file": "src/components/ui/FeatureList.js", 3742 "file": "src/components/ui/FeatureList.js",
4402 "id": "pricing.features.desktopNotifications", 3743 "id": "pricing.features.desktopNotifications",
4403 "start": { 3744 "start": {
4404 "column": 24, 3745 "column": 24,
4405 "line": 17 3746 "line": 16
4406 } 3747 }
4407 }, 3748 },
4408 { 3749 {
4409 "defaultMessage": "!!!Add unlimited services", 3750 "defaultMessage": "!!!Add unlimited services",
4410 "end": { 3751 "end": {
4411 "column": 3, 3752 "column": 3,
4412 "line": 24 3753 "line": 23
4413 }, 3754 },
4414 "file": "src/components/ui/FeatureList.js", 3755 "file": "src/components/ui/FeatureList.js",
4415 "id": "pricing.features.unlimitedServices", 3756 "id": "pricing.features.unlimitedServices",
4416 "start": { 3757 "start": {
4417 "column": 21, 3758 "column": 21,
4418 "line": 21 3759 "line": 20
4419 }
4420 },
4421 {
4422 "defaultMessage": "!!!Add up to 3 services",
4423 "end": {
4424 "column": 3,
4425 "line": 28
4426 },
4427 "file": "src/components/ui/FeatureList.js",
4428 "id": "pricing.features.upToThreeServices",
4429 "start": {
4430 "column": 21,
4431 "line": 25
4432 }
4433 },
4434 {
4435 "defaultMessage": "!!!Add up to 6 services",
4436 "end": {
4437 "column": 3,
4438 "line": 32
4439 },
4440 "file": "src/components/ui/FeatureList.js",
4441 "id": "pricing.features.upToSixServices",
4442 "start": {
4443 "column": 19,
4444 "line": 29
4445 } 3760 }
4446 }, 3761 },
4447 { 3762 {
4448 "defaultMessage": "!!!Spellchecker support", 3763 "defaultMessage": "!!!Spellchecker support",
4449 "end": { 3764 "end": {
4450 "column": 3, 3765 "column": 3,
4451 "line": 36 3766 "line": 27
4452 }, 3767 },
4453 "file": "src/components/ui/FeatureList.js", 3768 "file": "src/components/ui/FeatureList.js",
4454 "id": "pricing.features.spellchecker", 3769 "id": "pricing.features.spellchecker",
4455 "start": { 3770 "start": {
4456 "column": 16, 3771 "column": 16,
4457 "line": 33 3772 "line": 24
4458 } 3773 }
4459 }, 3774 },
4460 { 3775 {
4461 "defaultMessage": "!!!Workspaces", 3776 "defaultMessage": "!!!Workspaces",
4462 "end": { 3777 "end": {
4463 "column": 3, 3778 "column": 3,
4464 "line": 40 3779 "line": 31
4465 }, 3780 },
4466 "file": "src/components/ui/FeatureList.js", 3781 "file": "src/components/ui/FeatureList.js",
4467 "id": "pricing.features.workspaces", 3782 "id": "pricing.features.workspaces",
4468 "start": { 3783 "start": {
4469 "column": 14, 3784 "column": 14,
4470 "line": 37 3785 "line": 28
4471 } 3786 }
4472 }, 3787 },
4473 { 3788 {
4474 "defaultMessage": "!!!Add Custom Websites", 3789 "defaultMessage": "!!!Add Custom Websites",
4475 "end": { 3790 "end": {
4476 "column": 3, 3791 "column": 3,
4477 "line": 44 3792 "line": 35
4478 }, 3793 },
4479 "file": "src/components/ui/FeatureList.js", 3794 "file": "src/components/ui/FeatureList.js",
4480 "id": "pricing.features.customWebsites", 3795 "id": "pricing.features.customWebsites",
4481 "start": { 3796 "start": {
4482 "column": 18, 3797 "column": 18,
4483 "line": 41 3798 "line": 32
4484 } 3799 }
4485 }, 3800 },
4486 { 3801 {
4487 "defaultMessage": "!!!On-premise & other Hosted Services", 3802 "defaultMessage": "!!!On-premise & other Hosted Services",
4488 "end": { 3803 "end": {
4489 "column": 3, 3804 "column": 3,
4490 "line": 48 3805 "line": 39
4491 }, 3806 },
4492 "file": "src/components/ui/FeatureList.js", 3807 "file": "src/components/ui/FeatureList.js",
4493 "id": "pricing.features.onPremise", 3808 "id": "pricing.features.onPremise",
4494 "start": { 3809 "start": {
4495 "column": 13, 3810 "column": 13,
4496 "line": 45 3811 "line": 36
4497 } 3812 }
4498 }, 3813 },
4499 { 3814 {
4500 "defaultMessage": "!!!Install 3rd party services", 3815 "defaultMessage": "!!!Install 3rd party services",
4501 "end": { 3816 "end": {
4502 "column": 3, 3817 "column": 3,
4503 "line": 52 3818 "line": 43
4504 }, 3819 },
4505 "file": "src/components/ui/FeatureList.js", 3820 "file": "src/components/ui/FeatureList.js",
4506 "id": "pricing.features.thirdPartyServices", 3821 "id": "pricing.features.thirdPartyServices",
4507 "start": { 3822 "start": {
4508 "column": 22, 3823 "column": 22,
4509 "line": 49 3824 "line": 40
4510 } 3825 }
4511 }, 3826 },
4512 { 3827 {
4513 "defaultMessage": "!!!Service Proxies", 3828 "defaultMessage": "!!!Service Proxies",
4514 "end": { 3829 "end": {
4515 "column": 3, 3830 "column": 3,
4516 "line": 56 3831 "line": 47
4517 }, 3832 },
4518 "file": "src/components/ui/FeatureList.js", 3833 "file": "src/components/ui/FeatureList.js",
4519 "id": "pricing.features.serviceProxies", 3834 "id": "pricing.features.serviceProxies",
4520 "start": { 3835 "start": {
4521 "column": 18, 3836 "column": 18,
4522 "line": 53 3837 "line": 44
4523 } 3838 }
4524 }, 3839 },
4525 { 3840 {
4526 "defaultMessage": "!!!Team Management", 3841 "defaultMessage": "!!!Team Management",
4527 "end": { 3842 "end": {
4528 "column": 3, 3843 "column": 3,
4529 "line": 60 3844 "line": 51
4530 }, 3845 },
4531 "file": "src/components/ui/FeatureList.js", 3846 "file": "src/components/ui/FeatureList.js",
4532 "id": "pricing.features.teamManagement", 3847 "id": "pricing.features.teamManagement",
4533 "start": { 3848 "start": {
4534 "column": 18, 3849 "column": 18,
4535 "line": 57 3850 "line": 48
4536 }
4537 },
4538 {
4539 "defaultMessage": "!!!No Waiting Screens",
4540 "end": {
4541 "column": 3,
4542 "line": 64
4543 },
4544 "file": "src/components/ui/FeatureList.js",
4545 "id": "pricing.features.appDelays",
4546 "start": {
4547 "column": 13,
4548 "line": 61
4549 }
4550 },
4551 {
4552 "defaultMessage": "!!!Forever ad-free",
4553 "end": {
4554 "column": 3,
4555 "line": 68
4556 },
4557 "file": "src/components/ui/FeatureList.js",
4558 "id": "pricing.features.adFree",
4559 "start": {
4560 "column": 10,
4561 "line": 65
4562 }
4563 },
4564 {
4565 "defaultMessage": "!!!Occasional Waiting Screens",
4566 "end": {
4567 "column": 3,
4568 "line": 72
4569 },
4570 "file": "src/components/ui/FeatureList.js",
4571 "id": "pricing.features.appDelaysEnabled",
4572 "start": {
4573 "column": 19,
4574 "line": 69
4575 } 3851 }
4576 } 3852 }
4577 ], 3853 ],
@@ -4634,42 +3910,6 @@
4634 { 3910 {
4635 "descriptors": [ 3911 "descriptors": [
4636 { 3912 {
4637 "defaultMessage": "!!!Upgrade account",
4638 "end": {
4639 "column": 3,
4640 "line": 19
4641 },
4642 "file": "src/components/ui/PremiumFeatureContainer/index.js",
4643 "id": "premiumFeature.button.upgradeAccount",
4644 "start": {
4645 "column": 10,
4646 "line": 16
4647 }
4648 }
4649 ],
4650 "path": "src/components/ui/PremiumFeatureContainer/index.json"
4651 },
4652 {
4653 "descriptors": [
4654 {
4655 "defaultMessage": "!!!Upgrade to Franz Professional",
4656 "end": {
4657 "column": 3,
4658 "line": 16
4659 },
4660 "file": "src/components/ui/UpgradeButton/index.js",
4661 "id": "global.upgradeButton.upgradeToPro",
4662 "start": {
4663 "column": 16,
4664 "line": 13
4665 }
4666 }
4667 ],
4668 "path": "src/components/ui/UpgradeButton/index.json"
4669 },
4670 {
4671 "descriptors": [
4672 {
4673 "defaultMessage": "!!!Loading {service}", 3913 "defaultMessage": "!!!Loading {service}",
4674 "end": { 3914 "end": {
4675 "column": 3, 3915 "column": 3,
@@ -4722,247 +3962,247 @@
4722 "defaultMessage": "!!!Name", 3962 "defaultMessage": "!!!Name",
4723 "end": { 3963 "end": {
4724 "column": 3, 3964 "column": 3,
4725 "line": 32 3965 "line": 31
4726 }, 3966 },
4727 "file": "src/containers/settings/EditServiceScreen.js", 3967 "file": "src/containers/settings/EditServiceScreen.js",
4728 "id": "settings.service.form.name", 3968 "id": "settings.service.form.name",
4729 "start": { 3969 "start": {
4730 "column": 8, 3970 "column": 8,
4731 "line": 29 3971 "line": 28
4732 } 3972 }
4733 }, 3973 },
4734 { 3974 {
4735 "defaultMessage": "!!!Enable service", 3975 "defaultMessage": "!!!Enable service",
4736 "end": { 3976 "end": {
4737 "column": 3, 3977 "column": 3,
4738 "line": 36 3978 "line": 35
4739 }, 3979 },
4740 "file": "src/containers/settings/EditServiceScreen.js", 3980 "file": "src/containers/settings/EditServiceScreen.js",
4741 "id": "settings.service.form.enableService", 3981 "id": "settings.service.form.enableService",
4742 "start": { 3982 "start": {
4743 "column": 17, 3983 "column": 17,
4744 "line": 33 3984 "line": 32
4745 } 3985 }
4746 }, 3986 },
4747 { 3987 {
4748 "defaultMessage": "!!!Enable hibernation", 3988 "defaultMessage": "!!!Enable hibernation",
4749 "end": { 3989 "end": {
4750 "column": 3, 3990 "column": 3,
4751 "line": 40 3991 "line": 39
4752 }, 3992 },
4753 "file": "src/containers/settings/EditServiceScreen.js", 3993 "file": "src/containers/settings/EditServiceScreen.js",
4754 "id": "settings.service.form.enableHibernation", 3994 "id": "settings.service.form.enableHibernation",
4755 "start": { 3995 "start": {
4756 "column": 21, 3996 "column": 21,
4757 "line": 37 3997 "line": 36
4758 } 3998 }
4759 }, 3999 },
4760 { 4000 {
4761 "defaultMessage": "!!!Enable Notifications", 4001 "defaultMessage": "!!!Enable Notifications",
4762 "end": { 4002 "end": {
4763 "column": 3, 4003 "column": 3,
4764 "line": 44 4004 "line": 43
4765 }, 4005 },
4766 "file": "src/containers/settings/EditServiceScreen.js", 4006 "file": "src/containers/settings/EditServiceScreen.js",
4767 "id": "settings.service.form.enableNotification", 4007 "id": "settings.service.form.enableNotification",
4768 "start": { 4008 "start": {
4769 "column": 22, 4009 "column": 22,
4770 "line": 41 4010 "line": 40
4771 } 4011 }
4772 }, 4012 },
4773 { 4013 {
4774 "defaultMessage": "!!!Show unread message badges", 4014 "defaultMessage": "!!!Show unread message badges",
4775 "end": { 4015 "end": {
4776 "column": 3, 4016 "column": 3,
4777 "line": 48 4017 "line": 47
4778 }, 4018 },
4779 "file": "src/containers/settings/EditServiceScreen.js", 4019 "file": "src/containers/settings/EditServiceScreen.js",
4780 "id": "settings.service.form.enableBadge", 4020 "id": "settings.service.form.enableBadge",
4781 "start": { 4021 "start": {
4782 "column": 15, 4022 "column": 15,
4783 "line": 45 4023 "line": 44
4784 } 4024 }
4785 }, 4025 },
4786 { 4026 {
4787 "defaultMessage": "!!!Enable audio", 4027 "defaultMessage": "!!!Enable audio",
4788 "end": { 4028 "end": {
4789 "column": 3, 4029 "column": 3,
4790 "line": 52 4030 "line": 51
4791 }, 4031 },
4792 "file": "src/containers/settings/EditServiceScreen.js", 4032 "file": "src/containers/settings/EditServiceScreen.js",
4793 "id": "settings.service.form.enableAudio", 4033 "id": "settings.service.form.enableAudio",
4794 "start": { 4034 "start": {
4795 "column": 15, 4035 "column": 15,
4796 "line": 49 4036 "line": 48
4797 } 4037 }
4798 }, 4038 },
4799 { 4039 {
4800 "defaultMessage": "!!!Team", 4040 "defaultMessage": "!!!Team",
4801 "end": { 4041 "end": {
4802 "column": 3, 4042 "column": 3,
4803 "line": 56 4043 "line": 55
4804 }, 4044 },
4805 "file": "src/containers/settings/EditServiceScreen.js", 4045 "file": "src/containers/settings/EditServiceScreen.js",
4806 "id": "settings.service.form.team", 4046 "id": "settings.service.form.team",
4807 "start": { 4047 "start": {
4808 "column": 8, 4048 "column": 8,
4809 "line": 53 4049 "line": 52
4810 } 4050 }
4811 }, 4051 },
4812 { 4052 {
4813 "defaultMessage": "!!!Service URL", 4053 "defaultMessage": "!!!Service URL",
4814 "end": { 4054 "end": {
4815 "column": 3, 4055 "column": 3,
4816 "line": 60 4056 "line": 59
4817 }, 4057 },
4818 "file": "src/containers/settings/EditServiceScreen.js", 4058 "file": "src/containers/settings/EditServiceScreen.js",
4819 "id": "settings.service.form.customUrl", 4059 "id": "settings.service.form.customUrl",
4820 "start": { 4060 "start": {
4821 "column": 13, 4061 "column": 13,
4822 "line": 57 4062 "line": 56
4823 } 4063 }
4824 }, 4064 },
4825 { 4065 {
4826 "defaultMessage": "!!!Show message badge for all new messages", 4066 "defaultMessage": "!!!Show message badge for all new messages",
4827 "end": { 4067 "end": {
4828 "column": 3, 4068 "column": 3,
4829 "line": 64 4069 "line": 63
4830 }, 4070 },
4831 "file": "src/containers/settings/EditServiceScreen.js", 4071 "file": "src/containers/settings/EditServiceScreen.js",
4832 "id": "settings.service.form.indirectMessages", 4072 "id": "settings.service.form.indirectMessages",
4833 "start": { 4073 "start": {
4834 "column": 20, 4074 "column": 20,
4835 "line": 61 4075 "line": 60
4836 } 4076 }
4837 }, 4077 },
4838 { 4078 {
4839 "defaultMessage": "!!!Custom icon", 4079 "defaultMessage": "!!!Custom icon",
4840 "end": { 4080 "end": {
4841 "column": 3, 4081 "column": 3,
4842 "line": 68 4082 "line": 67
4843 }, 4083 },
4844 "file": "src/containers/settings/EditServiceScreen.js", 4084 "file": "src/containers/settings/EditServiceScreen.js",
4845 "id": "settings.service.form.icon", 4085 "id": "settings.service.form.icon",
4846 "start": { 4086 "start": {
4847 "column": 8, 4087 "column": 8,
4848 "line": 65 4088 "line": 64
4849 } 4089 }
4850 }, 4090 },
4851 { 4091 {
4852 "defaultMessage": "!!!Enable Dark Mode", 4092 "defaultMessage": "!!!Enable Dark Mode",
4853 "end": { 4093 "end": {
4854 "column": 3, 4094 "column": 3,
4855 "line": 72 4095 "line": 71
4856 }, 4096 },
4857 "file": "src/containers/settings/EditServiceScreen.js", 4097 "file": "src/containers/settings/EditServiceScreen.js",
4858 "id": "settings.service.form.enableDarkMode", 4098 "id": "settings.service.form.enableDarkMode",
4859 "start": { 4099 "start": {
4860 "column": 18, 4100 "column": 18,
4861 "line": 69 4101 "line": 68
4862 } 4102 }
4863 }, 4103 },
4864 { 4104 {
4865 "defaultMessage": "!!!Dark Reader Brightness", 4105 "defaultMessage": "!!!Dark Reader Brightness",
4866 "end": { 4106 "end": {
4867 "column": 3, 4107 "column": 3,
4868 "line": 76 4108 "line": 75
4869 }, 4109 },
4870 "file": "src/containers/settings/EditServiceScreen.js", 4110 "file": "src/containers/settings/EditServiceScreen.js",
4871 "id": "settings.service.form.darkReaderBrightness", 4111 "id": "settings.service.form.darkReaderBrightness",
4872 "start": { 4112 "start": {
4873 "column": 24, 4113 "column": 24,
4874 "line": 73 4114 "line": 72
4875 } 4115 }
4876 }, 4116 },
4877 { 4117 {
4878 "defaultMessage": "!!!Dark Reader Contrast", 4118 "defaultMessage": "!!!Dark Reader Contrast",
4879 "end": { 4119 "end": {
4880 "column": 3, 4120 "column": 3,
4881 "line": 80 4121 "line": 79
4882 }, 4122 },
4883 "file": "src/containers/settings/EditServiceScreen.js", 4123 "file": "src/containers/settings/EditServiceScreen.js",
4884 "id": "settings.service.form.darkReaderContrast", 4124 "id": "settings.service.form.darkReaderContrast",
4885 "start": { 4125 "start": {
4886 "column": 22, 4126 "column": 22,
4887 "line": 77 4127 "line": 76
4888 } 4128 }
4889 }, 4129 },
4890 { 4130 {
4891 "defaultMessage": "!!!Dark Reader Sepia", 4131 "defaultMessage": "!!!Dark Reader Sepia",
4892 "end": { 4132 "end": {
4893 "column": 3, 4133 "column": 3,
4894 "line": 84 4134 "line": 83
4895 }, 4135 },
4896 "file": "src/containers/settings/EditServiceScreen.js", 4136 "file": "src/containers/settings/EditServiceScreen.js",
4897 "id": "settings.service.form.darkReaderSepia", 4137 "id": "settings.service.form.darkReaderSepia",
4898 "start": { 4138 "start": {
4899 "column": 19, 4139 "column": 19,
4900 "line": 81 4140 "line": 80
4901 } 4141 }
4902 }, 4142 },
4903 { 4143 {
4904 "defaultMessage": "!!!Use Proxy", 4144 "defaultMessage": "!!!Use Proxy",
4905 "end": { 4145 "end": {
4906 "column": 3, 4146 "column": 3,
4907 "line": 88 4147 "line": 87
4908 }, 4148 },
4909 "file": "src/containers/settings/EditServiceScreen.js", 4149 "file": "src/containers/settings/EditServiceScreen.js",
4910 "id": "settings.service.form.proxy.isEnabled", 4150 "id": "settings.service.form.proxy.isEnabled",
4911 "start": { 4151 "start": {
4912 "column": 15, 4152 "column": 15,
4913 "line": 85 4153 "line": 84
4914 } 4154 }
4915 }, 4155 },
4916 { 4156 {
4917 "defaultMessage": "!!!Proxy Host/IP", 4157 "defaultMessage": "!!!Proxy Host/IP",
4918 "end": { 4158 "end": {
4919 "column": 3, 4159 "column": 3,
4920 "line": 92 4160 "line": 91
4921 }, 4161 },
4922 "file": "src/containers/settings/EditServiceScreen.js", 4162 "file": "src/containers/settings/EditServiceScreen.js",
4923 "id": "settings.service.form.proxy.host", 4163 "id": "settings.service.form.proxy.host",
4924 "start": { 4164 "start": {
4925 "column": 13, 4165 "column": 13,
4926 "line": 89 4166 "line": 88
4927 } 4167 }
4928 }, 4168 },
4929 { 4169 {
4930 "defaultMessage": "!!!Port", 4170 "defaultMessage": "!!!Port",
4931 "end": { 4171 "end": {
4932 "column": 3, 4172 "column": 3,
4933 "line": 96 4173 "line": 95
4934 }, 4174 },
4935 "file": "src/containers/settings/EditServiceScreen.js", 4175 "file": "src/containers/settings/EditServiceScreen.js",
4936 "id": "settings.service.form.proxy.port", 4176 "id": "settings.service.form.proxy.port",
4937 "start": { 4177 "start": {
4938 "column": 13, 4178 "column": 13,
4939 "line": 93 4179 "line": 92
4940 } 4180 }
4941 }, 4181 },
4942 { 4182 {
4943 "defaultMessage": "!!!User", 4183 "defaultMessage": "!!!User",
4944 "end": { 4184 "end": {
4945 "column": 3, 4185 "column": 3,
4946 "line": 100 4186 "line": 99
4947 }, 4187 },
4948 "file": "src/containers/settings/EditServiceScreen.js", 4188 "file": "src/containers/settings/EditServiceScreen.js",
4949 "id": "settings.service.form.proxy.user", 4189 "id": "settings.service.form.proxy.user",
4950 "start": { 4190 "start": {
4951 "column": 13, 4191 "column": 13,
4952 "line": 97 4192 "line": 96
4953 } 4193 }
4954 }, 4194 },
4955 { 4195 {
4956 "defaultMessage": "!!!Password", 4196 "defaultMessage": "!!!Password",
4957 "end": { 4197 "end": {
4958 "column": 3, 4198 "column": 3,
4959 "line": 104 4199 "line": 103
4960 }, 4200 },
4961 "file": "src/containers/settings/EditServiceScreen.js", 4201 "file": "src/containers/settings/EditServiceScreen.js",
4962 "id": "settings.service.form.proxy.password", 4202 "id": "settings.service.form.proxy.password",
4963 "start": { 4203 "start": {
4964 "column": 17, 4204 "column": 17,
4965 "line": 101 4205 "line": 100
4966 } 4206 }
4967 } 4207 }
4968 ], 4208 ],
@@ -4974,585 +4214,585 @@
4974 "defaultMessage": "!!!Launch Ferdi on start", 4214 "defaultMessage": "!!!Launch Ferdi on start",
4975 "end": { 4215 "end": {
4976 "column": 3, 4216 "column": 3,
4977 "line": 34 4217 "line": 35
4978 }, 4218 },
4979 "file": "src/containers/settings/EditSettingsScreen.js", 4219 "file": "src/containers/settings/EditSettingsScreen.js",
4980 "id": "settings.app.form.autoLaunchOnStart", 4220 "id": "settings.app.form.autoLaunchOnStart",
4981 "start": { 4221 "start": {
4982 "column": 21, 4222 "column": 21,
4983 "line": 31 4223 "line": 32
4984 } 4224 }
4985 }, 4225 },
4986 { 4226 {
4987 "defaultMessage": "!!!Open in background", 4227 "defaultMessage": "!!!Open in background",
4988 "end": { 4228 "end": {
4989 "column": 3, 4229 "column": 3,
4990 "line": 38 4230 "line": 39
4991 }, 4231 },
4992 "file": "src/containers/settings/EditSettingsScreen.js", 4232 "file": "src/containers/settings/EditSettingsScreen.js",
4993 "id": "settings.app.form.autoLaunchInBackground", 4233 "id": "settings.app.form.autoLaunchInBackground",
4994 "start": { 4234 "start": {
4995 "column": 26, 4235 "column": 26,
4996 "line": 35 4236 "line": 36
4997 } 4237 }
4998 }, 4238 },
4999 { 4239 {
5000 "defaultMessage": "!!!Keep Ferdi in background when closing the window", 4240 "defaultMessage": "!!!Keep Ferdi in background when closing the window",
5001 "end": { 4241 "end": {
5002 "column": 3, 4242 "column": 3,
5003 "line": 42 4243 "line": 43
5004 }, 4244 },
5005 "file": "src/containers/settings/EditSettingsScreen.js", 4245 "file": "src/containers/settings/EditSettingsScreen.js",
5006 "id": "settings.app.form.runInBackground", 4246 "id": "settings.app.form.runInBackground",
5007 "start": { 4247 "start": {
5008 "column": 19, 4248 "column": 19,
5009 "line": 39 4249 "line": 40
5010 } 4250 }
5011 }, 4251 },
5012 { 4252 {
5013 "defaultMessage": "!!!Start minimized", 4253 "defaultMessage": "!!!Start minimized",
5014 "end": { 4254 "end": {
5015 "column": 3, 4255 "column": 3,
5016 "line": 46 4256 "line": 47
5017 }, 4257 },
5018 "file": "src/containers/settings/EditSettingsScreen.js", 4258 "file": "src/containers/settings/EditSettingsScreen.js",
5019 "id": "settings.app.form.startMinimized", 4259 "id": "settings.app.form.startMinimized",
5020 "start": { 4260 "start": {
5021 "column": 18, 4261 "column": 18,
5022 "line": 43 4262 "line": 44
5023 } 4263 }
5024 }, 4264 },
5025 { 4265 {
5026 "defaultMessage": "!!!Always show Ferdi in System Tray", 4266 "defaultMessage": "!!!Always show Ferdi in System Tray",
5027 "end": { 4267 "end": {
5028 "column": 3, 4268 "column": 3,
5029 "line": 50 4269 "line": 51
5030 }, 4270 },
5031 "file": "src/containers/settings/EditSettingsScreen.js", 4271 "file": "src/containers/settings/EditSettingsScreen.js",
5032 "id": "settings.app.form.enableSystemTray", 4272 "id": "settings.app.form.enableSystemTray",
5033 "start": { 4273 "start": {
5034 "column": 20, 4274 "column": 20,
5035 "line": 47 4275 "line": 48
5036 } 4276 }
5037 }, 4277 },
5038 { 4278 {
5039 "defaultMessage": "!!!Always show Ferdi in Menu Bar", 4279 "defaultMessage": "!!!Always show Ferdi in Menu Bar",
5040 "end": { 4280 "end": {
5041 "column": 3, 4281 "column": 3,
5042 "line": 54 4282 "line": 55
5043 }, 4283 },
5044 "file": "src/containers/settings/EditSettingsScreen.js", 4284 "file": "src/containers/settings/EditSettingsScreen.js",
5045 "id": "settings.app.form.enableMenuBar", 4285 "id": "settings.app.form.enableMenuBar",
5046 "start": { 4286 "start": {
5047 "column": 17, 4287 "column": 17,
5048 "line": 51 4288 "line": 52
5049 } 4289 }
5050 }, 4290 },
5051 { 4291 {
5052 "defaultMessage": "!!!Reload Ferdi after system resume", 4292 "defaultMessage": "!!!Reload Ferdi after system resume",
5053 "end": { 4293 "end": {
5054 "column": 3, 4294 "column": 3,
5055 "line": 58 4295 "line": 59
5056 }, 4296 },
5057 "file": "src/containers/settings/EditSettingsScreen.js", 4297 "file": "src/containers/settings/EditSettingsScreen.js",
5058 "id": "settings.app.form.reloadAfterResume", 4298 "id": "settings.app.form.reloadAfterResume",
5059 "start": { 4299 "start": {
5060 "column": 21, 4300 "column": 21,
5061 "line": 55 4301 "line": 56
5062 } 4302 }
5063 }, 4303 },
5064 { 4304 {
5065 "defaultMessage": "!!!Minimize Ferdi to system tray", 4305 "defaultMessage": "!!!Minimize Ferdi to system tray",
5066 "end": { 4306 "end": {
5067 "column": 3, 4307 "column": 3,
5068 "line": 62 4308 "line": 63
5069 }, 4309 },
5070 "file": "src/containers/settings/EditSettingsScreen.js", 4310 "file": "src/containers/settings/EditSettingsScreen.js",
5071 "id": "settings.app.form.minimizeToSystemTray", 4311 "id": "settings.app.form.minimizeToSystemTray",
5072 "start": { 4312 "start": {
5073 "column": 24, 4313 "column": 24,
5074 "line": 59 4314 "line": 60
5075 } 4315 }
5076 }, 4316 },
5077 { 4317 {
5078 "defaultMessage": "!!!Close Ferdi to system tray", 4318 "defaultMessage": "!!!Close Ferdi to system tray",
5079 "end": { 4319 "end": {
5080 "column": 3, 4320 "column": 3,
5081 "line": 66 4321 "line": 67
5082 }, 4322 },
5083 "file": "src/containers/settings/EditSettingsScreen.js", 4323 "file": "src/containers/settings/EditSettingsScreen.js",
5084 "id": "settings.app.form.closeToSystemTray", 4324 "id": "settings.app.form.closeToSystemTray",
5085 "start": { 4325 "start": {
5086 "column": 21, 4326 "column": 21,
5087 "line": 63 4327 "line": 64
5088 } 4328 }
5089 }, 4329 },
5090 { 4330 {
5091 "defaultMessage": "!!!Don't show message content in notifications", 4331 "defaultMessage": "!!!Don't show message content in notifications",
5092 "end": { 4332 "end": {
5093 "column": 3, 4333 "column": 3,
5094 "line": 70 4334 "line": 71
5095 }, 4335 },
5096 "file": "src/containers/settings/EditSettingsScreen.js", 4336 "file": "src/containers/settings/EditSettingsScreen.js",
5097 "id": "settings.app.form.privateNotifications", 4337 "id": "settings.app.form.privateNotifications",
5098 "start": { 4338 "start": {
5099 "column": 24, 4339 "column": 24,
5100 "line": 67 4340 "line": 68
5101 } 4341 }
5102 }, 4342 },
5103 { 4343 {
5104 "defaultMessage": "!!!Don't show notifications for clipboard events", 4344 "defaultMessage": "!!!Don't show notifications for clipboard events",
5105 "end": { 4345 "end": {
5106 "column": 3, 4346 "column": 3,
5107 "line": 74 4347 "line": 75
5108 }, 4348 },
5109 "file": "src/containers/settings/EditSettingsScreen.js", 4349 "file": "src/containers/settings/EditSettingsScreen.js",
5110 "id": "settings.app.form.clipboardNotifications", 4350 "id": "settings.app.form.clipboardNotifications",
5111 "start": { 4351 "start": {
5112 "column": 26, 4352 "column": 26,
5113 "line": 71 4353 "line": 72
5114 } 4354 }
5115 }, 4355 },
5116 { 4356 {
5117 "defaultMessage": "!!!Notify TaskBar/Dock on new message", 4357 "defaultMessage": "!!!Notify TaskBar/Dock on new message",
5118 "end": { 4358 "end": {
5119 "column": 3, 4359 "column": 3,
5120 "line": 78 4360 "line": 79
5121 }, 4361 },
5122 "file": "src/containers/settings/EditSettingsScreen.js", 4362 "file": "src/containers/settings/EditSettingsScreen.js",
5123 "id": "settings.app.form.notifyTaskBarOnMessage", 4363 "id": "settings.app.form.notifyTaskBarOnMessage",
5124 "start": { 4364 "start": {
5125 "column": 26, 4365 "column": 26,
5126 "line": 75 4366 "line": 76
5127 } 4367 }
5128 }, 4368 },
5129 { 4369 {
5130 "defaultMessage": "!!!Navigation bar behaviour", 4370 "defaultMessage": "!!!Navigation bar behaviour",
5131 "end": { 4371 "end": {
5132 "column": 3, 4372 "column": 3,
5133 "line": 82 4373 "line": 83
5134 }, 4374 },
5135 "file": "src/containers/settings/EditSettingsScreen.js", 4375 "file": "src/containers/settings/EditSettingsScreen.js",
5136 "id": "settings.app.form.navigationBarBehaviour", 4376 "id": "settings.app.form.navigationBarBehaviour",
5137 "start": { 4377 "start": {
5138 "column": 26, 4378 "column": 26,
5139 "line": 79 4379 "line": 80
5140 } 4380 }
5141 }, 4381 },
5142 { 4382 {
5143 "defaultMessage": "!!!Search engine", 4383 "defaultMessage": "!!!Search engine",
5144 "end": { 4384 "end": {
5145 "column": 3, 4385 "column": 3,
5146 "line": 86 4386 "line": 87
5147 }, 4387 },
5148 "file": "src/containers/settings/EditSettingsScreen.js", 4388 "file": "src/containers/settings/EditSettingsScreen.js",
5149 "id": "settings.app.form.searchEngine", 4389 "id": "settings.app.form.searchEngine",
5150 "start": { 4390 "start": {
5151 "column": 16, 4391 "column": 16,
5152 "line": 83 4392 "line": 84
5153 } 4393 }
5154 }, 4394 },
5155 { 4395 {
5156 "defaultMessage": "!!!Send telemetry data", 4396 "defaultMessage": "!!!Send telemetry data",
5157 "end": { 4397 "end": {
5158 "column": 3, 4398 "column": 3,
5159 "line": 90 4399 "line": 91
5160 }, 4400 },
5161 "file": "src/containers/settings/EditSettingsScreen.js", 4401 "file": "src/containers/settings/EditSettingsScreen.js",
5162 "id": "settings.app.form.sentry", 4402 "id": "settings.app.form.sentry",
5163 "start": { 4403 "start": {
5164 "column": 10, 4404 "column": 10,
5165 "line": 87 4405 "line": 88
5166 } 4406 }
5167 }, 4407 },
5168 { 4408 {
5169 "defaultMessage": "!!!Enable service hibernation", 4409 "defaultMessage": "!!!Keep services in hibernation on startup",
5170 "end": { 4410 "end": {
5171 "column": 3, 4411 "column": 3,
5172 "line": 94 4412 "line": 95
5173 }, 4413 },
5174 "file": "src/containers/settings/EditSettingsScreen.js", 4414 "file": "src/containers/settings/EditSettingsScreen.js",
5175 "id": "settings.app.form.hibernate", 4415 "id": "settings.app.form.hibernateOnStartup",
5176 "start": { 4416 "start": {
5177 "column": 13, 4417 "column": 22,
5178 "line": 91 4418 "line": 92
5179 } 4419 }
5180 }, 4420 },
5181 { 4421 {
5182 "defaultMessage": "!!!Keep services in hibernation on startup", 4422 "defaultMessage": "!!!Hibernation strategy",
5183 "end": { 4423 "end": {
5184 "column": 3, 4424 "column": 3,
5185 "line": 98 4425 "line": 99
5186 }, 4426 },
5187 "file": "src/containers/settings/EditSettingsScreen.js", 4427 "file": "src/containers/settings/EditSettingsScreen.js",
5188 "id": "settings.app.form.hibernateOnStartup", 4428 "id": "settings.app.form.hibernationStrategy",
5189 "start": { 4429 "start": {
5190 "column": 22, 4430 "column": 23,
5191 "line": 95 4431 "line": 96
5192 } 4432 }
5193 }, 4433 },
5194 { 4434 {
5195 "defaultMessage": "!!!Hibernation strategy", 4435 "defaultMessage": "!!!Wake up strategy",
5196 "end": { 4436 "end": {
5197 "column": 3, 4437 "column": 3,
5198 "line": 102 4438 "line": 103
5199 }, 4439 },
5200 "file": "src/containers/settings/EditSettingsScreen.js", 4440 "file": "src/containers/settings/EditSettingsScreen.js",
5201 "id": "settings.app.form.hibernationStrategy", 4441 "id": "settings.app.form.wakeUpStrategy",
5202 "start": { 4442 "start": {
5203 "column": 23, 4443 "column": 18,
5204 "line": 99 4444 "line": 100
5205 } 4445 }
5206 }, 4446 },
5207 { 4447 {
5208 "defaultMessage": "!!!Todo Server", 4448 "defaultMessage": "!!!Todo Server",
5209 "end": { 4449 "end": {
5210 "column": 3, 4450 "column": 3,
5211 "line": 106 4451 "line": 107
5212 }, 4452 },
5213 "file": "src/containers/settings/EditSettingsScreen.js", 4453 "file": "src/containers/settings/EditSettingsScreen.js",
5214 "id": "settings.app.form.predefinedTodoServer", 4454 "id": "settings.app.form.predefinedTodoServer",
5215 "start": { 4455 "start": {
5216 "column": 24, 4456 "column": 24,
5217 "line": 103 4457 "line": 104
5218 } 4458 }
5219 }, 4459 },
5220 { 4460 {
5221 "defaultMessage": "!!!Custom TodoServer", 4461 "defaultMessage": "!!!Custom TodoServer",
5222 "end": { 4462 "end": {
5223 "column": 3, 4463 "column": 3,
5224 "line": 110 4464 "line": 111
5225 }, 4465 },
5226 "file": "src/containers/settings/EditSettingsScreen.js", 4466 "file": "src/containers/settings/EditSettingsScreen.js",
5227 "id": "settings.app.form.customTodoServer", 4467 "id": "settings.app.form.customTodoServer",
5228 "start": { 4468 "start": {
5229 "column": 20, 4469 "column": 20,
5230 "line": 107 4470 "line": 108
5231 } 4471 }
5232 }, 4472 },
5233 { 4473 {
5234 "defaultMessage": "!!!Enable Password Lock", 4474 "defaultMessage": "!!!Enable Password Lock",
5235 "end": { 4475 "end": {
5236 "column": 3, 4476 "column": 3,
5237 "line": 114 4477 "line": 115
5238 }, 4478 },
5239 "file": "src/containers/settings/EditSettingsScreen.js", 4479 "file": "src/containers/settings/EditSettingsScreen.js",
5240 "id": "settings.app.form.enableLock", 4480 "id": "settings.app.form.enableLock",
5241 "start": { 4481 "start": {
5242 "column": 14, 4482 "column": 14,
5243 "line": 111 4483 "line": 112
5244 } 4484 }
5245 }, 4485 },
5246 { 4486 {
5247 "defaultMessage": "!!!Password", 4487 "defaultMessage": "!!!Password",
5248 "end": { 4488 "end": {
5249 "column": 3, 4489 "column": 3,
5250 "line": 118 4490 "line": 119
5251 }, 4491 },
5252 "file": "src/containers/settings/EditSettingsScreen.js", 4492 "file": "src/containers/settings/EditSettingsScreen.js",
5253 "id": "settings.app.form.lockPassword", 4493 "id": "settings.app.form.lockPassword",
5254 "start": { 4494 "start": {
5255 "column": 16, 4495 "column": 16,
5256 "line": 115 4496 "line": 116
5257 } 4497 }
5258 }, 4498 },
5259 { 4499 {
5260 "defaultMessage": "!!!Allow using Touch ID to unlock", 4500 "defaultMessage": "!!!Allow using Touch ID to unlock",
5261 "end": { 4501 "end": {
5262 "column": 3, 4502 "column": 3,
5263 "line": 122 4503 "line": 123
5264 }, 4504 },
5265 "file": "src/containers/settings/EditSettingsScreen.js", 4505 "file": "src/containers/settings/EditSettingsScreen.js",
5266 "id": "settings.app.form.useTouchIdToUnlock", 4506 "id": "settings.app.form.useTouchIdToUnlock",
5267 "start": { 4507 "start": {
5268 "column": 22, 4508 "column": 22,
5269 "line": 119 4509 "line": 120
5270 } 4510 }
5271 }, 4511 },
5272 { 4512 {
5273 "defaultMessage": "!!!Lock after inactivity", 4513 "defaultMessage": "!!!Lock after inactivity",
5274 "end": { 4514 "end": {
5275 "column": 3, 4515 "column": 3,
5276 "line": 126 4516 "line": 127
5277 }, 4517 },
5278 "file": "src/containers/settings/EditSettingsScreen.js", 4518 "file": "src/containers/settings/EditSettingsScreen.js",
5279 "id": "settings.app.form.inactivityLock", 4519 "id": "settings.app.form.inactivityLock",
5280 "start": { 4520 "start": {
5281 "column": 18, 4521 "column": 18,
5282 "line": 123 4522 "line": 124
5283 } 4523 }
5284 }, 4524 },
5285 { 4525 {
5286 "defaultMessage": "!!!Enable scheduled Do-not-Disturb", 4526 "defaultMessage": "!!!Enable scheduled Do-not-Disturb",
5287 "end": { 4527 "end": {
5288 "column": 3, 4528 "column": 3,
5289 "line": 130 4529 "line": 131
5290 }, 4530 },
5291 "file": "src/containers/settings/EditSettingsScreen.js", 4531 "file": "src/containers/settings/EditSettingsScreen.js",
5292 "id": "settings.app.form.scheduledDNDEnabled", 4532 "id": "settings.app.form.scheduledDNDEnabled",
5293 "start": { 4533 "start": {
5294 "column": 23, 4534 "column": 23,
5295 "line": 127 4535 "line": 128
5296 } 4536 }
5297 }, 4537 },
5298 { 4538 {
5299 "defaultMessage": "!!!From", 4539 "defaultMessage": "!!!From",
5300 "end": { 4540 "end": {
5301 "column": 3, 4541 "column": 3,
5302 "line": 134 4542 "line": 135
5303 }, 4543 },
5304 "file": "src/containers/settings/EditSettingsScreen.js", 4544 "file": "src/containers/settings/EditSettingsScreen.js",
5305 "id": "settings.app.form.scheduledDNDStart", 4545 "id": "settings.app.form.scheduledDNDStart",
5306 "start": { 4546 "start": {
5307 "column": 21, 4547 "column": 21,
5308 "line": 131 4548 "line": 132
5309 } 4549 }
5310 }, 4550 },
5311 { 4551 {
5312 "defaultMessage": "!!!To", 4552 "defaultMessage": "!!!To",
5313 "end": { 4553 "end": {
5314 "column": 3, 4554 "column": 3,
5315 "line": 138 4555 "line": 139
5316 }, 4556 },
5317 "file": "src/containers/settings/EditSettingsScreen.js", 4557 "file": "src/containers/settings/EditSettingsScreen.js",
5318 "id": "settings.app.form.scheduledDNDEnd", 4558 "id": "settings.app.form.scheduledDNDEnd",
5319 "start": { 4559 "start": {
5320 "column": 19, 4560 "column": 19,
5321 "line": 135 4561 "line": 136
5322 } 4562 }
5323 }, 4563 },
5324 { 4564 {
5325 "defaultMessage": "!!!Language", 4565 "defaultMessage": "!!!Language",
5326 "end": { 4566 "end": {
5327 "column": 3, 4567 "column": 3,
5328 "line": 142 4568 "line": 143
5329 }, 4569 },
5330 "file": "src/containers/settings/EditSettingsScreen.js", 4570 "file": "src/containers/settings/EditSettingsScreen.js",
5331 "id": "settings.app.form.language", 4571 "id": "settings.app.form.language",
5332 "start": { 4572 "start": {
5333 "column": 12, 4573 "column": 12,
5334 "line": 139 4574 "line": 140
5335 } 4575 }
5336 }, 4576 },
5337 { 4577 {
5338 "defaultMessage": "!!!Dark Mode", 4578 "defaultMessage": "!!!Dark Mode",
5339 "end": { 4579 "end": {
5340 "column": 3, 4580 "column": 3,
5341 "line": 146 4581 "line": 147
5342 }, 4582 },
5343 "file": "src/containers/settings/EditSettingsScreen.js", 4583 "file": "src/containers/settings/EditSettingsScreen.js",
5344 "id": "settings.app.form.darkMode", 4584 "id": "settings.app.form.darkMode",
5345 "start": { 4585 "start": {
5346 "column": 12, 4586 "column": 12,
5347 "line": 143 4587 "line": 144
5348 } 4588 }
5349 }, 4589 },
5350 { 4590 {
5351 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting", 4591 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting",
5352 "end": { 4592 "end": {
5353 "column": 3, 4593 "column": 3,
5354 "line": 150 4594 "line": 151
5355 }, 4595 },
5356 "file": "src/containers/settings/EditSettingsScreen.js", 4596 "file": "src/containers/settings/EditSettingsScreen.js",
5357 "id": "settings.app.form.adaptableDarkMode", 4597 "id": "settings.app.form.adaptableDarkMode",
5358 "start": { 4598 "start": {
5359 "column": 21, 4599 "column": 21,
5360 "line": 147 4600 "line": 148
5361 } 4601 }
5362 }, 4602 },
5363 { 4603 {
5364 "defaultMessage": "!!!Enable universal Dark Mode", 4604 "defaultMessage": "!!!Enable universal Dark Mode",
5365 "end": { 4605 "end": {
5366 "column": 3, 4606 "column": 3,
5367 "line": 154 4607 "line": 155
5368 }, 4608 },
5369 "file": "src/containers/settings/EditSettingsScreen.js", 4609 "file": "src/containers/settings/EditSettingsScreen.js",
5370 "id": "settings.app.form.universalDarkMode", 4610 "id": "settings.app.form.universalDarkMode",
5371 "start": { 4611 "start": {
5372 "column": 21, 4612 "column": 21,
5373 "line": 151 4613 "line": 152
5374 } 4614 }
5375 }, 4615 },
5376 { 4616 {
5377 "defaultMessage": "!!!Sidebar width", 4617 "defaultMessage": "!!!Sidebar width",
5378 "end": { 4618 "end": {
5379 "column": 3, 4619 "column": 3,
5380 "line": 158 4620 "line": 159
5381 }, 4621 },
5382 "file": "src/containers/settings/EditSettingsScreen.js", 4622 "file": "src/containers/settings/EditSettingsScreen.js",
5383 "id": "settings.app.form.serviceRibbonWidth", 4623 "id": "settings.app.form.serviceRibbonWidth",
5384 "start": { 4624 "start": {
5385 "column": 22, 4625 "column": 22,
5386 "line": 155 4626 "line": 156
5387 } 4627 }
5388 }, 4628 },
5389 { 4629 {
5390 "defaultMessage": "!!!Service icon size", 4630 "defaultMessage": "!!!Service icon size",
5391 "end": { 4631 "end": {
5392 "column": 3, 4632 "column": 3,
5393 "line": 162 4633 "line": 163
5394 }, 4634 },
5395 "file": "src/containers/settings/EditSettingsScreen.js", 4635 "file": "src/containers/settings/EditSettingsScreen.js",
5396 "id": "settings.app.form.iconSize", 4636 "id": "settings.app.form.iconSize",
5397 "start": { 4637 "start": {
5398 "column": 12, 4638 "column": 12,
5399 "line": 159 4639 "line": 160
5400 } 4640 }
5401 }, 4641 },
5402 { 4642 {
5403 "defaultMessage": "!!!Use vertical style", 4643 "defaultMessage": "!!!Use vertical style",
5404 "end": { 4644 "end": {
5405 "column": 3, 4645 "column": 3,
5406 "line": 166 4646 "line": 167
5407 }, 4647 },
5408 "file": "src/containers/settings/EditSettingsScreen.js", 4648 "file": "src/containers/settings/EditSettingsScreen.js",
5409 "id": "settings.app.form.useVerticalStyle", 4649 "id": "settings.app.form.useVerticalStyle",
5410 "start": { 4650 "start": {
5411 "column": 20, 4651 "column": 20,
5412 "line": 163 4652 "line": 164
5413 } 4653 }
5414 }, 4654 },
5415 { 4655 {
5416 "defaultMessage": "!!!Always show workspace drawer", 4656 "defaultMessage": "!!!Always show workspace drawer",
5417 "end": { 4657 "end": {
5418 "column": 3, 4658 "column": 3,
5419 "line": 170 4659 "line": 171
5420 }, 4660 },
5421 "file": "src/containers/settings/EditSettingsScreen.js", 4661 "file": "src/containers/settings/EditSettingsScreen.js",
5422 "id": "settings.app.form.alwaysShowWorkspaces", 4662 "id": "settings.app.form.alwaysShowWorkspaces",
5423 "start": { 4663 "start": {
5424 "column": 24, 4664 "column": 24,
5425 "line": 167 4665 "line": 168
5426 } 4666 }
5427 }, 4667 },
5428 { 4668 {
5429 "defaultMessage": "!!!Accent color", 4669 "defaultMessage": "!!!Accent color",
5430 "end": { 4670 "end": {
5431 "column": 3, 4671 "column": 3,
5432 "line": 174 4672 "line": 175
5433 }, 4673 },
5434 "file": "src/containers/settings/EditSettingsScreen.js", 4674 "file": "src/containers/settings/EditSettingsScreen.js",
5435 "id": "settings.app.form.accentColor", 4675 "id": "settings.app.form.accentColor",
5436 "start": { 4676 "start": {
5437 "column": 15, 4677 "column": 15,
5438 "line": 171 4678 "line": 172
5439 } 4679 }
5440 }, 4680 },
5441 { 4681 {
5442 "defaultMessage": "!!!Display disabled services tabs", 4682 "defaultMessage": "!!!Display disabled services tabs",
5443 "end": { 4683 "end": {
5444 "column": 3, 4684 "column": 3,
5445 "line": 178 4685 "line": 179
5446 }, 4686 },
5447 "file": "src/containers/settings/EditSettingsScreen.js", 4687 "file": "src/containers/settings/EditSettingsScreen.js",
5448 "id": "settings.app.form.showDisabledServices", 4688 "id": "settings.app.form.showDisabledServices",
5449 "start": { 4689 "start": {
5450 "column": 24, 4690 "column": 24,
5451 "line": 175 4691 "line": 176
5452 } 4692 }
5453 }, 4693 },
5454 { 4694 {
5455 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 4695 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
5456 "end": { 4696 "end": {
5457 "column": 3, 4697 "column": 3,
5458 "line": 182 4698 "line": 183
5459 }, 4699 },
5460 "file": "src/containers/settings/EditSettingsScreen.js", 4700 "file": "src/containers/settings/EditSettingsScreen.js",
5461 "id": "settings.app.form.showMessagesBadgesWhenMuted", 4701 "id": "settings.app.form.showMessagesBadgesWhenMuted",
5462 "start": { 4702 "start": {
5463 "column": 29, 4703 "column": 29,
5464 "line": 179 4704 "line": 180
5465 } 4705 }
5466 }, 4706 },
5467 { 4707 {
5468 "defaultMessage": "!!!Show draggable area on window", 4708 "defaultMessage": "!!!Show draggable area on window",
5469 "end": { 4709 "end": {
5470 "column": 3, 4710 "column": 3,
5471 "line": 186 4711 "line": 187
5472 }, 4712 },
5473 "file": "src/containers/settings/EditSettingsScreen.js", 4713 "file": "src/containers/settings/EditSettingsScreen.js",
5474 "id": "settings.app.form.showDragArea", 4714 "id": "settings.app.form.showDragArea",
5475 "start": { 4715 "start": {
5476 "column": 16, 4716 "column": 16,
5477 "line": 183 4717 "line": 184
5478 } 4718 }
5479 }, 4719 },
5480 { 4720 {
5481 "defaultMessage": "!!!Enable spell checking", 4721 "defaultMessage": "!!!Enable spell checking",
5482 "end": { 4722 "end": {
5483 "column": 3, 4723 "column": 3,
5484 "line": 190 4724 "line": 191
5485 }, 4725 },
5486 "file": "src/containers/settings/EditSettingsScreen.js", 4726 "file": "src/containers/settings/EditSettingsScreen.js",
5487 "id": "settings.app.form.enableSpellchecking", 4727 "id": "settings.app.form.enableSpellchecking",
5488 "start": { 4728 "start": {
5489 "column": 23, 4729 "column": 23,
5490 "line": 187 4730 "line": 188
5491 } 4731 }
5492 }, 4732 },
5493 { 4733 {
5494 "defaultMessage": "!!!Enable GPU Acceleration", 4734 "defaultMessage": "!!!Enable GPU Acceleration",
5495 "end": { 4735 "end": {
5496 "column": 3, 4736 "column": 3,
5497 "line": 194 4737 "line": 195
5498 }, 4738 },
5499 "file": "src/containers/settings/EditSettingsScreen.js", 4739 "file": "src/containers/settings/EditSettingsScreen.js",
5500 "id": "settings.app.form.enableGPUAcceleration", 4740 "id": "settings.app.form.enableGPUAcceleration",
5501 "start": { 4741 "start": {
5502 "column": 25, 4742 "column": 25,
5503 "line": 191 4743 "line": 192
5504 } 4744 }
5505 }, 4745 },
5506 { 4746 {
5507 "defaultMessage": "!!!Include beta versions", 4747 "defaultMessage": "!!!Include beta versions",
5508 "end": { 4748 "end": {
5509 "column": 3, 4749 "column": 3,
5510 "line": 198 4750 "line": 199
5511 }, 4751 },
5512 "file": "src/containers/settings/EditSettingsScreen.js", 4752 "file": "src/containers/settings/EditSettingsScreen.js",
5513 "id": "settings.app.form.beta", 4753 "id": "settings.app.form.beta",
5514 "start": { 4754 "start": {
5515 "column": 8, 4755 "column": 8,
5516 "line": 195 4756 "line": 196
5517 } 4757 }
5518 }, 4758 },
5519 { 4759 {
5520 "defaultMessage": "!!!Enable updates", 4760 "defaultMessage": "!!!Enable updates",
5521 "end": { 4761 "end": {
5522 "column": 3, 4762 "column": 3,
5523 "line": 202 4763 "line": 203
5524 }, 4764 },
5525 "file": "src/containers/settings/EditSettingsScreen.js", 4765 "file": "src/containers/settings/EditSettingsScreen.js",
5526 "id": "settings.app.form.automaticUpdates", 4766 "id": "settings.app.form.automaticUpdates",
5527 "start": { 4767 "start": {
5528 "column": 20, 4768 "column": 20,
5529 "line": 199 4769 "line": 200
5530 } 4770 }
5531 }, 4771 },
5532 { 4772 {
5533 "defaultMessage": "!!!Enable Franz Todos", 4773 "defaultMessage": "!!!Enable Franz Todos",
5534 "end": { 4774 "end": {
5535 "column": 3, 4775 "column": 3,
5536 "line": 206 4776 "line": 207
5537 }, 4777 },
5538 "file": "src/containers/settings/EditSettingsScreen.js", 4778 "file": "src/containers/settings/EditSettingsScreen.js",
5539 "id": "settings.app.form.enableTodos", 4779 "id": "settings.app.form.enableTodos",
5540 "start": { 4780 "start": {
5541 "column": 15, 4781 "column": 15,
5542 "line": 203 4782 "line": 204
5543 } 4783 }
5544 }, 4784 },
5545 { 4785 {
5546 "defaultMessage": "!!!Keep all workspaces loaded", 4786 "defaultMessage": "!!!Keep all workspaces loaded",
5547 "end": { 4787 "end": {
5548 "column": 3, 4788 "column": 3,
5549 "line": 210 4789 "line": 211
5550 }, 4790 },
5551 "file": "src/containers/settings/EditSettingsScreen.js", 4791 "file": "src/containers/settings/EditSettingsScreen.js",
5552 "id": "settings.app.form.keepAllWorkspacesLoaded", 4792 "id": "settings.app.form.keepAllWorkspacesLoaded",
5553 "start": { 4793 "start": {
5554 "column": 27, 4794 "column": 27,
5555 "line": 207 4795 "line": 208
5556 } 4796 }
5557 } 4797 }
5558 ], 4798 ],
@@ -5719,76 +4959,6 @@
5719 { 4959 {
5720 "descriptors": [ 4960 "descriptors": [
5721 { 4961 {
5722 "defaultMessage": "!!!Please purchase license to skip waiting",
5723 "end": {
5724 "column": 3,
5725 "line": 19
5726 },
5727 "file": "src/features/delayApp/Component.js",
5728 "id": "feature.delayApp.headline",
5729 "start": {
5730 "column": 12,
5731 "line": 16
5732 }
5733 },
5734 {
5735 "defaultMessage": "!!!Get the free Franz Professional 14 day trial and skip the line",
5736 "end": {
5737 "column": 3,
5738 "line": 23
5739 },
5740 "file": "src/features/delayApp/Component.js",
5741 "id": "feature.delayApp.trial.headline",
5742 "start": {
5743 "column": 17,
5744 "line": 20
5745 }
5746 },
5747 {
5748 "defaultMessage": "!!!Upgrade Franz",
5749 "end": {
5750 "column": 3,
5751 "line": 27
5752 },
5753 "file": "src/features/delayApp/Component.js",
5754 "id": "feature.delayApp.upgrade.action",
5755 "start": {
5756 "column": 10,
5757 "line": 24
5758 }
5759 },
5760 {
5761 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
5762 "end": {
5763 "column": 3,
5764 "line": 31
5765 },
5766 "file": "src/features/delayApp/Component.js",
5767 "id": "feature.delayApp.trial.action",
5768 "start": {
5769 "column": 15,
5770 "line": 28
5771 }
5772 },
5773 {
5774 "defaultMessage": "!!!Ferdi will continue in {seconds} seconds.",
5775 "end": {
5776 "column": 3,
5777 "line": 35
5778 },
5779 "file": "src/features/delayApp/Component.js",
5780 "id": "feature.delayApp.text",
5781 "start": {
5782 "column": 8,
5783 "line": 32
5784 }
5785 }
5786 ],
5787 "path": "src/features/delayApp/Component.json"
5788 },
5789 {
5790 "descriptors": [
5791 {
5792 "defaultMessage": "!!!Nightly Builds", 4962 "defaultMessage": "!!!Nightly Builds",
5793 "end": { 4963 "end": {
5794 "column": 3, 4964 "column": 3,
@@ -5846,299 +5016,6 @@
5846 { 5016 {
5847 "descriptors": [ 5017 "descriptors": [
5848 { 5018 {
5849 "defaultMessage": "!!!per month",
5850 "end": {
5851 "column": 3,
5852 "line": 18
5853 },
5854 "file": "src/features/planSelection/components/PlanItem.js",
5855 "id": "subscription.interval.perMonth",
5856 "start": {
5857 "column": 12,
5858 "line": 15
5859 }
5860 },
5861 {
5862 "defaultMessage": "!!!per month & user",
5863 "end": {
5864 "column": 3,
5865 "line": 22
5866 },
5867 "file": "src/features/planSelection/components/PlanItem.js",
5868 "id": "subscription.interval.perMonthPerUser",
5869 "start": {
5870 "column": 19,
5871 "line": 19
5872 }
5873 },
5874 {
5875 "defaultMessage": "!!!Best value",
5876 "end": {
5877 "column": 3,
5878 "line": 26
5879 },
5880 "file": "src/features/planSelection/components/PlanItem.js",
5881 "id": "subscription.bestValue",
5882 "start": {
5883 "column": 13,
5884 "line": 23
5885 }
5886 }
5887 ],
5888 "path": "src/features/planSelection/components/PlanItem.json"
5889 },
5890 {
5891 "descriptors": [
5892 {
5893 "defaultMessage": "!!!Are you ready to choose, {name}",
5894 "end": {
5895 "column": 3,
5896 "line": 20
5897 },
5898 "file": "src/features/planSelection/components/PlanSelection.js",
5899 "id": "feature.planSelection.fullscreen.welcome",
5900 "start": {
5901 "column": 11,
5902 "line": 17
5903 }
5904 },
5905 {
5906 "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.",
5907 "end": {
5908 "column": 3,
5909 "line": 24
5910 },
5911 "file": "src/features/planSelection/components/PlanSelection.js",
5912 "id": "feature.planSelection.fullscreen.subheadline",
5913 "start": {
5914 "column": 15,
5915 "line": 21
5916 }
5917 },
5918 {
5919 "defaultMessage": "!!!Basic functionality",
5920 "end": {
5921 "column": 3,
5922 "line": 28
5923 },
5924 "file": "src/features/planSelection/components/PlanSelection.js",
5925 "id": "feature.planSelection.free.text",
5926 "start": {
5927 "column": 12,
5928 "line": 25
5929 }
5930 },
5931 {
5932 "defaultMessage": "!!!More services, no waiting - ideal for personal use.",
5933 "end": {
5934 "column": 3,
5935 "line": 32
5936 },
5937 "file": "src/features/planSelection/components/PlanSelection.js",
5938 "id": "feature.planSelection.personal.text",
5939 "start": {
5940 "column": 16,
5941 "line": 29
5942 }
5943 },
5944 {
5945 "defaultMessage": "!!!Unlimited services and professional features for you - and your team.",
5946 "end": {
5947 "column": 3,
5948 "line": 36
5949 },
5950 "file": "src/features/planSelection/components/PlanSelection.js",
5951 "id": "feature.planSelection.pro.text",
5952 "start": {
5953 "column": 20,
5954 "line": 33
5955 }
5956 },
5957 {
5958 "defaultMessage": "!!!Stay on Free",
5959 "end": {
5960 "column": 3,
5961 "line": 40
5962 },
5963 "file": "src/features/planSelection/components/PlanSelection.js",
5964 "id": "feature.planSelection.cta.stayOnFree",
5965 "start": {
5966 "column": 17,
5967 "line": 37
5968 }
5969 },
5970 {
5971 "defaultMessage": "!!!Downgrade to Free",
5972 "end": {
5973 "column": 3,
5974 "line": 44
5975 },
5976 "file": "src/features/planSelection/components/PlanSelection.js",
5977 "id": "feature.planSelection.cta.ctaDowngradeFree",
5978 "start": {
5979 "column": 20,
5980 "line": 41
5981 }
5982 },
5983 {
5984 "defaultMessage": "!!!Start my free 14-days Trial",
5985 "end": {
5986 "column": 3,
5987 "line": 48
5988 },
5989 "file": "src/features/planSelection/components/PlanSelection.js",
5990 "id": "feature.planSelection.cta.trial",
5991 "start": {
5992 "column": 15,
5993 "line": 45
5994 }
5995 },
5996 {
5997 "defaultMessage": "!!!Choose Personal",
5998 "end": {
5999 "column": 3,
6000 "line": 52
6001 },
6002 "file": "src/features/planSelection/components/PlanSelection.js",
6003 "id": "feature.planSelection.cta.upgradePersonal",
6004 "start": {
6005 "column": 23,
6006 "line": 49
6007 }
6008 },
6009 {
6010 "defaultMessage": "!!!Choose Professional",
6011 "end": {
6012 "column": 3,
6013 "line": 56
6014 },
6015 "file": "src/features/planSelection/components/PlanSelection.js",
6016 "id": "feature.planSelection.cta.upgradePro",
6017 "start": {
6018 "column": 18,
6019 "line": 53
6020 }
6021 },
6022 {
6023 "defaultMessage": "!!!Complete comparison of all plans",
6024 "end": {
6025 "column": 3,
6026 "line": 60
6027 },
6028 "file": "src/features/planSelection/components/PlanSelection.js",
6029 "id": "feature.planSelection.fullFeatureList",
6030 "start": {
6031 "column": 19,
6032 "line": 57
6033 }
6034 },
6035 {
6036 "defaultMessage": "!!!All prices based on yearly payment",
6037 "end": {
6038 "column": 3,
6039 "line": 64
6040 },
6041 "file": "src/features/planSelection/components/PlanSelection.js",
6042 "id": "feature.planSelection.pricesBasedOnAnnualPayment",
6043 "start": {
6044 "column": 30,
6045 "line": 61
6046 }
6047 }
6048 ],
6049 "path": "src/features/planSelection/components/PlanSelection.json"
6050 },
6051 {
6052 "descriptors": [
6053 {
6054 "defaultMessage": "!!!per {interval}",
6055 "end": {
6056 "column": 3,
6057 "line": 19
6058 },
6059 "file": "src/features/planSelection/components/PlanTeaser.js",
6060 "id": "subscription.interval.per",
6061 "start": {
6062 "column": 7,
6063 "line": 16
6064 }
6065 },
6066 {
6067 "defaultMessage": "!!!Upgrade Account",
6068 "end": {
6069 "column": 3,
6070 "line": 23
6071 },
6072 "file": "src/features/planSelection/components/PlanTeaser.js",
6073 "id": "subscription.planItem.upgradeAccount",
6074 "start": {
6075 "column": 7,
6076 "line": 20
6077 }
6078 }
6079 ],
6080 "path": "src/features/planSelection/components/PlanTeaser.json"
6081 },
6082 {
6083 "descriptors": [
6084 {
6085 "defaultMessage": "!!!Downgrade your Franz Plan",
6086 "end": {
6087 "column": 3,
6088 "line": 18
6089 },
6090 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6091 "id": "feature.planSelection.fullscreen.dialog.title",
6092 "start": {
6093 "column": 15,
6094 "line": 15
6095 }
6096 },
6097 {
6098 "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.",
6099 "end": {
6100 "column": 3,
6101 "line": 22
6102 },
6103 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6104 "id": "feature.planSelection.fullscreen.dialog.message",
6105 "start": {
6106 "column": 17,
6107 "line": 19
6108 }
6109 },
6110 {
6111 "defaultMessage": "!!!Downgrade to Free",
6112 "end": {
6113 "column": 3,
6114 "line": 26
6115 },
6116 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6117 "id": "feature.planSelection.fullscreen.dialog.cta.downgrade",
6118 "start": {
6119 "column": 22,
6120 "line": 23
6121 }
6122 },
6123 {
6124 "defaultMessage": "!!!Choose Personal",
6125 "end": {
6126 "column": 3,
6127 "line": 30
6128 },
6129 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6130 "id": "feature.planSelection.fullscreen.dialog.cta.upgrade",
6131 "start": {
6132 "column": 20,
6133 "line": 27
6134 }
6135 }
6136 ],
6137 "path": "src/features/planSelection/containers/PlanSelectionScreen.json"
6138 },
6139 {
6140 "descriptors": [
6141 {
6142 "defaultMessage": "!!!Publish debug information", 5019 "defaultMessage": "!!!Publish debug information",
6143 "end": { 5020 "end": {
6144 "column": 3, 5021 "column": 3,
@@ -6349,55 +5226,6 @@
6349 { 5226 {
6350 "descriptors": [ 5227 "descriptors": [
6351 { 5228 {
6352 "defaultMessage": "!!!Changes in Franz {version}",
6353 "end": {
6354 "column": 3,
6355 "line": 23
6356 },
6357 "file": "src/features/serviceLimit/components/AnnouncementScreen.js",
6358 "id": "feature.announcements.changelog.headline",
6359 "start": {
6360 "column": 12,
6361 "line": 20
6362 }
6363 }
6364 ],
6365 "path": "src/features/serviceLimit/components/AnnouncementScreen.json"
6366 },
6367 {
6368 "descriptors": [
6369 {
6370 "defaultMessage": "!!!You have added {amount} of {limit} services. Please upgrade your account to add more services.",
6371 "end": {
6372 "column": 3,
6373 "line": 12
6374 },
6375 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
6376 "id": "feature.serviceLimit.limitReached",
6377 "start": {
6378 "column": 16,
6379 "line": 9
6380 }
6381 },
6382 {
6383 "defaultMessage": "!!!Upgrade account",
6384 "end": {
6385 "column": 3,
6386 "line": 16
6387 },
6388 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
6389 "id": "premiumFeature.button.upgradeAccount",
6390 "start": {
6391 "column": 10,
6392 "line": 13
6393 }
6394 }
6395 ],
6396 "path": "src/features/serviceLimit/components/LimitReachedInfobox.json"
6397 },
6398 {
6399 "descriptors": [
6400 {
6401 "defaultMessage": "!!!Ferdi is better together!", 5229 "defaultMessage": "!!!Ferdi is better together!",
6402 "end": { 5230 "end": {
6403 "column": 3, 5231 "column": 3,
@@ -6463,7 +5291,7 @@
6463 } 5291 }
6464 }, 5292 },
6465 { 5293 {
6466 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 5294 "defaultMessage": "!!! I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
6467 "end": { 5295 "end": {
6468 "column": 3, 5296 "column": 3,
6469 "line": 40 5297 "line": 40
@@ -6476,7 +5304,7 @@
6476 } 5304 }
6477 }, 5305 },
6478 { 5306 {
6479 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", 5307 "defaultMessage": "!!! I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger",
6480 "end": { 5308 "end": {
6481 "column": 3, 5309 "column": 3,
6482 "line": 44 5310 "line": 44
@@ -6494,213 +5322,68 @@
6494 { 5322 {
6495 "descriptors": [ 5323 "descriptors": [
6496 { 5324 {
6497 "defaultMessage": "!!!Franz Todos are available to premium users now!",
6498 "end": {
6499 "column": 3,
6500 "line": 34
6501 },
6502 "file": "src/features/todos/components/TodosWebview.js",
6503 "id": "feature.todos.premium.info",
6504 "start": {
6505 "column": 15,
6506 "line": 31
6507 }
6508 },
6509 {
6510 "defaultMessage": "!!!Upgrade Account",
6511 "end": {
6512 "column": 3,
6513 "line": 38
6514 },
6515 "file": "src/features/todos/components/TodosWebview.js",
6516 "id": "feature.todos.premium.upgrade",
6517 "start": {
6518 "column": 14,
6519 "line": 35
6520 }
6521 },
6522 {
6523 "defaultMessage": "!!!Everyone else will have to wait a little longer.",
6524 "end": {
6525 "column": 3,
6526 "line": 42
6527 },
6528 "file": "src/features/todos/components/TodosWebview.js",
6529 "id": "feature.todos.premium.rollout",
6530 "start": {
6531 "column": 15,
6532 "line": 39
6533 }
6534 }
6535 ],
6536 "path": "src/features/todos/components/TodosWebview.json"
6537 },
6538 {
6539 "descriptors": [
6540 {
6541 "defaultMessage": "!!!Your Free Franz {plan} Trial ends in {time}.",
6542 "end": {
6543 "column": 3,
6544 "line": 16
6545 },
6546 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
6547 "id": "feature.trialStatusBar.restTime",
6548 "start": {
6549 "column": 12,
6550 "line": 13
6551 }
6552 },
6553 {
6554 "defaultMessage": "!!!Your free Franz {plan} Trial has expired, please upgrade your account.",
6555 "end": {
6556 "column": 3,
6557 "line": 20
6558 },
6559 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
6560 "id": "feature.trialStatusBar.expired",
6561 "start": {
6562 "column": 11,
6563 "line": 17
6564 }
6565 },
6566 {
6567 "defaultMessage": "!!!Upgrade now",
6568 "end": {
6569 "column": 3,
6570 "line": 24
6571 },
6572 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
6573 "id": "feature.trialStatusBar.cta",
6574 "start": {
6575 "column": 7,
6576 "line": 21
6577 }
6578 }
6579 ],
6580 "path": "src/features/trialStatusBar/components/TrialStatusBar.json"
6581 },
6582 {
6583 "descriptors": [
6584 {
6585 "defaultMessage": "!!!Downgrade your Franz Plan",
6586 "end": {
6587 "column": 3,
6588 "line": 19
6589 },
6590 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6591 "id": "feature.trialStatusBar.fullscreen.dialog.title",
6592 "start": {
6593 "column": 15,
6594 "line": 16
6595 }
6596 },
6597 {
6598 "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.",
6599 "end": {
6600 "column": 3,
6601 "line": 23
6602 },
6603 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6604 "id": "feature.trialStatusBar.fullscreen.dialog.message",
6605 "start": {
6606 "column": 17,
6607 "line": 20
6608 }
6609 },
6610 {
6611 "defaultMessage": "!!!Downgrade to Free",
6612 "end": {
6613 "column": 3,
6614 "line": 27
6615 },
6616 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6617 "id": "feature.trialStatusBar.fullscreen.dialog.cta.downgrade",
6618 "start": {
6619 "column": 22,
6620 "line": 24
6621 }
6622 },
6623 {
6624 "defaultMessage": "!!!Choose Personal",
6625 "end": {
6626 "column": 3,
6627 "line": 31
6628 },
6629 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6630 "id": "feature.trialStatusBar.fullscreen.dialog.cta.upgrade",
6631 "start": {
6632 "column": 20,
6633 "line": 28
6634 }
6635 }
6636 ],
6637 "path": "src/features/trialStatusBar/containers/TrialStatusBarScreen.json"
6638 },
6639 {
6640 "descriptors": [
6641 {
6642 "defaultMessage": "!!!Home", 5325 "defaultMessage": "!!!Home",
6643 "end": { 5326 "end": {
6644 "column": 3, 5327 "column": 3,
6645 "line": 16 5328 "line": 20
6646 }, 5329 },
6647 "file": "src/features/webControls/components/WebControls.js", 5330 "file": "src/features/webControls/components/WebControls.js",
6648 "id": "webControls.goHome", 5331 "id": "webControls.goHome",
6649 "start": { 5332 "start": {
6650 "column": 10, 5333 "column": 10,
6651 "line": 13 5334 "line": 17
6652 } 5335 }
6653 }, 5336 },
6654 { 5337 {
6655 "defaultMessage": "!!!Open in Browser", 5338 "defaultMessage": "!!!Open in Browser",
6656 "end": { 5339 "end": {
6657 "column": 3, 5340 "column": 3,
6658 "line": 20 5341 "line": 24
6659 }, 5342 },
6660 "file": "src/features/webControls/components/WebControls.js", 5343 "file": "src/features/webControls/components/WebControls.js",
6661 "id": "webControls.openInBrowser", 5344 "id": "webControls.openInBrowser",
6662 "start": { 5345 "start": {
6663 "column": 17, 5346 "column": 17,
6664 "line": 17 5347 "line": 21
6665 } 5348 }
6666 }, 5349 },
6667 { 5350 {
6668 "defaultMessage": "!!!Back", 5351 "defaultMessage": "!!!Back",
6669 "end": { 5352 "end": {
6670 "column": 3, 5353 "column": 3,
6671 "line": 24 5354 "line": 28
6672 }, 5355 },
6673 "file": "src/features/webControls/components/WebControls.js", 5356 "file": "src/features/webControls/components/WebControls.js",
6674 "id": "webControls.back", 5357 "id": "webControls.back",
6675 "start": { 5358 "start": {
6676 "column": 8, 5359 "column": 8,
6677 "line": 21 5360 "line": 25
6678 } 5361 }
6679 }, 5362 },
6680 { 5363 {
6681 "defaultMessage": "!!!Forward", 5364 "defaultMessage": "!!!Forward",
6682 "end": { 5365 "end": {
6683 "column": 3, 5366 "column": 3,
6684 "line": 28 5367 "line": 32
6685 }, 5368 },
6686 "file": "src/features/webControls/components/WebControls.js", 5369 "file": "src/features/webControls/components/WebControls.js",
6687 "id": "webControls.forward", 5370 "id": "webControls.forward",
6688 "start": { 5371 "start": {
6689 "column": 11, 5372 "column": 11,
6690 "line": 25 5373 "line": 29
6691 } 5374 }
6692 }, 5375 },
6693 { 5376 {
6694 "defaultMessage": "!!!Reload", 5377 "defaultMessage": "!!!Reload",
6695 "end": { 5378 "end": {
6696 "column": 3, 5379 "column": 3,
6697 "line": 32 5380 "line": 36
6698 }, 5381 },
6699 "file": "src/features/webControls/components/WebControls.js", 5382 "file": "src/features/webControls/components/WebControls.js",
6700 "id": "webControls.reload", 5383 "id": "webControls.reload",
6701 "start": { 5384 "start": {
6702 "column": 10, 5385 "column": 10,
6703 "line": 29 5386 "line": 33
6704 } 5387 }
6705 } 5388 }
6706 ], 5389 ],
@@ -6865,104 +5548,65 @@
6865 "defaultMessage": "!!!Workspaces", 5548 "defaultMessage": "!!!Workspaces",
6866 "end": { 5549 "end": {
6867 "column": 3, 5550 "column": 3,
6868 "line": 19 5551 "line": 18
6869 }, 5552 },
6870 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5553 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6871 "id": "workspaceDrawer.headline", 5554 "id": "workspaceDrawer.headline",
6872 "start": { 5555 "start": {
6873 "column": 12, 5556 "column": 12,
6874 "line": 16 5557 "line": 15
6875 } 5558 }
6876 }, 5559 },
6877 { 5560 {
6878 "defaultMessage": "!!!All services", 5561 "defaultMessage": "!!!All services",
6879 "end": { 5562 "end": {
6880 "column": 3, 5563 "column": 3,
6881 "line": 23 5564 "line": 22
6882 }, 5565 },
6883 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5566 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6884 "id": "workspaceDrawer.allServices", 5567 "id": "workspaceDrawer.allServices",
6885 "start": { 5568 "start": {
6886 "column": 15, 5569 "column": 15,
6887 "line": 20 5570 "line": 19
6888 } 5571 }
6889 }, 5572 },
6890 { 5573 {
6891 "defaultMessage": "!!!Workspaces settings", 5574 "defaultMessage": "!!!Workspaces settings",
6892 "end": { 5575 "end": {
6893 "column": 3, 5576 "column": 3,
6894 "line": 27 5577 "line": 26
6895 }, 5578 },
6896 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5579 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6897 "id": "workspaceDrawer.workspacesSettingsTooltip", 5580 "id": "workspaceDrawer.workspacesSettingsTooltip",
6898 "start": { 5581 "start": {
6899 "column": 29, 5582 "column": 29,
6900 "line": 24 5583 "line": 23
6901 } 5584 }
6902 }, 5585 },
6903 { 5586 {
6904 "defaultMessage": "!!!Info about workspace feature", 5587 "defaultMessage": "!!!Info about workspace feature",
6905 "end": { 5588 "end": {
6906 "column": 3, 5589 "column": 3,
6907 "line": 31 5590 "line": 30
6908 }, 5591 },
6909 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5592 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6910 "id": "workspaceDrawer.workspaceFeatureInfo", 5593 "id": "workspaceDrawer.workspaceFeatureInfo",
6911 "start": { 5594 "start": {
6912 "column": 24, 5595 "column": 24,
6913 "line": 28 5596 "line": 27
6914 }
6915 },
6916 {
6917 "defaultMessage": "!!!Create your first workspace",
6918 "end": {
6919 "column": 3,
6920 "line": 35
6921 },
6922 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6923 "id": "workspaceDrawer.premiumCtaButtonLabel",
6924 "start": {
6925 "column": 25,
6926 "line": 32
6927 }
6928 },
6929 {
6930 "defaultMessage": "!!!Reactivate premium account",
6931 "end": {
6932 "column": 3,
6933 "line": 39
6934 },
6935 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6936 "id": "workspaceDrawer.reactivatePremiumAccountLabel",
6937 "start": {
6938 "column": 28,
6939 "line": 36
6940 } 5597 }
6941 }, 5598 },
6942 { 5599 {
6943 "defaultMessage": "!!!add new workspace", 5600 "defaultMessage": "!!!add new workspace",
6944 "end": { 5601 "end": {
6945 "column": 3, 5602 "column": 3,
6946 "line": 43 5603 "line": 34
6947 }, 5604 },
6948 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5605 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6949 "id": "workspaceDrawer.addNewWorkspaceLabel", 5606 "id": "workspaceDrawer.addNewWorkspaceLabel",
6950 "start": { 5607 "start": {
6951 "column": 24, 5608 "column": 24,
6952 "line": 40 5609 "line": 31
6953 }
6954 },
6955 {
6956 "defaultMessage": "!!!Premium feature",
6957 "end": {
6958 "column": 3,
6959 "line": 47
6960 },
6961 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6962 "id": "workspaceDrawer.proFeatureBadge",
6963 "start": {
6964 "column": 23,
6965 "line": 44
6966 } 5610 }
6967 } 5611 }
6968 ], 5612 ],
@@ -7005,104 +5649,104 @@
7005 "defaultMessage": "!!!Your workspaces", 5649 "defaultMessage": "!!!Your workspaces",
7006 "end": { 5650 "end": {
7007 "column": 3, 5651 "column": 3,
7008 "line": 23 5652 "line": 20
7009 }, 5653 },
7010 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5654 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7011 "id": "settings.workspaces.headline", 5655 "id": "settings.workspaces.headline",
7012 "start": { 5656 "start": {
7013 "column": 12, 5657 "column": 12,
7014 "line": 20 5658 "line": 17
7015 } 5659 }
7016 }, 5660 },
7017 { 5661 {
7018 "defaultMessage": "!!!You haven't created any workspaces yet.", 5662 "defaultMessage": "!!!You haven't created any workspaces yet.",
7019 "end": { 5663 "end": {
7020 "column": 3, 5664 "column": 3,
7021 "line": 27 5665 "line": 24
7022 }, 5666 },
7023 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5667 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7024 "id": "settings.workspaces.noWorkspacesAdded", 5668 "id": "settings.workspaces.noWorkspacesAdded",
7025 "start": { 5669 "start": {
7026 "column": 19, 5670 "column": 19,
7027 "line": 24 5671 "line": 21
7028 } 5672 }
7029 }, 5673 },
7030 { 5674 {
7031 "defaultMessage": "!!!Could not load your workspaces", 5675 "defaultMessage": "!!!Could not load your workspaces",
7032 "end": { 5676 "end": {
7033 "column": 3, 5677 "column": 3,
7034 "line": 31 5678 "line": 28
7035 }, 5679 },
7036 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5680 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7037 "id": "settings.workspaces.workspacesRequestFailed", 5681 "id": "settings.workspaces.workspacesRequestFailed",
7038 "start": { 5682 "start": {
7039 "column": 27, 5683 "column": 27,
7040 "line": 28 5684 "line": 25
7041 } 5685 }
7042 }, 5686 },
7043 { 5687 {
7044 "defaultMessage": "!!!Try again", 5688 "defaultMessage": "!!!Try again",
7045 "end": { 5689 "end": {
7046 "column": 3, 5690 "column": 3,
7047 "line": 35 5691 "line": 32
7048 }, 5692 },
7049 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5693 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7050 "id": "settings.workspaces.tryReloadWorkspaces", 5694 "id": "settings.workspaces.tryReloadWorkspaces",
7051 "start": { 5695 "start": {
7052 "column": 23, 5696 "column": 23,
7053 "line": 32 5697 "line": 29
7054 } 5698 }
7055 }, 5699 },
7056 { 5700 {
7057 "defaultMessage": "!!!Your changes have been saved", 5701 "defaultMessage": "!!!Your changes have been saved",
7058 "end": { 5702 "end": {
7059 "column": 3, 5703 "column": 3,
7060 "line": 39 5704 "line": 36
7061 }, 5705 },
7062 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5706 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7063 "id": "settings.workspaces.updatedInfo", 5707 "id": "settings.workspaces.updatedInfo",
7064 "start": { 5708 "start": {
7065 "column": 15, 5709 "column": 15,
7066 "line": 36 5710 "line": 33
7067 } 5711 }
7068 }, 5712 },
7069 { 5713 {
7070 "defaultMessage": "!!!Workspace has been deleted", 5714 "defaultMessage": "!!!Workspace has been deleted",
7071 "end": { 5715 "end": {
7072 "column": 3, 5716 "column": 3,
7073 "line": 43 5717 "line": 40
7074 }, 5718 },
7075 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5719 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7076 "id": "settings.workspaces.deletedInfo", 5720 "id": "settings.workspaces.deletedInfo",
7077 "start": { 5721 "start": {
7078 "column": 15, 5722 "column": 15,
7079 "line": 40 5723 "line": 37
7080 } 5724 }
7081 }, 5725 },
7082 { 5726 {
7083 "defaultMessage": "!!!Info about workspace feature", 5727 "defaultMessage": "!!!Info about workspace feature",
7084 "end": { 5728 "end": {
7085 "column": 3, 5729 "column": 3,
7086 "line": 47 5730 "line": 44
7087 }, 5731 },
7088 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5732 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7089 "id": "settings.workspaces.workspaceFeatureInfo", 5733 "id": "settings.workspaces.workspaceFeatureInfo",
7090 "start": { 5734 "start": {
7091 "column": 24, 5735 "column": 24,
7092 "line": 44 5736 "line": 41
7093 } 5737 }
7094 }, 5738 },
7095 { 5739 {
7096 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces", 5740 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces",
7097 "end": { 5741 "end": {
7098 "column": 3, 5742 "column": 3,
7099 "line": 51 5743 "line": 48
7100 }, 5744 },
7101 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5745 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
7102 "id": "settings.workspaces.workspaceFeatureHeadline", 5746 "id": "settings.workspaces.workspaceFeatureHeadline",
7103 "start": { 5747 "start": {
7104 "column": 28, 5748 "column": 28,
7105 "line": 48 5749 "line": 45
7106 } 5750 }
7107 } 5751 }
7108 ], 5752 ],
@@ -7129,146 +5773,6 @@
7129 { 5773 {
7130 "descriptors": [ 5774 "descriptors": [
7131 { 5775 {
7132 "defaultMessage": "!!!Professional",
7133 "end": {
7134 "column": 3,
7135 "line": 8
7136 },
7137 "file": "src/helpers/plan-helpers.js",
7138 "id": "pricing.plan.pro",
7139 "start": {
7140 "column": 15,
7141 "line": 5
7142 }
7143 },
7144 {
7145 "defaultMessage": "!!!Personal",
7146 "end": {
7147 "column": 3,
7148 "line": 12
7149 },
7150 "file": "src/helpers/plan-helpers.js",
7151 "id": "pricing.plan.personal",
7152 "start": {
7153 "column": 20,
7154 "line": 9
7155 }
7156 },
7157 {
7158 "defaultMessage": "!!!Free",
7159 "end": {
7160 "column": 3,
7161 "line": 16
7162 },
7163 "file": "src/helpers/plan-helpers.js",
7164 "id": "pricing.plan.free",
7165 "start": {
7166 "column": 16,
7167 "line": 13
7168 }
7169 },
7170 {
7171 "defaultMessage": "!!!Premium",
7172 "end": {
7173 "column": 3,
7174 "line": 20
7175 },
7176 "file": "src/helpers/plan-helpers.js",
7177 "id": "pricing.plan.legacy",
7178 "start": {
7179 "column": 18,
7180 "line": 17
7181 }
7182 }
7183 ],
7184 "path": "src/helpers/plan-helpers.json"
7185 },
7186 {
7187 "descriptors": [
7188 {
7189 "defaultMessage": "!!!Franz Professional Yearly",
7190 "end": {
7191 "column": 3,
7192 "line": 8
7193 },
7194 "file": "src/helpers/pricing-helpers.js",
7195 "id": "pricing.plan.pro-yearly",
7196 "start": {
7197 "column": 22,
7198 "line": 5
7199 }
7200 },
7201 {
7202 "defaultMessage": "!!!Franz Professional Monthly",
7203 "end": {
7204 "column": 3,
7205 "line": 12
7206 },
7207 "file": "src/helpers/pricing-helpers.js",
7208 "id": "pricing.plan.pro-monthly",
7209 "start": {
7210 "column": 23,
7211 "line": 9
7212 }
7213 },
7214 {
7215 "defaultMessage": "!!!Franz Personal Yearly",
7216 "end": {
7217 "column": 3,
7218 "line": 16
7219 },
7220 "file": "src/helpers/pricing-helpers.js",
7221 "id": "pricing.plan.personal-yearly",
7222 "start": {
7223 "column": 27,
7224 "line": 13
7225 }
7226 },
7227 {
7228 "defaultMessage": "!!!Franz Personal Monthly",
7229 "end": {
7230 "column": 3,
7231 "line": 20
7232 },
7233 "file": "src/helpers/pricing-helpers.js",
7234 "id": "pricing.plan.personal-monthly",
7235 "start": {
7236 "column": 28,
7237 "line": 17
7238 }
7239 },
7240 {
7241 "defaultMessage": "!!!Franz Free",
7242 "end": {
7243 "column": 3,
7244 "line": 24
7245 },
7246 "file": "src/helpers/pricing-helpers.js",
7247 "id": "pricing.plan.free",
7248 "start": {
7249 "column": 16,
7250 "line": 21
7251 }
7252 },
7253 {
7254 "defaultMessage": "!!!Franz Premium",
7255 "end": {
7256 "column": 3,
7257 "line": 28
7258 },
7259 "file": "src/helpers/pricing-helpers.js",
7260 "id": "pricing.plan.legacy",
7261 "start": {
7262 "column": 18,
7263 "line": 25
7264 }
7265 }
7266 ],
7267 "path": "src/helpers/pricing-helpers.json"
7268 },
7269 {
7270 "descriptors": [
7271 {
7272 "defaultMessage": "!!!Field is required", 5776 "defaultMessage": "!!!Field is required",
7273 "end": { 5777 "end": {
7274 "column": 3, 5778 "column": 3,
@@ -7441,19 +5945,6 @@
7441 "column": 17, 5945 "column": 17,
7442 "line": 32 5946 "line": 32
7443 } 5947 }
7444 },
7445 {
7446 "defaultMessage": "!!!Franz Professional Required",
7447 "end": {
7448 "column": 3,
7449 "line": 39
7450 },
7451 "file": "src/i18n/globalMessages.js",
7452 "id": "global.franzProRequired",
7453 "start": {
7454 "column": 15,
7455 "line": 36
7456 }
7457 } 5948 }
7458 ], 5949 ],
7459 "path": "src/i18n/globalMessages.json" 5950 "path": "src/i18n/globalMessages.json"
@@ -7464,962 +5955,949 @@
7464 "defaultMessage": "!!!Edit", 5955 "defaultMessage": "!!!Edit",
7465 "end": { 5956 "end": {
7466 "column": 3, 5957 "column": 3,
7467 "line": 22 5958 "line": 23
7468 }, 5959 },
7469 "file": "src/lib/Menu.js", 5960 "file": "src/lib/Menu.js",
7470 "id": "menu.edit", 5961 "id": "menu.edit",
7471 "start": { 5962 "start": {
7472 "column": 8, 5963 "column": 8,
7473 "line": 19 5964 "line": 20
7474 } 5965 }
7475 }, 5966 },
7476 { 5967 {
7477 "defaultMessage": "!!!Undo", 5968 "defaultMessage": "!!!Undo",
7478 "end": { 5969 "end": {
7479 "column": 3, 5970 "column": 3,
7480 "line": 26 5971 "line": 27
7481 }, 5972 },
7482 "file": "src/lib/Menu.js", 5973 "file": "src/lib/Menu.js",
7483 "id": "menu.edit.undo", 5974 "id": "menu.edit.undo",
7484 "start": { 5975 "start": {
7485 "column": 8, 5976 "column": 8,
7486 "line": 23 5977 "line": 24
7487 } 5978 }
7488 }, 5979 },
7489 { 5980 {
7490 "defaultMessage": "!!!Redo", 5981 "defaultMessage": "!!!Redo",
7491 "end": { 5982 "end": {
7492 "column": 3, 5983 "column": 3,
7493 "line": 30 5984 "line": 31
7494 }, 5985 },
7495 "file": "src/lib/Menu.js", 5986 "file": "src/lib/Menu.js",
7496 "id": "menu.edit.redo", 5987 "id": "menu.edit.redo",
7497 "start": { 5988 "start": {
7498 "column": 8, 5989 "column": 8,
7499 "line": 27 5990 "line": 28
7500 } 5991 }
7501 }, 5992 },
7502 { 5993 {
7503 "defaultMessage": "!!!Cut", 5994 "defaultMessage": "!!!Cut",
7504 "end": { 5995 "end": {
7505 "column": 3, 5996 "column": 3,
7506 "line": 34 5997 "line": 35
7507 }, 5998 },
7508 "file": "src/lib/Menu.js", 5999 "file": "src/lib/Menu.js",
7509 "id": "menu.edit.cut", 6000 "id": "menu.edit.cut",
7510 "start": { 6001 "start": {
7511 "column": 7, 6002 "column": 7,
7512 "line": 31 6003 "line": 32
7513 } 6004 }
7514 }, 6005 },
7515 { 6006 {
7516 "defaultMessage": "!!!Copy", 6007 "defaultMessage": "!!!Copy",
7517 "end": { 6008 "end": {
7518 "column": 3, 6009 "column": 3,
7519 "line": 38 6010 "line": 39
7520 }, 6011 },
7521 "file": "src/lib/Menu.js", 6012 "file": "src/lib/Menu.js",
7522 "id": "menu.edit.copy", 6013 "id": "menu.edit.copy",
7523 "start": { 6014 "start": {
7524 "column": 8, 6015 "column": 8,
7525 "line": 35 6016 "line": 36
7526 } 6017 }
7527 }, 6018 },
7528 { 6019 {
7529 "defaultMessage": "!!!Paste", 6020 "defaultMessage": "!!!Paste",
7530 "end": { 6021 "end": {
7531 "column": 3, 6022 "column": 3,
7532 "line": 42 6023 "line": 43
7533 }, 6024 },
7534 "file": "src/lib/Menu.js", 6025 "file": "src/lib/Menu.js",
7535 "id": "menu.edit.paste", 6026 "id": "menu.edit.paste",
7536 "start": { 6027 "start": {
7537 "column": 9, 6028 "column": 9,
7538 "line": 39 6029 "line": 40
7539 } 6030 }
7540 }, 6031 },
7541 { 6032 {
7542 "defaultMessage": "!!!Paste And Match Style", 6033 "defaultMessage": "!!!Paste And Match Style",
7543 "end": { 6034 "end": {
7544 "column": 3, 6035 "column": 3,
7545 "line": 46 6036 "line": 47
7546 }, 6037 },
7547 "file": "src/lib/Menu.js", 6038 "file": "src/lib/Menu.js",
7548 "id": "menu.edit.pasteAndMatchStyle", 6039 "id": "menu.edit.pasteAndMatchStyle",
7549 "start": { 6040 "start": {
7550 "column": 22, 6041 "column": 22,
7551 "line": 43 6042 "line": 44
7552 } 6043 }
7553 }, 6044 },
7554 { 6045 {
7555 "defaultMessage": "!!!Delete", 6046 "defaultMessage": "!!!Delete",
7556 "end": { 6047 "end": {
7557 "column": 3, 6048 "column": 3,
7558 "line": 50 6049 "line": 51
7559 }, 6050 },
7560 "file": "src/lib/Menu.js", 6051 "file": "src/lib/Menu.js",
7561 "id": "menu.edit.delete", 6052 "id": "menu.edit.delete",
7562 "start": { 6053 "start": {
7563 "column": 10, 6054 "column": 10,
7564 "line": 47 6055 "line": 48
7565 } 6056 }
7566 }, 6057 },
7567 { 6058 {
7568 "defaultMessage": "!!!Select All", 6059 "defaultMessage": "!!!Select All",
7569 "end": { 6060 "end": {
7570 "column": 3, 6061 "column": 3,
7571 "line": 54 6062 "line": 55
7572 }, 6063 },
7573 "file": "src/lib/Menu.js", 6064 "file": "src/lib/Menu.js",
7574 "id": "menu.edit.selectAll", 6065 "id": "menu.edit.selectAll",
7575 "start": { 6066 "start": {
7576 "column": 13, 6067 "column": 13,
7577 "line": 51 6068 "line": 52
7578 } 6069 }
7579 }, 6070 },
7580 { 6071 {
7581 "defaultMessage": "!!!Find in Page", 6072 "defaultMessage": "!!!Find in Page",
7582 "end": { 6073 "end": {
7583 "column": 3, 6074 "column": 3,
7584 "line": 58 6075 "line": 59
7585 }, 6076 },
7586 "file": "src/lib/Menu.js", 6077 "file": "src/lib/Menu.js",
7587 "id": "menu.edit.findInPage", 6078 "id": "menu.edit.findInPage",
7588 "start": { 6079 "start": {
7589 "column": 14, 6080 "column": 14,
7590 "line": 55 6081 "line": 56
7591 } 6082 }
7592 }, 6083 },
7593 { 6084 {
7594 "defaultMessage": "!!!Speech", 6085 "defaultMessage": "!!!Speech",
7595 "end": { 6086 "end": {
7596 "column": 3, 6087 "column": 3,
7597 "line": 62 6088 "line": 63
7598 }, 6089 },
7599 "file": "src/lib/Menu.js", 6090 "file": "src/lib/Menu.js",
7600 "id": "menu.edit.speech", 6091 "id": "menu.edit.speech",
7601 "start": { 6092 "start": {
7602 "column": 10, 6093 "column": 10,
7603 "line": 59 6094 "line": 60
7604 } 6095 }
7605 }, 6096 },
7606 { 6097 {
7607 "defaultMessage": "!!!Start Speaking", 6098 "defaultMessage": "!!!Start Speaking",
7608 "end": { 6099 "end": {
7609 "column": 3, 6100 "column": 3,
7610 "line": 66 6101 "line": 67
7611 }, 6102 },
7612 "file": "src/lib/Menu.js", 6103 "file": "src/lib/Menu.js",
7613 "id": "menu.edit.startSpeaking", 6104 "id": "menu.edit.startSpeaking",
7614 "start": { 6105 "start": {
7615 "column": 17, 6106 "column": 17,
7616 "line": 63 6107 "line": 64
7617 } 6108 }
7618 }, 6109 },
7619 { 6110 {
7620 "defaultMessage": "!!!Stop Speaking", 6111 "defaultMessage": "!!!Stop Speaking",
7621 "end": { 6112 "end": {
7622 "column": 3, 6113 "column": 3,
7623 "line": 70 6114 "line": 71
7624 }, 6115 },
7625 "file": "src/lib/Menu.js", 6116 "file": "src/lib/Menu.js",
7626 "id": "menu.edit.stopSpeaking", 6117 "id": "menu.edit.stopSpeaking",
7627 "start": { 6118 "start": {
7628 "column": 16, 6119 "column": 16,
7629 "line": 67 6120 "line": 68
7630 } 6121 }
7631 }, 6122 },
7632 { 6123 {
7633 "defaultMessage": "!!!Start Dictation", 6124 "defaultMessage": "!!!Start Dictation",
7634 "end": { 6125 "end": {
7635 "column": 3, 6126 "column": 3,
7636 "line": 74 6127 "line": 75
7637 }, 6128 },
7638 "file": "src/lib/Menu.js", 6129 "file": "src/lib/Menu.js",
7639 "id": "menu.edit.startDictation", 6130 "id": "menu.edit.startDictation",
7640 "start": { 6131 "start": {
7641 "column": 18, 6132 "column": 18,
7642 "line": 71 6133 "line": 72
7643 } 6134 }
7644 }, 6135 },
7645 { 6136 {
7646 "defaultMessage": "!!!Emoji & Symbols", 6137 "defaultMessage": "!!!Emoji & Symbols",
7647 "end": { 6138 "end": {
7648 "column": 3, 6139 "column": 3,
7649 "line": 78 6140 "line": 79
7650 }, 6141 },
7651 "file": "src/lib/Menu.js", 6142 "file": "src/lib/Menu.js",
7652 "id": "menu.edit.emojiSymbols", 6143 "id": "menu.edit.emojiSymbols",
7653 "start": { 6144 "start": {
7654 "column": 16, 6145 "column": 16,
7655 "line": 75 6146 "line": 76
7656 } 6147 }
7657 }, 6148 },
7658 { 6149 {
7659 "defaultMessage": "!!!Open Quick Switch", 6150 "defaultMessage": "!!!Open Quick Switch",
7660 "end": { 6151 "end": {
7661 "column": 3, 6152 "column": 3,
7662 "line": 82 6153 "line": 83
7663 }, 6154 },
7664 "file": "src/lib/Menu.js", 6155 "file": "src/lib/Menu.js",
7665 "id": "menu.view.openQuickSwitch", 6156 "id": "menu.view.openQuickSwitch",
7666 "start": { 6157 "start": {
7667 "column": 19, 6158 "column": 19,
7668 "line": 79 6159 "line": 80
7669 } 6160 }
7670 }, 6161 },
7671 { 6162 {
7672 "defaultMessage": "!!!Back", 6163 "defaultMessage": "!!!Back",
7673 "end": { 6164 "end": {
7674 "column": 3, 6165 "column": 3,
7675 "line": 86 6166 "line": 87
7676 }, 6167 },
7677 "file": "src/lib/Menu.js", 6168 "file": "src/lib/Menu.js",
7678 "id": "menu.view.back", 6169 "id": "menu.view.back",
7679 "start": { 6170 "start": {
7680 "column": 8, 6171 "column": 8,
7681 "line": 83 6172 "line": 84
7682 } 6173 }
7683 }, 6174 },
7684 { 6175 {
7685 "defaultMessage": "!!!Forward", 6176 "defaultMessage": "!!!Forward",
7686 "end": { 6177 "end": {
7687 "column": 3, 6178 "column": 3,
7688 "line": 90 6179 "line": 91
7689 }, 6180 },
7690 "file": "src/lib/Menu.js", 6181 "file": "src/lib/Menu.js",
7691 "id": "menu.view.forward", 6182 "id": "menu.view.forward",
7692 "start": { 6183 "start": {
7693 "column": 11, 6184 "column": 11,
7694 "line": 87 6185 "line": 88
7695 } 6186 }
7696 }, 6187 },
7697 { 6188 {
7698 "defaultMessage": "!!!Actual Size", 6189 "defaultMessage": "!!!Actual Size",
7699 "end": { 6190 "end": {
7700 "column": 3, 6191 "column": 3,
7701 "line": 94 6192 "line": 95
7702 }, 6193 },
7703 "file": "src/lib/Menu.js", 6194 "file": "src/lib/Menu.js",
7704 "id": "menu.view.resetZoom", 6195 "id": "menu.view.resetZoom",
7705 "start": { 6196 "start": {
7706 "column": 13, 6197 "column": 13,
7707 "line": 91 6198 "line": 92
7708 } 6199 }
7709 }, 6200 },
7710 { 6201 {
7711 "defaultMessage": "!!!Zoom In", 6202 "defaultMessage": "!!!Zoom In",
7712 "end": { 6203 "end": {
7713 "column": 3, 6204 "column": 3,
7714 "line": 98 6205 "line": 99
7715 }, 6206 },
7716 "file": "src/lib/Menu.js", 6207 "file": "src/lib/Menu.js",
7717 "id": "menu.view.zoomIn", 6208 "id": "menu.view.zoomIn",
7718 "start": { 6209 "start": {
7719 "column": 10, 6210 "column": 10,
7720 "line": 95 6211 "line": 96
7721 } 6212 }
7722 }, 6213 },
7723 { 6214 {
7724 "defaultMessage": "!!!Zoom Out", 6215 "defaultMessage": "!!!Zoom Out",
7725 "end": { 6216 "end": {
7726 "column": 3, 6217 "column": 3,
7727 "line": 102 6218 "line": 103
7728 }, 6219 },
7729 "file": "src/lib/Menu.js", 6220 "file": "src/lib/Menu.js",
7730 "id": "menu.view.zoomOut", 6221 "id": "menu.view.zoomOut",
7731 "start": { 6222 "start": {
7732 "column": 11, 6223 "column": 11,
7733 "line": 99 6224 "line": 100
7734 }
7735 },
7736 {
7737 "defaultMessage": "!!!Enter Full Screen",
7738 "end": {
7739 "column": 3,
7740 "line": 106
7741 },
7742 "file": "src/lib/Menu.js",
7743 "id": "menu.view.enterFullScreen",
7744 "start": {
7745 "column": 19,
7746 "line": 103
7747 }
7748 },
7749 {
7750 "defaultMessage": "!!!Exit Full Screen",
7751 "end": {
7752 "column": 3,
7753 "line": 110
7754 },
7755 "file": "src/lib/Menu.js",
7756 "id": "menu.view.exitFullScreen",
7757 "start": {
7758 "column": 18,
7759 "line": 107
7760 } 6225 }
7761 }, 6226 },
7762 { 6227 {
7763 "defaultMessage": "!!!Toggle Full Screen", 6228 "defaultMessage": "!!!Toggle Full Screen",
7764 "end": { 6229 "end": {
7765 "column": 3, 6230 "column": 3,
7766 "line": 114 6231 "line": 107
7767 }, 6232 },
7768 "file": "src/lib/Menu.js", 6233 "file": "src/lib/Menu.js",
7769 "id": "menu.view.toggleFullScreen", 6234 "id": "menu.view.toggleFullScreen",
7770 "start": { 6235 "start": {
7771 "column": 20, 6236 "column": 20,
7772 "line": 111 6237 "line": 104
7773 } 6238 }
7774 }, 6239 },
7775 { 6240 {
7776 "defaultMessage": "!!!Toggle Dark Mode", 6241 "defaultMessage": "!!!Toggle Dark Mode",
7777 "end": { 6242 "end": {
7778 "column": 3, 6243 "column": 3,
7779 "line": 118 6244 "line": 111
7780 }, 6245 },
7781 "file": "src/lib/Menu.js", 6246 "file": "src/lib/Menu.js",
7782 "id": "menu.view.toggleDarkMode", 6247 "id": "menu.view.toggleDarkMode",
7783 "start": { 6248 "start": {
7784 "column": 18, 6249 "column": 18,
7785 "line": 115 6250 "line": 108
7786 } 6251 }
7787 }, 6252 },
7788 { 6253 {
7789 "defaultMessage": "!!!Toggle Developer Tools", 6254 "defaultMessage": "!!!Toggle Developer Tools",
7790 "end": { 6255 "end": {
7791 "column": 3, 6256 "column": 3,
7792 "line": 122 6257 "line": 115
7793 }, 6258 },
7794 "file": "src/lib/Menu.js", 6259 "file": "src/lib/Menu.js",
7795 "id": "menu.view.toggleDevTools", 6260 "id": "menu.view.toggleDevTools",
7796 "start": { 6261 "start": {
7797 "column": 18, 6262 "column": 18,
7798 "line": 119 6263 "line": 112
7799 } 6264 }
7800 }, 6265 },
7801 { 6266 {
7802 "defaultMessage": "!!!Toggle Todos Developer Tools", 6267 "defaultMessage": "!!!Toggle Todos Developer Tools",
7803 "end": { 6268 "end": {
7804 "column": 3, 6269 "column": 3,
7805 "line": 126 6270 "line": 119
7806 }, 6271 },
7807 "file": "src/lib/Menu.js", 6272 "file": "src/lib/Menu.js",
7808 "id": "menu.view.toggleTodosDevTools", 6273 "id": "menu.view.toggleTodosDevTools",
7809 "start": { 6274 "start": {
7810 "column": 23, 6275 "column": 23,
7811 "line": 123 6276 "line": 116
7812 } 6277 }
7813 }, 6278 },
7814 { 6279 {
7815 "defaultMessage": "!!!Toggle Service Developer Tools", 6280 "defaultMessage": "!!!Toggle Service Developer Tools",
7816 "end": { 6281 "end": {
7817 "column": 3, 6282 "column": 3,
7818 "line": 130 6283 "line": 123
7819 }, 6284 },
7820 "file": "src/lib/Menu.js", 6285 "file": "src/lib/Menu.js",
7821 "id": "menu.view.toggleServiceDevTools", 6286 "id": "menu.view.toggleServiceDevTools",
7822 "start": { 6287 "start": {
7823 "column": 25, 6288 "column": 25,
7824 "line": 127 6289 "line": 120
7825 } 6290 }
7826 }, 6291 },
7827 { 6292 {
7828 "defaultMessage": "!!!Reload Service", 6293 "defaultMessage": "!!!Reload Service",
7829 "end": { 6294 "end": {
7830 "column": 3, 6295 "column": 3,
7831 "line": 134 6296 "line": 127
7832 }, 6297 },
7833 "file": "src/lib/Menu.js", 6298 "file": "src/lib/Menu.js",
7834 "id": "menu.view.reloadService", 6299 "id": "menu.view.reloadService",
7835 "start": { 6300 "start": {
7836 "column": 17, 6301 "column": 17,
7837 "line": 131 6302 "line": 124
7838 } 6303 }
7839 }, 6304 },
7840 { 6305 {
7841 "defaultMessage": "!!!Reload Ferdi", 6306 "defaultMessage": "!!!Reload Ferdi",
7842 "end": { 6307 "end": {
7843 "column": 3, 6308 "column": 3,
7844 "line": 138 6309 "line": 131
7845 }, 6310 },
7846 "file": "src/lib/Menu.js", 6311 "file": "src/lib/Menu.js",
7847 "id": "menu.view.reloadFranz", 6312 "id": "menu.view.reloadFerdi",
7848 "start": { 6313 "start": {
7849 "column": 15, 6314 "column": 15,
7850 "line": 135 6315 "line": 128
7851 } 6316 }
7852 }, 6317 },
7853 { 6318 {
7854 "defaultMessage": "!!!Lock Ferdi", 6319 "defaultMessage": "!!!Lock Ferdi",
7855 "end": { 6320 "end": {
7856 "column": 3, 6321 "column": 3,
7857 "line": 142 6322 "line": 135
7858 }, 6323 },
7859 "file": "src/lib/Menu.js", 6324 "file": "src/lib/Menu.js",
7860 "id": "menu.view.lockFerdi", 6325 "id": "menu.view.lockFerdi",
7861 "start": { 6326 "start": {
7862 "column": 13, 6327 "column": 13,
7863 "line": 139 6328 "line": 132
7864 } 6329 }
7865 }, 6330 },
7866 { 6331 {
7867 "defaultMessage": "!!!Reload ToDos", 6332 "defaultMessage": "!!!Reload ToDos",
7868 "end": { 6333 "end": {
7869 "column": 3, 6334 "column": 3,
7870 "line": 146 6335 "line": 139
7871 }, 6336 },
7872 "file": "src/lib/Menu.js", 6337 "file": "src/lib/Menu.js",
7873 "id": "menu.view.reloadTodos", 6338 "id": "menu.view.reloadTodos",
7874 "start": { 6339 "start": {
7875 "column": 15, 6340 "column": 15,
7876 "line": 143 6341 "line": 136
7877 } 6342 }
7878 }, 6343 },
7879 { 6344 {
7880 "defaultMessage": "!!!Minimize", 6345 "defaultMessage": "!!!Minimize",
7881 "end": { 6346 "end": {
7882 "column": 3, 6347 "column": 3,
7883 "line": 150 6348 "line": 143
7884 }, 6349 },
7885 "file": "src/lib/Menu.js", 6350 "file": "src/lib/Menu.js",
7886 "id": "menu.window.minimize", 6351 "id": "menu.window.minimize",
7887 "start": { 6352 "start": {
7888 "column": 12, 6353 "column": 12,
7889 "line": 147 6354 "line": 140
7890 } 6355 }
7891 }, 6356 },
7892 { 6357 {
7893 "defaultMessage": "!!!Close", 6358 "defaultMessage": "!!!Close",
7894 "end": { 6359 "end": {
7895 "column": 3, 6360 "column": 3,
7896 "line": 154 6361 "line": 147
7897 }, 6362 },
7898 "file": "src/lib/Menu.js", 6363 "file": "src/lib/Menu.js",
7899 "id": "menu.window.close", 6364 "id": "menu.window.close",
7900 "start": { 6365 "start": {
7901 "column": 9, 6366 "column": 9,
7902 "line": 151 6367 "line": 144
7903 } 6368 }
7904 }, 6369 },
7905 { 6370 {
7906 "defaultMessage": "!!!Learn More", 6371 "defaultMessage": "!!!Learn More",
7907 "end": { 6372 "end": {
7908 "column": 3, 6373 "column": 3,
7909 "line": 158 6374 "line": 151
7910 }, 6375 },
7911 "file": "src/lib/Menu.js", 6376 "file": "src/lib/Menu.js",
7912 "id": "menu.help.learnMore", 6377 "id": "menu.help.learnMore",
7913 "start": { 6378 "start": {
7914 "column": 13, 6379 "column": 13,
7915 "line": 155 6380 "line": 148
7916 } 6381 }
7917 }, 6382 },
7918 { 6383 {
7919 "defaultMessage": "!!!Changelog", 6384 "defaultMessage": "!!!Changelog",
7920 "end": { 6385 "end": {
7921 "column": 3, 6386 "column": 3,
7922 "line": 162 6387 "line": 155
7923 }, 6388 },
7924 "file": "src/lib/Menu.js", 6389 "file": "src/lib/Menu.js",
7925 "id": "menu.help.changelog", 6390 "id": "menu.help.changelog",
7926 "start": { 6391 "start": {
7927 "column": 13, 6392 "column": 13,
6393 "line": 152
6394 }
6395 },
6396 {
6397 "defaultMessage": "!!!Import/Export Configuration Data",
6398 "end": {
6399 "column": 3,
7928 "line": 159 6400 "line": 159
6401 },
6402 "file": "src/lib/Menu.js",
6403 "id": "menu.help.importExportData",
6404 "start": {
6405 "column": 20,
6406 "line": 156
7929 } 6407 }
7930 }, 6408 },
7931 { 6409 {
7932 "defaultMessage": "!!!Support", 6410 "defaultMessage": "!!!Support",
7933 "end": { 6411 "end": {
7934 "column": 3, 6412 "column": 3,
7935 "line": 166 6413 "line": 163
7936 }, 6414 },
7937 "file": "src/lib/Menu.js", 6415 "file": "src/lib/Menu.js",
7938 "id": "menu.help.support", 6416 "id": "menu.help.support",
7939 "start": { 6417 "start": {
7940 "column": 11, 6418 "column": 11,
7941 "line": 163 6419 "line": 160
7942 } 6420 }
7943 }, 6421 },
7944 { 6422 {
7945 "defaultMessage": "!!!Copy Debug Information", 6423 "defaultMessage": "!!!Copy Debug Information",
7946 "end": { 6424 "end": {
7947 "column": 3, 6425 "column": 3,
7948 "line": 170 6426 "line": 167
7949 }, 6427 },
7950 "file": "src/lib/Menu.js", 6428 "file": "src/lib/Menu.js",
7951 "id": "menu.help.debugInfo", 6429 "id": "menu.help.debugInfo",
7952 "start": { 6430 "start": {
7953 "column": 13, 6431 "column": 13,
7954 "line": 167 6432 "line": 164
7955 } 6433 }
7956 }, 6434 },
7957 { 6435 {
7958 "defaultMessage": "!!!Publish Debug Information", 6436 "defaultMessage": "!!!Publish Debug Information",
7959 "end": { 6437 "end": {
7960 "column": 3, 6438 "column": 3,
7961 "line": 174 6439 "line": 171
7962 }, 6440 },
7963 "file": "src/lib/Menu.js", 6441 "file": "src/lib/Menu.js",
7964 "id": "menu.help.publishDebugInfo", 6442 "id": "menu.help.publishDebugInfo",
7965 "start": { 6443 "start": {
7966 "column": 20, 6444 "column": 20,
7967 "line": 171 6445 "line": 168
7968 } 6446 }
7969 }, 6447 },
7970 { 6448 {
7971 "defaultMessage": "!!!Ferdi Debug Information", 6449 "defaultMessage": "!!!Ferdi Debug Information",
7972 "end": { 6450 "end": {
7973 "column": 3, 6451 "column": 3,
7974 "line": 178 6452 "line": 175
7975 }, 6453 },
7976 "file": "src/lib/Menu.js", 6454 "file": "src/lib/Menu.js",
7977 "id": "menu.help.debugInfoCopiedHeadline", 6455 "id": "menu.help.debugInfoCopiedHeadline",
7978 "start": { 6456 "start": {
7979 "column": 27, 6457 "column": 27,
7980 "line": 175 6458 "line": 172
7981 } 6459 }
7982 }, 6460 },
7983 { 6461 {
7984 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 6462 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
7985 "end": { 6463 "end": {
7986 "column": 3, 6464 "column": 3,
7987 "line": 182 6465 "line": 179
7988 }, 6466 },
7989 "file": "src/lib/Menu.js", 6467 "file": "src/lib/Menu.js",
7990 "id": "menu.help.debugInfoCopiedBody", 6468 "id": "menu.help.debugInfoCopiedBody",
7991 "start": { 6469 "start": {
7992 "column": 23, 6470 "column": 23,
7993 "line": 179 6471 "line": 176
7994 } 6472 }
7995 }, 6473 },
7996 { 6474 {
7997 "defaultMessage": "!!!Unlock with Touch ID", 6475 "defaultMessage": "!!!Unlock with Touch ID",
7998 "end": { 6476 "end": {
7999 "column": 3, 6477 "column": 3,
8000 "line": 186 6478 "line": 183
8001 }, 6479 },
8002 "file": "src/lib/Menu.js", 6480 "file": "src/lib/Menu.js",
8003 "id": "locked.touchId", 6481 "id": "locked.touchId",
8004 "start": { 6482 "start": {
8005 "column": 11, 6483 "column": 11,
8006 "line": 183 6484 "line": 180
8007 } 6485 }
8008 }, 6486 },
8009 { 6487 {
8010 "defaultMessage": "!!!unlock via Touch ID", 6488 "defaultMessage": "!!!unlock via Touch ID",
8011 "end": { 6489 "end": {
8012 "column": 3, 6490 "column": 3,
8013 "line": 190 6491 "line": 187
8014 }, 6492 },
8015 "file": "src/lib/Menu.js", 6493 "file": "src/lib/Menu.js",
8016 "id": "locked.touchIdPrompt", 6494 "id": "locked.touchIdPrompt",
8017 "start": { 6495 "start": {
8018 "column": 17, 6496 "column": 17,
8019 "line": 187 6497 "line": 184
8020 } 6498 }
8021 }, 6499 },
8022 { 6500 {
8023 "defaultMessage": "!!!Terms of Service", 6501 "defaultMessage": "!!!Terms of Service",
8024 "end": { 6502 "end": {
8025 "column": 3, 6503 "column": 3,
8026 "line": 194 6504 "line": 191
8027 }, 6505 },
8028 "file": "src/lib/Menu.js", 6506 "file": "src/lib/Menu.js",
8029 "id": "menu.help.tos", 6507 "id": "menu.help.tos",
8030 "start": { 6508 "start": {
8031 "column": 7, 6509 "column": 7,
8032 "line": 191 6510 "line": 188
8033 } 6511 }
8034 }, 6512 },
8035 { 6513 {
8036 "defaultMessage": "!!!Privacy Statement", 6514 "defaultMessage": "!!!Privacy Statement",
8037 "end": { 6515 "end": {
8038 "column": 3, 6516 "column": 3,
8039 "line": 198 6517 "line": 195
8040 }, 6518 },
8041 "file": "src/lib/Menu.js", 6519 "file": "src/lib/Menu.js",
8042 "id": "menu.help.privacy", 6520 "id": "menu.help.privacy",
8043 "start": { 6521 "start": {
8044 "column": 11, 6522 "column": 11,
8045 "line": 195 6523 "line": 192
8046 } 6524 }
8047 }, 6525 },
8048 { 6526 {
8049 "defaultMessage": "!!!File", 6527 "defaultMessage": "!!!File",
8050 "end": { 6528 "end": {
8051 "column": 3, 6529 "column": 3,
8052 "line": 202 6530 "line": 199
8053 }, 6531 },
8054 "file": "src/lib/Menu.js", 6532 "file": "src/lib/Menu.js",
8055 "id": "menu.file", 6533 "id": "menu.file",
8056 "start": { 6534 "start": {
8057 "column": 8, 6535 "column": 8,
8058 "line": 199 6536 "line": 196
8059 } 6537 }
8060 }, 6538 },
8061 { 6539 {
8062 "defaultMessage": "!!!View", 6540 "defaultMessage": "!!!View",
8063 "end": { 6541 "end": {
8064 "column": 3, 6542 "column": 3,
8065 "line": 206 6543 "line": 203
8066 }, 6544 },
8067 "file": "src/lib/Menu.js", 6545 "file": "src/lib/Menu.js",
8068 "id": "menu.view", 6546 "id": "menu.view",
8069 "start": { 6547 "start": {
8070 "column": 8, 6548 "column": 8,
8071 "line": 203 6549 "line": 200
8072 } 6550 }
8073 }, 6551 },
8074 { 6552 {
8075 "defaultMessage": "!!!Services", 6553 "defaultMessage": "!!!Services",
8076 "end": { 6554 "end": {
8077 "column": 3, 6555 "column": 3,
8078 "line": 210 6556 "line": 207
8079 }, 6557 },
8080 "file": "src/lib/Menu.js", 6558 "file": "src/lib/Menu.js",
8081 "id": "menu.services", 6559 "id": "menu.services",
8082 "start": { 6560 "start": {
8083 "column": 12, 6561 "column": 12,
8084 "line": 207 6562 "line": 204
8085 } 6563 }
8086 }, 6564 },
8087 { 6565 {
8088 "defaultMessage": "!!!Window", 6566 "defaultMessage": "!!!Window",
8089 "end": { 6567 "end": {
8090 "column": 3, 6568 "column": 3,
8091 "line": 214 6569 "line": 211
8092 }, 6570 },
8093 "file": "src/lib/Menu.js", 6571 "file": "src/lib/Menu.js",
8094 "id": "menu.window", 6572 "id": "menu.window",
8095 "start": { 6573 "start": {
8096 "column": 10, 6574 "column": 10,
8097 "line": 211 6575 "line": 208
8098 } 6576 }
8099 }, 6577 },
8100 { 6578 {
8101 "defaultMessage": "!!!Help", 6579 "defaultMessage": "!!!Help",
8102 "end": { 6580 "end": {
8103 "column": 3, 6581 "column": 3,
8104 "line": 218 6582 "line": 215
8105 }, 6583 },
8106 "file": "src/lib/Menu.js", 6584 "file": "src/lib/Menu.js",
8107 "id": "menu.help", 6585 "id": "menu.help",
8108 "start": { 6586 "start": {
8109 "column": 8, 6587 "column": 8,
8110 "line": 215 6588 "line": 212
8111 } 6589 }
8112 }, 6590 },
8113 { 6591 {
8114 "defaultMessage": "!!!About Ferdi", 6592 "defaultMessage": "!!!About Ferdi",
8115 "end": { 6593 "end": {
8116 "column": 3, 6594 "column": 3,
8117 "line": 222 6595 "line": 219
8118 }, 6596 },
8119 "file": "src/lib/Menu.js", 6597 "file": "src/lib/Menu.js",
8120 "id": "menu.app.about", 6598 "id": "menu.app.about",
8121 "start": { 6599 "start": {
8122 "column": 9, 6600 "column": 9,
8123 "line": 219 6601 "line": 216
8124 } 6602 }
8125 }, 6603 },
8126 { 6604 {
8127 "defaultMessage": "!!!What's new?", 6605 "defaultMessage": "!!!What's new?",
8128 "end": { 6606 "end": {
8129 "column": 3, 6607 "column": 3,
8130 "line": 226 6608 "line": 223
8131 }, 6609 },
8132 "file": "src/lib/Menu.js", 6610 "file": "src/lib/Menu.js",
8133 "id": "menu.app.announcement", 6611 "id": "menu.app.announcement",
8134 "start": { 6612 "start": {
8135 "column": 16, 6613 "column": 16,
8136 "line": 223 6614 "line": 220
8137 } 6615 }
8138 }, 6616 },
8139 { 6617 {
8140 "defaultMessage": "!!!Settings", 6618 "defaultMessage": "!!!Settings",
8141 "end": { 6619 "end": {
8142 "column": 3, 6620 "column": 3,
8143 "line": 230 6621 "line": 227
8144 }, 6622 },
8145 "file": "src/lib/Menu.js", 6623 "file": "src/lib/Menu.js",
8146 "id": "menu.app.settings", 6624 "id": "menu.app.settings",
8147 "start": { 6625 "start": {
8148 "column": 12, 6626 "column": 12,
8149 "line": 227 6627 "line": 224
8150 } 6628 }
8151 }, 6629 },
8152 { 6630 {
8153 "defaultMessage": "!!!Check for updates", 6631 "defaultMessage": "!!!Check for updates",
8154 "end": { 6632 "end": {
8155 "column": 3, 6633 "column": 3,
8156 "line": 234 6634 "line": 231
8157 }, 6635 },
8158 "file": "src/lib/Menu.js", 6636 "file": "src/lib/Menu.js",
8159 "id": "menu.app.checkForUpdates", 6637 "id": "menu.app.checkForUpdates",
8160 "start": { 6638 "start": {
8161 "column": 19, 6639 "column": 19,
8162 "line": 231 6640 "line": 228
8163 } 6641 }
8164 }, 6642 },
8165 { 6643 {
8166 "defaultMessage": "!!!Hide", 6644 "defaultMessage": "!!!Hide",
8167 "end": { 6645 "end": {
8168 "column": 3, 6646 "column": 3,
8169 "line": 238 6647 "line": 235
8170 }, 6648 },
8171 "file": "src/lib/Menu.js", 6649 "file": "src/lib/Menu.js",
8172 "id": "menu.app.hide", 6650 "id": "menu.app.hide",
8173 "start": { 6651 "start": {
8174 "column": 8, 6652 "column": 8,
8175 "line": 235 6653 "line": 232
8176 } 6654 }
8177 }, 6655 },
8178 { 6656 {
8179 "defaultMessage": "!!!Hide Others", 6657 "defaultMessage": "!!!Hide Others",
8180 "end": { 6658 "end": {
8181 "column": 3, 6659 "column": 3,
8182 "line": 242 6660 "line": 239
8183 }, 6661 },
8184 "file": "src/lib/Menu.js", 6662 "file": "src/lib/Menu.js",
8185 "id": "menu.app.hideOthers", 6663 "id": "menu.app.hideOthers",
8186 "start": { 6664 "start": {
8187 "column": 14, 6665 "column": 14,
8188 "line": 239 6666 "line": 236
8189 } 6667 }
8190 }, 6668 },
8191 { 6669 {
8192 "defaultMessage": "!!!Unhide", 6670 "defaultMessage": "!!!Unhide",
8193 "end": { 6671 "end": {
8194 "column": 3, 6672 "column": 3,
8195 "line": 246 6673 "line": 243
8196 }, 6674 },
8197 "file": "src/lib/Menu.js", 6675 "file": "src/lib/Menu.js",
8198 "id": "menu.app.unhide", 6676 "id": "menu.app.unhide",
8199 "start": { 6677 "start": {
8200 "column": 10, 6678 "column": 10,
8201 "line": 243 6679 "line": 240
8202 } 6680 }
8203 }, 6681 },
8204 { 6682 {
8205 "defaultMessage": "!!!Auto-hide menu bar", 6683 "defaultMessage": "!!!Auto-hide menu bar",
8206 "end": { 6684 "end": {
8207 "column": 3, 6685 "column": 3,
8208 "line": 250 6686 "line": 247
8209 }, 6687 },
8210 "file": "src/lib/Menu.js", 6688 "file": "src/lib/Menu.js",
8211 "id": "menu.app.autohideMenuBar", 6689 "id": "menu.app.autohideMenuBar",
8212 "start": { 6690 "start": {
8213 "column": 19, 6691 "column": 19,
8214 "line": 247 6692 "line": 244
8215 } 6693 }
8216 }, 6694 },
8217 { 6695 {
8218 "defaultMessage": "!!!Quit", 6696 "defaultMessage": "!!!Quit",
8219 "end": { 6697 "end": {
8220 "column": 3, 6698 "column": 3,
8221 "line": 254 6699 "line": 251
8222 }, 6700 },
8223 "file": "src/lib/Menu.js", 6701 "file": "src/lib/Menu.js",
8224 "id": "menu.app.quit", 6702 "id": "menu.app.quit",
8225 "start": { 6703 "start": {
8226 "column": 8, 6704 "column": 8,
8227 "line": 251 6705 "line": 248
8228 } 6706 }
8229 }, 6707 },
8230 { 6708 {
8231 "defaultMessage": "!!!Add New Service...", 6709 "defaultMessage": "!!!Add New Service...",
8232 "end": { 6710 "end": {
8233 "column": 3, 6711 "column": 3,
8234 "line": 258 6712 "line": 255
8235 }, 6713 },
8236 "file": "src/lib/Menu.js", 6714 "file": "src/lib/Menu.js",
8237 "id": "menu.services.addNewService", 6715 "id": "menu.services.addNewService",
8238 "start": { 6716 "start": {
8239 "column": 17, 6717 "column": 17,
8240 "line": 255 6718 "line": 252
8241 } 6719 }
8242 }, 6720 },
8243 { 6721 {
8244 "defaultMessage": "!!!Add New Workspace...", 6722 "defaultMessage": "!!!Add New Workspace...",
8245 "end": { 6723 "end": {
8246 "column": 3, 6724 "column": 3,
8247 "line": 262 6725 "line": 259
8248 }, 6726 },
8249 "file": "src/lib/Menu.js", 6727 "file": "src/lib/Menu.js",
8250 "id": "menu.workspaces.addNewWorkspace", 6728 "id": "menu.workspaces.addNewWorkspace",
8251 "start": { 6729 "start": {
8252 "column": 19, 6730 "column": 19,
8253 "line": 259 6731 "line": 256
8254 } 6732 }
8255 }, 6733 },
8256 { 6734 {
8257 "defaultMessage": "!!!Open workspace drawer", 6735 "defaultMessage": "!!!Open workspace drawer",
8258 "end": { 6736 "end": {
8259 "column": 3, 6737 "column": 3,
8260 "line": 266 6738 "line": 263
8261 }, 6739 },
8262 "file": "src/lib/Menu.js", 6740 "file": "src/lib/Menu.js",
8263 "id": "menu.workspaces.openWorkspaceDrawer", 6741 "id": "menu.workspaces.openWorkspaceDrawer",
8264 "start": { 6742 "start": {
8265 "column": 23, 6743 "column": 23,
8266 "line": 263 6744 "line": 260
8267 } 6745 }
8268 }, 6746 },
8269 { 6747 {
8270 "defaultMessage": "!!!Close workspace drawer", 6748 "defaultMessage": "!!!Close workspace drawer",
8271 "end": { 6749 "end": {
8272 "column": 3, 6750 "column": 3,
8273 "line": 270 6751 "line": 267
8274 }, 6752 },
8275 "file": "src/lib/Menu.js", 6753 "file": "src/lib/Menu.js",
8276 "id": "menu.workspaces.closeWorkspaceDrawer", 6754 "id": "menu.workspaces.closeWorkspaceDrawer",
8277 "start": { 6755 "start": {
8278 "column": 24, 6756 "column": 24,
8279 "line": 267 6757 "line": 264
8280 } 6758 }
8281 }, 6759 },
8282 { 6760 {
8283 "defaultMessage": "!!!Activate next service...", 6761 "defaultMessage": "!!!Activate next service...",
8284 "end": { 6762 "end": {
8285 "column": 3, 6763 "column": 3,
8286 "line": 274 6764 "line": 271
8287 }, 6765 },
8288 "file": "src/lib/Menu.js", 6766 "file": "src/lib/Menu.js",
8289 "id": "menu.services.setNextServiceActive", 6767 "id": "menu.services.setNextServiceActive",
8290 "start": { 6768 "start": {
8291 "column": 23, 6769 "column": 23,
8292 "line": 271 6770 "line": 268
8293 } 6771 }
8294 }, 6772 },
8295 { 6773 {
8296 "defaultMessage": "!!!Activate previous service...", 6774 "defaultMessage": "!!!Activate previous service...",
8297 "end": { 6775 "end": {
8298 "column": 3, 6776 "column": 3,
8299 "line": 278 6777 "line": 275
8300 }, 6778 },
8301 "file": "src/lib/Menu.js", 6779 "file": "src/lib/Menu.js",
8302 "id": "menu.services.activatePreviousService", 6780 "id": "menu.services.activatePreviousService",
8303 "start": { 6781 "start": {
8304 "column": 27, 6782 "column": 27,
8305 "line": 275 6783 "line": 272
8306 } 6784 }
8307 }, 6785 },
8308 { 6786 {
8309 "defaultMessage": "!!!Disable notifications & audio", 6787 "defaultMessage": "!!!Disable notifications & audio",
8310 "end": { 6788 "end": {
8311 "column": 3, 6789 "column": 3,
8312 "line": 282 6790 "line": 279
8313 }, 6791 },
8314 "file": "src/lib/Menu.js", 6792 "file": "src/lib/Menu.js",
8315 "id": "sidebar.muteApp", 6793 "id": "sidebar.muteApp",
8316 "start": { 6794 "start": {
8317 "column": 11, 6795 "column": 11,
8318 "line": 279 6796 "line": 276
8319 } 6797 }
8320 }, 6798 },
8321 { 6799 {
8322 "defaultMessage": "!!!Enable notifications & audio", 6800 "defaultMessage": "!!!Enable notifications & audio",
8323 "end": { 6801 "end": {
8324 "column": 3, 6802 "column": 3,
8325 "line": 286 6803 "line": 283
8326 }, 6804 },
8327 "file": "src/lib/Menu.js", 6805 "file": "src/lib/Menu.js",
8328 "id": "sidebar.unmuteApp", 6806 "id": "sidebar.unmuteApp",
8329 "start": { 6807 "start": {
8330 "column": 13, 6808 "column": 13,
8331 "line": 283 6809 "line": 280
8332 } 6810 }
8333 }, 6811 },
8334 { 6812 {
8335 "defaultMessage": "!!!Workspaces", 6813 "defaultMessage": "!!!Workspaces",
8336 "end": { 6814 "end": {
8337 "column": 3, 6815 "column": 3,
8338 "line": 290 6816 "line": 287
8339 }, 6817 },
8340 "file": "src/lib/Menu.js", 6818 "file": "src/lib/Menu.js",
8341 "id": "menu.workspaces", 6819 "id": "menu.workspaces",
8342 "start": { 6820 "start": {
8343 "column": 14, 6821 "column": 14,
8344 "line": 287 6822 "line": 284
8345 } 6823 }
8346 }, 6824 },
8347 { 6825 {
8348 "defaultMessage": "!!!Default", 6826 "defaultMessage": "!!!Default",
8349 "end": { 6827 "end": {
8350 "column": 3, 6828 "column": 3,
8351 "line": 294 6829 "line": 291
8352 }, 6830 },
8353 "file": "src/lib/Menu.js", 6831 "file": "src/lib/Menu.js",
8354 "id": "menu.workspaces.defaultWorkspace", 6832 "id": "menu.workspaces.defaultWorkspace",
8355 "start": { 6833 "start": {
8356 "column": 20, 6834 "column": 20,
8357 "line": 291 6835 "line": 288
8358 } 6836 }
8359 }, 6837 },
8360 { 6838 {
8361 "defaultMessage": "!!!Todos", 6839 "defaultMessage": "!!!Todos",
8362 "end": { 6840 "end": {
8363 "column": 3, 6841 "column": 3,
8364 "line": 298 6842 "line": 295
8365 }, 6843 },
8366 "file": "src/lib/Menu.js", 6844 "file": "src/lib/Menu.js",
8367 "id": "menu.todos", 6845 "id": "menu.todos",
8368 "start": { 6846 "start": {
8369 "column": 9, 6847 "column": 9,
8370 "line": 295 6848 "line": 292
8371 } 6849 }
8372 }, 6850 },
8373 { 6851 {
8374 "defaultMessage": "!!!Open Todos drawer", 6852 "defaultMessage": "!!!Open Todos drawer",
8375 "end": { 6853 "end": {
8376 "column": 3, 6854 "column": 3,
8377 "line": 302 6855 "line": 299
8378 }, 6856 },
8379 "file": "src/lib/Menu.js", 6857 "file": "src/lib/Menu.js",
8380 "id": "menu.Todoss.openTodosDrawer", 6858 "id": "menu.Todoss.openTodosDrawer",
8381 "start": { 6859 "start": {
8382 "column": 19, 6860 "column": 19,
8383 "line": 299 6861 "line": 296
8384 } 6862 }
8385 }, 6863 },
8386 { 6864 {
8387 "defaultMessage": "!!!Close Todos drawer", 6865 "defaultMessage": "!!!Close Todos drawer",
8388 "end": { 6866 "end": {
8389 "column": 3, 6867 "column": 3,
8390 "line": 306 6868 "line": 303
8391 }, 6869 },
8392 "file": "src/lib/Menu.js", 6870 "file": "src/lib/Menu.js",
8393 "id": "menu.Todoss.closeTodosDrawer", 6871 "id": "menu.Todoss.closeTodosDrawer",
8394 "start": { 6872 "start": {
8395 "column": 20, 6873 "column": 20,
8396 "line": 303 6874 "line": 300
8397 } 6875 }
8398 }, 6876 },
8399 { 6877 {
8400 "defaultMessage": "!!!Enable Todos", 6878 "defaultMessage": "!!!Enable Todos",
8401 "end": { 6879 "end": {
8402 "column": 3, 6880 "column": 3,
8403 "line": 310 6881 "line": 307
8404 }, 6882 },
8405 "file": "src/lib/Menu.js", 6883 "file": "src/lib/Menu.js",
8406 "id": "menu.todos.enableTodos", 6884 "id": "menu.todos.enableTodos",
8407 "start": { 6885 "start": {
8408 "column": 15, 6886 "column": 15,
8409 "line": 307 6887 "line": 304
8410 } 6888 }
8411 }, 6889 },
8412 { 6890 {
8413 "defaultMessage": "!!!Home", 6891 "defaultMessage": "!!!Home",
8414 "end": { 6892 "end": {
8415 "column": 3, 6893 "column": 3,
8416 "line": 314 6894 "line": 311
8417 }, 6895 },
8418 "file": "src/lib/Menu.js", 6896 "file": "src/lib/Menu.js",
8419 "id": "menu.services.goHome", 6897 "id": "menu.services.goHome",
8420 "start": { 6898 "start": {
8421 "column": 17, 6899 "column": 17,
8422 "line": 311 6900 "line": 308
8423 } 6901 }
8424 } 6902 }
8425 ], 6903 ],
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index b2a6f5d2d..a0f0e5fa6 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Ωχ όχι! Ο Ferdi έχασε την επικοινωνία με το", 12 "connectionLostBanner.message": "Ωχ όχι! Ο Ferdi έχασε την επικοινωνία με το",
13 "feature.announcements.changelog.headline": "Αλλαγές σχετικά με το Ferdi", 13 "feature.announcements.changelog.headline": "Αλλαγές σχετικά με το Ferdi",
14 "feature.debugger.title": "Εγγραφή πληροφοριών εντοπισμού σφαλμάτων", 14 "feature.debugger.title": "Εγγραφή πληροφοριών εντοπισμού σφαλμάτων",
15 "feature.delayApp.headline": "Παρακαλούμε αγοράστε μία άδεια Ferdi για να παραλείψετε την αναμονή",
16 "feature.delayApp.text": "Ferdi θα συνεχίσει σε {seconds} δευτερόλεπτα.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Αγοράστε μία άδεια Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Αναβαθμίστε τον λογαριασμό σας ",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Ακύρωση", 16 "feature.nightlyBuilds.cancel": "Ακύρωση",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Δεν είναι δυνατή η σύνδεση με τις ζωντανές υπηρεσίες του Ferdi", 36 "global.api.unhealthy": "Δεν είναι δυνατή η σύνδεση με τις ζωντανές υπηρεσίες του Ferdi",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "Έχετε αποσυνδεθεί από το Διαδίκτυο", 37 "global.notConnectedToTheInternet": "Έχετε αποσυνδεθεί από το Διαδίκτυο",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Εισαγάγετε τις υπηρεσίες σας Ferdi 4", 44 "import.headline": "Εισαγάγετε τις υπηρεσίες σας Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Απόκρυψη", 52 "infobar.hide": "Απόκρυψη",
89 "infobar.requiredRequestsFailed": "Δεν ήταν δυνατή η φόρτωση υπηρεσιών και πληροφοριών χρηστών", 53 "infobar.requiredRequestsFailed": "Δεν ήταν δυνατή η φόρτωση υπηρεσιών και πληροφοριών χρηστών",
90 "infobar.servicesUpdated": "Οι υπηρεσίες σας έχουν ενημερωθεί.", 54 "infobar.servicesUpdated": "Οι υπηρεσίες σας έχουν ενημερωθεί.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Υπάρχει διαθέσιμη μια νέα ενημέρωση για τον Ferdi.", 55 "infobar.updateAvailable": "Υπάρχει διαθέσιμη μια νέα ενημέρωση για τον Ferdi.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Διεύθυνση ηλεκτρονικού ταχυδρομείου", 57 "invite.email.label": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "Έλεγχος για ενημερώσεις", 88 "menu.app.checkForUpdates": "Έλεγχος για ενημερώσεις",
126 "menu.app.hide": "Απόκρυψη", 89 "menu.app.hide": "Απόκρυψη",
127 "menu.app.hideOthers": "Απόκρυψη των άλλων", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Έξοδος", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Ρυθμίσεις", 92 "menu.app.settings": "Ρυθμίσεις",
130 "menu.app.unhide": "Εμφάνιση", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Επεξεργασία", 94 "menu.edit": "Επεξεργασία",
132 "menu.edit.copy": "Αντιγραφή", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Αποκοπή", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Διαγραφή", 97 "menu.edit.delete": "Διαγραφή",
135 "menu.edit.emojiSymbols": "Emoji & Σύμβολα", 98 "menu.edit.emojiSymbols": "Emoji & Σύμβολα",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Επικόλληση", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Επικόλληση και διατήρηση μορφοποίησης", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Ακύρωση αναίρεσης", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Επιλογή Όλων", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Ομιλία", 104 "menu.edit.speech": "Ομιλία",
142 "menu.edit.startDictation": "Έναρξη φωνητικής πληκτρολόγησης", 105 "menu.edit.startDictation": "Έναρξη φωνητικής πληκτρολόγησης",
143 "menu.edit.startSpeaking": "Έναρξη εκφώνησης", 106 "menu.edit.startSpeaking": "Έναρξη εκφώνησης",
144 "menu.edit.stopSpeaking": "Σταμάτημα εκφώνησης", 107 "menu.edit.stopSpeaking": "Σταμάτημα εκφώνησης",
145 "menu.edit.undo": "Αναίρεση", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Αρχείο", 109 "menu.file": "Αρχείο",
147 "menu.help": "Βοήθεια", 110 "menu.help": "Help",
148 "menu.help.changelog": "Πρόσφατες αλλαγές", 111 "menu.help.changelog": "Πρόσφατες αλλαγές",
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Μάθετε περισσότερα", 116 "menu.help.learnMore": "Μάθετε περισσότερα",
153 "menu.help.privacy": "Δήλωση απορρήτου", 117 "menu.help.privacy": "Δήλωση απορρήτου",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Προβολή", 128 "menu.view": "Προβολή",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Πλήρης Οθόνη",
167 "menu.view.exitFullScreen": "Έξοδος από πλήρη οθόνη",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Ανανέωση Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Ανανέωση Υπηρεσίας", 134 "menu.view.reloadService": "Ανανέωση Υπηρεσίας",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Πραγματικό μέγεθος", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Toggle Dark Mode", 137 "menu.view.toggleDarkMode": "Toggle Dark Mode",
176 "menu.view.toggleDevTools": "Άνοιγμα Εργαλειοθήκη Προγραμματιστών", 138 "menu.view.toggleDevTools": "Άνοιγμα Εργαλειοθήκη Προγραμματιστών",
177 "menu.view.toggleFullScreen": "Λειτουργία πλήρους οθόνης", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Λειτουργεία Υπηρεσίασ Εργαλειοθήκης Προγραμματιστών", 140 "menu.view.toggleServiceDevTools": "Λειτουργεία Υπηρεσίασ Εργαλειοθήκης Προγραμματιστών",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "Μεγέθυνση", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Σμίκρυνση", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Παράθυρο", 144 "menu.window": "Window",
183 "menu.window.close": "Κλείσιμο", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Ελαχιστοποίηση", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Workspaces", 147 "menu.workspaces": "Workspaces",
186 "menu.workspaces.addNewWorkspace": "Add New Workspace...", 148 "menu.workspaces.addNewWorkspace": "Add New Workspace...",
187 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer", 149 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer",
@@ -194,11 +156,7 @@
194 "password.noUser": "Δεν βρέθηκε χρήστης με τη συγκεκριμένη διεύθυνση ηλεκτρονικού ταχυδρομείου", 156 "password.noUser": "Δεν βρέθηκε χρήστης με τη συγκεκριμένη διεύθυνση ηλεκτρονικού ταχυδρομείου",
195 "password.submit.label": "Υποβολή", 157 "password.submit.label": "Υποβολή",
196 "password.successInfo": "Ελέγξτε το email σας", 158 "password.successInfo": "Ελέγξτε το email σας",
197 "premiumFeature.button.upgradeAccount": "Αναβαθμίστε τον λογαριασμό σας ",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Επαναφόρτωση {name}", 170 "service.crashHandler.action": "Επαναφόρτωση {name}",
236 "service.crashHandler.autoReload": "Γίνεται προσπάθεια αυτόματης ανάκτησης του {name} σε {seconds} δευτερόλεπτα", 171 "service.crashHandler.autoReload": "Γίνεται προσπάθεια αυτόματης ανάκτησης του {name} σε {seconds} δευτερόλεπτα",
237 "service.crashHandler.headline": "Ω, όχι!", 172 "service.crashHandler.headline": "Ω, όχι!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Ω, όχι!", 178 "service.errorHandler.headline": "Ω, όχι!",
244 "service.errorHandler.message": "Σφάλμα", 179 "service.errorHandler.message": "Σφάλμα",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Ξεκινήστε", 182 "services.getStarted": "Ξεκινήστε",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Καλώς ορίσατε στον Ferdi", 186 "services.welcome": "Καλώς ορίσατε στον Ferdi",
257 "settings.account.account.editButton": "Επεξεργασία λογαριασμού", 187 "settings.account.account.editButton": "Επεξεργασία λογαριασμού",
258 "settings.account.accountType.basic": "Βασικός λογαριασμός",
259 "settings.account.accountType.premium": "Λογαριασμός Premium Υποστηρικτή",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Ενημέρωση προφίλ", 190 "settings.account.buttonSave": "Ενημέρωση προφίλ",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Τιμολόγια", 197 "settings.account.headlineInvoices": "Τιμολόγια",
270 "settings.account.headlinePassword": "Αλλαγή κωδικού πρόσβασης", 198 "settings.account.headlinePassword": "Αλλαγή κωδικού πρόσβασης",
271 "settings.account.headlineProfile": "Ενημέρωση προφίλ", 199 "settings.account.headlineProfile": "Ενημέρωση προφίλ",
272 "settings.account.headlineSubscription": "Η συνδρομή σας",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Λήψη",
276 "settings.account.manageSubscription.label": "Διαχείριση της συνδρομής σας",
277 "settings.account.successInfo": "Οι αλλαγές σας έχουν αποθηκευτεί", 200 "settings.account.successInfo": "Οι αλλαγές σας έχουν αποθηκευτεί",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Δοκιμάστε ξανά", 201 "settings.account.tryReloadServices": "Δοκιμάστε ξανά",
282 "settings.account.tryReloadUserInfoRequest": "Δοκιμάστε ξανά", 202 "settings.account.tryReloadUserInfoRequest": "Δοκιμάστε ξανά",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Δεν ήταν δυνατή η φόρτωση πληροφοριών χρήστη", 203 "settings.account.userInfoRequestFailed": "Δεν ήταν δυνατή η φόρτωση πληροφοριών χρήστη",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Ενεργοποίηση ορθογραφικού ελέγχου", 227 "settings.app.form.enableSpellchecking": "Ενεργοποίηση ορθογραφικού ελέγχου",
309 "settings.app.form.enableSystemTray": "Εμφάνιση του Ferdi στη γραμμή ειδοποιήσεων", 228 "settings.app.form.enableSystemTray": "Εμφάνιση του Ferdi στη γραμμή ειδοποιήσεων",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Ρυθμίσεις", 259 "settings.app.headline": "Ρυθμίσεις",
341 "settings.app.headlineAdvanced": "Για προχωρημένους", 260 "settings.app.headlineAdvanced": "Για προχωρημένους",
342 "settings.app.headlineAppearance": "Εμφάνιση", 261 "settings.app.headlineAppearance": "Εμφάνιση",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Οι αλλαγές απαιτούν επανεκκίνηση", 272 "settings.app.restartRequired": "Οι αλλαγές απαιτούν επανεκκίνηση",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Λανθάνουσα μνήμη", 277 "settings.app.subheadlineCache": "Λανθάνουσα μνήμη",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Διαθέσιμες υπηρεσίες", 301 "settings.recipes.headline": "Διαθέσιμες υπηρεσίες",
383 "settings.recipes.missingService": "Λείπει κάποια υπηρεσία;", 302 "settings.recipes.missingService": "Λείπει κάποια υπηρεσία;",
384 "settings.recipes.mostPopular": "Τα πιο δημοφιλή",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Η υπηρεσία προστέθηκε με επιτυχία", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Η υπηρεσία προστέθηκε με επιτυχία",
387 "settings.searchService": "Αναζήτηση υπηρεσίας", 305 "settings.searchService": "Αναζήτηση υπηρεσίας",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Προσθήκη {name}", 309 "settings.service.form.addServiceHeadline": "Προσθήκη {name}",
392 "settings.service.form.availableServices": "Διαθέσιμες υπηρεσίες", 310 "settings.service.form.availableServices": "Διαθέσιμες υπηρεσίες",
393 "settings.service.form.customUrl": "Προσαρμοσμένος διακομιστής", 311 "settings.service.form.customUrl": "Προσαρμοσμένος διακομιστής",
394 "settings.service.form.customUrlPremiumInfo": "Για να προσθέσετε υπηρεσίες που φιλοξενούνται μόνος σας, χρειάζεστε έναν λογαριασμό υποστήριξης Premium Ferdi.",
395 "settings.service.form.customUrlUpgradeAccount": "Αναβάθμιση του λογαριασμού σας",
396 "settings.service.form.customUrlValidationError": "Δεν ήταν δυνατή η επικύρωση του προσαρμοσμένου διακομιστή {name}.", 312 "settings.service.form.customUrlValidationError": "Δεν ήταν δυνατή η επικύρωση του προσαρμοσμένου διακομιστή {name}.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Ομάδα", 380 "settings.team.headline": "Ομάδα",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Εταιρεία", 385 "settings.user.form.accountType.company": "Εταιρεία",
471 "settings.user.form.accountType.individual": "Ατομικός", 386 "settings.user.form.accountType.individual": "Ατομικός",
472 "settings.user.form.accountType.label": "Τύπος λογαριασμού", 387 "settings.user.form.accountType.label": "Τύπος λογαριασμού",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Έχετε ήδη λογαριασμό? Συνδεθείτε.", 431 "signup.link.login": "Έχετε ήδη λογαριασμό? Συνδεθείτε.",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Δημιουργία λογαριασμού", 433 "signup.submit.label": "Δημιουργία λογαριασμού",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Ακύρωση",
531 "subscriptionPopup.buttonDone": "Έγινε",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Διαγραφή υπηρεσίας", 435 "tabs.item.deleteService": "Διαγραφή υπηρεσίας",
534 "tabs.item.disableAudio": "Απενεργοποίηση ήχου", 436 "tabs.item.disableAudio": "Απενεργοποίηση ήχου",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Απενεργοποίηση ειδοποιήσεων", 438 "tabs.item.disableNotifications": "Απενεργοποίηση ειδοποιήσεων",
536 "tabs.item.disableService": "Απενεργοποίηση υπηρεσίας", 439 "tabs.item.disableService": "Απενεργοποίηση υπηρεσίας",
537 "tabs.item.edit": "Επεξεργασία", 440 "tabs.item.edit": "Επεξεργασία",
538 "tabs.item.enableAudio": "Ενεργοποίηση ήχου", 441 "tabs.item.enableAudio": "Ενεργοποίηση ήχου",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Ενεργοποίηση ειδοποιήσεων", 443 "tabs.item.enableNotification": "Ενεργοποίηση ειδοποιήσεων",
540 "tabs.item.enableService": "Ενεργοποίηση υπηρεσίας", 444 "tabs.item.enableService": "Ενεργοποίηση υπηρεσίας",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Επαναφόρτωση", 446 "tabs.item.reload": "Επαναφόρτωση",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} δεν είναι έγκυρο", 448 "validation.email": "{field} δεν είναι έγκυρο",
543 "validation.minLength": "{field} πρέπει να είναι τουλάχιστον {length} χαρακτήρες", 449 "validation.minLength": "{field} πρέπει να είναι τουλάχιστον {length} χαρακτήρες",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index ab2be014b..002ea5655 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cancel", 16 "feature.nightlyBuilds.cancel": "Cancel",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Can't connect to Ferdi online services", 36 "global.api.unhealthy": "Can't connect to Ferdi online services",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "You are not connected to the internet.", 37 "global.notConnectedToTheInternet": "You are not connected to the internet.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Import your Ferdi 4 services", 44 "import.headline": "Import your Ferdi 4 services",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Hide", 52 "infobar.hide": "Hide",
89 "infobar.requiredRequestsFailed": "Could not load services and user information", 53 "infobar.requiredRequestsFailed": "Could not load services and user information",
90 "infobar.servicesUpdated": "Your services have been updated.", 54 "infobar.servicesUpdated": "Your services have been updated.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "A new update for Ferdi is available.", 55 "infobar.updateAvailable": "A new update for Ferdi is available.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email address", 57 "invite.email.label": "Email address",
@@ -149,6 +112,7 @@
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Learn More", 116 "menu.help.learnMore": "Learn More",
153 "menu.help.privacy": "Privacy Statement", 117 "menu.help.privacy": "Privacy Statement",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,12 +127,10 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Enter Full Screen",
167 "menu.view.exitFullScreen": "Exit Full Screen",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Reload Service", 134 "menu.view.reloadService": "Reload Service",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Actual Size", 136 "menu.view.resetZoom": "Actual Size",
@@ -194,11 +156,7 @@
194 "password.noUser": "No user with that email address was found", 156 "password.noUser": "No user with that email address was found",
195 "password.submit.label": "Submit", 157 "password.submit.label": "Submit",
196 "password.successInfo": "Please check your email", 158 "password.successInfo": "Please check your email",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "Error", 179 "service.errorHandler.message": "Error",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Get started", 182 "services.getStarted": "Get started",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welcome to Ferdi", 186 "services.welcome": "Welcome to Ferdi",
257 "settings.account.account.editButton": "Edit account", 187 "settings.account.account.editButton": "Edit account",
258 "settings.account.accountType.basic": "Basic Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Update profile", 190 "settings.account.buttonSave": "Update profile",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Invoices", 197 "settings.account.headlineInvoices": "Invoices",
270 "settings.account.headlinePassword": "Change password", 198 "settings.account.headlinePassword": "Change password",
271 "settings.account.headlineProfile": "Update profile", 199 "settings.account.headlineProfile": "Update profile",
272 "settings.account.headlineSubscription": "Your subscription",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Manage your subscription",
277 "settings.account.successInfo": "Your changes have been saved", 200 "settings.account.successInfo": "Your changes have been saved",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Try again", 201 "settings.account.tryReloadServices": "Try again",
282 "settings.account.tryReloadUserInfoRequest": "Try again", 202 "settings.account.tryReloadUserInfoRequest": "Try again",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Could not load user information", 203 "settings.account.userInfoRequestFailed": "Could not load user information",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 228 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Settings", 259 "settings.app.headline": "Settings",
341 "settings.app.headlineAdvanced": "Advanced", 260 "settings.app.headlineAdvanced": "Advanced",
342 "settings.app.headlineAppearance": "Appearance", 261 "settings.app.headlineAppearance": "Appearance",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Changes require restart", 272 "settings.app.restartRequired": "Changes require restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Available services", 301 "settings.recipes.headline": "Available services",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "Most popular",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
387 "settings.searchService": "Search service", 305 "settings.searchService": "Search service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Add {name}", 309 "settings.service.form.addServiceHeadline": "Add {name}",
392 "settings.service.form.availableServices": "Available services", 310 "settings.service.form.availableServices": "Available services",
393 "settings.service.form.customUrl": "Custom server", 311 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Company", 385 "settings.user.form.accountType.company": "Company",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Account type", 387 "settings.user.form.accountType.label": "Account type",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Already have an account, sign in?", 431 "signup.link.login": "Already have an account, sign in?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Create account", 433 "signup.submit.label": "Create account",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Cancel",
531 "subscriptionPopup.buttonDone": "Done",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Delete service", 435 "tabs.item.deleteService": "Delete service",
534 "tabs.item.disableAudio": "Disable audio", 436 "tabs.item.disableAudio": "Disable audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Disable notifications", 438 "tabs.item.disableNotifications": "Disable notifications",
536 "tabs.item.disableService": "Disable service", 439 "tabs.item.disableService": "Disable service",
537 "tabs.item.edit": "Edit", 440 "tabs.item.edit": "Edit",
538 "tabs.item.enableAudio": "Enable audio", 441 "tabs.item.enableAudio": "Enable audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Enable notifications", 443 "tabs.item.enableNotification": "Enable notifications",
540 "tabs.item.enableService": "Enable service", 444 "tabs.item.enableService": "Enable service",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Reload", 446 "tabs.item.reload": "Reload",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 6959a3a78..3c617ab5e 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "¡Oh no! Ferdi perdió la conexión con {name}.", 12 "connectionLostBanner.message": "¡Oh no! Ferdi perdió la conexión con {name}.",
13 "feature.announcements.changelog.headline": "Cambios en Ferdi {version}", 13 "feature.announcements.changelog.headline": "Cambios en Ferdi {version}",
14 "feature.debugger.title": "Publica la información de depuración", 14 "feature.debugger.title": "Publica la información de depuración",
15 "feature.delayApp.headline": "Por favor compra una Licencia de Soporte de Ferdi para evitar la espera",
16 "feature.delayApp.text": "Ferdi continuará en {seconds} segundos.",
17 "feature.delayApp.trial.action": "Si! Quiero probar Ferdi Profesional por 14 días, gratis!",
18 "feature.delayApp.trial.actionShort": "Activar el período de prueba de Ferdi Profesional",
19 "feature.delayApp.trial.headline": "Empieza el periodo de prueba de Ferdi Profesional por 14 días y cruza la linea.",
20 "feature.delayApp.upgrade.action": "Consigue una Licencia de Soporte de Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Consigue una mejora para tu cuenta",
22 "feature.nightlyBuilds.activate": "Activar", 15 "feature.nightlyBuilds.activate": "Activar",
23 "feature.nightlyBuilds.cancel": "Cancelar", 16 "feature.nightlyBuilds.cancel": "Cancelar",
24 "feature.nightlyBuilds.info": "Las \"Nightly builds\" son versiones altamente experimentales de Ferdi que pueden contener características sin pulir o sin completar. Estas versiones son utilizadas principalmente por los desarrolladores para probar sus nuevas características desarrolladas y cómo se comportarán en la versión final. Si no sabe lo que está haciendo, le sugerimos que no active las estas versiones.", 17 "feature.nightlyBuilds.info": "Las \"Nightly builds\" son versiones altamente experimentales de Ferdi que pueden contener características sin pulir o sin completar. Estas versiones son utilizadas principalmente por los desarrolladores para probar sus nuevas características desarrolladas y cómo se comportarán en la versión final. Si no sabe lo que está haciendo, le sugerimos que no active las estas versiones.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Hubo un error al intentar publicar la información de depuración. Por favor, inténtalo de nuevo más tarde o revisa la consola para más información.", 19 "feature.publishDebugInfo.error": "Hubo un error al intentar publicar la información de depuración. Por favor, inténtalo de nuevo más tarde o revisa la consola para más información.",
43 "feature.publishDebugInfo.info": "Publicar tu información de depuración nos ayuda a encontrar problemas y errores en Ferdi. Al publicar tu información de depuración aceptas la política de privacidad y las condiciones de servicio de Ferdi Debuggger", 20 "feature.publishDebugInfo.info": "Publicar tu información de depuración nos ayuda a encontrar problemas y errores en Ferdi. Al publicar tu información de depuración aceptas la política de privacidad y las condiciones de servicio de Ferdi Debuggger",
44 "feature.publishDebugInfo.privacy": "Política de Privacidad", 21 "feature.publishDebugInfo.privacy": "Política de Privacidad",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Puede seleccionar un servicio usando TAB, ↑ y ↓. Puede abrir servicio usando ENTER.", 26 "feature.quickSwitch.info": "Puede seleccionar un servicio usando TAB, ↑ y ↓. Puede abrir servicio usando ENTER.",
50 "feature.quickSwitch.search": "Buscar...", 27 "feature.quickSwitch.search": "Buscar...",
51 "feature.quickSwitch.title": "Cambiar rápidamente", 28 "feature.quickSwitch.title": "Cambiar rápidamente",
52 "feature.serviceLimit.limitReached": "Has agregado {amount} servicio mas que los {limit} servicios permitidos en tu plan. Por favor mejora tu cuenta para agregar mas servicios.",
53 "feature.shareFranz.action.email": "Enviar como correo", 29 "feature.shareFranz.action.email": "Enviar como correo",
54 "feature.shareFranz.action.facebook": "Compartir en Facebook", 30 "feature.shareFranz.action.facebook": "Compartir en Facebook",
55 "feature.shareFranz.action.twitter": "Compartir en Twitter", 31 "feature.shareFranz.action.twitter": "Compartir en Twitter",
@@ -57,26 +33,14 @@
57 "feature.shareFranz.shareText.email": "¡He añadido {count} servicios a Ferdi! Obtén la aplicación gratuita para WhatsApp, Messenger, Slack, Skype en www.getferdi.com", 33 "feature.shareFranz.shareText.email": "¡He añadido {count} servicios a Ferdi! Obtén la aplicación gratuita para WhatsApp, Messenger, Slack, Skype en www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "He agregado {count} servicios a Ferdi! Obtené la aplicación gratuita de WhatsApp, Messenger, Slack, Skype y co en www.getferdi.com/cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "He agregado {count} servicios a Ferdi! Obtené la aplicación gratuita de WhatsApp, Messenger, Slack, Skype y co en www.getferdi.com/cc @FerdiMessenger",
59 "feature.shareFranz.text": "Dile a tus amigos y colegas lo asombroso que es Ferdi y ayúdanos a correr la voz.", 35 "feature.shareFranz.text": "Dile a tus amigos y colegas lo asombroso que es Ferdi y ayúdanos a correr la voz.",
60 "feature.todos.premium.info": "Todos de Ferdi está disponible para usuarios premium ahora!",
61 "feature.todos.premium.rollout": "El resto de los usuarios deberán esperar un poco más de tiempo.",
62 "feature.todos.premium.upgrade": "Actualizar cuenta",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "No es posible conectarse a los servicios en línea de Ferdi.", 36 "global.api.unhealthy": "No es posible conectarse a los servicios en línea de Ferdi.",
71 "global.franzProRequired": "Se requiere una cuenta Ferdi Profesional",
72 "global.notConnectedToTheInternet": "No estás conectado a Internet", 37 "global.notConnectedToTheInternet": "No estás conectado a Internet",
73 "global.spellchecker.useDefault": "Utilizar estándar del sistema ({default})", 38 "global.spellchecker.useDefault": "Utilizar estándar del sistema ({default})",
74 "global.spellchecking.autodetect": "Detectar el idioma automáticamente", 39 "global.spellchecking.autodetect": "Detectar el idioma automáticamente",
75 "global.spellchecking.autodetect.short": "Automático", 40 "global.spellchecking.autodetect.short": "Automático",
76 "global.spellchecking.language": "Corrector de ortografía", 41 "global.spellchecking.language": "Corrector de ortografía",
77 "global.upgradeButton.upgradeToPro": "Actualiza a Ferdi Profesional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "Navegador",
80 "import.headline": "Importa tus servicios de Ferdi 4", 44 "import.headline": "Importa tus servicios de Ferdi 4",
81 "import.notSupportedHeadline": "Servicios aún no admitidos en Ferdi 5", 45 "import.notSupportedHeadline": "Servicios aún no admitidos en Ferdi 5",
82 "import.skip.label": "Quiero agregar servicios manualmente", 46 "import.skip.label": "Quiero agregar servicios manualmente",
@@ -88,9 +52,8 @@
88 "infobar.hide": "Ocultar", 52 "infobar.hide": "Ocultar",
89 "infobar.requiredRequestsFailed": "No se han podido cargar los servicios ni la información de usuario", 53 "infobar.requiredRequestsFailed": "No se han podido cargar los servicios ni la información de usuario",
90 "infobar.servicesUpdated": "Tus servicios han sido actualizados.", 54 "infobar.servicesUpdated": "Tus servicios han sido actualizados.",
91 "infobar.trialActivated": "Tu periodo de prueba ha sido activado exitosamente. Que disfrutes tus mensajes!",
92 "infobar.updateAvailable": "Una nueva actualización de Ferdi está disponible", 55 "infobar.updateAvailable": "Una nueva actualización de Ferdi está disponible",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Descargar",
94 "invite.email.label": "Dirección de correo electrónico", 57 "invite.email.label": "Dirección de correo electrónico",
95 "invite.headline.friends": "Invita a 3 de tus amigos o compañeros", 58 "invite.headline.friends": "Invita a 3 de tus amigos o compañeros",
96 "invite.name.label": "Nombre", 59 "invite.name.label": "Nombre",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-ocultar barra de menú", 87 "menu.app.autohideMenuBar": "Auto-ocultar barra de menú",
125 "menu.app.checkForUpdates": "Comprobar actualizaciones", 88 "menu.app.checkForUpdates": "Comprobar actualizaciones",
126 "menu.app.hide": "Ocultar", 89 "menu.app.hide": "Ocultar",
127 "menu.app.hideOthers": "Ocultar otros", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Salir", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Configuración", 92 "menu.app.settings": "Configuración",
130 "menu.app.unhide": "Mostrar", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Editar", 94 "menu.edit": "Editar",
132 "menu.edit.copy": "Copiar", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Cortar", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Borrar", 97 "menu.edit.delete": "Borrar",
135 "menu.edit.emojiSymbols": "Emoji y Símbolos", 98 "menu.edit.emojiSymbols": "Emoji y Símbolos",
136 "menu.edit.findInPage": "Buscar en la página", 99 "menu.edit.findInPage": "Buscar en la página",
137 "menu.edit.paste": "Pegar", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Pegar con el mismo estilo", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Rehacer", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Seleccionar todo", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Leer", 104 "menu.edit.speech": "Leer",
142 "menu.edit.startDictation": "Empezar dictado", 105 "menu.edit.startDictation": "Empezar dictado",
143 "menu.edit.startSpeaking": "Empezar lectura", 106 "menu.edit.startSpeaking": "Empezar lectura",
144 "menu.edit.stopSpeaking": "Detener lectura", 107 "menu.edit.stopSpeaking": "Detener lectura",
145 "menu.edit.undo": "Deshacer", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Archivo", 109 "menu.file": "Archivo",
147 "menu.help": "Ayuda", 110 "menu.help": "Help",
148 "menu.help.changelog": "Registro de cambios", 111 "menu.help.changelog": "Registro de cambios",
149 "menu.help.debugInfo": "Copiar información de depuración", 112 "menu.help.debugInfo": "Copiar información de depuración",
150 "menu.help.debugInfoCopiedBody": "Tu información de depuración ha sido copiada a tu portapapeles", 113 "menu.help.debugInfoCopiedBody": "Tu información de depuración ha sido copiada a tu portapapeles",
151 "menu.help.debugInfoCopiedHeadline": "Información de depurador de Ferdi", 114 "menu.help.debugInfoCopiedHeadline": "Información de depurador de Ferdi",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Conocer más", 116 "menu.help.learnMore": "Conocer más",
153 "menu.help.privacy": "Declaración de privacidad", 117 "menu.help.privacy": "Declaración de privacidad",
154 "menu.help.publishDebugInfo": "Escribir información de depuración", 118 "menu.help.publishDebugInfo": "Escribir información de depuración",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Habilitar Tareas pendientes", 127 "menu.todos.enableTodos": "Habilitar Tareas pendientes",
164 "menu.view": "Mostrar", 128 "menu.view": "Mostrar",
165 "menu.view.back": "Volver", 129 "menu.view.back": "Volver",
166 "menu.view.enterFullScreen": "Pasar a pantalla completa",
167 "menu.view.exitFullScreen": "Salir de Pantalla Completa",
168 "menu.view.forward": "Siguiente", 130 "menu.view.forward": "Siguiente",
169 "menu.view.lockFerdi": "Bloquear Ferdi", 131 "menu.view.lockFerdi": "Bloquear Ferdi",
170 "menu.view.openQuickSwitch": "Abrir Cambio Rápido", 132 "menu.view.openQuickSwitch": "Abrir Cambio Rápido",
171 "menu.view.reloadFranz": "Recargar Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Recargar Servicio", 134 "menu.view.reloadService": "Recargar Servicio",
173 "menu.view.reloadTodos": "Recargar Pendientes", 135 "menu.view.reloadTodos": "Recargar Pendientes",
174 "menu.view.resetZoom": "Tamaño Actual", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Cambiar a modo oscuro", 137 "menu.view.toggleDarkMode": "Cambiar a modo oscuro",
176 "menu.view.toggleDevTools": "Activar las Herramientas para Desarrolladores", 138 "menu.view.toggleDevTools": "Activar las Herramientas para Desarrolladores",
177 "menu.view.toggleFullScreen": "Cambiar a Pantalla Completa", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Mostrar Herramientas de Servicios para Desarrolladores", 140 "menu.view.toggleServiceDevTools": "Mostrar Herramientas de Servicios para Desarrolladores",
179 "menu.view.toggleTodosDevTools": "Tareas pendientes: Herramientas para desarrolladores", 141 "menu.view.toggleTodosDevTools": "Tareas pendientes: Herramientas para desarrolladores",
180 "menu.view.zoomIn": "Ampliar", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Reducir", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Ventana", 144 "menu.window": "Window",
183 "menu.window.close": "Cerrar", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimizar", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Espacios de trabajo", 147 "menu.workspaces": "Espacios de trabajo",
186 "menu.workspaces.addNewWorkspace": "Añadir nuevo espacio de trabajo...", 148 "menu.workspaces.addNewWorkspace": "Añadir nuevo espacio de trabajo...",
187 "menu.workspaces.closeWorkspaceDrawer": "Cerrar cajón de espacio de trabajo", 149 "menu.workspaces.closeWorkspaceDrawer": "Cerrar cajón de espacio de trabajo",
@@ -194,11 +156,7 @@
194 "password.noUser": "No se encontró un usuario con esa dirección de correo electrónico", 156 "password.noUser": "No se encontró un usuario con esa dirección de correo electrónico",
195 "password.submit.label": "Enviar", 157 "password.submit.label": "Enviar",
196 "password.successInfo": "Por favor revisa tu correo electrónico", 158 "password.successInfo": "Por favor revisa tu correo electrónico",
197 "premiumFeature.button.upgradeAccount": "Consigue una mejora para tu cuenta",
198 "pricing.features.accountSync": "Sincronización de cuenta", 159 "pricing.features.accountSync": "Sincronización de cuenta",
199 "pricing.features.adFree": "Sin anuncios para siempre!",
200 "pricing.features.appDelays": "Sin pantallas de espera",
201 "pricing.features.appDelaysEnabled": "Pantallas Ocasionales de Espera",
202 "pricing.features.customWebsites": "Agregue sitios personalizados", 160 "pricing.features.customWebsites": "Agregue sitios personalizados",
203 "pricing.features.desktopNotifications": "Notificaciones de escritorio", 161 "pricing.features.desktopNotifications": "Notificaciones de escritorio",
204 "pricing.features.onPremise": "En sitio y otros servicios alojados", 162 "pricing.features.onPremise": "En sitio y otros servicios alojados",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Administración de Equipo", 166 "pricing.features.teamManagement": "Administración de Equipo",
209 "pricing.features.thirdPartyServices": "Instalar servicios de terceros", 167 "pricing.features.thirdPartyServices": "Instalar servicios de terceros",
210 "pricing.features.unlimitedServices": "Agregar servicios ilimitados", 168 "pricing.features.unlimitedServices": "Agregar servicios ilimitados",
211 "pricing.features.upToSixServices": "Añadir hasta 6 servicios",
212 "pricing.features.upToThreeServices": "Añadir hasta 3 servicios",
213 "pricing.features.workspaces": "Espacios de trabajo", 169 "pricing.features.workspaces": "Espacios de trabajo",
214 "pricing.plan.free": "Ferdi gratis",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Profesional",
217 "pricing.plan.personal-monthly": "Ferdi Personal Mensual",
218 "pricing.plan.personal-yearly": "Ferdi Personal Anual",
219 "pricing.plan.pro": "Ferdi Profesional",
220 "pricing.plan.pro-monthly": "Ferdi Profesional Mensual",
221 "pricing.plan.pro-yearly": "Ferdi Profesional Anual",
222 "pricing.trial.cta.accept": "Si, actualizar mi cuenta a Ferdi Profesional",
223 "pricing.trial.cta.skip": "Continuar a Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Disculpe, no pudimos activar su prueba!",
226 "pricing.trial.features.headline": "Ferdi Profesional incluye:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Su prueba gratis finaliza automáticamente después de 14 días",
232 "pricing.trial.terms.headline": "Sin condiciones",
233 "pricing.trial.terms.noCreditCard": "No necesita tarjeta de crédito",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Recargar {name}", 170 "service.crashHandler.action": "Recargar {name}",
236 "service.crashHandler.autoReload": "Intentando recuperar automáticamente {name} en {seconds} segundos", 171 "service.crashHandler.autoReload": "Intentando recuperar automáticamente {name} en {seconds} segundos",
237 "service.crashHandler.headline": "¡Oh, no!", 172 "service.crashHandler.headline": "¡Oh, no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "¡Oh, no!", 178 "service.errorHandler.headline": "¡Oh, no!",
244 "service.errorHandler.message": "Error", 179 "service.errorHandler.message": "Error",
245 "service.errorHandler.text": "{name} ha fallado la carga", 180 "service.errorHandler.text": "{name} ha fallado la carga",
246 "service.restrictedHandler.action": "Actualizar cuenta",
247 "service.restrictedHandler.customUrl.headline": "Necesita el Plan Ferdi Profesional",
248 "service.restrictedHandler.customUrl.text": "Por favor suscribase al Plan Ferdi Profesional para utilizar urls personalizadas y servicios auto alojados.",
249 "service.restrictedHandler.serviceLimit.headline": "Ha llegado al límite del servicio.",
250 "service.restrictedHandler.serviceLimit.text": "Por favor mejore su cuenta para poder utilizar más de {count} servicios.",
251 "service.webviewLoader.loading": "Cargando {service}", 181 "service.webviewLoader.loading": "Cargando {service}",
252 "services.getStarted": "Primeros pasos", 182 "services.getStarted": "Primeros pasos",
253 "services.login": "Iniciar sesión para usar Ferdi.", 183 "services.login": "Iniciar sesión para usar Ferdi.",
254 "services.serverInfo": "Opcionalmente, puede cambiar su servidor Ferdi pulsando en el icono de la esquina inferior izquierda.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Usar Ferdi sin una cuenta", 185 "services.serverless": "Usar Ferdi sin una cuenta",
256 "services.welcome": "Bienvenido a Ferdi", 186 "services.welcome": "Bienvenido a Ferdi",
257 "settings.account.account.editButton": "Editar cuenta", 187 "settings.account.account.editButton": "Editar cuenta",
258 "settings.account.accountType.basic": "Cuenta Básica",
259 "settings.account.accountType.premium": "Cuenta Colaborador Premium",
260 "settings.account.accountUnavailable": "La cuenta no está disponible", 188 "settings.account.accountUnavailable": "La cuenta no está disponible",
261 "settings.account.accountUnavailableInfo": "Estás usando Ferdi sin una cuenta. Si desea utilizar Ferdi con una cuenta y así mantener sus servicios sincronizados entre instalaciones, debe seleccionar un servidor en la Configuración e iniciar sesión.", 189 "settings.account.accountUnavailableInfo": "Estás usando Ferdi sin una cuenta. Si desea utilizar Ferdi con una cuenta y así mantener sus servicios sincronizados entre instalaciones, debe seleccionar un servidor en la Configuración e iniciar sesión.",
262 "settings.account.buttonSave": "Actualizar perfil", 190 "settings.account.buttonSave": "Actualizar perfil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Facturas", 197 "settings.account.headlineInvoices": "Facturas",
270 "settings.account.headlinePassword": "Cambiar contraseña", 198 "settings.account.headlinePassword": "Cambiar contraseña",
271 "settings.account.headlineProfile": "Actualizar perfil", 199 "settings.account.headlineProfile": "Actualizar perfil",
272 "settings.account.headlineSubscription": "Tu suscripción",
273 "settings.account.headlineTrialUpgrade": "Consiga 14 días de prueba gratis de Ferdi Profesional ",
274 "settings.account.headlineUpgradeAccount": "Mejore su cuenta y reciba la experiencia completa de Ferdi",
275 "settings.account.invoiceDownload": "Descargar",
276 "settings.account.manageSubscription.label": "Administra tu suscripción",
277 "settings.account.successInfo": "Tus cambios han sido guardados", 200 "settings.account.successInfo": "Tus cambios han sido guardados",
278 "settings.account.trial": "Prueba Gratis",
279 "settings.account.trialEndsIn": "Su prueba gratis finaliza en {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Por favor actualice su información de facturación para continuar utilizando {license} luego del periodo de prueba.",
281 "settings.account.tryReloadServices": "Intentar de nuevo", 201 "settings.account.tryReloadServices": "Intentar de nuevo",
282 "settings.account.tryReloadUserInfoRequest": "Intentar de nuevo", 202 "settings.account.tryReloadUserInfoRequest": "Intentar de nuevo",
283 "settings.account.upgradeToPro.label": "Actualiza a Ferdi Profesional",
284 "settings.account.userInfoRequestFailed": "No se pudo cargar la información de usuario", 203 "settings.account.userInfoRequestFailed": "No se pudo cargar la información de usuario",
285 "settings.account.yourLicense": "Su Licencia Ferdi", 204 "settings.account.yourLicense": "Su Licencia Ferdi",
286 "settings.app.accentColorInfo": "Escribe tu color de acento en un formato compatible con CSS. (Predeterminado: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Escribe tu color de acento en un formato compatible con CSS. (Predeterminado: {defaultAccentColor})",
@@ -298,17 +217,16 @@
298 "settings.app.form.autoLaunchOnStart": "Iniciar Ferdi al iniciar", 217 "settings.app.form.autoLaunchOnStart": "Iniciar Ferdi al iniciar",
299 "settings.app.form.automaticUpdates": "Activar actualizaciones", 218 "settings.app.form.automaticUpdates": "Activar actualizaciones",
300 "settings.app.form.beta": "Incluir versiones beta", 219 "settings.app.form.beta": "Incluir versiones beta",
301 "settings.app.form.clipboardNotifications": "Don't show notifications for clipboard events", 220 "settings.app.form.clipboardNotifications": "Dejar de mostrar notificaciones acerca del portapapeles",
302 "settings.app.form.closeToSystemTray": "Cerrar Ferdi a la barra de tareas", 221 "settings.app.form.closeToSystemTray": "Cerrar Ferdi a la barra de tareas",
303 "settings.app.form.customTodoServer": "Servidor de Todo personalizado", 222 "settings.app.form.customTodoServer": "Servidor de Todo personalizado",
304 "settings.app.form.darkMode": "Activar tema oscuro", 223 "settings.app.form.darkMode": "Activar tema oscuro",
305 "settings.app.form.enableGPUAcceleration": "Habilitar aceleración de GPU", 224 "settings.app.form.enableGPUAcceleration": "Habilitar aceleración de GPU",
306 "settings.app.form.enableLock": "Activar bloqueo por contraseña", 225 "settings.app.form.enableLock": "Activar bloqueo por contraseña",
307 "settings.app.form.enableMenuBar": "Always show Ferdi in Menu Bar", 226 "settings.app.form.enableMenuBar": "Mostrar a Ferdi en la barra de menús",
308 "settings.app.form.enableSpellchecking": "Activar corrección ortográfica", 227 "settings.app.form.enableSpellchecking": "Activar corrección ortográfica",
309 "settings.app.form.enableSystemTray": "Mostrar Ferdi en la bandeja del sistema", 228 "settings.app.form.enableSystemTray": "Mostrar Ferdi en la bandeja del sistema",
310 "settings.app.form.enableTodos": "Activar Ferdi Todos", 229 "settings.app.form.enableTodos": "Activar Ferdi Todos",
311 "settings.app.form.hibernate": "Habilitar hibernación del servicio",
312 "settings.app.form.hibernateOnStartup": "Mantener los servicios en hibernación al iniciar", 230 "settings.app.form.hibernateOnStartup": "Mantener los servicios en hibernación al iniciar",
313 "settings.app.form.hibernationStrategy": "Estrategia de hibernación", 231 "settings.app.form.hibernationStrategy": "Estrategia de hibernación",
314 "settings.app.form.iconSize": "Tamaño del icono del servicio", 232 "settings.app.form.iconSize": "Tamaño del icono del servicio",
@@ -327,7 +245,7 @@
327 "settings.app.form.scheduledDNDEnabled": "Activar programación \"No molestar\"", 245 "settings.app.form.scheduledDNDEnabled": "Activar programación \"No molestar\"",
328 "settings.app.form.scheduledDNDEnd": "A", 246 "settings.app.form.scheduledDNDEnd": "A",
329 "settings.app.form.scheduledDNDStart": "De", 247 "settings.app.form.scheduledDNDStart": "De",
330 "settings.app.form.searchEngine": "Search engine", 248 "settings.app.form.searchEngine": "Motor de búsqueda",
331 "settings.app.form.sentry": "Enviar datos de telemetría", 249 "settings.app.form.sentry": "Enviar datos de telemetría",
332 "settings.app.form.serviceRibbonWidth": "Ancho de Barra Lateral", 250 "settings.app.form.serviceRibbonWidth": "Ancho de Barra Lateral",
333 "settings.app.form.showDisabledServices": "Mostrar pestañas de servicios desactivados", 251 "settings.app.form.showDisabledServices": "Mostrar pestañas de servicios desactivados",
@@ -337,23 +255,24 @@
337 "settings.app.form.universalDarkMode": "Activar modo oscuro universal", 255 "settings.app.form.universalDarkMode": "Activar modo oscuro universal",
338 "settings.app.form.useTouchIdToUnlock": "Permitir usar TouchID para desbloquear Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Permitir usar TouchID para desbloquear Ferdi",
339 "settings.app.form.useVerticalStyle": "Usar estilo vertical", 257 "settings.app.form.useVerticalStyle": "Usar estilo vertical",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Configuración", 259 "settings.app.headline": "Configuración",
341 "settings.app.headlineAdvanced": "Avanzado", 260 "settings.app.headlineAdvanced": "Avanzado",
342 "settings.app.headlineAppearance": "Apariencia", 261 "settings.app.headlineAppearance": "Apariencia",
343 "settings.app.headlineGeneral": "General", 262 "settings.app.headlineGeneral": "General",
344 "settings.app.headlineLanguage": "Idioma", 263 "settings.app.headlineLanguage": "Idioma",
345 "settings.app.headlinePrivacy": "Privacy", 264 "settings.app.headlinePrivacy": "Privacidad",
346 "settings.app.headlineUpdates": "Actualizaciones", 265 "settings.app.headlineUpdates": "Actualizaciones",
347 "settings.app.hibernateInfo": "Por defecto, Ferdi mantendrá todos sus servicios abiertos y cargados en segundo plano para que estén listos cuando los necesite. La hibernación del servicio desactivará los mismos tras el tiempo especificado. Esto es útil para ahorrar RAM y evitar que los servicios ralentizen su sistema.", 266 "settings.app.hibernateInfo": "Por defecto, Ferdi mantendrá todos sus servicios abiertos y cargados en segundo plano para que estén listos cuando los necesite. La hibernación del servicio desactivará los mismos tras el tiempo especificado. Esto es útil para ahorrar RAM y evitar que los servicios ralentizen su sistema.",
348 "settings.app.inactivityLockInfo": "Minutos de inactividad, tras los cuales Ferdi debe bloquear automáticamente. Utilice 0 para desactivar", 267 "settings.app.inactivityLockInfo": "Minutos de inactividad, tras los cuales Ferdi debe bloquear automáticamente. Utilice 0 para desactivar",
349 "settings.app.languageDisclaimer": "Las traducciones oficiales son en inglés y alemán. Todos los demás idiomas son traducciones basadas en la comunidad.", 268 "settings.app.languageDisclaimer": "Las traducciones oficiales son en inglés y alemán. Todos los demás idiomas son traducciones basadas en la comunidad.",
350 "settings.app.lockInfo": "El bloqueo de contraseña le permite mantener los mensajes protegidos.\nSi activa el bloqueo de contraseña, se le pedirá introducirla cada vez que inicie o bloquee Ferdi usando el símbolo de la esquina inferior izquierda o bien el acceso directo CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Contraseña", 270 "settings.app.lockedPassword": "Contraseña",
352 "settings.app.lockedPasswordInfo": "Por favor, asegúrese de recordar la contraseña que establezca.\nSi la perdiera u olvidara, tendría que reinstalar Ferdi.", 271 "settings.app.lockedPasswordInfo": "Por favor, asegúrese de recordar la contraseña que establezca.\nSi la perdiera u olvidara, tendría que reinstalar Ferdi.",
353 "settings.app.restartRequired": "Los cambios requieren reiniciar", 272 "settings.app.restartRequired": "Los cambios requieren reiniciar",
354 "settings.app.scheduledDNDInfo": "El \"No molestar\" programado permite definir un período de tiempo en el que no recibir notificaciones de Ferdi.", 273 "settings.app.scheduledDNDInfo": "El \"No molestar\" programado permite definir un período de tiempo en el que no recibir notificaciones de Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Horas en formato 24 horas. La hora de finalización puede ser anterior a la hora de inicio (por ejemplo, inicio 17:00, final 09:00) para habilitar No molestar la noche.", 274 "settings.app.scheduledDNDTimeInfo": "Horas en formato 24 horas. La hora de finalización puede ser anterior a la hora de inicio (por ejemplo, inicio 17:00, final 09:00) para habilitar No molestar la noche.",
356 "settings.app.sentryInfo": "El envío de datos de telemetría nos permite encontrar errores en Ferdi - no enviaremos ninguna información personal como sus datos de mensaje! Cambiar esta opción requiere reiniciar Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi utiliza el corrector ortográfico incluido en su Mac. Si desea cambiar los lenguajes que el corrector ortográfico revisa, lo puede hacer en las Preferencias del Sistema de su Mac.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi utiliza el corrector ortográfico incluido en su Mac. Si desea cambiar los lenguajes que el corrector ortográfico revisa, lo puede hacer en las Preferencias del Sistema de su Mac.",
358 "settings.app.subheadlineCache": "Caché", 277 "settings.app.subheadlineCache": "Caché",
359 "settings.app.todoServerInfo": "Este servidor se utilizará para la función \"Ferdi Todo\".", 278 "settings.app.todoServerInfo": "Este servidor se utilizará para la función \"Ferdi Todo\".",
@@ -381,8 +300,7 @@
381 "settings.recipes.customService.openFolder": "Abrir carpeta", 300 "settings.recipes.customService.openFolder": "Abrir carpeta",
382 "settings.recipes.headline": "Servicios disponibles", 301 "settings.recipes.headline": "Servicios disponibles",
383 "settings.recipes.missingService": "¿Echas de menos algún servicio?", 302 "settings.recipes.missingService": "¿Echas de menos algún servicio?",
384 "settings.recipes.mostPopular": "Más populares", 303 "settings.recipes.nothingFound": "Lo sentimos, pero no pudimos encontrar ningún servicio similar a tu búsqueda, sin embargo: puedes agregarlo utilizando la opción de \"Sitio web personalizado\". \nRecuerda que pueden aparecer más servicios de los que has agregado a Ferdi desde la versión que estás utilizando. Para poder utilizar los nuevos servicios disponibles, considera actualizar a la versión más reciente.",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Servicio añadido con éxito", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Servicio añadido con éxito",
387 "settings.searchService": "Buscar servicio", 305 "settings.searchService": "Buscar servicio",
388 "settings.service.error.goBack": "Volver a los servicios", 306 "settings.service.error.goBack": "Volver a los servicios",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Añadir {name}", 309 "settings.service.form.addServiceHeadline": "Añadir {name}",
392 "settings.service.form.availableServices": "Servicios disponibles", 310 "settings.service.form.availableServices": "Servicios disponibles",
393 "settings.service.form.customUrl": "Servidor personalizado", 311 "settings.service.form.customUrl": "Servidor personalizado",
394 "settings.service.form.customUrlPremiumInfo": "Para añadir tus propios servicios, necesitas una Cuenta Colaborador Premium de Ferdi.",
395 "settings.service.form.customUrlUpgradeAccount": "Mejora tu cuenta",
396 "settings.service.form.customUrlValidationError": "No se pudo validar el servidor personalizado {name}.", 312 "settings.service.form.customUrlValidationError": "No se pudo validar el servidor personalizado {name}.",
397 "settings.service.form.darkReaderBrightness": "Brillo del Lector Oscuro", 313 "settings.service.form.darkReaderBrightness": "Brillo del Lector Oscuro",
398 "settings.service.form.darkReaderContrast": "Contraste del Lector Oscuro", 314 "settings.service.form.darkReaderContrast": "Contraste del Lector Oscuro",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Administración de Equipo", 378 "settings.team.contentHeadline": "Administración de Equipo",
463 "settings.team.copy": "La gestión de equipos de Franz's te permite administrar suscripciones de Franz para múltiples usuarios. Por favor, ten en cuenta que tener una suscripción a Franz Premium no te dará ninguna ventaja en el uso de Ferdi: la única razón por la que todavía tienes acceso a la Gestión de Equipos es para que puedas gestionar tus equipos de Franz y para que no pierdas ninguna funcionalidad en la gestión de tu cuenta.", 379 "settings.team.copy": "La gestión de equipos de Franz's te permite administrar suscripciones de Franz para múltiples usuarios. Por favor, ten en cuenta que tener una suscripción a Franz Premium no te dará ninguna ventaja en el uso de Ferdi: la única razón por la que todavía tienes acceso a la Gestión de Equipos es para que puedas gestionar tus equipos de Franz y para que no pierdas ninguna funcionalidad en la gestión de tu cuenta.",
464 "settings.team.headline": "Equipo", 380 "settings.team.headline": "Equipo",
465 "settings.team.intro": "Actualmente estás usando Franz Servers, por lo que tienes acceso a la Gestión de Equipos.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Administra tu equipo en meetfranz.com", 382 "settings.team.manageAction": "Administra tu equipo en meetfranz.com",
467 "settings.team.teamsUnavailable": "Los equipos no están disponibles", 383 "settings.team.teamsUnavailable": "Los equipos no están disponibles",
468 "settings.team.teamsUnavailableInfo": "Los equipos están disponibles actualmente sólo cuando se utiliza el servidor Franz y después de pagar por Franz Professional. Por favor, cambie su servidor a https://api.franz)[video] .com para usar equipos.", 384 "settings.team.teamsUnavailableInfo": "Los equipos están disponibles actualmente sólo cuando se utiliza el servidor Franz y después de pagar por Franz Professional. Por favor, cambie su servidor a https://api.franz)[video] .com para usar equipos.",
469 "settings.team.upgradeAction": "Actualiza tu cuenta",
470 "settings.user.form.accountType.company": "Empresa", 385 "settings.user.form.accountType.company": "Empresa",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Tipo de cuenta", 387 "settings.user.form.accountType.label": "Tipo de cuenta",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Ya tienes una cuenta, ¿Iniciar sesión?", 431 "signup.link.login": "Ya tienes una cuenta, ¿Iniciar sesión?",
517 "signup.password.label": "Contraseña", 432 "signup.password.label": "Contraseña",
518 "signup.submit.label": "Crear cuenta", 433 "signup.submit.label": "Crear cuenta",
519 "subscription.bestValue": "Best value", 434 "tabs.item.confirmDeleteService": "¿Estás seguro que quieres elimiar el servicio de {serviceName}?",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Ver todas las opciones",
522 "subscription.cta.choosePlan": "Elije tu plan",
523 "subscription.includedProFeatures": "El Plan Profesional de Ferdi incluye:",
524 "subscription.interval.per": "por {interval}",
525 "subscription.interval.perMonth": "al mes",
526 "subscription.interval.perMonthPerUser": "por mes y usuario",
527 "subscription.planItem.upgradeAccount": "Actualizar cuenta",
528 "subscription.teaser.includedFeatures": "Los planes de pago de Ferdi incluyen:",
529 "subscription.teaser.intro": "Ferdi 5 viene con una amplia gama de nuevas características para mejorar tu comunicación diaria - baterías incluidas. ¡Echa un vistazo a nuestros nuevos planes y descubra cuál le conviene más!",
530 "subscriptionPopup.buttonCancel": "Cancelar",
531 "subscriptionPopup.buttonDone": "Listo",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Eliminar servicio", 435 "tabs.item.deleteService": "Eliminar servicio",
534 "tabs.item.disableAudio": "Desactivar sonido", 436 "tabs.item.disableAudio": "Desactivar sonido",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Desactivar notificaciones", 438 "tabs.item.disableNotifications": "Desactivar notificaciones",
536 "tabs.item.disableService": "Desactivar servicio", 439 "tabs.item.disableService": "Desactivar servicio",
537 "tabs.item.edit": "Editar", 440 "tabs.item.edit": "Editar",
538 "tabs.item.enableAudio": "Habilitar audio", 441 "tabs.item.enableAudio": "Habilitar audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Activar notificaciones", 443 "tabs.item.enableNotification": "Activar notificaciones",
540 "tabs.item.enableService": "Activar servicio", 444 "tabs.item.enableService": "Activar servicio",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Volver a cargar", 446 "tabs.item.reload": "Volver a cargar",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} no es válido", 448 "validation.email": "{field} no es válido",
543 "validation.minLength": "{field} debería tener al menos {length} caracteres", 449 "validation.minLength": "{field} debería tener al menos {length} caracteres",
544 "validation.oneRequired": "Al menos uno es requerido", 450 "validation.oneRequired": "Al menos uno es requerido",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Espacios de trabajo", 462 "workspaceDrawer.headline": "Espacios de trabajo",
557 "workspaceDrawer.item.contextMenuEdit": "editar", 463 "workspaceDrawer.item.contextMenuEdit": "editar",
558 "workspaceDrawer.item.noServicesAddedYet": "Ningún servicio ha sido añadido", 464 "workspaceDrawer.item.noServicesAddedYet": "Ningún servicio ha sido añadido",
559 "workspaceDrawer.premiumCtaButtonLabel": "Crea tu primer área de trabajo",
560 "workspaceDrawer.proFeatureBadge": "Función Premium",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivar cuenta premium",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Los espacios de trabajo Ferdi permiten centrarse en lo que es importante. Configure diferentes conjuntos de servicios y cambie fácilmente entre ellos en cualquier momento. </p><p>Usted decide qué servicios necesita, cuándo y dónde, para que podamos ayudarte a mantenerte al tanto - o apartarte fácilmente del trabajo cuando asi lo desees.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Los espacios de trabajo Ferdi permiten centrarse en lo que es importante. Configure diferentes conjuntos de servicios y cambie fácilmente entre ellos en cualquier momento. </p><p>Usted decide qué servicios necesita, cuándo y dónde, para que podamos ayudarte a mantenerte al tanto - o apartarte fácilmente del trabajo cuando asi lo desees.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Editar ajustes de áreas de trabajo", 466 "workspaceDrawer.workspacesSettingsTooltip": "Editar ajustes de áreas de trabajo",
564 "workspaces.switchingIndicator.switchingTo": "Cambiando a" 467 "workspaces.switchingIndicator.switchingTo": "Cambiando a"
diff --git a/src/i18n/locales/et.json b/src/i18n/locales/et.json
index 6709db455..62efbc5aa 100644
--- a/src/i18n/locales/et.json
+++ b/src/i18n/locales/et.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "Mis juhtus?", 5 "connectionLostBanner.informationLink": "Mis juhtus?",
6 "connectionLostBanner.message": "Oh ei! Ferdi kaotas ühenduse {name} teenusega.", 6 "connectionLostBanner.message": "Oh ei! Ferdi kaotas ühenduse {name} teenusega.",
7 "feature.announcements.changelog.headline": "Ferdi {versiooni} uuendused", 7 "feature.announcements.changelog.headline": "Ferdi {versiooni} uuendused",
8 "feature.delayApp.headline": "Uuendage oma Ferdi'i tellimust, et ootamine vahele jätta",
9 "feature.delayApp.text": "Ferdi jätkab {seconds} sekundi pärast.",
10 "feature.delayApp.trial.action": "Jah, ma tahan Ferdi Professionali tasuta 14-päevast proovitellimust",
11 "feature.delayApp.trial.actionShort": "Aktiveerige tasuta Ferdi Professionali proovitellimus",
12 "feature.delayApp.trial.headline": "Hankige tasuta Ferdi Professionali 14-päevane proovitellimus ja saate ootamise vahele jätta",
13 "feature.delayApp.upgrade.action": "Uuendage Ferdi'it",
14 "feature.delayApp.upgrade.actionShort": "Uuendage oma kontot",
15 "feature.planSelection.cta.ctaDowngradeFree": "Minge tagasi tasuta tellimusele",
16 "feature.planSelection.cta.stayOnFree": "Jää tasuta tellimuse juurde",
17 "feature.planSelection.cta.trial": "Alustage minu tasuta 14-päevast proovitellimust",
18 "feature.planSelection.cta.upgradePersonal": "Valige Personal tellimus",
19 "feature.planSelection.cta.upgradePro": "Valige Professional tellimus",
20 "feature.planSelection.free.text": "Põhifunktsionaalsus",
21 "feature.planSelection.fullFeatureList": "Kõigi tellimuste täielik võrdlus",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Minge tagasi tasuta tellimusele",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Valige Personal tellimus",
24 "feature.planSelection.fullscreen.dialog.message": "Olete hakanud meie tasuta tellimusele tagasi minema. Olete ikka kindel? Selle asemel klõpsake siin, et saada rohkem teenuseid ja funktsioone vaid {currency} {price} eest kuus.",
25 "feature.planSelection.fullscreen.dialog.title": "Minge tagasi oma Ferdi'i tellimusele",
26 "feature.planSelection.fullscreen.subheadline": "On aeg teha valik. Ferdi töötab kõige paremini meie Personal ja Professional tellimustega. Vaadake palun ja valige endale sobiv.",
27 "feature.planSelection.fullscreen.welcome": "{name}, kas olete valmis valima?",
28 "feature.planSelection.personal.text": "Rohkem teenuseid, ilma ootamiseta - ideaalne isiklikuks kasutamiseks.",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "Kõik hinnad põhinevad aastamaksel",
30 "feature.planSelection.pro.text": "Piiramatu teenus ja täiustatud funktsioonid teile ja teie meeskonnale.",
31 "feature.serviceLimit.limitReached": "Olete lisanud {amount} teenust, saadaolevast {limit} teenusest, mis on lubatud tellimuses. Teenuste lisamiseks täiendage oma kontot.",
32 "feature.shareFranz.action.email": "Saadke e-kirjana", 8 "feature.shareFranz.action.email": "Saadke e-kirjana",
33 "feature.shareFranz.action.facebook": "Jagage Facebookis", 9 "feature.shareFranz.action.facebook": "Jagage Facebookis",
34 "feature.shareFranz.action.twitter": "Jagage Twitteris", 10 "feature.shareFranz.action.twitter": "Jagage Twitteris",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "Olen lisanud Ferdi'i {count} teenust! Hankige tasuta rakendus WhatsApp'ile, Messenger'ile, Slack'ile, Skype'ile ja muule veebiaadressilt www.getferdi.com", 12 "feature.shareFranz.shareText.email": "Olen lisanud Ferdi'i {count} teenust! Hankige tasuta rakendus WhatsApp'ile, Messenger'ile, Slack'ile, Skype'ile ja muule veebiaadressilt www.getferdi.com",
37 "feature.shareFranz.shareText.twitter": "Olen lisanud Ferdi'i {count} teenust! Hankige tasuta rakendus WhatsApp'ile, Messenger'ile, Slack'ile, Skype'ile ja muule veebiaadressilt www.getferdi.com /cc @FerdiMessenger", 13 "feature.shareFranz.shareText.twitter": "Olen lisanud Ferdi'i {count} teenust! Hankige tasuta rakendus WhatsApp'ile, Messenger'ile, Slack'ile, Skype'ile ja muule veebiaadressilt www.getferdi.com /cc @FerdiMessenger",
38 "feature.shareFranz.text": "Rääkige oma sõpradele ja kolleegidele, kui vinge Ferdi on, ja aidake meil seda sõna levitada.", 14 "feature.shareFranz.text": "Rääkige oma sõpradele ja kolleegidele, kui vinge Ferdi on, ja aidake meil seda sõna levitada.",
39 "feature.todos.premium.info": "Ferdi'i ülesanded on nüüd saadaval tasulise tellimusega kasutajatele!",
40 "feature.todos.premium.rollout": "Kõigil teistel tuleb veidi kauem oodata.",
41 "feature.todos.premium.upgrade": "Uuendage oma kontot",
42 "feature.trialStatusBar.cta": "Uuendage nüüd",
43 "feature.trialStatusBar.expired": "Teie tasuta Ferdii {plan} proovitellimus on lõppenud, uuendage oma kontot.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Minge tagasi tasuta tellimusele",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Valige Personal tellimus",
46 "feature.trialStatusBar.fullscreen.dialog.message": "Olete hakanud meie tasuta tellimusele tagasi minema. Olete ikka kindel? Selle asemel klõpsake siin, et saada rohkem teenuseid ja funktsioone vaid {currency} {price} eest kuus.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Minge tagasi oma Ferdi'i tellimusele",
48 "feature.trialStatusBar.restTime": "Teie tasuta Ferdi'i {plan} proovtellimus lõpeb {time} pärast.",
49 "global.api.unhealthy": "Ups! Ferdi'i võrguteenustega ei saa ühendust luua", 15 "global.api.unhealthy": "Ups! Ferdi'i võrguteenustega ei saa ühendust luua",
50 "global.franzProRequired": "Vajalik Ferdi Professional tellimus", 16 "global.franzProRequired": "Vajalik Ferdi Professional tellimus",
51 "global.notConnectedToTheInternet": "Teil pole Interneti-ühendust.", 17 "global.notConnectedToTheInternet": "Teil pole Interneti-ühendust.",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "Tuvastage keel automaatselt", 19 "global.spellchecking.autodetect": "Tuvastage keel automaatselt",
54 "global.spellchecking.autodetect.short": "Automaatne", 20 "global.spellchecking.autodetect.short": "Automaatne",
55 "global.spellchecking.language": "Õigekirja kontrollimise keel", 21 "global.spellchecking.language": "Õigekirja kontrollimise keel",
56 "global.upgradeButton.upgradeToPro": "Täiendage Ferdi Professional tellimusele",
57 "import.headline": "Importige oma Ferdi 4 teenused", 22 "import.headline": "Importige oma Ferdi 4 teenused",
58 "import.notSupportedHeadline": "Teenused, mida Ferdi 5 veel ei toeta", 23 "import.notSupportedHeadline": "Teenused, mida Ferdi 5 veel ei toeta",
59 "import.skip.label": "Soovin teenuseid käsitsi lisada", 24 "import.skip.label": "Soovin teenuseid käsitsi lisada",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "Laadi teenused uuesti", 28 "infobar.buttonReloadServices": "Laadi teenused uuesti",
64 "infobar.requiredRequestsFailed": "Teenuseid ja kasutajainfot ei õnnestunud laadida", 29 "infobar.requiredRequestsFailed": "Teenuseid ja kasutajainfot ei õnnestunud laadida",
65 "infobar.servicesUpdated": "Teie teenuseid on uuendatud.", 30 "infobar.servicesUpdated": "Teie teenuseid on uuendatud.",
66 "infobar.trialActivated": "Teie proovitellimus oli edukalt aktiveeritud. Head sõnumineerimist!",
67 "infobar.updateAvailable": "Ferdi'i jaoks on saadaval uus värskendus.", 31 "infobar.updateAvailable": "Ferdi'i jaoks on saadaval uus värskendus.",
68 "invite.email.label": "E-posti aadress", 32 "invite.email.label": "E-posti aadress",
69 "invite.headline.friends": "Kutsu oma 3 sõpra või kolleegi liituma", 33 "invite.headline.friends": "Kutsu oma 3 sõpra või kolleegi liituma",
@@ -122,9 +86,7 @@
122 "menu.todos": "Ülesanded", 86 "menu.todos": "Ülesanded",
123 "menu.todos.enableTodos": "Luba ülesanded", 87 "menu.todos.enableTodos": "Luba ülesanded",
124 "menu.view": "Vaade", 88 "menu.view": "Vaade",
125 "menu.view.enterFullScreen": "Kuva täisekraanil", 89 "menu.view.reloadFerdi": "Laadi Ferdi uuesti",
126 "menu.view.exitFullScreen": "Välju täisekraanilt",
127 "menu.view.reloadFranz": "Laadi Ferdi uuesti",
128 "menu.view.reloadService": "Laadi teenus uuesti", 90 "menu.view.reloadService": "Laadi teenus uuesti",
129 "menu.view.reloadTodos": "Laadi ülesanded uuesti", 91 "menu.view.reloadTodos": "Laadi ülesanded uuesti",
130 "menu.view.resetZoom": "Tegelik suurus", 92 "menu.view.resetZoom": "Tegelik suurus",
@@ -149,7 +111,6 @@
149 "password.noUser": "Ühtegi selle e-posti aadressiga kasutajat ei leitud", 111 "password.noUser": "Ühtegi selle e-posti aadressiga kasutajat ei leitud",
150 "password.submit.label": "Saada", 112 "password.submit.label": "Saada",
151 "password.successInfo": "Palun kontrollige oma e-posti aadressi", 113 "password.successInfo": "Palun kontrollige oma e-posti aadressi",
152 "premiumFeature.button.upgradeAccount": "Konto täiendamine",
153 "pricing.features.accountSync": "Konto sünkroonimine", 114 "pricing.features.accountSync": "Konto sünkroonimine",
154 "pricing.features.adFree": "Igavesti reklaamivaba", 115 "pricing.features.adFree": "Igavesti reklaamivaba",
155 "pricing.features.appDelays": "Ootavaid ekraane pole", 116 "pricing.features.appDelays": "Ootavaid ekraane pole",
@@ -166,27 +127,6 @@
166 "pricing.features.upToSixServices": "Lisa kuni 6 teenust", 127 "pricing.features.upToSixServices": "Lisa kuni 6 teenust",
167 "pricing.features.upToThreeServices": "Lisa kuni 3 teenust", 128 "pricing.features.upToThreeServices": "Lisa kuni 3 teenust",
168 "pricing.features.workspaces": "Tööruumid", 129 "pricing.features.workspaces": "Tööruumid",
169 "pricing.plan.free": "Tasuta",
170 "pricing.plan.legacy": "Täiendatud",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal kuumakse põhine",
173 "pricing.plan.personal-yearly": "Personal aastamakse põhine",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional kuumakse põhine",
176 "pricing.plan.pro-yearly": "Professional aastamakse põhine",
177 "pricing.trial.cta.accept": "Alusta minu 14-päevast Ferdi'i proovitellimust",
178 "pricing.trial.cta.skip": "Edasi Ferdi'ini",
179 "pricing.trial.cta.start": "Alusta Ferdi'i kasutamist",
180 "pricing.trial.error": "Vabandust, me ei saanud teie proovitellimust aktiveerida!",
181 "pricing.trial.features.headline": "Ferdi Professional sisaldab:",
182 "pricing.trial.headline.pro": "Hei {name}, tere tulemast Ferdi'i",
183 "pricing.trial.intro.happyMessaging": "Head sõnumineerimist.",
184 "pricing.trial.intro.specialTreat": "Meil on teile spetsiaalne maiuspala.",
185 "pricing.trial.intro.tryPro": "Nautige täielikku Ferdi Professional'i kogemust 14 päeva jooksul täiesti tasuta.",
186 "pricing.trial.terms.automaticTrialEnd": "Teie tasuta proovitellimus lõpeb automaatselt 14 päeva pärast",
187 "pricing.trial.terms.headline": "Stringe pole lisatud",
188 "pricing.trial.terms.noCreditCard": "Krediitkaarti pole vaja",
189 "pricing.trial.terms.trialWorth": "Tasuta proovitellimus (tavaliselt {currency}{price} kuus)",
190 "service.crashHandler.action": "Laadi {name} uuesti", 130 "service.crashHandler.action": "Laadi {name} uuesti",
191 "service.crashHandler.autoReload": "Püütakse {name} automaatselt taastada {seconds} sekundi jooksul", 131 "service.crashHandler.autoReload": "Püütakse {name} automaatselt taastada {seconds} sekundi jooksul",
192 "service.crashHandler.headline": "Oh ei!", 132 "service.crashHandler.headline": "Oh ei!",
@@ -198,11 +138,6 @@
198 "service.errorHandler.headline": "Oh ei!", 138 "service.errorHandler.headline": "Oh ei!",
199 "service.errorHandler.message": "Tõrge", 139 "service.errorHandler.message": "Tõrge",
200 "service.errorHandler.text": "{name} laadimine nurjus.", 140 "service.errorHandler.text": "{name} laadimine nurjus.",
201 "service.restrictedHandler.action": "Uuendage oma kontot",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional tellimus on nõutav",
203 "service.restrictedHandler.customUrl.text": "Kohandatud URL-ide ja ise hostitud teenuste kasutamiseks minge üle Ferdi Professional'i tellimusele.",
204 "service.restrictedHandler.serviceLimit.headline": "Olete jõudnud oma maksimaalselt lubatud teenusete arvuni.",
205 "service.restrictedHandler.serviceLimit.text": "Palun täiendage oma kontot, et kasutada rohkem, kui {count} teenust.",
206 "service.webviewLoader.loading": "Laadimine", 141 "service.webviewLoader.loading": "Laadimine",
207 "services.getStarted": "Alusta", 142 "services.getStarted": "Alusta",
208 "services.welcome": "Tere tulemast Ferdi'i", 143 "services.welcome": "Tere tulemast Ferdi'i",
@@ -219,18 +154,9 @@
219 "settings.account.headlineInvoices": "Arved", 154 "settings.account.headlineInvoices": "Arved",
220 "settings.account.headlinePassword": "Muuda salasõna", 155 "settings.account.headlinePassword": "Muuda salasõna",
221 "settings.account.headlineProfile": "Profiili uuendamine", 156 "settings.account.headlineProfile": "Profiili uuendamine",
222 "settings.account.headlineSubscription": "Teie tellimus",
223 "settings.account.headlineTrialUpgrade": "Hankige tasuta 14-päevane Ferdi'i proovitellimus",
224 "settings.account.headlineUpgradeAccount": "Täiendage oma kontot ja saate täieliku Ferdi'i kasutuskogemuse",
225 "settings.account.invoiceDownload": "Laadi alla",
226 "settings.account.manageSubscription.label": "Halda oma tellimust",
227 "settings.account.successInfo": "Teie muudatused on salvestatud", 157 "settings.account.successInfo": "Teie muudatused on salvestatud",
228 "settings.account.trial": "Tasuta proovitellimus",
229 "settings.account.trialEndsIn": "Teie tasuta prooviperiood lõpeb {duration} pärast.",
230 "settings.account.trialUpdateBillingInfo": "Palun uuendage oma arveldusteavet, et jätkata teenuse {license} kasutamist ka pärast prooviperioodi.",
231 "settings.account.tryReloadServices": "Proovi uuesti", 158 "settings.account.tryReloadServices": "Proovi uuesti",
232 "settings.account.tryReloadUserInfoRequest": "Proovi uuesti", 159 "settings.account.tryReloadUserInfoRequest": "Proovi uuesti",
233 "settings.account.upgradeToPro.label": "Täiendage Ferdi Professional tellimusele",
234 "settings.account.userInfoRequestFailed": "Kasutaja teabe laadimine nurjus", 160 "settings.account.userInfoRequestFailed": "Kasutaja teabe laadimine nurjus",
235 "settings.account.yourLicense": "Teie Ferdi'i litsents", 161 "settings.account.yourLicense": "Teie Ferdi'i litsents",
236 "settings.app.buttonClearAllCache": "Tühjenda vahemälu", 162 "settings.app.buttonClearAllCache": "Tühjenda vahemälu",
@@ -284,7 +210,6 @@
284 "settings.recipes.customService.openFolder": "Ava kaust", 210 "settings.recipes.customService.openFolder": "Ava kaust",
285 "settings.recipes.headline": "Saadaolevad teenused", 211 "settings.recipes.headline": "Saadaolevad teenused",
286 "settings.recipes.missingService": "Teenus puudub?", 212 "settings.recipes.missingService": "Teenus puudub?",
287 "settings.recipes.mostPopular": "Populaarseimad teenused",
288 "settings.recipes.nothingFound": "Vabandust, kuid ükski teenus ei vastanud teie otsinguterminile.", 213 "settings.recipes.nothingFound": "Vabandust, kuid ükski teenus ei vastanud teie otsinguterminile.",
289 "settings.recipes.servicesSuccessfulAddedInfo": "Teenus lisati edukalt", 214 "settings.recipes.servicesSuccessfulAddedInfo": "Teenus lisati edukalt",
290 "settings.searchService": "Otsi teenust", 215 "settings.searchService": "Otsi teenust",
@@ -295,7 +220,6 @@
295 "settings.service.form.availableServices": "Saadaolevad teenused", 220 "settings.service.form.availableServices": "Saadaolevad teenused",
296 "settings.service.form.customUrl": "Kohandatud server", 221 "settings.service.form.customUrl": "Kohandatud server",
297 "settings.service.form.customUrlPremiumInfo": "Isemajutatavate teenuste lisamiseks vajate Ferdi Premium'i tellimust.", 222 "settings.service.form.customUrlPremiumInfo": "Isemajutatavate teenuste lisamiseks vajate Ferdi Premium'i tellimust.",
298 "settings.service.form.customUrlUpgradeAccount": "Uuendage oma kontot",
299 "settings.service.form.customUrlValidationError": "Kohandatud {name} serverit ei saanud kinnitada.", 223 "settings.service.form.customUrlValidationError": "Kohandatud {name} serverit ei saanud kinnitada.",
300 "settings.service.form.deleteButton": "Kustuta teenus", 224 "settings.service.form.deleteButton": "Kustuta teenus",
301 "settings.service.form.editServiceHeadline": "Muuda {name}", 225 "settings.service.form.editServiceHeadline": "Muuda {name}",
@@ -391,19 +315,6 @@
391 "signup.link.login": "Kas teil on juba konto, logi sisse?", 315 "signup.link.login": "Kas teil on juba konto, logi sisse?",
392 "signup.password.label": "Salasõna", 316 "signup.password.label": "Salasõna",
393 "signup.submit.label": "Loo konto", 317 "signup.submit.label": "Loo konto",
394 "subscription.bestValue": "Parim hind",
395 "subscription.cta.activateTrial": "Jah, alusta tasuta Ferdi Professional'i proovitellimust",
396 "subscription.cta.allOptions": "Vaata kõiki võimalusi",
397 "subscription.cta.choosePlan": "Valige oma tellimus",
398 "subscription.includedProFeatures": "Ferdi'i Professional tellimus sisaldab:",
399 "subscription.interval.per": "{interval} kohta",
400 "subscription.interval.perMonth": "kuus",
401 "subscription.interval.perMonthPerUser": "kuus kasutaja kohta",
402 "subscription.planItem.upgradeAccount": "Uuendage oma kontot",
403 "subscription.teaser.includedFeatures": "Tasuliste Ferdi'i tellimuste hulka kuuluvad:",
404 "subscription.teaser.intro": "Ferdi 5 sisaldab laia valikut uusi funktsioone, et teie igapäevast suhtlemist veelgi paremaks muuta - patareid kaasaarvatud. Tutvuge meie uute tellimusvariantidega ja saate teada, milline neist sobib teile kõige paremini!",
405 "subscriptionPopup.buttonCancel": "Loobu",
406 "subscriptionPopup.buttonDone": "Valmis",
407 "tabs.item.deleteService": "Kustuta teenus", 318 "tabs.item.deleteService": "Kustuta teenus",
408 "tabs.item.disableAudio": "Keela heli", 319 "tabs.item.disableAudio": "Keela heli",
409 "tabs.item.disableNotifications": "Keela teated", 320 "tabs.item.disableNotifications": "Keela teated",
@@ -431,7 +342,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "muutmine", 342 "workspaceDrawer.item.contextMenuEdit": "muutmine",
432 "workspaceDrawer.item.noServicesAddedYet": "Ühtegi teenust pole veel lisatud", 343 "workspaceDrawer.item.noServicesAddedYet": "Ühtegi teenust pole veel lisatud",
433 "workspaceDrawer.premiumCtaButtonLabel": "Loo oma esimene tööruum", 344 "workspaceDrawer.premiumCtaButtonLabel": "Loo oma esimene tööruum",
434 "workspaceDrawer.proFeatureBadge": "Täiustatud funktsioon",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "Aktiveerige täiustatud konto uuesti", 345 "workspaceDrawer.reactivatePremiumAccountLabel": "Aktiveerige täiustatud konto uuesti",
436 "workspaceDrawer.workspaceFeatureInfo": "<p> Ferdi'i tööruumid võimaldavad teil keskenduda sellele, mis on hetkel oluline. Seadistage erinevaid teenusekomplekte ja saate neid igal ajal hõlpsasti vahetada. </p> <p> Teie otsustate milliseid teenuseid millal ja kus vajate, et saaksime aidata teil oma mängu tipus püsida - või hõlpsalt töölt välja lülitada. millal soovite. </p>", 346 "workspaceDrawer.workspaceFeatureInfo": "<p> Ferdi'i tööruumid võimaldavad teil keskenduda sellele, mis on hetkel oluline. Seadistage erinevaid teenusekomplekte ja saate neid igal ajal hõlpsasti vahetada. </p> <p> Teie otsustate milliseid teenuseid millal ja kus vajate, et saaksime aidata teil oma mängu tipus püsida - või hõlpsalt töölt välja lülitada. millal soovite. </p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "Muuda tööruumide sätteid", 347 "workspaceDrawer.workspacesSettingsTooltip": "Muuda tööruumide sätteid",
diff --git a/src/i18n/locales/fa.json b/src/i18n/locales/fa.json
index a57caeb47..bfc275e58 100644
--- a/src/i18n/locales/fa.json
+++ b/src/i18n/locales/fa.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "تغییرات فرَنز {version}", 7 "feature.announcements.changelog.headline": "تغییرات فرَنز {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "فرَنز بعد از {seconds} ثانیه ادامه میده.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "ارتقای حساب",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
19 "feature.planSelection.cta.upgradePro": "Choose Professional",
20 "feature.planSelection.free.text": "Basic functionality",
21 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
24 "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.",
25 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
26 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
30 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
31 "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.",
32 "feature.shareFranz.action.email": "ارسال به صورت ایمیل", 8 "feature.shareFranz.action.email": "ارسال به صورت ایمیل",
33 "feature.shareFranz.action.facebook": "اشتراک‌گذاری در فیس بوک", 9 "feature.shareFranz.action.facebook": "اشتراک‌گذاری در فیس بوک",
34 "feature.shareFranz.action.twitter": "اشتراک‌گذاری در توییتر", 10 "feature.shareFranz.action.twitter": "اشتراک‌گذاری در توییتر",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "من {count} تا سرویس تو فرَنز اضافه کردم! برنامه رایگان برای واتسآپ، اسکایپ، مسنجر، اسلک رو از سایت www.getferdi.com دانلود کن.", 12 "feature.shareFranz.shareText.email": "من {count} تا سرویس تو فرَنز اضافه کردم! برنامه رایگان برای واتسآپ، اسکایپ، مسنجر، اسلک رو از سایت www.getferdi.com دانلود کن.",
37 "feature.shareFranz.shareText.twitter": "من {count} تا سرویس تو فرَنز اضافه کردم! برنامه رایگان برای واتسآپ، اسکایپ، مسنجر، اسلک رو از سایت www.getferdi.com دانلود کن /cc @FerdiMessenger", 13 "feature.shareFranz.shareText.twitter": "من {count} تا سرویس تو فرَنز اضافه کردم! برنامه رایگان برای واتسآپ، اسکایپ، مسنجر، اسلک رو از سایت www.getferdi.com دانلود کن /cc @FerdiMessenger",
38 "feature.shareFranz.text": "به دوستات بگو فرَنز چقدر باحاله و بهمون کمک کن گسترش پیدا کنیم.", 14 "feature.shareFranz.text": "به دوستات بگو فرَنز چقدر باحاله و بهمون کمک کن گسترش پیدا کنیم.",
39 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
40 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade": "Upgrade Account",
42 "feature.trialStatusBar.cta": "Upgrade now",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
46 "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.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
49 "global.api.unhealthy": "به سرویس های آنلاین فرَنز متصل نشدی", 15 "global.api.unhealthy": "به سرویس های آنلاین فرَنز متصل نشدی",
50 "global.franzProRequired": "Ferdi Professional Required", 16 "global.franzProRequired": "Ferdi Professional Required",
51 "global.notConnectedToTheInternet": "اینترنت وصل نیست", 17 "global.notConnectedToTheInternet": "اینترنت وصل نیست",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "تشخیص خودکار زبان", 19 "global.spellchecking.autodetect": "تشخیص خودکار زبان",
54 "global.spellchecking.autodetect.short": "خودکار", 20 "global.spellchecking.autodetect.short": "خودکار",
55 "global.spellchecking.language": "زبان غلط یاب املایی", 21 "global.spellchecking.language": "زبان غلط یاب املایی",
56 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
57 "import.headline": "جانشانی سرویس های فرانز 4", 22 "import.headline": "جانشانی سرویس های فرانز 4",
58 "import.notSupportedHeadline": "این سرویس ها در Ferdi ۵ پشتیبانی نمیشوند.", 23 "import.notSupportedHeadline": "این سرویس ها در Ferdi ۵ پشتیبانی نمیشوند.",
59 "import.skip.label": "میخواهم سرویس ها را به صورت دستی اضافه کنم.", 24 "import.skip.label": "میخواهم سرویس ها را به صورت دستی اضافه کنم.",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "بارگذاری مجدد سرویس ها", 28 "infobar.buttonReloadServices": "بارگذاری مجدد سرویس ها",
64 "infobar.requiredRequestsFailed": "بارگذاری سرویس ها و اطلاعات کاربر ممکن نیست", 29 "infobar.requiredRequestsFailed": "بارگذاری سرویس ها و اطلاعات کاربر ممکن نیست",
65 "infobar.servicesUpdated": "سرویس های شما به روز رسانی شدند.", 30 "infobar.servicesUpdated": "سرویس های شما به روز رسانی شدند.",
66 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable": "یک به روز رسانی جدید برای Ferdi آماده است.", 31 "infobar.updateAvailable": "یک به روز رسانی جدید برای Ferdi آماده است.",
68 "invite.email.label": "نشانی ایمیل", 32 "invite.email.label": "نشانی ایمیل",
69 "invite.headline.friends": "دعوت ۳ نفر از دوستان یا همکارانتان.", 33 "invite.headline.friends": "دعوت ۳ نفر از دوستان یا همکارانتان.",
@@ -122,9 +86,7 @@
122 "menu.todos": "Todos", 86 "menu.todos": "Todos",
123 "menu.todos.enableTodos": "Enable Todos", 87 "menu.todos.enableTodos": "Enable Todos",
124 "menu.view": "نمایش", 88 "menu.view": "نمایش",
125 "menu.view.enterFullScreen": "نمای تمام صفحه", 89 "menu.view.reloadFerdi": "بارگذاری مجدد فرَنز",
126 "menu.view.exitFullScreen": "خروج از تمام‌صفحه ",
127 "menu.view.reloadFranz": "بارگذاری مجدد فرَنز",
128 "menu.view.reloadService": "بارگذاری مجدد سرور", 90 "menu.view.reloadService": "بارگذاری مجدد سرور",
129 "menu.view.reloadTodos": "Reload ToDos", 91 "menu.view.reloadTodos": "Reload ToDos",
130 "menu.view.resetZoom": "اندازه واقعی‌ ", 92 "menu.view.resetZoom": "اندازه واقعی‌ ",
@@ -149,7 +111,6 @@
149 "password.noUser": "هیچ کاربری با این نشانی ایمیل یافت نشد ", 111 "password.noUser": "هیچ کاربری با این نشانی ایمیل یافت نشد ",
150 "password.submit.label": "ارسال ", 112 "password.submit.label": "ارسال ",
151 "password.successInfo": "لطفا ایمیل خود را چک کنید", 113 "password.successInfo": "لطفا ایمیل خود را چک کنید",
152 "premiumFeature.button.upgradeAccount": "ارتقای حساب",
153 "pricing.features.accountSync": "Account Synchronisation", 114 "pricing.features.accountSync": "Account Synchronisation",
154 "pricing.features.adFree": "Forever ad-free", 115 "pricing.features.adFree": "Forever ad-free",
155 "pricing.features.appDelays": "No Waiting Screens", 116 "pricing.features.appDelays": "No Waiting Screens",
@@ -166,27 +127,6 @@
166 "pricing.features.upToSixServices": "Add up to 6 services", 127 "pricing.features.upToSixServices": "Add up to 6 services",
167 "pricing.features.upToThreeServices": "Add up to 3 services", 128 "pricing.features.upToThreeServices": "Add up to 3 services",
168 "pricing.features.workspaces": "Workspaces", 129 "pricing.features.workspaces": "Workspaces",
169 "pricing.plan.free": "Free",
170 "pricing.plan.legacy": "Premium",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal Monthly",
173 "pricing.plan.personal-yearly": "Personal Yearly",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional Monthly",
176 "pricing.plan.pro-yearly": "Professional Yearly",
177 "pricing.trial.cta.accept": "Start my 14-day Ferdi Professional Trial ",
178 "pricing.trial.cta.skip": "Continue to Ferdi",
179 "pricing.trial.cta.start": "Start using Ferdi",
180 "pricing.trial.error": "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline": "Ferdi Professional includes:",
182 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
183 "pricing.trial.intro.happyMessaging": "Happy messaging,",
184 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
185 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline": "No strings attached",
188 "pricing.trial.terms.noCreditCard": "No credit card required",
189 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action": "بارگذاری مجدد {name}", 130 "service.crashHandler.action": "بارگذاری مجدد {name}",
191 "service.crashHandler.autoReload": "در حال بازیابی{نام} در{ثانیه} ثانیه به طور خودکار", 131 "service.crashHandler.autoReload": "در حال بازیابی{نام} در{ثانیه} ثانیه به طور خودکار",
192 "service.crashHandler.headline": "وای نه! ", 132 "service.crashHandler.headline": "وای نه! ",
@@ -198,11 +138,6 @@
198 "service.errorHandler.headline": "وای نه! ", 138 "service.errorHandler.headline": "وای نه! ",
199 "service.errorHandler.message": "خطا ", 139 "service.errorHandler.message": "خطا ",
200 "service.errorHandler.text": "{name} بارگذاری نشد.", 140 "service.errorHandler.text": "{name} بارگذاری نشد.",
201 "service.restrictedHandler.action": "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
203 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading": "در حال بارگذاری", 141 "service.webviewLoader.loading": "در حال بارگذاری",
207 "services.getStarted": "شروع ", 142 "services.getStarted": "شروع ",
208 "services.welcome": "به فرانز خوش آمدید", 143 "services.welcome": "به فرانز خوش آمدید",
@@ -219,18 +154,9 @@
219 "settings.account.headlineInvoices": "فاکتورها", 154 "settings.account.headlineInvoices": "فاکتورها",
220 "settings.account.headlinePassword": "تغییر کلمه عبور", 155 "settings.account.headlinePassword": "تغییر کلمه عبور",
221 "settings.account.headlineProfile": "بروزرسانی پروفایل", 156 "settings.account.headlineProfile": "بروزرسانی پروفایل",
222 "settings.account.headlineSubscription": "اشتراک شما",
223 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
224 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
225 "settings.account.invoiceDownload": "دانلود",
226 "settings.account.manageSubscription.label": "اشتراک خود را مدیریت کنید",
227 "settings.account.successInfo": "تغییرات شما ذخیره شد!", 157 "settings.account.successInfo": "تغییرات شما ذخیره شد!",
228 "settings.account.trial": "Free Trial",
229 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices": "تلاش مجدد ", 158 "settings.account.tryReloadServices": "تلاش مجدد ",
232 "settings.account.tryReloadUserInfoRequest": "تلاش مجدد ", 159 "settings.account.tryReloadUserInfoRequest": "تلاش مجدد ",
233 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
234 "settings.account.userInfoRequestFailed": "نمی‌توان اطلاعات کاربر را بارگذاری کرد.", 160 "settings.account.userInfoRequestFailed": "نمی‌توان اطلاعات کاربر را بارگذاری کرد.",
235 "settings.account.yourLicense": "Your Ferdi License", 161 "settings.account.yourLicense": "Your Ferdi License",
236 "settings.app.buttonClearAllCache": "پاک کردن حافظه پنهان", 162 "settings.app.buttonClearAllCache": "پاک کردن حافظه پنهان",
@@ -284,7 +210,6 @@
284 "settings.recipes.customService.openFolder": "Open folder", 210 "settings.recipes.customService.openFolder": "Open folder",
285 "settings.recipes.headline": "سرویس های موجود", 211 "settings.recipes.headline": "سرویس های موجود",
286 "settings.recipes.missingService": "سرویسی را نیاز دارید ؟", 212 "settings.recipes.missingService": "سرویسی را نیاز دارید ؟",
287 "settings.recipes.mostPopular": "مشهورترین ها",
288 "settings.recipes.nothingFound": "متاسفیم ، اما هیچ سرویسی با آنچه که جستجو کردید مطابقت نداشت .", 213 "settings.recipes.nothingFound": "متاسفیم ، اما هیچ سرویسی با آنچه که جستجو کردید مطابقت نداشت .",
289 "settings.recipes.servicesSuccessfulAddedInfo": "سرویس با موفقیت اضافه شد", 214 "settings.recipes.servicesSuccessfulAddedInfo": "سرویس با موفقیت اضافه شد",
290 "settings.searchService": "جستجوی سرویس ها", 215 "settings.searchService": "جستجوی سرویس ها",
@@ -295,7 +220,6 @@
295 "settings.service.form.availableServices": "سرویس های موجود", 220 "settings.service.form.availableServices": "سرویس های موجود",
296 "settings.service.form.customUrl": "سرور سفارشی", 221 "settings.service.form.customUrl": "سرور سفارشی",
297 "settings.service.form.customUrlPremiumInfo": "برای اضافه کردن سرویس هایی که خود دارید ، نیاز به پشتیبانی پیشرفته فرانز را دارید", 222 "settings.service.form.customUrlPremiumInfo": "برای اضافه کردن سرویس هایی که خود دارید ، نیاز به پشتیبانی پیشرفته فرانز را دارید",
298 "settings.service.form.customUrlUpgradeAccount": "اکانت خود را ارتقا دهید",
299 "settings.service.form.customUrlValidationError": "نتوانستیم سرور {نام} را تایید اعتبار کنیم", 223 "settings.service.form.customUrlValidationError": "نتوانستیم سرور {نام} را تایید اعتبار کنیم",
300 "settings.service.form.deleteButton": "حذف سرویس", 224 "settings.service.form.deleteButton": "حذف سرویس",
301 "settings.service.form.editServiceHeadline": "ویرایش {name}", 225 "settings.service.form.editServiceHeadline": "ویرایش {name}",
@@ -391,19 +315,6 @@
391 "signup.link.login": "صاحب اکانت هستید ؟ وارد شوید", 315 "signup.link.login": "صاحب اکانت هستید ؟ وارد شوید",
392 "signup.password.label": "رمز عبور", 316 "signup.password.label": "رمز عبور",
393 "signup.submit.label": "ایجاد حساب جدید", 317 "signup.submit.label": "ایجاد حساب جدید",
394 "subscription.bestValue": "Best value",
395 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
396 "subscription.cta.allOptions": "See all options",
397 "subscription.cta.choosePlan": "Choose your plan",
398 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
399 "subscription.interval.per": "per {interval}",
400 "subscription.interval.perMonth": "per month",
401 "subscription.interval.perMonthPerUser": "per month & user",
402 "subscription.planItem.upgradeAccount": "Upgrade Account",
403 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
404 "subscription.teaser.intro": "Ferdi 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!",
405 "subscriptionPopup.buttonCancel": "انصراف",
406 "subscriptionPopup.buttonDone": "انجام شد",
407 "tabs.item.deleteService": "حذف سرویس", 318 "tabs.item.deleteService": "حذف سرویس",
408 "tabs.item.disableAudio": "غیرفعال کردن صدا", 319 "tabs.item.disableAudio": "غیرفعال کردن صدا",
409 "tabs.item.disableNotifications": "غیر فعال کردن اعلان ها", 320 "tabs.item.disableNotifications": "غیر فعال کردن اعلان ها",
@@ -431,7 +342,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "ویرایش", 342 "workspaceDrawer.item.contextMenuEdit": "ویرایش",
432 "workspaceDrawer.item.noServicesAddedYet": "هنوز هیچ سرویسی اضافه نشده", 343 "workspaceDrawer.item.noServicesAddedYet": "هنوز هیچ سرویسی اضافه نشده",
433 "workspaceDrawer.premiumCtaButtonLabel": "اولین فضای کاریتو درست کن", 344 "workspaceDrawer.premiumCtaButtonLabel": "اولین فضای کاریتو درست کن",
434 "workspaceDrawer.proFeatureBadge": "امکانات ویژه",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "فعالسازی مجدد حساب ویژه", 345 "workspaceDrawer.reactivatePremiumAccountLabel": "فعالسازی مجدد حساب ویژه",
436 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 346 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "ویرایش تنظیمات فضاهای کاری", 347 "workspaceDrawer.workspacesSettingsTooltip": "ویرایش تنظیمات فضاهای کاری",
diff --git a/src/i18n/locales/fi.json b/src/i18n/locales/fi.json
index 5b74d709b..cce6b3e9c 100644
--- a/src/i18n/locales/fi.json
+++ b/src/i18n/locales/fi.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Voi ei! Ferdi menetti yhteyden {name}.", 12 "connectionLostBanner.message": "Voi ei! Ferdi menetti yhteyden {name}.",
13 "feature.announcements.changelog.headline": "Muutoksia Ferdissä {version}", 13 "feature.announcements.changelog.headline": "Muutoksia Ferdissä {version}",
14 "feature.debugger.title": "Julkaise virheraportti", 14 "feature.debugger.title": "Julkaise virheraportti",
15 "feature.delayApp.headline": "Ole hyvä ja osta Ferdin Tukijalisenssi, jotta vältyt odottamiselta",
16 "feature.delayApp.text": "Ferdi jatkaa {seconds} sekunnin kuluttua.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Hanki Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Päivitä tili",
22 "feature.nightlyBuilds.activate": "Aktivoi", 15 "feature.nightlyBuilds.activate": "Aktivoi",
23 "feature.nightlyBuilds.cancel": "Peruuta", 16 "feature.nightlyBuilds.cancel": "Peruuta",
24 "feature.nightlyBuilds.info": "Uusimmat versiot ovat Ferdin kokeellisia versioita, jotka voivat sisältää viimeistelemättömiä tai keskeneräisiä ominaisuuksia. Näitä uusimpia versioita käyttävät pääasiassa kehittäjät testaamaan uusia ominaisuuksia ja miten ne toimivat lopullisessa versiossa. Jos et tiedä mitä olet tekemässä, suosittelemme ettet aktivoi uusimpia versioita.", 17 "feature.nightlyBuilds.info": "Uusimmat versiot ovat Ferdin kokeellisia versioita, jotka voivat sisältää viimeistelemättömiä tai keskeneräisiä ominaisuuksia. Näitä uusimpia versioita käyttävät pääasiassa kehittäjät testaamaan uusia ominaisuuksia ja miten ne toimivat lopullisessa versiossa. Jos et tiedä mitä olet tekemässä, suosittelemme ettet aktivoi uusimpia versioita.",
25 "feature.nightlyBuilds.title": "Uusimmat versiot", 18 "feature.nightlyBuilds.title": "Uusimmat versiot",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Virheraportin julkaisussa tapahtui virhe. Yritä myöhemmin uudelleen tai katso konsolista saadaksesi lisätietoja.", 19 "feature.publishDebugInfo.error": "Virheraportin julkaisussa tapahtui virhe. Yritä myöhemmin uudelleen tai katso konsolista saadaksesi lisätietoja.",
43 "feature.publishDebugInfo.info": "Julkaisemalla virheraportin auttat meitä löytämään Ferdissä ongelmia ja virheitä. Julkaisemalla virheraportin hyväksyt Ferdi Debugger´s tietosuojakäytännöt ja -ehdot", 20 "feature.publishDebugInfo.info": "Julkaisemalla virheraportin auttat meitä löytämään Ferdissä ongelmia ja virheitä. Julkaisemalla virheraportin hyväksyt Ferdi Debugger´s tietosuojakäytännöt ja -ehdot",
44 "feature.publishDebugInfo.privacy": "Tietosuojakäytäntö", 21 "feature.publishDebugInfo.privacy": "Tietosuojakäytäntö",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Valitse palvelu painamalla TAB, ↑ ja ↓. Avaa palvelu painamalla ENTER.", 26 "feature.quickSwitch.info": "Valitse palvelu painamalla TAB, ↑ ja ↓. Avaa palvelu painamalla ENTER.",
50 "feature.quickSwitch.search": "Etsi...", 27 "feature.quickSwitch.search": "Etsi...",
51 "feature.quickSwitch.title": "Pikavalitsin", 28 "feature.quickSwitch.title": "Pikavalitsin",
52 "feature.serviceLimit.limitReached": "Olet lisännyt {amount} {limit} palvelusta, jotka sisältyvät suunnitelmaasi. Ole hyvä ja päivitä tilisi lisätäksesi muita palveluita.",
53 "feature.shareFranz.action.email": "Lähetä sähköpostina", 29 "feature.shareFranz.action.email": "Lähetä sähköpostina",
54 "feature.shareFranz.action.facebook": "Jaa Facebookissa", 30 "feature.shareFranz.action.facebook": "Jaa Facebookissa",
55 "feature.shareFranz.action.twitter": "Jaa Twitterissä", 31 "feature.shareFranz.action.twitter": "Jaa Twitterissä",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Lisäsin Ferdiin {count} palvelun! Hanki ilmainen sovellus WhatsAppille, Messengerille, Slackille, Skypelle ja muille palveluille osoitteessa www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Lisäsin Ferdiin {count} palvelun! Hanki ilmainen sovellus WhatsAppille, Messengerille, Slackille, Skypelle ja muille palveluille osoitteessa www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Olen lisännyt {count} palvelua Ferdiin! Hanki ilmainen sovellus WhatsAppille, Messengerille, Slackille, Skypelle ja muille palveluille osoitteessa www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Olen lisännyt {count} palvelua Ferdiin! Hanki ilmainen sovellus WhatsAppille, Messengerille, Slackille, Skypelle ja muille palveluille osoitteessa www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Kerro ystävillesi ja kollegoille, kuinka Ferdi on mahtava ja auta meitä levittämään sanaa eteenpäin.", 35 "feature.shareFranz.text": "Kerro ystävillesi ja kollegoille, kuinka Ferdi on mahtava ja auta meitä levittämään sanaa eteenpäin.",
60 "feature.todos.premium.info": "Ferdi Todos on saatavilla nyt premium-käyttäjille!",
61 "feature.todos.premium.rollout": "Kaikkien muiden on odotettava hieman kauemmin.",
62 "feature.todos.premium.upgrade": "Päivitä tili",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Ferdin verkkopalveluihin ei saada yhteyttä", 36 "global.api.unhealthy": "Ferdin verkkopalveluihin ei saada yhteyttä",
71 "global.franzProRequired": "Vaatii Ferdi Professionalin",
72 "global.notConnectedToTheInternet": "Et ole yhteydessä internetiin.", 37 "global.notConnectedToTheInternet": "Et ole yhteydessä internetiin.",
73 "global.spellchecker.useDefault": "Käytä järjestelmän oletusasetusta ({default})", 38 "global.spellchecker.useDefault": "Käytä järjestelmän oletusasetusta ({default})",
74 "global.spellchecking.autodetect": "Tunnista kieli automaattisesti", 39 "global.spellchecking.autodetect": "Tunnista kieli automaattisesti",
75 "global.spellchecking.autodetect.short": "Automaattinen", 40 "global.spellchecking.autodetect.short": "Automaattinen",
76 "global.spellchecking.language": "Oikeinkirjoituksen tarkistuskieli", 41 "global.spellchecking.language": "Oikeinkirjoituksen tarkistuskieli",
77 "global.upgradeButton.upgradeToPro": "Päivitä Ferdi Professionaliin",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Tuo Ferdin 4 palveluasi", 44 "import.headline": "Tuo Ferdin 4 palveluasi",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Piilota", 52 "infobar.hide": "Piilota",
89 "infobar.requiredRequestsFailed": "Palveluja ja käyttäjätietoja ei voitu ladata", 53 "infobar.requiredRequestsFailed": "Palveluja ja käyttäjätietoja ei voitu ladata",
90 "infobar.servicesUpdated": "Palvelusi on päivitetty.", 54 "infobar.servicesUpdated": "Palvelusi on päivitetty.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Ferdille on saatavana uusi päivitys.", 55 "infobar.updateAvailable": "Ferdille on saatavana uusi päivitys.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Sähköpostiosoite", 57 "invite.email.label": "Sähköpostiosoite",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Piilota valikko automaattisesti", 87 "menu.app.autohideMenuBar": "Piilota valikko automaattisesti",
125 "menu.app.checkForUpdates": "Tarkista päivitykset", 88 "menu.app.checkForUpdates": "Tarkista päivitykset",
126 "menu.app.hide": "Piilota", 89 "menu.app.hide": "Piilota",
127 "menu.app.hideOthers": "Piilota muut", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Lopeta", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Asetukset", 92 "menu.app.settings": "Asetukset",
130 "menu.app.unhide": "Näytä", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Muokkaa", 94 "menu.edit": "Muokkaa",
132 "menu.edit.copy": "Kopioi", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Leikkaa", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Poista", 97 "menu.edit.delete": "Poista",
135 "menu.edit.emojiSymbols": "Emoji & Symbolit", 98 "menu.edit.emojiSymbols": "Emoji & Symbolit",
136 "menu.edit.findInPage": "Etsi sivulta", 99 "menu.edit.findInPage": "Etsi sivulta",
137 "menu.edit.paste": "Liitä", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Liitä ja yhdistä tyyli", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Tee uudelleen", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Valitse kaikki", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Puhe", 104 "menu.edit.speech": "Puhe",
142 "menu.edit.startDictation": "Aloita sanelu", 105 "menu.edit.startDictation": "Aloita sanelu",
143 "menu.edit.startSpeaking": "Aloita puhuminen", 106 "menu.edit.startSpeaking": "Aloita puhuminen",
144 "menu.edit.stopSpeaking": "Lopeta puhuminen", 107 "menu.edit.stopSpeaking": "Lopeta puhuminen",
145 "menu.edit.undo": "Kumoa", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Tiedosto", 109 "menu.file": "Tiedosto",
147 "menu.help": "Ohje", 110 "menu.help": "Help",
148 "menu.help.changelog": "Muutosloki", 111 "menu.help.changelog": "Muutosloki",
149 "menu.help.debugInfo": "Kopioi virheraportin tiedot", 112 "menu.help.debugInfo": "Kopioi virheraportin tiedot",
150 "menu.help.debugInfoCopiedBody": "Virheraportin tiedot on kopioitu leikepöydälle.", 113 "menu.help.debugInfoCopiedBody": "Virheraportin tiedot on kopioitu leikepöydälle.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi virheraportin tiedot", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi virheraportin tiedot",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Lue lisää", 116 "menu.help.learnMore": "Lue lisää",
153 "menu.help.privacy": "Tietosuojalauseke", 117 "menu.help.privacy": "Tietosuojalauseke",
154 "menu.help.publishDebugInfo": "Julkaise virheraportin tiedot", 118 "menu.help.publishDebugInfo": "Julkaise virheraportin tiedot",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Ota Todos käyttöön", 127 "menu.todos.enableTodos": "Ota Todos käyttöön",
164 "menu.view": "Katso", 128 "menu.view": "Katso",
165 "menu.view.back": "Takaisin", 129 "menu.view.back": "Takaisin",
166 "menu.view.enterFullScreen": "Siirry koko näyttöön",
167 "menu.view.exitFullScreen": "Poistu koko näytön tilasta",
168 "menu.view.forward": "Eteenpäin", 130 "menu.view.forward": "Eteenpäin",
169 "menu.view.lockFerdi": "Lukitse Ferdi", 131 "menu.view.lockFerdi": "Lukitse Ferdi",
170 "menu.view.openQuickSwitch": "Avaa Pikavalinta", 132 "menu.view.openQuickSwitch": "Avaa Pikavalinta",
171 "menu.view.reloadFranz": "Lataa Ferdi uudestaan", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Lataa Palvelu uudelleen", 134 "menu.view.reloadService": "Lataa Palvelu uudelleen",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Nykyinen koko", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Vaihda Tummaan tilaan", 137 "menu.view.toggleDarkMode": "Vaihda Tummaan tilaan",
176 "menu.view.toggleDevTools": "Vaihda Kehittäjän työkaluun", 138 "menu.view.toggleDevTools": "Vaihda Kehittäjän työkaluun",
177 "menu.view.toggleFullScreen": "Vaihda koko ruututilaan", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Vaihda Palvelun kehittäjän työkaluun", 140 "menu.view.toggleServiceDevTools": "Vaihda Palvelun kehittäjän työkaluun",
179 "menu.view.toggleTodosDevTools": "Vaihda Todon Kehittäjän työkalut", 141 "menu.view.toggleTodosDevTools": "Vaihda Todon Kehittäjän työkalut",
180 "menu.view.zoomIn": "Lähen", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Loitonna", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Ikkuna", 144 "menu.window": "Window",
183 "menu.window.close": "Sulje", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Pienennä", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Työtilat", 147 "menu.workspaces": "Työtilat",
186 "menu.workspaces.addNewWorkspace": "Lisää Uusi Työtila...", 148 "menu.workspaces.addNewWorkspace": "Lisää Uusi Työtila...",
187 "menu.workspaces.closeWorkspaceDrawer": "Sulje työtilan valikko", 149 "menu.workspaces.closeWorkspaceDrawer": "Sulje työtilan valikko",
@@ -194,11 +156,7 @@
194 "password.noUser": "Tälle sähköpostiosoiteelle ei löytynyt käyttäjää", 156 "password.noUser": "Tälle sähköpostiosoiteelle ei löytynyt käyttäjää",
195 "password.submit.label": "Jatka", 157 "password.submit.label": "Jatka",
196 "password.successInfo": "Ole hyvä ja tarkista sähköpostisi", 158 "password.successInfo": "Ole hyvä ja tarkista sähköpostisi",
197 "premiumFeature.button.upgradeAccount": "Päivitä tili",
198 "pricing.features.accountSync": "Tilin Synkronointi", 159 "pricing.features.accountSync": "Tilin Synkronointi",
199 "pricing.features.adFree": "Ikuisesti mainosvapaa",
200 "pricing.features.appDelays": "Ei Odotus-näyttöjä",
201 "pricing.features.appDelaysEnabled": "Satunnaisesti Odotus-näyttöjä",
202 "pricing.features.customWebsites": "Lisää mukautettuja sivustoja", 160 "pricing.features.customWebsites": "Lisää mukautettuja sivustoja",
203 "pricing.features.desktopNotifications": "Työpöytäilmoitukset", 161 "pricing.features.desktopNotifications": "Työpöytäilmoitukset",
204 "pricing.features.onPremise": "Toimitila ja muut Hosting-palvelut", 162 "pricing.features.onPremise": "Toimitila ja muut Hosting-palvelut",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Tiimin Hallinta", 166 "pricing.features.teamManagement": "Tiimin Hallinta",
209 "pricing.features.thirdPartyServices": "Asenna kolmannen osapuolen palveluita", 167 "pricing.features.thirdPartyServices": "Asenna kolmannen osapuolen palveluita",
210 "pricing.features.unlimitedServices": "Lisää rajattomat palvelut", 168 "pricing.features.unlimitedServices": "Lisää rajattomat palvelut",
211 "pricing.features.upToSixServices": "Lisää enintään 6 palvelua",
212 "pricing.features.upToThreeServices": "Lisää enintään 3 palvelua",
213 "pricing.features.workspaces": "Työtilat", 169 "pricing.features.workspaces": "Työtilat",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal kuukausittain",
218 "pricing.plan.personal-yearly": "Ferdi Personal vuosittain",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional kuukausittain",
221 "pricing.plan.pro-yearly": "Ferdi Professional vuosittain",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Lataa uudestaan {name}", 170 "service.crashHandler.action": "Lataa uudestaan {name}",
236 "service.crashHandler.autoReload": "Yritetään palauttaa {name} automaattisesti {seconds} sekunnin kuluttua", 171 "service.crashHandler.autoReload": "Yritetään palauttaa {name} automaattisesti {seconds} sekunnin kuluttua",
237 "service.crashHandler.headline": "Voi ei!", 172 "service.crashHandler.headline": "Voi ei!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Voi ei!", 178 "service.errorHandler.headline": "Voi ei!",
244 "service.errorHandler.message": "Virhe", 179 "service.errorHandler.message": "Virhe",
245 "service.errorHandler.text": "{name} lataus epäonnistui.", 180 "service.errorHandler.text": "{name} lataus epäonnistui.",
246 "service.restrictedHandler.action": "Päivitä tili",
247 "service.restrictedHandler.customUrl.headline": "Vaaditaan Ferdi Professional Plan",
248 "service.restrictedHandler.customUrl.text": "Ole hyvä ja päivitä Ferdi Professional Plan käyttääksesi omia Url-osoitteita ja itse isännöityjä palveluita.",
249 "service.restrictedHandler.serviceLimit.headline": "Olet saavuttanut palvelusi enimmäismäärän.",
250 "service.restrictedHandler.serviceLimit.text": "Ole hyvä ja päivitä tilisi käyttääksesi enemmän kuin {count} palvelua.",
251 "service.webviewLoader.loading": "Ladataan {service}", 181 "service.webviewLoader.loading": "Ladataan {service}",
252 "services.getStarted": "Aloita", 182 "services.getStarted": "Aloita",
253 "services.login": "Kirjaudu sisään käyttääksesi Ferdiä.", 183 "services.login": "Kirjaudu sisään käyttääksesi Ferdiä.",
254 "services.serverInfo": "Vaihtoehtoisesti voit vaihtaa Ferdi palvelimen klikkaamalla ratasta vasemmassa alakulmassa.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Käytä Ferdia ilman tiliä", 185 "services.serverless": "Käytä Ferdia ilman tiliä",
256 "services.welcome": "Tervetuloa Ferdiin", 186 "services.welcome": "Tervetuloa Ferdiin",
257 "settings.account.account.editButton": "Muokkaa tiliä", 187 "settings.account.account.editButton": "Muokkaa tiliä",
258 "settings.account.accountType.basic": "Perustili",
259 "settings.account.accountType.premium": "Premium Supporter-tili",
260 "settings.account.accountUnavailable": "Tili ei ole käytettävissä", 188 "settings.account.accountUnavailable": "Tili ei ole käytettävissä",
261 "settings.account.accountUnavailableInfo": "Käytät Ferdia ilman tiliä. Jos haluat käyttää Ferdia tilin kanssa ja pitää palvelusi synkronoituna kaikissa asennuksissa, valitse Asetukset-välilehdessä palvelin ja kirjaudu sisään.", 189 "settings.account.accountUnavailableInfo": "Käytät Ferdia ilman tiliä. Jos haluat käyttää Ferdia tilin kanssa ja pitää palvelusi synkronoituna kaikissa asennuksissa, valitse Asetukset-välilehdessä palvelin ja kirjaudu sisään.",
262 "settings.account.buttonSave": "Päivitä profiili", 190 "settings.account.buttonSave": "Päivitä profiili",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Laskut", 197 "settings.account.headlineInvoices": "Laskut",
270 "settings.account.headlinePassword": "Vaihda salasana", 198 "settings.account.headlinePassword": "Vaihda salasana",
271 "settings.account.headlineProfile": "Päivitä profiili", 199 "settings.account.headlineProfile": "Päivitä profiili",
272 "settings.account.headlineSubscription": "Tilauksesi",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Päivitä tilisi niin saat täydellisen Ferdi-kokemuksen",
275 "settings.account.invoiceDownload": "Lataa",
276 "settings.account.manageSubscription.label": "Hallinnoi tilaustasi",
277 "settings.account.successInfo": "Tekemäsi muutokset on tallennettu", 200 "settings.account.successInfo": "Tekemäsi muutokset on tallennettu",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Yritä uudelleen", 201 "settings.account.tryReloadServices": "Yritä uudelleen",
282 "settings.account.tryReloadUserInfoRequest": "Yritä uudelleen", 202 "settings.account.tryReloadUserInfoRequest": "Yritä uudelleen",
283 "settings.account.upgradeToPro.label": "Päivitä Ferdi Professionaliin",
284 "settings.account.userInfoRequestFailed": "Käyttäjätietoja ei voitu ladata", 203 "settings.account.userInfoRequestFailed": "Käyttäjätietoja ei voitu ladata",
285 "settings.account.yourLicense": "Sinun Ferdi-lisenssi", 204 "settings.account.yourLicense": "Sinun Ferdi-lisenssi",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Ota oikoluku käyttöön", 227 "settings.app.form.enableSpellchecking": "Ota oikoluku käyttöön",
309 "settings.app.form.enableSystemTray": "Näytä Ferdi ilmoitusalueella", 228 "settings.app.form.enableSystemTray": "Näytä Ferdi ilmoitusalueella",
310 "settings.app.form.enableTodos": "Ota Ferdi Todos käyttöön", 229 "settings.app.form.enableTodos": "Ota Ferdi Todos käyttöön",
311 "settings.app.form.hibernate": "Ota horrostila käyttöön",
312 "settings.app.form.hibernateOnStartup": "Pidä palvelut horrostilassa käynnistettäessä", 230 "settings.app.form.hibernateOnStartup": "Pidä palvelut horrostilassa käynnistettäessä",
313 "settings.app.form.hibernationStrategy": "Horrostila-suunnitelma", 231 "settings.app.form.hibernationStrategy": "Horrostila-suunnitelma",
314 "settings.app.form.iconSize": "Palvelun kuvakkeen koko", 232 "settings.app.form.iconSize": "Palvelun kuvakkeen koko",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Ota käyttöön yleinen tumma tila", 255 "settings.app.form.universalDarkMode": "Ota käyttöön yleinen tumma tila",
338 "settings.app.form.useTouchIdToUnlock": "Salli TouchID:n käyttö Ferdin avaamiseksi", 256 "settings.app.form.useTouchIdToUnlock": "Salli TouchID:n käyttö Ferdin avaamiseksi",
339 "settings.app.form.useVerticalStyle": "Käytä pystysuoraa tyyliä", 257 "settings.app.form.useVerticalStyle": "Käytä pystysuoraa tyyliä",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Asetukset", 259 "settings.app.headline": "Asetukset",
341 "settings.app.headlineAdvanced": "Lisäasetukset", 260 "settings.app.headlineAdvanced": "Lisäasetukset",
342 "settings.app.headlineAppearance": "Ulkoasu", 261 "settings.app.headlineAppearance": "Ulkoasu",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "Oletuksena Ferdi pitää kaikki palvelut auki ja ladattuna taustalla, joten ne ovat valmiina, kun haluat käyttää niitä. Horrostila sammuttaa palveluita tietyn jakson jälkeen. Tämä kätevä toimino säästää RAM-muistia tai estää palveluita hidastamasta tietokonetta.", 266 "settings.app.hibernateInfo": "Oletuksena Ferdi pitää kaikki palvelut auki ja ladattuna taustalla, joten ne ovat valmiina, kun haluat käyttää niitä. Horrostila sammuttaa palveluita tietyn jakson jälkeen. Tämä kätevä toimino säästää RAM-muistia tai estää palveluita hidastamasta tietokonetta.",
348 "settings.app.inactivityLockInfo": "Minuutin käyttämättömyyden jälkeen Ferdi lukkiutuu automaattisesti. Käytä arvoa 0 poistaaksesi toiminnon käytöstä", 267 "settings.app.inactivityLockInfo": "Minuutin käyttämättömyyden jälkeen Ferdi lukkiutuu automaattisesti. Käytä arvoa 0 poistaaksesi toiminnon käytöstä",
349 "settings.app.languageDisclaimer": "Viralliset käännökset ovat englanti ja saksa. Kaikki muut kielet ovat yhteisön kääntämiä.", 268 "settings.app.languageDisclaimer": "Viralliset käännökset ovat englanti ja saksa. Kaikki muut kielet ovat yhteisön kääntämiä.",
350 "settings.app.lockInfo": "Salasanalukitus pitää viestisi suojattuna.\nKäyttämällä salasanalukitusta, sinua pyydetään syöttämään salasanasi joka kerta kun käynnistät Ferdin tai lukitset Ferdin lukitussymbolin avulla vasemmassa alakulmassa tai näppäinyhdistelmällä CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Salasana", 270 "settings.app.lockedPassword": "Salasana",
352 "settings.app.lockedPasswordInfo": "Varmista, että luot salasanan, jonka muistat.\nJos hukkaat tämän salasanan, sinun täytyy asentaa Ferdi uudelleen.", 271 "settings.app.lockedPasswordInfo": "Varmista, että luot salasanan, jonka muistat.\nJos hukkaat tämän salasanan, sinun täytyy asentaa Ferdi uudelleen.",
353 "settings.app.restartRequired": "Muutokset vaativat uudelleenkäynnistyksen", 272 "settings.app.restartRequired": "Muutokset vaativat uudelleenkäynnistyksen",
354 "settings.app.scheduledDNDInfo": "Ajastetun Älä häiritse-tilan avulla voit määritellä ajanjakson, jonka aikana et halua saada ilmoituksia Ferdistä.", 273 "settings.app.scheduledDNDInfo": "Ajastetun Älä häiritse-tilan avulla voit määritellä ajanjakson, jonka aikana et halua saada ilmoituksia Ferdistä.",
355 "settings.app.scheduledDNDTimeInfo": "Ajastin 24 tunnin järjestelmässä. Kun Älä häiritse-tila otetaan yöksi käyttöön, päättymisaika voi olla ennen alkamisaikaa (esim. alku 17:00, loppu 09:00).", 274 "settings.app.scheduledDNDTimeInfo": "Ajastin 24 tunnin järjestelmässä. Kun Älä häiritse-tila otetaan yöksi käyttöön, päättymisaika voi olla ennen alkamisaikaa (esim. alku 17:00, loppu 09:00).",
356 "settings.app.sentryInfo": "Telemetriatiedon lähettäminen antaa meille mahdollisuudet löytää virheitä Ferdistä - emme lähetä mitään henkilökohtaisia tietoja, kuten viestitietoja! Tämän vaihtoehdon muuttaminen edellyttää, että käynnistät Ferdin uudelleen.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi käyttää Macin sisäänrakennettua oikolukua tarkastaessaan kirjoitusvirheitä. Jos haluat muuttaa tarkastettavaa kieltä, voit tehdä sen Macin järjestelmän asetuksissa.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi käyttää Macin sisäänrakennettua oikolukua tarkastaessaan kirjoitusvirheitä. Jos haluat muuttaa tarkastettavaa kieltä, voit tehdä sen Macin järjestelmän asetuksissa.",
358 "settings.app.subheadlineCache": "Välimuisti", 277 "settings.app.subheadlineCache": "Välimuisti",
359 "settings.app.todoServerInfo": "Tätä palvelinta käytetään \"Ferdi Todo\" -toiminnossa.", 278 "settings.app.todoServerInfo": "Tätä palvelinta käytetään \"Ferdi Todo\" -toiminnossa.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Avaa kansio", 300 "settings.recipes.customService.openFolder": "Avaa kansio",
382 "settings.recipes.headline": "Käytettävissä olevat palvelut", 301 "settings.recipes.headline": "Käytettävissä olevat palvelut",
383 "settings.recipes.missingService": "Palvelu puuttuu?", 302 "settings.recipes.missingService": "Palvelu puuttuu?",
384 "settings.recipes.mostPopular": "Suosituin",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Palvelu lisätty onnistuneesti", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Palvelu lisätty onnistuneesti",
387 "settings.searchService": "Hae palvelua", 305 "settings.searchService": "Hae palvelua",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Lisää {name}", 309 "settings.service.form.addServiceHeadline": "Lisää {name}",
392 "settings.service.form.availableServices": "Käytettävissä olevat palvelut", 310 "settings.service.form.availableServices": "Käytettävissä olevat palvelut",
393 "settings.service.form.customUrl": "Mukautettu palvelin", 311 "settings.service.form.customUrl": "Mukautettu palvelin",
394 "settings.service.form.customUrlPremiumInfo": "Liittääksesi ylläpitopalveluja, tarvitset Ferdi Premium Supporter -tilin.",
395 "settings.service.form.customUrlUpgradeAccount": "Päivitä tilisi",
396 "settings.service.form.customUrlValidationError": "Mukautettua {name} palvelinta ei voitu vahvistaa.", 312 "settings.service.form.customUrlValidationError": "Mukautettua {name} palvelinta ei voitu vahvistaa.",
397 "settings.service.form.darkReaderBrightness": "Tumman tilan kirkkaus", 313 "settings.service.form.darkReaderBrightness": "Tumman tilan kirkkaus",
398 "settings.service.form.darkReaderContrast": "Tumman tilan kontrasti", 314 "settings.service.form.darkReaderContrast": "Tumman tilan kontrasti",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz-tiimin hallinta", 378 "settings.team.contentHeadline": "Franz-tiimin hallinta",
463 "settings.team.copy": "Franzin Tiimihallinnan avulla voit hallita usean käyttäjän Franz-tilauksia. Huomioithan, että Franz Premium -tilaus ei anna sinulle etuja Ferdin käytössä: Ainoa syy siihen, että sinulla on vielä pääsy Tiimihallintaan, on se, että voit hallita perinteisiä Franz-tiimejä ja että et menetä mitään toimintoja tilisi hallinnassa.", 379 "settings.team.copy": "Franzin Tiimihallinnan avulla voit hallita usean käyttäjän Franz-tilauksia. Huomioithan, että Franz Premium -tilaus ei anna sinulle etuja Ferdin käytössä: Ainoa syy siihen, että sinulla on vielä pääsy Tiimihallintaan, on se, että voit hallita perinteisiä Franz-tiimejä ja että et menetä mitään toimintoja tilisi hallinnassa.",
464 "settings.team.headline": "Tiimi", 380 "settings.team.headline": "Tiimi",
465 "settings.team.intro": "Käytössäsi on tällä hetkellä Franz Servers, minkä vuoksi sinulla on pääsy Tiimi-hallintaan.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Hallitse tiimiäsi meetfranz.comissa", 382 "settings.team.manageAction": "Hallitse tiimiäsi meetfranz.comissa",
467 "settings.team.teamsUnavailable": "Tiimit eivät ole käytettävissä", 383 "settings.team.teamsUnavailable": "Tiimit eivät ole käytettävissä",
468 "settings.team.teamsUnavailableInfo": "Tiimit ovat tällä hetkellä käytettävissä vain Franz-palvelimella ja Franz Professionalin lunastamisen jälkeen. Käyttääksesi tiimejä, vaihda palvelimesi osoitteeseen https://api.franzinfra.com.", 384 "settings.team.teamsUnavailableInfo": "Tiimit ovat tällä hetkellä käytettävissä vain Franz-palvelimella ja Franz Professionalin lunastamisen jälkeen. Käyttääksesi tiimejä, vaihda palvelimesi osoitteeseen https://api.franzinfra.com.",
469 "settings.team.upgradeAction": "Päivitä tilisi",
470 "settings.user.form.accountType.company": "Yritys", 385 "settings.user.form.accountType.company": "Yritys",
471 "settings.user.form.accountType.individual": "Yksityishenkilö", 386 "settings.user.form.accountType.individual": "Yksityishenkilö",
472 "settings.user.form.accountType.label": "Tilin tyyppi", 387 "settings.user.form.accountType.label": "Tilin tyyppi",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Sinulla on jo tili? Kirjaudu sisään", 431 "signup.link.login": "Sinulla on jo tili? Kirjaudu sisään",
517 "signup.password.label": "Salasana", 432 "signup.password.label": "Salasana",
518 "signup.submit.label": "Luo tili", 433 "signup.submit.label": "Luo tili",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Näytä kaikki vaihtoehdot",
522 "subscription.cta.choosePlan": "Valitse tilauksesi",
523 "subscription.includedProFeatures": "Ferdi Professional Plan sisältää:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "kuukaudessa",
526 "subscription.interval.perMonthPerUser": "per kuukausi & käyttäjä",
527 "subscription.planItem.upgradeAccount": "Päivitä tili",
528 "subscription.teaser.includedFeatures": "Maksulliset Ferdin suunnitelmat ovat:",
529 "subscription.teaser.intro": "Ferdi 5:n mukana tulee laaja valikoima uusia ominaisuuksia, jotka parantavat jokapäiväistä viestintää - ryhmät mukaanlukien. Tutustu uusiin suunnitelmiin ja selvitä, mikä sopii sinulle parhaiten!",
530 "subscriptionPopup.buttonCancel": "Peruuta",
531 "subscriptionPopup.buttonDone": "Valmis",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Poista palvelu", 435 "tabs.item.deleteService": "Poista palvelu",
534 "tabs.item.disableAudio": "Poista ääni käytöstä", 436 "tabs.item.disableAudio": "Poista ääni käytöstä",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Poista ilmoitukset käytöstä", 438 "tabs.item.disableNotifications": "Poista ilmoitukset käytöstä",
536 "tabs.item.disableService": "Poista palvelu", 439 "tabs.item.disableService": "Poista palvelu",
537 "tabs.item.edit": "Muokkaa", 440 "tabs.item.edit": "Muokkaa",
538 "tabs.item.enableAudio": "Ota ääni käyttöön", 441 "tabs.item.enableAudio": "Ota ääni käyttöön",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Ota ilmoitukset käyttöön", 443 "tabs.item.enableNotification": "Ota ilmoitukset käyttöön",
540 "tabs.item.enableService": "Ota palvelu käyttöön", 444 "tabs.item.enableService": "Ota palvelu käyttöön",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Lataa uudelleen", 446 "tabs.item.reload": "Lataa uudelleen",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} ei ole kelvollinen", 448 "validation.email": "{field} ei ole kelvollinen",
543 "validation.minLength": "{field} pitää olla vähintään {length} kirjainta", 449 "validation.minLength": "{field} pitää olla vähintään {length} kirjainta",
544 "validation.oneRequired": "Vähintään yksi kohde valittava", 450 "validation.oneRequired": "Vähintään yksi kohde valittava",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Työtilat", 462 "workspaceDrawer.headline": "Työtilat",
557 "workspaceDrawer.item.contextMenuEdit": "muokkaa", 463 "workspaceDrawer.item.contextMenuEdit": "muokkaa",
558 "workspaceDrawer.item.noServicesAddedYet": "Palveluja ei ole vielä lisätty", 464 "workspaceDrawer.item.noServicesAddedYet": "Palveluja ei ole vielä lisätty",
559 "workspaceDrawer.premiumCtaButtonLabel": "Luo ensimmäinen työtila",
560 "workspaceDrawer.proFeatureBadge": "Premium-ominaisuus",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Ota Premium-tili uudelleen käyttöön",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces auttaa sinun keskittymään mikä on tärkeää juuri nyt. Määritä erilaisia palvelukokonaisuuksia ja vaihda helposti niiden välillä milloin tahansa.</p><p>Sinä päätät mitä palveluita tarvitset milloin ja missä, jotta voimme auttaa sinua pysymään työsi äärellä - tai helpottamaan poistumista aina kun haluat.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces auttaa sinun keskittymään mikä on tärkeää juuri nyt. Määritä erilaisia palvelukokonaisuuksia ja vaihda helposti niiden välillä milloin tahansa.</p><p>Sinä päätät mitä palveluita tarvitset milloin ja missä, jotta voimme auttaa sinua pysymään työsi äärellä - tai helpottamaan poistumista aina kun haluat.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Muokkaa työtilojen asetuksia", 466 "workspaceDrawer.workspacesSettingsTooltip": "Muokkaa työtilojen asetuksia",
564 "workspaces.switchingIndicator.switchingTo": "Vaihdetaan" 467 "workspaces.switchingIndicator.switchingTo": "Vaihdetaan"
diff --git a/src/i18n/locales/fil.json b/src/i18n/locales/fil.json
index 5588d982d..0bcaad1ee 100644
--- a/src/i18n/locales/fil.json
+++ b/src/i18n/locales/fil.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
19 "feature.planSelection.cta.upgradePro": "Choose Professional",
20 "feature.planSelection.free.text": "Basic functionality",
21 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
24 "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.",
25 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
26 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
30 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
31 "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.",
32 "feature.shareFranz.action.email": "Send as email", 8 "feature.shareFranz.action.email": "Send as email",
33 "feature.shareFranz.action.facebook": "Share on Facebook", 9 "feature.shareFranz.action.facebook": "Share on Facebook",
34 "feature.shareFranz.action.twitter": "Share on Twitter", 10 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 12 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
37 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 13 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
38 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 14 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
39 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
40 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade": "Upgrade Account",
42 "feature.trialStatusBar.cta": "Upgrade now",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
46 "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.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
49 "global.api.unhealthy": "Hindi maka connect sa 'Ferdi online services'", 15 "global.api.unhealthy": "Hindi maka connect sa 'Ferdi online services'",
50 "global.franzProRequired": "Ferdi Professional Required", 16 "global.franzProRequired": "Ferdi Professional Required",
51 "global.notConnectedToTheInternet": "Hindi ka naka connect sa internet.", 17 "global.notConnectedToTheInternet": "Hindi ka naka connect sa internet.",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "Detect language automatically", 19 "global.spellchecking.autodetect": "Detect language automatically",
54 "global.spellchecking.autodetect.short": "Automatic", 20 "global.spellchecking.autodetect.short": "Automatic",
55 "global.spellchecking.language": "Spell checking language", 21 "global.spellchecking.language": "Spell checking language",
56 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
57 "import.headline": "Ilagay ang iyonhg Ferdi 4 services", 22 "import.headline": "Ilagay ang iyonhg Ferdi 4 services",
58 "import.notSupportedHeadline": "Ang mga services ay hindi pa supported ni Ferdi 5", 23 "import.notSupportedHeadline": "Ang mga services ay hindi pa supported ni Ferdi 5",
59 "import.skip.label": "Gusto kong magdagdag", 24 "import.skip.label": "Gusto kong magdagdag",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "I-load muli ang mga serbisyo", 28 "infobar.buttonReloadServices": "I-load muli ang mga serbisyo",
64 "infobar.requiredRequestsFailed": "Hindi mai-load ang mga serbisyo at ang impormasyon tungkol sa user.", 29 "infobar.requiredRequestsFailed": "Hindi mai-load ang mga serbisyo at ang impormasyon tungkol sa user.",
65 "infobar.servicesUpdated": "Na-update na ang iyong mga serbisyo.", 30 "infobar.servicesUpdated": "Na-update na ang iyong mga serbisyo.",
66 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable": "May bagong update.", 31 "infobar.updateAvailable": "May bagong update.",
68 "invite.email.label": "Email Address", 32 "invite.email.label": "Email Address",
69 "invite.headline.friends": "Invite 3 of your friends or colleagues", 33 "invite.headline.friends": "Invite 3 of your friends or colleagues",
@@ -122,9 +86,7 @@
122 "menu.todos": "Todos", 86 "menu.todos": "Todos",
123 "menu.todos.enableTodos": "Enable Todos", 87 "menu.todos.enableTodos": "Enable Todos",
124 "menu.view": "View", 88 "menu.view": "View",
125 "menu.view.enterFullScreen": "Enter Full Screen", 89 "menu.view.reloadFerdi": "Reload Ferdi",
126 "menu.view.exitFullScreen": "Exit Full Screen",
127 "menu.view.reloadFranz": "Reload Ferdi",
128 "menu.view.reloadService": "Reload Service", 90 "menu.view.reloadService": "Reload Service",
129 "menu.view.reloadTodos": "Reload ToDos", 91 "menu.view.reloadTodos": "Reload ToDos",
130 "menu.view.resetZoom": "Actual Size", 92 "menu.view.resetZoom": "Actual Size",
@@ -149,7 +111,6 @@
149 "password.noUser": "No user with that email address was found", 111 "password.noUser": "No user with that email address was found",
150 "password.submit.label": "Submit", 112 "password.submit.label": "Submit",
151 "password.successInfo": "Please check your email", 113 "password.successInfo": "Please check your email",
152 "premiumFeature.button.upgradeAccount": "Upgrade account",
153 "pricing.features.accountSync": "Account Synchronisation", 114 "pricing.features.accountSync": "Account Synchronisation",
154 "pricing.features.adFree": "Forever ad-free", 115 "pricing.features.adFree": "Forever ad-free",
155 "pricing.features.appDelays": "No Waiting Screens", 116 "pricing.features.appDelays": "No Waiting Screens",
@@ -166,27 +127,6 @@
166 "pricing.features.upToSixServices": "Add up to 6 services", 127 "pricing.features.upToSixServices": "Add up to 6 services",
167 "pricing.features.upToThreeServices": "Add up to 3 services", 128 "pricing.features.upToThreeServices": "Add up to 3 services",
168 "pricing.features.workspaces": "Workspaces", 129 "pricing.features.workspaces": "Workspaces",
169 "pricing.plan.free": "Free",
170 "pricing.plan.legacy": "Premium",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal Monthly",
173 "pricing.plan.personal-yearly": "Personal Yearly",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional Monthly",
176 "pricing.plan.pro-yearly": "Professional Yearly",
177 "pricing.trial.cta.accept": "Start my 14-day Ferdi Professional Trial ",
178 "pricing.trial.cta.skip": "Continue to Ferdi",
179 "pricing.trial.cta.start": "Start using Ferdi",
180 "pricing.trial.error": "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline": "Ferdi Professional includes:",
182 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
183 "pricing.trial.intro.happyMessaging": "Happy messaging,",
184 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
185 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline": "No strings attached",
188 "pricing.trial.terms.noCreditCard": "No credit card required",
189 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action": "Reload {name}", 130 "service.crashHandler.action": "Reload {name}",
191 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 131 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
192 "service.crashHandler.headline": "Oh no!", 132 "service.crashHandler.headline": "Oh no!",
@@ -198,11 +138,6 @@
198 "service.errorHandler.headline": "Oh no!", 138 "service.errorHandler.headline": "Oh no!",
199 "service.errorHandler.message": "Error", 139 "service.errorHandler.message": "Error",
200 "service.errorHandler.text": "{name} has failed to load.", 140 "service.errorHandler.text": "{name} has failed to load.",
201 "service.restrictedHandler.action": "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
203 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading": "Loading", 141 "service.webviewLoader.loading": "Loading",
207 "services.getStarted": "Get started", 142 "services.getStarted": "Get started",
208 "services.welcome": "Welcome to Ferdi", 143 "services.welcome": "Welcome to Ferdi",
@@ -219,18 +154,9 @@
219 "settings.account.headlineInvoices": "Invoices", 154 "settings.account.headlineInvoices": "Invoices",
220 "settings.account.headlinePassword": "Change password", 155 "settings.account.headlinePassword": "Change password",
221 "settings.account.headlineProfile": "Update profile", 156 "settings.account.headlineProfile": "Update profile",
222 "settings.account.headlineSubscription": "Your subscription",
223 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
224 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
225 "settings.account.invoiceDownload": "Download",
226 "settings.account.manageSubscription.label": "Manage your subscription",
227 "settings.account.successInfo": "Your changes have been saved", 157 "settings.account.successInfo": "Your changes have been saved",
228 "settings.account.trial": "Free Trial",
229 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices": "Try again", 158 "settings.account.tryReloadServices": "Try again",
232 "settings.account.tryReloadUserInfoRequest": "Try again", 159 "settings.account.tryReloadUserInfoRequest": "Try again",
233 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
234 "settings.account.userInfoRequestFailed": "Could not load user information", 160 "settings.account.userInfoRequestFailed": "Could not load user information",
235 "settings.account.yourLicense": "Your Ferdi License", 161 "settings.account.yourLicense": "Your Ferdi License",
236 "settings.app.buttonClearAllCache": "Clear cache", 162 "settings.app.buttonClearAllCache": "Clear cache",
@@ -284,7 +210,6 @@
284 "settings.recipes.customService.openFolder": "Open folder", 210 "settings.recipes.customService.openFolder": "Open folder",
285 "settings.recipes.headline": "Available services", 211 "settings.recipes.headline": "Available services",
286 "settings.recipes.missingService": "Missing a service?", 212 "settings.recipes.missingService": "Missing a service?",
287 "settings.recipes.mostPopular": "Most popular",
288 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 213 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
289 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 214 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
290 "settings.searchService": "Search service", 215 "settings.searchService": "Search service",
@@ -295,7 +220,6 @@
295 "settings.service.form.availableServices": "Available services", 220 "settings.service.form.availableServices": "Available services",
296 "settings.service.form.customUrl": "Custom server", 221 "settings.service.form.customUrl": "Custom server",
297 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.", 222 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
298 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
299 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 223 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
300 "settings.service.form.deleteButton": "Delete service", 224 "settings.service.form.deleteButton": "Delete service",
301 "settings.service.form.editServiceHeadline": "Edit {name}", 225 "settings.service.form.editServiceHeadline": "Edit {name}",
@@ -391,19 +315,6 @@
391 "signup.link.login": "Already have an account, sign in?", 315 "signup.link.login": "Already have an account, sign in?",
392 "signup.password.label": "Password", 316 "signup.password.label": "Password",
393 "signup.submit.label": "Create account", 317 "signup.submit.label": "Create account",
394 "subscription.bestValue": "Best value",
395 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
396 "subscription.cta.allOptions": "See all options",
397 "subscription.cta.choosePlan": "Choose your plan",
398 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
399 "subscription.interval.per": "per {interval}",
400 "subscription.interval.perMonth": "per month",
401 "subscription.interval.perMonthPerUser": "per month & user",
402 "subscription.planItem.upgradeAccount": "Upgrade Account",
403 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
404 "subscription.teaser.intro": "Ferdi 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!",
405 "subscriptionPopup.buttonCancel": "Cancel",
406 "subscriptionPopup.buttonDone": "Done",
407 "tabs.item.deleteService": "Delete service", 318 "tabs.item.deleteService": "Delete service",
408 "tabs.item.disableAudio": "Disable audio", 319 "tabs.item.disableAudio": "Disable audio",
409 "tabs.item.disableNotifications": "Disable notifications", 320 "tabs.item.disableNotifications": "Disable notifications",
@@ -431,7 +342,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "edit", 342 "workspaceDrawer.item.contextMenuEdit": "edit",
432 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 343 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 344 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge": "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 345 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 346 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 347 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index e3d3051ec..464c70138 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh non ! Ferdi a perdu la connexion avec {name}.", 12 "connectionLostBanner.message": "Oh non ! Ferdi a perdu la connexion avec {name}.",
13 "feature.announcements.changelog.headline": "Les nouveaux changements dans Ferdi {version}", 13 "feature.announcements.changelog.headline": "Les nouveaux changements dans Ferdi {version}",
14 "feature.debugger.title": "Publier les informations de débogage", 14 "feature.debugger.title": "Publier les informations de débogage",
15 "feature.delayApp.headline": "Achetez la licence Ferdi pour ne plus avoir de temps d'attente",
16 "feature.delayApp.text": "Ferdi s'ouvrira dans {seconds} secondes.",
17 "feature.delayApp.trial.action": "Oui, je veux les 14 jours d'essai gratuits de Ferdi Professionnel",
18 "feature.delayApp.trial.actionShort": "Activer l'essai gratuit de Ferdi Professionnel",
19 "feature.delayApp.trial.headline": "Prendre l'essai gratuit de 14 jours de Ferdi Professionnel et esquiver la ligne",
20 "feature.delayApp.upgrade.action": "Acheter une license Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Mettre à niveau le compte",
22 "feature.nightlyBuilds.activate": "Activer", 15 "feature.nightlyBuilds.activate": "Activer",
23 "feature.nightlyBuilds.cancel": "Annuler", 16 "feature.nightlyBuilds.cancel": "Annuler",
24 "feature.nightlyBuilds.info": "Les versions de développement sont des versions expérimentales de Ferdi qui peuvent contenir des fonctionnalités non optimisées ou incomplètes. Ces versions de développement sont principalement utilisés par les développeurs pour tester leurs nouvelles fonctionnalités et leurs performances. Si vous ne savez pas ce que vous faites, nous vous suggérons de ne pas activer les versions de développement.", 17 "feature.nightlyBuilds.info": "Les versions de développement sont des versions expérimentales de Ferdi qui peuvent contenir des fonctionnalités non optimisées ou incomplètes. Ces versions de développement sont principalement utilisés par les développeurs pour tester leurs nouvelles fonctionnalités et leurs performances. Si vous ne savez pas ce que vous faites, nous vous suggérons de ne pas activer les versions de développement.",
25 "feature.nightlyBuilds.title": "Versions de développement", 18 "feature.nightlyBuilds.title": "Versions de développement",
26 "feature.planSelection.cta.ctaDowngradeFree": "Rétrograder à la version gratuite",
27 "feature.planSelection.cta.stayOnFree": "Rester en version gratuite",
28 "feature.planSelection.cta.trial": "Commencez mon essai gratuit de 14 jours",
29 "feature.planSelection.cta.upgradePersonal": "Choisir Personnel",
30 "feature.planSelection.cta.upgradePro": "Choisir Professionnel",
31 "feature.planSelection.free.text": "Fonctionnalité basique",
32 "feature.planSelection.fullFeatureList": "Comparaison complète de tous les plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Rétrograder à la version gratuite",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choisir Personnel",
35 "feature.planSelection.fullscreen.dialog.message": "Vous êtes sur le point de rétrograder vers notre compte gratuit. Êtes-vous sûr ? Cliquez ici pour obtenir plus de services et de fonctionnalités pour seulement {currency}{price} par mois.",
36 "feature.planSelection.fullscreen.dialog.title": "Rétrograder votre plan Ferdi",
37 "feature.planSelection.fullscreen.subheadline": "Il est temps de faire un choix. Ferdi fonctionne mieux sur nos plans Personnels et Professionnels. Veuillez consulter et choisir le meilleur pour vous.",
38 "feature.planSelection.fullscreen.welcome": "Êtes-vous prêt à choisir, {name}",
39 "feature.planSelection.personal.text": "Plus de services, pas d'attente - idéal pour un usage personnel.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "Tous les prix basés sur un paiement annuel",
41 "feature.planSelection.pro.text": "Des services illimités et des fonctionnalités professionnelles pour vous - et votre équipe.",
42 "feature.publishDebugInfo.error": "Il y a eu une erreur en essayant de publier les informations de débogage. Veuillez réessayer plus tard ou consulter la console pour plus d'informations.", 19 "feature.publishDebugInfo.error": "Il y a eu une erreur en essayant de publier les informations de débogage. Veuillez réessayer plus tard ou consulter la console pour plus d'informations.",
43 "feature.publishDebugInfo.info": "La publication de vos informations de débogage nous aide à trouver des problèmes et des erreurs dans Ferdi. En publiant vos informations de débogage, vous acceptez la politique de confidentialité et les conditions d'utilisation de Ferdi Debugger", 20 "feature.publishDebugInfo.info": "La publication de vos informations de débogage nous aide à trouver des problèmes et des erreurs dans Ferdi. En publiant vos informations de débogage, vous acceptez la politique de confidentialité et les conditions d'utilisation de Ferdi Debugger",
44 "feature.publishDebugInfo.privacy": "Politique de confidentialité", 21 "feature.publishDebugInfo.privacy": "Politique de confidentialité",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Sélectionner un service avec TAB, ↑ et ↓. Ouvrir un service avec ENTER.", 26 "feature.quickSwitch.info": "Sélectionner un service avec TAB, ↑ et ↓. Ouvrir un service avec ENTER.",
50 "feature.quickSwitch.search": "Rechercher...", 27 "feature.quickSwitch.search": "Rechercher...",
51 "feature.quickSwitch.title": "Changement rapide", 28 "feature.quickSwitch.title": "Changement rapide",
52 "feature.serviceLimit.limitReached": "Vous avez ajouté {amount} sur {limit} services qui sont inclus dans votre plan. S'il vous plaît améliorer votre compte pour ajouter plus de services.",
53 "feature.shareFranz.action.email": "Envoyer par mail", 29 "feature.shareFranz.action.email": "Envoyer par mail",
54 "feature.shareFranz.action.facebook": "Partager sur Facebook", 30 "feature.shareFranz.action.facebook": "Partager sur Facebook",
55 "feature.shareFranz.action.twitter": "Partager sur Twitter", 31 "feature.shareFranz.action.twitter": "Partager sur Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "J'ai ajouté {count} services sur Ferdi ! Télécharger l'application gratuite pour WhatsApp, Messenger, Skype et autres sur www.getferdi.com", 33 "feature.shareFranz.shareText.email": "J'ai ajouté {count} services sur Ferdi ! Télécharger l'application gratuite pour WhatsApp, Messenger, Skype et autres sur www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "J'ai ajouté {count} services à Ferdi! Télécharge l'application gratuite pour WhatsApp, Messenger, Slack, Skype et autres sur www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "J'ai ajouté {count} services à Ferdi! Télécharge l'application gratuite pour WhatsApp, Messenger, Slack, Skype et autres sur www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Dites à vos amis et collègues a quel point Ferdi est super et aidez nous à faire passer le mot.", 35 "feature.shareFranz.text": "Dites à vos amis et collègues a quel point Ferdi est super et aidez nous à faire passer le mot.",
60 "feature.todos.premium.info": "Ferdi Todos est disponible aux utilisateurs premium maintenant!",
61 "feature.todos.premium.rollout": "Tout le monde devra attendre un peux plus longtemps.",
62 "feature.todos.premium.upgrade": "Améliorez votre compte",
63 "feature.trialStatusBar.cta": "Améliorer maintenant",
64 "feature.trialStatusBar.expired": "Votre essai gratuit Ferdi {plan} a expiré, veuillez mettre à jour votre compte.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Rétrograder à la version gratuite",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choisir Personnel",
67 "feature.trialStatusBar.fullscreen.dialog.message": "Vous êtes sur le point de rétrograder vers notre compte gratuit. Êtes-vous sûr ? Cliquez ici pour obtenir plus de services et de fonctionnalités pour seulement {currency}{price} par mois.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Rétrograder votre plan Ferdi",
69 "feature.trialStatusBar.restTime": "Votre essai gratuit de Ferdi {plan} se termine dans {time}.",
70 "global.api.unhealthy": "Impossible de se connecter aux services en ligne de Ferdi", 36 "global.api.unhealthy": "Impossible de se connecter aux services en ligne de Ferdi",
71 "global.franzProRequired": "Ferdi Professionnel Requis",
72 "global.notConnectedToTheInternet": "Vous n'êtes pas connecté à Internet.", 37 "global.notConnectedToTheInternet": "Vous n'êtes pas connecté à Internet.",
73 "global.spellchecker.useDefault": "Par défaut ({default})", 38 "global.spellchecker.useDefault": "Par défaut ({default})",
74 "global.spellchecking.autodetect": "Détecter automatiquement la langue", 39 "global.spellchecking.autodetect": "Détecter automatiquement la langue",
75 "global.spellchecking.autodetect.short": "Automatiquement", 40 "global.spellchecking.autodetect.short": "Automatiquement",
76 "global.spellchecking.language": "Langue de la vérification orthographique", 41 "global.spellchecking.language": "Langue de la vérification orthographique",
77 "global.upgradeButton.upgradeToPro": "Passez à Ferdi Professionnel",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importez vos services depuis la version 4 de Ferdi", 44 "import.headline": "Importez vos services depuis la version 4 de Ferdi",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Masquer", 52 "infobar.hide": "Masquer",
89 "infobar.requiredRequestsFailed": "Impossible d'accéder aux services et informations de l'utilisateur", 53 "infobar.requiredRequestsFailed": "Impossible d'accéder aux services et informations de l'utilisateur",
90 "infobar.servicesUpdated": "Vos services ont été mis à jour.", 54 "infobar.servicesUpdated": "Vos services ont été mis à jour.",
91 "infobar.trialActivated": "Votre essai à été correctement activé. Bonne messagerie!",
92 "infobar.updateAvailable": "Une nouvelle mise à jour de Ferdi est disponible.", 55 "infobar.updateAvailable": "Une nouvelle mise à jour de Ferdi est disponible.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Adresse Email", 57 "invite.email.label": "Adresse Email",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Cacher automatiquement la barre de menu", 87 "menu.app.autohideMenuBar": "Cacher automatiquement la barre de menu",
125 "menu.app.checkForUpdates": "Vérifier les mises à jour", 88 "menu.app.checkForUpdates": "Vérifier les mises à jour",
126 "menu.app.hide": "Masquer", 89 "menu.app.hide": "Masquer",
127 "menu.app.hideOthers": "Masquer les autres", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Quitter", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Paramètres", 92 "menu.app.settings": "Paramètres",
130 "menu.app.unhide": "Afficher", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Éditer", 94 "menu.edit": "Éditer",
132 "menu.edit.copy": "Copier", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Couper", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Supprimer", 97 "menu.edit.delete": "Supprimer",
135 "menu.edit.emojiSymbols": "Emoji & Symboles", 98 "menu.edit.emojiSymbols": "Emoji & Symboles",
136 "menu.edit.findInPage": "Rechercher dans la page", 99 "menu.edit.findInPage": "Rechercher dans la page",
137 "menu.edit.paste": "Coller", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Coller et fusionner le style", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Rétablir", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Tout sélectionner", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Synthèse vocale", 104 "menu.edit.speech": "Synthèse vocale",
142 "menu.edit.startDictation": "Démarrer la dictée", 105 "menu.edit.startDictation": "Démarrer la dictée",
143 "menu.edit.startSpeaking": "Démarrer la synthèse vocale", 106 "menu.edit.startSpeaking": "Démarrer la synthèse vocale",
144 "menu.edit.stopSpeaking": "Arrêter la synthèse vocale", 107 "menu.edit.stopSpeaking": "Arrêter la synthèse vocale",
145 "menu.edit.undo": "Annuler", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Fichier", 109 "menu.file": "Fichier",
147 "menu.help": "Aide", 110 "menu.help": "Help",
148 "menu.help.changelog": "Liste des modifications", 111 "menu.help.changelog": "Liste des modifications",
149 "menu.help.debugInfo": "Copier les informations de Debug", 112 "menu.help.debugInfo": "Copier les informations de Debug",
150 "menu.help.debugInfoCopiedBody": "Les informations de Debug ont été copié dans votre presse-papier.", 113 "menu.help.debugInfoCopiedBody": "Les informations de Debug ont été copié dans votre presse-papier.",
151 "menu.help.debugInfoCopiedHeadline": "Information de Debug de Ferdi", 114 "menu.help.debugInfoCopiedHeadline": "Information de Debug de Ferdi",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "En savoir plus", 116 "menu.help.learnMore": "En savoir plus",
153 "menu.help.privacy": "Déclaration de confidentialité", 117 "menu.help.privacy": "Déclaration de confidentialité",
154 "menu.help.publishDebugInfo": "Publier les informations de débogage", 118 "menu.help.publishDebugInfo": "Publier les informations de débogage",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Activer Todos", 127 "menu.todos.enableTodos": "Activer Todos",
164 "menu.view": "Aperçu", 128 "menu.view": "Aperçu",
165 "menu.view.back": "Revenir", 129 "menu.view.back": "Revenir",
166 "menu.view.enterFullScreen": "Entrer en mode plein écran",
167 "menu.view.exitFullScreen": "Sortir du mode plein écran",
168 "menu.view.forward": "Avancer", 130 "menu.view.forward": "Avancer",
169 "menu.view.lockFerdi": "Verrouiller Ferdi", 131 "menu.view.lockFerdi": "Verrouiller Ferdi",
170 "menu.view.openQuickSwitch": "Ouvrir le changement rapide", 132 "menu.view.openQuickSwitch": "Ouvrir le changement rapide",
171 "menu.view.reloadFranz": "Recharger Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Redémarrer le service", 134 "menu.view.reloadService": "Redémarrer le service",
173 "menu.view.reloadTodos": "Recharger les Todos", 135 "menu.view.reloadTodos": "Recharger les Todos",
174 "menu.view.resetZoom": "Taille actuelle", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Activer le mode sombre", 137 "menu.view.toggleDarkMode": "Activer le mode sombre",
176 "menu.view.toggleDevTools": "Activer les outils de développeur", 138 "menu.view.toggleDevTools": "Activer les outils de développeur",
177 "menu.view.toggleFullScreen": "Activer le mode plein écran", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Activer les outils de développeur du service", 140 "menu.view.toggleServiceDevTools": "Activer les outils de développeur du service",
179 "menu.view.toggleTodosDevTools": "Activer les outils de développeur Todos", 141 "menu.view.toggleTodosDevTools": "Activer les outils de développeur Todos",
180 "menu.view.zoomIn": "Zoom Avant", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Zoom Arrière", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Fenêtre", 144 "menu.window": "Window",
183 "menu.window.close": "Fermer", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Réduire", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Espace de travail", 147 "menu.workspaces": "Espace de travail",
186 "menu.workspaces.addNewWorkspace": "Ajouter un nouvel espace de travail...", 148 "menu.workspaces.addNewWorkspace": "Ajouter un nouvel espace de travail...",
187 "menu.workspaces.closeWorkspaceDrawer": "Fermer l'espace de travail", 149 "menu.workspaces.closeWorkspaceDrawer": "Fermer l'espace de travail",
@@ -194,11 +156,7 @@
194 "password.noUser": "Aucun utilisateur n'a été trouvé avec cette adresse email", 156 "password.noUser": "Aucun utilisateur n'a été trouvé avec cette adresse email",
195 "password.submit.label": "Soumettre", 157 "password.submit.label": "Soumettre",
196 "password.successInfo": "Merci de consulter vos emails", 158 "password.successInfo": "Merci de consulter vos emails",
197 "premiumFeature.button.upgradeAccount": "Mettre à niveau le compte",
198 "pricing.features.accountSync": "Synchronisation de compte", 159 "pricing.features.accountSync": "Synchronisation de compte",
199 "pricing.features.adFree": "Sans pub, pour toujours",
200 "pricing.features.appDelays": "Plus d'écrans d'attente",
201 "pricing.features.appDelaysEnabled": "Écrans d'attente occasionnels",
202 "pricing.features.customWebsites": "Ajouter des sites web modifiés", 160 "pricing.features.customWebsites": "Ajouter des sites web modifiés",
203 "pricing.features.desktopNotifications": "Notifications de bureau", 161 "pricing.features.desktopNotifications": "Notifications de bureau",
204 "pricing.features.onPremise": "Services hébergés sur place et autres", 162 "pricing.features.onPremise": "Services hébergés sur place et autres",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Gestion d'équipe", 166 "pricing.features.teamManagement": "Gestion d'équipe",
209 "pricing.features.thirdPartyServices": "Installer des services tiers", 167 "pricing.features.thirdPartyServices": "Installer des services tiers",
210 "pricing.features.unlimitedServices": "Ajouter des services illimités", 168 "pricing.features.unlimitedServices": "Ajouter des services illimités",
211 "pricing.features.upToSixServices": "Ajouter jusqu'à 6 services",
212 "pricing.features.upToThreeServices": "Ajouter jusqu'à 3 services",
213 "pricing.features.workspaces": "Espace de travail", 169 "pricing.features.workspaces": "Espace de travail",
214 "pricing.plan.free": "Ferdi Gratuit",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personnel",
217 "pricing.plan.personal-monthly": "Ferdi Personnel au mois",
218 "pricing.plan.personal-yearly": "Ferdi Personnel à l'année",
219 "pricing.plan.pro": "Ferdi Professionnel",
220 "pricing.plan.pro-monthly": "Ferdi Professionnel au mois",
221 "pricing.plan.pro-yearly": "Ferdi Professionnel à l'année",
222 "pricing.trial.cta.accept": "Oui, améliorer mon compte à Ferdi Professionnel",
223 "pricing.trial.cta.skip": "Continuer à Ferdi",
224 "pricing.trial.cta.start": "Commencez à utiliser Ferdi",
225 "pricing.trial.error": "Désoler, nous ne pouvons pas activé votre essai!",
226 "pricing.trial.features.headline": "Ferdi Professionnel inclus:",
227 "pricing.trial.headline.pro": "Bonjour {name}, bienvenue dans Ferdi",
228 "pricing.trial.intro.happyMessaging": "Bonne messagerie,",
229 "pricing.trial.intro.specialTreat": "Nous avons une offre spéciale pour vous.",
230 "pricing.trial.intro.tryPro": "Profitez de l'expérience complète de Ferdi Professional pendant 14 jours.",
231 "pricing.trial.terms.automaticTrialEnd": "Votre essai gratuit se finis automatiquement après 14 jours",
232 "pricing.trial.terms.headline": "Sans condition",
233 "pricing.trial.terms.noCreditCard": "Pas de carte de crédit requis",
234 "pricing.trial.terms.trialWorth": "Essai gratuit (normalement {currency}{price} par mois)",
235 "service.crashHandler.action": "Recharger {name}", 170 "service.crashHandler.action": "Recharger {name}",
236 "service.crashHandler.autoReload": "Tentative de restauration automatique de {name} dans {seconds} secondes", 171 "service.crashHandler.autoReload": "Tentative de restauration automatique de {name} dans {seconds} secondes",
237 "service.crashHandler.headline": "Oh non!", 172 "service.crashHandler.headline": "Oh non!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh non!", 178 "service.errorHandler.headline": "Oh non!",
244 "service.errorHandler.message": "Erreur", 179 "service.errorHandler.message": "Erreur",
245 "service.errorHandler.text": "Le chargement de {name} a échoué.", 180 "service.errorHandler.text": "Le chargement de {name} a échoué.",
246 "service.restrictedHandler.action": "Améliorez votre compte",
247 "service.restrictedHandler.customUrl.headline": "Le Plan Ferdi Professionnel requis",
248 "service.restrictedHandler.customUrl.text": "Veuillez passer à Ferdi Professionnel pour pouvoir utiliser vos propres urls et services auto-hébergés.",
249 "service.restrictedHandler.serviceLimit.headline": "Vous avez atteint votre limite de service.",
250 "service.restrictedHandler.serviceLimit.text": "S'il vous plaît améliorer votre compte pour utilisé plus que {count} services.",
251 "service.webviewLoader.loading": "Chargement de {service}", 181 "service.webviewLoader.loading": "Chargement de {service}",
252 "services.getStarted": "Commencer", 182 "services.getStarted": "Commencer",
253 "services.login": "Veuillez vous connecter pour utiliser Ferdi.", 183 "services.login": "Veuillez vous connecter pour utiliser Ferdi.",
254 "services.serverInfo": "Optionnellement, vous pouvez changer votre serveur Ferdi en cliquant sur la roue dentée en bas au coin gauche.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Utiliser Ferdi sans compte", 185 "services.serverless": "Utiliser Ferdi sans compte",
256 "services.welcome": "Bienvenue dans Ferdi", 186 "services.welcome": "Bienvenue dans Ferdi",
257 "settings.account.account.editButton": "Modifier le compte", 187 "settings.account.account.editButton": "Modifier le compte",
258 "settings.account.accountType.basic": "Compte de base",
259 "settings.account.accountType.premium": "Compte supporteur premium",
260 "settings.account.accountUnavailable": "Compte indisponible", 188 "settings.account.accountUnavailable": "Compte indisponible",
261 "settings.account.accountUnavailableInfo": "Vous utilisez Ferdi sans compte. Si vous souhaitez utiliser Ferdi avec un compte et garder vos services synchronisés entre les installations, sélectionnez un serveur dans l'onglet Paramètres, puis connectez-vous.", 189 "settings.account.accountUnavailableInfo": "Vous utilisez Ferdi sans compte. Si vous souhaitez utiliser Ferdi avec un compte et garder vos services synchronisés entre les installations, sélectionnez un serveur dans l'onglet Paramètres, puis connectez-vous.",
262 "settings.account.buttonSave": "Mettre à jour le profil", 190 "settings.account.buttonSave": "Mettre à jour le profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Factures", 197 "settings.account.headlineInvoices": "Factures",
270 "settings.account.headlinePassword": "Changer le mot de passe", 198 "settings.account.headlinePassword": "Changer le mot de passe",
271 "settings.account.headlineProfile": "Mettre à jour le profil", 199 "settings.account.headlineProfile": "Mettre à jour le profil",
272 "settings.account.headlineSubscription": "Votre abonnement",
273 "settings.account.headlineTrialUpgrade": "Prenez l'essai de 14 jours gratuit de Ferdi Professionnel",
274 "settings.account.headlineUpgradeAccount": "Améliorer votre compte et recevez l'expérience de Ferdi au complet",
275 "settings.account.invoiceDownload": "Télécharger",
276 "settings.account.manageSubscription.label": "Gérer votre abonnement",
277 "settings.account.successInfo": "Vos modifications ont été enregistrées", 200 "settings.account.successInfo": "Vos modifications ont été enregistrées",
278 "settings.account.trial": "Essai Gratuit",
279 "settings.account.trialEndsIn": "Votre essai gratuit fini dans {duration}.",
280 "settings.account.trialUpdateBillingInfo": "S'il vous plaît mettre à jour votre facturation pour utilisé {license} après votre période d’essais.",
281 "settings.account.tryReloadServices": "Réessayer", 201 "settings.account.tryReloadServices": "Réessayer",
282 "settings.account.tryReloadUserInfoRequest": "Réessayer", 202 "settings.account.tryReloadUserInfoRequest": "Réessayer",
283 "settings.account.upgradeToPro.label": "Passez à Ferdi Professionnel",
284 "settings.account.userInfoRequestFailed": "Impossible de charger les informations de l'utilisateur", 203 "settings.account.userInfoRequestFailed": "Impossible de charger les informations de l'utilisateur",
285 "settings.account.yourLicense": "Votre licence Ferdi", 204 "settings.account.yourLicense": "Votre licence Ferdi",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Activer la vérification orthographique", 227 "settings.app.form.enableSpellchecking": "Activer la vérification orthographique",
309 "settings.app.form.enableSystemTray": "Afficher Ferdi dans la barre d'état système", 228 "settings.app.form.enableSystemTray": "Afficher Ferdi dans la barre d'état système",
310 "settings.app.form.enableTodos": "Activer Ferdi Todos", 229 "settings.app.form.enableTodos": "Activer Ferdi Todos",
311 "settings.app.form.hibernate": "Activer le service d'hibernation",
312 "settings.app.form.hibernateOnStartup": "Garder les services en veille prolongée au démarrage", 230 "settings.app.form.hibernateOnStartup": "Garder les services en veille prolongée au démarrage",
313 "settings.app.form.hibernationStrategy": "Stratégie d'hibernation", 231 "settings.app.form.hibernationStrategy": "Stratégie d'hibernation",
314 "settings.app.form.iconSize": "Taille de l'icône du service", 232 "settings.app.form.iconSize": "Taille de l'icône du service",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Activer le mode sombre universel", 255 "settings.app.form.universalDarkMode": "Activer le mode sombre universel",
338 "settings.app.form.useTouchIdToUnlock": "Autoriser l'utilisation de TouchID pour déverrouiller Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Autoriser l'utilisation de TouchID pour déverrouiller Ferdi",
339 "settings.app.form.useVerticalStyle": "Utiliser le style vertical", 257 "settings.app.form.useVerticalStyle": "Utiliser le style vertical",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Paramètres", 259 "settings.app.headline": "Paramètres",
341 "settings.app.headlineAdvanced": "Paramètres avancés", 260 "settings.app.headlineAdvanced": "Paramètres avancés",
342 "settings.app.headlineAppearance": "Apparence", 261 "settings.app.headlineAppearance": "Apparence",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "Par défaut, Ferdi gardera tous vos services ouverts et chargés en arrière-plan afin qu'ils soient prêts lorsque vous voulez les utiliser. Le service d'hibernation déchargera vos services après un montant spécifié. Ceci est utile pour sauver de la RAM ou garder les services de ralentir votre ordinateur.", 266 "settings.app.hibernateInfo": "Par défaut, Ferdi gardera tous vos services ouverts et chargés en arrière-plan afin qu'ils soient prêts lorsque vous voulez les utiliser. Le service d'hibernation déchargera vos services après un montant spécifié. Ceci est utile pour sauver de la RAM ou garder les services de ralentir votre ordinateur.",
348 "settings.app.inactivityLockInfo": "Minutes d'inactivité, après lesquelles Ferdi devrait se verrouiller automatiquement. Utilisez 0 pour désactiver", 267 "settings.app.inactivityLockInfo": "Minutes d'inactivité, après lesquelles Ferdi devrait se verrouiller automatiquement. Utilisez 0 pour désactiver",
349 "settings.app.languageDisclaimer": "Les traductions officielles sont l'anglais et l'allemand. Toutes les autres langues sont des traductions faites par la communauté.", 268 "settings.app.languageDisclaimer": "Les traductions officielles sont l'anglais et l'allemand. Toutes les autres langues sont des traductions faites par la communauté.",
350 "settings.app.lockInfo": "Le mot de passe de verrouillage de Ferdi vous permet de garder vos messages protégés.\nEn utilisant le mot de passe de verrouillage de Ferdi, vous allez être demandé de rentrer un mot de passe à chaque fois que vous démarré Ferdi ou verrouillé Ferdi vous même avec le symbole de cadenas en bas à gauche dans le coins ou avec le raccourcie CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Mot de passe", 270 "settings.app.lockedPassword": "Mot de passe",
352 "settings.app.lockedPasswordInfo": "S'il vous plaît soyez sûre de mettre un mot de passe que vous allez vous rappelez.\nSi vous perdez ce mot de passe vous allez devoir réinstaller Ferdi.", 271 "settings.app.lockedPasswordInfo": "S'il vous plaît soyez sûre de mettre un mot de passe que vous allez vous rappelez.\nSi vous perdez ce mot de passe vous allez devoir réinstaller Ferdi.",
353 "settings.app.restartRequired": "Les modifications nécessitent un redémarrage", 272 "settings.app.restartRequired": "Les modifications nécessitent un redémarrage",
354 "settings.app.scheduledDNDInfo": "Planifier le Ne-pas-Déranger vous permet de définir une période de temps dans lequel vous ne voulez pas de notifications de Ferdi.", 273 "settings.app.scheduledDNDInfo": "Planifier le Ne-pas-Déranger vous permet de définir une période de temps dans lequel vous ne voulez pas de notifications de Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Le temps est en format 24 heures. La fin du temps peut être avant le début du temps (ex: début 17:00, fin 09:00) pour activer le Ne-pas-Déranger durant la nuit.", 274 "settings.app.scheduledDNDTimeInfo": "Le temps est en format 24 heures. La fin du temps peut être avant le début du temps (ex: début 17:00, fin 09:00) pour activer le Ne-pas-Déranger durant la nuit.",
356 "settings.app.sentryInfo": "L'envoi de données de télémétrie nous permet de trouver des erreurs dans Ferdi - nous n'enverrons aucune information personnelle comme vos données de message! La modification de cette option nécessite le redémarrage de Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi utilise le correcteur orthographique intégré de votre Mac pour vérifier les fautes de frappe. Si vous voulez changer les langues pour lesquelles le correcteur vérifie l'orthographe, vous pouvez le faire dans les préférences système de votre Mac.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi utilise le correcteur orthographique intégré de votre Mac pour vérifier les fautes de frappe. Si vous voulez changer les langues pour lesquelles le correcteur vérifie l'orthographe, vous pouvez le faire dans les préférences système de votre Mac.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "Ce serveur sera utilisé pour la fonctionnalité \"Ferdi Todo\".", 278 "settings.app.todoServerInfo": "Ce serveur sera utilisé pour la fonctionnalité \"Ferdi Todo\".",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Ouvrir le dossier", 300 "settings.recipes.customService.openFolder": "Ouvrir le dossier",
382 "settings.recipes.headline": "Services disponibles", 301 "settings.recipes.headline": "Services disponibles",
383 "settings.recipes.missingService": "Un service est manquant?", 302 "settings.recipes.missingService": "Un service est manquant?",
384 "settings.recipes.mostPopular": "Les plus populaires",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Le service a été ajouté avec succès", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Le service a été ajouté avec succès",
387 "settings.searchService": "Chercher un service", 305 "settings.searchService": "Chercher un service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Ajouter {name}", 309 "settings.service.form.addServiceHeadline": "Ajouter {name}",
392 "settings.service.form.availableServices": "Services disponibles", 310 "settings.service.form.availableServices": "Services disponibles",
393 "settings.service.form.customUrl": "Serveur personnalisé", 311 "settings.service.form.customUrl": "Serveur personnalisé",
394 "settings.service.form.customUrlPremiumInfo": "Pour ajouter des services auto-hébergés, vous avez besoin d'un compte Ferdi Premium Supporter.",
395 "settings.service.form.customUrlUpgradeAccount": "Améliorez votre compte",
396 "settings.service.form.customUrlValidationError": "Impossible de valider le serveur modifié {name}.", 312 "settings.service.form.customUrlValidationError": "Impossible de valider le serveur modifié {name}.",
397 "settings.service.form.darkReaderBrightness": "Luminosité de Dark Reader", 313 "settings.service.form.darkReaderBrightness": "Luminosité de Dark Reader",
398 "settings.service.form.darkReaderContrast": "Contraste de Dark Reader", 314 "settings.service.form.darkReaderContrast": "Contraste de Dark Reader",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Gestion d'équipe Franz", 378 "settings.team.contentHeadline": "Gestion d'équipe Franz",
463 "settings.team.copy": "La gestion d'équipe de Franz vous permet de gérer les abonnements Franz pour plusieurs utilisateurs. N’oubliez pas que le fait d’avoir un abonnement Franz Premium ne vous donnera aucun avantage dans l'utilisation de Ferdi : la seule raison pour laquelle vous avez encore accès à la gestion d’équipe est que vous pouvez gérer vos équipes Franz héritées et que vous ne perdez donc aucune fonctionnalité dans la gestion de votre compte.", 379 "settings.team.copy": "La gestion d'équipe de Franz vous permet de gérer les abonnements Franz pour plusieurs utilisateurs. N’oubliez pas que le fait d’avoir un abonnement Franz Premium ne vous donnera aucun avantage dans l'utilisation de Ferdi : la seule raison pour laquelle vous avez encore accès à la gestion d’équipe est que vous pouvez gérer vos équipes Franz héritées et que vous ne perdez donc aucune fonctionnalité dans la gestion de votre compte.",
464 "settings.team.headline": "Équipe", 380 "settings.team.headline": "Équipe",
465 "settings.team.intro": "Vous utilisez actuellement les serveurs Franz, c'est pourquoi vous avez accès à la gestion d'équipe.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Gérez votre équipe sur meetfranz.com", 382 "settings.team.manageAction": "Gérez votre équipe sur meetfranz.com",
467 "settings.team.teamsUnavailable": "Les équipes sont indisponibles", 383 "settings.team.teamsUnavailable": "Les équipes sont indisponibles",
468 "settings.team.teamsUnavailableInfo": "Les équipes sont actuellement disponibles uniquement lorsque vous utilisez le serveur de Franz et après avoir payé pour Franz Professionnel. Veuillez changer votre serveur à https://api.franzinfra.com pour utiliser des équipes.", 384 "settings.team.teamsUnavailableInfo": "Les équipes sont actuellement disponibles uniquement lorsque vous utilisez le serveur de Franz et après avoir payé pour Franz Professionnel. Veuillez changer votre serveur à https://api.franzinfra.com pour utiliser des équipes.",
469 "settings.team.upgradeAction": "Améliorez votre compte",
470 "settings.user.form.accountType.company": "Entreprise", 385 "settings.user.form.accountType.company": "Entreprise",
471 "settings.user.form.accountType.individual": "Individuel", 386 "settings.user.form.accountType.individual": "Individuel",
472 "settings.user.form.accountType.label": "Type de compte", 387 "settings.user.form.accountType.label": "Type de compte",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Vous avez déjà un compte? Connectez-vous", 431 "signup.link.login": "Vous avez déjà un compte? Connectez-vous",
517 "signup.password.label": "Mot de passe", 432 "signup.password.label": "Mot de passe",
518 "signup.submit.label": "Créer un compte", 433 "signup.submit.label": "Créer un compte",
519 "subscription.bestValue": "Le meilleur prix",
520 "subscription.cta.activateTrial": "Oui, commencer l'essai gratuit de Ferdi Professionnel",
521 "subscription.cta.allOptions": "Voir toutes les options",
522 "subscription.cta.choosePlan": "Choisissez votre plan",
523 "subscription.includedProFeatures": "Le plan Ferdi Professionnel inclus:",
524 "subscription.interval.per": "par {interval}",
525 "subscription.interval.perMonth": "par mois",
526 "subscription.interval.perMonthPerUser": "par mois et utilisateur",
527 "subscription.planItem.upgradeAccount": "Améliorez votre compte",
528 "subscription.teaser.includedFeatures": "Les plans de Ferdi payés inclus:",
529 "subscription.teaser.intro": "Ferdi 5 viens avec une large plage de nouvelles fonctionnalités pour renforcer votre communication quotidienne - batteries inclus. Aller voir nos nouveaux plans et trouver celui qui vous satisfait le mieux!",
530 "subscriptionPopup.buttonCancel": "Annuler",
531 "subscriptionPopup.buttonDone": "Terminé",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Supprimer le service", 435 "tabs.item.deleteService": "Supprimer le service",
534 "tabs.item.disableAudio": "Désactiver l'audio", 436 "tabs.item.disableAudio": "Désactiver l'audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Désactiver les notifications", 438 "tabs.item.disableNotifications": "Désactiver les notifications",
536 "tabs.item.disableService": "Désactiver le service", 439 "tabs.item.disableService": "Désactiver le service",
537 "tabs.item.edit": "Éditer", 440 "tabs.item.edit": "Éditer",
538 "tabs.item.enableAudio": "Activer l'audio", 441 "tabs.item.enableAudio": "Activer l'audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Activer les notifications", 443 "tabs.item.enableNotification": "Activer les notifications",
540 "tabs.item.enableService": "Activer le service", 444 "tabs.item.enableService": "Activer le service",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Actualiser", 446 "tabs.item.reload": "Actualiser",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} n'est pas valide", 448 "validation.email": "{field} n'est pas valide",
543 "validation.minLength": "{field} doit contenir au moins {length} caractère(s)", 449 "validation.minLength": "{field} doit contenir au moins {length} caractère(s)",
544 "validation.oneRequired": "Au moins un de ces champs est requis", 450 "validation.oneRequired": "Au moins un de ces champs est requis",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Espace de travail", 462 "workspaceDrawer.headline": "Espace de travail",
557 "workspaceDrawer.item.contextMenuEdit": "Modifier", 463 "workspaceDrawer.item.contextMenuEdit": "Modifier",
558 "workspaceDrawer.item.noServicesAddedYet": "Aucun services ajoutés pour l'instant", 464 "workspaceDrawer.item.noServicesAddedYet": "Aucun services ajoutés pour l'instant",
559 "workspaceDrawer.premiumCtaButtonLabel": "Créez votre premier espace de travail",
560 "workspaceDrawer.proFeatureBadge": "Fonctionnalité premium",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Réactivez votre compte premium",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Les Espaces de travail de Ferdi vous permettant de rester concentré sur ce qui est important. Créez différents groupes de services et naviguez facilement entre eux à n'importe quel moment.</p><p>Vous décidez de quels services vous avez besoin, où et quand, ainsi nous pouvons vous aider à rester concentré sur votre travail - ou à le quitter dès que vous le souhaitez.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Les Espaces de travail de Ferdi vous permettant de rester concentré sur ce qui est important. Créez différents groupes de services et naviguez facilement entre eux à n'importe quel moment.</p><p>Vous décidez de quels services vous avez besoin, où et quand, ainsi nous pouvons vous aider à rester concentré sur votre travail - ou à le quitter dès que vous le souhaitez.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Éditer les paramètres de l'espace de travail", 466 "workspaceDrawer.workspacesSettingsTooltip": "Éditer les paramètres de l'espace de travail",
564 "workspaces.switchingIndicator.switchingTo": "Changement vers" 467 "workspaces.switchingIndicator.switchingTo": "Changement vers"
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index 7c93c8a63..cc7715e03 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cealaigh", 16 "feature.nightlyBuilds.cancel": "Cealaigh",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Ní féidir nascadh le seirbhísí Ferdi ar líne", 36 "global.api.unhealthy": "Ní féidir nascadh le seirbhísí Ferdi ar líne",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "Níl tú nasctha leis an Idirlíon.", 37 "global.notConnectedToTheInternet": "Níl tú nasctha leis an Idirlíon.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Iompórtáil do sheirbhísí Ferdi 4", 44 "import.headline": "Iompórtáil do sheirbhísí Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Cuir Ferdi i bhfolach", 52 "infobar.hide": "Cuir Ferdi i bhfolach",
89 "infobar.requiredRequestsFailed": "Ní féidir seirbhísí agus eolas úsáideora a lódáil", 53 "infobar.requiredRequestsFailed": "Ní féidir seirbhísí agus eolas úsáideora a lódáil",
90 "infobar.servicesUpdated": "Nuashonraíodh do sheirbhísí.", 54 "infobar.servicesUpdated": "Nuashonraíodh do sheirbhísí.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Tá nuashonrú nua do Ferdi ar fáil.", 55 "infobar.updateAvailable": "Tá nuashonrú nua do Ferdi ar fáil.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Seoladh ríomhphoist", 57 "invite.email.label": "Seoladh ríomhphoist",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "Cuardaigh le nuashonruithe", 88 "menu.app.checkForUpdates": "Cuardaigh le nuashonruithe",
126 "menu.app.hide": "Cuir Ferdi i bhfolach", 89 "menu.app.hide": "Cuir Ferdi i bhfolach",
127 "menu.app.hideOthers": "Folaigh feidhmchláir eile", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Scoir", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Socruithe", 92 "menu.app.settings": "Socruithe",
130 "menu.app.unhide": "Taispeáin", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Cuir in eagar", 94 "menu.edit": "Cuir in eagar",
132 "menu.edit.copy": "Cóipeáil", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Gearr", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Scrios", 97 "menu.edit.delete": "Scrios",
135 "menu.edit.emojiSymbols": "Straoiseoga ⁊ siombailí", 98 "menu.edit.emojiSymbols": "Straoiseoga ⁊ siombailí",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Greamaigh", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Greamaigh agus cuir stíl in oiriúint", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Athdhéan", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Roghnaigh gach rud", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Caint", 104 "menu.edit.speech": "Caint",
142 "menu.edit.startDictation": "Tosaigh deachtú", 105 "menu.edit.startDictation": "Tosaigh deachtú",
143 "menu.edit.startSpeaking": "Tosaigh ag caint", 106 "menu.edit.startSpeaking": "Tosaigh ag caint",
144 "menu.edit.stopSpeaking": "Stad ag caint", 107 "menu.edit.stopSpeaking": "Stad ag caint",
145 "menu.edit.undo": "Cealaigh", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Comhad", 109 "menu.file": "Comhad",
147 "menu.help": "Cabhair", 110 "menu.help": "Help",
148 "menu.help.changelog": "Athruithe", 111 "menu.help.changelog": "Athruithe",
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Tuilleadh eolais", 116 "menu.help.learnMore": "Tuilleadh eolais",
153 "menu.help.privacy": "Ráiteas phríobháideachais", 117 "menu.help.privacy": "Ráiteas phríobháideachais",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Amharc", 128 "menu.view": "Amharc",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Cuir isteach mód lánscáileáin",
167 "menu.view.exitFullScreen": "Scoir mód lánscáileáin",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Athlódáil Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Athlódáil seirbhís", 134 "menu.view.reloadService": "Athlódáil seirbhís",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Fíormhéid", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Toggle Dark Mode", 137 "menu.view.toggleDarkMode": "Toggle Dark Mode",
176 "menu.view.toggleDevTools": "Scoránaigh uirlis forbróra", 138 "menu.view.toggleDevTools": "Scoránaigh uirlis forbróra",
177 "menu.view.toggleFullScreen": "Scoránaigh mód lánscáileáin", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Scoránaigh uirlis forbróra seirbhíse", 140 "menu.view.toggleServiceDevTools": "Scoránaigh uirlis forbróra seirbhíse",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "Zúmáil isteach", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Zúmáil amach", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Fuinneog", 144 "menu.window": "Window",
183 "menu.window.close": "Dún", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Íoslaghdaigh", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Workspaces", 147 "menu.workspaces": "Workspaces",
186 "menu.workspaces.addNewWorkspace": "Add New Workspace...", 148 "menu.workspaces.addNewWorkspace": "Add New Workspace...",
187 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer", 149 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer",
@@ -194,11 +156,7 @@
194 "password.noUser": "Níor aimsíodh úsáideoir leis an seoladh ríomhphoist seo", 156 "password.noUser": "Níor aimsíodh úsáideoir leis an seoladh ríomhphoist seo",
195 "password.submit.label": "Cuir isteach", 157 "password.submit.label": "Cuir isteach",
196 "password.successInfo": "Seiceáil do chuid ríomhphoist le do thoil", 158 "password.successInfo": "Seiceáil do chuid ríomhphoist le do thoil",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Athlódáil {name}", 170 "service.crashHandler.action": "Athlódáil {name}",
236 "service.crashHandler.autoReload": "Ag iarraidh {name} a thabhairt ar ais go huathoibríoch i gceann {seconds} shoicind", 171 "service.crashHandler.autoReload": "Ag iarraidh {name} a thabhairt ar ais go huathoibríoch i gceann {seconds} shoicind",
237 "service.crashHandler.headline": "Oró, ní hea!", 172 "service.crashHandler.headline": "Oró, ní hea!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oró, ní hea!", 178 "service.errorHandler.headline": "Oró, ní hea!",
244 "service.errorHandler.message": "Earráid", 179 "service.errorHandler.message": "Earráid",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Cuir tús", 182 "services.getStarted": "Cuir tús",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Fáilte go Ferdi", 186 "services.welcome": "Fáilte go Ferdi",
257 "settings.account.account.editButton": "Cuir cuntas in eagar", 187 "settings.account.account.editButton": "Cuir cuntas in eagar",
258 "settings.account.accountType.basic": "Bunchuntas",
259 "settings.account.accountType.premium": "Cuntas Phŕeimhthacadóra Ferdi",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Nuashonraigh próifíl", 190 "settings.account.buttonSave": "Nuashonraigh próifíl",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Sonraisc", 197 "settings.account.headlineInvoices": "Sonraisc",
270 "settings.account.headlinePassword": "Athraigh pasfhocal", 198 "settings.account.headlinePassword": "Athraigh pasfhocal",
271 "settings.account.headlineProfile": "Nuashonraigh próifíl", 199 "settings.account.headlineProfile": "Nuashonraigh próifíl",
272 "settings.account.headlineSubscription": "Do shíntiús",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Íoslódáil",
276 "settings.account.manageSubscription.label": "Bainistigh do shíntiús",
277 "settings.account.successInfo": "Sábháladh do chuid athruithe", 200 "settings.account.successInfo": "Sábháladh do chuid athruithe",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Atriail", 201 "settings.account.tryReloadServices": "Atriail",
282 "settings.account.tryReloadUserInfoRequest": "Atriail", 202 "settings.account.tryReloadUserInfoRequest": "Atriail",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Ní féidir eolas úsáideora a lódáil", 203 "settings.account.userInfoRequestFailed": "Ní féidir eolas úsáideora a lódáil",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Cumasaigh seiceáil litrithe", 227 "settings.app.form.enableSpellchecking": "Cumasaigh seiceáil litrithe",
309 "settings.app.form.enableSystemTray": "Taispeáin Ferdi i dtráidire an chórais", 228 "settings.app.form.enableSystemTray": "Taispeáin Ferdi i dtráidire an chórais",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Socruithe", 259 "settings.app.headline": "Socruithe",
341 "settings.app.headlineAdvanced": "Casta", 260 "settings.app.headlineAdvanced": "Casta",
342 "settings.app.headlineAppearance": "Dealramh", 261 "settings.app.headlineAppearance": "Dealramh",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Ní gá atosú chun athruithe a chur i bhfeidhm.", 272 "settings.app.restartRequired": "Ní gá atosú chun athruithe a chur i bhfeidhm.",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Taisce", 277 "settings.app.subheadlineCache": "Taisce",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Seirbhísí le fáil", 301 "settings.recipes.headline": "Seirbhísí le fáil",
383 "settings.recipes.missingService": "Seirbhís ar iarraidh?", 302 "settings.recipes.missingService": "Seirbhís ar iarraidh?",
384 "settings.recipes.mostPopular": "Is coitianta",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Seirbhís curtha go rathúil", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Seirbhís curtha go rathúil",
387 "settings.searchService": "Cuardaigh seirbhís", 305 "settings.searchService": "Cuardaigh seirbhís",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Cuir {name} leis", 309 "settings.service.form.addServiceHeadline": "Cuir {name} leis",
392 "settings.service.form.availableServices": "Seirbhísí le fáil", 310 "settings.service.form.availableServices": "Seirbhísí le fáil",
393 "settings.service.form.customUrl": "Freastalaí saincheaptha", 311 "settings.service.form.customUrl": "Freastalaí saincheaptha",
394 "settings.service.form.customUrlPremiumInfo": "Chun seirbhísí féinóstáilte a chur le Ferdi, ní gá Cuntas Phŕeimhthacadóra Ferdi a bheith agat.",
395 "settings.service.form.customUrlUpgradeAccount": "Uasghrádaigh do chuntas",
396 "settings.service.form.customUrlValidationError": "Ní féidir seirbhís {name} saincheaptha a dheimhniú", 312 "settings.service.form.customUrlValidationError": "Ní féidir seirbhís {name} saincheaptha a dheimhniú",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Foireann", 380 "settings.team.headline": "Foireann",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Comhlacht", 385 "settings.user.form.accountType.company": "Comhlacht",
471 "settings.user.form.accountType.individual": "Ar leith", 386 "settings.user.form.accountType.individual": "Ar leith",
472 "settings.user.form.accountType.label": "Cineál chuntais", 387 "settings.user.form.accountType.label": "Cineál chuntais",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Cuntas agat cheana féin, logáil isteach?", 431 "signup.link.login": "Cuntas agat cheana féin, logáil isteach?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Cruthaigh cuntas", 433 "signup.submit.label": "Cruthaigh cuntas",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Cealaigh",
531 "subscriptionPopup.buttonDone": "Déanta",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Scrios seirbhís", 435 "tabs.item.deleteService": "Scrios seirbhís",
534 "tabs.item.disableAudio": "Díchumasaigh fuaim", 436 "tabs.item.disableAudio": "Díchumasaigh fuaim",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Díchumasaigh fógraí", 438 "tabs.item.disableNotifications": "Díchumasaigh fógraí",
536 "tabs.item.disableService": "Díchumasaigh seirbhís", 439 "tabs.item.disableService": "Díchumasaigh seirbhís",
537 "tabs.item.edit": "Cuir in eagar", 440 "tabs.item.edit": "Cuir in eagar",
538 "tabs.item.enableAudio": "Cumasaigh fuaim", 441 "tabs.item.enableAudio": "Cumasaigh fuaim",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Cumasaigh fógraí", 443 "tabs.item.enableNotification": "Cumasaigh fógraí",
540 "tabs.item.enableService": "Cumasaigh seirbhís", 444 "tabs.item.enableService": "Cumasaigh seirbhís",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Athlódáil", 446 "tabs.item.reload": "Athlódáil",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "Níl {field} neamhbhailí", 448 "validation.email": "Níl {field} neamhbhailí",
543 "validation.minLength": "Ba cheart go mbeadh {field} ar a laghad {length} charactar fada", 449 "validation.minLength": "Ba cheart go mbeadh {field} ar a laghad {length} charactar fada",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/he.json b/src/i18n/locales/he.json
index 3b25c293e..fcba1f459 100644
--- a/src/i18n/locales/he.json
+++ b/src/i18n/locales/he.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "הו לא! פרדי איבד את החיבור ל {name}.", 12 "connectionLostBanner.message": "הו לא! פרדי איבד את החיבור ל {name}.",
13 "feature.announcements.changelog.headline": "שינויים בגרסת פרדי מספר {version}", 13 "feature.announcements.changelog.headline": "שינויים בגרסת פרדי מספר {version}",
14 "feature.debugger.title": "פרסם את פרטי ניפוי השגיאות", 14 "feature.debugger.title": "פרסם את פרטי ניפוי השגיאות",
15 "feature.delayApp.headline": "אנא קנה את גרסת התומכים כדי לדלג על ההמתנה",
16 "feature.delayApp.text": "פרדי ימשיך בעוד {seconds} שניות.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "קבל רישיון תומכים של פרדי",
21 "feature.delayApp.upgrade.actionShort": "שדרג חשבון",
22 "feature.nightlyBuilds.activate": "הפעל", 15 "feature.nightlyBuilds.activate": "הפעל",
23 "feature.nightlyBuilds.cancel": "בטל", 16 "feature.nightlyBuilds.cancel": "בטל",
24 "feature.nightlyBuilds.info": "גרסאות נייטלי הם גרסאות נסיוניות ביותר של פרדי, העשויות להכיל פיצ'רים בלתי גמורים. גרסאות אלה מיועדות בעיקר לשימוש מפתחים על מנת לנסות את הפיצ'רים החדשים הנמצאים בפיתוח - לפני הכנסתם לגרסה הסופית. אם אתה לא יודע מה אתה עושה, אנו ממליצים שלא תפעיל את האופציה הזאת.", 17 "feature.nightlyBuilds.info": "גרסאות נייטלי הם גרסאות נסיוניות ביותר של פרדי, העשויות להכיל פיצ'רים בלתי גמורים. גרסאות אלה מיועדות בעיקר לשימוש מפתחים על מנת לנסות את הפיצ'רים החדשים הנמצאים בפיתוח - לפני הכנסתם לגרסה הסופית. אם אתה לא יודע מה אתה עושה, אנו ממליצים שלא תפעיל את האופציה הזאת.",
25 "feature.nightlyBuilds.title": "גרסאות נייטלי", 18 "feature.nightlyBuilds.title": "גרסאות נייטלי",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "קיימת שגיאה בפרסום מידע ניפוי השגיאות, אנא נסה שנית מאוחר יותר או הסתכל בקובץ הלוג למידע נוסף.", 19 "feature.publishDebugInfo.error": "קיימת שגיאה בפרסום מידע ניפוי השגיאות, אנא נסה שנית מאוחר יותר או הסתכל בקובץ הלוג למידע נוסף.",
43 "feature.publishDebugInfo.info": "פרסום מידע ניפוי השגיאות עוזר לנו למצוא ולטפל בבאגים בפרדי. בפרסום מידע ניפוי השגיאות הנך מסכים למדיניות הפרטיות ותנאי השימוש של מפתחי פרדי", 20 "feature.publishDebugInfo.info": "פרסום מידע ניפוי השגיאות עוזר לנו למצוא ולטפל בבאגים בפרדי. בפרסום מידע ניפוי השגיאות הנך מסכים למדיניות הפרטיות ותנאי השימוש של מפתחי פרדי",
44 "feature.publishDebugInfo.privacy": "מדיניות הפרטיות", 21 "feature.publishDebugInfo.privacy": "מדיניות הפרטיות",
@@ -49,48 +26,34 @@
49 "feature.quickSwitch.info": "בחר שירות עם מקש ה TAB, ↑ ו ↓. פתח שירות באמצעות מקש ה ENTER.", 26 "feature.quickSwitch.info": "בחר שירות עם מקש ה TAB, ↑ ו ↓. פתח שירות באמצעות מקש ה ENTER.",
50 "feature.quickSwitch.search": "חיפוש...", 27 "feature.quickSwitch.search": "חיפוש...",
51 "feature.quickSwitch.title": "החלפה מהירה", 28 "feature.quickSwitch.title": "החלפה מהירה",
52 "feature.serviceLimit.limitReached": "הוספת {amount} מתוך {limit} שירותים האפשריים בגרסה שלך. אנא שדרג את החשבון שלך על מנת להוסיף שירותים נוספים.",
53 "feature.shareFranz.action.email": "שלח בתור אימייל", 29 "feature.shareFranz.action.email": "שלח בתור אימייל",
54 "feature.shareFranz.action.facebook": "שיתוף ב-Facebook", 30 "feature.shareFranz.action.facebook": "שיתוף ב-Facebook",
55 "feature.shareFranz.action.twitter": "שתף בטוויטר", 31 "feature.shareFranz.action.twitter": "שתף בטוויטר",
56 "feature.shareFranz.headline": "פרדי מוצלחת יותר ביחד!", 32 "feature.shareFranz.headline": "פרדי מוצלחת יותר ביחד!",
57 "feature.shareFranz.shareText.email": "הוספתי {count} שירותים לפרדי! קבל את האפליקציה בחינם עבור ווטסאפ, מסנג'ר, סלאק, סקייפ ועוד ב www.getferdi.com", 33 "feature.shareFranz.shareText.email": "הוספתי {count} שירותים לפרדי! קבל את האפליקציה בחינם עבור ווטסאפ, מסנג'ר, סלאק, סקייפ ועוד ב www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "הוספתי {count} שירותים לפרדי! קבל את האפליקציה בחינם עבור ווטסאפ, מסנג'ר, סלאק, סקייפ ועוד ב www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "הוספתי {count} שירותים לפרדי! קבל את האפליקציה בחינם עבור ווטסאפ, מסנג'ר, סלאק, סקייפ ועוד ב www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "ספר לחבריך ולעמיתיך כמה Ferdi הוא מדהים ועזור לנו להפיץ את הבשורה.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!", 36 "global.api.unhealthy": "לא ניתן להתחבר לשרותי האינטרנת של Ferdi",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "שדרוג חשבון",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Can't connect to Ferdi online services",
71 "global.franzProRequired": "נדרשת גרסת פרדי מקצועית",
72 "global.notConnectedToTheInternet": "נראה שאתה לא מחובר לאינטרנט.", 37 "global.notConnectedToTheInternet": "נראה שאתה לא מחובר לאינטרנט.",
73 "global.spellchecker.useDefault": "השתמש בברירת המחדל של המערכת ({default})", 38 "global.spellchecker.useDefault": "השתמש בברירת המחדל של המערכת ({default})",
74 "global.spellchecking.autodetect": "זהה שפה באופן אוטומטי", 39 "global.spellchecking.autodetect": "זהה שפה באופן אוטומטי",
75 "global.spellchecking.autodetect.short": "אוטומטי", 40 "global.spellchecking.autodetect.short": "אוטומטי",
76 "global.spellchecking.language": "שפה לבדיקת איות", 41 "global.spellchecking.language": "שפה לבדיקת איות",
77 "global.upgradeButton.upgradeToPro": "שדרג לגרסת פרדי מקצועית",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "סוכן משתמש",
80 "import.headline": "ייבא את השירותים שלך מפרדי גרסה 4", 44 "import.headline": "ייבא את השירותים שלך מפרדי גרסה 4",
81 "import.notSupportedHeadline": "השירות עדיין אינו נתמך בפרדי גרסה 5", 45 "import.notSupportedHeadline": "השירות עדיין אינו נתמך בפרדי גרסה 5",
82 "import.skip.label": "אני רוצה להוסיף שירותים באופן ידני", 46 "import.skip.label": "אני רוצה להוסיף שירותים באופן ידני",
83 "import.submit.label": "ייבא שירותים", 47 "import.submit.label": "ייבא שירותים",
84 "infobar.authRequestFailed": "There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 48 "infobar.authRequestFailed": "אירעה שגיאה בניסיון ההתחברות. נסה להתנתק ולהתחבר מחדש.",
85 "infobar.buttonChangelog": "מה חדש?", 49 "infobar.buttonChangelog": "מה חדש?",
86 "infobar.buttonInstallUpdate": "הפעל מחדש והתקן עדכונים", 50 "infobar.buttonInstallUpdate": "הפעל מחדש והתקן עדכונים",
87 "infobar.buttonReloadServices": "טען מחדש את השירותים", 51 "infobar.buttonReloadServices": "טען מחדש את השירותים",
88 "infobar.hide": "הסתר", 52 "infobar.hide": "הסתר",
89 "infobar.requiredRequestsFailed": "לא ניתן לטעון את השירותים ואת מידע המשתמש", 53 "infobar.requiredRequestsFailed": "לא ניתן לטעון את השירותים ואת מידע המשתמש",
90 "infobar.servicesUpdated": "השירותים שלך עודכנו.", 54 "infobar.servicesUpdated": "השירותים שלך עודכנו.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "עדכון חדש לפרדי זמין.", 55 "infobar.updateAvailable": "עדכון חדש לפרדי זמין.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "בטל",
94 "invite.email.label": "כתובת דוא\"ל", 57 "invite.email.label": "כתובת דוא\"ל",
95 "invite.headline.friends": "הזמן 3 מחבריך", 58 "invite.headline.friends": "הזמן 3 מחבריך",
96 "invite.name.label": "שם", 59 "invite.name.label": "שם",
@@ -98,7 +61,7 @@
98 "invite.submit.label": "שלח הזמנות", 61 "invite.submit.label": "שלח הזמנות",
99 "invite.successInfo": "ההזמנות נשלחו בהצלחה", 62 "invite.successInfo": "ההזמנות נשלחו בהצלחה",
100 "locked.headline": "נעול", 63 "locked.headline": "נעול",
101 "locked.info": "Ferdi is currently locked. Please unlock Ferdi with your password to see your messages.", 64 "locked.info": "Ferdi נעול כרגע. אנא בטל את נעילת Ferdi באמצעות הסיסמה כדי לראות את ההודעות שלך.",
102 "locked.invalidCredentials": "הסיסמא אינה תקינה", 65 "locked.invalidCredentials": "הסיסמא אינה תקינה",
103 "locked.password.label": "סיסמא", 66 "locked.password.label": "סיסמא",
104 "locked.submit.label": "בטל נעילה", 67 "locked.submit.label": "בטל נעילה",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "הסתרת שורת התפריטים באופן אוטומטי", 87 "menu.app.autohideMenuBar": "הסתרת שורת התפריטים באופן אוטומטי",
125 "menu.app.checkForUpdates": "חפש עדכונים", 88 "menu.app.checkForUpdates": "חפש עדכונים",
126 "menu.app.hide": "הסתר", 89 "menu.app.hide": "הסתר",
127 "menu.app.hideOthers": "הסתר את האחרים", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "יציאה", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "הגדרות", 92 "menu.app.settings": "הגדרות",
130 "menu.app.unhide": "בטל הסתרה", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "ערוך", 94 "menu.edit": "ערוך",
132 "menu.edit.copy": "העתק", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "גזור", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "מחק", 97 "menu.edit.delete": "מחק",
135 "menu.edit.emojiSymbols": "אימוג'ים וסמלים", 98 "menu.edit.emojiSymbols": "אימוג'ים וסמלים",
136 "menu.edit.findInPage": "חפש בדף", 99 "menu.edit.findInPage": "חפש בדף",
137 "menu.edit.paste": "הדבק", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "הדבק והתאם לסגנון", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "בצע שוב", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "בחר הכל", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "דיבור", 104 "menu.edit.speech": "דיבור",
142 "menu.edit.startDictation": "התחל הכתבה", 105 "menu.edit.startDictation": "התחל הכתבה",
143 "menu.edit.startSpeaking": "הקרא", 106 "menu.edit.startSpeaking": "הקרא",
144 "menu.edit.stopSpeaking": "הפסק הקראה", 107 "menu.edit.stopSpeaking": "הפסק הקראה",
145 "menu.edit.undo": "בטל", 108 "menu.edit.undo": "Undo",
146 "menu.file": "קובץ", 109 "menu.file": "קובץ",
147 "menu.help": "עזרה", 110 "menu.help": "Help",
148 "menu.help.changelog": "רשימת שינויים", 111 "menu.help.changelog": "רשימת שינויים",
149 "menu.help.debugInfo": "העתק פרטי ניפוי שגיאות", 112 "menu.help.debugInfo": "העתק פרטי ניפוי שגיאות",
150 "menu.help.debugInfoCopiedBody": "פרטי ניקוי השגיאות הועתקו בהצלחה ללוח.", 113 "menu.help.debugInfoCopiedBody": "פרטי ניקוי השגיאות הועתקו בהצלחה ללוח.",
151 "menu.help.debugInfoCopiedHeadline": "פרטי ניקוי השגיאות של פרדי", 114 "menu.help.debugInfoCopiedHeadline": "פרטי ניקוי השגיאות של פרדי",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "למידע נוסף", 116 "menu.help.learnMore": "למידע נוסף",
153 "menu.help.privacy": "הצהרת פרטיות", 117 "menu.help.privacy": "הצהרת פרטיות",
154 "menu.help.publishDebugInfo": "פרסם את פרטי ניפוי השגיאות", 118 "menu.help.publishDebugInfo": "פרסם את פרטי ניפוי השגיאות",
@@ -156,32 +120,30 @@
156 "menu.help.tos": "תנאי שימוש", 120 "menu.help.tos": "תנאי שימוש",
157 "menu.services": "שירותים", 121 "menu.services": "שירותים",
158 "menu.services.activatePreviousService": "הפעל את השירות הקודם", 122 "menu.services.activatePreviousService": "הפעל את השירות הקודם",
159 "menu.services.addNewService": "Add New Service", 123 "menu.services.addNewService": "הוסף שירות חדש",
160 "menu.services.goHome": "בית", 124 "menu.services.goHome": "בית",
161 "menu.services.setNextServiceActive": "הפעל את השירות הבא", 125 "menu.services.setNextServiceActive": "הפעל את השירות הבא",
162 "menu.todos": "משימות", 126 "menu.todos": "משימות",
163 "menu.todos.enableTodos": "אפשר משימות", 127 "menu.todos.enableTodos": "אפשר משימות",
164 "menu.view": "הצג", 128 "menu.view": "הצג",
165 "menu.view.back": "חזור", 129 "menu.view.back": "חזור",
166 "menu.view.enterFullScreen": "עבור למסך מלא",
167 "menu.view.exitFullScreen": "צא ממסך מלא",
168 "menu.view.forward": "קדימה", 130 "menu.view.forward": "קדימה",
169 "menu.view.lockFerdi": "נעל את פרדי", 131 "menu.view.lockFerdi": "נעל את פרדי",
170 "menu.view.openQuickSwitch": "פתח החלפה מהירה", 132 "menu.view.openQuickSwitch": "פתח החלפה מהירה",
171 "menu.view.reloadFranz": "טען מחדש את פרדי", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "טען מחדש את השירות", 134 "menu.view.reloadService": "טען מחדש את השירות",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "גודל אמיתי", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "הפעל\\בטל מצב לילה", 137 "menu.view.toggleDarkMode": "הפעל\\בטל מצב לילה",
176 "menu.view.toggleDevTools": "הצג/הסתר כלי פיתוח של משימות", 138 "menu.view.toggleDevTools": "הצג/הסתר כלי פיתוח של משימות",
177 "menu.view.toggleFullScreen": "הפעל/הפסק מצב מסך מלא", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "הצג/הסתר כלי פיתוח", 140 "menu.view.toggleServiceDevTools": "הצג/הסתר כלי פיתוח",
179 "menu.view.toggleTodosDevTools": "הצג/הסתר כלי פיתוח", 141 "menu.view.toggleTodosDevTools": "הצג/הסתר כלי פיתוח",
180 "menu.view.zoomIn": "התמקד", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "התרחק", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "חלון", 144 "menu.window": "Window",
183 "menu.window.close": "סגור", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "מזער", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "סביבות עבודה", 147 "menu.workspaces": "סביבות עבודה",
186 "menu.workspaces.addNewWorkspace": "הוסף שירות חדש...", 148 "menu.workspaces.addNewWorkspace": "הוסף שירות חדש...",
187 "menu.workspaces.closeWorkspaceDrawer": "סגור את סרגל סביבות העבודה", 149 "menu.workspaces.closeWorkspaceDrawer": "סגור את סרגל סביבות העבודה",
@@ -194,11 +156,7 @@
194 "password.noUser": "לא נמצא משתמש עם כתובת הדוא\"ל הזאת", 156 "password.noUser": "לא נמצא משתמש עם כתובת הדוא\"ל הזאת",
195 "password.submit.label": "שלח", 157 "password.submit.label": "שלח",
196 "password.successInfo": "אנא בדוק את הדוא\"ל שלך", 158 "password.successInfo": "אנא בדוק את הדוא\"ל שלך",
197 "premiumFeature.button.upgradeAccount": "שדרג חשבון",
198 "pricing.features.accountSync": "סנכון החשבון", 159 "pricing.features.accountSync": "סנכון החשבון",
199 "pricing.features.adFree": "לעולם נטול פרסומות",
200 "pricing.features.appDelays": "ללא מסכי המתנה",
201 "pricing.features.appDelaysEnabled": "מסכי המתנה מדי פעם",
202 "pricing.features.customWebsites": "הוסף אתרים מותאמים אישית", 160 "pricing.features.customWebsites": "הוסף אתרים מותאמים אישית",
203 "pricing.features.desktopNotifications": "התראות שולחן העבודה", 161 "pricing.features.desktopNotifications": "התראות שולחן העבודה",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "ניהול צוות", 166 "pricing.features.teamManagement": "ניהול צוות",
209 "pricing.features.thirdPartyServices": "התקן שירותי צד שלישי", 167 "pricing.features.thirdPartyServices": "התקן שירותי צד שלישי",
210 "pricing.features.unlimitedServices": "הוסף שירותים בלי הגבלה", 168 "pricing.features.unlimitedServices": "הוסף שירותים בלי הגבלה",
211 "pricing.features.upToSixServices": "הוסף עד ל 6 שירותים",
212 "pricing.features.upToThreeServices": "הוסף עד ל 3 שירותים",
213 "pricing.features.workspaces": "סביבות עבודה", 169 "pricing.features.workspaces": "סביבות עבודה",
214 "pricing.plan.free": "פרדי חינמי",
215 "pricing.plan.legacy": "פרדי פרימיום",
216 "pricing.plan.personal": "פרדי אישי",
217 "pricing.plan.personal-monthly": "פרדי אישי לחודש",
218 "pricing.plan.personal-yearly": "פרדי אישי לשנה",
219 "pricing.plan.pro": "פרדי מקצועי",
220 "pricing.plan.pro-monthly": "פרדי מקצועי לחודש",
221 "pricing.plan.pro-yearly": "פרדי מקצועי לשנה",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "טען מחדש {name}", 170 "service.crashHandler.action": "טען מחדש {name}",
236 "service.crashHandler.autoReload": "מנסה לשחזר את {name} באופן אוטומטי בעוד {seconds} שניות", 171 "service.crashHandler.autoReload": "מנסה לשחזר את {name} באופן אוטומטי בעוד {seconds} שניות",
237 "service.crashHandler.headline": "הו, לא!", 172 "service.crashHandler.headline": "הו, לא!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "הו, לא!", 178 "service.errorHandler.headline": "הו, לא!",
244 "service.errorHandler.message": "שגיאה", 179 "service.errorHandler.message": "שגיאה",
245 "service.errorHandler.text": "{name} לא הצליח להיטען.", 180 "service.errorHandler.text": "{name} לא הצליח להיטען.",
246 "service.restrictedHandler.action": "שדרוג חשבון",
247 "service.restrictedHandler.customUrl.headline": "נדרשת גרסת פרדי מקצועית",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "הגעת למגבלת השירותים המירבית שלך.",
250 "service.restrictedHandler.serviceLimit.text": "אנא עדכן את החשבון שלך כדי להשתמש ביותר מ {count} שירותים.",
251 "service.webviewLoader.loading": "טוען את {service}", 181 "service.webviewLoader.loading": "טוען את {service}",
252 "services.getStarted": "התחל", 182 "services.getStarted": "התחל",
253 "services.login": "אנא התחבר כדי להשתמש בפרדי.", 183 "services.login": "אנא התחבר כדי להשתמש בפרדי.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "השתמש בפרדי ללא חשבון", 185 "services.serverless": "השתמש בפרדי ללא חשבון",
256 "services.welcome": "ברוך הבא לפרדי", 186 "services.welcome": "ברוך הבא לפרדי",
257 "settings.account.account.editButton": "ערוך את החשבון", 187 "settings.account.account.editButton": "ערוך את החשבון",
258 "settings.account.accountType.basic": "חשבון בסיסי",
259 "settings.account.accountType.premium": "חשבון פרימיום לתומכים",
260 "settings.account.accountUnavailable": "החשבון אינו זמין", 188 "settings.account.accountUnavailable": "החשבון אינו זמין",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "עדכן פרופיל", 190 "settings.account.buttonSave": "עדכן פרופיל",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "חשבוניות", 197 "settings.account.headlineInvoices": "חשבוניות",
270 "settings.account.headlinePassword": "שנה סיסמה", 198 "settings.account.headlinePassword": "שנה סיסמה",
271 "settings.account.headlineProfile": "עדכן פרופיל", 199 "settings.account.headlineProfile": "עדכן פרופיל",
272 "settings.account.headlineSubscription": "המנוי שלך",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "הורד",
276 "settings.account.manageSubscription.label": "נהל את המנוי שלך",
277 "settings.account.successInfo": "השינויים שלך נשמרו", 200 "settings.account.successInfo": "השינויים שלך נשמרו",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "נסה שוב", 201 "settings.account.tryReloadServices": "נסה שוב",
282 "settings.account.tryReloadUserInfoRequest": "נסה שוב", 202 "settings.account.tryReloadUserInfoRequest": "נסה שוב",
283 "settings.account.upgradeToPro.label": "שדרג לגרסת פרדי מקצועית",
284 "settings.account.userInfoRequestFailed": "אי אפשר לטעון את פרטי המשתמש", 203 "settings.account.userInfoRequestFailed": "אי אפשר לטעון את פרטי המשתמש",
285 "settings.account.yourLicense": "רישיון הפרדי שלך", 204 "settings.account.yourLicense": "רישיון הפרדי שלך",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "הפעל בדיקת איות", 227 "settings.app.form.enableSpellchecking": "הפעל בדיקת איות",
309 "settings.app.form.enableSystemTray": "הצג את פרדי בסרגל הכלים", 228 "settings.app.form.enableSystemTray": "הצג את פרדי בסרגל הכלים",
310 "settings.app.form.enableTodos": "אפשר את רשימת המשימות של Ferdi", 229 "settings.app.form.enableTodos": "אפשר את רשימת המשימות של Ferdi",
311 "settings.app.form.hibernate": "אפשר מצב שינה",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "גודל סמל השירות", 232 "settings.app.form.iconSize": "גודל סמל השירות",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "הגדרות", 259 "settings.app.headline": "הגדרות",
341 "settings.app.headlineAdvanced": "מתקדם", 260 "settings.app.headlineAdvanced": "מתקדם",
342 "settings.app.headlineAppearance": "תצוגה", 261 "settings.app.headlineAppearance": "תצוגה",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "סיסמא", 270 "settings.app.lockedPassword": "סיסמא",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "שינויים מצריכים הפעלה מחדש", 272 "settings.app.restartRequired": "שינויים מצריכים הפעלה מחדש",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "זיכרון מטמון", 277 "settings.app.subheadlineCache": "זיכרון מטמון",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "פתח תיקיה", 300 "settings.recipes.customService.openFolder": "פתח תיקיה",
382 "settings.recipes.headline": "שירותים זמינים", 301 "settings.recipes.headline": "שירותים זמינים",
383 "settings.recipes.missingService": "לא מוצא את השירות שלך?", 302 "settings.recipes.missingService": "לא מוצא את השירות שלך?",
384 "settings.recipes.mostPopular": "הפופולריים ביותר",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "השירות נוסף בהצלחה", 304 "settings.recipes.servicesSuccessfulAddedInfo": "השירות נוסף בהצלחה",
387 "settings.searchService": "חפש שירות", 305 "settings.searchService": "חפש שירות",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "הוסף {name}", 309 "settings.service.form.addServiceHeadline": "הוסף {name}",
392 "settings.service.form.availableServices": "שירותים זמינים", 310 "settings.service.form.availableServices": "שירותים זמינים",
393 "settings.service.form.customUrl": "שרת מותאם אישית", 311 "settings.service.form.customUrl": "שרת מותאם אישית",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "שדרג את החשבון שלך",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "צוות", 380 "settings.team.headline": "צוות",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "נהל את הצוות שלך ב meetfranz.com", 382 "settings.team.manageAction": "נהל את הצוות שלך ב meetfranz.com",
467 "settings.team.teamsUnavailable": "יכולת זו אינה זמינה", 383 "settings.team.teamsUnavailable": "יכולת זו אינה זמינה",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "שדרג את החשבון שלך",
470 "settings.user.form.accountType.company": "חברה", 385 "settings.user.form.accountType.company": "חברה",
471 "settings.user.form.accountType.individual": "יחיד", 386 "settings.user.form.accountType.individual": "יחיד",
472 "settings.user.form.accountType.label": "סוג חשבון", 387 "settings.user.form.accountType.label": "סוג חשבון",
@@ -516,29 +431,20 @@
516 "signup.link.login": "משתמש קיים? התחבר עכשיו", 431 "signup.link.login": "משתמש קיים? התחבר עכשיו",
517 "signup.password.label": "סיסמא", 432 "signup.password.label": "סיסמא",
518 "signup.submit.label": "צור חשבון", 433 "signup.submit.label": "צור חשבון",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "הצג את כל האפשרויות",
522 "subscription.cta.choosePlan": "בחר את התוכנית שלך",
523 "subscription.includedProFeatures": "גרסת פרדי המקצועית כוללת:",
524 "subscription.interval.per": "לכל {interval}",
525 "subscription.interval.perMonth": "לחודש",
526 "subscription.interval.perMonthPerUser": "לחודש \\ משתמש",
527 "subscription.planItem.upgradeAccount": "שדרוג חשבון",
528 "subscription.teaser.includedFeatures": "גרסאות פרדי בתשלום כוללות:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "בטל",
531 "subscriptionPopup.buttonDone": "הסתיים",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "מחק שירות", 435 "tabs.item.deleteService": "מחק שירות",
534 "tabs.item.disableAudio": "כבה אודיו", 436 "tabs.item.disableAudio": "כבה אודיו",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "כבה התראות", 438 "tabs.item.disableNotifications": "כבה התראות",
536 "tabs.item.disableService": "כבה שירות", 439 "tabs.item.disableService": "כבה שירות",
537 "tabs.item.edit": "ערוך", 440 "tabs.item.edit": "ערוך",
538 "tabs.item.enableAudio": "אפשר אודיו", 441 "tabs.item.enableAudio": "אפשר אודיו",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "אפשר התראות", 443 "tabs.item.enableNotification": "אפשר התראות",
540 "tabs.item.enableService": "אפשר שירות", 444 "tabs.item.enableService": "אפשר שירות",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "רענן", 446 "tabs.item.reload": "רענן",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "סביבות עבודה", 462 "workspaceDrawer.headline": "סביבות עבודה",
557 "workspaceDrawer.item.contextMenuEdit": "ערוך", 463 "workspaceDrawer.item.contextMenuEdit": "ערוך",
558 "workspaceDrawer.item.noServicesAddedYet": "לא נוספו שירותים…", 464 "workspaceDrawer.item.noServicesAddedYet": "לא נוספו שירותים…",
559 "workspaceDrawer.premiumCtaButtonLabel": "צור את סביבת העבודה הראשונה שלך",
560 "workspaceDrawer.proFeatureBadge": "תכונת פרימיום",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "הפעל מחדש את חשבון הפרמיום שלי",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "הגדרות סביבת עבודה", 466 "workspaceDrawer.workspacesSettingsTooltip": "הגדרות סביבת עבודה",
564 "workspaces.switchingIndicator.switchingTo": "מעבר ל" 467 "workspaces.switchingIndicator.switchingTo": "מעבר ל"
diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json
index 2372494e5..a4e4e4e85 100644
--- a/src/i18n/locales/hi.json
+++ b/src/i18n/locales/hi.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "फ्रांज़ के संस्करण {version} में बदलाव:", 7 "feature.announcements.changelog.headline": "फ्रांज़ के संस्करण {version} में बदलाव:",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "फ्रांज़ {seconds} सेकंड में जारी रहेगा।",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "खाते का उन्नयन करें",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
19 "feature.planSelection.cta.upgradePro": "Choose Professional",
20 "feature.planSelection.free.text": "Basic functionality",
21 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
24 "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.",
25 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
26 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
30 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
31 "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.",
32 "feature.shareFranz.action.email": "ईमेल के रूप में भेजें", 8 "feature.shareFranz.action.email": "ईमेल के रूप में भेजें",
33 "feature.shareFranz.action.facebook": "फेसबुक पर सांझा करें", 9 "feature.shareFranz.action.facebook": "फेसबुक पर सांझा करें",
34 "feature.shareFranz.action.twitter": "ट्विटर पर सांझा करें", 10 "feature.shareFranz.action.twitter": "ट्विटर पर सांझा करें",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "मैंने फ्रांज में {count} सेवाएं जोड़ी हैं! व्हाट्सएप, मैसेंजर, स्लैक, स्काइप के लिए मुफ्त ऐप www.getferdi.com पर प्राप्त करें", 12 "feature.shareFranz.shareText.email": "मैंने फ्रांज में {count} सेवाएं जोड़ी हैं! व्हाट्सएप, मैसेंजर, स्लैक, स्काइप के लिए मुफ्त ऐप www.getferdi.com पर प्राप्त करें",
37 "feature.shareFranz.shareText.twitter": "मैंने फ्रांज में {count} सेवाएं जोड़ी हैं! व्हाट्सएप, मैसेंजर, स्लैक, स्काइप के लिए मुफ्त ऐप www.getferdi.com पर प्राप्त करें / cc @FerdiMessenger", 13 "feature.shareFranz.shareText.twitter": "मैंने फ्रांज में {count} सेवाएं जोड़ी हैं! व्हाट्सएप, मैसेंजर, स्लैक, स्काइप के लिए मुफ्त ऐप www.getferdi.com पर प्राप्त करें / cc @FerdiMessenger",
38 "feature.shareFranz.text": "अपने दोस्तों और सहकर्मियों को बताएं की फ्रांज़ कितना बढ़िया है और हमें इस बात को फैलाने में मदद करें।", 14 "feature.shareFranz.text": "अपने दोस्तों और सहकर्मियों को बताएं की फ्रांज़ कितना बढ़िया है और हमें इस बात को फैलाने में मदद करें।",
39 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
40 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade": "Upgrade Account",
42 "feature.trialStatusBar.cta": "Upgrade now",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
46 "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.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
49 "global.api.unhealthy": "फ्रांज़ ऑनलाइन सेवाओं से कनेक्ट नहीं किया जा सका", 15 "global.api.unhealthy": "फ्रांज़ ऑनलाइन सेवाओं से कनेक्ट नहीं किया जा सका",
50 "global.franzProRequired": "Ferdi Professional Required", 16 "global.franzProRequired": "Ferdi Professional Required",
51 "global.notConnectedToTheInternet": "आप इंटरनेट से नहीं जुड़े हैं।", 17 "global.notConnectedToTheInternet": "आप इंटरनेट से नहीं जुड़े हैं।",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "स्वचालित रूप से भाषा का पता लगाएं", 19 "global.spellchecking.autodetect": "स्वचालित रूप से भाषा का पता लगाएं",
54 "global.spellchecking.autodetect.short": "स्वचालित", 20 "global.spellchecking.autodetect.short": "स्वचालित",
55 "global.spellchecking.language": "वर्तनी जाँच भाषा", 21 "global.spellchecking.language": "वर्तनी जाँच भाषा",
56 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
57 "import.headline": "अपनी फ्रांज़ 4 की सेवाओं का आयात करें", 22 "import.headline": "अपनी फ्रांज़ 4 की सेवाओं का आयात करें",
58 "import.notSupportedHeadline": "सेवाएं अभी तक फ्रांज़ 5 में समर्थित नहीं हैं", 23 "import.notSupportedHeadline": "सेवाएं अभी तक फ्रांज़ 5 में समर्थित नहीं हैं",
59 "import.skip.label": "मैं स्वयं सेवाएं जोड़ना चाहता हूं", 24 "import.skip.label": "मैं स्वयं सेवाएं जोड़ना चाहता हूं",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "सेवाओं को फिर से लोड करें", 28 "infobar.buttonReloadServices": "सेवाओं को फिर से लोड करें",
64 "infobar.requiredRequestsFailed": "सेवाएं और उपयोगकर्ताओं की जानकारी लोड नहीं हो सकी", 29 "infobar.requiredRequestsFailed": "सेवाएं और उपयोगकर्ताओं की जानकारी लोड नहीं हो सकी",
65 "infobar.servicesUpdated": "आपकी सेवाएं अपडेट कर दी गई हैं।", 30 "infobar.servicesUpdated": "आपकी सेवाएं अपडेट कर दी गई हैं।",
66 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable": "फ्रांज़ के लिए एक नया अपडेट उपलब्ध है।", 31 "infobar.updateAvailable": "फ्रांज़ के लिए एक नया अपडेट उपलब्ध है।",
68 "invite.email.label": "ईमेल पता", 32 "invite.email.label": "ईमेल पता",
69 "invite.headline.friends": "अपने दोस्तों या सहयोगियों में से 3 को आमंत्रित करें", 33 "invite.headline.friends": "अपने दोस्तों या सहयोगियों में से 3 को आमंत्रित करें",
@@ -122,9 +86,7 @@
122 "menu.todos": "Todos", 86 "menu.todos": "Todos",
123 "menu.todos.enableTodos": "Enable Todos", 87 "menu.todos.enableTodos": "Enable Todos",
124 "menu.view": "दृश्य", 88 "menu.view": "दृश्य",
125 "menu.view.enterFullScreen": "पूर्ण स्क्रीन में प्रवेश", 89 "menu.view.reloadFerdi": "फ्रांज़ को पुनः लोड",
126 "menu.view.exitFullScreen": "पूर्ण स्क्रीन से निकलें",
127 "menu.view.reloadFranz": "फ्रांज़ को पुनः लोड",
128 "menu.view.reloadService": "सेवा पुनः लोड करें", 90 "menu.view.reloadService": "सेवा पुनः लोड करें",
129 "menu.view.reloadTodos": "Reload ToDos", 91 "menu.view.reloadTodos": "Reload ToDos",
130 "menu.view.resetZoom": "वास्तविक आकार", 92 "menu.view.resetZoom": "वास्तविक आकार",
@@ -149,7 +111,6 @@
149 "password.noUser": "उस ईमेल पते वाला कोई उपयोगकर्ता नहीं मिला", 111 "password.noUser": "उस ईमेल पते वाला कोई उपयोगकर्ता नहीं मिला",
150 "password.submit.label": "जमा करें", 112 "password.submit.label": "जमा करें",
151 "password.successInfo": "कृपया अपनी ईमेल देखें", 113 "password.successInfo": "कृपया अपनी ईमेल देखें",
152 "premiumFeature.button.upgradeAccount": "खाते का उन्नयन करें",
153 "pricing.features.accountSync": "Account Synchronisation", 114 "pricing.features.accountSync": "Account Synchronisation",
154 "pricing.features.adFree": "Forever ad-free", 115 "pricing.features.adFree": "Forever ad-free",
155 "pricing.features.appDelays": "No Waiting Screens", 116 "pricing.features.appDelays": "No Waiting Screens",
@@ -166,27 +127,6 @@
166 "pricing.features.upToSixServices": "Add up to 6 services", 127 "pricing.features.upToSixServices": "Add up to 6 services",
167 "pricing.features.upToThreeServices": "Add up to 3 services", 128 "pricing.features.upToThreeServices": "Add up to 3 services",
168 "pricing.features.workspaces": "कार्यस्थान", 129 "pricing.features.workspaces": "कार्यस्थान",
169 "pricing.plan.free": "Free",
170 "pricing.plan.legacy": "Premium",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal Monthly",
173 "pricing.plan.personal-yearly": "Personal Yearly",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional Monthly",
176 "pricing.plan.pro-yearly": "Professional Yearly",
177 "pricing.trial.cta.accept": "Start my 14-day Ferdi Professional Trial ",
178 "pricing.trial.cta.skip": "Continue to Ferdi",
179 "pricing.trial.cta.start": "Start using Ferdi",
180 "pricing.trial.error": "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline": "Ferdi Professional includes:",
182 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
183 "pricing.trial.intro.happyMessaging": "Happy messaging,",
184 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
185 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline": "No strings attached",
188 "pricing.trial.terms.noCreditCard": "No credit card required",
189 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action": "{name} को पुनः लोड करें ", 130 "service.crashHandler.action": "{name} को पुनः लोड करें ",
191 "service.crashHandler.autoReload": "{name} को {seconds} सेकंड में स्वचालित रूप से पुनर्स्थापित करने की कोशिश जारी है", 131 "service.crashHandler.autoReload": "{name} को {seconds} सेकंड में स्वचालित रूप से पुनर्स्थापित करने की कोशिश जारी है",
192 "service.crashHandler.headline": "अरे नहीं!", 132 "service.crashHandler.headline": "अरे नहीं!",
@@ -198,11 +138,6 @@
198 "service.errorHandler.headline": "अरे नहीं!", 138 "service.errorHandler.headline": "अरे नहीं!",
199 "service.errorHandler.message": "त्रुटि", 139 "service.errorHandler.message": "त्रुटि",
200 "service.errorHandler.text": "{name} लोड करने में विफलता हुई ", 140 "service.errorHandler.text": "{name} लोड करने में विफलता हुई ",
201 "service.restrictedHandler.action": "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
203 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading": "लोड हो रहा है", 141 "service.webviewLoader.loading": "लोड हो रहा है",
207 "services.getStarted": "आरंभ करें", 142 "services.getStarted": "आरंभ करें",
208 "services.welcome": "फ्रांज़ में आपका स्वागत है", 143 "services.welcome": "फ्रांज़ में आपका स्वागत है",
@@ -219,18 +154,9 @@
219 "settings.account.headlineInvoices": "चालान", 154 "settings.account.headlineInvoices": "चालान",
220 "settings.account.headlinePassword": "पासवर्ड बदलें", 155 "settings.account.headlinePassword": "पासवर्ड बदलें",
221 "settings.account.headlineProfile": "प्रोफ़ाइल अपडेट करें", 156 "settings.account.headlineProfile": "प्रोफ़ाइल अपडेट करें",
222 "settings.account.headlineSubscription": "आपकी सदस्यता",
223 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
224 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
225 "settings.account.invoiceDownload": "डाउनलोड",
226 "settings.account.manageSubscription.label": "अपनी सदस्यता प्रबंधित करें",
227 "settings.account.successInfo": "आपके परिवर्तनों को सहेजा गया है", 157 "settings.account.successInfo": "आपके परिवर्तनों को सहेजा गया है",
228 "settings.account.trial": "Free Trial",
229 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices": "फिर कोशिश करें", 158 "settings.account.tryReloadServices": "फिर कोशिश करें",
232 "settings.account.tryReloadUserInfoRequest": "फिर कोशिश करें", 159 "settings.account.tryReloadUserInfoRequest": "फिर कोशिश करें",
233 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
234 "settings.account.userInfoRequestFailed": "उपयोगकर्ता की जानकारी लोड नहीं हो सकी", 160 "settings.account.userInfoRequestFailed": "उपयोगकर्ता की जानकारी लोड नहीं हो सकी",
235 "settings.account.yourLicense": "Your Ferdi License", 161 "settings.account.yourLicense": "Your Ferdi License",
236 "settings.app.buttonClearAllCache": "कैश को साफ़ करें", 162 "settings.app.buttonClearAllCache": "कैश को साफ़ करें",
@@ -284,7 +210,6 @@
284 "settings.recipes.customService.openFolder": "Open folder", 210 "settings.recipes.customService.openFolder": "Open folder",
285 "settings.recipes.headline": "उपलब्ध सेवाएं", 211 "settings.recipes.headline": "उपलब्ध सेवाएं",
286 "settings.recipes.missingService": "क्या कोई सेवा गुम है?", 212 "settings.recipes.missingService": "क्या कोई सेवा गुम है?",
287 "settings.recipes.mostPopular": "सबसे लोकप्रिय",
288 "settings.recipes.nothingFound": "क्षमा करें, लेकिन आपके खोज शब्द से किसी भी सेवा का मिलान नहीं हुआ।", 213 "settings.recipes.nothingFound": "क्षमा करें, लेकिन आपके खोज शब्द से किसी भी सेवा का मिलान नहीं हुआ।",
289 "settings.recipes.servicesSuccessfulAddedInfo": "सेवा सफलतापूर्वक जोड़ी गई", 214 "settings.recipes.servicesSuccessfulAddedInfo": "सेवा सफलतापूर्वक जोड़ी गई",
290 "settings.searchService": "खोज सेवा", 215 "settings.searchService": "खोज सेवा",
@@ -295,7 +220,6 @@
295 "settings.service.form.availableServices": "उपलब्ध सेवाएं", 220 "settings.service.form.availableServices": "उपलब्ध सेवाएं",
296 "settings.service.form.customUrl": "कस्टम सर्वर", 221 "settings.service.form.customUrl": "कस्टम सर्वर",
297 "settings.service.form.customUrlPremiumInfo": "स्वयं की होस्ट की गई सेवाओं को जोड़ने के लिए, आपको फ्रांज प्रीमियम सपोर्टर अकाउंट की आवश्यकता है।", 222 "settings.service.form.customUrlPremiumInfo": "स्वयं की होस्ट की गई सेवाओं को जोड़ने के लिए, आपको फ्रांज प्रीमियम सपोर्टर अकाउंट की आवश्यकता है।",
298 "settings.service.form.customUrlUpgradeAccount": "अपने खाते को अपग्रेड करें",
299 "settings.service.form.customUrlValidationError": "कस्टम {name} सर्वर का मान्यकरण नहीं किया जा सका।", 223 "settings.service.form.customUrlValidationError": "कस्टम {name} सर्वर का मान्यकरण नहीं किया जा सका।",
300 "settings.service.form.deleteButton": "सेवा हटाएँ", 224 "settings.service.form.deleteButton": "सेवा हटाएँ",
301 "settings.service.form.editServiceHeadline": "{name} संपादित करें", 225 "settings.service.form.editServiceHeadline": "{name} संपादित करें",
@@ -391,19 +315,6 @@
391 "signup.link.login": "पहले से ही एक खाता है? लॉग इन करें।", 315 "signup.link.login": "पहले से ही एक खाता है? लॉग इन करें।",
392 "signup.password.label": "पासवर्ड", 316 "signup.password.label": "पासवर्ड",
393 "signup.submit.label": "खता खोलें", 317 "signup.submit.label": "खता खोलें",
394 "subscription.bestValue": "Best value",
395 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
396 "subscription.cta.allOptions": "See all options",
397 "subscription.cta.choosePlan": "Choose your plan",
398 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
399 "subscription.interval.per": "per {interval}",
400 "subscription.interval.perMonth": "per month",
401 "subscription.interval.perMonthPerUser": "per month & user",
402 "subscription.planItem.upgradeAccount": "Upgrade Account",
403 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
404 "subscription.teaser.intro": "Ferdi 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!",
405 "subscriptionPopup.buttonCancel": "रद्द करें",
406 "subscriptionPopup.buttonDone": "संपन्न",
407 "tabs.item.deleteService": "सेवा हटाएँ", 318 "tabs.item.deleteService": "सेवा हटाएँ",
408 "tabs.item.disableAudio": "ऑडियो अक्षम करें", 319 "tabs.item.disableAudio": "ऑडियो अक्षम करें",
409 "tabs.item.disableNotifications": "ऑडियो अक्षम करें", 320 "tabs.item.disableNotifications": "ऑडियो अक्षम करें",
@@ -431,7 +342,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "संपादन करें", 342 "workspaceDrawer.item.contextMenuEdit": "संपादन करें",
432 "workspaceDrawer.item.noServicesAddedYet": "अभी तक कोई सेवा नहीं जोड़ी गई है", 343 "workspaceDrawer.item.noServicesAddedYet": "अभी तक कोई सेवा नहीं जोड़ी गई है",
433 "workspaceDrawer.premiumCtaButtonLabel": "अपना पहला कार्यक्षेत्र बनाएँ", 344 "workspaceDrawer.premiumCtaButtonLabel": "अपना पहला कार्यक्षेत्र बनाएँ",
434 "workspaceDrawer.proFeatureBadge": "प्रीमियम सुविधा",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "प्रीमियम खाता पुनः सक्रिय करें", 345 "workspaceDrawer.reactivatePremiumAccountLabel": "प्रीमियम खाता पुनः सक्रिय करें",
436 "workspaceDrawer.workspaceFeatureInfo": "<p>फ्रांज वर्कस्पेस आपको इस बात पर ध्यान केंद्रित करने देता है कि अभी क्या महत्वपूर्ण है। सेवाओं के विभिन्न समूहों को तैयार करें और किसी भी समय उनके बीच आसानी से स्विच करें।</p><p>आप यह तय करते हैं कि आपको कब और कहाँ किन सेवाओं की ज़रूरत है, इसलिए हम आपको अपने खेल में शीर्ष पर बने रहने में मदद कर सकते हैं - या जब भी आप चाहें, आसानी से काम बंद कर सकते हैं।</p>", 346 "workspaceDrawer.workspaceFeatureInfo": "<p>फ्रांज वर्कस्पेस आपको इस बात पर ध्यान केंद्रित करने देता है कि अभी क्या महत्वपूर्ण है। सेवाओं के विभिन्न समूहों को तैयार करें और किसी भी समय उनके बीच आसानी से स्विच करें।</p><p>आप यह तय करते हैं कि आपको कब और कहाँ किन सेवाओं की ज़रूरत है, इसलिए हम आपको अपने खेल में शीर्ष पर बने रहने में मदद कर सकते हैं - या जब भी आप चाहें, आसानी से काम बंद कर सकते हैं।</p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "कार्यस्थान सेटिंग्स संपादित करें", 347 "workspaceDrawer.workspacesSettingsTooltip": "कार्यस्थान सेटिंग्स संपादित करें",
diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json
index 9f940c368..a1716483e 100644
--- a/src/i18n/locales/hr.json
+++ b/src/i18n/locales/hr.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Odustani", 16 "feature.nightlyBuilds.cancel": "Odustani",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Nije se moguće povezati na Francove on-line servise. ", 36 "global.api.unhealthy": "Nije se moguće povezati na Francove on-line servise. ",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "Sada ste povezani s internetom. ", 37 "global.notConnectedToTheInternet": "Sada ste povezani s internetom. ",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Uvezite svoje Franc 4 servise. ", 44 "import.headline": "Uvezite svoje Franc 4 servise. ",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Hide", 52 "infobar.hide": "Hide",
89 "infobar.requiredRequestsFailed": "Nemoguće učitati servise i korisničke informacije", 53 "infobar.requiredRequestsFailed": "Nemoguće učitati servise i korisničke informacije",
90 "infobar.servicesUpdated": "Vaši servisi su ažurirani. ", 54 "infobar.servicesUpdated": "Vaši servisi su ažurirani. ",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Novo ažuriranje Ferdi-a je dostupno. ", 55 "infobar.updateAvailable": "Novo ažuriranje Ferdi-a je dostupno. ",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Vaša e-adresa:", 57 "invite.email.label": "Vaša e-adresa:",
@@ -149,6 +112,7 @@
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Learn More", 116 "menu.help.learnMore": "Learn More",
153 "menu.help.privacy": "Izjava o privatnosti ", 117 "menu.help.privacy": "Izjava o privatnosti ",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,12 +127,10 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Enter Full Screen",
167 "menu.view.exitFullScreen": "Exit Full Screen",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Reload Service", 134 "menu.view.reloadService": "Reload Service",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Actual Size", 136 "menu.view.resetZoom": "Actual Size",
@@ -194,11 +156,7 @@
194 "password.noUser": "Ne postoji ni jedan korisnik s tom e-mail adresom", 156 "password.noUser": "Ne postoji ni jedan korisnik s tom e-mail adresom",
195 "password.submit.label": "Pošalji", 157 "password.submit.label": "Pošalji",
196 "password.successInfo": "Molimo Vas da provjerite svoju e-mail adresu", 158 "password.successInfo": "Molimo Vas da provjerite svoju e-mail adresu",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Osvježi okvir", 170 "service.crashHandler.action": "Osvježi okvir",
236 "service.crashHandler.autoReload": "Pokušati ću automatski povratiti {name} u {seconds} sekundi", 171 "service.crashHandler.autoReload": "Pokušati ću automatski povratiti {name} u {seconds} sekundi",
237 "service.crashHandler.headline": "O, ne! ", 172 "service.crashHandler.headline": "O, ne! ",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "O, ne! ", 178 "service.errorHandler.headline": "O, ne! ",
244 "service.errorHandler.message": "Greška", 179 "service.errorHandler.message": "Greška",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Započnimo!", 182 "services.getStarted": "Započnimo!",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Dobrodošli u Ferdi", 186 "services.welcome": "Dobrodošli u Ferdi",
257 "settings.account.account.editButton": "Uredi račun", 187 "settings.account.account.editButton": "Uredi račun",
258 "settings.account.accountType.basic": "Osnovni račun",
259 "settings.account.accountType.premium": "Premium račun",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Ažuriraj profil", 190 "settings.account.buttonSave": "Ažuriraj profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Fakture", 197 "settings.account.headlineInvoices": "Fakture",
270 "settings.account.headlinePassword": "Promijenite lozinku", 198 "settings.account.headlinePassword": "Promijenite lozinku",
271 "settings.account.headlineProfile": "Ažuriraj profil", 199 "settings.account.headlineProfile": "Ažuriraj profil",
272 "settings.account.headlineSubscription": "Vaša pretplata",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Preuzmite",
276 "settings.account.manageSubscription.label": "Upravljajte pretplatama",
277 "settings.account.successInfo": "Vaše promjene su spremljene", 200 "settings.account.successInfo": "Vaše promjene su spremljene",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Pokušajte ponovno", 201 "settings.account.tryReloadServices": "Pokušajte ponovno",
282 "settings.account.tryReloadUserInfoRequest": "Pokušajte ponovno", 202 "settings.account.tryReloadUserInfoRequest": "Pokušajte ponovno",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Nije moguće učitati informacije o korisniku", 203 "settings.account.userInfoRequestFailed": "Nije moguće učitati informacije o korisniku",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Omogući provjeru pravopisa", 227 "settings.app.form.enableSpellchecking": "Omogući provjeru pravopisa",
309 "settings.app.form.enableSystemTray": "Prikaži aplikaciju u sustavskoj traci", 228 "settings.app.form.enableSystemTray": "Prikaži aplikaciju u sustavskoj traci",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Postavke", 259 "settings.app.headline": "Postavke",
341 "settings.app.headlineAdvanced": "Napredne alatke", 260 "settings.app.headlineAdvanced": "Napredne alatke",
342 "settings.app.headlineAppearance": "Izgled", 261 "settings.app.headlineAppearance": "Izgled",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Promjene postavki zahtijevaju ponovni zagon", 272 "settings.app.restartRequired": "Promjene postavki zahtijevaju ponovni zagon",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Predmemorija", 277 "settings.app.subheadlineCache": "Predmemorija",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Dostupne usluge", 301 "settings.recipes.headline": "Dostupne usluge",
383 "settings.recipes.missingService": "Da li neki servis nedostaje?", 302 "settings.recipes.missingService": "Da li neki servis nedostaje?",
384 "settings.recipes.mostPopular": "Najpopularniji",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Usluga uspješno dodana. ", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Usluga uspješno dodana. ",
387 "settings.searchService": "Potraži servis", 305 "settings.searchService": "Potraži servis",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Dodaj {name}", 309 "settings.service.form.addServiceHeadline": "Dodaj {name}",
392 "settings.service.form.availableServices": "Dostupne usluge", 310 "settings.service.form.availableServices": "Dostupne usluge",
393 "settings.service.form.customUrl": "Prilagođen server", 311 "settings.service.form.customUrl": "Prilagođen server",
394 "settings.service.form.customUrlPremiumInfo": "Da bi ste dodali samo-hostovane usluge, potreban vam je Premium račun.",
395 "settings.service.form.customUrlUpgradeAccount": "Nadogradite Vaš račun",
396 "settings.service.form.customUrlValidationError": "Nije moguće odobriti prilagođeno {name} servera.", 312 "settings.service.form.customUrlValidationError": "Nije moguće odobriti prilagođeno {name} servera.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Tim", 380 "settings.team.headline": "Tim",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Tvrtka", 385 "settings.user.form.accountType.company": "Tvrtka",
471 "settings.user.form.accountType.individual": "Pojedinac", 386 "settings.user.form.accountType.individual": "Pojedinac",
472 "settings.user.form.accountType.label": "Tip računa", 387 "settings.user.form.accountType.label": "Tip računa",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Imate račun? Prijavite se.", 431 "signup.link.login": "Imate račun? Prijavite se.",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Napravite novi račun", 433 "signup.submit.label": "Napravite novi račun",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Odustani",
531 "subscriptionPopup.buttonDone": "Završeno",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Izbriši uslugu", 435 "tabs.item.deleteService": "Izbriši uslugu",
534 "tabs.item.disableAudio": "Onemogući zvuk", 436 "tabs.item.disableAudio": "Onemogući zvuk",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Onemogući obavijesti", 438 "tabs.item.disableNotifications": "Onemogući obavijesti",
536 "tabs.item.disableService": "Onemogući servis", 439 "tabs.item.disableService": "Onemogući servis",
537 "tabs.item.edit": "Uredi", 440 "tabs.item.edit": "Uredi",
538 "tabs.item.enableAudio": "Omogućite zvuk", 441 "tabs.item.enableAudio": "Omogućite zvuk",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Omogućite obavijesti", 443 "tabs.item.enableNotification": "Omogućite obavijesti",
540 "tabs.item.enableService": "Omogućite usluge", 444 "tabs.item.enableService": "Omogućite usluge",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Ponovno učitavanje", 446 "tabs.item.reload": "Ponovno učitavanje",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index afe2341ed..fe52240f4 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Ja ne! Ferdi nem tud kapcsolodni {name}-hez.", 12 "connectionLostBanner.message": "Ja ne! Ferdi nem tud kapcsolodni {name}-hez.",
13 "feature.announcements.changelog.headline": "Ferdi {version} változásai", 13 "feature.announcements.changelog.headline": "Ferdi {version} változásai",
14 "feature.debugger.title": "Hibakeresési napló publikálása", 14 "feature.debugger.title": "Hibakeresési napló publikálása",
15 "feature.delayApp.headline": "Kérjük vásárolj egy Franc Támogatói Liszencet a várakozás átugrásához",
16 "feature.delayApp.text": "A Ferdi továbblép {seconds} másodperc múlva.",
17 "feature.delayApp.trial.action": "Igen, szeretném kipróbálni 14 napig a Ferdi Professional-t ingyen",
18 "feature.delayApp.trial.actionShort": "Aktiválom az ingyenes Ferdi Professional próbaidőszakot",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Szerezz egy Ferdi Támogatói Liszencet",
21 "feature.delayApp.upgrade.actionShort": "Fiók frissítése",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Mégsem", 16 "feature.nightlyBuilds.cancel": "Mégsem",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Hiba történt a hibakeresési napló publikálása közben. Kérem próbálja meg később.", 19 "feature.publishDebugInfo.error": "Hiba történt a hibakeresési napló publikálása közben. Kérem próbálja meg később.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Adatvédelmi szabályzat", 21 "feature.publishDebugInfo.privacy": "Adatvédelmi szabályzat",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Keresés...", 27 "feature.quickSwitch.search": "Keresés...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Küldés email-ben", 29 "feature.shareFranz.action.email": "Küldés email-ben",
54 "feature.shareFranz.action.facebook": "Megosztás Facebook-on", 30 "feature.shareFranz.action.facebook": "Megosztás Facebook-on",
55 "feature.shareFranz.action.twitter": "Megosztás Twitter-en", 31 "feature.shareFranz.action.twitter": "Megosztás Twitter-en",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "A Ferdi Tennivalók már elérhető a prémium felhasználók részére!",
61 "feature.todos.premium.rollout": "Mindenki másnak még egy kicsit tovább kell várni.",
62 "feature.todos.premium.upgrade": "Fiók frissítése",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Nem lehet csatlakozni a Ferdi online szolgáltatáshoz", 36 "global.api.unhealthy": "Nem lehet csatlakozni a Ferdi online szolgáltatáshoz",
71 "global.franzProRequired": "Ferdi Professional szükséges",
72 "global.notConnectedToTheInternet": "Nincs hálózati kapcsolat.", 37 "global.notConnectedToTheInternet": "Nincs hálózati kapcsolat.",
73 "global.spellchecker.useDefault": "Rendszer alapbeállítás használata ({default})", 38 "global.spellchecker.useDefault": "Rendszer alapbeállítás használata ({default})",
74 "global.spellchecking.autodetect": "Automatikus nyelvdetektálás", 39 "global.spellchecking.autodetect": "Automatikus nyelvdetektálás",
75 "global.spellchecking.autodetect.short": "Automatikus", 40 "global.spellchecking.autodetect.short": "Automatikus",
76 "global.spellchecking.language": "Helyesírás-ellenőrző nyelve", 41 "global.spellchecking.language": "Helyesírás-ellenőrző nyelve",
77 "global.upgradeButton.upgradeToPro": "Frissítés Ferdi Professional-ra",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importáld szolgáltatásaidat a Ferdi 4-ből", 44 "import.headline": "Importáld szolgáltatásaidat a Ferdi 4-ből",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Elrejt", 52 "infobar.hide": "Elrejt",
89 "infobar.requiredRequestsFailed": "Szolgáltatások és felhasználói információk nem tölthetők be", 53 "infobar.requiredRequestsFailed": "Szolgáltatások és felhasználói információk nem tölthetők be",
90 "infobar.servicesUpdated": "A szolgáltatások frissítésre kerültek.", 54 "infobar.servicesUpdated": "A szolgáltatások frissítésre kerültek.",
91 "infobar.trialActivated": "A próbaidőszak aktiválva. Jó mulatást!",
92 "infobar.updateAvailable": "Új frissítés érhető el a Ferdi-hoz.", 55 "infobar.updateAvailable": "Új frissítés érhető el a Ferdi-hoz.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email cím", 57 "invite.email.label": "Email cím",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "Frissítések keresése", 88 "menu.app.checkForUpdates": "Frissítések keresése",
126 "menu.app.hide": "Elrejt", 89 "menu.app.hide": "Elrejt",
127 "menu.app.hideOthers": "Többi elrejtése", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Kilépés", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Beállítások", 92 "menu.app.settings": "Beállítások",
130 "menu.app.unhide": "Megjelenít", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Szerkesztés", 94 "menu.edit": "Szerkesztés",
132 "menu.edit.copy": "Másolás", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Kivágás", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Törlés", 97 "menu.edit.delete": "Törlés",
135 "menu.edit.emojiSymbols": "Emoji és Szimbólumok", 98 "menu.edit.emojiSymbols": "Emoji és Szimbólumok",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Beillesztés", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Beillesztés ugyanazzal a megjelenéssel", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Újra", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Összes kijelölése", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Beszéd", 104 "menu.edit.speech": "Beszéd",
142 "menu.edit.startDictation": "Diktálás elkezdése", 105 "menu.edit.startDictation": "Diktálás elkezdése",
143 "menu.edit.startSpeaking": "Beszélgetés kezdeményezése", 106 "menu.edit.startSpeaking": "Beszélgetés kezdeményezése",
144 "menu.edit.stopSpeaking": "Beszéd vége", 107 "menu.edit.stopSpeaking": "Beszéd vége",
145 "menu.edit.undo": "Visszavonás", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Fájl", 109 "menu.file": "Fájl",
147 "menu.help": "Súgó", 110 "menu.help": "Help",
148 "menu.help.changelog": "Változások listája", 111 "menu.help.changelog": "Változások listája",
149 "menu.help.debugInfo": "Hibajelentés másolása", 112 "menu.help.debugInfo": "Hibajelentés másolása",
150 "menu.help.debugInfoCopiedBody": "A Hibajelentést a vágólapra másoltuk.", 113 "menu.help.debugInfoCopiedBody": "A Hibajelentést a vágólapra másoltuk.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Hibajelentés", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Hibajelentés",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Tudjon meg többet", 116 "menu.help.learnMore": "Tudjon meg többet",
153 "menu.help.privacy": "Adatvédelmi Nyilatkozatot", 117 "menu.help.privacy": "Adatvédelmi Nyilatkozatot",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Nézet", 128 "menu.view": "Nézet",
165 "menu.view.back": "Vissza", 129 "menu.view.back": "Vissza",
166 "menu.view.enterFullScreen": "Kilépés a teljes képernyős módból",
167 "menu.view.exitFullScreen": "Kilépés a teljes képernyős módból",
168 "menu.view.forward": "Előre", 130 "menu.view.forward": "Előre",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Ferdi újrainditása", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Szolgáltatás újraindítása", 134 "menu.view.reloadService": "Szolgáltatás újraindítása",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Tényleges méret", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Toggle Dark Mode", 137 "menu.view.toggleDarkMode": "Toggle Dark Mode",
176 "menu.view.toggleDevTools": "Fejlesztői eszközök ki/bekapcsolása", 138 "menu.view.toggleDevTools": "Fejlesztői eszközök ki/bekapcsolása",
177 "menu.view.toggleFullScreen": "Teljes képernyős mód ki/bekapcsolása", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Szolgáltatás Fejlesztői Eszközök ki/bekapcsolása", 140 "menu.view.toggleServiceDevTools": "Szolgáltatás Fejlesztői Eszközök ki/bekapcsolása",
179 "menu.view.toggleTodosDevTools": "Tennivalók Fejlesztői Eszközök kapcsolása", 141 "menu.view.toggleTodosDevTools": "Tennivalók Fejlesztői Eszközök kapcsolása",
180 "menu.view.zoomIn": "Nagyítás", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Kicsinyítés", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Ablak", 144 "menu.window": "Window",
183 "menu.window.close": "Bezárás", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Tálcára", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Munkaterületek", 147 "menu.workspaces": "Munkaterületek",
186 "menu.workspaces.addNewWorkspace": "Új munkaterület...", 148 "menu.workspaces.addNewWorkspace": "Új munkaterület...",
187 "menu.workspaces.closeWorkspaceDrawer": "Munkaterület panel bezárása", 149 "menu.workspaces.closeWorkspaceDrawer": "Munkaterület panel bezárása",
@@ -194,11 +156,7 @@
194 "password.noUser": "Nem található felhasználó a megadott email címmel", 156 "password.noUser": "Nem található felhasználó a megadott email címmel",
195 "password.submit.label": "Küldés", 157 "password.submit.label": "Küldés",
196 "password.successInfo": "Ellenőrizd az email fiókodat", 158 "password.successInfo": "Ellenőrizd az email fiókodat",
197 "premiumFeature.button.upgradeAccount": "Fiók frissítése",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Hirdetésmentesség, örökre!",
200 "pricing.features.appDelays": "Nincsenek töltőképernyők",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Egyéni weboldalak megadása", 160 "pricing.features.customWebsites": "Egyéni weboldalak megadása",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "Helyi és egyéb távoli szolgáltatások", 162 "pricing.features.onPremise": "Helyi és egyéb távoli szolgáltatások",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Csapatkezelés", 166 "pricing.features.teamManagement": "Csapatkezelés",
209 "pricing.features.thirdPartyServices": "Harmadik féltől származó szolgáltatások használata", 167 "pricing.features.thirdPartyServices": "Harmadik féltől származó szolgáltatások használata",
210 "pricing.features.unlimitedServices": "Korlátlan szolgáltatások felvitele", 168 "pricing.features.unlimitedServices": "Korlátlan szolgáltatások felvitele",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Munkaterületek", 169 "pricing.features.workspaces": "Munkaterületek",
214 "pricing.plan.free": "Ingyenes Ferdi",
215 "pricing.plan.legacy": "Ferdi Prémium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "{name} újratöltése", 170 "service.crashHandler.action": "{name} újratöltése",
236 "service.crashHandler.autoReload": "{name} automatikusan helyreállítása {seconds} másodpercen belül", 171 "service.crashHandler.autoReload": "{name} automatikusan helyreállítása {seconds} másodpercen belül",
237 "service.crashHandler.headline": "Jajj ne!", 172 "service.crashHandler.headline": "Jajj ne!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Jajj ne!", 178 "service.errorHandler.headline": "Jajj ne!",
244 "service.errorHandler.message": "Hiba", 179 "service.errorHandler.message": "Hiba",
245 "service.errorHandler.text": "{name} nem tudott betöltődni.", 180 "service.errorHandler.text": "{name} nem tudott betöltődni.",
246 "service.restrictedHandler.action": "Fiók frissítése",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Kezdj hozzá", 182 "services.getStarted": "Kezdj hozzá",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Üdvözöl a Ferdi", 186 "services.welcome": "Üdvözöl a Ferdi",
257 "settings.account.account.editButton": "Fiók szerkesztése", 187 "settings.account.account.editButton": "Fiók szerkesztése",
258 "settings.account.accountType.basic": "Alap Fiók",
259 "settings.account.accountType.premium": "Prémium Támogató Fiók",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Profil frissítése", 190 "settings.account.buttonSave": "Profil frissítése",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Számlák", 197 "settings.account.headlineInvoices": "Számlák",
270 "settings.account.headlinePassword": "Jelszócsere", 198 "settings.account.headlinePassword": "Jelszócsere",
271 "settings.account.headlineProfile": "Profil frissítése", 199 "settings.account.headlineProfile": "Profil frissítése",
272 "settings.account.headlineSubscription": "Előfizetésed",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Letöltés",
276 "settings.account.manageSubscription.label": "Előfizetés kezelése",
277 "settings.account.successInfo": "A módosításokat elmentettük", 200 "settings.account.successInfo": "A módosításokat elmentettük",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Próbáld újra", 201 "settings.account.tryReloadServices": "Próbáld újra",
282 "settings.account.tryReloadUserInfoRequest": "Próbáld újra", 202 "settings.account.tryReloadUserInfoRequest": "Próbáld újra",
283 "settings.account.upgradeToPro.label": "Frissítés Ferdi Professional-ra",
284 "settings.account.userInfoRequestFailed": "A felhasználói adatok betöltése sikertelen", 203 "settings.account.userInfoRequestFailed": "A felhasználói adatok betöltése sikertelen",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Helyesírás-ellenőrzés engedélyezése", 227 "settings.app.form.enableSpellchecking": "Helyesírás-ellenőrzés engedélyezése",
309 "settings.app.form.enableSystemTray": "Ferdi mutatása a tálcán", 228 "settings.app.form.enableSystemTray": "Ferdi mutatása a tálcán",
310 "settings.app.form.enableTodos": "Ferdi Tennivalók bekapcsolása", 229 "settings.app.form.enableTodos": "Ferdi Tennivalók bekapcsolása",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Beállítások", 259 "settings.app.headline": "Beállítások",
341 "settings.app.headlineAdvanced": "Haladó", 260 "settings.app.headlineAdvanced": "Haladó",
342 "settings.app.headlineAppearance": "Megjelenés", 261 "settings.app.headlineAppearance": "Megjelenés",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "A hivatalos fordítások angol és német nyelven elérhetőek. Minden más nyelv közösségi fordításon alapul.", 268 "settings.app.languageDisclaimer": "A hivatalos fordítások angol és német nyelven elérhetőek. Minden más nyelv közösségi fordításon alapul.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Újraindítást igénylő módosítás", 272 "settings.app.restartRequired": "Újraindítást igénylő módosítás",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Gyorsítótár", 277 "settings.app.subheadlineCache": "Gyorsítótár",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Könyvtár megnyitása", 300 "settings.recipes.customService.openFolder": "Könyvtár megnyitása",
382 "settings.recipes.headline": "Elérhető szolgáltatások", 301 "settings.recipes.headline": "Elérhető szolgáltatások",
383 "settings.recipes.missingService": "Hiányzik egy szolgáltatás?", 302 "settings.recipes.missingService": "Hiányzik egy szolgáltatás?",
384 "settings.recipes.mostPopular": "Legnépszerűbb",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Szolgáltatás sikeresen hozzáadva", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Szolgáltatás sikeresen hozzáadva",
387 "settings.searchService": "Szolgáltatások keresése", 305 "settings.searchService": "Szolgáltatások keresése",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "{name} hozzáadása", 309 "settings.service.form.addServiceHeadline": "{name} hozzáadása",
392 "settings.service.form.availableServices": "Elérhető szolgáltatások", 310 "settings.service.form.availableServices": "Elérhető szolgáltatások",
393 "settings.service.form.customUrl": "Egyéni szerver", 311 "settings.service.form.customUrl": "Egyéni szerver",
394 "settings.service.form.customUrlPremiumInfo": "Egyénileg üzemeltetett szolgáltatások hozzáadásához Ferdi Prémium Támogató Fiók szükséges.",
395 "settings.service.form.customUrlUpgradeAccount": "Frissítsd fiókodat",
396 "settings.service.form.customUrlValidationError": "Nem sikerült érvényesíteni az egyéni {name} kiszolgálót.", 312 "settings.service.form.customUrlValidationError": "Nem sikerült érvényesíteni az egyéni {name} kiszolgálót.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Csapat", 380 "settings.team.headline": "Csapat",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Előfizetés",
470 "settings.user.form.accountType.company": "Cég", 385 "settings.user.form.accountType.company": "Cég",
471 "settings.user.form.accountType.individual": "Egyén", 386 "settings.user.form.accountType.individual": "Egyén",
472 "settings.user.form.accountType.label": "Fiók típusa", 387 "settings.user.form.accountType.label": "Fiók típusa",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Már van fiókod? Lépj be!", 431 "signup.link.login": "Már van fiókod? Lépj be!",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Fiók létrehozása", 433 "signup.submit.label": "Fiók létrehozása",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Fiók frissítése",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Mégsem",
531 "subscriptionPopup.buttonDone": "Kész",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Szolgáltatás törlése", 435 "tabs.item.deleteService": "Szolgáltatás törlése",
534 "tabs.item.disableAudio": "Hang letiltása", 436 "tabs.item.disableAudio": "Hang letiltása",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Értesítések letiltása", 438 "tabs.item.disableNotifications": "Értesítések letiltása",
536 "tabs.item.disableService": "Szolgáltatás letiltása", 439 "tabs.item.disableService": "Szolgáltatás letiltása",
537 "tabs.item.edit": "Szerkesztés", 440 "tabs.item.edit": "Szerkesztés",
538 "tabs.item.enableAudio": "Hang engedélyezése", 441 "tabs.item.enableAudio": "Hang engedélyezése",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Értesítések engedélyezése", 443 "tabs.item.enableNotification": "Értesítések engedélyezése",
540 "tabs.item.enableService": "Szolgáltatás engedélyezése", 444 "tabs.item.enableService": "Szolgáltatás engedélyezése",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Újratöltés", 446 "tabs.item.reload": "Újratöltés",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} nem érvényes", 448 "validation.email": "{field} nem érvényes",
543 "validation.minLength": "{field} mezőnek legalább {length} karakter hosszúnak kell lennie", 449 "validation.minLength": "{field} mezőnek legalább {length} karakter hosszúnak kell lennie",
544 "validation.oneRequired": "Legalább egy kitöltése szükséges", 450 "validation.oneRequired": "Legalább egy kitöltése szükséges",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Munkaterületek", 462 "workspaceDrawer.headline": "Munkaterületek",
557 "workspaceDrawer.item.contextMenuEdit": "szerkeszt", 463 "workspaceDrawer.item.contextMenuEdit": "szerkeszt",
558 "workspaceDrawer.item.noServicesAddedYet": "Még nincsenek hozzáadott szolgáltatások", 464 "workspaceDrawer.item.noServicesAddedYet": "Még nincsenek hozzáadott szolgáltatások",
559 "workspaceDrawer.premiumCtaButtonLabel": "Készítsd el az első munkaterületedet",
560 "workspaceDrawer.proFeatureBadge": "Prémium funkció",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Prémium fiók reaktiválása",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>A Ferdi Munkaterületek lehetővé teszik, hogy összpontosíts a jelenleg fontos dolgokra. Állítsd be a különböző szolgáltatáskészleteket és könnyedén válthatsz közöttük bármikor.</p><p>Te döntöd el, hogy mely szolgáltatásokra van szükséged, mikor és hol, így segíthetünk abban, hogy a teljesítményed csúcsán maradhass, vagy ha csak akarod, egyszerűen kikapcsold a munkával kapcsolatos dolgokat.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>A Ferdi Munkaterületek lehetővé teszik, hogy összpontosíts a jelenleg fontos dolgokra. Állítsd be a különböző szolgáltatáskészleteket és könnyedén válthatsz közöttük bármikor.</p><p>Te döntöd el, hogy mely szolgáltatásokra van szükséged, mikor és hol, így segíthetünk abban, hogy a teljesítményed csúcsán maradhass, vagy ha csak akarod, egyszerűen kikapcsold a munkával kapcsolatos dolgokat.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Munkaterület beállítások szerkesztése", 466 "workspaceDrawer.workspacesSettingsTooltip": "Munkaterület beállítások szerkesztése",
564 "workspaces.switchingIndicator.switchingTo": "Váltás" 467 "workspaces.switchingIndicator.switchingTo": "Váltás"
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index 59a128cc4..caa33a068 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Yah! Ferdi terputus dari {name}.", 12 "connectionLostBanner.message": "Yah! Ferdi terputus dari {name}.",
13 "feature.announcements.changelog.headline": "Perubahan dalam Ferdi {version}", 13 "feature.announcements.changelog.headline": "Perubahan dalam Ferdi {version}",
14 "feature.debugger.title": "Terbitkan informasi debug", 14 "feature.debugger.title": "Terbitkan informasi debug",
15 "feature.delayApp.headline": "Beli Lisensi Pendukung Ferdi agar tidak perlu menunggu",
16 "feature.delayApp.text": "Ferdi akan melanjutkan dalam {seconds} detik.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Dapatkan Lisensi Pendukung Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Tingkatkan akun",
22 "feature.nightlyBuilds.activate": "Mengaktifkan", 15 "feature.nightlyBuilds.activate": "Mengaktifkan",
23 "feature.nightlyBuilds.cancel": "Batalkan", 16 "feature.nightlyBuilds.cancel": "Batalkan",
24 "feature.nightlyBuilds.info": "Nightly builds adalah versi eksperimen dari Ferdi yang mungkin berisi fitur-fitur yang masih kasar dan tidak lengkap. Nightly builds ini biasa digunakan untuk para developer untuk mengetes fitur-fitur terbaru mereka dan bagaimana fitur-fitur itu berjalan di versi terakhir. Jika anda tidak tahu apa yang anda lakukan, kami sarankan untuk tidak mengaktivasi nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds adalah versi eksperimen dari Ferdi yang mungkin berisi fitur-fitur yang masih kasar dan tidak lengkap. Nightly builds ini biasa digunakan untuk para developer untuk mengetes fitur-fitur terbaru mereka dan bagaimana fitur-fitur itu berjalan di versi terakhir. Jika anda tidak tahu apa yang anda lakukan, kami sarankan untuk tidak mengaktivasi nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Kirim sebagai email", 29 "feature.shareFranz.action.email": "Kirim sebagai email",
54 "feature.shareFranz.action.facebook": "Bagikan di Facebook", 30 "feature.shareFranz.action.facebook": "Bagikan di Facebook",
55 "feature.shareFranz.action.twitter": "Bagikan di Twitter", 31 "feature.shareFranz.action.twitter": "Bagikan di Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Saya telah menambahkan layanan {count} ke Ferdi! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan co di www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Saya telah menambahkan layanan {count} ke Ferdi! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan co di www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Saya telah menambahkan {count} layanan di Ferdi! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan lainnya di www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Saya telah menambahkan {count} layanan di Ferdi! Dapatkan aplikasi gratis untuk WhatsApp, Messenger, Slack, Skype dan lainnya di www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Beri tahu teman dan kolega Anda betapa hebatnya Ferdi dan bantu kami menyebarkan berita.", 35 "feature.shareFranz.text": "Beri tahu teman dan kolega Anda betapa hebatnya Ferdi dan bantu kami menyebarkan berita.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade akun",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Tidak dapat tersambung ke layanan Ferdi", 36 "global.api.unhealthy": "Tidak dapat tersambung ke layanan Ferdi",
71 "global.franzProRequired": "Ferdi versi Profesional dibutuhkan",
72 "global.notConnectedToTheInternet": "Anda tidak tersambung ke internet.", 37 "global.notConnectedToTheInternet": "Anda tidak tersambung ke internet.",
73 "global.spellchecker.useDefault": "Gunakan Bawaan Sistem ({default})", 38 "global.spellchecker.useDefault": "Gunakan Bawaan Sistem ({default})",
74 "global.spellchecking.autodetect": "Deteksi bahasa secara otomatis", 39 "global.spellchecking.autodetect": "Deteksi bahasa secara otomatis",
75 "global.spellchecking.autodetect.short": "Otomatis", 40 "global.spellchecking.autodetect.short": "Otomatis",
76 "global.spellchecking.language": "Periksa ejaan", 41 "global.spellchecking.language": "Periksa ejaan",
77 "global.upgradeButton.upgradeToPro": "Upgrade ke Ferdi Profesional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Impor layanan Ferdi 4 Anda", 44 "import.headline": "Impor layanan Ferdi 4 Anda",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Sembunyikan", 52 "infobar.hide": "Sembunyikan",
89 "infobar.requiredRequestsFailed": "Gagal memuat layanan dan informasi pengguna", 53 "infobar.requiredRequestsFailed": "Gagal memuat layanan dan informasi pengguna",
90 "infobar.servicesUpdated": "Layanan Anda telah diperbarui", 54 "infobar.servicesUpdated": "Layanan Anda telah diperbarui",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Versi baru Ferdi tersedia.", 55 "infobar.updateAvailable": "Versi baru Ferdi tersedia.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Alamat email", 57 "invite.email.label": "Alamat email",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "Periksa versi baru", 88 "menu.app.checkForUpdates": "Periksa versi baru",
126 "menu.app.hide": "Sembunyikan", 89 "menu.app.hide": "Sembunyikan",
127 "menu.app.hideOthers": "Sembunyikan Lainnya", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Keluar", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Pengaturan", 92 "menu.app.settings": "Pengaturan",
130 "menu.app.unhide": "Perlihatkan", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Edit", 94 "menu.edit": "Edit",
132 "menu.edit.copy": "Salin", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Potong", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Hapus", 97 "menu.edit.delete": "Hapus",
135 "menu.edit.emojiSymbols": "Emoji & Simbol", 98 "menu.edit.emojiSymbols": "Emoji & Simbol",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Tempel", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Tempel dan Cocokkan Gaya", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Ulangi lagi", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Pilih Semua", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Bicara", 104 "menu.edit.speech": "Bicara",
142 "menu.edit.startDictation": "Mulai Dikte", 105 "menu.edit.startDictation": "Mulai Dikte",
143 "menu.edit.startSpeaking": "Mulai Berbicara", 106 "menu.edit.startSpeaking": "Mulai Berbicara",
144 "menu.edit.stopSpeaking": "Berhenti Berbicara", 107 "menu.edit.stopSpeaking": "Berhenti Berbicara",
145 "menu.edit.undo": "Batalkan", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Berkas", 109 "menu.file": "Berkas",
147 "menu.help": "Bantuan", 110 "menu.help": "Help",
148 "menu.help.changelog": "Log Perubahan", 111 "menu.help.changelog": "Log Perubahan",
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Pelajari Lebih Lanjut", 116 "menu.help.learnMore": "Pelajari Lebih Lanjut",
153 "menu.help.privacy": "Pernyataan Privasi", 117 "menu.help.privacy": "Pernyataan Privasi",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Tampilan", 128 "menu.view": "Tampilan",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Masuk ke Mode Layar Penuh",
167 "menu.view.exitFullScreen": "Keluar dari Layar Penuh",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Muat Ulang Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Muat ulang Layanan", 134 "menu.view.reloadService": "Muat ulang Layanan",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Ukuran Sebenarnya", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Toggle Dark Mode", 137 "menu.view.toggleDarkMode": "Toggle Dark Mode",
176 "menu.view.toggleDevTools": "Aktif/Nonaktifkan alat pengembang", 138 "menu.view.toggleDevTools": "Aktif/Nonaktifkan alat pengembang",
177 "menu.view.toggleFullScreen": "Aktif/Nonaktifkan Layar Penuh", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Aktif/Nonaktifkan layanan alat pengembang", 140 "menu.view.toggleServiceDevTools": "Aktif/Nonaktifkan layanan alat pengembang",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "Perbesar", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Perkecil", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Jendela", 144 "menu.window": "Window",
183 "menu.window.close": "Tutup", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimalkan", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Ruang kerja", 147 "menu.workspaces": "Ruang kerja",
186 "menu.workspaces.addNewWorkspace": "Tambah Ruang Kerja Baru...", 148 "menu.workspaces.addNewWorkspace": "Tambah Ruang Kerja Baru...",
187 "menu.workspaces.closeWorkspaceDrawer": "Tutup laci ruang kerja", 149 "menu.workspaces.closeWorkspaceDrawer": "Tutup laci ruang kerja",
@@ -194,11 +156,7 @@
194 "password.noUser": "Tidak ditemukan pengguna dengan email tersebut", 156 "password.noUser": "Tidak ditemukan pengguna dengan email tersebut",
195 "password.submit.label": "Kirim", 157 "password.submit.label": "Kirim",
196 "password.successInfo": "Periksa email Anda", 158 "password.successInfo": "Periksa email Anda",
197 "premiumFeature.button.upgradeAccount": "Tingkatkan akun",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Ruang kerja", 169 "pricing.features.workspaces": "Ruang kerja",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Muat Ulang {name}", 170 "service.crashHandler.action": "Muat Ulang {name}",
236 "service.crashHandler.autoReload": "Mencoba memulihkan {name} secara otomatis dalam {seconds} detik", 171 "service.crashHandler.autoReload": "Mencoba memulihkan {name} secara otomatis dalam {seconds} detik",
237 "service.crashHandler.headline": "Ya Ampun!", 172 "service.crashHandler.headline": "Ya Ampun!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Ya Ampun!", 178 "service.errorHandler.headline": "Ya Ampun!",
244 "service.errorHandler.message": "Kesalahan", 179 "service.errorHandler.message": "Kesalahan",
245 "service.errorHandler.text": "{name} gagal dimuat", 180 "service.errorHandler.text": "{name} gagal dimuat",
246 "service.restrictedHandler.action": "Upgrade akun",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Memulai", 182 "services.getStarted": "Memulai",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Selamat datang di Ferdi", 186 "services.welcome": "Selamat datang di Ferdi",
257 "settings.account.account.editButton": "Edit akun", 187 "settings.account.account.editButton": "Edit akun",
258 "settings.account.accountType.basic": "Akun Dasar",
259 "settings.account.accountType.premium": "Akun Pendukung Premium",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Perbarui profil", 190 "settings.account.buttonSave": "Perbarui profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Tagihan", 197 "settings.account.headlineInvoices": "Tagihan",
270 "settings.account.headlinePassword": "Ubah sandi", 198 "settings.account.headlinePassword": "Ubah sandi",
271 "settings.account.headlineProfile": "Perbarui profil", 199 "settings.account.headlineProfile": "Perbarui profil",
272 "settings.account.headlineSubscription": "Langganan Anda",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Unduh",
276 "settings.account.manageSubscription.label": "Kelola langganan Anda",
277 "settings.account.successInfo": "Perubahan Anda telah disimpan", 200 "settings.account.successInfo": "Perubahan Anda telah disimpan",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Coba lagi", 201 "settings.account.tryReloadServices": "Coba lagi",
282 "settings.account.tryReloadUserInfoRequest": "Coba lagi", 202 "settings.account.tryReloadUserInfoRequest": "Coba lagi",
283 "settings.account.upgradeToPro.label": "Upgrade ke Ferdi Profesional",
284 "settings.account.userInfoRequestFailed": "Gagal memuat informasi pengguna", 203 "settings.account.userInfoRequestFailed": "Gagal memuat informasi pengguna",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Aktifkan pemeriksaan ejaan", 227 "settings.app.form.enableSpellchecking": "Aktifkan pemeriksaan ejaan",
309 "settings.app.form.enableSystemTray": "Tampilkan Ferdi di baki sistem", 228 "settings.app.form.enableSystemTray": "Tampilkan Ferdi di baki sistem",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Pengaturan", 259 "settings.app.headline": "Pengaturan",
341 "settings.app.headlineAdvanced": "Tingkat Lanjut", 260 "settings.app.headlineAdvanced": "Tingkat Lanjut",
342 "settings.app.headlineAppearance": "Tampilan", 261 "settings.app.headlineAppearance": "Tampilan",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Penerjemahan resmi dilakukan untuk Bahasa Inggris dan Jerman. Bahasa lainnya merupakan penerjemahan oleh komunitas.", 268 "settings.app.languageDisclaimer": "Penerjemahan resmi dilakukan untuk Bahasa Inggris dan Jerman. Bahasa lainnya merupakan penerjemahan oleh komunitas.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Perubahan membutuhkan mulai ulang", 272 "settings.app.restartRequired": "Perubahan membutuhkan mulai ulang",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Singgahan", 277 "settings.app.subheadlineCache": "Singgahan",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Layanan tersedia", 301 "settings.recipes.headline": "Layanan tersedia",
383 "settings.recipes.missingService": "Layanan tidak tersedia?", 302 "settings.recipes.missingService": "Layanan tidak tersedia?",
384 "settings.recipes.mostPopular": "Terpopuler",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Layanan berhasil ditambahkan", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Layanan berhasil ditambahkan",
387 "settings.searchService": "Cari layanan", 305 "settings.searchService": "Cari layanan",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Tambahkan {name}", 309 "settings.service.form.addServiceHeadline": "Tambahkan {name}",
392 "settings.service.form.availableServices": "Layanan tersedia", 310 "settings.service.form.availableServices": "Layanan tersedia",
393 "settings.service.form.customUrl": "Server khusus", 311 "settings.service.form.customUrl": "Server khusus",
394 "settings.service.form.customUrlPremiumInfo": "Untuk menambahkan layanan hosted yang dijalankan mandiri, Anda membutuhkan Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Tingkatkan akun Anda",
396 "settings.service.form.customUrlValidationError": "Gagal memvalidasi server {name} khusus.", 312 "settings.service.form.customUrlValidationError": "Gagal memvalidasi server {name} khusus.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Tim", 380 "settings.team.headline": "Tim",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Tingkatkan Akun Anda",
470 "settings.user.form.accountType.company": "Perusahaan", 385 "settings.user.form.accountType.company": "Perusahaan",
471 "settings.user.form.accountType.individual": "Pribadi", 386 "settings.user.form.accountType.individual": "Pribadi",
472 "settings.user.form.accountType.label": "Jenis akun", 387 "settings.user.form.accountType.label": "Jenis akun",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Sudah punya akun, masuk?", 431 "signup.link.login": "Sudah punya akun, masuk?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Buat akun", 433 "signup.submit.label": "Buat akun",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade akun",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Batalkan",
531 "subscriptionPopup.buttonDone": "Selesai",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Hapus layanan", 435 "tabs.item.deleteService": "Hapus layanan",
534 "tabs.item.disableAudio": "Nonaktifkan audio", 436 "tabs.item.disableAudio": "Nonaktifkan audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Nonaktifkan pemberitahuan", 438 "tabs.item.disableNotifications": "Nonaktifkan pemberitahuan",
536 "tabs.item.disableService": "Nonaktifkan layanan", 439 "tabs.item.disableService": "Nonaktifkan layanan",
537 "tabs.item.edit": "Edit", 440 "tabs.item.edit": "Edit",
538 "tabs.item.enableAudio": "Aktifkan audio", 441 "tabs.item.enableAudio": "Aktifkan audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Aktifkan pemberitahuan", 443 "tabs.item.enableNotification": "Aktifkan pemberitahuan",
540 "tabs.item.enableService": "Aktifkan layanan", 444 "tabs.item.enableService": "Aktifkan layanan",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Muat Ulang", 446 "tabs.item.reload": "Muat Ulang",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} tidak benar", 448 "validation.email": "{field} tidak benar",
543 "validation.minLength": "{field} setidaknya harus {length} karakter", 449 "validation.minLength": "{field} setidaknya harus {length} karakter",
544 "validation.oneRequired": "Setidaknya diperlukan satu", 450 "validation.oneRequired": "Setidaknya diperlukan satu",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Ruang kerja", 462 "workspaceDrawer.headline": "Ruang kerja",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "Belum ada layanan yang ditambahkan", 464 "workspaceDrawer.item.noServicesAddedYet": "Belum ada layanan yang ditambahkan",
559 "workspaceDrawer.premiumCtaButtonLabel": "Buat ruang kerja pertama Anda",
560 "workspaceDrawer.proFeatureBadge": "Fitur premium",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Aktifkan ulang akun premium",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ruang Kerja Ferdi dapat digunakan untuk tetap fokus pada hal penting saat ini. Siapkan sekelompok layanan yang berbeda dan dengan mudah beralih ke yang lain.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ruang Kerja Ferdi dapat digunakan untuk tetap fokus pada hal penting saat ini. Siapkan sekelompok layanan yang berbeda dan dengan mudah beralih ke yang lain.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit setelan ruang kerja", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit setelan ruang kerja",
564 "workspaces.switchingIndicator.switchingTo": "Beralih ke" 467 "workspaces.switchingIndicator.switchingTo": "Beralih ke"
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index 76269d4ab..e349677a0 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi ha perso la connessione con {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi ha perso la connessione con {name}.",
13 "feature.announcements.changelog.headline": "Modifiche in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Modifiche in Ferdi {version}",
14 "feature.debugger.title": "Pubblica informazioni di debug", 14 "feature.debugger.title": "Pubblica informazioni di debug",
15 "feature.delayApp.headline": "Per favore, compra una Licenza Supporter di Ferdi per saltare l'attesa",
16 "feature.delayApp.text": "Ferdi continuerà tra {seconds} secondi.",
17 "feature.delayApp.trial.action": "Sì, voglio la prova gratuita di 14 giorni di Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Attiva la prova gratuita di Ferdi Professional",
19 "feature.delayApp.trial.headline": "Ottieni la prova gratuita per 14 giorni di Ferdi Professional e salta la coda",
20 "feature.delayApp.upgrade.action": "Ricevi una Licenza Supporter di Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Effettua l'upgrade del tuo account",
22 "feature.nightlyBuilds.activate": "Attivato", 15 "feature.nightlyBuilds.activate": "Attivato",
23 "feature.nightlyBuilds.cancel": "Annulla", 16 "feature.nightlyBuilds.cancel": "Annulla",
24 "feature.nightlyBuilds.info": "Le 'Nightly Builds' sono versioni sperimentali di Ferdi che possono contenere funzionalità incomplete o non perfettamente funzionanti. Queste versioni sono principalmente usate dagli sviluppatori per effettuare dei test sulle nuove caratteristiche e verificare come si integrano nella versione finale di Ferdi. Se non sei sicuro di quello che stai facendo, ti consigliamo di non attivare le 'Nightly Builds'.", 17 "feature.nightlyBuilds.info": "Le 'Nightly Builds' sono versioni sperimentali di Ferdi che possono contenere funzionalità incomplete o non perfettamente funzionanti. Queste versioni sono principalmente usate dagli sviluppatori per effettuare dei test sulle nuove caratteristiche e verificare come si integrano nella versione finale di Ferdi. Se non sei sicuro di quello che stai facendo, ti consigliamo di non attivare le 'Nightly Builds'.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Si è verificato un errore durante il tentativo di pubblicare le informazioni di debug. Riprova più tardi o vedi la console per maggiori informazioni.", 19 "feature.publishDebugInfo.error": "Si è verificato un errore durante il tentativo di pubblicare le informazioni di debug. Riprova più tardi o vedi la console per maggiori informazioni.",
43 "feature.publishDebugInfo.info": "Pubblicare le informazioni di debug ci aiuta a trovare problemi ed errori in Ferdi. Pubblicando le informazioni di debug accetti l'informativa sulla privacy e i termini di servizio di Ferdi Debugger", 20 "feature.publishDebugInfo.info": "Pubblicare le informazioni di debug ci aiuta a trovare problemi ed errori in Ferdi. Pubblicando le informazioni di debug accetti l'informativa sulla privacy e i termini di servizio di Ferdi Debugger",
44 "feature.publishDebugInfo.privacy": "Informativa sulla privacy", 21 "feature.publishDebugInfo.privacy": "Informativa sulla privacy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Seleziona un servizio con TAB, ↑ e ↓. Apri un servizio con INVIO.", 26 "feature.quickSwitch.info": "Seleziona un servizio con TAB, ↑ e ↓. Apri un servizio con INVIO.",
50 "feature.quickSwitch.search": "Cerca...", 27 "feature.quickSwitch.search": "Cerca...",
51 "feature.quickSwitch.title": "Cambio Veloce", 28 "feature.quickSwitch.title": "Cambio Veloce",
52 "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.",
53 "feature.shareFranz.action.email": "Manda come email", 29 "feature.shareFranz.action.email": "Manda come email",
54 "feature.shareFranz.action.facebook": "Condividi su Facebook", 30 "feature.shareFranz.action.facebook": "Condividi su Facebook",
55 "feature.shareFranz.action.twitter": "Condividi su Twitter", 31 "feature.shareFranz.action.twitter": "Condividi su Twitter",
@@ -57,25 +33,13 @@
57 "feature.shareFranz.shareText.email": "Ho aggiunto {count} nuovi servizi a Ferdi! Scarica ora l'app gratuita per WhatsApp, Messenger, Slack, Skype e altri all'indirizzo www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Ho aggiunto {count} nuovi servizi a Ferdi! Scarica ora l'app gratuita per WhatsApp, Messenger, Slack, Skype e altri all'indirizzo www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Ho aggiunto {count} nuovi servizi a Ferdi! Scarica ora l’app gratuita per WhatsApp, Messenger, Slack, Skype e altri all’indirizzo www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Ho aggiunto {count} nuovi servizi a Ferdi! Scarica ora l’app gratuita per WhatsApp, Messenger, Slack, Skype e altri all’indirizzo www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Di’ ai tuoi amici e colleghi quanto Ferdi è fantastico e aiutaci a diffondere la parola.", 35 "feature.shareFranz.text": "Di’ ai tuoi amici e colleghi quanto Ferdi è fantastico e aiutaci a diffondere la parola.",
60 "feature.todos.premium.info": "Le attività Ferdi sono ora disponibili agli utenti premium!",
61 "feature.todos.premium.rollout": "Chiunque altro dovrà aspettare un po' di più.",
62 "feature.todos.premium.upgrade": "Potenzia l'Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Impossibile connettersi ai servizi online di Ferdi", 36 "global.api.unhealthy": "Impossibile connettersi ai servizi online di Ferdi",
71 "global.franzProRequired": "Richiesto Ferdi Professional",
72 "global.notConnectedToTheInternet": "Non sei connesso a Internet.", 37 "global.notConnectedToTheInternet": "Non sei connesso a Internet.",
73 "global.spellchecker.useDefault": "Usa le impostazioni predefinite di sistema ({default})", 38 "global.spellchecker.useDefault": "Usa le impostazioni predefinite di sistema ({default})",
74 "global.spellchecking.autodetect": "Rileva automaticamente la lingua", 39 "global.spellchecking.autodetect": "Rileva automaticamente la lingua",
75 "global.spellchecking.autodetect.short": "Automatico", 40 "global.spellchecking.autodetect.short": "Automatico",
76 "global.spellchecking.language": "Lingua per controllo ortografico", 41 "global.spellchecking.language": "Lingua per controllo ortografico",
77 "global.upgradeButton.upgradeToPro": "Aggiorna a Ferdi Professional", 42 "global.userAgentHelp": "Usa 'https://whatmyuseragent.com/' (per scoprire) o 'https://developers.whatismybrowser.com/useragents/explore/' (per scegliere) il tuo user agent desiderato e copialo qui.",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importa i servizi di Ferdi 4", 44 "import.headline": "Importa i servizi di Ferdi 4",
81 "import.notSupportedHeadline": "Servizi non ancora supportati in Ferdi 5", 45 "import.notSupportedHeadline": "Servizi non ancora supportati in Ferdi 5",
@@ -88,9 +52,8 @@
88 "infobar.hide": "Nascondi", 52 "infobar.hide": "Nascondi",
89 "infobar.requiredRequestsFailed": "Impossibile caricare i servizi e le informazioni dell'utente", 53 "infobar.requiredRequestsFailed": "Impossibile caricare i servizi e le informazioni dell'utente",
90 "infobar.servicesUpdated": "I tuoi servizi sono stati aggiornati.", 54 "infobar.servicesUpdated": "I tuoi servizi sono stati aggiornati.",
91 "infobar.trialActivated": "La tua prova è stata attivata con successo. Buona chat!",
92 "infobar.updateAvailable": "È disponibile un nuovo aggiornamento di Ferdi.", 55 "infobar.updateAvailable": "È disponibile un nuovo aggiornamento di Ferdi.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Annulla",
94 "invite.email.label": "Indirizzo email", 57 "invite.email.label": "Indirizzo email",
95 "invite.headline.friends": "Invita 3 dei tuoi amici o colleghi", 58 "invite.headline.friends": "Invita 3 dei tuoi amici o colleghi",
96 "invite.name.label": "Nome", 59 "invite.name.label": "Nome",
@@ -106,8 +69,8 @@
106 "locked.touchIdPrompt": "sblocca con Touch ID", 69 "locked.touchIdPrompt": "sblocca con Touch ID",
107 "locked.unlockWithPassword": "Sblocca con Password", 70 "locked.unlockWithPassword": "Sblocca con Password",
108 "login.changeServer": "Cambia Server", 71 "login.changeServer": "Cambia Server",
109 "login.customServerQuestion": "Using a custom Ferdi server?", 72 "login.customServerQuestion": "Utilizzare un account Franz per effettuare il login?",
110 "login.customServerSuggestion": "Try importing your Franz account", 73 "login.customServerSuggestion": "Prova ad importare il tuo account Franz in Ferdi",
111 "login.email.label": "Indirizzo email", 74 "login.email.label": "Indirizzo email",
112 "login.headline": "Accedi", 75 "login.headline": "Accedi",
113 "login.invalidCredentials": "Email o password non valide", 76 "login.invalidCredentials": "Email o password non valide",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Nascondi automaticamente la barra del menù", 87 "menu.app.autohideMenuBar": "Nascondi automaticamente la barra del menù",
125 "menu.app.checkForUpdates": "Controlla aggiornamenti", 88 "menu.app.checkForUpdates": "Controlla aggiornamenti",
126 "menu.app.hide": "Nascondi", 89 "menu.app.hide": "Nascondi",
127 "menu.app.hideOthers": "Nascondi altri", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Esci", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Impostazioni", 92 "menu.app.settings": "Impostazioni",
130 "menu.app.unhide": "Mostra", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Modifica", 94 "menu.edit": "Modifica",
132 "menu.edit.copy": "Copia", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Taglia", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Elimina", 97 "menu.edit.delete": "Elimina",
135 "menu.edit.emojiSymbols": "Emoji e simboli", 98 "menu.edit.emojiSymbols": "Emoji e simboli",
136 "menu.edit.findInPage": "Trova nella pagina", 99 "menu.edit.findInPage": "Trova nella pagina",
137 "menu.edit.paste": "Incolla", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Incolla e Mantieni Stile", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Ripeti", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Seleziona Tutto", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Sintesi Vocale", 104 "menu.edit.speech": "Sintesi Vocale",
142 "menu.edit.startDictation": "Avvia Dettatura", 105 "menu.edit.startDictation": "Avvia Dettatura",
143 "menu.edit.startSpeaking": "Avvia Pronuncia", 106 "menu.edit.startSpeaking": "Avvia Pronuncia",
144 "menu.edit.stopSpeaking": "Interrompi Pronuncia", 107 "menu.edit.stopSpeaking": "Interrompi Pronuncia",
145 "menu.edit.undo": "Annulla", 108 "menu.edit.undo": "Undo",
146 "menu.file": "File", 109 "menu.file": "File",
147 "menu.help": "Aiuto", 110 "menu.help": "Help",
148 "menu.help.changelog": "Changelog", 111 "menu.help.changelog": "Changelog",
149 "menu.help.debugInfo": "Copia informazioni di debug", 112 "menu.help.debugInfo": "Copia informazioni di debug",
150 "menu.help.debugInfoCopiedBody": "Le tue informazioni di debug sono state copiate nella tua clipboard.", 113 "menu.help.debugInfoCopiedBody": "Le tue informazioni di debug sono state copiate nella tua clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Informazioni di debug di Ferdi", 114 "menu.help.debugInfoCopiedHeadline": "Informazioni di debug di Ferdi",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Maggiori Informazioni", 116 "menu.help.learnMore": "Maggiori Informazioni",
153 "menu.help.privacy": "Dichiarazione della Privacy", 117 "menu.help.privacy": "Dichiarazione della Privacy",
154 "menu.help.publishDebugInfo": "Pubblica le informazioni di debug", 118 "menu.help.publishDebugInfo": "Pubblica le informazioni di debug",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Abilita Todos", 127 "menu.todos.enableTodos": "Abilita Todos",
164 "menu.view": "Visualizza", 128 "menu.view": "Visualizza",
165 "menu.view.back": "Indietro", 129 "menu.view.back": "Indietro",
166 "menu.view.enterFullScreen": "Visualizza a Schermo Intero",
167 "menu.view.exitFullScreen": "Esci da Schermo Intero",
168 "menu.view.forward": "Avanti", 130 "menu.view.forward": "Avanti",
169 "menu.view.lockFerdi": "Blocca Ferdi", 131 "menu.view.lockFerdi": "Blocca Ferdi",
170 "menu.view.openQuickSwitch": "Apri Cambio Rapido", 132 "menu.view.openQuickSwitch": "Apri Cambio Rapido",
171 "menu.view.reloadFranz": "Ricarica Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Ricarica Servizio", 134 "menu.view.reloadService": "Ricarica Servizio",
173 "menu.view.reloadTodos": "Ricarica ToDos", 135 "menu.view.reloadTodos": "Ricarica ToDos",
174 "menu.view.resetZoom": "Dimensione Attuale", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Attiva la modalità scura", 137 "menu.view.toggleDarkMode": "Attiva la modalità scura",
176 "menu.view.toggleDevTools": "Attiva/Disattiva Strumenti Sviluppo", 138 "menu.view.toggleDevTools": "Attiva/Disattiva Strumenti Sviluppo",
177 "menu.view.toggleFullScreen": "Attiva/Disattiva Schermo Intero", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Attiva/Disattiva Strumenti per Sviluppatori di Servizi", 140 "menu.view.toggleServiceDevTools": "Attiva/Disattiva Strumenti per Sviluppatori di Servizi",
179 "menu.view.toggleTodosDevTools": "Attiva/Disattiva gli strumenti di sviluppo delle Attività", 141 "menu.view.toggleTodosDevTools": "Attiva/Disattiva gli strumenti di sviluppo delle Attività",
180 "menu.view.zoomIn": "Aumenta Zoom", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Diminuisci Zoom", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Finestra", 144 "menu.window": "Window",
183 "menu.window.close": "Chiudi", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimizza", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Aree di lavoro", 147 "menu.workspaces": "Aree di lavoro",
186 "menu.workspaces.addNewWorkspace": "Aggiungi un'area di lavoro...", 148 "menu.workspaces.addNewWorkspace": "Aggiungi un'area di lavoro...",
187 "menu.workspaces.closeWorkspaceDrawer": "Chiudi il menu dei workspace", 149 "menu.workspaces.closeWorkspaceDrawer": "Chiudi il menu dei workspace",
@@ -194,11 +156,7 @@
194 "password.noUser": "Non è stato trovato nessun utente con questo indirizzo email", 156 "password.noUser": "Non è stato trovato nessun utente con questo indirizzo email",
195 "password.submit.label": "Invia", 157 "password.submit.label": "Invia",
196 "password.successInfo": "Per favore controlla la tua email", 158 "password.successInfo": "Per favore controlla la tua email",
197 "premiumFeature.button.upgradeAccount": "Effettua l'upgrade del tuo account",
198 "pricing.features.accountSync": "Sincronizzazione account", 159 "pricing.features.accountSync": "Sincronizzazione account",
199 "pricing.features.adFree": "Senza pubblicità per sempre",
200 "pricing.features.appDelays": "Nessuna schermata di attesa",
201 "pricing.features.appDelaysEnabled": "Schermate d'attesa Occasionali",
202 "pricing.features.customWebsites": "Aggiungi siti web personalizzati", 160 "pricing.features.customWebsites": "Aggiungi siti web personalizzati",
203 "pricing.features.desktopNotifications": "Notifiche desktop", 161 "pricing.features.desktopNotifications": "Notifiche desktop",
204 "pricing.features.onPremise": "Servizi ospitati & on-premise", 162 "pricing.features.onPremise": "Servizi ospitati & on-premise",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Gestione del team", 166 "pricing.features.teamManagement": "Gestione del team",
209 "pricing.features.thirdPartyServices": "Installa servizi di terze parti", 167 "pricing.features.thirdPartyServices": "Installa servizi di terze parti",
210 "pricing.features.unlimitedServices": "Aggiungi servizi illimitati", 168 "pricing.features.unlimitedServices": "Aggiungi servizi illimitati",
211 "pricing.features.upToSixServices": "Aggiungi fino a 6 servizi",
212 "pricing.features.upToThreeServices": "Aggiungi fino a 3 servizi",
213 "pricing.features.workspaces": "Aree di lavoro", 169 "pricing.features.workspaces": "Aree di lavoro",
214 "pricing.plan.free": "Ferdi Gratuito",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Mensile",
218 "pricing.plan.personal-yearly": "Ferdi Personal Annuale",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Mensile",
221 "pricing.plan.pro-yearly": "Ferdi Professional Annuale",
222 "pricing.trial.cta.accept": "Sì, potenzia il mio account a Ferdi Professional",
223 "pricing.trial.cta.skip": "Continua su Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Ci dispiace, non abbiamo potuto attivare la tua prova!",
226 "pricing.trial.features.headline": "Ferdi Professional include:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "La tua prova gratuita finirà automaticamente dopo 14 giorni",
232 "pricing.trial.terms.headline": "Senza impegno",
233 "pricing.trial.terms.noCreditCard": "Nessuna carta di credito richiesta",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Ricarica {name}", 170 "service.crashHandler.action": "Ricarica {name}",
236 "service.crashHandler.autoReload": "Tentativo di ripristino automatico di {name} in {seconds} secondi", 171 "service.crashHandler.autoReload": "Tentativo di ripristino automatico di {name} in {seconds} secondi",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "Errore", 179 "service.errorHandler.message": "Errore",
245 "service.errorHandler.text": "{name} non si è caricato correttamente.", 180 "service.errorHandler.text": "{name} non si è caricato correttamente.",
246 "service.restrictedHandler.action": "Potenzia l'Account",
247 "service.restrictedHandler.customUrl.headline": "Richiesto il piano Ferdi Professional",
248 "service.restrictedHandler.customUrl.text": "Per favore aggiorna al piano Ferdi Professional per usare url personalizzati e servizi da te ospitati.",
249 "service.restrictedHandler.serviceLimit.headline": "Hai raggiunto il tuo limite di servizio.",
250 "service.restrictedHandler.serviceLimit.text": "Per favore potenzia il tuo account per usare più di {count} servizi.",
251 "service.webviewLoader.loading": "Caricamento {service}", 181 "service.webviewLoader.loading": "Caricamento {service}",
252 "services.getStarted": "Iniziamo", 182 "services.getStarted": "Iniziamo",
253 "services.login": "Effettua il login per utlizzare Ferdi.", 183 "services.login": "Effettua il login per utlizzare Ferdi.",
254 "services.serverInfo": "Eventualmente, è possibile modificare server Ferdi facendo click sull'ingranaggio in basso a sinistra.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Usa Ferdi senza account", 185 "services.serverless": "Usa Ferdi senza account",
256 "services.welcome": "Benvenuto su Ferdi", 186 "services.welcome": "Benvenuto su Ferdi",
257 "settings.account.account.editButton": "Modifica account", 187 "settings.account.account.editButton": "Modifica account",
258 "settings.account.accountType.basic": "Account Base",
259 "settings.account.accountType.premium": "Account Supporter Premium ",
260 "settings.account.accountUnavailable": "Account non disponibile", 188 "settings.account.accountUnavailable": "Account non disponibile",
261 "settings.account.accountUnavailableInfo": "Stai usando Ferdi senza un account. Se si desidera aggiungere un account, e tenere sincronizzati i servizi tra le installazioni, selezionare un server nel tab delle Impostazioni e quindi login.", 189 "settings.account.accountUnavailableInfo": "Stai usando Ferdi senza un account. Se si desidera aggiungere un account, e tenere sincronizzati i servizi tra le installazioni, selezionare un server nel tab delle Impostazioni e quindi login.",
262 "settings.account.buttonSave": "Aggiorna profilo", 190 "settings.account.buttonSave": "Aggiorna profilo",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Fatture", 197 "settings.account.headlineInvoices": "Fatture",
270 "settings.account.headlinePassword": "Cambia password", 198 "settings.account.headlinePassword": "Cambia password",
271 "settings.account.headlineProfile": "Aggiorna profilo", 199 "settings.account.headlineProfile": "Aggiorna profilo",
272 "settings.account.headlineSubscription": "Il tuo abbonamento",
273 "settings.account.headlineTrialUpgrade": "Ottieni la tua prova gratuita di 14 giorni di Ferdi Professional",
274 "settings.account.headlineUpgradeAccount": "Potenzia il tuo account ed ottieni l'esperienza Ferdi completa",
275 "settings.account.invoiceDownload": "Scarica",
276 "settings.account.manageSubscription.label": "Gestisci il tuo abbonamento",
277 "settings.account.successInfo": "Le tue modifiche sono state salvate", 200 "settings.account.successInfo": "Le tue modifiche sono state salvate",
278 "settings.account.trial": "Prova Gratuita",
279 "settings.account.trialEndsIn": "La tua prova gratuita scade tra {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Per favore aggiorna le tue informazioni di pagamento per continuare ad usare {license} dopo il tuo periodo di prova.",
281 "settings.account.tryReloadServices": "Riprova", 201 "settings.account.tryReloadServices": "Riprova",
282 "settings.account.tryReloadUserInfoRequest": "Riprova", 202 "settings.account.tryReloadUserInfoRequest": "Riprova",
283 "settings.account.upgradeToPro.label": "Aggiorna a Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Impossibile caricare le informazioni dell'utente.", 203 "settings.account.userInfoRequestFailed": "Impossibile caricare le informazioni dell'utente.",
285 "settings.account.yourLicense": "La tua licenza Ferdi", 204 "settings.account.yourLicense": "La tua licenza Ferdi",
286 "settings.app.accentColorInfo": "Inserisci il tuo colore in risalto in un formato compatibile con CSS. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Inserisci il tuo colore in risalto in un formato compatibile con CSS. (Default: {defaultAccentColor})",
@@ -289,7 +208,7 @@
289 "settings.app.buttonSearchForUpdate": "Controlla aggiornamenti", 208 "settings.app.buttonSearchForUpdate": "Controlla aggiornamenti",
290 "settings.app.cacheInfo": "Ferdi sta utilizzando {size} di spazio su disco.", 209 "settings.app.cacheInfo": "Ferdi sta utilizzando {size} di spazio su disco.",
291 "settings.app.cacheNotCleared": "Impossibile eliminare tutta la cache", 210 "settings.app.cacheNotCleared": "Impossibile eliminare tutta la cache",
292 "settings.app.closeSettings": "Close settings", 211 "settings.app.closeSettings": "Chiudi le impostazioni",
293 "settings.app.currentVersion": "Versione attuale:", 212 "settings.app.currentVersion": "Versione attuale:",
294 "settings.app.form.accentColor": "Tema colore", 213 "settings.app.form.accentColor": "Tema colore",
295 "settings.app.form.adaptableDarkMode": "Sincronizza la modalità scusa con quella del mio sistema operativo", 214 "settings.app.form.adaptableDarkMode": "Sincronizza la modalità scusa con quella del mio sistema operativo",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Attiva controllo ortografico", 227 "settings.app.form.enableSpellchecking": "Attiva controllo ortografico",
309 "settings.app.form.enableSystemTray": "Mostra Ferdi nell'area di notifica", 228 "settings.app.form.enableSystemTray": "Mostra Ferdi nell'area di notifica",
310 "settings.app.form.enableTodos": "Abilità le Attività Ferdi", 229 "settings.app.form.enableTodos": "Abilità le Attività Ferdi",
311 "settings.app.form.hibernate": "Abilita l'ibernazione dei servizi",
312 "settings.app.form.hibernateOnStartup": "Mantieni i servizi in ibernazione all'avvio", 230 "settings.app.form.hibernateOnStartup": "Mantieni i servizi in ibernazione all'avvio",
313 "settings.app.form.hibernationStrategy": "Strategia di ibernazione", 231 "settings.app.form.hibernationStrategy": "Strategia di ibernazione",
314 "settings.app.form.iconSize": "Dimensione icone servizi", 232 "settings.app.form.iconSize": "Dimensione icone servizi",
@@ -319,7 +237,7 @@
319 "settings.app.form.minimizeToSystemTray": "Minimizza Ferdi nell'area di notifica", 237 "settings.app.form.minimizeToSystemTray": "Minimizza Ferdi nell'area di notifica",
320 "settings.app.form.navigationBarBehaviour": "Comportamento della barra di navigazione", 238 "settings.app.form.navigationBarBehaviour": "Comportamento della barra di navigazione",
321 "settings.app.form.notifyTaskBarOnMessage": "Visualizza le notifiche relative a nuovi messaggi sul Dock o sulla Taskbar", 239 "settings.app.form.notifyTaskBarOnMessage": "Visualizza le notifiche relative a nuovi messaggi sul Dock o sulla Taskbar",
322 "settings.app.form.passwordToggle": "Password toggle", 240 "settings.app.form.passwordToggle": "Attiva/Disattiva password",
323 "settings.app.form.predefinedTodoServer": "Server Todo", 241 "settings.app.form.predefinedTodoServer": "Server Todo",
324 "settings.app.form.privateNotifications": "Non mostrare il contenuto dei messaggi nelle notifiche", 242 "settings.app.form.privateNotifications": "Non mostrare il contenuto dei messaggi nelle notifiche",
325 "settings.app.form.reloadAfterResume": "Ricarica Ferdi dopo il ripristino del sistema", 243 "settings.app.form.reloadAfterResume": "Ricarica Ferdi dopo il ripristino del sistema",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Abilita la modalità scura universale", 255 "settings.app.form.universalDarkMode": "Abilita la modalità scura universale",
338 "settings.app.form.useTouchIdToUnlock": "Consenti l'utilizzo di TouchID per sbloccare Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Consenti l'utilizzo di TouchID per sbloccare Ferdi",
339 "settings.app.form.useVerticalStyle": "Usa stile verticale", 257 "settings.app.form.useVerticalStyle": "Usa stile verticale",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Impostazioni", 259 "settings.app.headline": "Impostazioni",
341 "settings.app.headlineAdvanced": "Avanzate", 260 "settings.app.headlineAdvanced": "Avanzate",
342 "settings.app.headlineAppearance": "Aspetto", 261 "settings.app.headlineAppearance": "Aspetto",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "Per impostazione predefinita, Ferdi manterrà tutti i servizi aperti e caricati in background in modo che siano pronti quando si desidera utilizzarli. Il servizio Hibernation sospenderà i servizi dopo un tempo specificato. Questo è utile per risparmiare RAM o per evitare che i servizi rallentino il computer.", 266 "settings.app.hibernateInfo": "Per impostazione predefinita, Ferdi manterrà tutti i servizi aperti e caricati in background in modo che siano pronti quando si desidera utilizzarli. Il servizio Hibernation sospenderà i servizi dopo un tempo specificato. Questo è utile per risparmiare RAM o per evitare che i servizi rallentino il computer.",
348 "settings.app.inactivityLockInfo": "Minuti di inattività oltre i quali Ferdi si bloccherà automaticamente, 0 per disabilitare", 267 "settings.app.inactivityLockInfo": "Minuti di inattività oltre i quali Ferdi si bloccherà automaticamente, 0 per disabilitare",
349 "settings.app.languageDisclaimer": "Le traduzioni ufficiali sono in Inglese e Tedesco. Tutte le altre lingue sono tradotte dalla community.", 268 "settings.app.languageDisclaimer": "Le traduzioni ufficiali sono in Inglese e Tedesco. Tutte le altre lingue sono tradotte dalla community.",
350 "settings.app.lockInfo": "Password Lock consente di mantenere i messaggi protetti.\nUsando Password Lock, ti verrà richiesto di inserire la tua password ogni volta che avvii Ferdi o di bloccare Ferdi utilizzando il simbolo del lucchetto nell'angolo in basso a sinistra o la scorciatoia CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Assicurati di impostare una password che ricordi.\nSe perdi questa password, dovrai reinstallare Ferdi.", 271 "settings.app.lockedPasswordInfo": "Assicurati di impostare una password che ricordi.\nSe perdi questa password, dovrai reinstallare Ferdi.",
353 "settings.app.restartRequired": "Le modifiche richiedono un riavvio", 272 "settings.app.restartRequired": "Le modifiche richiedono un riavvio",
354 "settings.app.scheduledDNDInfo": "I Do-not-Disturb pianificati consentono di definire un periodo di tempo nel quale le notifiche da Ferdi saranno disabilitate.", 273 "settings.app.scheduledDNDInfo": "I Do-not-Disturb pianificati consentono di definire un periodo di tempo nel quale le notifiche da Ferdi saranno disabilitate.",
355 "settings.app.scheduledDNDTimeInfo": "Ora in formato 24 ore. L'ora di fine può essere prima dell'ora di inizio (ad esempio inizio 17:00, fine 09:00) per abilitare Do-not-Disturb durante la notte.", 274 "settings.app.scheduledDNDTimeInfo": "Ora in formato 24 ore. L'ora di fine può essere prima dell'ora di inizio (ad esempio inizio 17:00, fine 09:00) per abilitare Do-not-Disturb durante la notte.",
356 "settings.app.sentryInfo": "L'invio dei dati di telemetria ci permette di trovare errori in Ferdi - non invieremo alcuna informazione personale come i tuoi dati dei messaggi! La modifica di questa opzione richiede il riavvio di Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi utilizza il controllo ortografico del tuo Mac per verificare la presenza di errori. Se si desidera modificare le lingue del controllo ortografico, è possibile farlo nelle preferenze di sistema del vostro Mac.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi utilizza il controllo ortografico del tuo Mac per verificare la presenza di errori. Se si desidera modificare le lingue del controllo ortografico, è possibile farlo nelle preferenze di sistema del vostro Mac.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "Questo server verrà usato per le funzionalità 'Ferdi Todo'.", 278 "settings.app.todoServerInfo": "Questo server verrà usato per le funzionalità 'Ferdi Todo'.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Apri cartella", 300 "settings.recipes.customService.openFolder": "Apri cartella",
382 "settings.recipes.headline": "Servizi disponibili", 301 "settings.recipes.headline": "Servizi disponibili",
383 "settings.recipes.missingService": "Manca un servizio?", 302 "settings.recipes.missingService": "Manca un servizio?",
384 "settings.recipes.mostPopular": "Più popolari",
385 "settings.recipes.nothingFound": "Ci scusiamo, ma nessun servizio corrisponde ai tuoi termini di ricerca - tuttavia è probabile che tu possa aggiungerlo in ogni caso utilizzando l'opzione \"Sito Web Personalizzato\". Ti informiamo che il sito web ufficiale potrebbe mostrare un numero maggiore di servizi rispetto alla versione attualmente in uso. Per ottenere tali servizi, è consigliato l'aggiornamento a una versione più recente di Ferdi.", 303 "settings.recipes.nothingFound": "Ci scusiamo, ma nessun servizio corrisponde ai tuoi termini di ricerca - tuttavia è probabile che tu possa aggiungerlo in ogni caso utilizzando l'opzione \"Sito Web Personalizzato\". Ti informiamo che il sito web ufficiale potrebbe mostrare un numero maggiore di servizi rispetto alla versione attualmente in uso. Per ottenere tali servizi, è consigliato l'aggiornamento a una versione più recente di Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Servizio aggiunto con successo", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Servizio aggiunto con successo",
387 "settings.searchService": "Cerca servizio", 305 "settings.searchService": "Cerca servizio",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Aggiungi {name}", 309 "settings.service.form.addServiceHeadline": "Aggiungi {name}",
392 "settings.service.form.availableServices": "Servizi disponibili", 310 "settings.service.form.availableServices": "Servizi disponibili",
393 "settings.service.form.customUrl": "Server personalizzato", 311 "settings.service.form.customUrl": "Server personalizzato",
394 "settings.service.form.customUrlPremiumInfo": "Per aggiungere servizi personalizzati, devi avere un account Ferdi Premium Supporter.",
395 "settings.service.form.customUrlUpgradeAccount": "Aggiorna il tuo account",
396 "settings.service.form.customUrlValidationError": "Impossibile validare il server personalizzato {name}.", 312 "settings.service.form.customUrlValidationError": "Impossibile validare il server personalizzato {name}.",
397 "settings.service.form.darkReaderBrightness": "Luminosità della Modalità Scura", 313 "settings.service.form.darkReaderBrightness": "Luminosità della Modalità Scura",
398 "settings.service.form.darkReaderContrast": "Contrasto della Modalità Scura", 314 "settings.service.form.darkReaderContrast": "Contrasto della Modalità Scura",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Il gestore di Team di Franz (Franz's Team Management) ti consente di gestire gli abbonamenti Franz (Franz Subscriptions) per più utenti. È importante ricordare che possedere un abbonamento Premium Franz non dà alcun beneficio nell'usare Ferdi. L'unico motivo per cui hai accesso al gestore di Team è perchè tu posa gestire i tuoi Team di Franz creati in precedenza così da non perdere alcuna funzionalità nella gestione del tuo account.", 379 "settings.team.copy": "Il gestore di Team di Franz (Franz's Team Management) ti consente di gestire gli abbonamenti Franz (Franz Subscriptions) per più utenti. È importante ricordare che possedere un abbonamento Premium Franz non dà alcun beneficio nell'usare Ferdi. L'unico motivo per cui hai accesso al gestore di Team è perchè tu posa gestire i tuoi Team di Franz creati in precedenza così da non perdere alcuna funzionalità nella gestione del tuo account.",
464 "settings.team.headline": "Gruppo", 380 "settings.team.headline": "Gruppo",
465 "settings.team.intro": "Al momento stai usando i Server di Franz. Questo è il motivo per cui puoi accedere alla gestione dei Team (Team Management).", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Gestisci i tuoi Team su meetfranz.com", 382 "settings.team.manageAction": "Gestisci i tuoi Team su meetfranz.com",
467 "settings.team.teamsUnavailable": "I Teams non sono disponibili", 383 "settings.team.teamsUnavailable": "I Teams non sono disponibili",
468 "settings.team.teamsUnavailableInfo": "I Team sono disponibili esclusivamente usando Franz Server e dopo aver attivato Franz Professional (a pagamento). Per poter utilizzare i Team è necessario modificare il server in https://api.franzinfra.com.", 384 "settings.team.teamsUnavailableInfo": "I Team sono disponibili esclusivamente usando Franz Server e dopo aver attivato Franz Professional (a pagamento). Per poter utilizzare i Team è necessario modificare il server in https://api.franzinfra.com.",
469 "settings.team.upgradeAction": "Aggiorna il tuo Account",
470 "settings.user.form.accountType.company": "Società", 385 "settings.user.form.accountType.company": "Società",
471 "settings.user.form.accountType.individual": "Individuale", 386 "settings.user.form.accountType.individual": "Individuale",
472 "settings.user.form.accountType.label": "Tipo di account", 387 "settings.user.form.accountType.label": "Tipo di account",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Hai già un account, vuoi accedere?", 431 "signup.link.login": "Hai già un account, vuoi accedere?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Crea un account", 433 "signup.submit.label": "Crea un account",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Sì, inizia la prova gratuita di Ferdi Professional",
521 "subscription.cta.allOptions": "Vedi tutte le opzioni",
522 "subscription.cta.choosePlan": "Scegli il tuo piano",
523 "subscription.includedProFeatures": "Il piano Ferdi Professional include:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per mese",
526 "subscription.interval.perMonthPerUser": "per mese e utente",
527 "subscription.planItem.upgradeAccount": "Potenzia l'Account",
528 "subscription.teaser.includedFeatures": "I piani Ferdi a pagamento includono:",
529 "subscription.teaser.intro": "Ferdi 5 contiene un ampia gamma di nuove caratteristiche per potenziare le tue comunicazioni di tutti i giorni - incluse le batterie. Dai un'occhiata ai nostri nuovi piani per scoprire quale si adatta di più a te!",
530 "subscriptionPopup.buttonCancel": "Annulla",
531 "subscriptionPopup.buttonDone": "Fatto",
532 "tabs.item.confirmDeleteService": "Vuoi davvero eliminare il servizio {serviceName}?", 434 "tabs.item.confirmDeleteService": "Vuoi davvero eliminare il servizio {serviceName}?",
533 "tabs.item.deleteService": "Elimina servizio", 435 "tabs.item.deleteService": "Elimina servizio",
534 "tabs.item.disableAudio": "Disattiva audio", 436 "tabs.item.disableAudio": "Disattiva audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Disattiva notifiche", 438 "tabs.item.disableNotifications": "Disattiva notifiche",
536 "tabs.item.disableService": "Disattiva servizio", 439 "tabs.item.disableService": "Disattiva servizio",
537 "tabs.item.edit": "Modifica", 440 "tabs.item.edit": "Modifica",
538 "tabs.item.enableAudio": "Attiva audio", 441 "tabs.item.enableAudio": "Attiva audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Attiva le notifiche", 443 "tabs.item.enableNotification": "Attiva le notifiche",
540 "tabs.item.enableService": "Attiva il servizio", 444 "tabs.item.enableService": "Attiva il servizio",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Ricarica", 446 "tabs.item.reload": "Ricarica",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} non valido", 448 "validation.email": "{field} non valido",
543 "validation.minLength": "{field} dovrebbe contenere almeno {length} caratteri", 449 "validation.minLength": "{field} dovrebbe contenere almeno {length} caratteri",
544 "validation.oneRequired": "Almeno un campo è richiesto", 450 "validation.oneRequired": "Almeno un campo è richiesto",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Aree di lavoro", 462 "workspaceDrawer.headline": "Aree di lavoro",
557 "workspaceDrawer.item.contextMenuEdit": "Modifica", 463 "workspaceDrawer.item.contextMenuEdit": "Modifica",
558 "workspaceDrawer.item.noServicesAddedYet": "Nessun servizio aggiunto", 464 "workspaceDrawer.item.noServicesAddedYet": "Nessun servizio aggiunto",
559 "workspaceDrawer.premiumCtaButtonLabel": "Crea il tuo primo workspace",
560 "workspaceDrawer.proFeatureBadge": "Funzionalità premium",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Riattiva l’account premium",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>I workspace di Ferdi ti permettono di concentrarti su ciò che è importante. Configura diversi insiemi di servizi e passa facilmente da uno all’altro quando vuoi.</p><p>Decidi di quali servizi hai bisogno quando e dove, così che ti possiamo aiutare a dare sempre il massimo - o semplicemente staccare dal lavoro quando ne hai bisogno.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>I workspace di Ferdi ti permettono di concentrarti su ciò che è importante. Configura diversi insiemi di servizi e passa facilmente da uno all’altro quando vuoi.</p><p>Decidi di quali servizi hai bisogno quando e dove, così che ti possiamo aiutare a dare sempre il massimo - o semplicemente staccare dal lavoro quando ne hai bisogno.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Modifica le impostazioni dei workspace", 466 "workspaceDrawer.workspacesSettingsTooltip": "Modifica le impostazioni dei workspace",
564 "workspaces.switchingIndicator.switchingTo": "Passa a " 467 "workspaces.switchingIndicator.switchingTo": "Passa a "
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index 0aeac2891..707f08071 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "{name}への接続が切断されました。", 12 "connectionLostBanner.message": "{name}への接続が切断されました。",
13 "feature.announcements.changelog.headline": "Ferdi {version}の変更点", 13 "feature.announcements.changelog.headline": "Ferdi {version}の変更点",
14 "feature.debugger.title": "デバッグ情報の記録", 14 "feature.debugger.title": "デバッグ情報の記録",
15 "feature.delayApp.headline": "Ferdiをすぐに起動するには、Ferdi サポーターライセンスを購入してください。",
16 "feature.delayApp.text": "Ferdiは{seconds}秒後に起動します。",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Ferdiサポーターライセンスを購入する",
21 "feature.delayApp.upgrade.actionShort": "アカウントをアップグレード",
22 "feature.nightlyBuilds.activate": "有効化", 15 "feature.nightlyBuilds.activate": "有効化",
23 "feature.nightlyBuilds.cancel": "キャンセル", 16 "feature.nightlyBuilds.cancel": "キャンセル",
24 "feature.nightlyBuilds.info": "Nightlyビルドは未検証や未完成の機能が含まれる非常に実験的なバージョンです。このバージョンは、主に新機能のテストや最新ビルドでの検証を行う開発者が使用するものです。これを理解していない方は、Nightlyビルドを有効化しないことをおすすめします。", 17 "feature.nightlyBuilds.info": "Nightlyビルドは未検証や未完成の機能が含まれる非常に実験的なバージョンです。このバージョンは、主に新機能のテストや最新ビルドでの検証を行う開発者が使用するものです。これを理解していない方は、Nightlyビルドを有効化しないことをおすすめします。",
25 "feature.nightlyBuilds.title": "Nightlyビルド", 18 "feature.nightlyBuilds.title": "Nightlyビルド",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "デバッグ情報の公開中にエラーが発生しました。後でもう一度試すか、コンソールを表示して詳細な情報を確認します。", 19 "feature.publishDebugInfo.error": "デバッグ情報の公開中にエラーが発生しました。後でもう一度試すか、コンソールを表示して詳細な情報を確認します。",
43 "feature.publishDebugInfo.info": "デバッグ情報を公開することで、Ferdiの開発者が問題やエラーを発見する手助けとなります。 デバッグ情報を公開することで、Ferdi Debuggerのプライバシーポリシーと利用規約に同意したことになります。", 20 "feature.publishDebugInfo.info": "デバッグ情報を公開することで、Ferdiの開発者が問題やエラーを発見する手助けとなります。 デバッグ情報を公開することで、Ferdi Debuggerのプライバシーポリシーと利用規約に同意したことになります。",
44 "feature.publishDebugInfo.privacy": "プライバシーポリシー", 21 "feature.publishDebugInfo.privacy": "プライバシーポリシー",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Tab, ↑, ↓でサービスを選択します。Enterでサービスを開きます", 26 "feature.quickSwitch.info": "Tab, ↑, ↓でサービスを選択します。Enterでサービスを開きます",
50 "feature.quickSwitch.search": "検索...", 27 "feature.quickSwitch.search": "検索...",
51 "feature.quickSwitch.title": "クイックスイッチ", 28 "feature.quickSwitch.title": "クイックスイッチ",
52 "feature.serviceLimit.limitReached": "このプランで利用できるサービス{limit}個のうち、{amount}個が追加済みです。さらにサービスを追加したい場合はアカウントをアップグレードしてください。",
53 "feature.shareFranz.action.email": "メールで送信", 29 "feature.shareFranz.action.email": "メールで送信",
54 "feature.shareFranz.action.facebook": "Facebookでシェア", 30 "feature.shareFranz.action.facebook": "Facebookでシェア",
55 "feature.shareFranz.action.twitter": "Twitterでシェア", 31 "feature.shareFranz.action.twitter": "Twitterでシェア",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Ferdiで{count}個のサービスを使っています!あなたもGmail, Messenger, Slack, SkypeなどのサービスをFerdiで一元管理しましょう! www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Ferdiで{count}個のサービスを使っています!あなたもGmail, Messenger, Slack, SkypeなどのサービスをFerdiで一元管理しましょう! www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "{count}個のサービスをFerdiに追加しました!WhatsApp, Messenger, Slack, Skypeなどを一元管理する無料のアプリをダウンロードしましょう www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "{count}個のサービスをFerdiに追加しました!WhatsApp, Messenger, Slack, Skypeなどを一元管理する無料のアプリをダウンロードしましょう www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "あなたのお友達にFerdiを教えてあげましょう。", 35 "feature.shareFranz.text": "あなたのお友達にFerdiを教えてあげましょう。",
60 "feature.todos.premium.info": "Ferdi ToDoはプレミアムユーザーがご利用できます!",
61 "feature.todos.premium.rollout": "もうしばらくお待ちください。",
62 "feature.todos.premium.upgrade": "アカウントをアップグレード",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Ferdiのオンラインサービスに接続できません。", 36 "global.api.unhealthy": "Ferdiのオンラインサービスに接続できません。",
71 "global.franzProRequired": "Ferdi Professionalが必要です",
72 "global.notConnectedToTheInternet": "インターネットに接続されていません。", 37 "global.notConnectedToTheInternet": "インターネットに接続されていません。",
73 "global.spellchecker.useDefault": " {default}を初期設定で使用してください", 38 "global.spellchecker.useDefault": " {default}を初期設定で使用してください",
74 "global.spellchecking.autodetect": "言語を自動的に検出する", 39 "global.spellchecking.autodetect": "言語を自動的に検出する",
75 "global.spellchecking.autodetect.short": "自動", 40 "global.spellchecking.autodetect.short": "自動",
76 "global.spellchecking.language": "スペルチェックする言語", 41 "global.spellchecking.language": "スペルチェックする言語",
77 "global.upgradeButton.upgradeToPro": "Ferdi Professionalにアップグレード",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "ユーザーエージェント", 43 "global.userAgentPref": "ユーザーエージェント",
80 "import.headline": "Ferdi 4のサービスをインポートして下さい", 44 "import.headline": "Ferdi 4のサービスをインポートして下さい",
@@ -88,7 +52,6 @@
88 "infobar.hide": "隠す", 52 "infobar.hide": "隠す",
89 "infobar.requiredRequestsFailed": "サービスとユーザー情報を読み込めませんでした", 53 "infobar.requiredRequestsFailed": "サービスとユーザー情報を読み込めませんでした",
90 "infobar.servicesUpdated": "サービスが更新されました。", 54 "infobar.servicesUpdated": "サービスが更新されました。",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Ferdiの更新があります。", 55 "infobar.updateAvailable": "Ferdiの更新があります。",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "メールアドレス", 57 "invite.email.label": "メールアドレス",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "メニューバーを自動的に隠す", 87 "menu.app.autohideMenuBar": "メニューバーを自動的に隠す",
125 "menu.app.checkForUpdates": "更新の確認", 88 "menu.app.checkForUpdates": "更新の確認",
126 "menu.app.hide": "隠す", 89 "menu.app.hide": "隠す",
127 "menu.app.hideOthers": "他を隠す", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "終了", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "設定", 92 "menu.app.settings": "設定",
130 "menu.app.unhide": "表示する", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "編集", 94 "menu.edit": "編集",
132 "menu.edit.copy": "コピー", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "切り取り", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "削除", 97 "menu.edit.delete": "削除",
135 "menu.edit.emojiSymbols": "絵文字とシンボル", 98 "menu.edit.emojiSymbols": "絵文字とシンボル",
136 "menu.edit.findInPage": "ページ内を検索", 99 "menu.edit.findInPage": "ページ内を検索",
137 "menu.edit.paste": "貼り付け", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "書式を統一して貼り付け", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "やり直し", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "全て選択", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "読み上げ", 104 "menu.edit.speech": "読み上げ",
142 "menu.edit.startDictation": "音声入力を開始", 105 "menu.edit.startDictation": "音声入力を開始",
143 "menu.edit.startSpeaking": "読み上げを開始", 106 "menu.edit.startSpeaking": "読み上げを開始",
144 "menu.edit.stopSpeaking": "読み上げを停止", 107 "menu.edit.stopSpeaking": "読み上げを停止",
145 "menu.edit.undo": "元に戻す", 108 "menu.edit.undo": "Undo",
146 "menu.file": "ファイル", 109 "menu.file": "ファイル",
147 "menu.help": "ヘルプ", 110 "menu.help": "Help",
148 "menu.help.changelog": "更新履歴", 111 "menu.help.changelog": "更新履歴",
149 "menu.help.debugInfo": "デバッグ情報をコピー", 112 "menu.help.debugInfo": "デバッグ情報をコピー",
150 "menu.help.debugInfoCopiedBody": "デバッグ情報をクリップボードにコピーしました。", 113 "menu.help.debugInfoCopiedBody": "デバッグ情報をクリップボードにコピーしました。",
151 "menu.help.debugInfoCopiedHeadline": "Ferdiデバッグ情報", 114 "menu.help.debugInfoCopiedHeadline": "Ferdiデバッグ情報",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Ferdiについて", 116 "menu.help.learnMore": "Ferdiについて",
153 "menu.help.privacy": "プライバシーについて", 117 "menu.help.privacy": "プライバシーについて",
154 "menu.help.publishDebugInfo": "デバッグ情報の公開", 118 "menu.help.publishDebugInfo": "デバッグ情報の公開",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "ToDoを有効にする", 127 "menu.todos.enableTodos": "ToDoを有効にする",
164 "menu.view": "表示", 128 "menu.view": "表示",
165 "menu.view.back": "戻る", 129 "menu.view.back": "戻る",
166 "menu.view.enterFullScreen": "全画面表示",
167 "menu.view.exitFullScreen": "全画面表示を終了する",
168 "menu.view.forward": "次へ", 130 "menu.view.forward": "次へ",
169 "menu.view.lockFerdi": "Ferdiをロック", 131 "menu.view.lockFerdi": "Ferdiをロック",
170 "menu.view.openQuickSwitch": "クイックスイッチを開く", 132 "menu.view.openQuickSwitch": "クイックスイッチを開く",
171 "menu.view.reloadFranz": "再起動", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "サービスをリロードする", 134 "menu.view.reloadService": "サービスをリロードする",
173 "menu.view.reloadTodos": "ToDoをリロード", 135 "menu.view.reloadTodos": "ToDoをリロード",
174 "menu.view.resetZoom": "元のサイズ", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "ダークモードを切り替える", 137 "menu.view.toggleDarkMode": "ダークモードを切り替える",
176 "menu.view.toggleDevTools": "開発者ツールを切り替え", 138 "menu.view.toggleDevTools": "開発者ツールを切り替え",
177 "menu.view.toggleFullScreen": "全画面表示の切り替え", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "サービス開発者ツールを切り替え", 140 "menu.view.toggleServiceDevTools": "サービス開発者ツールを切り替え",
179 "menu.view.toggleTodosDevTools": "ToDoの開発者モードを切り替える", 141 "menu.view.toggleTodosDevTools": "ToDoの開発者モードを切り替える",
180 "menu.view.zoomIn": "表示を拡大する", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "表示を縮小する", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "ウィンドウ", 144 "menu.window": "Window",
183 "menu.window.close": "閉じる", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "最小化", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "ワークスペース", 147 "menu.workspaces": "ワークスペース",
186 "menu.workspaces.addNewWorkspace": "ワークスペースを追加", 148 "menu.workspaces.addNewWorkspace": "ワークスペースを追加",
187 "menu.workspaces.closeWorkspaceDrawer": "ワークスペースドロワーを閉じる", 149 "menu.workspaces.closeWorkspaceDrawer": "ワークスペースドロワーを閉じる",
@@ -194,11 +156,7 @@
194 "password.noUser": "このメールアドレスはまだ登録されていません", 156 "password.noUser": "このメールアドレスはまだ登録されていません",
195 "password.submit.label": "送信", 157 "password.submit.label": "送信",
196 "password.successInfo": "メールを確認して下さい", 158 "password.successInfo": "メールを確認して下さい",
197 "premiumFeature.button.upgradeAccount": "アカウントをアップグレード",
198 "pricing.features.accountSync": "アカウントの同期", 159 "pricing.features.accountSync": "アカウントの同期",
199 "pricing.features.adFree": "永年広告なし",
200 "pricing.features.appDelays": "待ち無し",
201 "pricing.features.appDelaysEnabled": "時々表示される待ち",
202 "pricing.features.customWebsites": "カスタムサイトを追加", 160 "pricing.features.customWebsites": "カスタムサイトを追加",
203 "pricing.features.desktopNotifications": "デスクトップ通知", 161 "pricing.features.desktopNotifications": "デスクトップ通知",
204 "pricing.features.onPremise": "オンプレミスおよびその他のホスティングサービス", 162 "pricing.features.onPremise": "オンプレミスおよびその他のホスティングサービス",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "チーム管理", 166 "pricing.features.teamManagement": "チーム管理",
209 "pricing.features.thirdPartyServices": "サードパーティ製サービスをインストール", 167 "pricing.features.thirdPartyServices": "サードパーティ製サービスをインストール",
210 "pricing.features.unlimitedServices": "無制限にサービスを追加", 168 "pricing.features.unlimitedServices": "無制限にサービスを追加",
211 "pricing.features.upToSixServices": "最大6個のサービスを追加",
212 "pricing.features.upToThreeServices": "最大3個のサービスを追加",
213 "pricing.features.workspaces": "ワークスペース", 169 "pricing.features.workspaces": "ワークスペース",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal (月額課金)",
218 "pricing.plan.personal-yearly": "Ferdi Personal (年額課金)",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional (月額課金)",
221 "pricing.plan.pro-yearly": "Ferdi Professional (年額課金)",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "{name}を再読み込み", 170 "service.crashHandler.action": "{name}を再読み込み",
236 "service.crashHandler.autoReload": "{seconds}秒後、自動的に{name}の復旧を試みます", 171 "service.crashHandler.autoReload": "{seconds}秒後、自動的に{name}の復旧を試みます",
237 "service.crashHandler.headline": "しまった!", 172 "service.crashHandler.headline": "しまった!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "しまった!", 178 "service.errorHandler.headline": "しまった!",
244 "service.errorHandler.message": "エラー", 179 "service.errorHandler.message": "エラー",
245 "service.errorHandler.text": "{name} はロードに失敗しました", 180 "service.errorHandler.text": "{name} はロードに失敗しました",
246 "service.restrictedHandler.action": "アカウントをアップグレード",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professionalプランが必要です",
248 "service.restrictedHandler.customUrl.text": "カスタムURLとセルフホスティングサービスを使用するには、Ferdi Professionalプランにアップグレードしてください。",
249 "service.restrictedHandler.serviceLimit.headline": "サービス数の上限に達しました。",
250 "service.restrictedHandler.serviceLimit.text": "{count}個以上のサービスを利用するにはアカウントをアップグレードしてください。",
251 "service.webviewLoader.loading": "{service}を読み込み中", 181 "service.webviewLoader.loading": "{service}を読み込み中",
252 "services.getStarted": "はじめる", 182 "services.getStarted": "はじめる",
253 "services.login": "Ferdiを使用するにはログインしてください。", 183 "services.login": "Ferdiを使用するにはログインしてください。",
254 "services.serverInfo": "必要に応じて、左下の歯車をクリックしてFerdiサーバーを変更できます。", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "アカウントなしでFerdiを使用する", 185 "services.serverless": "アカウントなしでFerdiを使用する",
256 "services.welcome": "Ferdiにようこそ", 186 "services.welcome": "Ferdiにようこそ",
257 "settings.account.account.editButton": "アカウントの編集", 187 "settings.account.account.editButton": "アカウントの編集",
258 "settings.account.accountType.basic": "Basicアカウント",
259 "settings.account.accountType.premium": "Premium Supporterアカウント",
260 "settings.account.accountUnavailable": "アカウントが利用できません", 188 "settings.account.accountUnavailable": "アカウントが利用できません",
261 "settings.account.accountUnavailableInfo": "アカウントなしでFerdiを使用しています。 Ferdiのアカウントを使用してコンピューター間でサービスを同期させる場合、 設定タブでサーバーを選択してログインしてください。", 189 "settings.account.accountUnavailableInfo": "アカウントなしでFerdiを使用しています。 Ferdiのアカウントを使用してコンピューター間でサービスを同期させる場合、 設定タブでサーバーを選択してログインしてください。",
262 "settings.account.buttonSave": "プロフィールの更新", 190 "settings.account.buttonSave": "プロフィールの更新",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "請求書", 197 "settings.account.headlineInvoices": "請求書",
270 "settings.account.headlinePassword": "パスワードの変更", 198 "settings.account.headlinePassword": "パスワードの変更",
271 "settings.account.headlineProfile": "プロフィールの更新", 199 "settings.account.headlineProfile": "プロフィールの更新",
272 "settings.account.headlineSubscription": "あなたの登録内容",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "アカウントをアップグレードしてFerdiの全機能を手に入れましょう",
275 "settings.account.invoiceDownload": "ダウンロード",
276 "settings.account.manageSubscription.label": "サブスクリプションの管理",
277 "settings.account.successInfo": "変更内容が保存されました", 200 "settings.account.successInfo": "変更内容が保存されました",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "もう一度試す", 201 "settings.account.tryReloadServices": "もう一度試す",
282 "settings.account.tryReloadUserInfoRequest": "もう一度試す", 202 "settings.account.tryReloadUserInfoRequest": "もう一度試す",
283 "settings.account.upgradeToPro.label": "Ferdi Professionalにアップグレード",
284 "settings.account.userInfoRequestFailed": "ユーザ情報を読み込めませんでした", 203 "settings.account.userInfoRequestFailed": "ユーザ情報を読み込めませんでした",
285 "settings.account.yourLicense": "ご利用中のFerdiライセンス", 204 "settings.account.yourLicense": "ご利用中のFerdiライセンス",
286 "settings.app.accentColorInfo": "CSSフォーマットでアクセントカラーを記述してください。(デフォルト: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "CSSフォーマットでアクセントカラーを記述してください。(デフォルト: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "スペルチェックを有効にする", 227 "settings.app.form.enableSpellchecking": "スペルチェックを有効にする",
309 "settings.app.form.enableSystemTray": "Ferdiをシステムトレイに表示する", 228 "settings.app.form.enableSystemTray": "Ferdiをシステムトレイに表示する",
310 "settings.app.form.enableTodos": "Ferdi ToDoを有効にする", 229 "settings.app.form.enableTodos": "Ferdi ToDoを有効にする",
311 "settings.app.form.hibernate": "サービスの休止を有効化する",
312 "settings.app.form.hibernateOnStartup": "起動時にサービスを休止状態にする", 230 "settings.app.form.hibernateOnStartup": "起動時にサービスを休止状態にする",
313 "settings.app.form.hibernationStrategy": "休止状態の方法", 231 "settings.app.form.hibernationStrategy": "休止状態の方法",
314 "settings.app.form.iconSize": "サービスのアイコンサイズ", 232 "settings.app.form.iconSize": "サービスのアイコンサイズ",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "ユニバーサルダークモードを有効にする", 255 "settings.app.form.universalDarkMode": "ユニバーサルダークモードを有効にする",
338 "settings.app.form.useTouchIdToUnlock": "Touch IDを使用してFerdiのロックを解除する", 256 "settings.app.form.useTouchIdToUnlock": "Touch IDを使用してFerdiのロックを解除する",
339 "settings.app.form.useVerticalStyle": "垂直レイアウトを使用する", 257 "settings.app.form.useVerticalStyle": "垂直レイアウトを使用する",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "設定", 259 "settings.app.headline": "設定",
341 "settings.app.headlineAdvanced": "詳細", 260 "settings.app.headlineAdvanced": "詳細",
342 "settings.app.headlineAppearance": "表示スタイル", 261 "settings.app.headlineAppearance": "表示スタイル",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "デフォルトでは、Ferdiはすべてのサービスをバックグラウンドで開いて読み込んでおくので、使いたいときにすぐに使えます。 サービス休止機能は設定した時間が経過したら読み込んだサービスを解放します。これはRAMを節約したり、サービスでコンピューターの動作が重くなるのを防ぐのに役立ちます。", 266 "settings.app.hibernateInfo": "デフォルトでは、Ferdiはすべてのサービスをバックグラウンドで開いて読み込んでおくので、使いたいときにすぐに使えます。 サービス休止機能は設定した時間が経過したら読み込んだサービスを解放します。これはRAMを節約したり、サービスでコンピューターの動作が重くなるのを防ぐのに役立ちます。",
348 "settings.app.inactivityLockInfo": "休止状態までの時間(分)、この時間が経過後Ferdiは自動でロックします。0で無効化", 267 "settings.app.inactivityLockInfo": "休止状態までの時間(分)、この時間が経過後Ferdiは自動でロックします。0で無効化",
349 "settings.app.languageDisclaimer": "公式の言語は英語とドイツ語です。他の言語はコミュニティによる翻訳です。", 268 "settings.app.languageDisclaimer": "公式の言語は英語とドイツ語です。他の言語はコミュニティによる翻訳です。",
350 "settings.app.lockInfo": "パスワードロックはメッセージを保護できます。\nパスワードロックを使用すると、Ferdiの起動時、または自分で左下のロックボタンを押すかショートカット(CommandまたはCtrl + Shift + L)でFerdiをロックしたときに、その都度パスワードの入力が求められます。", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "パスワード", 270 "settings.app.lockedPassword": "パスワード",
352 "settings.app.lockedPasswordInfo": "覚えられるパスワードを設定するようにしてください。\nパスワードを紛失すると、Ferdiの再インストールが必要になります。", 271 "settings.app.lockedPasswordInfo": "覚えられるパスワードを設定するようにしてください。\nパスワードを紛失すると、Ferdiの再インストールが必要になります。",
353 "settings.app.restartRequired": "変更には再起動が必要です", 272 "settings.app.restartRequired": "変更には再起動が必要です",
354 "settings.app.scheduledDNDInfo": "集中モードのスケジュールを有効にすると、Ferdiからの通知を受け取らない時間帯を設定することができます。", 273 "settings.app.scheduledDNDInfo": "集中モードのスケジュールを有効にすると、Ferdiからの通知を受け取らない時間帯を設定することができます。",
355 "settings.app.scheduledDNDTimeInfo": "24時間形式で入力してください。終了時刻を開始時刻よりも早く設定すると(例: 17:00開始、9:00終了)、集中モードを一晩中有効にできます。", 274 "settings.app.scheduledDNDTimeInfo": "24時間形式で入力してください。終了時刻を開始時刻よりも早く設定すると(例: 17:00開始、9:00終了)、集中モードを一晩中有効にできます。",
356 "settings.app.sentryInfo": "統計情報を送信すると開発者がFerdiのエラーを発見するのに役立ちます。メッセージのデータのような個人情報は一切送信しません。この設定の反映にはFerdiの再起動が必要です。", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "FerdiはスペルチェックにmacOSシステムのスペルチェッカーを使用しています。スペルチェッカーでチェックする言語を変更するには、macOSのシステム環境設定から行ってください。", 276 "settings.app.spellCheckerLanguageInfo": "FerdiはスペルチェックにmacOSシステムのスペルチェッカーを使用しています。スペルチェッカーでチェックする言語を変更するには、macOSのシステム環境設定から行ってください。",
358 "settings.app.subheadlineCache": "キャッシュ", 277 "settings.app.subheadlineCache": "キャッシュ",
359 "settings.app.todoServerInfo": "このサーバーは「Ferdi ToDo」の機能に使用されます。", 278 "settings.app.todoServerInfo": "このサーバーは「Ferdi ToDo」の機能に使用されます。",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "フォルダーを開く", 300 "settings.recipes.customService.openFolder": "フォルダーを開く",
382 "settings.recipes.headline": "利用可能なサービス", 301 "settings.recipes.headline": "利用可能なサービス",
383 "settings.recipes.missingService": "使いたいサービスが一覧にありませんか?", 302 "settings.recipes.missingService": "使いたいサービスが一覧にありませんか?",
384 "settings.recipes.mostPopular": "最も人気",
385 "settings.recipes.nothingFound": "残念ながら、検索語に一致するサービスはありませんでした。しかし、「カスタムウェブサイト」のオプションを使用して追加することができます。新しいバージョンのFerdiではウェブサイトで紹介されているような、より多くのサービスが追加されていることがあります。それらの新しいサービスを追加するには、Ferdiのアップデートをご検討ください。", 303 "settings.recipes.nothingFound": "残念ながら、検索語に一致するサービスはありませんでした。しかし、「カスタムウェブサイト」のオプションを使用して追加することができます。新しいバージョンのFerdiではウェブサイトで紹介されているような、より多くのサービスが追加されていることがあります。それらの新しいサービスを追加するには、Ferdiのアップデートをご検討ください。",
386 "settings.recipes.servicesSuccessfulAddedInfo": "サービスが追加されました", 304 "settings.recipes.servicesSuccessfulAddedInfo": "サービスが追加されました",
387 "settings.searchService": "サービスを検索", 305 "settings.searchService": "サービスを検索",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "{name}を追加", 309 "settings.service.form.addServiceHeadline": "{name}を追加",
392 "settings.service.form.availableServices": "利用可能なサービス", 310 "settings.service.form.availableServices": "利用可能なサービス",
393 "settings.service.form.customUrl": "独自サーバー", 311 "settings.service.form.customUrl": "独自サーバー",
394 "settings.service.form.customUrlPremiumInfo": "独自サービスを追加するためには、Ferdi Premium Supporterアカウントが必要です。",
395 "settings.service.form.customUrlUpgradeAccount": "アカウントをアップグレードする",
396 "settings.service.form.customUrlValidationError": "独自サーバー{name}を検証できませんでした。", 312 "settings.service.form.customUrlValidationError": "独自サーバー{name}を検証できませんでした。",
397 "settings.service.form.darkReaderBrightness": "ダークリーダーの明るさ", 313 "settings.service.form.darkReaderBrightness": "ダークリーダーの明るさ",
398 "settings.service.form.darkReaderContrast": "ダークリーダーのコントラスト", 314 "settings.service.form.darkReaderContrast": "ダークリーダーのコントラスト",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franzのチーム管理", 378 "settings.team.contentHeadline": "Franzのチーム管理",
463 "settings.team.copy": "Franzチーム管理では、複数のユーザーのFranzサブスクリプションを管理できます。Franzプレミアムのサブスクリプションは、Ferdiを使用する上で何の利点もないことに留意してください。レガシーなFranzのチームを管理し、アカウント管理機能を維持するためだけに、チーム管理にアクセスできるようになっています。", 379 "settings.team.copy": "Franzチーム管理では、複数のユーザーのFranzサブスクリプションを管理できます。Franzプレミアムのサブスクリプションは、Ferdiを使用する上で何の利点もないことに留意してください。レガシーなFranzのチームを管理し、アカウント管理機能を維持するためだけに、チーム管理にアクセスできるようになっています。",
464 "settings.team.headline": "チーム", 380 "settings.team.headline": "チーム",
465 "settings.team.intro": "現在Franzサーバーを使用しているため、チーム管理にアクセスできます。", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "meetfranz.com でチームを管理", 382 "settings.team.manageAction": "meetfranz.com でチームを管理",
467 "settings.team.teamsUnavailable": "チームは利用できません", 383 "settings.team.teamsUnavailable": "チームは利用できません",
468 "settings.team.teamsUnavailableInfo": "チームは現在、Franzサーバーを使用していて、Franzプロフェッショナルを契約した方のみが利用できます。チームを使用するには、サーバーを https://api.franzinfra.com に変更してください。", 384 "settings.team.teamsUnavailableInfo": "チームは現在、Franzサーバーを使用していて、Franzプロフェッショナルを契約した方のみが利用できます。チームを使用するには、サーバーを https://api.franzinfra.com に変更してください。",
469 "settings.team.upgradeAction": "アカウントをアップグレードする",
470 "settings.user.form.accountType.company": "法人", 385 "settings.user.form.accountType.company": "法人",
471 "settings.user.form.accountType.individual": "個人", 386 "settings.user.form.accountType.individual": "個人",
472 "settings.user.form.accountType.label": "アカウントの種類", 387 "settings.user.form.accountType.label": "アカウントの種類",
@@ -516,29 +431,20 @@
516 "signup.link.login": "アカウントを既に持っていますか? こちらからサインイン", 431 "signup.link.login": "アカウントを既に持っていますか? こちらからサインイン",
517 "signup.password.label": "パスワード", 432 "signup.password.label": "パスワード",
518 "signup.submit.label": "アカウントの作成", 433 "signup.submit.label": "アカウントの作成",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "全てのオプションを表示",
522 "subscription.cta.choosePlan": "プランを選択",
523 "subscription.includedProFeatures": "FerdiのProfessionalプランには次のものが含まれます:",
524 "subscription.interval.per": "{interval}あたり",
525 "subscription.interval.perMonth": "1か月あたり",
526 "subscription.interval.perMonthPerUser": "1か月、1ユーザーあたり",
527 "subscription.planItem.upgradeAccount": "アカウントをアップグレード",
528 "subscription.teaser.includedFeatures": "Ferdiの有料プランは次のものが含まれます:",
529 "subscription.teaser.intro": "Ferdi 5は毎日のコミュニケーションを強化する様々な新機能を搭載しています(バッテリー持ちの強化を含む)。新しいプランを確認し、ご自身にぴったりのプランを見つけましょう!",
530 "subscriptionPopup.buttonCancel": "キャンセル",
531 "subscriptionPopup.buttonDone": "完了",
532 "tabs.item.confirmDeleteService": "本当に{serviceName}サービスを削除しますか?", 434 "tabs.item.confirmDeleteService": "本当に{serviceName}サービスを削除しますか?",
533 "tabs.item.deleteService": "サービスの削除", 435 "tabs.item.deleteService": "サービスの削除",
534 "tabs.item.disableAudio": "オーディオの無効化", 436 "tabs.item.disableAudio": "オーディオの無効化",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "通知を無効にする", 438 "tabs.item.disableNotifications": "通知を無効にする",
536 "tabs.item.disableService": "サービスを無効にする", 439 "tabs.item.disableService": "サービスを無効にする",
537 "tabs.item.edit": "編集", 440 "tabs.item.edit": "編集",
538 "tabs.item.enableAudio": "オーディオを有効にする", 441 "tabs.item.enableAudio": "オーディオを有効にする",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "通知を有効にする", 443 "tabs.item.enableNotification": "通知を有効にする",
540 "tabs.item.enableService": "サービスを有効にする", 444 "tabs.item.enableService": "サービスを有効にする",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "再読み込み", 446 "tabs.item.reload": "再読み込み",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field}は正しくありません", 448 "validation.email": "{field}は正しくありません",
543 "validation.minLength": "{field}は少なくとも{length}文字以上でなければなりません", 449 "validation.minLength": "{field}は少なくとも{length}文字以上でなければなりません",
544 "validation.oneRequired": "少なくとも1つは必要です", 450 "validation.oneRequired": "少なくとも1つは必要です",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "ワークスペース", 462 "workspaceDrawer.headline": "ワークスペース",
557 "workspaceDrawer.item.contextMenuEdit": "編集", 463 "workspaceDrawer.item.contextMenuEdit": "編集",
558 "workspaceDrawer.item.noServicesAddedYet": "まだサービスが追加されていません", 464 "workspaceDrawer.item.noServicesAddedYet": "まだサービスが追加されていません",
559 "workspaceDrawer.premiumCtaButtonLabel": "最初のワークスペースを作成する",
560 "workspaceDrawer.proFeatureBadge": "Premiumの機能",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Premiumアカウントを再度有効化する",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdiワークスペースを使用すると、すぐに重要なことに集中できます。異なるサービス群を設定し、いつでも簡単に切り替えることができます。</p><p> 必要なサービスを、必要な時に、必要な場所でご利用いただけますので、仕事に集中することも、好きな時に仕事から離れることも可能です。</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdiワークスペースを使用すると、すぐに重要なことに集中できます。異なるサービス群を設定し、いつでも簡単に切り替えることができます。</p><p> 必要なサービスを、必要な時に、必要な場所でご利用いただけますので、仕事に集中することも、好きな時に仕事から離れることも可能です。</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "ワークスペースの設定を編集する", 466 "workspaceDrawer.workspacesSettingsTooltip": "ワークスペースの設定を編集する",
564 "workspaces.switchingIndicator.switchingTo": "切り替え先:" 467 "workspaces.switchingIndicator.switchingTo": "切り替え先:"
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index 70305c358..96480c005 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "გაუქმება", 16 "feature.nightlyBuilds.cancel": "გაუქმება",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Ferdi-ის ონლაინ სერვისთან დაკავშირება ვერ მოხერხდა", 36 "global.api.unhealthy": "Ferdi-ის ონლაინ სერვისთან დაკავშირება ვერ მოხერხდა",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "თქვენ არ ხართ ინტერნეტთან დაკავშირებული.", 37 "global.notConnectedToTheInternet": "თქვენ არ ხართ ინტერნეტთან დაკავშირებული.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "შემოიტანე Ferdi 4-ის სერვისები", 44 "import.headline": "შემოიტანე Ferdi 4-ის სერვისები",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Hide", 52 "infobar.hide": "Hide",
89 "infobar.requiredRequestsFailed": "სერვისებისა და მომხმარებლის ინფორმაციის ჩატვირთვა ვერ მოხერხდა", 53 "infobar.requiredRequestsFailed": "სერვისებისა და მომხმარებლის ინფორმაციის ჩატვირთვა ვერ მოხერხდა",
90 "infobar.servicesUpdated": "თქვენი სერვისები განახლებულია.", 54 "infobar.servicesUpdated": "თქვენი სერვისები განახლებულია.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "განახლება Ferdi-ისთვის ხელმისაწვდომია.", 55 "infobar.updateAvailable": "განახლება Ferdi-ისთვის ხელმისაწვდომია.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "მეილი", 57 "invite.email.label": "მეილი",
@@ -124,20 +87,20 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "განახლებების შემოწმება", 88 "menu.app.checkForUpdates": "განახლებების შემოწმება",
126 "menu.app.hide": "Hide", 89 "menu.app.hide": "Hide",
127 "menu.app.hideOthers": "სხვების დამალვა", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "გამოსვლა", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "პარამეტრები", 92 "menu.app.settings": "პარამეტრები",
130 "menu.app.unhide": "Unhide", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "რედაქტირება", 94 "menu.edit": "რედაქტირება",
132 "menu.edit.copy": "კოპირება", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "ამოჭრა", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "წაშლა", 97 "menu.edit.delete": "წაშლა",
135 "menu.edit.emojiSymbols": "გრაფიკული გამოსახულებები & სიმბოლოები", 98 "menu.edit.emojiSymbols": "გრაფიკული გამოსახულებები & სიმბოლოები",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "ჩასმა", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Paste And Match Style", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "აღდგენა", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "ყველას მონიშვნა", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "საუბრები", 104 "menu.edit.speech": "საუბრები",
142 "menu.edit.startDictation": "პროგრამის დაწყება", 105 "menu.edit.startDictation": "პროგრამის დაწყება",
143 "menu.edit.startSpeaking": "Start Speaking", 106 "menu.edit.startSpeaking": "Start Speaking",
@@ -149,6 +112,7 @@
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Learn More", 116 "menu.help.learnMore": "Learn More",
153 "menu.help.privacy": "კონფიდენციალურობის შესახებ", 117 "menu.help.privacy": "კონფიდენციალურობის შესახებ",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,12 +127,10 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Enter Full Screen",
167 "menu.view.exitFullScreen": "Exit Full Screen",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Reload Service", 134 "menu.view.reloadService": "Reload Service",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Actual Size", 136 "menu.view.resetZoom": "Actual Size",
@@ -194,11 +156,7 @@
194 "password.noUser": "მომხმარებელი მითითებული მეილით ვერ მოიძებნა", 156 "password.noUser": "მომხმარებელი მითითებული მეილით ვერ მოიძებნა",
195 "password.submit.label": "დადასტურება", 157 "password.submit.label": "დადასტურება",
196 "password.successInfo": "გთხოვთ შეამოწმეთ მეილი", 158 "password.successInfo": "გთხოვთ შეამოწმეთ მეილი",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "შეცდომა", 179 "service.errorHandler.message": "შეცდომა",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "დაწყება", 182 "services.getStarted": "დაწყება",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "მოგესალმებით Ferdi-ზე", 186 "services.welcome": "მოგესალმებით Ferdi-ზე",
257 "settings.account.account.editButton": "ანგარიშის მართვა", 187 "settings.account.account.editButton": "ანგარიშის მართვა",
258 "settings.account.accountType.basic": "ძირითადი ანგარიში",
259 "settings.account.accountType.premium": "პრემიუმ მხარდამჭერის ანგარიში",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "პროფილის განახლება", 190 "settings.account.buttonSave": "პროფილის განახლება",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "ინვოისები", 197 "settings.account.headlineInvoices": "ინვოისები",
270 "settings.account.headlinePassword": "პაროლის შეცვლა", 198 "settings.account.headlinePassword": "პაროლის შეცვლა",
271 "settings.account.headlineProfile": "პროფილის განახლება", 199 "settings.account.headlineProfile": "პროფილის განახლება",
272 "settings.account.headlineSubscription": "თქვენი გამოწერა",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "გადმოწერა",
276 "settings.account.manageSubscription.label": "თქვენი გამოწერის მართვა",
277 "settings.account.successInfo": "თქვენი ცვლილებები შენახულია", 200 "settings.account.successInfo": "თქვენი ცვლილებები შენახულია",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "სცადეთ ხელახლა", 201 "settings.account.tryReloadServices": "სცადეთ ხელახლა",
282 "settings.account.tryReloadUserInfoRequest": "სცადეთ ხელახლა", 202 "settings.account.tryReloadUserInfoRequest": "სცადეთ ხელახლა",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "მომხმარებლის ინფორმაციის ჩატვირთვა ვერ მოხერხდა", 203 "settings.account.userInfoRequestFailed": "მომხმარებლის ინფორმაციის ჩატვირთვა ვერ მოხერხდა",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "აჩვენეთ Ferdi სისტემის უჯრაში", 228 "settings.app.form.enableSystemTray": "აჩვენეთ Ferdi სისტემის უჯრაში",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "პარამეტრები", 259 "settings.app.headline": "პარამეტრები",
341 "settings.app.headlineAdvanced": "Advanced", 260 "settings.app.headlineAdvanced": "Advanced",
342 "settings.app.headlineAppearance": "Appearance", 261 "settings.app.headlineAppearance": "Appearance",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Changes require restart", 272 "settings.app.restartRequired": "Changes require restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "ხელმისაწვდომი სერვისები", 301 "settings.recipes.headline": "ხელმისაწვდომი სერვისები",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "ყველაზე პოპულარული",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "სერვისი წარმატებით დაემატა", 304 "settings.recipes.servicesSuccessfulAddedInfo": "სერვისი წარმატებით დაემატა",
387 "settings.searchService": "Search service", 305 "settings.searchService": "Search service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "დაამატე {name}", 309 "settings.service.form.addServiceHeadline": "დაამატე {name}",
392 "settings.service.form.availableServices": "ხელმისაწვდომი სერვისები", 310 "settings.service.form.availableServices": "ხელმისაწვდომი სერვისები",
393 "settings.service.form.customUrl": "კერძო სერვერი", 311 "settings.service.form.customUrl": "კერძო სერვერი",
394 "settings.service.form.customUrlPremiumInfo": "თვით დაჰოსტილი სერვისების დასამატებლად საჭიროა Ferdi-ის პრემიუმ მხარდამჭერის ანგარიში.",
395 "settings.service.form.customUrlUpgradeAccount": "განაახლეთ თქვენი ანგარიში",
396 "settings.service.form.customUrlValidationError": "ვერ დადასტურდა {name} კერძო სერვერი.", 312 "settings.service.form.customUrlValidationError": "ვერ დადასტურდა {name} კერძო სერვერი.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "გუნდი", 380 "settings.team.headline": "გუნდი",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "კომპანია", 385 "settings.user.form.accountType.company": "კომპანია",
471 "settings.user.form.accountType.individual": "ინდივიდუალური", 386 "settings.user.form.accountType.individual": "ინდივიდუალური",
472 "settings.user.form.accountType.label": "ანგარიშის ტიპი", 387 "settings.user.form.accountType.label": "ანგარიშის ტიპი",
@@ -516,29 +431,20 @@
516 "signup.link.login": "უკვე გაქვთ ანგარიში?", 431 "signup.link.login": "უკვე გაქვთ ანგარიში?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "ანგარიშის შექმნა", 433 "signup.submit.label": "ანგარიშის შექმნა",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "გაუქმება",
531 "subscriptionPopup.buttonDone": "შესრულებულია",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "სერვისის წაშლა", 435 "tabs.item.deleteService": "სერვისის წაშლა",
534 "tabs.item.disableAudio": "Disable audio", 436 "tabs.item.disableAudio": "Disable audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "შეტყობინებების გამორთვა", 438 "tabs.item.disableNotifications": "შეტყობინებების გამორთვა",
536 "tabs.item.disableService": "სერვისის გაუქმება", 439 "tabs.item.disableService": "სერვისის გაუქმება",
537 "tabs.item.edit": "რედაქტირება", 440 "tabs.item.edit": "რედაქტირება",
538 "tabs.item.enableAudio": "Enable audio", 441 "tabs.item.enableAudio": "Enable audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "შეტყობინებების ჩართვა", 443 "tabs.item.enableNotification": "შეტყობინებების ჩართვა",
540 "tabs.item.enableService": "სერვისის ჩართვა", 444 "tabs.item.enableService": "სერვისის ჩართვა",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "ჩატვირთვა", 446 "tabs.item.reload": "ჩატვირთვა",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/kk.json b/src/i18n/locales/kk.json
index 09bb10fb2..462ca8543 100644
--- a/src/i18n/locales/kk.json
+++ b/src/i18n/locales/kk.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
19 "feature.planSelection.cta.upgradePro": "Choose Professional",
20 "feature.planSelection.free.text": "Basic functionality",
21 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
24 "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.",
25 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
26 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
30 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
31 "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.",
32 "feature.shareFranz.action.email": "Send as email", 8 "feature.shareFranz.action.email": "Send as email",
33 "feature.shareFranz.action.facebook": "Share on Facebook", 9 "feature.shareFranz.action.facebook": "Share on Facebook",
34 "feature.shareFranz.action.twitter": "Share on Twitter", 10 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 12 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
37 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 13 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
38 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 14 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
39 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
40 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade": "Upgrade Account",
42 "feature.trialStatusBar.cta": "Upgrade now",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
46 "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.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
49 "global.api.unhealthy": "Can't connect to Ferdi online services", 15 "global.api.unhealthy": "Can't connect to Ferdi online services",
50 "global.franzProRequired": "Ferdi Professional Required", 16 "global.franzProRequired": "Ferdi Professional Required",
51 "global.notConnectedToTheInternet": "You are not connected to the internet.", 17 "global.notConnectedToTheInternet": "You are not connected to the internet.",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "Detect language automatically", 19 "global.spellchecking.autodetect": "Detect language automatically",
54 "global.spellchecking.autodetect.short": "Automatic", 20 "global.spellchecking.autodetect.short": "Automatic",
55 "global.spellchecking.language": "Spell checking language", 21 "global.spellchecking.language": "Spell checking language",
56 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
57 "import.headline": "Import your Ferdi 4 services", 22 "import.headline": "Import your Ferdi 4 services",
58 "import.notSupportedHeadline": "Services not yet supported in Ferdi 5", 23 "import.notSupportedHeadline": "Services not yet supported in Ferdi 5",
59 "import.skip.label": "I want to add services manually", 24 "import.skip.label": "I want to add services manually",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "Reload services", 28 "infobar.buttonReloadServices": "Reload services",
64 "infobar.requiredRequestsFailed": "Could not load services and user information", 29 "infobar.requiredRequestsFailed": "Could not load services and user information",
65 "infobar.servicesUpdated": "Your services have been updated.", 30 "infobar.servicesUpdated": "Your services have been updated.",
66 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable": "A new update for Ferdi is available.", 31 "infobar.updateAvailable": "A new update for Ferdi is available.",
68 "invite.email.label": "Email address", 32 "invite.email.label": "Email address",
69 "invite.headline.friends": "Invite 3 of your friends or colleagues", 33 "invite.headline.friends": "Invite 3 of your friends or colleagues",
@@ -122,9 +86,7 @@
122 "menu.todos": "Todos", 86 "menu.todos": "Todos",
123 "menu.todos.enableTodos": "Enable Todos", 87 "menu.todos.enableTodos": "Enable Todos",
124 "menu.view": "View", 88 "menu.view": "View",
125 "menu.view.enterFullScreen": "Enter Full Screen", 89 "menu.view.reloadFerdi": "Reload Ferdi",
126 "menu.view.exitFullScreen": "Exit Full Screen",
127 "menu.view.reloadFranz": "Reload Ferdi",
128 "menu.view.reloadService": "Reload Service", 90 "menu.view.reloadService": "Reload Service",
129 "menu.view.reloadTodos": "Reload ToDos", 91 "menu.view.reloadTodos": "Reload ToDos",
130 "menu.view.resetZoom": "Actual Size", 92 "menu.view.resetZoom": "Actual Size",
@@ -149,7 +111,6 @@
149 "password.noUser": "No user with that email address was found", 111 "password.noUser": "No user with that email address was found",
150 "password.submit.label": "Submit", 112 "password.submit.label": "Submit",
151 "password.successInfo": "Please check your email", 113 "password.successInfo": "Please check your email",
152 "premiumFeature.button.upgradeAccount": "Upgrade account",
153 "pricing.features.accountSync": "Account Synchronisation", 114 "pricing.features.accountSync": "Account Synchronisation",
154 "pricing.features.adFree": "Forever ad-free", 115 "pricing.features.adFree": "Forever ad-free",
155 "pricing.features.appDelays": "No Waiting Screens", 116 "pricing.features.appDelays": "No Waiting Screens",
@@ -166,27 +127,6 @@
166 "pricing.features.upToSixServices": "Add up to 6 services", 127 "pricing.features.upToSixServices": "Add up to 6 services",
167 "pricing.features.upToThreeServices": "Add up to 3 services", 128 "pricing.features.upToThreeServices": "Add up to 3 services",
168 "pricing.features.workspaces": "Workspaces", 129 "pricing.features.workspaces": "Workspaces",
169 "pricing.plan.free": "Free",
170 "pricing.plan.legacy": "Premium",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal Monthly",
173 "pricing.plan.personal-yearly": "Personal Yearly",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional Monthly",
176 "pricing.plan.pro-yearly": "Professional Yearly",
177 "pricing.trial.cta.accept": "Start my 14-day Ferdi Professional Trial ",
178 "pricing.trial.cta.skip": "Continue to Ferdi",
179 "pricing.trial.cta.start": "Start using Ferdi",
180 "pricing.trial.error": "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline": "Ferdi Professional includes:",
182 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
183 "pricing.trial.intro.happyMessaging": "Happy messaging,",
184 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
185 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline": "No strings attached",
188 "pricing.trial.terms.noCreditCard": "No credit card required",
189 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action": "Reload {name}", 130 "service.crashHandler.action": "Reload {name}",
191 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 131 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
192 "service.crashHandler.headline": "Oh no!", 132 "service.crashHandler.headline": "Oh no!",
@@ -198,11 +138,6 @@
198 "service.errorHandler.headline": "Oh no!", 138 "service.errorHandler.headline": "Oh no!",
199 "service.errorHandler.message": "Error", 139 "service.errorHandler.message": "Error",
200 "service.errorHandler.text": "{name} has failed to load.", 140 "service.errorHandler.text": "{name} has failed to load.",
201 "service.restrictedHandler.action": "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
203 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading": "Loading", 141 "service.webviewLoader.loading": "Loading",
207 "services.getStarted": "Get started", 142 "services.getStarted": "Get started",
208 "services.welcome": "Welcome to Ferdi", 143 "services.welcome": "Welcome to Ferdi",
@@ -219,18 +154,9 @@
219 "settings.account.headlineInvoices": "Invoices", 154 "settings.account.headlineInvoices": "Invoices",
220 "settings.account.headlinePassword": "Change password", 155 "settings.account.headlinePassword": "Change password",
221 "settings.account.headlineProfile": "Update profile", 156 "settings.account.headlineProfile": "Update profile",
222 "settings.account.headlineSubscription": "Your subscription",
223 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
224 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
225 "settings.account.invoiceDownload": "Download",
226 "settings.account.manageSubscription.label": "Manage your subscription",
227 "settings.account.successInfo": "Your changes have been saved", 157 "settings.account.successInfo": "Your changes have been saved",
228 "settings.account.trial": "Free Trial",
229 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices": "Try again", 158 "settings.account.tryReloadServices": "Try again",
232 "settings.account.tryReloadUserInfoRequest": "Try again", 159 "settings.account.tryReloadUserInfoRequest": "Try again",
233 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
234 "settings.account.userInfoRequestFailed": "Could not load user information", 160 "settings.account.userInfoRequestFailed": "Could not load user information",
235 "settings.account.yourLicense": "Your Ferdi License", 161 "settings.account.yourLicense": "Your Ferdi License",
236 "settings.app.buttonClearAllCache": "Clear cache", 162 "settings.app.buttonClearAllCache": "Clear cache",
@@ -284,7 +210,6 @@
284 "settings.recipes.customService.openFolder": "Open folder", 210 "settings.recipes.customService.openFolder": "Open folder",
285 "settings.recipes.headline": "Available services", 211 "settings.recipes.headline": "Available services",
286 "settings.recipes.missingService": "Missing a service?", 212 "settings.recipes.missingService": "Missing a service?",
287 "settings.recipes.mostPopular": "Most popular",
288 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 213 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
289 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 214 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
290 "settings.searchService": "Search service", 215 "settings.searchService": "Search service",
@@ -295,7 +220,6 @@
295 "settings.service.form.availableServices": "Available services", 220 "settings.service.form.availableServices": "Available services",
296 "settings.service.form.customUrl": "Custom server", 221 "settings.service.form.customUrl": "Custom server",
297 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.", 222 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
298 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
299 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 223 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
300 "settings.service.form.deleteButton": "Delete service", 224 "settings.service.form.deleteButton": "Delete service",
301 "settings.service.form.editServiceHeadline": "Edit {name}", 225 "settings.service.form.editServiceHeadline": "Edit {name}",
@@ -391,19 +315,6 @@
391 "signup.link.login": "Already have an account, sign in?", 315 "signup.link.login": "Already have an account, sign in?",
392 "signup.password.label": "Password", 316 "signup.password.label": "Password",
393 "signup.submit.label": "Create account", 317 "signup.submit.label": "Create account",
394 "subscription.bestValue": "Best value",
395 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
396 "subscription.cta.allOptions": "See all options",
397 "subscription.cta.choosePlan": "Choose your plan",
398 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
399 "subscription.interval.per": "per {interval}",
400 "subscription.interval.perMonth": "per month",
401 "subscription.interval.perMonthPerUser": "per month & user",
402 "subscription.planItem.upgradeAccount": "Upgrade Account",
403 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
404 "subscription.teaser.intro": "Ferdi 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!",
405 "subscriptionPopup.buttonCancel": "Cancel",
406 "subscriptionPopup.buttonDone": "Done",
407 "tabs.item.deleteService": "Delete service", 318 "tabs.item.deleteService": "Delete service",
408 "tabs.item.disableAudio": "Disable audio", 319 "tabs.item.disableAudio": "Disable audio",
409 "tabs.item.disableNotifications": "Disable notifications", 320 "tabs.item.disableNotifications": "Disable notifications",
@@ -431,7 +342,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "edit", 342 "workspaceDrawer.item.contextMenuEdit": "edit",
432 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 343 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 344 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge": "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 345 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 346 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 347 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
diff --git a/src/i18n/locales/ko.json b/src/i18n/locales/ko.json
index af6171e3d..4286aa7d9 100644
--- a/src/i18n/locales/ko.json
+++ b/src/i18n/locales/ko.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "오 저런! Ferdi가 {name} 과 연결이 끊겼습니다.", 12 "connectionLostBanner.message": "오 저런! Ferdi가 {name} 과 연결이 끊겼습니다.",
13 "feature.announcements.changelog.headline": "Ferdi {version} 변경점", 13 "feature.announcements.changelog.headline": "Ferdi {version} 변경점",
14 "feature.debugger.title": "디버깅 정보 공개", 14 "feature.debugger.title": "디버깅 정보 공개",
15 "feature.delayApp.headline": "Ferdi Supporter License를 구매하여 대기시간을 스킵하세요.",
16 "feature.delayApp.text": "Ferdi가 {seconds} 초 안에 재개합니다.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Ferdi Supporter License 얻기",
21 "feature.delayApp.upgrade.actionShort": "계정 업그레이드",
22 "feature.nightlyBuilds.activate": "활성화", 15 "feature.nightlyBuilds.activate": "활성화",
23 "feature.nightlyBuilds.cancel": "취소", 16 "feature.nightlyBuilds.cancel": "취소",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "나이틀리 빌드", 18 "feature.nightlyBuilds.title": "나이틀리 빌드",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "디버그 정보를 공개하는데 오류가 발생했습니다. 조금 뒤에 다시 시도하거나 콘솔을 통해 정보를 확인하십시오.", 19 "feature.publishDebugInfo.error": "디버그 정보를 공개하는데 오류가 발생했습니다. 조금 뒤에 다시 시도하거나 콘솔을 통해 정보를 확인하십시오.",
43 "feature.publishDebugInfo.info": "디버그 정보를 공개하는 것은 Ferdi의 오류를 찾는데 도움이 됩니다. 디버그 정보를 공개함으로 Ferdi Debugger의 개인정보보호정책과 이용 약관을 동의하는 것으로 간주합니다.", 20 "feature.publishDebugInfo.info": "디버그 정보를 공개하는 것은 Ferdi의 오류를 찾는데 도움이 됩니다. 디버그 정보를 공개함으로 Ferdi Debugger의 개인정보보호정책과 이용 약관을 동의하는 것으로 간주합니다.",
44 "feature.publishDebugInfo.privacy": "개인정보보호정책", 21 "feature.publishDebugInfo.privacy": "개인정보보호정책",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "서비스를 TAB, ↑, ↓을 이용해 선택할 수 있습니다. ENTER를 이용하여 서비스를 열 수 있습니다.", 26 "feature.quickSwitch.info": "서비스를 TAB, ↑, ↓을 이용해 선택할 수 있습니다. ENTER를 이용하여 서비스를 열 수 있습니다.",
50 "feature.quickSwitch.search": "검색...", 27 "feature.quickSwitch.search": "검색...",
51 "feature.quickSwitch.title": "빠른 검색", 28 "feature.quickSwitch.title": "빠른 검색",
52 "feature.serviceLimit.limitReached": "사용하는 플랜의 {limit} 개 중 {amount} 를 추가했습니다. 더 많은 서비스를 추가하시려면 계정을 업그레이드 해주세요.",
53 "feature.shareFranz.action.email": "이메일로 보내기", 29 "feature.shareFranz.action.email": "이메일로 보내기",
54 "feature.shareFranz.action.facebook": "페이스북에 공유하기", 30 "feature.shareFranz.action.facebook": "페이스북에 공유하기",
55 "feature.shareFranz.action.twitter": "트위터에 공유하기", 31 "feature.shareFranz.action.twitter": "트위터에 공유하기",
@@ -57,28 +33,16 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "친구들과 동료들에게 Ferdi 가 얼마나 멋지고 좋은지에 대해 널리 알려 저희를 도와주세요.", 35 "feature.shareFranz.text": "친구들과 동료들에게 Ferdi 가 얼마나 멋지고 좋은지에 대해 널리 알려 저희를 도와주세요.",
60 "feature.todos.premium.info": "Ferdi Todos는 프리미엄 유저라면 이제 사용 가능합니다!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "계정 업그레이드",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Ferdi 온라인 서비스에 연결할 수 없습니다.", 36 "global.api.unhealthy": "Ferdi 온라인 서비스에 연결할 수 없습니다.",
71 "global.franzProRequired": "Ferdi 프로페셔널이 필요합니다.",
72 "global.notConnectedToTheInternet": "인터넷에 연결할 수 없습니다.", 37 "global.notConnectedToTheInternet": "인터넷에 연결할 수 없습니다.",
73 "global.spellchecker.useDefault": "시스템 기본 사용 ({default})", 38 "global.spellchecker.useDefault": "시스템 기본 사용 ({default})",
74 "global.spellchecking.autodetect": "언어 자동 탐색", 39 "global.spellchecking.autodetect": "언어 자동 탐색",
75 "global.spellchecking.autodetect.short": "자동", 40 "global.spellchecking.autodetect.short": "자동",
76 "global.spellchecking.language": "철자 검사", 41 "global.spellchecking.language": "철자 검사",
77 "global.upgradeButton.upgradeToPro": "Ferdi 프로페셔널로 업그레이드 합니다.",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Import your Ferdi 4 services", 44 "import.headline": "Import your Ferdi 4 services",
81 "import.notSupportedHeadline": "Services not yet supported in Ferdi 5", 45 "import.notSupportedHeadline": "Ferdi 5에서 아직 지원되지 않는 서비스입니다.",
82 "import.skip.label": "수동으로 서비스 추가", 46 "import.skip.label": "수동으로 서비스 추가",
83 "import.submit.label": "서비스 가져오기", 47 "import.submit.label": "서비스 가져오기",
84 "infobar.authRequestFailed": "There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 48 "infobar.authRequestFailed": "There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
@@ -88,9 +52,8 @@
88 "infobar.hide": "숨기기", 52 "infobar.hide": "숨기기",
89 "infobar.requiredRequestsFailed": "사용자 정보와 서비스를 불러올 수 없습니다.", 53 "infobar.requiredRequestsFailed": "사용자 정보와 서비스를 불러올 수 없습니다.",
90 "infobar.servicesUpdated": "서비스가 업데이트 되었습니다.", 54 "infobar.servicesUpdated": "서비스가 업데이트 되었습니다.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "새로운 업데이트를 사용할 수 있습니다.", 55 "infobar.updateAvailable": "새로운 업데이트를 사용할 수 있습니다.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "닫기",
94 "invite.email.label": "이메일 주소", 57 "invite.email.label": "이메일 주소",
95 "invite.headline.friends": "친구나 동료를 3명 초대하기", 58 "invite.headline.friends": "친구나 동료를 3명 초대하기",
96 "invite.name.label": "이름", 59 "invite.name.label": "이름",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "메뉴바 자동 감춤", 87 "menu.app.autohideMenuBar": "메뉴바 자동 감춤",
125 "menu.app.checkForUpdates": "업데이트 확인", 88 "menu.app.checkForUpdates": "업데이트 확인",
126 "menu.app.hide": "숨기기", 89 "menu.app.hide": "숨기기",
127 "menu.app.hideOthers": "나머지 숨기기", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "종료", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "설정", 92 "menu.app.settings": "설정",
130 "menu.app.unhide": "보이기", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "편집", 94 "menu.edit": "편집",
132 "menu.edit.copy": "복사", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "잘라내기", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "삭제", 97 "menu.edit.delete": "삭제",
135 "menu.edit.emojiSymbols": "Emoji & Symbols", 98 "menu.edit.emojiSymbols": "이모지 기호",
136 "menu.edit.findInPage": "현재 페이지에서 찾기", 99 "menu.edit.findInPage": "현재 페이지에서 찾기",
137 "menu.edit.paste": "붙여넣기", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Paste And Match Style", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "재시도", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "전체 선택", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "말하기", 104 "menu.edit.speech": "말하기",
142 "menu.edit.startDictation": "받아쓰기 시작", 105 "menu.edit.startDictation": "받아쓰기 시작",
143 "menu.edit.startSpeaking": "말하기 시작", 106 "menu.edit.startSpeaking": "말하기 시작",
144 "menu.edit.stopSpeaking": "말하기 중지", 107 "menu.edit.stopSpeaking": "말하기 중지",
145 "menu.edit.undo": "되돌리기", 108 "menu.edit.undo": "Undo",
146 "menu.file": "파일", 109 "menu.file": "파일",
147 "menu.help": "도움말", 110 "menu.help": "Help",
148 "menu.help.changelog": "변경 내역", 111 "menu.help.changelog": "변경 내역",
149 "menu.help.debugInfo": "디버그 정보 복사", 112 "menu.help.debugInfo": "디버그 정보 복사",
150 "menu.help.debugInfoCopiedBody": "디버그 정보가 클립보드에 복사되었습니다.", 113 "menu.help.debugInfoCopiedBody": "디버그 정보가 클립보드에 복사되었습니다.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi 디버그 정보", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi 디버그 정보",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "자세히 보기", 116 "menu.help.learnMore": "자세히 보기",
153 "menu.help.privacy": "개인정보보호정책", 117 "menu.help.privacy": "개인정보보호정책",
154 "menu.help.publishDebugInfo": "디버깅 정보 공개", 118 "menu.help.publishDebugInfo": "디버깅 정보 공개",
@@ -156,32 +120,30 @@
156 "menu.help.tos": "이용 약관", 120 "menu.help.tos": "이용 약관",
157 "menu.services": "서비스", 121 "menu.services": "서비스",
158 "menu.services.activatePreviousService": "이전 서비스 활성화", 122 "menu.services.activatePreviousService": "이전 서비스 활성화",
159 "menu.services.addNewService": "Add New Service", 123 "menu.services.addNewService": "새로운 서비스 추가",
160 "menu.services.goHome": "홈", 124 "menu.services.goHome": "홈",
161 "menu.services.setNextServiceActive": "다음 서비스 활성화", 125 "menu.services.setNextServiceActive": "다음 서비스 활성화",
162 "menu.todos": "Todos", 126 "menu.todos": "Todos",
163 "menu.todos.enableTodos": "Todos 허용", 127 "menu.todos.enableTodos": "Todos 허용",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "뒤로가기", 129 "menu.view.back": "뒤로가기",
166 "menu.view.enterFullScreen": "전체 화면으로",
167 "menu.view.exitFullScreen": "전체 화면 종료",
168 "menu.view.forward": "앞으로 가기", 130 "menu.view.forward": "앞으로 가기",
169 "menu.view.lockFerdi": "Ferdi 잠금", 131 "menu.view.lockFerdi": "Ferdi 잠금",
170 "menu.view.openQuickSwitch": "Quick Switch 열기", 132 "menu.view.openQuickSwitch": "Quick Switch 열기",
171 "menu.view.reloadFranz": "Ferdi 재시작", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "서비스 재시작", 134 "menu.view.reloadService": "서비스 재시작",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "실제 크기", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "다크 모드 켜기/끄기", 137 "menu.view.toggleDarkMode": "다크 모드 켜기/끄기",
176 "menu.view.toggleDevTools": "개발자 모드 켜기/끄기", 138 "menu.view.toggleDevTools": "개발자 모드 켜기/끄기",
177 "menu.view.toggleFullScreen": "전체 화면 전환/복귀", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools", 140 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "확대", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "축소", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "윈도우", 144 "menu.window": "Window",
183 "menu.window.close": "닫기", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "최소화", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "작업 공간", 147 "menu.workspaces": "작업 공간",
186 "menu.workspaces.addNewWorkspace": "새 작업영역을 추가", 148 "menu.workspaces.addNewWorkspace": "새 작업영역을 추가",
187 "menu.workspaces.closeWorkspaceDrawer": "작업영역 서랍 닫기", 149 "menu.workspaces.closeWorkspaceDrawer": "작업영역 서랍 닫기",
@@ -194,48 +156,21 @@
194 "password.noUser": "해당 이메일을 사용하는 유저를 찾을 수 없습니다.", 156 "password.noUser": "해당 이메일을 사용하는 유저를 찾을 수 없습니다.",
195 "password.submit.label": "제출", 157 "password.submit.label": "제출",
196 "password.successInfo": "이메일을 확인해 주세요.", 158 "password.successInfo": "이메일을 확인해 주세요.",
197 "premiumFeature.button.upgradeAccount": "계정 업그레이드",
198 "pricing.features.accountSync": "계정 동기화", 159 "pricing.features.accountSync": "계정 동기화",
199 "pricing.features.adFree": "평생 광고 무료",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "사용자 지정 웹사이트 추가", 160 "pricing.features.customWebsites": "사용자 지정 웹사이트 추가",
203 "pricing.features.desktopNotifications": "데스크탑 알림", 161 "pricing.features.desktopNotifications": "데스크탑 알림",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
205 "pricing.features.recipes": "Choose from more than 70 Services", 163 "pricing.features.recipes": "Choose from more than 70 Services",
206 "pricing.features.serviceProxies": "Service Proxies", 164 "pricing.features.serviceProxies": "서비스 프록시",
207 "pricing.features.spellchecker": "철자 검사 지원", 165 "pricing.features.spellchecker": "철자 검사 지원",
208 "pricing.features.teamManagement": "팀 관리", 166 "pricing.features.teamManagement": "팀 관리",
209 "pricing.features.thirdPartyServices": "써드파티 서비스 설치", 167 "pricing.features.thirdPartyServices": "써드파티 서비스 설치",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "무제한 서비스 추가",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "작업 공간", 169 "pricing.features.workspaces": "작업 공간",
214 "pricing.plan.free": "Ferdi 무료",
215 "pricing.plan.legacy": "Ferdi 프리미엄",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi 프로페셔널",
220 "pricing.plan.pro-monthly": "월간 Ferdi 프로페셔널",
221 "pricing.plan.pro-yearly": "연간 Ferdi 프로페셔널",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "재시작 {name}", 170 "service.crashHandler.action": "재시작 {name}",
236 "service.crashHandler.autoReload": "{seconds} 초내에 자동으로 {name} 을 복원합니다.", 171 "service.crashHandler.autoReload": "{seconds} 초내에 자동으로 {name} 을 복원합니다.",
237 "service.crashHandler.headline": "이런!", 172 "service.crashHandler.headline": "이런!",
238 "service.crashHandler.text": "{name} has caused an error.", 173 "service.crashHandler.text": "{name} 에서 에러가 발생했습니다.",
239 "service.disabledHandler.action": "활성 {name}", 174 "service.disabledHandler.action": "활성 {name}",
240 "service.disabledHandler.headline": "{name} 사용 불가", 175 "service.disabledHandler.headline": "{name} 사용 불가",
241 "service.errorHandler.action": "재시작 {name}", 176 "service.errorHandler.action": "재시작 {name}",
@@ -243,56 +178,40 @@
243 "service.errorHandler.headline": "이런!", 178 "service.errorHandler.headline": "이런!",
244 "service.errorHandler.message": "에러", 179 "service.errorHandler.message": "에러",
245 "service.errorHandler.text": "{name} 불러오는데 실패하였습니다.", 180 "service.errorHandler.text": "{name} 불러오는데 실패하였습니다.",
246 "service.restrictedHandler.action": "계정 업그레이드",
247 "service.restrictedHandler.customUrl.headline": "Ferdi 프로페셔널이 필요합니다.",
248 "service.restrictedHandler.customUrl.text": "자체 호스트 서비스와 커스텀 url을 사용하기 위해 Ferdi 프로페셔널로 업그레이드 하세요.",
249 "service.restrictedHandler.serviceLimit.headline": "서비스 한도에 도달하였습니다.",
250 "service.restrictedHandler.serviceLimit.text": "{count} 보다 더 많은 서비스를 사용하려면 계정을 업그레이드 해주세요.",
251 "service.webviewLoader.loading": "{service} 로딩 중", 181 "service.webviewLoader.loading": "{service} 로딩 중",
252 "services.getStarted": "시작하기", 182 "services.getStarted": "시작하기",
253 "services.login": "Ferdi를 사용해 로그인하세요.", 183 "services.login": "Ferdi를 사용해 로그인하세요.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "계정없이 Ferdi 사용하기", 185 "services.serverless": "계정없이 Ferdi 사용하기",
256 "services.welcome": "Ferdi에 오신 것을 환영합니다.", 186 "services.welcome": "Ferdi에 오신 것을 환영합니다.",
257 "settings.account.account.editButton": "계정 편집", 187 "settings.account.account.editButton": "계정 편집",
258 "settings.account.accountType.basic": "기본 계정",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "계정을 사용할 수 없습니다.", 188 "settings.account.accountUnavailable": "계정을 사용할 수 없습니다.",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "프로필 수정", 190 "settings.account.buttonSave": "프로필 수정",
263 "settings.account.deleteAccount": "계정 삭제", 191 "settings.account.deleteAccount": "계정 삭제",
264 "settings.account.deleteEmailSent": "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 192 "settings.account.deleteEmailSent": "받은 이메일에 있는 링크를 통해 계정 삭제를 확인했다면 계정과 데이터는 복구되지 않습니다.",
265 "settings.account.deleteInfo": "If you don't need your Ferdi account any longer, you can delete your account and all related data here.", 193 "settings.account.deleteInfo": "더 이상 Ferdi 계정이 필요하지 않다면 여기서 모든 관련한 데이터와 계정을 삭제할 수 있습니다.",
266 "settings.account.headline": "계정", 194 "settings.account.headline": "계정",
267 "settings.account.headlineAccount": "계정 정보", 195 "settings.account.headlineAccount": "계정 정보",
268 "settings.account.headlineDangerZone": "위험 설정", 196 "settings.account.headlineDangerZone": "위험 설정",
269 "settings.account.headlineInvoices": "청구서", 197 "settings.account.headlineInvoices": "청구서",
270 "settings.account.headlinePassword": "비밀번호 변경", 198 "settings.account.headlinePassword": "비밀번호 변경",
271 "settings.account.headlineProfile": "프로필 수정", 199 "settings.account.headlineProfile": "프로필 수정",
272 "settings.account.headlineSubscription": "구독",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "다운로드",
276 "settings.account.manageSubscription.label": "구독 관리",
277 "settings.account.successInfo": "변경사항이 저장되었습니다.", 200 "settings.account.successInfo": "변경사항이 저장되었습니다.",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "다시 시도하세요.", 201 "settings.account.tryReloadServices": "다시 시도하세요.",
282 "settings.account.tryReloadUserInfoRequest": "다시 시도하세요.", 202 "settings.account.tryReloadUserInfoRequest": "다시 시도하세요.",
283 "settings.account.upgradeToPro.label": "Ferdi 프로페셔널로 업그레이드 합니다.",
284 "settings.account.userInfoRequestFailed": "사용자 정보를 불러올 수 없습니다.", 203 "settings.account.userInfoRequestFailed": "사용자 정보를 불러올 수 없습니다.",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Ferdi 라이센스",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
287 "settings.app.buttonClearAllCache": "캐시 지우기", 206 "settings.app.buttonClearAllCache": "캐시 지우기",
288 "settings.app.buttonInstallUpdate": "재시작 후 업데이트 설치", 207 "settings.app.buttonInstallUpdate": "재시작 후 업데이트 설치",
289 "settings.app.buttonSearchForUpdate": "업데이트 확인", 208 "settings.app.buttonSearchForUpdate": "업데이트 확인",
290 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 209 "settings.app.cacheInfo": "현재 Ferdi 캐시가 디스크 공간의 {size} 만큼 사용하고 있습니다.",
291 "settings.app.cacheNotCleared": "모든 캐시를 지우지 못했습니다.", 210 "settings.app.cacheNotCleared": "모든 캐시를 지우지 못했습니다.",
292 "settings.app.closeSettings": "Close settings", 211 "settings.app.closeSettings": "설정 닫기",
293 "settings.app.currentVersion": "현재 버전:", 212 "settings.app.currentVersion": "현재 버전:",
294 "settings.app.form.accentColor": "강조 색상", 213 "settings.app.form.accentColor": "강조 색상",
295 "settings.app.form.adaptableDarkMode": "Synchronize dark mode with my OS's dark mode setting", 214 "settings.app.form.adaptableDarkMode": "사용하고 있는 OS 다크 모드 설정과 동기화합니다.",
296 "settings.app.form.alwaysShowWorkspaces": "Always show workspace drawer", 215 "settings.app.form.alwaysShowWorkspaces": "Always show workspace drawer",
297 "settings.app.form.autoLaunchInBackground": "백그라운드로 열기", 216 "settings.app.form.autoLaunchInBackground": "백그라운드로 열기",
298 "settings.app.form.autoLaunchOnStart": "부팅 시 Ferdi 실행", 217 "settings.app.form.autoLaunchOnStart": "부팅 시 Ferdi 실행",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "맞춤법 검사 활성화", 227 "settings.app.form.enableSpellchecking": "맞춤법 검사 활성화",
309 "settings.app.form.enableSystemTray": "Ferdi 시스템 트레이에 표시", 228 "settings.app.form.enableSystemTray": "Ferdi 시스템 트레이에 표시",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Service Hibernation 허용",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "하이버네이션 전략", 231 "settings.app.form.hibernationStrategy": "하이버네이션 전략",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -327,33 +245,34 @@
327 "settings.app.form.scheduledDNDEnabled": "방해 금지 모드 시간 설정", 245 "settings.app.form.scheduledDNDEnabled": "방해 금지 모드 시간 설정",
328 "settings.app.form.scheduledDNDEnd": "To", 246 "settings.app.form.scheduledDNDEnd": "To",
329 "settings.app.form.scheduledDNDStart": "From", 247 "settings.app.form.scheduledDNDStart": "From",
330 "settings.app.form.searchEngine": "Search engine", 248 "settings.app.form.searchEngine": "검색 엔진",
331 "settings.app.form.sentry": "Send telemetry data", 249 "settings.app.form.sentry": "Send telemetry data",
332 "settings.app.form.serviceRibbonWidth": "사이드바 너비", 250 "settings.app.form.serviceRibbonWidth": "사이드바 너비",
333 "settings.app.form.showDisabledServices": "사용하지 않는 서비스 출력", 251 "settings.app.form.showDisabledServices": "사용하지 않는 서비스 출력",
334 "settings.app.form.showDragArea": "드래그 가능 영역 보기", 252 "settings.app.form.showDragArea": "드래그 가능 영역 보기",
335 "settings.app.form.showMessagesBadgesWhenMuted": "알림이 비활성화잉ㄹ 때 읽지 않은 메세지 배지 표시", 253 "settings.app.form.showMessagesBadgesWhenMuted": "알림이 비활성화잉ㄹ 때 읽지 않은 메세지 배지 표시",
336 "settings.app.form.startMinimized": "최소화 된 상태로 시작", 254 "settings.app.form.startMinimized": "최소화 된 상태로 시작",
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "전체 다크 모드 활성화",
338 "settings.app.form.useTouchIdToUnlock": "TouchID로 Ferdi 여는 것을 허용", 256 "settings.app.form.useTouchIdToUnlock": "TouchID로 Ferdi 여는 것을 허용",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "수직 스타일 사용",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "설정", 259 "settings.app.headline": "설정",
341 "settings.app.headlineAdvanced": "고급", 260 "settings.app.headlineAdvanced": "고급",
342 "settings.app.headlineAppearance": "모양", 261 "settings.app.headlineAppearance": "모양",
343 "settings.app.headlineGeneral": "일반", 262 "settings.app.headlineGeneral": "일반",
344 "settings.app.headlineLanguage": "언어", 263 "settings.app.headlineLanguage": "언어",
345 "settings.app.headlinePrivacy": "Privacy", 264 "settings.app.headlinePrivacy": "개인 정보",
346 "settings.app.headlineUpdates": "업데이트", 265 "settings.app.headlineUpdates": "업데이트",
347 "settings.app.hibernateInfo": "기본적으로 Ferdi 는 모든 서비스를 열고 백그라운드에서 불러옵니다. 그래서 사용할 때 이미 준비되어 있습니다. Service Hibernation은 일정 개수 이후에 서비스를 불러오지 않습니다. 이로인해 RAM을 절약하고 컴퓨터에서 서비스가 느려지는 것을 방지해주기에 유용합니다.", 266 "settings.app.hibernateInfo": "기본적으로 Ferdi 는 모든 서비스를 열고 백그라운드에서 불러옵니다. 그래서 사용할 때 이미 준비되어 있습니다. Service Hibernation은 일정 개수 이후에 서비스를 불러오지 않습니다. 이로인해 RAM을 절약하고 컴퓨터에서 서비스가 느려지는 것을 방지해주기에 유용합니다.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "공식 지우너 언어는 영어와 독일어이며 이외 언어들은 커뮤니티에 의해 번역되고 있습니다.", 268 "settings.app.languageDisclaimer": "공식 지우너 언어는 영어와 독일어이며 이외 언어들은 커뮤니티에 의해 번역되고 있습니다.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "비밀번호", 270 "settings.app.lockedPassword": "비밀번호",
352 "settings.app.lockedPasswordInfo": "기억할 수 있는 비밀번호로 설정해주세요.\n만약 비밀번호를 잃어버리면 Ferdi 재설치를 해야합니다.", 271 "settings.app.lockedPasswordInfo": "기억할 수 있는 비밀번호로 설정해주세요.\n만약 비밀번호를 잃어버리면 Ferdi 재설치를 해야합니다.",
353 "settings.app.restartRequired": "변경사항을 적용하기 위해 재시작", 272 "settings.app.restartRequired": "변경사항을 적용하기 위해 재시작",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "캐시", 277 "settings.app.subheadlineCache": "캐시",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "폴더 열기", 300 "settings.recipes.customService.openFolder": "폴더 열기",
382 "settings.recipes.headline": "사용가능 한 서비스", 301 "settings.recipes.headline": "사용가능 한 서비스",
383 "settings.recipes.missingService": "서비스가 보이지 않습니까?", 302 "settings.recipes.missingService": "서비스가 보이지 않습니까?",
384 "settings.recipes.mostPopular": "가장 인기 있는",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "서비스가 성공적으로 추가되었습니다.", 304 "settings.recipes.servicesSuccessfulAddedInfo": "서비스가 성공적으로 추가되었습니다.",
387 "settings.searchService": "서비스 찾기", 305 "settings.searchService": "서비스 찾기",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "{name} 추가", 309 "settings.service.form.addServiceHeadline": "{name} 추가",
392 "settings.service.form.availableServices": "사용가능 한 서비스", 310 "settings.service.form.availableServices": "사용가능 한 서비스",
393 "settings.service.form.customUrl": "사용자 정의 서버", 311 "settings.service.form.customUrl": "사용자 정의 서버",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "내 계정 업그레이드",
396 "settings.service.form.customUrlValidationError": "사용자 정의 {name} 서버를 확인할 수 없습니다.", 312 "settings.service.form.customUrlValidationError": "사용자 정의 {name} 서버를 확인할 수 없습니다.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -402,10 +318,10 @@
402 "settings.service.form.enableAudio": "오디오 활성화", 318 "settings.service.form.enableAudio": "오디오 활성화",
403 "settings.service.form.enableBadge": "읽지 않은 메세지 배지 표시", 319 "settings.service.form.enableBadge": "읽지 않은 메세지 배지 표시",
404 "settings.service.form.enableDarkMode": "다크 모드 활성화", 320 "settings.service.form.enableDarkMode": "다크 모드 활성화",
405 "settings.service.form.enableHibernation": "Enable hibernation", 321 "settings.service.form.enableHibernation": "절전모드 활성화",
406 "settings.service.form.enableNotification": "알림 허용", 322 "settings.service.form.enableNotification": "알림 허용",
407 "settings.service.form.enableService": "서비스 활성화", 323 "settings.service.form.enableService": "서비스 활성화",
408 "settings.service.form.headlineBadges": "Unread message badges", 324 "settings.service.form.headlineBadges": "읽지 않은 메세지 배지 표시",
409 "settings.service.form.headlineDarkReaderSettings": "Dark Reader Settings", 325 "settings.service.form.headlineDarkReaderSettings": "Dark Reader Settings",
410 "settings.service.form.headlineGeneral": "일반", 326 "settings.service.form.headlineGeneral": "일반",
411 "settings.service.form.headlineNotifications": "알림", 327 "settings.service.form.headlineNotifications": "알림",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "팀", 380 "settings.team.headline": "팀",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "meetfranz.com에서 팀 관리하기", 382 "settings.team.manageAction": "meetfranz.com에서 팀 관리하기",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "내 계정 업그레이드",
470 "settings.user.form.accountType.company": "회사", 385 "settings.user.form.accountType.company": "회사",
471 "settings.user.form.accountType.individual": "개인", 386 "settings.user.form.accountType.individual": "개인",
472 "settings.user.form.accountType.label": "계좌 유형", 387 "settings.user.form.accountType.label": "계좌 유형",
@@ -483,7 +398,7 @@
483 "settings.workspace.form.keepLoaded": "Keep this workspace loaded*", 398 "settings.workspace.form.keepLoaded": "Keep this workspace loaded*",
484 "settings.workspace.form.keepLoadedInfo": "*This option will be overwritten by the global \"Keep all workspaces loaded\" option.", 399 "settings.workspace.form.keepLoadedInfo": "*This option will be overwritten by the global \"Keep all workspaces loaded\" option.",
485 "settings.workspace.form.name": "이름", 400 "settings.workspace.form.name": "이름",
486 "settings.workspace.form.servicesInWorkspaceHeadline": "Services in this Workspace", 401 "settings.workspace.form.servicesInWorkspaceHeadline": "작업공간에 있는 서비스",
487 "settings.workspace.form.yourWorkspaces": "작업공간", 402 "settings.workspace.form.yourWorkspaces": "작업공간",
488 "settings.workspaces.deletedInfo": "작업영역이 삭제되었습니다.", 403 "settings.workspaces.deletedInfo": "작업영역이 삭제되었습니다.",
489 "settings.workspaces.headline": "작업공간", 404 "settings.workspaces.headline": "작업공간",
@@ -493,7 +408,7 @@
493 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Ferdi Workspaces", 408 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Ferdi Workspaces",
494 "settings.workspaces.workspaceFeatureInfo": "Ferdi 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.", 409 "settings.workspaces.workspaceFeatureInfo": "Ferdi 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.",
495 "settings.workspaces.workspacesRequestFailed": "작업공간을 불러오지 못했습니다.", 410 "settings.workspaces.workspacesRequestFailed": "작업공간을 불러오지 못했습니다.",
496 "setupAssistant.headline": "Let's get started", 411 "setupAssistant.headline": "시작하기",
497 "setupAssistant.subheadline": "Choose from our most used services and get back on top of your messaging now.", 412 "setupAssistant.subheadline": "Choose from our most used services and get back on top of your messaging now.",
498 "setupAssistant.submit.label": "Let's go", 413 "setupAssistant.submit.label": "Let's go",
499 "sidebar.addNewService": "새로운 서비스 추가", 414 "sidebar.addNewService": "새로운 서비스 추가",
@@ -516,31 +431,22 @@
516 "signup.link.login": "이미 계정을 가지고 있으시면, 로그인하세요", 431 "signup.link.login": "이미 계정을 가지고 있으시면, 로그인하세요",
517 "signup.password.label": "비밀번호", 432 "signup.password.label": "비밀번호",
518 "signup.submit.label": "계정 만들기", 433 "signup.submit.label": "계정 만들기",
519 "subscription.bestValue": "Best value", 434 "tabs.item.confirmDeleteService": "{serviceName} 서비스를 정말로 삭제하시겠습니까?",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "모든 옵션 보기",
522 "subscription.cta.choosePlan": "플랜을 선택하세요",
523 "subscription.includedProFeatures": "Ferdi 프로페셔널 플랜에 포함된 것",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "계정 업그레이드",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "취소",
531 "subscriptionPopup.buttonDone": "완료",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "서비스 삭제", 435 "tabs.item.deleteService": "서비스 삭제",
534 "tabs.item.disableAudio": "오디오 비활성화", 436 "tabs.item.disableAudio": "오디오 비활성화",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "알림 비활성화", 438 "tabs.item.disableNotifications": "알림 비활성화",
536 "tabs.item.disableService": "서비스 비활성화", 439 "tabs.item.disableService": "서비스 비활성화",
537 "tabs.item.edit": "편집", 440 "tabs.item.edit": "편집",
538 "tabs.item.enableAudio": "오디오 활성화", 441 "tabs.item.enableAudio": "오디오 활성화",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "알림 허용", 443 "tabs.item.enableNotification": "알림 허용",
540 "tabs.item.enableService": "서비스 활성화", 444 "tabs.item.enableService": "서비스 활성화",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "새로고침", 446 "tabs.item.reload": "새로고침",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} 는 유효하지 않습니다.", 448 "validation.email": "{field} 는 유효하지 않습니다.",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} 최소한 {length} 보다 길어야 합니다.",
544 "validation.oneRequired": "적어도 하나는 필요 합니다.", 450 "validation.oneRequired": "적어도 하나는 필요 합니다.",
545 "validation.required": "{field} 는 필수입니다.", 451 "validation.required": "{field} 는 필수입니다.",
546 "validation.url": "{field} 는 유효하지 않은 URL입니다.", 452 "validation.url": "{field} 는 유효하지 않은 URL입니다.",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "작업 공간", 462 "workspaceDrawer.headline": "작업 공간",
557 "workspaceDrawer.item.contextMenuEdit": "편집", 463 "workspaceDrawer.item.contextMenuEdit": "편집",
558 "workspaceDrawer.item.noServicesAddedYet": "추가된 서비스가 없습니다.", 464 "workspaceDrawer.item.noServicesAddedYet": "추가된 서비스가 없습니다.",
559 "workspaceDrawer.premiumCtaButtonLabel": "첫 작업 공간 생성",
560 "workspaceDrawer.proFeatureBadge": "프리미엄 기능",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "프리미엄 계정 다시 활성화하기",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "작업공간 설정 편집", 466 "workspaceDrawer.workspacesSettingsTooltip": "작업공간 설정 편집",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/ms.json b/src/i18n/locales/ms.json
index bb6115b36..6f92bf4de 100644
--- a/src/i18n/locales/ms.json
+++ b/src/i18n/locales/ms.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "Ferdi akan beroperasi semula dalam {seconds} saat",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "Naik taraf akaun",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
19 "feature.planSelection.cta.upgradePro": "Choose Professional",
20 "feature.planSelection.free.text": "Basic functionality",
21 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
24 "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.",
25 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
26 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
30 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
31 "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.",
32 "feature.shareFranz.action.email": "Hantar sebagai emel", 8 "feature.shareFranz.action.email": "Hantar sebagai emel",
33 "feature.shareFranz.action.facebook": "Kongsi ke Facebook", 9 "feature.shareFranz.action.facebook": "Kongsi ke Facebook",
34 "feature.shareFranz.action.twitter": "Kongsi ke Twitter", 10 "feature.shareFranz.action.twitter": "Kongsi ke Twitter",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "Saya telah menambah {count] servis ke Ferdi! Dapatkan aplikasi percuma WhatsApp, Messenger, Slack, Skype dan lain-lain dari www.getferdi.com", 12 "feature.shareFranz.shareText.email": "Saya telah menambah {count] servis ke Ferdi! Dapatkan aplikasi percuma WhatsApp, Messenger, Slack, Skype dan lain-lain dari www.getferdi.com",
37 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 13 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
38 "feature.shareFranz.text": "Beritahu rakan anda betapa hebatnya Ferdi dan bantu kami menyebarkan maklumat ini", 14 "feature.shareFranz.text": "Beritahu rakan anda betapa hebatnya Ferdi dan bantu kami menyebarkan maklumat ini",
39 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
40 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade": "Upgrade Account",
42 "feature.trialStatusBar.cta": "Upgrade now",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
46 "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.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
49 "global.api.unhealthy": "Tidak dapat bersambung ke perkhidmatan dalam talian Ferdi", 15 "global.api.unhealthy": "Tidak dapat bersambung ke perkhidmatan dalam talian Ferdi",
50 "global.franzProRequired": "Ferdi Professional Required", 16 "global.franzProRequired": "Ferdi Professional Required",
51 "global.notConnectedToTheInternet": "Anda tidak disambungkan ke internet.", 17 "global.notConnectedToTheInternet": "Anda tidak disambungkan ke internet.",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "Kesan bahasa secara automatik", 19 "global.spellchecking.autodetect": "Kesan bahasa secara automatik",
54 "global.spellchecking.autodetect.short": "Automatik", 20 "global.spellchecking.autodetect.short": "Automatik",
55 "global.spellchecking.language": "Bahasa untuk semakan ejaan", 21 "global.spellchecking.language": "Bahasa untuk semakan ejaan",
56 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
57 "import.headline": "Import perkhidmatan Ferdi 4 anda", 22 "import.headline": "Import perkhidmatan Ferdi 4 anda",
58 "import.notSupportedHeadline": "Perkhidmatan belum disokong dalam Ferdi 5", 23 "import.notSupportedHeadline": "Perkhidmatan belum disokong dalam Ferdi 5",
59 "import.skip.label": "Saya mahu menambah perkhidmatan secara manual", 24 "import.skip.label": "Saya mahu menambah perkhidmatan secara manual",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "Mula semula perkhidmatan", 28 "infobar.buttonReloadServices": "Mula semula perkhidmatan",
64 "infobar.requiredRequestsFailed": "Tidak dapat memuatkan perkhidmatan dan maklumat pengguna", 29 "infobar.requiredRequestsFailed": "Tidak dapat memuatkan perkhidmatan dan maklumat pengguna",
65 "infobar.servicesUpdated": "Perkhidmatan anda telah dikemas kini.", 30 "infobar.servicesUpdated": "Perkhidmatan anda telah dikemas kini.",
66 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable": "Kemas kini baru untuk Ferdi boleh didapati.", 31 "infobar.updateAvailable": "Kemas kini baru untuk Ferdi boleh didapati.",
68 "invite.email.label": "Alamat emel", 32 "invite.email.label": "Alamat emel",
69 "invite.headline.friends": "Jemput 3 rakan atau rakan sekerja anda", 33 "invite.headline.friends": "Jemput 3 rakan atau rakan sekerja anda",
@@ -122,9 +86,7 @@
122 "menu.todos": "Todos", 86 "menu.todos": "Todos",
123 "menu.todos.enableTodos": "Enable Todos", 87 "menu.todos.enableTodos": "Enable Todos",
124 "menu.view": "Paparan", 88 "menu.view": "Paparan",
125 "menu.view.enterFullScreen": "Masuk Skrin Penuh", 89 "menu.view.reloadFerdi": "Ulangmuat Ferdi",
126 "menu.view.exitFullScreen": "Keluar Skrin Penuh",
127 "menu.view.reloadFranz": "Ulangmuat Ferdi",
128 "menu.view.reloadService": "Ulangmuat Perkhidmatan", 90 "menu.view.reloadService": "Ulangmuat Perkhidmatan",
129 "menu.view.reloadTodos": "Reload ToDos", 91 "menu.view.reloadTodos": "Reload ToDos",
130 "menu.view.resetZoom": "Saiz Sebenar", 92 "menu.view.resetZoom": "Saiz Sebenar",
@@ -149,7 +111,6 @@
149 "password.noUser": "Tiada pengguna dengan alamat e-mel tersebut dijumpai", 111 "password.noUser": "Tiada pengguna dengan alamat e-mel tersebut dijumpai",
150 "password.submit.label": "Hantar", 112 "password.submit.label": "Hantar",
151 "password.successInfo": "Sila semak e-mel anda", 113 "password.successInfo": "Sila semak e-mel anda",
152 "premiumFeature.button.upgradeAccount": "Naik taraf akaun",
153 "pricing.features.accountSync": "Account Synchronisation", 114 "pricing.features.accountSync": "Account Synchronisation",
154 "pricing.features.adFree": "Forever ad-free", 115 "pricing.features.adFree": "Forever ad-free",
155 "pricing.features.appDelays": "No Waiting Screens", 116 "pricing.features.appDelays": "No Waiting Screens",
@@ -166,27 +127,6 @@
166 "pricing.features.upToSixServices": "Add up to 6 services", 127 "pricing.features.upToSixServices": "Add up to 6 services",
167 "pricing.features.upToThreeServices": "Add up to 3 services", 128 "pricing.features.upToThreeServices": "Add up to 3 services",
168 "pricing.features.workspaces": "Workspaces", 129 "pricing.features.workspaces": "Workspaces",
169 "pricing.plan.free": "Free",
170 "pricing.plan.legacy": "Premium",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal Monthly",
173 "pricing.plan.personal-yearly": "Personal Yearly",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional Monthly",
176 "pricing.plan.pro-yearly": "Professional Yearly",
177 "pricing.trial.cta.accept": "Start my 14-day Ferdi Professional Trial ",
178 "pricing.trial.cta.skip": "Continue to Ferdi",
179 "pricing.trial.cta.start": "Start using Ferdi",
180 "pricing.trial.error": "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline": "Ferdi Professional includes:",
182 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
183 "pricing.trial.intro.happyMessaging": "Happy messaging,",
184 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
185 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline": "No strings attached",
188 "pricing.trial.terms.noCreditCard": "No credit card required",
189 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action": "Ulangmuat {nama}", 130 "service.crashHandler.action": "Ulangmuat {nama}",
191 "service.crashHandler.autoReload": "Sedang cuba pulihkan secara automatik {nama} dalam {saat} saat", 131 "service.crashHandler.autoReload": "Sedang cuba pulihkan secara automatik {nama} dalam {saat} saat",
192 "service.crashHandler.headline": "Alamak!", 132 "service.crashHandler.headline": "Alamak!",
@@ -198,11 +138,6 @@
198 "service.errorHandler.headline": "Alamak!", 138 "service.errorHandler.headline": "Alamak!",
199 "service.errorHandler.message": "Error", 139 "service.errorHandler.message": "Error",
200 "service.errorHandler.text": "{name} has failed to load.", 140 "service.errorHandler.text": "{name} has failed to load.",
201 "service.restrictedHandler.action": "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
203 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading": "Loading", 141 "service.webviewLoader.loading": "Loading",
207 "services.getStarted": "Bermula", 142 "services.getStarted": "Bermula",
208 "services.welcome": "Selamat Datang ke Ferdi", 143 "services.welcome": "Selamat Datang ke Ferdi",
@@ -219,18 +154,9 @@
219 "settings.account.headlineInvoices": "Invois", 154 "settings.account.headlineInvoices": "Invois",
220 "settings.account.headlinePassword": "Tukar katalaluan", 155 "settings.account.headlinePassword": "Tukar katalaluan",
221 "settings.account.headlineProfile": "Kemaskini maklumat peribadi", 156 "settings.account.headlineProfile": "Kemaskini maklumat peribadi",
222 "settings.account.headlineSubscription": "Langganan anda",
223 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
224 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
225 "settings.account.invoiceDownload": "Muat Turun",
226 "settings.account.manageSubscription.label": "Urus langganan anda",
227 "settings.account.successInfo": "Kemaskini telah disimpan", 157 "settings.account.successInfo": "Kemaskini telah disimpan",
228 "settings.account.trial": "Free Trial",
229 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices": "Cuba lagi", 158 "settings.account.tryReloadServices": "Cuba lagi",
232 "settings.account.tryReloadUserInfoRequest": "Cuba lagi", 159 "settings.account.tryReloadUserInfoRequest": "Cuba lagi",
233 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
234 "settings.account.userInfoRequestFailed": "Maklumat pengguna tidak dapat dipapar", 160 "settings.account.userInfoRequestFailed": "Maklumat pengguna tidak dapat dipapar",
235 "settings.account.yourLicense": "Your Ferdi License", 161 "settings.account.yourLicense": "Your Ferdi License",
236 "settings.app.buttonClearAllCache": "Padamkan Cache", 162 "settings.app.buttonClearAllCache": "Padamkan Cache",
@@ -284,7 +210,6 @@
284 "settings.recipes.customService.openFolder": "Open folder", 210 "settings.recipes.customService.openFolder": "Open folder",
285 "settings.recipes.headline": "Available services", 211 "settings.recipes.headline": "Available services",
286 "settings.recipes.missingService": "Missing a service?", 212 "settings.recipes.missingService": "Missing a service?",
287 "settings.recipes.mostPopular": "Most popular",
288 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 213 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
289 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 214 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
290 "settings.searchService": "Search service", 215 "settings.searchService": "Search service",
@@ -295,7 +220,6 @@
295 "settings.service.form.availableServices": "Available services", 220 "settings.service.form.availableServices": "Available services",
296 "settings.service.form.customUrl": "Custom server", 221 "settings.service.form.customUrl": "Custom server",
297 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.", 222 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
298 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
299 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 223 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
300 "settings.service.form.deleteButton": "Delete service", 224 "settings.service.form.deleteButton": "Delete service",
301 "settings.service.form.editServiceHeadline": "Edit {name}", 225 "settings.service.form.editServiceHeadline": "Edit {name}",
@@ -391,19 +315,6 @@
391 "signup.link.login": "Already have an account, sign in?", 315 "signup.link.login": "Already have an account, sign in?",
392 "signup.password.label": "Kata laluan", 316 "signup.password.label": "Kata laluan",
393 "signup.submit.label": "Create account", 317 "signup.submit.label": "Create account",
394 "subscription.bestValue": "Best value",
395 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
396 "subscription.cta.allOptions": "See all options",
397 "subscription.cta.choosePlan": "Choose your plan",
398 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
399 "subscription.interval.per": "per {interval}",
400 "subscription.interval.perMonth": "per month",
401 "subscription.interval.perMonthPerUser": "per month & user",
402 "subscription.planItem.upgradeAccount": "Upgrade Account",
403 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
404 "subscription.teaser.intro": "Ferdi 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!",
405 "subscriptionPopup.buttonCancel": "Cancel",
406 "subscriptionPopup.buttonDone": "Done",
407 "tabs.item.deleteService": "Delete service", 318 "tabs.item.deleteService": "Delete service",
408 "tabs.item.disableAudio": "Disable audio", 319 "tabs.item.disableAudio": "Disable audio",
409 "tabs.item.disableNotifications": "Disable notifications", 320 "tabs.item.disableNotifications": "Disable notifications",
@@ -431,7 +342,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "edit", 342 "workspaceDrawer.item.contextMenuEdit": "edit",
432 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 343 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 344 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge": "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 345 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 346 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 347 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
diff --git a/src/i18n/locales/nb.json b/src/i18n/locales/nb.json
index dde8fcb83..c2f9f0e53 100644
--- a/src/i18n/locales/nb.json
+++ b/src/i18n/locales/nb.json
@@ -45,15 +45,6 @@
45 "invite.name.label": "Navn", 45 "invite.name.label": "Navn",
46 "invite.email.label": "Email adresse", 46 "invite.email.label": "Email adresse",
47 "invite.skip.label": "Jeg vil gjøre dette senere", 47 "invite.skip.label": "Jeg vil gjøre dette senere",
48 "subscription.submit.label": "Jeg vil ikke støtte utviklingen av Ferdi",
49 "subscription.paymentSessionError": "Kunne ikke laste betalingsskjemaet",
50 "subscription.includedFeatures": "Betalte Ferdi Premium konto inkluderer",
51 "subscription.features.onpremise": "Legg til on-premise/hosted tjenester som HipChat",
52 "subscription.features.customServices": "Private tjenester for deg og ditt lag",
53 "subscription.features.encryptedSync": "Kryptert øktsynkronisering",
54 "subscription.features.vpn": "Proxy & VPN støtte",
55 "subscription.features.ads": "Ingen annonser, noensinne!",
56 "subscription.features.comingSoon": "Kommer snart",
57 "infobar.servicesUpdated": "Dine tjenester er oppdatert.", 48 "infobar.servicesUpdated": "Dine tjenester er oppdatert.",
58 "infobar.updateAvailable": "En ny oppdatering for Ferdi er tilgjengelig.", 49 "infobar.updateAvailable": "En ny oppdatering for Ferdi er tilgjengelig.",
59 "infobar.buttonReloadServices": "Oppdater tjenester", 50 "infobar.buttonReloadServices": "Oppdater tjenester",
@@ -64,14 +55,10 @@
64 "services.welcome": "Velkommen til Ferdi", 55 "services.welcome": "Velkommen til Ferdi",
65 "services.getStarted": "Kom i gang", 56 "services.getStarted": "Kom i gang",
66 "settings.account.headline": "Konto", 57 "settings.account.headline": "Konto",
67 "settings.account.headlineSubscription": "Ditt abonnement",
68 "settings.account.headlineUpgrade": "Oppgrader din konto og støtt Ferdi", 58 "settings.account.headlineUpgrade": "Oppgrader din konto og støtt Ferdi",
69 "settings.account.headlineInvoices": "Fakturaer",
70 "settings.account.manageSubscription.label": "Administrer dine abonnement",
71 "settings.account.accountType.basic": "Enkel Konto", 59 "settings.account.accountType.basic": "Enkel Konto",
72 "settings.account.accountType.premium": "Premium Konto", 60 "settings.account.accountType.premium": "Premium Konto",
73 "settings.account.account.editButton": "Rediger konto", 61 "settings.account.account.editButton": "Rediger konto",
74 "settings.account.invoiceDownload": "Last ned",
75 "settings.account.userInfoRequestFailed": "Kunne ikke laste brukerinformasjon", 62 "settings.account.userInfoRequestFailed": "Kunne ikke laste brukerinformasjon",
76 "settings.account.tryReloadUserInfoRequest": "Prøv igjen", 63 "settings.account.tryReloadUserInfoRequest": "Prøv igjen",
77 "settings.account.headlineProfile": "Oppdater profil", 64 "settings.account.headlineProfile": "Oppdater profil",
@@ -89,7 +76,6 @@
89 "settings.navigation.settings": "Innstillinger", 76 "settings.navigation.settings": "Innstillinger",
90 "settings.navigation.logout": "Logg ut", 77 "settings.navigation.logout": "Logg ut",
91 "settings.recipes.headline": "Tilgjengelige tjenester", 78 "settings.recipes.headline": "Tilgjengelige tjenester",
92 "settings.recipes.mostPopular": "Mest populære",
93 "settings.recipes.all": "Alle tjenester", 79 "settings.recipes.all": "Alle tjenester",
94 "settings.recipes.dev": "Utvikling", 80 "settings.recipes.dev": "Utvikling",
95 "settings.recipes.nothingFound": "Beklager, men ingen tjeneste samsvarer med søkeordet ditt.", 81 "settings.recipes.nothingFound": "Beklager, men ingen tjeneste samsvarer med søkeordet ditt.",
@@ -149,18 +135,6 @@
149 "settings.user.form.accountType.individual": "Individuell", 135 "settings.user.form.accountType.individual": "Individuell",
150 "settings.user.form.accountType.non-profit": "Non-Profit", 136 "settings.user.form.accountType.non-profit": "Non-Profit",
151 "settings.user.form.accountType.company": "Firma", 137 "settings.user.form.accountType.company": "Firma",
152 "subscription.type.free": "gratis",
153 "subscription.type.month": "måned",
154 "subscription.type.year": "år",
155 "subscription.type.mining": "Støtt Ferdi med prosessorkraft",
156 "subscription.mining.headline": "Hvordan fungerer dette?",
157 "subscription.mining.experimental": "eksperimental",
158 "subscription.mining.line1": "Ved å aktivere \"Støtt Ferdi med prosessorkraft\" vil Ferdi bruke cirka 20-50% av prosessore din til å mine kryptovalutaen Monero, som vil tilsvare omtrent $5/år",
159 "subscription.mining.line2": "Vi vil tilpasse prosessor bruken basert på arbeidsadferd for å ikke tømme batteriet og senke hastigheten på maskinen din.",
160 "subscription.mining.line3": "Så lenge du miner, har du ubegrenset tilgang til alle Ferdi Premium funksjoner.",
161 "subscription.mining.moreInformation": "Få mer informasjon om denne planen.",
162 "subscriptionPopup.buttonCancel": "Kanseller",
163 "subscriptionPopup.buttonDone": "Ferdi g",
164 "tabs.item.reload": "Reload", 138 "tabs.item.reload": "Reload",
165 "tabs.item.edit": "Rediger", 139 "tabs.item.edit": "Rediger",
166 "tabs.item.disableNotifications": "Deaktiver varsler", 140 "tabs.item.disableNotifications": "Deaktiver varsler",
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index a4f8aca49..3d6991d5e 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Wijzigingen in Ferdi {versie}", 13 "feature.announcements.changelog.headline": "Wijzigingen in Ferdi {versie}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Neem een Ferdi Supporter Licentie om niet meer te hoeven wachten",
16 "feature.delayApp.text": "Ferdi gaat over {seconds} seconden verder.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Neem een Ferdi Supporter Licentie ",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Annuleren", 16 "feature.nightlyBuilds.cancel": "Annuleren",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Verstuur als e-mail", 29 "feature.shareFranz.action.email": "Verstuur als e-mail",
54 "feature.shareFranz.action.facebook": "Deel op Facebook", 30 "feature.shareFranz.action.facebook": "Deel op Facebook",
55 "feature.shareFranz.action.twitter": "Deel op Twitter", 31 "feature.shareFranz.action.twitter": "Deel op Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Ik heb {telling} diensten toegevoegd aan Ferdi! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Ik heb {telling} diensten toegevoegd aan Ferdi! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Ik heb {tel} diensten toegevoegd aan Ferdi! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Ik heb {tel} diensten toegevoegd aan Ferdi! Download de gratis app voor WhatsApp, Messenger, Slack, Skype, en anderen op www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Vertel je vrienden en collega's hoe geweldig Ferdi is en help ons het woord te verspreiden.", 35 "feature.shareFranz.text": "Vertel je vrienden en collega's hoe geweldig Ferdi is en help ons het woord te verspreiden.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Kan geen verbinding maken met de Ferdi services", 36 "global.api.unhealthy": "Kan geen verbinding maken met de Ferdi services",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "Je hebt geen internet verbinding.", 37 "global.notConnectedToTheInternet": "Je hebt geen internet verbinding.",
73 "global.spellchecker.useDefault": "Gebruik Systeemstandaard ({default})", 38 "global.spellchecker.useDefault": "Gebruik Systeemstandaard ({default})",
74 "global.spellchecking.autodetect": "Taal automatisch herkennen", 39 "global.spellchecking.autodetect": "Taal automatisch herkennen",
75 "global.spellchecking.autodetect.short": "Automatisch", 40 "global.spellchecking.autodetect.short": "Automatisch",
76 "global.spellchecking.language": "Taal spellingscontrole", 41 "global.spellchecking.language": "Taal spellingscontrole",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importeer je Ferdi 4 services", 44 "import.headline": "Importeer je Ferdi 4 services",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Verbergen", 52 "infobar.hide": "Verbergen",
89 "infobar.requiredRequestsFailed": "Kan de services en gebruikersinformatie niet laden", 53 "infobar.requiredRequestsFailed": "Kan de services en gebruikersinformatie niet laden",
90 "infobar.servicesUpdated": "Je services zijn bijgewerkt.", 54 "infobar.servicesUpdated": "Je services zijn bijgewerkt.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Er is een nieuwe update voor Ferdi beschikbaar.", 55 "infobar.updateAvailable": "Er is een nieuwe update voor Ferdi beschikbaar.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "E-mailadres", 57 "invite.email.label": "E-mailadres",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "Controleer op updates", 88 "menu.app.checkForUpdates": "Controleer op updates",
126 "menu.app.hide": "Verbergen", 89 "menu.app.hide": "Verbergen",
127 "menu.app.hideOthers": "Andere Verbergen", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Afsluiten", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Instellingen", 92 "menu.app.settings": "Instellingen",
130 "menu.app.unhide": "Tonen", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Bewerken", 94 "menu.edit": "Bewerken",
132 "menu.edit.copy": "Kopiëren", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Knippen", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Verwijderen", 97 "menu.edit.delete": "Verwijderen",
135 "menu.edit.emojiSymbols": "Emoji & Symbolen", 98 "menu.edit.emojiSymbols": "Emoji & Symbolen",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Plakken", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Plakken en stijl overeen laten komen", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Opnieuw doen", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Selecteer Alles", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Spraakuitvoer", 104 "menu.edit.speech": "Spraakuitvoer",
142 "menu.edit.startDictation": "Beginnen met dicteren", 105 "menu.edit.startDictation": "Beginnen met dicteren",
143 "menu.edit.startSpeaking": "Begin met Spreken", 106 "menu.edit.startSpeaking": "Begin met Spreken",
144 "menu.edit.stopSpeaking": "Stoppen met Spreken", 107 "menu.edit.stopSpeaking": "Stoppen met Spreken",
145 "menu.edit.undo": "Ongedaan maken", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Bestand", 109 "menu.file": "Bestand",
147 "menu.help": "Help", 110 "menu.help": "Help",
148 "menu.help.changelog": "Logboek", 111 "menu.help.changelog": "Logboek",
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Meer Weten", 116 "menu.help.learnMore": "Meer Weten",
153 "menu.help.privacy": "Privacyverklaring", 117 "menu.help.privacy": "Privacyverklaring",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Weergave", 128 "menu.view": "Weergave",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Volledig scherm openen",
167 "menu.view.exitFullScreen": "Volledig scherm verlaten",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Ferdi Herladen", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Service Herladen", 134 "menu.view.reloadService": "Service Herladen",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Werkelijke Grootte", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Toggle Dark Mode", 137 "menu.view.toggleDarkMode": "Toggle Dark Mode",
176 "menu.view.toggleDevTools": "Ontwikkelaarstools Aan/Uit", 138 "menu.view.toggleDevTools": "Ontwikkelaarstools Aan/Uit",
177 "menu.view.toggleFullScreen": "Volledig Scherm Aan/Uit", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Service Ontwikkelaarstools Aan/Uit", 140 "menu.view.toggleServiceDevTools": "Service Ontwikkelaarstools Aan/Uit",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "Inzoomen", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Uitzoomen", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Venster", 144 "menu.window": "Window",
183 "menu.window.close": "Sluiten", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimaliseren", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Werkruimten", 147 "menu.workspaces": "Werkruimten",
186 "menu.workspaces.addNewWorkspace": "Voeg nieuwe werkruimte toe...", 148 "menu.workspaces.addNewWorkspace": "Voeg nieuwe werkruimte toe...",
187 "menu.workspaces.closeWorkspaceDrawer": "Werkruimtepagina sluiten", 149 "menu.workspaces.closeWorkspaceDrawer": "Werkruimtepagina sluiten",
@@ -194,11 +156,7 @@
194 "password.noUser": "Geen gebruiker gevonden met dat e-mailadres", 156 "password.noUser": "Geen gebruiker gevonden met dat e-mailadres",
195 "password.submit.label": "Verzenden", 157 "password.submit.label": "Verzenden",
196 "password.successInfo": "Controleer alsjeblieft je e-mail", 158 "password.successInfo": "Controleer alsjeblieft je e-mail",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Werkruimten", 169 "pricing.features.workspaces": "Werkruimten",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "{naam} herladen", 170 "service.crashHandler.action": "{naam} herladen",
236 "service.crashHandler.autoReload": "Ga proberen om {name} te herstellen over {seconds} seconden", 171 "service.crashHandler.autoReload": "Ga proberen om {name} te herstellen over {seconds} seconden",
237 "service.crashHandler.headline": "Oh nee!", 172 "service.crashHandler.headline": "Oh nee!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh nee!", 178 "service.errorHandler.headline": "Oh nee!",
244 "service.errorHandler.message": "Fout", 179 "service.errorHandler.message": "Fout",
245 "service.errorHandler.text": "{name} kon niet geladen worden.", 180 "service.errorHandler.text": "{name} kon niet geladen worden.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Beginnen", 182 "services.getStarted": "Beginnen",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welkom bij Ferdi", 186 "services.welcome": "Welkom bij Ferdi",
257 "settings.account.account.editButton": "Account bewerken", 187 "settings.account.account.editButton": "Account bewerken",
258 "settings.account.accountType.basic": "Basis Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Profiel bijwerken", 190 "settings.account.buttonSave": "Profiel bijwerken",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Facturen", 197 "settings.account.headlineInvoices": "Facturen",
270 "settings.account.headlinePassword": "Wijzig wachtwoord", 198 "settings.account.headlinePassword": "Wijzig wachtwoord",
271 "settings.account.headlineProfile": "Profiel bijwerken", 199 "settings.account.headlineProfile": "Profiel bijwerken",
272 "settings.account.headlineSubscription": "Je abonnement",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Beheer je abonnement",
277 "settings.account.successInfo": "Je wijzigingen zijn opgeslagen", 200 "settings.account.successInfo": "Je wijzigingen zijn opgeslagen",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Probeer opnieuw", 201 "settings.account.tryReloadServices": "Probeer opnieuw",
282 "settings.account.tryReloadUserInfoRequest": "Probeer opnieuw", 202 "settings.account.tryReloadUserInfoRequest": "Probeer opnieuw",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Kon gebruikersinformatie niet laden", 203 "settings.account.userInfoRequestFailed": "Kon gebruikersinformatie niet laden",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Spellingcontrole inschakelen", 227 "settings.app.form.enableSpellchecking": "Spellingcontrole inschakelen",
309 "settings.app.form.enableSystemTray": "Toon Ferdi in de systeembalk", 228 "settings.app.form.enableSystemTray": "Toon Ferdi in de systeembalk",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Instellingen", 259 "settings.app.headline": "Instellingen",
341 "settings.app.headlineAdvanced": "Geavanceerd", 260 "settings.app.headlineAdvanced": "Geavanceerd",
342 "settings.app.headlineAppearance": "Weergave", 261 "settings.app.headlineAppearance": "Weergave",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Officiële vertalingen zijn in het Engels en Duits. Alle andere tallen zijn op de gemeenschap gebaseerde vertalingen.", 268 "settings.app.languageDisclaimer": "Officiële vertalingen zijn in het Engels en Duits. Alle andere tallen zijn op de gemeenschap gebaseerde vertalingen.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Deze wijziging heeft een herstart nodig", 272 "settings.app.restartRequired": "Deze wijziging heeft een herstart nodig",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Beschikbare services", 301 "settings.recipes.headline": "Beschikbare services",
383 "settings.recipes.missingService": "Mist er een service?", 302 "settings.recipes.missingService": "Mist er een service?",
384 "settings.recipes.mostPopular": "Meest populair",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service succesvol toegevoegd", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service succesvol toegevoegd",
387 "settings.searchService": "Service zoeken", 305 "settings.searchService": "Service zoeken",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "{name} toevoegen", 309 "settings.service.form.addServiceHeadline": "{name} toevoegen",
392 "settings.service.form.availableServices": "Beschikbare services", 310 "settings.service.form.availableServices": "Beschikbare services",
393 "settings.service.form.customUrl": "Aangepaste server", 311 "settings.service.form.customUrl": "Aangepaste server",
394 "settings.service.form.customUrlPremiumInfo": "Om intern gehoste services toe te voegen heb je een Ferdi Premium Supporter Account nodig.",
395 "settings.service.form.customUrlUpgradeAccount": "Je account upgraden",
396 "settings.service.form.customUrlValidationError": "Kon de custom {name} server niet valideren.", 312 "settings.service.form.customUrlValidationError": "Kon de custom {name} server niet valideren.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade je Account",
470 "settings.user.form.accountType.company": "Bedrijf", 385 "settings.user.form.accountType.company": "Bedrijf",
471 "settings.user.form.accountType.individual": "Particulier", 386 "settings.user.form.accountType.individual": "Particulier",
472 "settings.user.form.accountType.label": "Account type", 387 "settings.user.form.accountType.label": "Account type",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Al een account, inloggen?", 431 "signup.link.login": "Al een account, inloggen?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Account aanmaken", 433 "signup.submit.label": "Account aanmaken",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Annuleren",
531 "subscriptionPopup.buttonDone": "Klaar",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Service verwijderen", 435 "tabs.item.deleteService": "Service verwijderen",
534 "tabs.item.disableAudio": "Audio uitschakelen", 436 "tabs.item.disableAudio": "Audio uitschakelen",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Notificaties uitschakelen", 438 "tabs.item.disableNotifications": "Notificaties uitschakelen",
536 "tabs.item.disableService": "Service uitschakelen", 439 "tabs.item.disableService": "Service uitschakelen",
537 "tabs.item.edit": "Bewerken", 440 "tabs.item.edit": "Bewerken",
538 "tabs.item.enableAudio": "Audio inschakelen", 441 "tabs.item.enableAudio": "Audio inschakelen",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Notificaties aanzetten", 443 "tabs.item.enableNotification": "Notificaties aanzetten",
540 "tabs.item.enableService": "Service aanzetten", 444 "tabs.item.enableService": "Service aanzetten",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Herladen", 446 "tabs.item.reload": "Herladen",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is niet geldig", 448 "validation.email": "{field} is niet geldig",
543 "validation.minLength": "{field} moet minimaal {length} karakters lang zijn", 449 "validation.minLength": "{field} moet minimaal {length} karakters lang zijn",
544 "validation.oneRequired": "Ten minste één is vereist", 450 "validation.oneRequired": "Ten minste één is vereist",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Werkruimten", 462 "workspaceDrawer.headline": "Werkruimten",
557 "workspaceDrawer.item.contextMenuEdit": "bewerken", 463 "workspaceDrawer.item.contextMenuEdit": "bewerken",
558 "workspaceDrawer.item.noServicesAddedYet": "Nog geen diensten toegevoegd", 464 "workspaceDrawer.item.noServicesAddedYet": "Nog geen diensten toegevoegd",
559 "workspaceDrawer.premiumCtaButtonLabel": "Maak je eerste werkruimte aan",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Heractiveer premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Pas werkruimte instellingen aan", 466 "workspaceDrawer.workspacesSettingsTooltip": "Pas werkruimte instellingen aan",
564 "workspaces.switchingIndicator.switchingTo": "Overschakelen naar" 467 "workspaces.switchingIndicator.switchingTo": "Overschakelen naar"
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index 45f0b4301..1d639197c 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh nee! Ferdi heeft de verbinding met {name} verloren.", 12 "connectionLostBanner.message": "Oh nee! Ferdi heeft de verbinding met {name} verloren.",
13 "feature.announcements.changelog.headline": "Wijzigingen in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Wijzigingen in Ferdi {version}",
14 "feature.debugger.title": "Foutopsporingsinformatie publiceren", 14 "feature.debugger.title": "Foutopsporingsinformatie publiceren",
15 "feature.delayApp.headline": "Sponsor Ferdi om wachten over te slaan",
16 "feature.delayApp.text": "Ferdi gaat over {seconds} seconden verder.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Sponsor Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Upgrade Account",
22 "feature.nightlyBuilds.activate": "Activeren", 15 "feature.nightlyBuilds.activate": "Activeren",
23 "feature.nightlyBuilds.cancel": "Annuleer", 16 "feature.nightlyBuilds.cancel": "Annuleer",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nachtelijke builds", 18 "feature.nightlyBuilds.title": "Nachtelijke builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Er is een fout opgetreden tijdens het publiceren van de debug informatie. Probeer het later opnieuw of bekijk de console voor meer informatie.", 19 "feature.publishDebugInfo.error": "Er is een fout opgetreden tijdens het publiceren van de debug informatie. Probeer het later opnieuw of bekijk de console voor meer informatie.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacybeleid", 21 "feature.publishDebugInfo.privacy": "Privacybeleid",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Selecteer een service met TAB, ↑ en ↓. Open een service met ENTER.", 26 "feature.quickSwitch.info": "Selecteer een service met TAB, ↑ en ↓. Open een service met ENTER.",
50 "feature.quickSwitch.search": "Zoeken...", 27 "feature.quickSwitch.search": "Zoeken...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "feature.serviceLimit.limitReached": "U heeft {amount} van de {limit} diensten die deel uitmaken van uw abonnement toegevoegd. Upgrade uw account om meer diensten toe te voegen.",
53 "feature.shareFranz.action.email": "Verstuur als e-mail", 29 "feature.shareFranz.action.email": "Verstuur als e-mail",
54 "feature.shareFranz.action.facebook": "Deel op Facebook", 30 "feature.shareFranz.action.facebook": "Deel op Facebook",
55 "feature.shareFranz.action.twitter": "Deel op Twitter", 31 "feature.shareFranz.action.twitter": "Deel op Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Ik heb {count} services toegevoegd aan Ferdi! Download de gratis app voor Whatsapp, Messenger, Slack, Skype en co op www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Ik heb {count} services toegevoegd aan Ferdi! Download de gratis app voor Whatsapp, Messenger, Slack, Skype en co op www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Ik heb {count} services toegevoegd aan Ferdi! Download de gratis app voor Whatsapp, Messenger, Slack, Skype en co op www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Ik heb {count} services toegevoegd aan Ferdi! Download de gratis app voor Whatsapp, Messenger, Slack, Skype en co op www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Vertel je vrienden en collega's hoe geweldig Ferdi is en help ons om bekender te worden.", 35 "feature.shareFranz.text": "Vertel je vrienden en collega's hoe geweldig Ferdi is en help ons om bekender te worden.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Alle anderen zullen nog wat langer moeten wachten.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Kan geen verbinding maken met de Ferdi-services.", 36 "global.api.unhealthy": "Kan geen verbinding maken met de Ferdi-services.",
71 "global.franzProRequired": "Ferdi Professional Vereist",
72 "global.notConnectedToTheInternet": "U bent niet verbonden met het internet.", 37 "global.notConnectedToTheInternet": "U bent niet verbonden met het internet.",
73 "global.spellchecker.useDefault": "Gebruik systeemstandaard ({default})", 38 "global.spellchecker.useDefault": "Gebruik systeemstandaard ({default})",
74 "global.spellchecking.autodetect": "Taal automatisch herkennen", 39 "global.spellchecking.autodetect": "Taal automatisch herkennen",
75 "global.spellchecking.autodetect.short": "Automatisch", 40 "global.spellchecking.autodetect.short": "Automatisch",
76 "global.spellchecking.language": "Taal voor spellingcontrole", 41 "global.spellchecking.language": "Taal voor spellingcontrole",
77 "global.upgradeButton.upgradeToPro": "Upgrade naar Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importeer uw Ferdi 4-services", 44 "import.headline": "Importeer uw Ferdi 4-services",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Verbergen", 52 "infobar.hide": "Verbergen",
89 "infobar.requiredRequestsFailed": "Kan de services en gebruikersinformatie niet laden", 53 "infobar.requiredRequestsFailed": "Kan de services en gebruikersinformatie niet laden",
90 "infobar.servicesUpdated": "Je services zijn bijgewerkt.", 54 "infobar.servicesUpdated": "Je services zijn bijgewerkt.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Een nieuwe update voor Ferdi is beschikbaar.", 55 "infobar.updateAvailable": "Een nieuwe update voor Ferdi is beschikbaar.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "E-mailadres", 57 "invite.email.label": "E-mailadres",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Menubalk automatisch verbergen", 87 "menu.app.autohideMenuBar": "Menubalk automatisch verbergen",
125 "menu.app.checkForUpdates": "Controleer op updates", 88 "menu.app.checkForUpdates": "Controleer op updates",
126 "menu.app.hide": "Verbergen", 89 "menu.app.hide": "Verbergen",
127 "menu.app.hideOthers": "Andere verbergen", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Afsluiten", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Instellingen", 92 "menu.app.settings": "Instellingen",
130 "menu.app.unhide": "Tonen", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Bewerk", 94 "menu.edit": "Bewerk",
132 "menu.edit.copy": "Kopiëren", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Knippen", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Verwijderen", 97 "menu.edit.delete": "Verwijderen",
135 "menu.edit.emojiSymbols": "Emoji's en symbolen", 98 "menu.edit.emojiSymbols": "Emoji's en symbolen",
136 "menu.edit.findInPage": "Zoeken op pagina", 99 "menu.edit.findInPage": "Zoeken op pagina",
137 "menu.edit.paste": "Plakken", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Plakken en stijl overeen laten komen", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Opnieuw doen", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Selecteer alles", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Spraak", 104 "menu.edit.speech": "Spraak",
142 "menu.edit.startDictation": "Beginnen met dicteren", 105 "menu.edit.startDictation": "Beginnen met dicteren",
143 "menu.edit.startSpeaking": "Begin met spreken", 106 "menu.edit.startSpeaking": "Begin met spreken",
144 "menu.edit.stopSpeaking": "Stop met spreken", 107 "menu.edit.stopSpeaking": "Stop met spreken",
145 "menu.edit.undo": "Ongedaan maken", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Bestand", 109 "menu.file": "Bestand",
147 "menu.help": "Hulp", 110 "menu.help": "Help",
148 "menu.help.changelog": "Wijzigingenlogboek", 111 "menu.help.changelog": "Wijzigingenlogboek",
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Meer informatie", 116 "menu.help.learnMore": "Meer informatie",
153 "menu.help.privacy": "Privacyvoorwaarden", 117 "menu.help.privacy": "Privacyvoorwaarden",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Weergave", 128 "menu.view": "Weergave",
165 "menu.view.back": "Terug", 129 "menu.view.back": "Terug",
166 "menu.view.enterFullScreen": "Gebruik volledig scherm",
167 "menu.view.exitFullScreen": "Volledig scherm verlaten",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Ferdi vergrendelen", 131 "menu.view.lockFerdi": "Ferdi vergrendelen",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Herlaad Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Een service opnieuw laden", 134 "menu.view.reloadService": "Een service opnieuw laden",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Werkelijke grootte", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Donkere modus aan/uit", 137 "menu.view.toggleDarkMode": "Donkere modus aan/uit",
176 "menu.view.toggleDevTools": "Ontwikkelaarstools aan/uit", 138 "menu.view.toggleDevTools": "Ontwikkelaarstools aan/uit",
177 "menu.view.toggleFullScreen": "Volledig scherm aan/uit", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Service ontwikkelaarstools aan/uit", 140 "menu.view.toggleServiceDevTools": "Service ontwikkelaarstools aan/uit",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "Inzoomen", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Uitzoomen", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Venster", 144 "menu.window": "Window",
183 "menu.window.close": "Sluiten", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimaliseren", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Werkruimtes", 147 "menu.workspaces": "Werkruimtes",
186 "menu.workspaces.addNewWorkspace": "Voeg nieuwe werkruimte toe...", 148 "menu.workspaces.addNewWorkspace": "Voeg nieuwe werkruimte toe...",
187 "menu.workspaces.closeWorkspaceDrawer": "Werkruimtepagina sluiten", 149 "menu.workspaces.closeWorkspaceDrawer": "Werkruimtepagina sluiten",
@@ -194,11 +156,7 @@
194 "password.noUser": "Geen gebruiker bekend met dat e-mailadres", 156 "password.noUser": "Geen gebruiker bekend met dat e-mailadres",
195 "password.submit.label": "Verzenden", 157 "password.submit.label": "Verzenden",
196 "password.successInfo": "Controleer je e-mail", 158 "password.successInfo": "Controleer je e-mail",
197 "premiumFeature.button.upgradeAccount": "Upgrade Account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Voor altijd reclamevrij",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Installeer diensten van derden", 167 "pricing.features.thirdPartyServices": "Installeer diensten van derden",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Werkruimtes", 169 "pricing.features.workspaces": "Werkruimtes",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Laad {name} opnieuw", 170 "service.crashHandler.action": "Laad {name} opnieuw",
236 "service.crashHandler.autoReload": "Bezig om {name} te herstellen over {seconds} seconden", 171 "service.crashHandler.autoReload": "Bezig om {name} te herstellen over {seconds} seconden",
237 "service.crashHandler.headline": "Oh nee!", 172 "service.crashHandler.headline": "Oh nee!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh nee!", 178 "service.errorHandler.headline": "Oh nee!",
244 "service.errorHandler.message": "Fout", 179 "service.errorHandler.message": "Fout",
245 "service.errorHandler.text": "{name} kon niet geladen worden.", 180 "service.errorHandler.text": "{name} kon niet geladen worden.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "{service} wordt geladen", 181 "service.webviewLoader.loading": "{service} wordt geladen",
252 "services.getStarted": "Begin", 182 "services.getStarted": "Begin",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welkom bij Ferdi", 186 "services.welcome": "Welkom bij Ferdi",
257 "settings.account.account.editButton": "Bewerk account", 187 "settings.account.account.editButton": "Bewerk account",
258 "settings.account.accountType.basic": "Basisaccount",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Update profiel", 190 "settings.account.buttonSave": "Update profiel",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Facturen", 197 "settings.account.headlineInvoices": "Facturen",
270 "settings.account.headlinePassword": "Wijzig wachtwoord", 198 "settings.account.headlinePassword": "Wijzig wachtwoord",
271 "settings.account.headlineProfile": "Update profiel", 199 "settings.account.headlineProfile": "Update profiel",
272 "settings.account.headlineSubscription": "Je abonnement",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Beheer je abonnement",
277 "settings.account.successInfo": "Je wijzigingen zijn opgeslagen", 200 "settings.account.successInfo": "Je wijzigingen zijn opgeslagen",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Probeer opnieuw", 201 "settings.account.tryReloadServices": "Probeer opnieuw",
282 "settings.account.tryReloadUserInfoRequest": "Probeer opnieuw", 202 "settings.account.tryReloadUserInfoRequest": "Probeer opnieuw",
283 "settings.account.upgradeToPro.label": "Upgrade naar Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Kon gebruikersinformatie niet laden", 203 "settings.account.userInfoRequestFailed": "Kon gebruikersinformatie niet laden",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Zet spellingcontrole aan", 227 "settings.app.form.enableSpellchecking": "Zet spellingcontrole aan",
309 "settings.app.form.enableSystemTray": "Pictogram voor Ferdi in systeemvak tonen", 228 "settings.app.form.enableSystemTray": "Pictogram voor Ferdi in systeemvak tonen",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Instellingen", 259 "settings.app.headline": "Instellingen",
341 "settings.app.headlineAdvanced": "Geavanceerd", 260 "settings.app.headlineAdvanced": "Geavanceerd",
342 "settings.app.headlineAppearance": "Weergave", 261 "settings.app.headlineAppearance": "Weergave",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Ferdi spreekt officieel Engels en Duits. Alle andere talen worden beheerd door de community.", 268 "settings.app.languageDisclaimer": "Ferdi spreekt officieel Engels en Duits. Alle andere talen worden beheerd door de community.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Wachtwoord", 270 "settings.app.lockedPassword": "Wachtwoord",
352 "settings.app.lockedPasswordInfo": "Zorg ervoor dat je een wachtwoord instelt dat je niet vergeet.\nAls je dit wachtwoord verliest, moet je Ferdi opnieuw installeren.", 271 "settings.app.lockedPasswordInfo": "Zorg ervoor dat je een wachtwoord instelt dat je niet vergeet.\nAls je dit wachtwoord verliest, moet je Ferdi opnieuw installeren.",
353 "settings.app.restartRequired": "Deze wijziging heeft een herstart nodig", 272 "settings.app.restartRequired": "Deze wijziging heeft een herstart nodig",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Beschikbare services", 301 "settings.recipes.headline": "Beschikbare services",
383 "settings.recipes.missingService": "Mis je een service?", 302 "settings.recipes.missingService": "Mis je een service?",
384 "settings.recipes.mostPopular": "Meest populair",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service succesvol toegevoegd", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service succesvol toegevoegd",
387 "settings.searchService": "Zoek service", 305 "settings.searchService": "Zoek service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Toevoegen {name}", 309 "settings.service.form.addServiceHeadline": "Toevoegen {name}",
392 "settings.service.form.availableServices": "Beschikbare services", 310 "settings.service.form.availableServices": "Beschikbare services",
393 "settings.service.form.customUrl": "Aangepaste server", 311 "settings.service.form.customUrl": "Aangepaste server",
394 "settings.service.form.customUrlPremiumInfo": "Om zelf-gehoste services toe te kunnen voegen, heb je een Ferdi Premium Supporter Account nodig.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade je account",
396 "settings.service.form.customUrlValidationError": "Kon aangepaste server {name} niet valideren.", 312 "settings.service.form.customUrlValidationError": "Kon aangepaste server {name} niet valideren.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Jouw Account opwaarderen",
470 "settings.user.form.accountType.company": "Bedrijf", 385 "settings.user.form.accountType.company": "Bedrijf",
471 "settings.user.form.accountType.individual": "Individueel", 386 "settings.user.form.accountType.individual": "Individueel",
472 "settings.user.form.accountType.label": "Accounttype", 387 "settings.user.form.accountType.label": "Accounttype",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Heb je al een account? Log in!", 431 "signup.link.login": "Heb je al een account? Log in!",
517 "signup.password.label": "Wachtwoord", 432 "signup.password.label": "Wachtwoord",
518 "signup.submit.label": "Account aanmaken", 433 "signup.submit.label": "Account aanmaken",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Annuleer",
531 "subscriptionPopup.buttonDone": "Klaar",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Verwijder service", 435 "tabs.item.deleteService": "Verwijder service",
534 "tabs.item.disableAudio": "Audio uitschakelen", 436 "tabs.item.disableAudio": "Audio uitschakelen",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Meldingen uitschakelen", 438 "tabs.item.disableNotifications": "Meldingen uitschakelen",
536 "tabs.item.disableService": "Service uitschakelen", 439 "tabs.item.disableService": "Service uitschakelen",
537 "tabs.item.edit": "Bewerk", 440 "tabs.item.edit": "Bewerk",
538 "tabs.item.enableAudio": "Audio inschakelen", 441 "tabs.item.enableAudio": "Audio inschakelen",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Meldingen inschakelen", 443 "tabs.item.enableNotification": "Meldingen inschakelen",
540 "tabs.item.enableService": "Service inschakelen", 444 "tabs.item.enableService": "Service inschakelen",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Herladen", 446 "tabs.item.reload": "Herladen",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is niet geldig", 448 "validation.email": "{field} is niet geldig",
543 "validation.minLength": "{field} dient minimaal {length} karakters lang te zijn", 449 "validation.minLength": "{field} dient minimaal {length} karakters lang te zijn",
544 "validation.oneRequired": "Minstens één vereist", 450 "validation.oneRequired": "Minstens één vereist",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Werkruimtes", 462 "workspaceDrawer.headline": "Werkruimtes",
557 "workspaceDrawer.item.contextMenuEdit": "bewerken", 463 "workspaceDrawer.item.contextMenuEdit": "bewerken",
558 "workspaceDrawer.item.noServicesAddedYet": "Nog geen services toegevoegd", 464 "workspaceDrawer.item.noServicesAddedYet": "Nog geen services toegevoegd",
559 "workspaceDrawer.premiumCtaButtonLabel": "Maak je eerste werkruimte",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Premium account heractiveren",
562 "workspaceDrawer.workspaceFeatureInfo": "Ferdi werkruimtes laat je aandacht geven aan wat nu belangrijk is. Maak verschillende sets van services aan en schakel wanneer je wilt tussen de verschillende sets. Jij beslist welke services je wanneer en waar nodig hebt. Zo helpen wij jou je focus te behouden - of net zo gemakkelijk te switchen van werk naar ontspanning.", 465 "workspaceDrawer.workspaceFeatureInfo": "Ferdi werkruimtes laat je aandacht geven aan wat nu belangrijk is. Maak verschillende sets van services aan en schakel wanneer je wilt tussen de verschillende sets. Jij beslist welke services je wanneer en waar nodig hebt. Zo helpen wij jou je focus te behouden - of net zo gemakkelijk te switchen van werk naar ontspanning.",
563 "workspaceDrawer.workspacesSettingsTooltip": "Werkruimte instellingen aanpassen", 466 "workspaceDrawer.workspacesSettingsTooltip": "Werkruimte instellingen aanpassen",
564 "workspaces.switchingIndicator.switchingTo": "Overschakelen naar" 467 "workspaces.switchingIndicator.switchingTo": "Overschakelen naar"
diff --git a/src/i18n/locales/no.json b/src/i18n/locales/no.json
index b5cdb33c8..57a4715c3 100644
--- a/src/i18n/locales/no.json
+++ b/src/i18n/locales/no.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Å nei! Ferdi mistet forbindelsen til {name}.", 12 "connectionLostBanner.message": "Å nei! Ferdi mistet forbindelsen til {name}.",
13 "feature.announcements.changelog.headline": "Endringer i Ferdi {version}", 13 "feature.announcements.changelog.headline": "Endringer i Ferdi {version}",
14 "feature.debugger.title": "Publiser feilsøkingsinformasjon", 14 "feature.debugger.title": "Publiser feilsøkingsinformasjon",
15 "feature.delayApp.headline": "Vennligst kjøp en Ferdi Supporter-lisens for å hoppe over ventingen",
16 "feature.delayApp.text": "Ferdi vil fortsette om {seconds} sekunder.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Få en Ferdi Supporter-lisens",
21 "feature.delayApp.upgrade.actionShort": "Oppgrader kontoen",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Avbryt", 16 "feature.nightlyBuilds.cancel": "Avbryt",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Det oppstod en feil under forsøket på å publisere feilsøkingsinformasjonen. Prøv igjen senere eller se i konsollet for ytterligere informasjon.", 19 "feature.publishDebugInfo.error": "Det oppstod en feil under forsøket på å publisere feilsøkingsinformasjonen. Prøv igjen senere eller se i konsollet for ytterligere informasjon.",
43 "feature.publishDebugInfo.info": "Publisering av din feilsøkingsinformasjon hjelper oss med å finne problemer og feil i Ferdi. Ved å publisere feilsøkingsinformasjonen, godtar du Ferdi feilsøkings-retningslinjer for personvern og tjenestevilkår", 20 "feature.publishDebugInfo.info": "Publisering av din feilsøkingsinformasjon hjelper oss med å finne problemer og feil i Ferdi. Ved å publisere feilsøkingsinformasjonen, godtar du Ferdi feilsøkings-retningslinjer for personvern og tjenestevilkår",
44 "feature.publishDebugInfo.privacy": "Retningslinjer for personvern", 21 "feature.publishDebugInfo.privacy": "Retningslinjer for personvern",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Velg en tjeneste med TAB, ↑ og ↓. Åpne en tjeneste med ENTER.", 26 "feature.quickSwitch.info": "Velg en tjeneste med TAB, ↑ og ↓. Åpne en tjeneste med ENTER.",
50 "feature.quickSwitch.search": "Søk...", 27 "feature.quickSwitch.search": "Søk...",
51 "feature.quickSwitch.title": "Hurtigbytte", 28 "feature.quickSwitch.title": "Hurtigbytte",
52 "feature.serviceLimit.limitReached": "Du har lagt til {amount} av {limit} tjenester som er inkludert i planen din. Vennligst oppgrader kontoen din for å legge til flere tjenester.",
53 "feature.shareFranz.action.email": "Send som e-post", 29 "feature.shareFranz.action.email": "Send som e-post",
54 "feature.shareFranz.action.facebook": "Del på Facebook", 30 "feature.shareFranz.action.facebook": "Del på Facebook",
55 "feature.shareFranz.action.twitter": "Del på Twitter", 31 "feature.shareFranz.action.twitter": "Del på Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Jeg har lagt til {count} tjenester i Ferdi! Få den gratis programvaren for WhatsApp, Messenger, Slack, Skype og andre på www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Jeg har lagt til {count} tjenester i Ferdi! Få den gratis programvaren for WhatsApp, Messenger, Slack, Skype og andre på www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Jeg har lagt til {count} tjenester i Ferdi! Få den gratis programvaren for WhatsApp, Messenger, Slack, Skype og andre på www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Jeg har lagt til {count} tjenester i Ferdi! Få den gratis programvaren for WhatsApp, Messenger, Slack, Skype og andre på www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Fortell vennene og kollegene dine om hvor fantastisk Ferdi er og hjelp oss med å spre ordet.", 35 "feature.shareFranz.text": "Fortell vennene og kollegene dine om hvor fantastisk Ferdi er og hjelp oss med å spre ordet.",
60 "feature.todos.premium.info": "Ferdi gjøremål er tilgjengelig for premium brukere nå!",
61 "feature.todos.premium.rollout": "Alle andre må vente litt lenger.",
62 "feature.todos.premium.upgrade": "Oppgrader din konto",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Kan ikke koble til Ferdi online-tjenester", 36 "global.api.unhealthy": "Kan ikke koble til Ferdi online-tjenester",
71 "global.franzProRequired": "Ferdi Professional kreves",
72 "global.notConnectedToTheInternet": "Du er ikke koblet til Internett.", 37 "global.notConnectedToTheInternet": "Du er ikke koblet til Internett.",
73 "global.spellchecker.useDefault": "Bruk systemstandarden ({default})", 38 "global.spellchecker.useDefault": "Bruk systemstandarden ({default})",
74 "global.spellchecking.autodetect": "Oppdag språk automatisk", 39 "global.spellchecking.autodetect": "Oppdag språk automatisk",
75 "global.spellchecking.autodetect.short": "Automatisk", 40 "global.spellchecking.autodetect.short": "Automatisk",
76 "global.spellchecking.language": "Språk for stavekontroll", 41 "global.spellchecking.language": "Språk for stavekontroll",
77 "global.upgradeButton.upgradeToPro": "Oppgrader til Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importer Ferdi 4-tjenestene dine", 44 "import.headline": "Importer Ferdi 4-tjenestene dine",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Skjul", 52 "infobar.hide": "Skjul",
89 "infobar.requiredRequestsFailed": "Kunne ikke laste tjenestene og brukerinformasjonen", 53 "infobar.requiredRequestsFailed": "Kunne ikke laste tjenestene og brukerinformasjonen",
90 "infobar.servicesUpdated": "Dine tjenester har blitt oppdatert.", 54 "infobar.servicesUpdated": "Dine tjenester har blitt oppdatert.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "En ny oppdatering til Ferdi er tilgjengelig.", 55 "infobar.updateAvailable": "En ny oppdatering til Ferdi er tilgjengelig.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "E-postadresse", 57 "invite.email.label": "E-postadresse",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Skjul menylinjen automatisk", 87 "menu.app.autohideMenuBar": "Skjul menylinjen automatisk",
125 "menu.app.checkForUpdates": "Se etter oppdateringer", 88 "menu.app.checkForUpdates": "Se etter oppdateringer",
126 "menu.app.hide": "Skjul", 89 "menu.app.hide": "Skjul",
127 "menu.app.hideOthers": "Skjul andre", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Avslutt", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Innstillinger", 92 "menu.app.settings": "Innstillinger",
130 "menu.app.unhide": "Vis", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Rediger", 94 "menu.edit": "Rediger",
132 "menu.edit.copy": "Kopier", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Klipp ut", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Slett", 97 "menu.edit.delete": "Slett",
135 "menu.edit.emojiSymbols": "Emoji og symboler", 98 "menu.edit.emojiSymbols": "Emoji og symboler",
136 "menu.edit.findInPage": "Finn på siden", 99 "menu.edit.findInPage": "Finn på siden",
137 "menu.edit.paste": "Lim inn", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Lim inn og tilpass stil", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Gjenta", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Merk alt", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Tale", 104 "menu.edit.speech": "Tale",
142 "menu.edit.startDictation": "Start diktering", 105 "menu.edit.startDictation": "Start diktering",
143 "menu.edit.startSpeaking": "Start diktering", 106 "menu.edit.startSpeaking": "Start diktering",
144 "menu.edit.stopSpeaking": "Stopp diktering", 107 "menu.edit.stopSpeaking": "Stopp diktering",
145 "menu.edit.undo": "Angre", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Fil", 109 "menu.file": "Fil",
147 "menu.help": "Hjelp", 110 "menu.help": "Help",
148 "menu.help.changelog": "Endringslogg", 111 "menu.help.changelog": "Endringslogg",
149 "menu.help.debugInfo": "Kopier feilsøkingsinformasjon", 112 "menu.help.debugInfo": "Kopier feilsøkingsinformasjon",
150 "menu.help.debugInfoCopiedBody": "Din feilsøkingsinformasjon har blitt kopiert til utklippstavlen.", 113 "menu.help.debugInfoCopiedBody": "Din feilsøkingsinformasjon har blitt kopiert til utklippstavlen.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi feilsøkingsinformasjon", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi feilsøkingsinformasjon",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Finn ut mer", 116 "menu.help.learnMore": "Finn ut mer",
153 "menu.help.privacy": "Personvernerklæring", 117 "menu.help.privacy": "Personvernerklæring",
154 "menu.help.publishDebugInfo": "Publiser feilsøkingsinformasjon", 118 "menu.help.publishDebugInfo": "Publiser feilsøkingsinformasjon",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Aktiver gjøremål", 127 "menu.todos.enableTodos": "Aktiver gjøremål",
164 "menu.view": "Vis", 128 "menu.view": "Vis",
165 "menu.view.back": "Tilbake", 129 "menu.view.back": "Tilbake",
166 "menu.view.enterFullScreen": "Gå til fullskjerm",
167 "menu.view.exitFullScreen": "Avslutt fullskjerm",
168 "menu.view.forward": "Videresend", 130 "menu.view.forward": "Videresend",
169 "menu.view.lockFerdi": "Lås Ferdi", 131 "menu.view.lockFerdi": "Lås Ferdi",
170 "menu.view.openQuickSwitch": "Åpne hurtigbytte", 132 "menu.view.openQuickSwitch": "Åpne hurtigbytte",
171 "menu.view.reloadFranz": "Last inn Ferdi på nytt", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Last inn tjenesten på nytt", 134 "menu.view.reloadService": "Last inn tjenesten på nytt",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Faktisk størrelse", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Skru av/på mørkt tema", 137 "menu.view.toggleDarkMode": "Skru av/på mørkt tema",
176 "menu.view.toggleDevTools": "Aktiverer/deaktiverer utviklerverktøy", 138 "menu.view.toggleDevTools": "Aktiverer/deaktiverer utviklerverktøy",
177 "menu.view.toggleFullScreen": " inn/ut av fullskjerm", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Skru av/på tjenestutviklerverktøy", 140 "menu.view.toggleServiceDevTools": "Skru av/på tjenestutviklerverktøy",
179 "menu.view.toggleTodosDevTools": "Aktiverer/deaktiverer gjøremål-utviklerverktøy", 141 "menu.view.toggleTodosDevTools": "Aktiverer/deaktiverer gjøremål-utviklerverktøy",
180 "menu.view.zoomIn": "Zoom inn", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Zoom ut", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Vindu", 144 "menu.window": "Window",
183 "menu.window.close": "Lukk", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimer", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Arbeidsområder", 147 "menu.workspaces": "Arbeidsområder",
186 "menu.workspaces.addNewWorkspace": "Legg til nytt arbeidsområde...", 148 "menu.workspaces.addNewWorkspace": "Legg til nytt arbeidsområde...",
187 "menu.workspaces.closeWorkspaceDrawer": "Lukk skuff for arbeidsområder", 149 "menu.workspaces.closeWorkspaceDrawer": "Lukk skuff for arbeidsområder",
@@ -194,11 +156,7 @@
194 "password.noUser": "Ingen bruker med den e-postadressen ble funnet", 156 "password.noUser": "Ingen bruker med den e-postadressen ble funnet",
195 "password.submit.label": "Send", 157 "password.submit.label": "Send",
196 "password.successInfo": "Vennligst sjekk e-posten din", 158 "password.successInfo": "Vennligst sjekk e-posten din",
197 "premiumFeature.button.upgradeAccount": "Oppgrader kontoen",
198 "pricing.features.accountSync": "Konto synkronisering", 159 "pricing.features.accountSync": "Konto synkronisering",
199 "pricing.features.adFree": "Alltid uten reklame",
200 "pricing.features.appDelays": "Ingen vente-skjermer",
201 "pricing.features.appDelaysEnabled": "Tilfeldig vente-skjermer",
202 "pricing.features.customWebsites": "Legg til egendefinerte nettsteder", 160 "pricing.features.customWebsites": "Legg til egendefinerte nettsteder",
203 "pricing.features.desktopNotifications": "Skrivebord varsler", 161 "pricing.features.desktopNotifications": "Skrivebord varsler",
204 "pricing.features.onPremise": "On-premise og andre selvbetjente tjenester", 162 "pricing.features.onPremise": "On-premise og andre selvbetjente tjenester",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team-administrasjon", 166 "pricing.features.teamManagement": "Team-administrasjon",
209 "pricing.features.thirdPartyServices": "Installer tredjepartstjenester", 167 "pricing.features.thirdPartyServices": "Installer tredjepartstjenester",
210 "pricing.features.unlimitedServices": "Legg til ubegrenset antall tjenester", 168 "pricing.features.unlimitedServices": "Legg til ubegrenset antall tjenester",
211 "pricing.features.upToSixServices": "Legg til opptil 6 tjenester",
212 "pricing.features.upToThreeServices": "Legg til opptil 3 tjenester",
213 "pricing.features.workspaces": "Arbeidsområder", 169 "pricing.features.workspaces": "Arbeidsområder",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal månedlig",
218 "pricing.plan.personal-yearly": "Ferdi Personal årlig",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional månedlig",
221 "pricing.plan.pro-yearly": "Ferdi Professional årlig",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Last {name} inn på nytt", 170 "service.crashHandler.action": "Last {name} inn på nytt",
236 "service.crashHandler.autoReload": "Prøver å automatisk gjenopprette {name} om {seconds} sekunder", 171 "service.crashHandler.autoReload": "Prøver å automatisk gjenopprette {name} om {seconds} sekunder",
237 "service.crashHandler.headline": "Å nei!", 172 "service.crashHandler.headline": "Å nei!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Å nei!", 178 "service.errorHandler.headline": "Å nei!",
244 "service.errorHandler.message": "Feil", 179 "service.errorHandler.message": "Feil",
245 "service.errorHandler.text": "{name} kan ikke lastes.", 180 "service.errorHandler.text": "{name} kan ikke lastes.",
246 "service.restrictedHandler.action": "Oppgrader din konto",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional-funksjonsplan kreves",
248 "service.restrictedHandler.customUrl.text": "Vennligst oppgrader til Ferdi Professional funksjonsplan for å bruke egendefinerte nettadresser og selvbetjente tjenester.",
249 "service.restrictedHandler.serviceLimit.headline": "Du har nådd din tjeneste-grense.",
250 "service.restrictedHandler.serviceLimit.text": "Vennligst oppgrader kontoen din for å brukere mer enn {count} tjenester.",
251 "service.webviewLoader.loading": "Laster inn {service}", 181 "service.webviewLoader.loading": "Laster inn {service}",
252 "services.getStarted": "Kom i gang", 182 "services.getStarted": "Kom i gang",
253 "services.login": "Vennligst logg inn for å bruke Ferdi.", 183 "services.login": "Vennligst logg inn for å bruke Ferdi.",
254 "services.serverInfo": "Eventuelt kan du endre Ferdi-tjeneren ved å klikke på tannhjulet i det nederste venstre hjørne.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Bruk Ferdi uten en konto", 185 "services.serverless": "Bruk Ferdi uten en konto",
256 "services.welcome": "Velkommen til Ferdi", 186 "services.welcome": "Velkommen til Ferdi",
257 "settings.account.account.editButton": "Rediger konto", 187 "settings.account.account.editButton": "Rediger konto",
258 "settings.account.accountType.basic": "Basis-konto",
259 "settings.account.accountType.premium": "Premium Supporter-konto",
260 "settings.account.accountUnavailable": "Kontoen er ikke tilgjengelig", 188 "settings.account.accountUnavailable": "Kontoen er ikke tilgjengelig",
261 "settings.account.accountUnavailableInfo": "Du bruker Ferdi uten en konto. Hvis du ønsker å bruke Ferdi med en konto og hold tjenestene dine synkronisert på tvers av installasjoner, velg en tjener i fanen innstillinger og logg inn.", 189 "settings.account.accountUnavailableInfo": "Du bruker Ferdi uten en konto. Hvis du ønsker å bruke Ferdi med en konto og hold tjenestene dine synkronisert på tvers av installasjoner, velg en tjener i fanen innstillinger og logg inn.",
262 "settings.account.buttonSave": "Oppdater profil", 190 "settings.account.buttonSave": "Oppdater profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Fakturaer", 197 "settings.account.headlineInvoices": "Fakturaer",
270 "settings.account.headlinePassword": "Endre passord", 198 "settings.account.headlinePassword": "Endre passord",
271 "settings.account.headlineProfile": "Oppdater profil", 199 "settings.account.headlineProfile": "Oppdater profil",
272 "settings.account.headlineSubscription": "Abonnementet ditt",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Oppgrader din konto og få full tilgang til Ferdi-opplevelsen",
275 "settings.account.invoiceDownload": "Last ned",
276 "settings.account.manageSubscription.label": "Administrere ditt abonnement",
277 "settings.account.successInfo": "Dine endringer har blitt lagret", 200 "settings.account.successInfo": "Dine endringer har blitt lagret",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Prøv igjen", 201 "settings.account.tryReloadServices": "Prøv igjen",
282 "settings.account.tryReloadUserInfoRequest": "Prøv igjen", 202 "settings.account.tryReloadUserInfoRequest": "Prøv igjen",
283 "settings.account.upgradeToPro.label": "Oppgrader til Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Kunne ikke laste brukerinformasjonen", 203 "settings.account.userInfoRequestFailed": "Kunne ikke laste brukerinformasjonen",
285 "settings.account.yourLicense": "Din Ferdi lisens", 204 "settings.account.yourLicense": "Din Ferdi lisens",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Aktiver stavekontroll", 227 "settings.app.form.enableSpellchecking": "Aktiver stavekontroll",
309 "settings.app.form.enableSystemTray": "Vis Ferdi i systemstatusfeltet", 228 "settings.app.form.enableSystemTray": "Vis Ferdi i systemstatusfeltet",
310 "settings.app.form.enableTodos": "Aktiver Ferdi gjøremål", 229 "settings.app.form.enableTodos": "Aktiver Ferdi gjøremål",
311 "settings.app.form.hibernate": "Aktiver dvalemodus for tjeneste",
312 "settings.app.form.hibernateOnStartup": "Hold tjenestene i dvalemodus ved oppstart", 230 "settings.app.form.hibernateOnStartup": "Hold tjenestene i dvalemodus ved oppstart",
313 "settings.app.form.hibernationStrategy": "Dvalemodus-strategi", 231 "settings.app.form.hibernationStrategy": "Dvalemodus-strategi",
314 "settings.app.form.iconSize": "Ikonstørrelse på tjenester", 232 "settings.app.form.iconSize": "Ikonstørrelse på tjenester",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Aktiver universelt mørkt tema", 255 "settings.app.form.universalDarkMode": "Aktiver universelt mørkt tema",
338 "settings.app.form.useTouchIdToUnlock": "Tillat å bruke TouchID for å låse opp Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Tillat å bruke TouchID for å låse opp Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Innstillinger", 259 "settings.app.headline": "Innstillinger",
341 "settings.app.headlineAdvanced": "Avansert", 260 "settings.app.headlineAdvanced": "Avansert",
342 "settings.app.headlineAppearance": "Utseende", 261 "settings.app.headlineAppearance": "Utseende",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "Som standard vil Ferdi beholde alle tjenestene dine åpne og lastet i bakgrunnen slik at de er klare når du vil bruke dem. Dvalemodus for tjenester vil sette tjenestene dine i dvale etter et angitt tidsrom. Dette er nyttig for å spare minne eller sørge for at tjenestene ikke gjør datamaskinen din treg.", 266 "settings.app.hibernateInfo": "Som standard vil Ferdi beholde alle tjenestene dine åpne og lastet i bakgrunnen slik at de er klare når du vil bruke dem. Dvalemodus for tjenester vil sette tjenestene dine i dvale etter et angitt tidsrom. Dette er nyttig for å spare minne eller sørge for at tjenestene ikke gjør datamaskinen din treg.",
348 "settings.app.inactivityLockInfo": "Minutter med inaktivitet, hvorpå Ferdi burde låses automatisk. Bruk 0 for å deaktivere", 267 "settings.app.inactivityLockInfo": "Minutter med inaktivitet, hvorpå Ferdi burde låses automatisk. Bruk 0 for å deaktivere",
349 "settings.app.languageDisclaimer": "Offisielle oversettelser er engelsk & tysk. Alle andre språk er samfunnsbaserte oversettelser.", 268 "settings.app.languageDisclaimer": "Offisielle oversettelser er engelsk & tysk. Alle andre språk er samfunnsbaserte oversettelser.",
350 "settings.app.lockInfo": "Passordlås lar deg holde meldingene dine beskyttet.\nVed bruk av passord lås, så vil du bli bedt om å skrive inn passordet hver gang du starter Ferdi eller låser Ferdi selv ved hjelp av låsesymbolet i nedre venstre hjørne eller snarveien CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Passord", 270 "settings.app.lockedPassword": "Passord",
352 "settings.app.lockedPasswordInfo": "Vennligst angi et passord du vil huske.\nHvis du mister dette passordet må du installere Ferdi på nytt.", 271 "settings.app.lockedPasswordInfo": "Vennligst angi et passord du vil huske.\nHvis du mister dette passordet må du installere Ferdi på nytt.",
353 "settings.app.restartRequired": "Endringer krever omstart", 272 "settings.app.restartRequired": "Endringer krever omstart",
354 "settings.app.scheduledDNDInfo": "Planlagt ikke-forstyrr lar deg definere en tidsperiode hvor du ikke vil få varsler fra Ferdi.", 273 "settings.app.scheduledDNDInfo": "Planlagt ikke-forstyrr lar deg definere en tidsperiode hvor du ikke vil få varsler fra Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Tider i 24-Hour-Format. Sluttiden kan være før starttiden (f.eks start 17:00, slutt 09:00) for å aktivere ikke-forstyrr over natten.", 274 "settings.app.scheduledDNDTimeInfo": "Tider i 24-Hour-Format. Sluttiden kan være før starttiden (f.eks start 17:00, slutt 09:00) for å aktivere ikke-forstyrr over natten.",
356 "settings.app.sentryInfo": "Å sende telemetridata lar oss finne feil i Ferdi - vi vil ikke sende noen personlig informasjon som dine meldingsdata! Endring av dette valget krever at du starter om Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi bruker Mac'en sin innebygde stavekontroll, for å se etter skrivefeil. Hvis du vil endre språket på stavekontrollen, så kan du gjøre det under Mac'ens system-innstillinger.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi bruker Mac'en sin innebygde stavekontroll, for å se etter skrivefeil. Hvis du vil endre språket på stavekontrollen, så kan du gjøre det under Mac'ens system-innstillinger.",
358 "settings.app.subheadlineCache": "Hurtiglager", 277 "settings.app.subheadlineCache": "Hurtiglager",
359 "settings.app.todoServerInfo": "Denne tjeneren vil ble brukt for \"Ferdi gjøremål\" funksjonen.", 278 "settings.app.todoServerInfo": "Denne tjeneren vil ble brukt for \"Ferdi gjøremål\" funksjonen.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Åpne mappe", 300 "settings.recipes.customService.openFolder": "Åpne mappe",
382 "settings.recipes.headline": "Tilgjengelige tjenester", 301 "settings.recipes.headline": "Tilgjengelige tjenester",
383 "settings.recipes.missingService": "Mangler en tjeneste?", 302 "settings.recipes.missingService": "Mangler en tjeneste?",
384 "settings.recipes.mostPopular": "Mest populære",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Tjenesten ble vellykket lagt til", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Tjenesten ble vellykket lagt til",
387 "settings.searchService": "Søk etter tjeneste", 305 "settings.searchService": "Søk etter tjeneste",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Legg til {name}", 309 "settings.service.form.addServiceHeadline": "Legg til {name}",
392 "settings.service.form.availableServices": "Tilgjengelige tjenester", 310 "settings.service.form.availableServices": "Tilgjengelige tjenester",
393 "settings.service.form.customUrl": "Egendefinert tjener", 311 "settings.service.form.customUrl": "Egendefinert tjener",
394 "settings.service.form.customUrlPremiumInfo": "For å legge til selvbetjente tjenester, trenger du en Ferdi Premium Supporter konto.",
395 "settings.service.form.customUrlUpgradeAccount": "Oppgrader din konto",
396 "settings.service.form.customUrlValidationError": "Kunne ikke validere egendefinert {name} tjener.", 312 "settings.service.form.customUrlValidationError": "Kunne ikke validere egendefinert {name} tjener.",
397 "settings.service.form.darkReaderBrightness": "Lysstyrke for lesing i mørket", 313 "settings.service.form.darkReaderBrightness": "Lysstyrke for lesing i mørket",
398 "settings.service.form.darkReaderContrast": "Kontrast for lesing i mørket", 314 "settings.service.form.darkReaderContrast": "Kontrast for lesing i mørket",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Ferdi team-administrasjon", 378 "settings.team.contentHeadline": "Ferdi team-administrasjon",
463 "settings.team.copy": "Med Franz's Team-administrasjon kan du administrere Franz abonnementer for flere brukere. Vennligst husk at du som har et Franz Premium-abonnement vil ikke ha noen fordeler med deg når du bruker Ferdi: Den eneste grunnen til at du fortsatt har tilgang til teamhåndtering er slik at du kan administrere din eldre Franz team, og for at du ikke skal miste noen funksjoner ved administrasjon av kontoen din.", 379 "settings.team.copy": "Med Franz's Team-administrasjon kan du administrere Franz abonnementer for flere brukere. Vennligst husk at du som har et Franz Premium-abonnement vil ikke ha noen fordeler med deg når du bruker Ferdi: Den eneste grunnen til at du fortsatt har tilgang til teamhåndtering er slik at du kan administrere din eldre Franz team, og for at du ikke skal miste noen funksjoner ved administrasjon av kontoen din.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Du bruker for øyeblikket Franz sine tjenere, derfor har du tilgang til Team-administrasjon.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Administrere ditt team på meetfranz.com", 382 "settings.team.manageAction": "Administrere ditt team på meetfranz.com",
467 "settings.team.teamsUnavailable": "Team er utilgjengelig", 383 "settings.team.teamsUnavailable": "Team er utilgjengelig",
468 "settings.team.teamsUnavailableInfo": "For øyeblikket er Team bare tilgjengelige når du bruker Franz sine tjenere og etter å ha betalt for Franz Professional. Vennligst bytt serveren til https://api.franzinfra.com for å bruke team.", 384 "settings.team.teamsUnavailableInfo": "For øyeblikket er Team bare tilgjengelige når du bruker Franz sine tjenere og etter å ha betalt for Franz Professional. Vennligst bytt serveren til https://api.franzinfra.com for å bruke team.",
469 "settings.team.upgradeAction": "Oppgrader din konto",
470 "settings.user.form.accountType.company": "Firma", 385 "settings.user.form.accountType.company": "Firma",
471 "settings.user.form.accountType.individual": "Individuell", 386 "settings.user.form.accountType.individual": "Individuell",
472 "settings.user.form.accountType.label": "Kontotype", 387 "settings.user.form.accountType.label": "Kontotype",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Har du allerede en konto, logg inn?", 431 "signup.link.login": "Har du allerede en konto, logg inn?",
517 "signup.password.label": "Passord", 432 "signup.password.label": "Passord",
518 "signup.submit.label": "Opprett konto", 433 "signup.submit.label": "Opprett konto",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Se alle alternativer",
522 "subscription.cta.choosePlan": "Velg din funksjonsplan",
523 "subscription.includedProFeatures": "Ferdi Professional funksjonsplanen inkluderer:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per måned",
526 "subscription.interval.perMonthPerUser": "per måned og bruker",
527 "subscription.planItem.upgradeAccount": "Oppgrader din konto",
528 "subscription.teaser.includedFeatures": "Betalte Ferdi-funksjonsplaner inkluderer:",
529 "subscription.teaser.intro": "Ferdi 5 har en lang rekke nye funksjoner, for å styrke kommunikasjonen i hverdagen - batterier inkludert. Sjekk ut våre nye planer og finn ut hvilke som passer deg best!",
530 "subscriptionPopup.buttonCancel": "Avbryt",
531 "subscriptionPopup.buttonDone": "Ferdig",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Slett tjeneste", 435 "tabs.item.deleteService": "Slett tjeneste",
534 "tabs.item.disableAudio": "Deaktiver lyd", 436 "tabs.item.disableAudio": "Deaktiver lyd",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Deaktiver varslinger", 438 "tabs.item.disableNotifications": "Deaktiver varslinger",
536 "tabs.item.disableService": "Deaktiver tjeneste", 439 "tabs.item.disableService": "Deaktiver tjeneste",
537 "tabs.item.edit": "Rediger", 440 "tabs.item.edit": "Rediger",
538 "tabs.item.enableAudio": "Aktiver lyd", 441 "tabs.item.enableAudio": "Aktiver lyd",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Aktiver varsler", 443 "tabs.item.enableNotification": "Aktiver varsler",
540 "tabs.item.enableService": "Aktivere tjenesten", 444 "tabs.item.enableService": "Aktivere tjenesten",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Last inn på nytt", 446 "tabs.item.reload": "Last inn på nytt",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} er ikke gyldig", 448 "validation.email": "{field} er ikke gyldig",
543 "validation.minLength": "{field} bør være minst {length} tegn", 449 "validation.minLength": "{field} bør være minst {length} tegn",
544 "validation.oneRequired": "Minst en er påkrevd", 450 "validation.oneRequired": "Minst en er påkrevd",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Arbeidsområder", 462 "workspaceDrawer.headline": "Arbeidsområder",
557 "workspaceDrawer.item.contextMenuEdit": "rediger", 463 "workspaceDrawer.item.contextMenuEdit": "rediger",
558 "workspaceDrawer.item.noServicesAddedYet": "Ingen tjenester er lagt til ennå", 464 "workspaceDrawer.item.noServicesAddedYet": "Ingen tjenester er lagt til ennå",
559 "workspaceDrawer.premiumCtaButtonLabel": "Opprett ditt første arbeidsområde",
560 "workspaceDrawer.proFeatureBadge": "Premium-funksjon",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reaktiver premium-konto",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi arbeidsområder lar deg fokusere på hva som er viktig akkurat nå. Sett opp forskjellige sett av tjenester, og veksle enkelt mellom dem når som helst.</p><p>Du bestemmer hvilke tjenester du trenger når og hvor, så vi kan hjelpe deg med å bli best i spillet - eller enkelt koble av fra jobb når du måtte trenge det.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi arbeidsområder lar deg fokusere på hva som er viktig akkurat nå. Sett opp forskjellige sett av tjenester, og veksle enkelt mellom dem når som helst.</p><p>Du bestemmer hvilke tjenester du trenger når og hvor, så vi kan hjelpe deg med å bli best i spillet - eller enkelt koble av fra jobb når du måtte trenge det.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Rediger innstillinger for arbeidsområder", 466 "workspaceDrawer.workspacesSettingsTooltip": "Rediger innstillinger for arbeidsområder",
564 "workspaces.switchingIndicator.switchingTo": "Bytter til" 467 "workspaces.switchingIndicator.switchingTo": "Bytter til"
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index f494da546..947c7347c 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "O nie! Ferdi stracił połączenie z {name}.", 12 "connectionLostBanner.message": "O nie! Ferdi stracił połączenie z {name}.",
13 "feature.announcements.changelog.headline": "Co nowego w Ferdi {version}", 13 "feature.announcements.changelog.headline": "Co nowego w Ferdi {version}",
14 "feature.debugger.title": "Opublikuj dane diagnostyczne", 14 "feature.debugger.title": "Opublikuj dane diagnostyczne",
15 "feature.delayApp.headline": "Aby nie czekać, kup licencję Ferdi Supporter",
16 "feature.delayApp.text": "Ferdi będzie kontynuował za {seconds} sekund.",
17 "feature.delayApp.trial.action": "Tak, chcę darmową 14-dniową wersję próbną Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Aktywuj darmową wersję próbną Ferdi Professional",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Uzyskaj licencję Ferdi Supporter",
21 "feature.delayApp.upgrade.actionShort": "Uaktualnij konto",
22 "feature.nightlyBuilds.activate": "Aktywuj", 15 "feature.nightlyBuilds.activate": "Aktywuj",
23 "feature.nightlyBuilds.cancel": "Anuluj", 16 "feature.nightlyBuilds.cancel": "Anuluj",
24 "feature.nightlyBuilds.info": "Kompilacje testowe to wysoce eksperymentalne wersje Ferdi, które mogą zawierać niedopracowane lub nieukończone funkcje. Te kompilacje są przewidziane głównie dla programistów testujących nowe funkcje będące w opracowaniu oraz ostateczne działanie ukończonej kompilacji. Jeśli nie masz pewności co do tej funkcji, zalecamy nie włączać wersji testowych.", 17 "feature.nightlyBuilds.info": "Kompilacje testowe to wysoce eksperymentalne wersje Ferdi, które mogą zawierać niedopracowane lub nieukończone funkcje. Te kompilacje są przewidziane głównie dla programistów testujących nowe funkcje będące w opracowaniu oraz ostateczne działanie ukończonej kompilacji. Jeśli nie masz pewności co do tej funkcji, zalecamy nie włączać wersji testowych.",
25 "feature.nightlyBuilds.title": "Kompilacje testowe", 18 "feature.nightlyBuilds.title": "Kompilacje testowe",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Wystąpił błąd podczas publikowania informacji o debugowaniu. Spróbuj ponownie później lub sprawdź konsolę po więcej informacji.", 19 "feature.publishDebugInfo.error": "Wystąpił błąd podczas publikowania informacji o debugowaniu. Spróbuj ponownie później lub sprawdź konsolę po więcej informacji.",
43 "feature.publishDebugInfo.info": "Publikowanie swoich informacji diagnostycznych pomaga nam znaleźć problemy i błędy w Ferdi. Publikując informacje diagnostyczne, wyrażasz zgodę na Politykę prywatności oraz Warunki użytkowania tej funkcji", 20 "feature.publishDebugInfo.info": "Publikowanie swoich informacji diagnostycznych pomaga nam znaleźć problemy i błędy w Ferdi. Publikując informacje diagnostyczne, wyrażasz zgodę na Politykę prywatności oraz Warunki użytkowania tej funkcji",
44 "feature.publishDebugInfo.privacy": "Polityka prywatności", 21 "feature.publishDebugInfo.privacy": "Polityka prywatności",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Wybierz usługę naciskając TAB, ↑ oraz ↓. Otwórz usługę naciskając ENTER.", 26 "feature.quickSwitch.info": "Wybierz usługę naciskając TAB, ↑ oraz ↓. Otwórz usługę naciskając ENTER.",
50 "feature.quickSwitch.search": "Szukaj...", 27 "feature.quickSwitch.search": "Szukaj...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Wyślij jako e-mail", 29 "feature.shareFranz.action.email": "Wyślij jako e-mail",
54 "feature.shareFranz.action.facebook": "Udostępnij na Facebooku", 30 "feature.shareFranz.action.facebook": "Udostępnij na Facebooku",
55 "feature.shareFranz.action.twitter": "Udostępnij na Twitterze", 31 "feature.shareFranz.action.twitter": "Udostępnij na Twitterze",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Korzystam z {count} usług poprzez Ferdi! Pobierz bezpłatną aplikację do obsługi WhatsApp, Messenger, Slack, Skype i więcej na www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Korzystam z {count} usług poprzez Ferdi! Pobierz bezpłatną aplikację do obsługi WhatsApp, Messenger, Slack, Skype i więcej na www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Korzystam z {count} usług poprzez Ferdi! Pobierz bezpłatną aplikację do obsługi WhatsApp, Messenger, Slack, Skype i więcej na www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Korzystam z {count} usług poprzez Ferdi! Pobierz bezpłatną aplikację do obsługi WhatsApp, Messenger, Slack, Skype i więcej na www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Powiedz znajomym i kolegom o tym, jak odlotowy jest Ferdi i pomóż nam go spopularyzować.", 35 "feature.shareFranz.text": "Powiedz znajomym i kolegom o tym, jak odlotowy jest Ferdi i pomóż nam go spopularyzować.",
60 "feature.todos.premium.info": "Listy zadań Ferdi są już dostępne dla użytkowników premium!",
61 "feature.todos.premium.rollout": "Wszyscy inni będą musieli zaczekać nieco dłużej.",
62 "feature.todos.premium.upgrade": "Ulepsz konto",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Nie można połączyć się z usługami Ferdi online", 36 "global.api.unhealthy": "Nie można połączyć się z usługami Ferdi online",
71 "global.franzProRequired": "Wymagany Ferdi Professional",
72 "global.notConnectedToTheInternet": "Nie masz połączenia z Internetem.", 37 "global.notConnectedToTheInternet": "Nie masz połączenia z Internetem.",
73 "global.spellchecker.useDefault": "Użyj domyślnego dla systemu ({default})", 38 "global.spellchecker.useDefault": "Użyj domyślnego dla systemu ({default})",
74 "global.spellchecking.autodetect": "Automatycznie wykryj język", 39 "global.spellchecking.autodetect": "Automatycznie wykryj język",
75 "global.spellchecking.autodetect.short": "Automatycznie", 40 "global.spellchecking.autodetect.short": "Automatycznie",
76 "global.spellchecking.language": "Język sprawdzania pisowni", 41 "global.spellchecking.language": "Język sprawdzania pisowni",
77 "global.upgradeButton.upgradeToPro": "Ulepsz konto do Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importuj usługi Ferdi 4", 44 "import.headline": "Importuj usługi Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Ukryj", 52 "infobar.hide": "Ukryj",
89 "infobar.requiredRequestsFailed": "Nie można załadować usług i informacji użytkownika", 53 "infobar.requiredRequestsFailed": "Nie można załadować usług i informacji użytkownika",
90 "infobar.servicesUpdated": "Usługi zostały zaktualizowane.", 54 "infobar.servicesUpdated": "Usługi zostały zaktualizowane.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Dostępna jest nowa wersja Ferdia.", 55 "infobar.updateAvailable": "Dostępna jest nowa wersja Ferdia.",
93 "infobox.dismiss": "Odrzuć", 56 "infobox.dismiss": "Odrzuć",
94 "invite.email.label": "Adres email", 57 "invite.email.label": "Adres email",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Automatycznie ukrywaj pasek menu", 87 "menu.app.autohideMenuBar": "Automatycznie ukrywaj pasek menu",
125 "menu.app.checkForUpdates": "Sprawdź aktualizacje", 88 "menu.app.checkForUpdates": "Sprawdź aktualizacje",
126 "menu.app.hide": "Ukryj", 89 "menu.app.hide": "Ukryj",
127 "menu.app.hideOthers": "Ukryj pozoste", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Zakończ", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Ustawienia", 92 "menu.app.settings": "Ustawienia",
130 "menu.app.unhide": "Pokaż więcej", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Edytuj", 94 "menu.edit": "Edytuj",
132 "menu.edit.copy": "Skopiuj", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Wytnij", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Usuń", 97 "menu.edit.delete": "Usuń",
135 "menu.edit.emojiSymbols": "Emoji i symbole", 98 "menu.edit.emojiSymbols": "Emoji i symbole",
136 "menu.edit.findInPage": "Znajdź na stronie", 99 "menu.edit.findInPage": "Znajdź na stronie",
137 "menu.edit.paste": "Wklej", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Wklej i dopasuj styl", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Ponów", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Zaznacz wszystko", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Mowa", 104 "menu.edit.speech": "Mowa",
142 "menu.edit.startDictation": "Zacznij dyktować", 105 "menu.edit.startDictation": "Zacznij dyktować",
143 "menu.edit.startSpeaking": "Zacznij mówić", 106 "menu.edit.startSpeaking": "Zacznij mówić",
144 "menu.edit.stopSpeaking": "Przestań mówić", 107 "menu.edit.stopSpeaking": "Przestań mówić",
145 "menu.edit.undo": "Cofnij", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Plik", 109 "menu.file": "Plik",
147 "menu.help": "Pomoc", 110 "menu.help": "Help",
148 "menu.help.changelog": "Lista zmian", 111 "menu.help.changelog": "Lista zmian",
149 "menu.help.debugInfo": "Kopiuj dane diagnostyczne", 112 "menu.help.debugInfo": "Kopiuj dane diagnostyczne",
150 "menu.help.debugInfoCopiedBody": "Dane diagnostyczne zostały skopiowane do schowka.", 113 "menu.help.debugInfoCopiedBody": "Dane diagnostyczne zostały skopiowane do schowka.",
151 "menu.help.debugInfoCopiedHeadline": "Dane diagnostyczne", 114 "menu.help.debugInfoCopiedHeadline": "Dane diagnostyczne",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Dowiedz się więcej", 116 "menu.help.learnMore": "Dowiedz się więcej",
153 "menu.help.privacy": "Polityka prywatności", 117 "menu.help.privacy": "Polityka prywatności",
154 "menu.help.publishDebugInfo": "Opublikuj dane diagnostyczne", 118 "menu.help.publishDebugInfo": "Opublikuj dane diagnostyczne",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Włącz listę zadań", 127 "menu.todos.enableTodos": "Włącz listę zadań",
164 "menu.view": "Widok", 128 "menu.view": "Widok",
165 "menu.view.back": "Wstecz", 129 "menu.view.back": "Wstecz",
166 "menu.view.enterFullScreen": "Włącz tryb pełnoekranowy",
167 "menu.view.exitFullScreen": "Zakończ tryb pełnoekranowy",
168 "menu.view.forward": "Prześlij dalej", 130 "menu.view.forward": "Prześlij dalej",
169 "menu.view.lockFerdi": "Zablokuj Ferdi", 131 "menu.view.lockFerdi": "Zablokuj Ferdi",
170 "menu.view.openQuickSwitch": "Otwórz Quick Switch", 132 "menu.view.openQuickSwitch": "Otwórz Quick Switch",
171 "menu.view.reloadFranz": "Przeładuj Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Przeładuj usługę", 134 "menu.view.reloadService": "Przeładuj usługę",
173 "menu.view.reloadTodos": "Odśwież Zadania", 135 "menu.view.reloadTodos": "Odśwież Zadania",
174 "menu.view.resetZoom": "Rzeczywisty rozmiar", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Tryb ciemny", 137 "menu.view.toggleDarkMode": "Tryb ciemny",
176 "menu.view.toggleDevTools": "Pokaż narzędzia developerskie", 138 "menu.view.toggleDevTools": "Pokaż narzędzia developerskie",
177 "menu.view.toggleFullScreen": "Przełącz tryb pełnoekranowy", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Włącz narzędzia developerskie usługi", 140 "menu.view.toggleServiceDevTools": "Włącz narzędzia developerskie usługi",
179 "menu.view.toggleTodosDevTools": "Przełącz narzędzia deweloperskie Listy zadań", 141 "menu.view.toggleTodosDevTools": "Przełącz narzędzia deweloperskie Listy zadań",
180 "menu.view.zoomIn": "Powiększ", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Pomniejsz", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Okno", 144 "menu.window": "Window",
183 "menu.window.close": "Zamknij", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Zminimalizuj", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Obszary robocze", 147 "menu.workspaces": "Obszary robocze",
186 "menu.workspaces.addNewWorkspace": "Dodaj nowy obszar roboczy...", 148 "menu.workspaces.addNewWorkspace": "Dodaj nowy obszar roboczy...",
187 "menu.workspaces.closeWorkspaceDrawer": "Zamknij edytor obszaru roboczego", 149 "menu.workspaces.closeWorkspaceDrawer": "Zamknij edytor obszaru roboczego",
@@ -194,11 +156,7 @@
194 "password.noUser": "Nie znaleziono użytkownika z takim adresem email", 156 "password.noUser": "Nie znaleziono użytkownika z takim adresem email",
195 "password.submit.label": "Wyślij", 157 "password.submit.label": "Wyślij",
196 "password.successInfo": "Proszę sprawdzić swój email", 158 "password.successInfo": "Proszę sprawdzić swój email",
197 "premiumFeature.button.upgradeAccount": "Uaktualnij konto",
198 "pricing.features.accountSync": "Synchronizacja konta", 159 "pricing.features.accountSync": "Synchronizacja konta",
199 "pricing.features.adFree": "Na zawsze bez reklam",
200 "pricing.features.appDelays": "Brak wygaszaczy ekranu",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Dodawanie dowolnych stron internetowych", 160 "pricing.features.customWebsites": "Dodawanie dowolnych stron internetowych",
203 "pricing.features.desktopNotifications": "Powiadomienia na pulpicie", 161 "pricing.features.desktopNotifications": "Powiadomienia na pulpicie",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Zarządzanie zespołem", 166 "pricing.features.teamManagement": "Zarządzanie zespołem",
209 "pricing.features.thirdPartyServices": "Instalacja zewnętrznych usług", 167 "pricing.features.thirdPartyServices": "Instalacja zewnętrznych usług",
210 "pricing.features.unlimitedServices": "Dodawanie nielimitowanych usług", 168 "pricing.features.unlimitedServices": "Dodawanie nielimitowanych usług",
211 "pricing.features.upToSixServices": "Dodaj do 6 usług",
212 "pricing.features.upToThreeServices": "Dodaj do 3 usług",
213 "pricing.features.workspaces": "Obszary robocze", 169 "pricing.features.workspaces": "Obszary robocze",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Miesięczny Ferdi Personal",
218 "pricing.plan.personal-yearly": "Roczny Ferdi Personal",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Miesięczny Ferdi Professional",
221 "pricing.plan.pro-yearly": "Roczny Ferdi Professional",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Przeładuj {name}", 170 "service.crashHandler.action": "Przeładuj {name}",
236 "service.crashHandler.autoReload": "Próba automatycznego odnowienia {name} za {seconds} sekund/y", 171 "service.crashHandler.autoReload": "Próba automatycznego odnowienia {name} za {seconds} sekund/y",
237 "service.crashHandler.headline": "O nie!", 172 "service.crashHandler.headline": "O nie!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "O nie!", 178 "service.errorHandler.headline": "O nie!",
244 "service.errorHandler.message": "Błąd", 179 "service.errorHandler.message": "Błąd",
245 "service.errorHandler.text": "Nie udało się załadować {name}.", 180 "service.errorHandler.text": "Nie udało się załadować {name}.",
246 "service.restrictedHandler.action": "Ulepsz konto",
247 "service.restrictedHandler.customUrl.headline": "Wymagany plan Ferdi Professional",
248 "service.restrictedHandler.customUrl.text": "Uaktualnij swój plan do Ferdi Professional, aby używać własnych adresów URL i własnego hostowania usług.",
249 "service.restrictedHandler.serviceLimit.headline": "Osiągnięto limit usług.",
250 "service.restrictedHandler.serviceLimit.text": "Uaktualnij swoje konto, aby używać więcej niż {count} usług.",
251 "service.webviewLoader.loading": "Wczytywanie {service}", 181 "service.webviewLoader.loading": "Wczytywanie {service}",
252 "services.getStarted": "Zacznij", 182 "services.getStarted": "Zacznij",
253 "services.login": "Zaloguj się, aby używać Ferdi.", 183 "services.login": "Zaloguj się, aby używać Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Używaj Ferdi bez konta", 185 "services.serverless": "Używaj Ferdi bez konta",
256 "services.welcome": "Witaj w programie Ferdi", 186 "services.welcome": "Witaj w programie Ferdi",
257 "settings.account.account.editButton": "Modyfikuj konta", 187 "settings.account.account.editButton": "Modyfikuj konta",
258 "settings.account.accountType.basic": "Podstawowe konto",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Konto jest niedostępne", 188 "settings.account.accountUnavailable": "Konto jest niedostępne",
261 "settings.account.accountUnavailableInfo": "Używasz Ferdi bez konta. Jeśli chcesz używać Ferdi z kontem i synchronizować swoje usługi pomiędzy klientami, wybierz serwer w zakładce Ustawienia i zaloguj się.", 189 "settings.account.accountUnavailableInfo": "Używasz Ferdi bez konta. Jeśli chcesz używać Ferdi z kontem i synchronizować swoje usługi pomiędzy klientami, wybierz serwer w zakładce Ustawienia i zaloguj się.",
262 "settings.account.buttonSave": "Uaktualnij profil", 190 "settings.account.buttonSave": "Uaktualnij profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Faktury", 197 "settings.account.headlineInvoices": "Faktury",
270 "settings.account.headlinePassword": "Zmień hasło", 198 "settings.account.headlinePassword": "Zmień hasło",
271 "settings.account.headlineProfile": "Uaktualnij profil", 199 "settings.account.headlineProfile": "Uaktualnij profil",
272 "settings.account.headlineSubscription": "Twoja subskrypcja",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Uaktualnij swoje konto i zyskaj pełną funkcjonalność Ferdi",
275 "settings.account.invoiceDownload": "Pobierz",
276 "settings.account.manageSubscription.label": "Zarządzaj swoimi subskrypcjami",
277 "settings.account.successInfo": "Twoje zmiany zostały zapisane", 200 "settings.account.successInfo": "Twoje zmiany zostały zapisane",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Spróbuj ponownie", 201 "settings.account.tryReloadServices": "Spróbuj ponownie",
282 "settings.account.tryReloadUserInfoRequest": "Spróbuj ponownie", 202 "settings.account.tryReloadUserInfoRequest": "Spróbuj ponownie",
283 "settings.account.upgradeToPro.label": "Ulepsz konto do Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Nie można wczytać informacji o użytkowniku", 203 "settings.account.userInfoRequestFailed": "Nie można wczytać informacji o użytkowniku",
285 "settings.account.yourLicense": "Twoja licencja Ferdi", 204 "settings.account.yourLicense": "Twoja licencja Ferdi",
286 "settings.app.accentColorInfo": "Zdefiniuj kolor akcentu w formacie zgodnym z CSS. (Domyślnie: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Zdefiniuj kolor akcentu w formacie zgodnym z CSS. (Domyślnie: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Włącz sprawdzanie pisowni", 227 "settings.app.form.enableSpellchecking": "Włącz sprawdzanie pisowni",
309 "settings.app.form.enableSystemTray": "Pokaż Ferdia w obszarze powiadomień", 228 "settings.app.form.enableSystemTray": "Pokaż Ferdia w obszarze powiadomień",
310 "settings.app.form.enableTodos": "Włącz Zadania Ferdi", 229 "settings.app.form.enableTodos": "Włącz Zadania Ferdi",
311 "settings.app.form.hibernate": "Włącz hibernację usługi",
312 "settings.app.form.hibernateOnStartup": "Hibernacja usług po starcie systemu", 230 "settings.app.form.hibernateOnStartup": "Hibernacja usług po starcie systemu",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Rozmiar ikony usługi", 232 "settings.app.form.iconSize": "Rozmiar ikony usługi",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Włącz uniwersalny tryb ciemny", 255 "settings.app.form.universalDarkMode": "Włącz uniwersalny tryb ciemny",
338 "settings.app.form.useTouchIdToUnlock": "Zezwól na odblokowanie Ferdi przez Touch ID", 256 "settings.app.form.useTouchIdToUnlock": "Zezwól na odblokowanie Ferdi przez Touch ID",
339 "settings.app.form.useVerticalStyle": "Użyj stylu pionowego", 257 "settings.app.form.useVerticalStyle": "Użyj stylu pionowego",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Ustawienia", 259 "settings.app.headline": "Ustawienia",
341 "settings.app.headlineAdvanced": "Zaawansowane", 260 "settings.app.headlineAdvanced": "Zaawansowane",
342 "settings.app.headlineAppearance": "Wygląd", 261 "settings.app.headlineAppearance": "Wygląd",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Oficjalnymi językami są Angielski i Niemiecki. Inne języki są tłumaczone przez społeczność Ferdi.", 268 "settings.app.languageDisclaimer": "Oficjalnymi językami są Angielski i Niemiecki. Inne języki są tłumaczone przez społeczność Ferdi.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Hasło", 270 "settings.app.lockedPassword": "Hasło",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Zmiany wymagają ponownego uruchomienia", 272 "settings.app.restartRequired": "Zmiany wymagają ponownego uruchomienia",
354 "settings.app.scheduledDNDInfo": "Zaplanowanie trybu Nie przeszkadzać umożliwia określić czas, gdy nie chcesz otrzymywać powiadomień z Ferdi.", 273 "settings.app.scheduledDNDInfo": "Zaplanowanie trybu Nie przeszkadzać umożliwia określić czas, gdy nie chcesz otrzymywać powiadomień z Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Przedział czasu w formacie 24-godzinnym. Czas zakończenia ustawiony przed czasem rozpoczęcia (np. od 17:00 do 9:00) pozwoli na działanie trybu Nie przeszkadzać przez noc.", 274 "settings.app.scheduledDNDTimeInfo": "Przedział czasu w formacie 24-godzinnym. Czas zakończenia ustawiony przed czasem rozpoczęcia (np. od 17:00 do 9:00) pozwoli na działanie trybu Nie przeszkadzać przez noc.",
356 "settings.app.sentryInfo": "Wysyłanie danych telemetrii pozwala nam znaleźć błędy w Ferdi - żadne dane personalne, takie jak dane wiadomości, nie są wysyłane! Zmiana tej opcji wymaga ponownego uruchomienia Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi używa sprawdzania pisowni wbudowanego w Twojego Maca do sprawdzania pomyłek. Aby zmienić języki ze sprawdzaniem pisowni, przejdź do Preferencji systemowych swojego Maca.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi używa sprawdzania pisowni wbudowanego w Twojego Maca do sprawdzania pomyłek. Aby zmienić języki ze sprawdzaniem pisowni, przejdź do Preferencji systemowych swojego Maca.",
358 "settings.app.subheadlineCache": "Pamięć podręczna", 277 "settings.app.subheadlineCache": "Pamięć podręczna",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Otwórz folder", 300 "settings.recipes.customService.openFolder": "Otwórz folder",
382 "settings.recipes.headline": "Dostępne usługi", 301 "settings.recipes.headline": "Dostępne usługi",
383 "settings.recipes.missingService": "Brak usługi?", 302 "settings.recipes.missingService": "Brak usługi?",
384 "settings.recipes.mostPopular": "Najpopularniejsze",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Usługa została dodana pomyślnie", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Usługa została dodana pomyślnie",
387 "settings.searchService": "Wyszukaj usługę", 305 "settings.searchService": "Wyszukaj usługę",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Dodaj {name}", 309 "settings.service.form.addServiceHeadline": "Dodaj {name}",
392 "settings.service.form.availableServices": "Dostępne usługi", 310 "settings.service.form.availableServices": "Dostępne usługi",
393 "settings.service.form.customUrl": "Spersonalizowany serwer", 311 "settings.service.form.customUrl": "Spersonalizowany serwer",
394 "settings.service.form.customUrlPremiumInfo": "Aby dodać usługi hostowane lokalnie, musisz posiadać konto Premium.",
395 "settings.service.form.customUrlUpgradeAccount": "Ulepsz swoje konto",
396 "settings.service.form.customUrlValidationError": "Nie można zweryfikować spersonalizowanego {name} serwera.", 312 "settings.service.form.customUrlValidationError": "Nie można zweryfikować spersonalizowanego {name} serwera.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Zespół", 380 "settings.team.headline": "Zespół",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Ulepsz swoje konto",
470 "settings.user.form.accountType.company": "Firma", 385 "settings.user.form.accountType.company": "Firma",
471 "settings.user.form.accountType.individual": "Prywatne", 386 "settings.user.form.accountType.individual": "Prywatne",
472 "settings.user.form.accountType.label": "Typ konta", 387 "settings.user.form.accountType.label": "Typ konta",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Masz już konto, zalogować się?", 431 "signup.link.login": "Masz już konto, zalogować się?",
517 "signup.password.label": "Hasło", 432 "signup.password.label": "Hasło",
518 "signup.submit.label": "Stwórz konto", 433 "signup.submit.label": "Stwórz konto",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Zobacz wszystkie opcje",
522 "subscription.cta.choosePlan": "Wybierz swój plan",
523 "subscription.includedProFeatures": "Plan Ferdi Professional zawiera:",
524 "subscription.interval.per": "co {interval}",
525 "subscription.interval.perMonth": "co miesiąc",
526 "subscription.interval.perMonthPerUser": "co miesiąc za 1 użytkownika",
527 "subscription.planItem.upgradeAccount": "Ulepsz konto",
528 "subscription.teaser.includedFeatures": "Płatne plany Ferdi zawierają:",
529 "subscription.teaser.intro": "Ferdi 5 zawiera szeroką gamę nowych funkcji pomagających polepszyć Twoją codzienną komunikację - baterie w zestawie. Sprawdź nasze nowe plany i dowiedz się, który najbardziej Ci odpowiada!",
530 "subscriptionPopup.buttonCancel": "Anuluj",
531 "subscriptionPopup.buttonDone": "Zrobione",
532 "tabs.item.confirmDeleteService": "Czy na pewno chcesz usunąć usługę {serviceName}?", 434 "tabs.item.confirmDeleteService": "Czy na pewno chcesz usunąć usługę {serviceName}?",
533 "tabs.item.deleteService": "Usuń usługę", 435 "tabs.item.deleteService": "Usuń usługę",
534 "tabs.item.disableAudio": "Wyłącz dźwięk", 436 "tabs.item.disableAudio": "Wyłącz dźwięk",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Wyłącz powiadomienia", 438 "tabs.item.disableNotifications": "Wyłącz powiadomienia",
536 "tabs.item.disableService": "Wyłącz usługę", 439 "tabs.item.disableService": "Wyłącz usługę",
537 "tabs.item.edit": "Edytuj", 440 "tabs.item.edit": "Edytuj",
538 "tabs.item.enableAudio": "Włącz dźwięk", 441 "tabs.item.enableAudio": "Włącz dźwięk",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Aktywuj powiadomienia", 443 "tabs.item.enableNotification": "Aktywuj powiadomienia",
540 "tabs.item.enableService": "Aktywuj usługę", 444 "tabs.item.enableService": "Aktywuj usługę",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Odśwież", 446 "tabs.item.reload": "Odśwież",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "Pole {field} nie jest poprawne", 448 "validation.email": "Pole {field} nie jest poprawne",
543 "validation.minLength": "Pole {field} powinno składać się z co najmniej {length} znaków", 449 "validation.minLength": "Pole {field} powinno składać się z co najmniej {length} znaków",
544 "validation.oneRequired": "Przynajmniej jeden jest wymagany", 450 "validation.oneRequired": "Przynajmniej jeden jest wymagany",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Obszary robocze", 462 "workspaceDrawer.headline": "Obszary robocze",
557 "workspaceDrawer.item.contextMenuEdit": "Edycja", 463 "workspaceDrawer.item.contextMenuEdit": "Edycja",
558 "workspaceDrawer.item.noServicesAddedYet": "Żadne usługi nie zostały jeszcze dodane", 464 "workspaceDrawer.item.noServicesAddedYet": "Żadne usługi nie zostały jeszcze dodane",
559 "workspaceDrawer.premiumCtaButtonLabel": "Stwórz pierwszy obszar roboczy",
560 "workspaceDrawer.proFeatureBadge": "Funkcje Premium",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Aktywuj ponownie konto premium",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Obszary robocze programu Ferdi pozawala Ci na skupieniu się na tym co ważne w danym momencie. Ustaw różne zestawy usług i przełączaj się między nimi w łatwiejszy sposób w dowolnym momencie. </p><p>Decyduj, które usługi potrzebujesz , więc pomagamy Ci pozostawać na szczycie gry - lub łatwiej wyłączyć się z pracy kiedy tego potrzebujesz.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Obszary robocze programu Ferdi pozawala Ci na skupieniu się na tym co ważne w danym momencie. Ustaw różne zestawy usług i przełączaj się między nimi w łatwiejszy sposób w dowolnym momencie. </p><p>Decyduj, które usługi potrzebujesz , więc pomagamy Ci pozostawać na szczycie gry - lub łatwiej wyłączyć się z pracy kiedy tego potrzebujesz.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edytuj ustawienia obszaru roboczego", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edytuj ustawienia obszaru roboczego",
564 "workspaces.switchingIndicator.switchingTo": "Przełącz do" 467 "workspaces.switchingIndicator.switchingTo": "Przełącz do"
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index faed710d4..15dfc9185 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Ah não! Ferdi perdeu a conexão com {name}.", 12 "connectionLostBanner.message": "Ah não! Ferdi perdeu a conexão com {name}.",
13 "feature.announcements.changelog.headline": "Alterações no Ferdi {version}", 13 "feature.announcements.changelog.headline": "Alterações no Ferdi {version}",
14 "feature.debugger.title": "Publicar informações de depuração", 14 "feature.debugger.title": "Publicar informações de depuração",
15 "feature.delayApp.headline": "Por favor, compre uma Licença de Apoiador Ferdi para pular o tempo de espera",
16 "feature.delayApp.text": "Ferdi continuará em {seconds} segundos.",
17 "feature.delayApp.trial.action": "Sim, Quero a versão experimental do Ferdi Profissional de 14 dias",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Faça parte do grupo de apoiadores do Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Atualize sua conta",
22 "feature.nightlyBuilds.activate": "Ativar", 15 "feature.nightlyBuilds.activate": "Ativar",
23 "feature.nightlyBuilds.cancel": "Cancelar", 16 "feature.nightlyBuilds.cancel": "Cancelar",
24 "feature.nightlyBuilds.info": "Versões noturnas são versões do Ferdi altamente experimentais que podem conter funcionalidades não finalizadas ou não concluídas. Essas compilações noturnas são usadas principalmente por desenvolvedores para testar seus recursos recém-desenvolvidos e como eles irão se comportar na versão final. Se você não sabe o que está fazendo, sugerimos não ativar versões noturnas.", 17 "feature.nightlyBuilds.info": "Versões noturnas são versões do Ferdi altamente experimentais que podem conter funcionalidades não finalizadas ou não concluídas. Essas compilações noturnas são usadas principalmente por desenvolvedores para testar seus recursos recém-desenvolvidos e como eles irão se comportar na versão final. Se você não sabe o que está fazendo, sugerimos não ativar versões noturnas.",
25 "feature.nightlyBuilds.title": "Versões noturnas", 18 "feature.nightlyBuilds.title": "Versões noturnas",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Ocorreu um erro ao tentar publicar as informações de depuração. Por favor, tente novamente mais tarde ou verifique o console para mais informações.", 19 "feature.publishDebugInfo.error": "Ocorreu um erro ao tentar publicar as informações de depuração. Por favor, tente novamente mais tarde ou verifique o console para mais informações.",
43 "feature.publishDebugInfo.info": "Publicar suas informações de depuração nos permite encontrar erros no Ferdi. Para publicar essas informações é necessário aceitar os termos privacidade e serviço do Ferdi Debugger", 20 "feature.publishDebugInfo.info": "Publicar suas informações de depuração nos permite encontrar erros no Ferdi. Para publicar essas informações é necessário aceitar os termos privacidade e serviço do Ferdi Debugger",
44 "feature.publishDebugInfo.privacy": "Política de privacidade", 21 "feature.publishDebugInfo.privacy": "Política de privacidade",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Selecione um serviço com TAB, ↑ e ↓. Abra um serviço com ENTER.", 26 "feature.quickSwitch.info": "Selecione um serviço com TAB, ↑ e ↓. Abra um serviço com ENTER.",
50 "feature.quickSwitch.search": "Buscar...", 27 "feature.quickSwitch.search": "Buscar...",
51 "feature.quickSwitch.title": "Troca Rápida", 28 "feature.quickSwitch.title": "Troca Rápida",
52 "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.",
53 "feature.shareFranz.action.email": "Enviar por e-mail", 29 "feature.shareFranz.action.email": "Enviar por e-mail",
54 "feature.shareFranz.action.facebook": "Compartilhar no Facebook", 30 "feature.shareFranz.action.facebook": "Compartilhar no Facebook",
55 "feature.shareFranz.action.twitter": "Compartilhar no Twitter", 31 "feature.shareFranz.action.twitter": "Compartilhar no Twitter",
@@ -57,25 +33,13 @@
57 "feature.shareFranz.shareText.email": "Eu adicionei {count} serviços ao Ferdi! Adquira o aplicativo gratuito para WhatsApp, Messenger, Slack, Skype e mais em www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Eu adicionei {count} serviços ao Ferdi! Adquira o aplicativo gratuito para WhatsApp, Messenger, Slack, Skype e mais em www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Eu adicionei uma contagem de serviços para o Ferdi! Baixe gratuitamente o aplicativo para WhatsApp, Messenger, Slack, Skype e outros em www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Eu adicionei uma contagem de serviços para o Ferdi! Baixe gratuitamente o aplicativo para WhatsApp, Messenger, Slack, Skype e outros em www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Conte aos seus amigos e colegas o quanto incrível o Ferdi é e nos ajude a espalhar a mensagem.", 35 "feature.shareFranz.text": "Conte aos seus amigos e colegas o quanto incrível o Ferdi é e nos ajude a espalhar a mensagem.",
60 "feature.todos.premium.info": "As Tarefas do Ferdi estão disponíveis para usuários premium!",
61 "feature.todos.premium.rollout": "As outras pessoas terão que esperar um pouquinho mais.",
62 "feature.todos.premium.upgrade": "Atualizar conta",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Não foi possível estabelecer ligação aos serviços do Ferdi", 36 "global.api.unhealthy": "Não foi possível estabelecer ligação aos serviços do Ferdi",
71 "global.franzProRequired": "Ferdi Plano Profissional é necessário",
72 "global.notConnectedToTheInternet": "Você não está conectado à internet.", 37 "global.notConnectedToTheInternet": "Você não está conectado à internet.",
73 "global.spellchecker.useDefault": "Utilizar o Padrão do Sistema ({default})", 38 "global.spellchecker.useDefault": "Utilizar o Padrão do Sistema ({default})",
74 "global.spellchecking.autodetect": "Detectar a idioma automaticamente", 39 "global.spellchecking.autodetect": "Detectar a idioma automaticamente",
75 "global.spellchecking.autodetect.short": "Automático", 40 "global.spellchecking.autodetect.short": "Automático",
76 "global.spellchecking.language": "Idioma para correção ortográfica", 41 "global.spellchecking.language": "Idioma para correção ortográfica",
77 "global.upgradeButton.upgradeToPro": "Atualizar para o Ferdi Profissional", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (para descobrir) ou 'https://developers.whatismybrowser.com/useragents/explore/' (para escolher) o agente de usuário desejado e copie e cole aqui.",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importar os seus serviços do Ferdi 4", 44 "import.headline": "Importar os seus serviços do Ferdi 4",
81 "import.notSupportedHeadline": "Serviços ainda não são suportados pelo Ferdi 5", 45 "import.notSupportedHeadline": "Serviços ainda não são suportados pelo Ferdi 5",
@@ -88,9 +52,8 @@
88 "infobar.hide": "Ocultar", 52 "infobar.hide": "Ocultar",
89 "infobar.requiredRequestsFailed": "Não foi possível carregar os serviços e informações do usuário", 53 "infobar.requiredRequestsFailed": "Não foi possível carregar os serviços e informações do usuário",
90 "infobar.servicesUpdated": "Os seus serviços foram atualizados.", 54 "infobar.servicesUpdated": "Os seus serviços foram atualizados.",
91 "infobar.trialActivated": "A tua versão experimental foi activada com êxito. Boas mensagens!",
92 "infobar.updateAvailable": "Está disponível uma nova atualização para o Ferdi", 55 "infobar.updateAvailable": "Está disponível uma nova atualização para o Ferdi",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Descartar",
94 "invite.email.label": "Endereço de e-mail", 57 "invite.email.label": "Endereço de e-mail",
95 "invite.headline.friends": "Convide 3 amigos ou colegas", 58 "invite.headline.friends": "Convide 3 amigos ou colegas",
96 "invite.name.label": "Nome", 59 "invite.name.label": "Nome",
@@ -124,10 +87,10 @@
124 "menu.app.autohideMenuBar": "Auto-ocultar barra de menu", 87 "menu.app.autohideMenuBar": "Auto-ocultar barra de menu",
125 "menu.app.checkForUpdates": "Procurar atualizações", 88 "menu.app.checkForUpdates": "Procurar atualizações",
126 "menu.app.hide": "Ocultar", 89 "menu.app.hide": "Ocultar",
127 "menu.app.hideOthers": "Ocultar Outros", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Sair", 91 "menu.app.quit": "Sair",
129 "menu.app.settings": "Configurações", 92 "menu.app.settings": "Configurações",
130 "menu.app.unhide": "Mostrar", 93 "menu.app.unhide": "Reexibir",
131 "menu.edit": "Editar", 94 "menu.edit": "Editar",
132 "menu.edit.copy": "Copiar", 95 "menu.edit.copy": "Copiar",
133 "menu.edit.cut": "Cortar", 96 "menu.edit.cut": "Cortar",
@@ -135,7 +98,7 @@
135 "menu.edit.emojiSymbols": "Emojis e Símbolos", 98 "menu.edit.emojiSymbols": "Emojis e Símbolos",
136 "menu.edit.findInPage": "Localizar na página", 99 "menu.edit.findInPage": "Localizar na página",
137 "menu.edit.paste": "Colar", 100 "menu.edit.paste": "Colar",
138 "menu.edit.pasteAndMatchStyle": "Colar e Manter Estilo", 101 "menu.edit.pasteAndMatchStyle": "Colar e Combinar Estilo",
139 "menu.edit.redo": "Refazer", 102 "menu.edit.redo": "Refazer",
140 "menu.edit.selectAll": "Selecionar Tudo", 103 "menu.edit.selectAll": "Selecionar Tudo",
141 "menu.edit.speech": "Voz", 104 "menu.edit.speech": "Voz",
@@ -149,6 +112,7 @@
149 "menu.help.debugInfo": "Copiar a informação Debug", 112 "menu.help.debugInfo": "Copiar a informação Debug",
150 "menu.help.debugInfoCopiedBody": "As Informações de Depuração foram copiadas para a área de transferência.", 113 "menu.help.debugInfoCopiedBody": "As Informações de Depuração foram copiadas para a área de transferência.",
151 "menu.help.debugInfoCopiedHeadline": "Informações de Depuração do Ferdi", 114 "menu.help.debugInfoCopiedHeadline": "Informações de Depuração do Ferdi",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Saber mais", 116 "menu.help.learnMore": "Saber mais",
153 "menu.help.privacy": "Declaração de privacidade", 117 "menu.help.privacy": "Declaração de privacidade",
154 "menu.help.publishDebugInfo": "Publicar Informações de Depuração", 118 "menu.help.publishDebugInfo": "Publicar Informações de Depuração",
@@ -163,22 +127,20 @@
163 "menu.todos.enableTodos": "Ativar Tarefas", 127 "menu.todos.enableTodos": "Ativar Tarefas",
164 "menu.view": "Ver", 128 "menu.view": "Ver",
165 "menu.view.back": "Anterior", 129 "menu.view.back": "Anterior",
166 "menu.view.enterFullScreen": "Ativar Modo Tela Cheia",
167 "menu.view.exitFullScreen": "Sair do Modo Tela Cheia",
168 "menu.view.forward": "Próximo", 130 "menu.view.forward": "Próximo",
169 "menu.view.lockFerdi": "Bloquear Ferdi", 131 "menu.view.lockFerdi": "Bloquear Ferdi",
170 "menu.view.openQuickSwitch": "Abrir Troca Rápida", 132 "menu.view.openQuickSwitch": "Abrir Troca Rápida",
171 "menu.view.reloadFranz": "Recarregar o Ferdi", 133 "menu.view.reloadFerdi": "Recarregar o Ferdi",
172 "menu.view.reloadService": "Recarregar serviço", 134 "menu.view.reloadService": "Recarregar serviço",
173 "menu.view.reloadTodos": "Atualizar Tarefas", 135 "menu.view.reloadTodos": "Atualizar Tarefas",
174 "menu.view.resetZoom": "Tamanho Real", 136 "menu.view.resetZoom": "Tamanho Real",
175 "menu.view.toggleDarkMode": "Alternar para tema escuro", 137 "menu.view.toggleDarkMode": "Alternar para tema escuro",
176 "menu.view.toggleDevTools": "Ativar/Desativar Ferramentas de Desenvolvimento", 138 "menu.view.toggleDevTools": "Ativar/Desativar Ferramentas de Desenvolvimento",
177 "menu.view.toggleFullScreen": "Ativar/Desativar Tela Cheia", 139 "menu.view.toggleFullScreen": "Tela inteira",
178 "menu.view.toggleServiceDevTools": "Ativar/Desativar Ferramentas de Desenvolvimento de Serviços", 140 "menu.view.toggleServiceDevTools": "Ativar/Desativar Ferramentas de Desenvolvimento de Serviços",
179 "menu.view.toggleTodosDevTools": "Ativar Ferramentas de Desenvolvedor das Tarefas", 141 "menu.view.toggleTodosDevTools": "Ativar Ferramentas de Desenvolvedor das Tarefas",
180 "menu.view.zoomIn": "Aumentar", 142 "menu.view.zoomIn": "Ampliar",
181 "menu.view.zoomOut": "Reduzir", 143 "menu.view.zoomOut": "Diminuir o zoom",
182 "menu.window": "Janela", 144 "menu.window": "Janela",
183 "menu.window.close": "Fechar", 145 "menu.window.close": "Fechar",
184 "menu.window.minimize": "Minimizar", 146 "menu.window.minimize": "Minimizar",
@@ -194,11 +156,7 @@
194 "password.noUser": "Não existe nenhuma conta associada a esse endereço de e-mail", 156 "password.noUser": "Não existe nenhuma conta associada a esse endereço de e-mail",
195 "password.submit.label": "Confirmar", 157 "password.submit.label": "Confirmar",
196 "password.successInfo": "Por favor, verifique seu e-mail", 158 "password.successInfo": "Por favor, verifique seu e-mail",
197 "premiumFeature.button.upgradeAccount": "Atualize sua conta",
198 "pricing.features.accountSync": "Sincronização da conta", 159 "pricing.features.accountSync": "Sincronização da conta",
199 "pricing.features.adFree": "Sem publicidade para sempre",
200 "pricing.features.appDelays": "Sem Telas de Espera",
201 "pricing.features.appDelaysEnabled": "Telas de Carregamento Ocasionais",
202 "pricing.features.customWebsites": "Adicionar Websites Personalizados", 160 "pricing.features.customWebsites": "Adicionar Websites Personalizados",
203 "pricing.features.desktopNotifications": "Notificações no ambiente de trabalho", 161 "pricing.features.desktopNotifications": "Notificações no ambiente de trabalho",
204 "pricing.features.onPremise": "On-Premise & Outros serviços hospedados", 162 "pricing.features.onPremise": "On-Premise & Outros serviços hospedados",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Gestão de Equipes", 166 "pricing.features.teamManagement": "Gestão de Equipes",
209 "pricing.features.thirdPartyServices": "Instalar serviços de terceiros", 167 "pricing.features.thirdPartyServices": "Instalar serviços de terceiros",
210 "pricing.features.unlimitedServices": "Instalar serviços ilimitados", 168 "pricing.features.unlimitedServices": "Instalar serviços ilimitados",
211 "pricing.features.upToSixServices": "Adicionar até 6 serviços",
212 "pricing.features.upToThreeServices": "Adicionar até 3 serviços",
213 "pricing.features.workspaces": "Áreas de trabalho", 169 "pricing.features.workspaces": "Áreas de trabalho",
214 "pricing.plan.free": "Ferdi Gratuito",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Pessoal",
217 "pricing.plan.personal-monthly": "Ferdi Pessoal Mensal",
218 "pricing.plan.personal-yearly": "Ferdi Pessoal Anual",
219 "pricing.plan.pro": "Ferdi Profissional",
220 "pricing.plan.pro-monthly": "Ferdi Profissional Mensal",
221 "pricing.plan.pro-yearly": "Ferdi Profissional Anual",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Recarregar {name}", 170 "service.crashHandler.action": "Recarregar {name}",
236 "service.crashHandler.autoReload": "A tentar restaurar automaticamente {name} em {seconds} segundos", 171 "service.crashHandler.autoReload": "A tentar restaurar automaticamente {name} em {seconds} segundos",
237 "service.crashHandler.headline": "Oh não!", 172 "service.crashHandler.headline": "Oh não!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh não!", 178 "service.errorHandler.headline": "Oh não!",
244 "service.errorHandler.message": "Erro", 179 "service.errorHandler.message": "Erro",
245 "service.errorHandler.text": "{name} falhou o carregamento", 180 "service.errorHandler.text": "{name} falhou o carregamento",
246 "service.restrictedHandler.action": "Atualizar conta",
247 "service.restrictedHandler.customUrl.headline": "É necessário um plano Ferdi Profissional",
248 "service.restrictedHandler.customUrl.text": "Por favor adquira um plano Ferdi Profesional para utilizar url's personalizadas e serviços próprios.",
249 "service.restrictedHandler.serviceLimit.headline": "Você atingiu seu limite de serviço.",
250 "service.restrictedHandler.serviceLimit.text": "Por favor, atualize sua conta para usar mais do que {count} serviços.",
251 "service.webviewLoader.loading": "Carregando {service}", 181 "service.webviewLoader.loading": "Carregando {service}",
252 "services.getStarted": "Vamos começar", 182 "services.getStarted": "Vamos começar",
253 "services.login": "Por favor, inicie sua sessão para usar Ferdi.", 183 "services.login": "Por favor, inicie sua sessão para usar Ferdi.",
254 "services.serverInfo": "Opcionalmente, você pode mudar seu servidor Ferdi clicando no ícone de engrenagem localizada no canto inferior esquerdo.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi sem uma conta", 185 "services.serverless": "Use Ferdi sem uma conta",
256 "services.welcome": "Bem-vindo ao Ferdi", 186 "services.welcome": "Bem-vindo ao Ferdi",
257 "settings.account.account.editButton": "Editar conta", 187 "settings.account.account.editButton": "Editar conta",
258 "settings.account.accountType.basic": "Conta Básica",
259 "settings.account.accountType.premium": "Conta Premium",
260 "settings.account.accountUnavailable": "Conta indisponível", 188 "settings.account.accountUnavailable": "Conta indisponível",
261 "settings.account.accountUnavailableInfo": "Você está utilizando Ferdis sem uma conta. Se você deseja usar o Ferdi com uma conta e manter seus serviços atualizados, Por favor selecione um servidor em Configurações seção Servidor.", 189 "settings.account.accountUnavailableInfo": "Você está utilizando Ferdis sem uma conta. Se você deseja usar o Ferdi com uma conta e manter seus serviços atualizados, Por favor selecione um servidor em Configurações seção Servidor.",
262 "settings.account.buttonSave": "Atualizar o perfil", 190 "settings.account.buttonSave": "Atualizar o perfil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Faturas", 197 "settings.account.headlineInvoices": "Faturas",
270 "settings.account.headlinePassword": "Alterar senha", 198 "settings.account.headlinePassword": "Alterar senha",
271 "settings.account.headlineProfile": "Atualizar o perfil", 199 "settings.account.headlineProfile": "Atualizar o perfil",
272 "settings.account.headlineSubscription": "Sua assinatura",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Dê um upgrade na sua conta e tenha uma completa experiência do Ferdi",
275 "settings.account.invoiceDownload": "Transferir",
276 "settings.account.manageSubscription.label": "Gerenciar minhas inscrições",
277 "settings.account.successInfo": "As suas alterações foram efetuadas com sucesso", 200 "settings.account.successInfo": "As suas alterações foram efetuadas com sucesso",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Tentar novamente", 201 "settings.account.tryReloadServices": "Tentar novamente",
282 "settings.account.tryReloadUserInfoRequest": "Tentar novamente", 202 "settings.account.tryReloadUserInfoRequest": "Tentar novamente",
283 "settings.account.upgradeToPro.label": "Atualizar para o Ferdi Profissional",
284 "settings.account.userInfoRequestFailed": "Não é possível carregar a informação do utilizador", 203 "settings.account.userInfoRequestFailed": "Não é possível carregar a informação do utilizador",
285 "settings.account.yourLicense": "Sua lincença Ferdi", 204 "settings.account.yourLicense": "Sua lincença Ferdi",
286 "settings.app.accentColorInfo": "Informe sua cor de destaque em um formato compatível com CSS. (Padrão: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Informe sua cor de destaque em um formato compatível com CSS. (Padrão: {defaultAccentColor})",
@@ -289,7 +208,7 @@
289 "settings.app.buttonSearchForUpdate": "Procurar atualizações", 208 "settings.app.buttonSearchForUpdate": "Procurar atualizações",
290 "settings.app.cacheInfo": "A cache do Ferdi está a usar {size} de espaço em disco.", 209 "settings.app.cacheInfo": "A cache do Ferdi está a usar {size} de espaço em disco.",
291 "settings.app.cacheNotCleared": "Não foi possível limpar o cache", 210 "settings.app.cacheNotCleared": "Não foi possível limpar o cache",
292 "settings.app.closeSettings": "Close settings", 211 "settings.app.closeSettings": "Fechar configurações",
293 "settings.app.currentVersion": "Versão atual", 212 "settings.app.currentVersion": "Versão atual",
294 "settings.app.form.accentColor": "Cor de destaque", 213 "settings.app.form.accentColor": "Cor de destaque",
295 "settings.app.form.adaptableDarkMode": "Sincronizar o modo escuro com a configuração de modo escuro do meu SO", 214 "settings.app.form.adaptableDarkMode": "Sincronizar o modo escuro com a configuração de modo escuro do meu SO",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Ativar verificação ortográfica", 227 "settings.app.form.enableSpellchecking": "Ativar verificação ortográfica",
309 "settings.app.form.enableSystemTray": "Mostrar o Ferdi na barra do sistema", 228 "settings.app.form.enableSystemTray": "Mostrar o Ferdi na barra do sistema",
310 "settings.app.form.enableTodos": "Ativar Tarefas", 229 "settings.app.form.enableTodos": "Ativar Tarefas",
311 "settings.app.form.hibernate": "Ativar hibernação de serviço",
312 "settings.app.form.hibernateOnStartup": "Manter os serviços em hibernação ao inicializar", 230 "settings.app.form.hibernateOnStartup": "Manter os serviços em hibernação ao inicializar",
313 "settings.app.form.hibernationStrategy": "Estratégia de Hibernação", 231 "settings.app.form.hibernationStrategy": "Estratégia de Hibernação",
314 "settings.app.form.iconSize": "Tamanho do ícone", 232 "settings.app.form.iconSize": "Tamanho do ícone",
@@ -319,7 +237,7 @@
319 "settings.app.form.minimizeToSystemTray": "Minimizar o Ferdi para a barra do sistema", 237 "settings.app.form.minimizeToSystemTray": "Minimizar o Ferdi para a barra do sistema",
320 "settings.app.form.navigationBarBehaviour": "Comportamento da barra de navegação", 238 "settings.app.form.navigationBarBehaviour": "Comportamento da barra de navegação",
321 "settings.app.form.notifyTaskBarOnMessage": "Notificar TaskBar/Dock na nova mensagem", 239 "settings.app.form.notifyTaskBarOnMessage": "Notificar TaskBar/Dock na nova mensagem",
322 "settings.app.form.passwordToggle": "Password toggle", 240 "settings.app.form.passwordToggle": "Alternar senhas",
323 "settings.app.form.predefinedTodoServer": "Servidor de Tarefas", 241 "settings.app.form.predefinedTodoServer": "Servidor de Tarefas",
324 "settings.app.form.privateNotifications": "Não mostrar o conteúdo das mensagens nas notificações", 242 "settings.app.form.privateNotifications": "Não mostrar o conteúdo das mensagens nas notificações",
325 "settings.app.form.reloadAfterResume": "Recarregar Ferdi após restabelecer o sistema", 243 "settings.app.form.reloadAfterResume": "Recarregar Ferdi após restabelecer o sistema",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Habilitar modo noturno universal", 255 "settings.app.form.universalDarkMode": "Habilitar modo noturno universal",
338 "settings.app.form.useTouchIdToUnlock": "Permitir usar TouchID para desbloquear Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Permitir usar TouchID para desbloquear Ferdi",
339 "settings.app.form.useVerticalStyle": "Usar estilo vertical", 257 "settings.app.form.useVerticalStyle": "Usar estilo vertical",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Configurações", 259 "settings.app.headline": "Configurações",
341 "settings.app.headlineAdvanced": "Avançado", 260 "settings.app.headlineAdvanced": "Avançado",
342 "settings.app.headlineAppearance": "Aparência", 261 "settings.app.headlineAppearance": "Aparência",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "Por padrão, Ferdi manterá todos seus serviços abertos e carregados, assim eles estarão disponíveis quando você for usá-los. O Serviço de Hibernação irá finalizar seus serviços após um período específico. Isso é útil para evitar consumo excessivo de memória RAM evitando também que seu computador fique lento.", 266 "settings.app.hibernateInfo": "Por padrão, Ferdi manterá todos seus serviços abertos e carregados, assim eles estarão disponíveis quando você for usá-los. O Serviço de Hibernação irá finalizar seus serviços após um período específico. Isso é útil para evitar consumo excessivo de memória RAM evitando também que seu computador fique lento.",
348 "settings.app.inactivityLockInfo": "Minutos de inatividade, após este tempo Ferdi irá automaticamente bloquear. Utilize 0 para desabilitar", 267 "settings.app.inactivityLockInfo": "Minutos de inatividade, após este tempo Ferdi irá automaticamente bloquear. Utilize 0 para desabilitar",
349 "settings.app.languageDisclaimer": "As traduções oficiais são em inglês e alemão. As demais traduções são baseadas na ajuda da comunidade.", 268 "settings.app.languageDisclaimer": "As traduções oficiais são em inglês e alemão. As demais traduções são baseadas na ajuda da comunidade.",
350 "settings.app.lockInfo": "O bloqueio por senha permite a você proteger suas mensagens.\nUsando o bloqueio por senha, será necessário informar sua senha toda veze que o Ferdi for iniciado ou você solicite o bloqueio.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Senha", 270 "settings.app.lockedPassword": "Senha",
352 "settings.app.lockedPasswordInfo": "Tenha certeza que a senha definida será lembrada.\nCaso você esqueça a senha, será necessário reinstalar o Ferdi.", 271 "settings.app.lockedPasswordInfo": "Tenha certeza que a senha definida será lembrada.\nCaso você esqueça a senha, será necessário reinstalar o Ferdi.",
353 "settings.app.restartRequired": "Essa alteração requer uma reinicialização", 272 "settings.app.restartRequired": "Essa alteração requer uma reinicialização",
354 "settings.app.scheduledDNDInfo": "O modo Não perturbe agendado permite definir um período de tempo em que você não deseja receber notificações do Ferdi.", 273 "settings.app.scheduledDNDInfo": "O modo Não perturbe agendado permite definir um período de tempo em que você não deseja receber notificações do Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Horários no formato de 24 horas. O horário de término pode ser anterior ao horário de início (por exemplo, início às 17:00 e término às 09:00) para ativar a opção Não perturbe da noite para o dia.", 274 "settings.app.scheduledDNDTimeInfo": "Horários no formato de 24 horas. O horário de término pode ser anterior ao horário de início (por exemplo, início às 17:00 e término às 09:00) para ativar a opção Não perturbe da noite para o dia.",
356 "settings.app.sentryInfo": "O envio de dados de telemetria nos permite encontrar erros no Ferdi. Não enviaremos nenhuma informação pessoal como seus dados de mensagem! Alterar esta opção requer que você reinicie o Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "O Ferdi utiliza o corretor ortográfico integrado do Mac para verificar se há erros de digitação. Se quiser alterar os idiomas que o corretor ortográfico verifica, você pode fazer isso nas Preferências do Sistema do Mac.", 276 "settings.app.spellCheckerLanguageInfo": "O Ferdi utiliza o corretor ortográfico integrado do Mac para verificar se há erros de digitação. Se quiser alterar os idiomas que o corretor ortográfico verifica, você pode fazer isso nas Preferências do Sistema do Mac.",
358 "settings.app.subheadlineCache": "Memória Cache", 277 "settings.app.subheadlineCache": "Memória Cache",
359 "settings.app.todoServerInfo": "Este servidor será usado para o recurso \"Tarefas do Ferdi\".", 278 "settings.app.todoServerInfo": "Este servidor será usado para o recurso \"Tarefas do Ferdi\".",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Abrir pasta", 300 "settings.recipes.customService.openFolder": "Abrir pasta",
382 "settings.recipes.headline": "Serviços disponíveis", 301 "settings.recipes.headline": "Serviços disponíveis",
383 "settings.recipes.missingService": "Falta um serviço?", 302 "settings.recipes.missingService": "Falta um serviço?",
384 "settings.recipes.mostPopular": "Os mais populares",
385 "settings.recipes.nothingFound": "Desculpe, nenhum serviço corresponde ao seu termo de pesquisa - mas você provavelmente pode adicioná-lo usando a opção \"Site personalizado\". Por favor, note que o site pode mostrar mais serviços que foram adicionados ao Ferdi desde a versão em que você está atualmente. Para obter esses novos serviços, por favor, considere atualizar para uma versão mais recente da Ferdi.", 303 "settings.recipes.nothingFound": "Desculpe, nenhum serviço corresponde ao seu termo de pesquisa - mas você provavelmente pode adicioná-lo usando a opção \"Site personalizado\". Por favor, note que o site pode mostrar mais serviços que foram adicionados ao Ferdi desde a versão em que você está atualmente. Para obter esses novos serviços, por favor, considere atualizar para uma versão mais recente da Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Serviço adicionado com sucesso", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Serviço adicionado com sucesso",
387 "settings.searchService": "Pesquisar serviço", 305 "settings.searchService": "Pesquisar serviço",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Adicionar {name}", 309 "settings.service.form.addServiceHeadline": "Adicionar {name}",
392 "settings.service.form.availableServices": "Serviços disponíveis", 310 "settings.service.form.availableServices": "Serviços disponíveis",
393 "settings.service.form.customUrl": "Servidor personalizado", 311 "settings.service.form.customUrl": "Servidor personalizado",
394 "settings.service.form.customUrlPremiumInfo": "Para adicionar serviços com domínio próprio, é necessário uma Conta Premium no Ferdi.",
395 "settings.service.form.customUrlUpgradeAccount": "Atualizar a conta",
396 "settings.service.form.customUrlValidationError": "Não foi possível validar o servidor {name}.", 312 "settings.service.form.customUrlValidationError": "Não foi possível validar o servidor {name}.",
397 "settings.service.form.darkReaderBrightness": "Brilho do Dark Reader", 313 "settings.service.form.darkReaderBrightness": "Brilho do Dark Reader",
398 "settings.service.form.darkReaderContrast": "Contraste do Dark Reader", 314 "settings.service.form.darkReaderContrast": "Contraste do Dark Reader",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Gerenciamento de Equipe Franz", 378 "settings.team.contentHeadline": "Gerenciamento de Equipe Franz",
463 "settings.team.copy": "O Gerenciamento de Equipes de Franz permite gerenciar assinaturas do Franz para múltiplos usuários. Por favor, entenda que ter uma assinatura Franz Premium não lhe dará nenhuma vantagem em usar o Ferdi. A única razão em manter o acesso ao Gerenciamento de Equipes é permitir o gerenciamento de suas equipes legadas e não perder nenhuma funcionalidade no gerenciamento da sua conta.", 379 "settings.team.copy": "O Gerenciamento de Equipes de Franz permite gerenciar assinaturas do Franz para múltiplos usuários. Por favor, entenda que ter uma assinatura Franz Premium não lhe dará nenhuma vantagem em usar o Ferdi. A única razão em manter o acesso ao Gerenciamento de Equipes é permitir o gerenciamento de suas equipes legadas e não perder nenhuma funcionalidade no gerenciamento da sua conta.",
464 "settings.team.headline": "Equipa", 380 "settings.team.headline": "Equipa",
465 "settings.team.intro": "Atualmente você está utilizando os Servidores do Franz, o que permite a você ter acesso ao Gerenciamento de Equipes.", 381 "settings.team.intro": "Você está atualmente usando os Servidores de Franz, por isso tem acesso ao Gerenciamento de Times.",
466 "settings.team.manageAction": "Gerencie sua Equipe em meetfranz.com", 382 "settings.team.manageAction": "Gerencie sua Equipe em meetfranz.com",
467 "settings.team.teamsUnavailable": "A funcionalidade de Equipes está indisponível", 383 "settings.team.teamsUnavailable": "A funcionalidade de Equipes está indisponível",
468 "settings.team.teamsUnavailableInfo": "Atualmente a funcionalidade de Equipes está disponível apenas utilizando o servidor Franz após adquirir um plano Franz Profissional. Por favor altere o seridor par https://api.franzinfra.com para utilizar esta funcionalidade.", 384 "settings.team.teamsUnavailableInfo": "Atualmente a funcionalidade de Equipes está disponível apenas utilizando o servidor Franz após adquirir um plano Franz Profissional. Por favor altere o seridor par https://api.franzinfra.com para utilizar esta funcionalidade.",
469 "settings.team.upgradeAction": "Atualizar sua conta",
470 "settings.user.form.accountType.company": "Empresa", 385 "settings.user.form.accountType.company": "Empresa",
471 "settings.user.form.accountType.individual": "Indivíduo", 386 "settings.user.form.accountType.individual": "Indivíduo",
472 "settings.user.form.accountType.label": "Tipo de conta", 387 "settings.user.form.accountType.label": "Tipo de conta",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Já tem uma conta, iniciar sessão?", 431 "signup.link.login": "Já tem uma conta, iniciar sessão?",
517 "signup.password.label": "Senha", 432 "signup.password.label": "Senha",
518 "signup.submit.label": "Criar uma conta", 433 "signup.submit.label": "Criar uma conta",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Ver todas as opções",
522 "subscription.cta.choosePlan": "Escolha seu plano",
523 "subscription.includedProFeatures": "O Ferdi Profissional incluí:",
524 "subscription.interval.per": "por {interval}",
525 "subscription.interval.perMonth": "por mês",
526 "subscription.interval.perMonthPerUser": "por mês e por utilizador",
527 "subscription.planItem.upgradeAccount": "Atualizar conta",
528 "subscription.teaser.includedFeatures": "Planos pagos Ferdi incluem:",
529 "subscription.teaser.intro": "O Ferdi 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ê!",
530 "subscriptionPopup.buttonCancel": "Cancelar",
531 "subscriptionPopup.buttonDone": "Concluído",
532 "tabs.item.confirmDeleteService": "Tem certeza de que deseja excluir o serviço {serviceName}?", 434 "tabs.item.confirmDeleteService": "Tem certeza de que deseja excluir o serviço {serviceName}?",
533 "tabs.item.deleteService": "Apagar serviço", 435 "tabs.item.deleteService": "Apagar serviço",
534 "tabs.item.disableAudio": "Desativar áudio", 436 "tabs.item.disableAudio": "Desativar áudio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Desativar notificações", 438 "tabs.item.disableNotifications": "Desativar notificações",
536 "tabs.item.disableService": "Desativar serviço", 439 "tabs.item.disableService": "Desativar serviço",
537 "tabs.item.edit": "Editar", 440 "tabs.item.edit": "Editar",
538 "tabs.item.enableAudio": "Ativar áudio", 441 "tabs.item.enableAudio": "Ativar áudio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Ativar notificações", 443 "tabs.item.enableNotification": "Ativar notificações",
540 "tabs.item.enableService": "Ativar serviço", 444 "tabs.item.enableService": "Ativar serviço",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Recarregar", 446 "tabs.item.reload": "Recarregar",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} não é válido", 448 "validation.email": "{field} não é válido",
543 "validation.minLength": "{field} deveria ter pelo menos {length} caracteres", 449 "validation.minLength": "{field} deveria ter pelo menos {length} caracteres",
544 "validation.oneRequired": "É necessário pelo menos um", 450 "validation.oneRequired": "É necessário pelo menos um",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Áreas de trabalho", 462 "workspaceDrawer.headline": "Áreas de trabalho",
557 "workspaceDrawer.item.contextMenuEdit": "editar", 463 "workspaceDrawer.item.contextMenuEdit": "editar",
558 "workspaceDrawer.item.noServicesAddedYet": "Nenhum serviço foi adicionado", 464 "workspaceDrawer.item.noServicesAddedYet": "Nenhum serviço foi adicionado",
559 "workspaceDrawer.premiumCtaButtonLabel": "Crie sua primeira área de trabalho",
560 "workspaceDrawer.proFeatureBadge": "Vantagem paga oferecida aos assinantes",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reative sua conta paga",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>As áreas de trabalho do Ferdi te ajuda a focar no que realmente é importante agora. Configure diferente cenários para serviços e mude entre eles facilmente em qualquer momento. </p><p>Você decide quais serviços precisa e onde deseja posicioná-los, e então nós iremos te ajudar em aumentar a sua produtividade. Você pode desligar os serviços que não são úteis para você.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>As áreas de trabalho do Ferdi te ajuda a focar no que realmente é importante agora. Configure diferente cenários para serviços e mude entre eles facilmente em qualquer momento. </p><p>Você decide quais serviços precisa e onde deseja posicioná-los, e então nós iremos te ajudar em aumentar a sua produtividade. Você pode desligar os serviços que não são úteis para você.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Editar configurações das áreas de trabalho", 466 "workspaceDrawer.workspacesSettingsTooltip": "Editar configurações das áreas de trabalho",
564 "workspaces.switchingIndicator.switchingTo": "Trocando para" 467 "workspaces.switchingIndicator.switchingTo": "Trocando para"
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index 07c6df438..61f97f3b4 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh não! O Ferdi perdeu a ligação com {name}.", 12 "connectionLostBanner.message": "Oh não! O Ferdi perdeu a ligação com {name}.",
13 "feature.announcements.changelog.headline": "Alterações no Ferdi {version}", 13 "feature.announcements.changelog.headline": "Alterações no Ferdi {version}",
14 "feature.debugger.title": "Publicar informações de depuração", 14 "feature.debugger.title": "Publicar informações de depuração",
15 "feature.delayApp.headline": "Por favor, adquira uma licença de apoiante Ferdi para não ficar à espera",
16 "feature.delayApp.text": "Ferdi continuará em {seconds} segundos.",
17 "feature.delayApp.trial.action": "Sim, eu quero o período de testes gratuito de 14 dias do Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Ativar período de testes gratuito do Ferdi Professional",
19 "feature.delayApp.trial.headline": "Empieza el periodo de prueba de Ferdi Profesional por 14 días y cruza la linea.",
20 "feature.delayApp.upgrade.action": "Adquira uma licença de suporte Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Faça upgrade da conta",
22 "feature.nightlyBuilds.activate": "Activar", 15 "feature.nightlyBuilds.activate": "Activar",
23 "feature.nightlyBuilds.cancel": "Cancelar", 16 "feature.nightlyBuilds.cancel": "Cancelar",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Despromover para Gratuito",
27 "feature.planSelection.cta.stayOnFree": "Continuar em Gratuito",
28 "feature.planSelection.cta.trial": "Iniciar meu teste grátis de 14 dias",
29 "feature.planSelection.cta.upgradePersonal": "Escolha Pessoal",
30 "feature.planSelection.cta.upgradePro": "Escolha Profissional",
31 "feature.planSelection.free.text": "Funcionalidade básica",
32 "feature.planSelection.fullFeatureList": "Comparação completa de todos os planos",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Despromover para Gratuito",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Escolha Pessoal",
35 "feature.planSelection.fullscreen.dialog.message": "Você está prestes a fazer a despromoção para nossa conta gratuita. Você tem certeza? Clique aqui para obter mais serviços e funcionalidade por apenas {currency}{price} por mês.",
36 "feature.planSelection.fullscreen.dialog.title": "Despromover o seu Plano Ferdi",
37 "feature.planSelection.fullscreen.subheadline": "Agora tem de fazer uma escolha. O Ferdi trabalha melhor em nossos planos pessoais e profissionais. Por favor, compare estes planos e escolha o que melhor se adapta a si.",
38 "feature.planSelection.fullscreen.welcome": "Está prestes a escolher, {name}",
39 "feature.planSelection.personal.text": "Mais serviços, sem espera - ideal para uso pessoal.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "Todos os preços são baseados no pagamento anual",
41 "feature.planSelection.pro.text": "Serviços ilimitados e recursos profissionais para si - e para a sua equipa.",
42 "feature.publishDebugInfo.error": "Houve um erro ao tentar publicar as informações de depuração. Por favor, tente novamente mais tarde ou visualize a consola para mais informações.", 19 "feature.publishDebugInfo.error": "Houve um erro ao tentar publicar as informações de depuração. Por favor, tente novamente mais tarde ou visualize a consola para mais informações.",
43 "feature.publishDebugInfo.info": "Publicar as suas informações de depuração ajuda-nos a encontrar problemas e erros no Ferdi. Ao publicar as suas informações de depuração, aceita a política de privacidade e termos de serviço do depurador Ferdi", 20 "feature.publishDebugInfo.info": "Publicar as suas informações de depuração ajuda-nos a encontrar problemas e erros no Ferdi. Ao publicar as suas informações de depuração, aceita a política de privacidade e termos de serviço do depurador Ferdi",
44 "feature.publishDebugInfo.privacy": "Política de Privacidade", 21 "feature.publishDebugInfo.privacy": "Política de Privacidade",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Seleccione um serviço com TAB, ↑ e ↓. Abra um serviço com ENTER.", 26 "feature.quickSwitch.info": "Seleccione um serviço com TAB, ↑ e ↓. Abra um serviço com ENTER.",
50 "feature.quickSwitch.search": "A procurar...", 27 "feature.quickSwitch.search": "A procurar...",
51 "feature.quickSwitch.title": "Troca Rápida", 28 "feature.quickSwitch.title": "Troca Rápida",
52 "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.",
53 "feature.shareFranz.action.email": "Enviar por e-mail", 29 "feature.shareFranz.action.email": "Enviar por e-mail",
54 "feature.shareFranz.action.facebook": "Compartilhar no Facebook", 30 "feature.shareFranz.action.facebook": "Compartilhar no Facebook",
55 "feature.shareFranz.action.twitter": "Compartilhar no Twitter", 31 "feature.shareFranz.action.twitter": "Compartilhar no Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Eu adicionei {count} serviços ao Ferdi! Adquira a aplicação gratuita para WhatsApp, Messenger, Slack, Skype e mais em www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Eu adicionei {count} serviços ao Ferdi! Adquira a aplicação gratuita para WhatsApp, Messenger, Slack, Skype e mais em www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Adicionei {count} serviços no Ferdi! Faça o download da aplicação para WhatsApp, Messenger, Slack, Skype e outros em www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Adicionei {count} serviços no Ferdi! Faça o download da aplicação para WhatsApp, Messenger, Slack, Skype e outros em www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Diga aos seus amigos e colegas o quão incrível é Ferdi e ajude-nos a espalhar a mensagem.", 35 "feature.shareFranz.text": "Diga aos seus amigos e colegas o quão incrível é Ferdi e ajude-nos a espalhar a mensagem.",
60 "feature.todos.premium.info": "As Listas de Tarefas de Ferdi agora estão disponíveis para utilizadores premium!",
61 "feature.todos.premium.rollout": "Todas as outras pessoas terão que esperar um pouco mais.",
62 "feature.todos.premium.upgrade": "Faça upgrade da conta",
63 "feature.trialStatusBar.cta": "Promover agora",
64 "feature.trialStatusBar.expired": "Seu teste grátis Ferdi {plan} expirou, por favor actualize sua conta.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Despromover para Gratuito",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Escolha Pessoal",
67 "feature.trialStatusBar.fullscreen.dialog.message": "Você está prestes a fazer a despromoção para nossa conta gratuita. Você tem certeza? Clique aqui para obter mais serviços e funcionalidade por apenas {currency}{price} por mês.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Despromover o seu Plano Ferdi",
69 "feature.trialStatusBar.restTime": "Seu teste grátis Ferdi {plan} termina em {time}.",
70 "global.api.unhealthy": "Não é possível ligar aos serviços online de Ferdi", 36 "global.api.unhealthy": "Não é possível ligar aos serviços online de Ferdi",
71 "global.franzProRequired": "É necessária uma conta Ferdi Profissional",
72 "global.notConnectedToTheInternet": "Não está ligado à internet.", 37 "global.notConnectedToTheInternet": "Não está ligado à internet.",
73 "global.spellchecker.useDefault": "Use o padrão de sistema ({default})", 38 "global.spellchecker.useDefault": "Use o padrão de sistema ({default})",
74 "global.spellchecking.autodetect": "Detectar idioma automaticamente", 39 "global.spellchecking.autodetect": "Detectar idioma automaticamente",
75 "global.spellchecking.autodetect.short": "Automático", 40 "global.spellchecking.autodetect.short": "Automático",
76 "global.spellchecking.language": "Idioma para corrector ortográfico", 41 "global.spellchecking.language": "Idioma para corrector ortográfico",
77 "global.upgradeButton.upgradeToPro": "Faça upgrade para Ferdi Profissional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importe os seus serviços do Ferdi 4", 44 "import.headline": "Importe os seus serviços do Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Ocultar", 52 "infobar.hide": "Ocultar",
89 "infobar.requiredRequestsFailed": "Não foi possível reiniciar os serviços e informações de utilizador", 53 "infobar.requiredRequestsFailed": "Não foi possível reiniciar os serviços e informações de utilizador",
90 "infobar.servicesUpdated": "Os seus serviços foram atualizados.", 54 "infobar.servicesUpdated": "Os seus serviços foram atualizados.",
91 "infobar.trialActivated": "O seu período de testes foi ativado com sucesso! Boas mensagens!",
92 "infobar.updateAvailable": "Está disponível uma nova atualização de Ferdi.", 55 "infobar.updateAvailable": "Está disponível uma nova atualização de Ferdi.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Endereço de E-mail", 57 "invite.email.label": "Endereço de E-mail",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Ocultar barra de menu automaticamente", 87 "menu.app.autohideMenuBar": "Ocultar barra de menu automaticamente",
125 "menu.app.checkForUpdates": "Procurar atualizações", 88 "menu.app.checkForUpdates": "Procurar atualizações",
126 "menu.app.hide": "Ocultar", 89 "menu.app.hide": "Ocultar",
127 "menu.app.hideOthers": "Ocultar Outros", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Sair", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Configurações", 92 "menu.app.settings": "Configurações",
130 "menu.app.unhide": "Mostrar", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Editar", 94 "menu.edit": "Editar",
132 "menu.edit.copy": "Copiar", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Cortar", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Apagar", 97 "menu.edit.delete": "Apagar",
135 "menu.edit.emojiSymbols": "Emoji & Símbolos", 98 "menu.edit.emojiSymbols": "Emoji & Símbolos",
136 "menu.edit.findInPage": "Localizar na página", 99 "menu.edit.findInPage": "Localizar na página",
137 "menu.edit.paste": "Colar", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Colar com a mesma formatação", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Refazer", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Selecionar Tudo", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Comando de voz", 104 "menu.edit.speech": "Comando de voz",
142 "menu.edit.startDictation": "Iniciar Ditado", 105 "menu.edit.startDictation": "Iniciar Ditado",
143 "menu.edit.startSpeaking": "Começar a falar", 106 "menu.edit.startSpeaking": "Começar a falar",
144 "menu.edit.stopSpeaking": "Parar de Falar", 107 "menu.edit.stopSpeaking": "Parar de Falar",
145 "menu.edit.undo": "Voltar", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Ficheiro", 109 "menu.file": "Ficheiro",
147 "menu.help": "Ajuda", 110 "menu.help": "Help",
148 "menu.help.changelog": "Histórico de alterações", 111 "menu.help.changelog": "Histórico de alterações",
149 "menu.help.debugInfo": "Copiar Informações de Debug", 112 "menu.help.debugInfo": "Copiar Informações de Debug",
150 "menu.help.debugInfoCopiedBody": "As Informações de Debug foram copiadas para a área de transferência.", 113 "menu.help.debugInfoCopiedBody": "As Informações de Debug foram copiadas para a área de transferência.",
151 "menu.help.debugInfoCopiedHeadline": "Informações de Debug de Ferdi", 114 "menu.help.debugInfoCopiedHeadline": "Informações de Debug de Ferdi",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Saiba Mais", 116 "menu.help.learnMore": "Saiba Mais",
153 "menu.help.privacy": "Declaração de Privacidade", 117 "menu.help.privacy": "Declaração de Privacidade",
154 "menu.help.publishDebugInfo": "Publicar informações de debug", 118 "menu.help.publishDebugInfo": "Publicar informações de debug",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Ativar Tarefas", 127 "menu.todos.enableTodos": "Ativar Tarefas",
164 "menu.view": "Visualizar", 128 "menu.view": "Visualizar",
165 "menu.view.back": "Anterior", 129 "menu.view.back": "Anterior",
166 "menu.view.enterFullScreen": "Entrar em Ecrã Completo",
167 "menu.view.exitFullScreen": "Sair do modo ecrã completo",
168 "menu.view.forward": "Seguinte", 130 "menu.view.forward": "Seguinte",
169 "menu.view.lockFerdi": "Bloquear Ferdi", 131 "menu.view.lockFerdi": "Bloquear Ferdi",
170 "menu.view.openQuickSwitch": "Abrir Troca Rápida", 132 "menu.view.openQuickSwitch": "Abrir Troca Rápida",
171 "menu.view.reloadFranz": "Reiniciar Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Reiniciar serviço", 134 "menu.view.reloadService": "Reiniciar serviço",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Tamanho real", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Ativar modo noturno", 137 "menu.view.toggleDarkMode": "Ativar modo noturno",
176 "menu.view.toggleDevTools": "Ativar/desativar ferramentas de programador", 138 "menu.view.toggleDevTools": "Ativar/desativar ferramentas de programador",
177 "menu.view.toggleFullScreen": "Ativar/desativar Ecrâ Completo", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Ativar/desativar ferramentas de programador de serviço", 140 "menu.view.toggleServiceDevTools": "Ativar/desativar ferramentas de programador de serviço",
179 "menu.view.toggleTodosDevTools": "Ativar/desativar Ferramentas de Programador para Tarefas", 141 "menu.view.toggleTodosDevTools": "Ativar/desativar Ferramentas de Programador para Tarefas",
180 "menu.view.zoomIn": "Ampliar", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Reduzir", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Janela", 144 "menu.window": "Window",
183 "menu.window.close": "Fechar", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimizar", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Áreas de trabalho", 147 "menu.workspaces": "Áreas de trabalho",
186 "menu.workspaces.addNewWorkspace": "Adicionar nova área de trabalho...", 148 "menu.workspaces.addNewWorkspace": "Adicionar nova área de trabalho...",
187 "menu.workspaces.closeWorkspaceDrawer": "Fechar barra da área de trabalho", 149 "menu.workspaces.closeWorkspaceDrawer": "Fechar barra da área de trabalho",
@@ -194,11 +156,7 @@
194 "password.noUser": "Não foi encontrado nenhum utilizador com este e-mail", 156 "password.noUser": "Não foi encontrado nenhum utilizador com este e-mail",
195 "password.submit.label": "Enviar", 157 "password.submit.label": "Enviar",
196 "password.successInfo": "Por favor, verifique o seu e-mail", 158 "password.successInfo": "Por favor, verifique o seu e-mail",
197 "premiumFeature.button.upgradeAccount": "Faça upgrade da conta",
198 "pricing.features.accountSync": "Sincronização de conta", 159 "pricing.features.accountSync": "Sincronização de conta",
199 "pricing.features.adFree": "Sem anúncios para sempre",
200 "pricing.features.appDelays": "Sem Ecrãs de Espera",
201 "pricing.features.appDelaysEnabled": "Ecrãs de Espera Ocasional",
202 "pricing.features.customWebsites": "Adicionar Websites Personalizados", 160 "pricing.features.customWebsites": "Adicionar Websites Personalizados",
203 "pricing.features.desktopNotifications": "Notificações no ambiente de trabalho", 161 "pricing.features.desktopNotifications": "Notificações no ambiente de trabalho",
204 "pricing.features.onPremise": "En sitio y otros servicios alojados", 162 "pricing.features.onPremise": "En sitio y otros servicios alojados",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Gestão de Equipa", 166 "pricing.features.teamManagement": "Gestão de Equipa",
209 "pricing.features.thirdPartyServices": "Instalar serviços de terceiros", 167 "pricing.features.thirdPartyServices": "Instalar serviços de terceiros",
210 "pricing.features.unlimitedServices": "Adicionar serviços ilimitados", 168 "pricing.features.unlimitedServices": "Adicionar serviços ilimitados",
211 "pricing.features.upToSixServices": "Adicionar até 6 serviços",
212 "pricing.features.upToThreeServices": "Adicionar até 3 serviços",
213 "pricing.features.workspaces": "Áreas de trabalho", 169 "pricing.features.workspaces": "Áreas de trabalho",
214 "pricing.plan.free": "Ferdi Gratuito",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Pessoal",
217 "pricing.plan.personal-monthly": "Ferdi Pessoal Mensal",
218 "pricing.plan.personal-yearly": "Ferdi Pessoal Anual",
219 "pricing.plan.pro": "Ferdi Profissional",
220 "pricing.plan.pro-monthly": "Ferdi Profissional Mensal",
221 "pricing.plan.pro-yearly": "Ferdi Profissional Anual",
222 "pricing.trial.cta.accept": "Sim, atualizar minha conta para o Ferdi Profissional",
223 "pricing.trial.cta.skip": "Continuar para o Ferdi",
224 "pricing.trial.cta.start": "Começar a usar Ferdi",
225 "pricing.trial.error": "Desculpe, não conseguimos ativar o seu período de testes",
226 "pricing.trial.features.headline": "Incluso no Ferdi Profissional:",
227 "pricing.trial.headline.pro": "Olá {name}, bem-vindo/a ao Ferdi",
228 "pricing.trial.intro.happyMessaging": "Mensagens felizes,",
229 "pricing.trial.intro.specialTreat": "Temos uma oferta especial para si.",
230 "pricing.trial.intro.tryPro": "Aproveite a experiência completa de Ferdi Profissional completamente gratuita durante 14 dias.",
231 "pricing.trial.terms.automaticTrialEnd": "Seu período de testes encerra automaticamente em 14 dias",
232 "pricing.trial.terms.headline": "Sem vínculos",
233 "pricing.trial.terms.noCreditCard": "No necesita tarjeta de crédito",
234 "pricing.trial.terms.trialWorth": "Teste gratuito (normalmente {currency}{price} por mês)",
235 "service.crashHandler.action": "Recarregar {name}", 170 "service.crashHandler.action": "Recarregar {name}",
236 "service.crashHandler.autoReload": "A tentar restabelecer {name} automaticamente em {seconds} segundos", 171 "service.crashHandler.autoReload": "A tentar restabelecer {name} automaticamente em {seconds} segundos",
237 "service.crashHandler.headline": "Oh não!", 172 "service.crashHandler.headline": "Oh não!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh não!", 178 "service.errorHandler.headline": "Oh não!",
244 "service.errorHandler.message": "Erro", 179 "service.errorHandler.message": "Erro",
245 "service.errorHandler.text": "{name} não pôde ser iniciado.", 180 "service.errorHandler.text": "{name} não pôde ser iniciado.",
246 "service.restrictedHandler.action": "Faça upgrade da conta",
247 "service.restrictedHandler.customUrl.headline": "É necessária uma conta Ferdi Profissional",
248 "service.restrictedHandler.customUrl.text": "Por favor, faça o upgrade para o plano Ferdi Professional para usar Urls personalizadas e serviços auto-hospedados.",
249 "service.restrictedHandler.serviceLimit.headline": "Atingiu o seu limite de serviços.",
250 "service.restrictedHandler.serviceLimit.text": "Por favor, faça o upgrade da sua conta para usar mais de {count} serviços.",
251 "service.webviewLoader.loading": "A iniciar {service}", 181 "service.webviewLoader.loading": "A iniciar {service}",
252 "services.getStarted": "Iniciar", 182 "services.getStarted": "Iniciar",
253 "services.login": "Por favor, inicie sua sessão para usar Ferdi.", 183 "services.login": "Por favor, inicie sua sessão para usar Ferdi.",
254 "services.serverInfo": "Opcionalmente, pode mudar o seu servidor Ferdi clicando no ícone da engrenagem no canto inferior esquerdo.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi sem conta", 185 "services.serverless": "Use Ferdi sem conta",
256 "services.welcome": "Bem-vindo ao Ferdi", 186 "services.welcome": "Bem-vindo ao Ferdi",
257 "settings.account.account.editButton": "Editar conta", 187 "settings.account.account.editButton": "Editar conta",
258 "settings.account.accountType.basic": "Conta Básica",
259 "settings.account.accountType.premium": "Conta Apoiante Premium",
260 "settings.account.accountUnavailable": "Conta indisponível", 188 "settings.account.accountUnavailable": "Conta indisponível",
261 "settings.account.accountUnavailableInfo": "Está a usar o Ferdi sem uma conta. Se deseja usar o Ferdi com uma conta e manter os seus serviços sincronizados entre instalações, por favor, selecione um servidor no separador Configurações e faça a autenticação.", 189 "settings.account.accountUnavailableInfo": "Está a usar o Ferdi sem uma conta. Se deseja usar o Ferdi com uma conta e manter os seus serviços sincronizados entre instalações, por favor, selecione um servidor no separador Configurações e faça a autenticação.",
262 "settings.account.buttonSave": "Atualizar perfil", 190 "settings.account.buttonSave": "Atualizar perfil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Recibos", 197 "settings.account.headlineInvoices": "Recibos",
270 "settings.account.headlinePassword": "Mudar palavra-passe", 198 "settings.account.headlinePassword": "Mudar palavra-passe",
271 "settings.account.headlineProfile": "Atualizar perfil", 199 "settings.account.headlineProfile": "Atualizar perfil",
272 "settings.account.headlineSubscription": "A sua subscrição",
273 "settings.account.headlineTrialUpgrade": "Consiga 14 días de prueba gratis de Ferdi Profesional ",
274 "settings.account.headlineUpgradeAccount": "Faça um upgrade à sua conta e usufrua da experiência completa Ferdi",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Gerir assinatura",
277 "settings.account.successInfo": "As suas alterações foram gravadas", 200 "settings.account.successInfo": "As suas alterações foram gravadas",
278 "settings.account.trial": "Prueba Gratis",
279 "settings.account.trialEndsIn": "Su prueba gratis finaliza en {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Por favor actualice su información de facturación para continuar utilizando {license} luego del periodo de prueba.",
281 "settings.account.tryReloadServices": "Tente novamente", 201 "settings.account.tryReloadServices": "Tente novamente",
282 "settings.account.tryReloadUserInfoRequest": "Tente novamente", 202 "settings.account.tryReloadUserInfoRequest": "Tente novamente",
283 "settings.account.upgradeToPro.label": "Faça upgrade para Ferdi Profissional",
284 "settings.account.userInfoRequestFailed": "Não foi possível carregar as informações de utilizador", 203 "settings.account.userInfoRequestFailed": "Não foi possível carregar as informações de utilizador",
285 "settings.account.yourLicense": "A sua licença Ferdi", 204 "settings.account.yourLicense": "A sua licença Ferdi",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Ativar correção ortográfica", 227 "settings.app.form.enableSpellchecking": "Ativar correção ortográfica",
309 "settings.app.form.enableSystemTray": "Mostrar Ferdi na barra de sistema", 228 "settings.app.form.enableSystemTray": "Mostrar Ferdi na barra de sistema",
310 "settings.app.form.enableTodos": "Ativar Tarefas Ferdi", 229 "settings.app.form.enableTodos": "Ativar Tarefas Ferdi",
311 "settings.app.form.hibernate": "Ativar hibernação do serviço",
312 "settings.app.form.hibernateOnStartup": "Manter os serviços em hibernação durante a inicialização", 230 "settings.app.form.hibernateOnStartup": "Manter os serviços em hibernação durante a inicialização",
313 "settings.app.form.hibernationStrategy": "Estratégia de hibernação", 231 "settings.app.form.hibernationStrategy": "Estratégia de hibernação",
314 "settings.app.form.iconSize": "Tamanho de ícone de serviço", 232 "settings.app.form.iconSize": "Tamanho de ícone de serviço",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Ativar o Modo Noturno Universal", 255 "settings.app.form.universalDarkMode": "Ativar o Modo Noturno Universal",
338 "settings.app.form.useTouchIdToUnlock": "Permite usar o TouchID para desbloquear Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Permite usar o TouchID para desbloquear Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Configurações", 259 "settings.app.headline": "Configurações",
341 "settings.app.headlineAdvanced": "Avançado", 260 "settings.app.headlineAdvanced": "Avançado",
342 "settings.app.headlineAppearance": "Aparência", 261 "settings.app.headlineAppearance": "Aparência",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "Por princípio, Ferdi manterá todos os serviços abertos e carregados em segundo plano para que estejam prontos sempre que os quiser utilizar. A hibernação do serviço suspende os serviços após um determinado tempo. Isto é útil para conservar memória RAM ou impedir que os serviços afetem o desempenho do computador.", 266 "settings.app.hibernateInfo": "Por princípio, Ferdi manterá todos os serviços abertos e carregados em segundo plano para que estejam prontos sempre que os quiser utilizar. A hibernação do serviço suspende os serviços após um determinado tempo. Isto é útil para conservar memória RAM ou impedir que os serviços afetem o desempenho do computador.",
348 "settings.app.inactivityLockInfo": "Minutos de inatividade, após os quais Ferdi bloqueará automaticamente. Use 0 para desativar", 267 "settings.app.inactivityLockInfo": "Minutos de inatividade, após os quais Ferdi bloqueará automaticamente. Use 0 para desativar",
349 "settings.app.languageDisclaimer": "As traduções oficiais são Inglês e Alemão. Todas as outras traduções são feitas pela comunidade.", 268 "settings.app.languageDisclaimer": "As traduções oficiais são Inglês e Alemão. Todas as outras traduções são feitas pela comunidade.",
350 "settings.app.lockInfo": "O bloqueio de palavra-passe permite manter as suas mensagens protegidas.\nAo usar o bloqueio de palavra-passe, será solicitado que volte a digitar a sua palavra-passe sempre que reiniciar Ferdi. Pode bloquear Ferdi usando o símbolo de bloquear no canto inferior esquerdo ou o atalho CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Palavra-passe", 270 "settings.app.lockedPassword": "Palavra-passe",
352 "settings.app.lockedPasswordInfo": "Por favor certifique-se de definir uma palavra-passe que se lembre.\nSe perder esta palavra-passe, terá que reinstalar Ferdi.", 271 "settings.app.lockedPasswordInfo": "Por favor certifique-se de definir uma palavra-passe que se lembre.\nSe perder esta palavra-passe, terá que reinstalar Ferdi.",
353 "settings.app.restartRequired": "As mudanças requerem reinício de sistema", 272 "settings.app.restartRequired": "As mudanças requerem reinício de sistema",
354 "settings.app.scheduledDNDInfo": "O Não Incomodar permite definir um período de tempo em que não quer receber notificações.", 273 "settings.app.scheduledDNDInfo": "O Não Incomodar permite definir um período de tempo em que não quer receber notificações.",
355 "settings.app.scheduledDNDTimeInfo": "Horas em formato 24h. Pode definir a hora do fim antes da hora de início (p. ex. início 17:00, fim 09:00) para ativar o modo \"Não incomodar\" durante a noite.", 274 "settings.app.scheduledDNDTimeInfo": "Horas em formato 24h. Pode definir a hora do fim antes da hora de início (p. ex. início 17:00, fim 09:00) para ativar o modo \"Não incomodar\" durante a noite.",
356 "settings.app.sentryInfo": "O envio de dados de telemetria permite que encontremos erros na Ferdi - não será enviada nenhuma informação pessoal como dados da sua mensagem! Mudar esta opção requer o reinício de Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi usa o corretor ortográfico do seu Mac para verificar se há erros ortográficos. Se você quiser alterar os idiomas que o corretor ortográfico verifica, pode fazê-lo nas Preferências do Sistema do Mac.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi usa o corretor ortográfico do seu Mac para verificar se há erros ortográficos. Se você quiser alterar os idiomas que o corretor ortográfico verifica, pode fazê-lo nas Preferências do Sistema do Mac.",
358 "settings.app.subheadlineCache": "Memória cache", 277 "settings.app.subheadlineCache": "Memória cache",
359 "settings.app.todoServerInfo": "Este servidor será usado para a funcionalidade \"Tarefas Ferdi\".", 278 "settings.app.todoServerInfo": "Este servidor será usado para a funcionalidade \"Tarefas Ferdi\".",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Abrir pasta", 300 "settings.recipes.customService.openFolder": "Abrir pasta",
382 "settings.recipes.headline": "Serviços disponíveis", 301 "settings.recipes.headline": "Serviços disponíveis",
383 "settings.recipes.missingService": "Sente falta de algum serviço?", 302 "settings.recipes.missingService": "Sente falta de algum serviço?",
384 "settings.recipes.mostPopular": "Mais populares",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Serviço adicionado com sucesso", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Serviço adicionado com sucesso",
387 "settings.searchService": "Procurar serviço", 305 "settings.searchService": "Procurar serviço",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Adicionar {name}", 309 "settings.service.form.addServiceHeadline": "Adicionar {name}",
392 "settings.service.form.availableServices": "Serviços disponíveis", 310 "settings.service.form.availableServices": "Serviços disponíveis",
393 "settings.service.form.customUrl": "Servidor personalizado", 311 "settings.service.form.customUrl": "Servidor personalizado",
394 "settings.service.form.customUrlPremiumInfo": "Para adicionar serviços auto-hospedados, você precisa de uma conta Apoiador Ferdi Premium.",
395 "settings.service.form.customUrlUpgradeAccount": "Faça upgrade à sua conta",
396 "settings.service.form.customUrlValidationError": "Não foi possível validar servidor personalizado {name}.", 312 "settings.service.form.customUrlValidationError": "Não foi possível validar servidor personalizado {name}.",
397 "settings.service.form.darkReaderBrightness": "Brilho do Leitor Escuro", 313 "settings.service.form.darkReaderBrightness": "Brilho do Leitor Escuro",
398 "settings.service.form.darkReaderContrast": "Contraste do Leitor Noturno", 314 "settings.service.form.darkReaderContrast": "Contraste do Leitor Noturno",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Gestão de Equipas Franz", 378 "settings.team.contentHeadline": "Gestão de Equipas Franz",
463 "settings.team.copy": "A Gestão de Equipas Franz permite gerir as assinaturas Franz para múltiplos utilizadores. Por favor, lembre-se que ter uma assinatura Franz Premium não lhe dará nenhuma vantagem ao usar Ferdi: a única razão pela qual ainda tem acesso à Gestão de Equipas é para que possa gerir as suas equipas antigas e para que não perca nenhuma funcionalidade na gestão da sua conta.", 379 "settings.team.copy": "A Gestão de Equipas Franz permite gerir as assinaturas Franz para múltiplos utilizadores. Por favor, lembre-se que ter uma assinatura Franz Premium não lhe dará nenhuma vantagem ao usar Ferdi: a única razão pela qual ainda tem acesso à Gestão de Equipas é para que possa gerir as suas equipas antigas e para que não perca nenhuma funcionalidade na gestão da sua conta.",
464 "settings.team.headline": "Equipa", 380 "settings.team.headline": "Equipa",
465 "settings.team.intro": "Atualmente não tem acesso ao Gestor de Equipas porque está a usar os Servidores Franz.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Faça a gestão da sua Equipa em meetfranz.com", 382 "settings.team.manageAction": "Faça a gestão da sua Equipa em meetfranz.com",
467 "settings.team.teamsUnavailable": "Equipas não estão disponíveis", 383 "settings.team.teamsUnavailable": "Equipas não estão disponíveis",
468 "settings.team.teamsUnavailableInfo": "De momento, Equipas estão disponíveis apenas quando usar o Servidor Franz e após pagar o Franz Profissional. Por favor, altere o seu servidor para https://api.franzinfra.com para usar equipas.", 384 "settings.team.teamsUnavailableInfo": "De momento, Equipas estão disponíveis apenas quando usar o Servidor Franz e após pagar o Franz Profissional. Por favor, altere o seu servidor para https://api.franzinfra.com para usar equipas.",
469 "settings.team.upgradeAction": "Faça upgrade à sua conta",
470 "settings.user.form.accountType.company": "Empresa", 385 "settings.user.form.accountType.company": "Empresa",
471 "settings.user.form.accountType.individual": "Pessoal", 386 "settings.user.form.accountType.individual": "Pessoal",
472 "settings.user.form.accountType.label": "Tipo de conta", 387 "settings.user.form.accountType.label": "Tipo de conta",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Já tem uma conta, entrar?", 431 "signup.link.login": "Já tem uma conta, entrar?",
517 "signup.password.label": "Palavra-passe", 432 "signup.password.label": "Palavra-passe",
518 "signup.submit.label": "Criar conta", 433 "signup.submit.label": "Criar conta",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Ver todas as opções",
522 "subscription.cta.choosePlan": "Escolha o seu plano",
523 "subscription.includedProFeatures": "O plano Ferdi Professional inclui:",
524 "subscription.interval.per": "por {interval}",
525 "subscription.interval.perMonth": "por mês",
526 "subscription.interval.perMonthPerUser": "por mês e por utilizador",
527 "subscription.planItem.upgradeAccount": "Faça upgrade da conta",
528 "subscription.teaser.includedFeatures": "Planos pagos Ferdi incluem:",
529 "subscription.teaser.intro": "Ferdi 5 vem com uma grande variedade de novas funcionalidades para melhorar a sua comunicação diária - pilhas incluídas. Confira os nossos novos planos e encontre o que melhor serve as suas necessidades!",
530 "subscriptionPopup.buttonCancel": "Cancelar",
531 "subscriptionPopup.buttonDone": "Feito",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Apagar serviço", 435 "tabs.item.deleteService": "Apagar serviço",
534 "tabs.item.disableAudio": "Desativar áudio", 436 "tabs.item.disableAudio": "Desativar áudio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Desativar notificações", 438 "tabs.item.disableNotifications": "Desativar notificações",
536 "tabs.item.disableService": "Desativar serviço", 439 "tabs.item.disableService": "Desativar serviço",
537 "tabs.item.edit": "Editar", 440 "tabs.item.edit": "Editar",
538 "tabs.item.enableAudio": "Ativar áudio", 441 "tabs.item.enableAudio": "Ativar áudio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Ativar notificações", 443 "tabs.item.enableNotification": "Ativar notificações",
540 "tabs.item.enableService": "Ativar serviço", 444 "tabs.item.enableService": "Ativar serviço",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Atualizar", 446 "tabs.item.reload": "Atualizar",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} é inválido", 448 "validation.email": "{field} é inválido",
543 "validation.minLength": "{field} deve ter pelo menos {length} caracteres", 449 "validation.minLength": "{field} deve ter pelo menos {length} caracteres",
544 "validation.oneRequired": "É necessário pelo menos um", 450 "validation.oneRequired": "É necessário pelo menos um",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Áreas de trabalho", 462 "workspaceDrawer.headline": "Áreas de trabalho",
557 "workspaceDrawer.item.contextMenuEdit": "editar", 463 "workspaceDrawer.item.contextMenuEdit": "editar",
558 "workspaceDrawer.item.noServicesAddedYet": "Nenhum serviço adicionado", 464 "workspaceDrawer.item.noServicesAddedYet": "Nenhum serviço adicionado",
559 "workspaceDrawer.premiumCtaButtonLabel": "Crie a sua primeira área de trabalho",
560 "workspaceDrawer.proFeatureBadge": "Funcionalidade Premium",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reative conta premium",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>As áreas de trabalho do Ferdi permitem que se concentre no que realmente é importante. Configure diferentes conjuntos de serviços e mude-os facilmente e a qualquer momento.</p><p>Você decide quais os serviços que precisa e onde colocá-los, para que o possamos ajudar a estar no seu melhor. - Ou desligar do trabalho quando quiser.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>As áreas de trabalho do Ferdi permitem que se concentre no que realmente é importante. Configure diferentes conjuntos de serviços e mude-os facilmente e a qualquer momento.</p><p>Você decide quais os serviços que precisa e onde colocá-los, para que o possamos ajudar a estar no seu melhor. - Ou desligar do trabalho quando quiser.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Editar configurações das áreas de trabalho", 466 "workspaceDrawer.workspacesSettingsTooltip": "Editar configurações das áreas de trabalho",
564 "workspaces.switchingIndicator.switchingTo": "A mudar para" 467 "workspaces.switchingIndicator.switchingTo": "A mudar para"
diff --git a/src/i18n/locales/ro.json b/src/i18n/locales/ro.json
index b210f3316..f86d2c280 100644
--- a/src/i18n/locales/ro.json
+++ b/src/i18n/locales/ro.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh nu! Ferdi a pierdut conexiunea cu {name}.", 12 "connectionLostBanner.message": "Oh nu! Ferdi a pierdut conexiunea cu {name}.",
13 "feature.announcements.changelog.headline": "Modificări în Ferdi {version}", 13 "feature.announcements.changelog.headline": "Modificări în Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activare", 15 "feature.nightlyBuilds.activate": "Activare",
23 "feature.nightlyBuilds.cancel": "Cancel", 16 "feature.nightlyBuilds.cancel": "Cancel",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Politică de confidențialitate", 21 "feature.publishDebugInfo.privacy": "Politică de confidențialitate",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Căutare...", 27 "feature.quickSwitch.search": "Căutare...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Trimite ca email", 29 "feature.shareFranz.action.email": "Trimite ca email",
54 "feature.shareFranz.action.facebook": "Distribuiți pe Facebook", 30 "feature.shareFranz.action.facebook": "Distribuiți pe Facebook",
55 "feature.shareFranz.action.twitter": "Distribuiți pe Twitter", 31 "feature.shareFranz.action.twitter": "Distribuiți pe Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Am adăugat {count} servicii la Ferdi! Obține aplicația gratuită pentru WhatsApp, Messenger, Slack, Skype și co pe www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Am adăugat {count} servicii la Ferdi! Obține aplicația gratuită pentru WhatsApp, Messenger, Slack, Skype și co pe www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Am adăugat {count} servicii la Ferdi! Obține aplicația gratuită pentru WhatsApp, Messenger, Slack, Skype și co pe www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Am adăugat {count} servicii la Ferdi! Obține aplicația gratuită pentru WhatsApp, Messenger, Slack, Skype și co pe www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Spuneți-le prietenilor și colegilor cât de minunat este Ferdi și ajutați-ne să răspândim cuvântul.", 35 "feature.shareFranz.text": "Spuneți-le prietenilor și colegilor cât de minunat este Ferdi și ajutați-ne să răspândim cuvântul.",
60 "feature.todos.premium.info": "Ferdi Todos este disponibil acum utilizatorilor premium!",
61 "feature.todos.premium.rollout": "Toți ceilalți vor trebui să aștepte puțin mai mult.",
62 "feature.todos.premium.upgrade": "Upgradare cont",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Nu se pot conecta la Ferdi servicii online", 36 "global.api.unhealthy": "Nu se pot conecta la Ferdi servicii online",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "Nu ești conectat la internet.", 37 "global.notConnectedToTheInternet": "Nu ești conectat la internet.",
73 "global.spellchecker.useDefault": "Folosește sistemul implicit ({default})", 38 "global.spellchecker.useDefault": "Folosește sistemul implicit ({default})",
74 "global.spellchecking.autodetect": "Detectează limba automat", 39 "global.spellchecking.autodetect": "Detectează limba automat",
75 "global.spellchecking.autodetect.short": "Automat", 40 "global.spellchecking.autodetect.short": "Automat",
76 "global.spellchecking.language": "Limba de verificare a ortografiei", 41 "global.spellchecking.language": "Limba de verificare a ortografiei",
77 "global.upgradeButton.upgradeToPro": "Upgrade la Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importă serviciile tale Ferdi 4", 44 "import.headline": "Importă serviciile tale Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Hide", 52 "infobar.hide": "Hide",
89 "infobar.requiredRequestsFailed": "Could not load services and user information", 53 "infobar.requiredRequestsFailed": "Could not load services and user information",
90 "infobar.servicesUpdated": "Your services have been updated.", 54 "infobar.servicesUpdated": "Your services have been updated.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "A new update for Ferdi is available.", 55 "infobar.updateAvailable": "A new update for Ferdi is available.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email address", 57 "invite.email.label": "Email address",
@@ -149,6 +112,7 @@
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Learn More", 116 "menu.help.learnMore": "Learn More",
153 "menu.help.privacy": "Privacy Statement", 117 "menu.help.privacy": "Privacy Statement",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,12 +127,10 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Enter Full Screen",
167 "menu.view.exitFullScreen": "Exit Full Screen",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Reload Service", 134 "menu.view.reloadService": "Reload Service",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Actual Size", 136 "menu.view.resetZoom": "Actual Size",
@@ -194,11 +156,7 @@
194 "password.noUser": "No user with that email address was found", 156 "password.noUser": "No user with that email address was found",
195 "password.submit.label": "Submit", 157 "password.submit.label": "Submit",
196 "password.successInfo": "Please check your email", 158 "password.successInfo": "Please check your email",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "Error", 179 "service.errorHandler.message": "Error",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgradare cont",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Get started", 182 "services.getStarted": "Get started",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welcome to Ferdi", 186 "services.welcome": "Welcome to Ferdi",
257 "settings.account.account.editButton": "Edit account", 187 "settings.account.account.editButton": "Edit account",
258 "settings.account.accountType.basic": "Basic Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Update profile", 190 "settings.account.buttonSave": "Update profile",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Invoices", 197 "settings.account.headlineInvoices": "Invoices",
270 "settings.account.headlinePassword": "Change password", 198 "settings.account.headlinePassword": "Change password",
271 "settings.account.headlineProfile": "Update profile", 199 "settings.account.headlineProfile": "Update profile",
272 "settings.account.headlineSubscription": "Your subscription",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Manage your subscription",
277 "settings.account.successInfo": "Your changes have been saved", 200 "settings.account.successInfo": "Your changes have been saved",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Try again", 201 "settings.account.tryReloadServices": "Try again",
282 "settings.account.tryReloadUserInfoRequest": "Try again", 202 "settings.account.tryReloadUserInfoRequest": "Try again",
283 "settings.account.upgradeToPro.label": "Upgrade la Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Could not load user information", 203 "settings.account.userInfoRequestFailed": "Could not load user information",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 228 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Settings", 259 "settings.app.headline": "Settings",
341 "settings.app.headlineAdvanced": "Advanced", 260 "settings.app.headlineAdvanced": "Advanced",
342 "settings.app.headlineAppearance": "Appearance", 261 "settings.app.headlineAppearance": "Appearance",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Changes require restart", 272 "settings.app.restartRequired": "Changes require restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Available services", 301 "settings.recipes.headline": "Available services",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "Most popular",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
387 "settings.searchService": "Search service", 305 "settings.searchService": "Search service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Add {name}", 309 "settings.service.form.addServiceHeadline": "Add {name}",
392 "settings.service.form.availableServices": "Available services", 310 "settings.service.form.availableServices": "Available services",
393 "settings.service.form.customUrl": "Custom server", 311 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Company", 385 "settings.user.form.accountType.company": "Company",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Account type", 387 "settings.user.form.accountType.label": "Account type",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Already have an account, sign in?", 431 "signup.link.login": "Already have an account, sign in?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Create account", 433 "signup.submit.label": "Create account",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgradare cont",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Cancel",
531 "subscriptionPopup.buttonDone": "Done",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Delete service", 435 "tabs.item.deleteService": "Delete service",
534 "tabs.item.disableAudio": "Disable audio", 436 "tabs.item.disableAudio": "Disable audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Disable notifications", 438 "tabs.item.disableNotifications": "Disable notifications",
536 "tabs.item.disableService": "Disable service", 439 "tabs.item.disableService": "Disable service",
537 "tabs.item.edit": "Edit", 440 "tabs.item.edit": "Edit",
538 "tabs.item.enableAudio": "Enable audio", 441 "tabs.item.enableAudio": "Enable audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Enable notifications", 443 "tabs.item.enableNotification": "Enable notifications",
540 "tabs.item.enableService": "Enable service", 444 "tabs.item.enableService": "Enable service",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Reîncărcare", 446 "tabs.item.reload": "Reîncărcare",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index 46faaac56..bb7ed8abe 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "О нет! Ферди потерял связь с {name}.", 12 "connectionLostBanner.message": "О нет! Ферди потерял связь с {name}.",
13 "feature.announcements.changelog.headline": "Изменения в версии Ferdi {version}", 13 "feature.announcements.changelog.headline": "Изменения в версии Ferdi {version}",
14 "feature.debugger.title": "Опубликовать отладочную информацию", 14 "feature.debugger.title": "Опубликовать отладочную информацию",
15 "feature.delayApp.headline": "Пожалуйста приобретите лицензию Ferdi Supporter чтобы убрать ожидание",
16 "feature.delayApp.text": "Ferdi продолжит работу через {seconds} секунд.",
17 "feature.delayApp.trial.action": "Да, я хочу бесплатную 14-дневную триальную версию Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Активировать бесплатную триальную версию Ferdi Professional",
19 "feature.delayApp.trial.headline": "Получить бесплатную 14-дневную триальную версию Ferdi Professional и перейти к следующему полю",
20 "feature.delayApp.upgrade.action": "Получите лицензию поддержки Ferdi",
21 "feature.delayApp.upgrade.actionShort": "Апгрейдить аккаунт",
22 "feature.nightlyBuilds.activate": "Активировать", 15 "feature.nightlyBuilds.activate": "Активировать",
23 "feature.nightlyBuilds.cancel": "Отмена", 16 "feature.nightlyBuilds.cancel": "Отмена",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Выберите сервис с Tab, вверх и вниз. Откройте сервис нажав на ENTER.", 26 "feature.quickSwitch.info": "Выберите сервис с Tab, вверх и вниз. Откройте сервис нажав на ENTER.",
50 "feature.quickSwitch.search": "Поиск...", 27 "feature.quickSwitch.search": "Поиск...",
51 "feature.quickSwitch.title": "Быстрое переключение", 28 "feature.quickSwitch.title": "Быстрое переключение",
52 "feature.serviceLimit.limitReached": "Вы добавили {amount} максимальное {limit} количество сервисов, входящих в ваш план. Пожалуйста, обновите свой план чтобы добавить больше сервисов.",
53 "feature.shareFranz.action.email": "Отправить по email", 29 "feature.shareFranz.action.email": "Отправить по email",
54 "feature.shareFranz.action.facebook": "Поделиться на Facebook", 30 "feature.shareFranz.action.facebook": "Поделиться на Facebook",
55 "feature.shareFranz.action.twitter": "Поделиться в Twitter", 31 "feature.shareFranz.action.twitter": "Поделиться в Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Я добавил {count} сервисов во Ferdi! Теперь доступны такие мессенджеры как WhatsApp, Messenger, Slack, Skype и другие. Полый список вы найдете на www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Я добавил {count} сервисов во Ferdi! Теперь доступны такие мессенджеры как WhatsApp, Messenger, Slack, Skype и другие. Полый список вы найдете на www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Я добавил {count} сервис(ов) в Ferdi! Скачай бесплатную аппку для WhatsApp, Messenger, Slack, Skype и иже на www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Я добавил {count} сервис(ов) в Ferdi! Скачай бесплатную аппку для WhatsApp, Messenger, Slack, Skype и иже на www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Расскажи своим друзьям и коллегам насколько прелестен Ferdi и помоги нам развиться", 35 "feature.shareFranz.text": "Расскажи своим друзьям и коллегам насколько прелестен Ferdi и помоги нам развиться",
60 "feature.todos.premium.info": "Ferdi Todos теперь доступны для премиум пользователей!",
61 "feature.todos.premium.rollout": "Все остальные должны будут ждать немного дольше.",
62 "feature.todos.premium.upgrade": "Повысить уровень учетной записи",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Невозможно подключиться к онлайн-сервисам Ferdi", 36 "global.api.unhealthy": "Невозможно подключиться к онлайн-сервисам Ferdi",
71 "global.franzProRequired": "Требуется Ferdi Professional",
72 "global.notConnectedToTheInternet": "Вы не подключены к сети Интернет", 37 "global.notConnectedToTheInternet": "Вы не подключены к сети Интернет",
73 "global.spellchecker.useDefault": "Использовать системные параметры по умолчанию ({default})", 38 "global.spellchecker.useDefault": "Использовать системные параметры по умолчанию ({default})",
74 "global.spellchecking.autodetect": "Найти язык автоматически", 39 "global.spellchecking.autodetect": "Найти язык автоматически",
75 "global.spellchecking.autodetect.short": "Авто", 40 "global.spellchecking.autodetect.short": "Авто",
76 "global.spellchecking.language": "Проверка правописания", 41 "global.spellchecking.language": "Проверка правописания",
77 "global.upgradeButton.upgradeToPro": "Повысьте до Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Импортировать ваши сервисы из Ferdi 4", 44 "import.headline": "Импортировать ваши сервисы из Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Скрыть", 52 "infobar.hide": "Скрыть",
89 "infobar.requiredRequestsFailed": "Невозможно загрузить сервисы и информацию пользователя", 53 "infobar.requiredRequestsFailed": "Невозможно загрузить сервисы и информацию пользователя",
90 "infobar.servicesUpdated": "Ваши сервисы были обновлены.", 54 "infobar.servicesUpdated": "Ваши сервисы были обновлены.",
91 "infobar.trialActivated": "Пробный период успешно активирован. Счастливых переписок!",
92 "infobar.updateAvailable": "Доступно обновление Ferdi.", 55 "infobar.updateAvailable": "Доступно обновление Ferdi.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Адрес электронной почты", 57 "invite.email.label": "Адрес электронной почты",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Автоматически скрывать панель", 87 "menu.app.autohideMenuBar": "Автоматически скрывать панель",
125 "menu.app.checkForUpdates": "Проверить обновления", 88 "menu.app.checkForUpdates": "Проверить обновления",
126 "menu.app.hide": "Скрыть", 89 "menu.app.hide": "Скрыть",
127 "menu.app.hideOthers": "Скрыть остальные", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Выйти", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Настройки", 92 "menu.app.settings": "Настройки",
130 "menu.app.unhide": "Показать", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Правка", 94 "menu.edit": "Правка",
132 "menu.edit.copy": "Копировать", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Вырезать", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Удалить", 97 "menu.edit.delete": "Удалить",
135 "menu.edit.emojiSymbols": "Эмодзи и символы", 98 "menu.edit.emojiSymbols": "Эмодзи и символы",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Вставить", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Вставить с соблюдением стиля", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Вернуть", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Выделить всё", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Речь", 104 "menu.edit.speech": "Речь",
142 "menu.edit.startDictation": "Начать диктовать", 105 "menu.edit.startDictation": "Начать диктовать",
143 "menu.edit.startSpeaking": "Начать говорить", 106 "menu.edit.startSpeaking": "Начать говорить",
144 "menu.edit.stopSpeaking": "Закончить говорить", 107 "menu.edit.stopSpeaking": "Закончить говорить",
145 "menu.edit.undo": "Отменить", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Файл", 109 "menu.file": "Файл",
147 "menu.help": "Справка", 110 "menu.help": "Help",
148 "menu.help.changelog": "Журнал изменений", 111 "menu.help.changelog": "Журнал изменений",
149 "menu.help.debugInfo": "Скопировать отладочную информацию", 112 "menu.help.debugInfo": "Скопировать отладочную информацию",
150 "menu.help.debugInfoCopiedBody": "Ваша информация отладки была скопирована в буфер обмена.", 113 "menu.help.debugInfoCopiedBody": "Ваша информация отладки была скопирована в буфер обмена.",
151 "menu.help.debugInfoCopiedHeadline": "Отладочная информация Ferdi", 114 "menu.help.debugInfoCopiedHeadline": "Отладочная информация Ferdi",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Подробнее", 116 "menu.help.learnMore": "Подробнее",
153 "menu.help.privacy": "Политика конфиденциальности", 117 "menu.help.privacy": "Политика конфиденциальности",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Включить задачи", 127 "menu.todos.enableTodos": "Включить задачи",
164 "menu.view": "Вид", 128 "menu.view": "Вид",
165 "menu.view.back": "Назад", 129 "menu.view.back": "Назад",
166 "menu.view.enterFullScreen": "На весь экран",
167 "menu.view.exitFullScreen": "В окне",
168 "menu.view.forward": "Переслать", 130 "menu.view.forward": "Переслать",
169 "menu.view.lockFerdi": "Заблокировать Ferdi", 131 "menu.view.lockFerdi": "Заблокировать Ferdi",
170 "menu.view.openQuickSwitch": "Открыть быстрый переключатель", 132 "menu.view.openQuickSwitch": "Открыть быстрый переключатель",
171 "menu.view.reloadFranz": "Перезагрузить Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Перезапустить сервис", 134 "menu.view.reloadService": "Перезапустить сервис",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Фактический размер", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Включить тёмную тему", 137 "menu.view.toggleDarkMode": "Включить тёмную тему",
176 "menu.view.toggleDevTools": "Показать инструменты разработчика", 138 "menu.view.toggleDevTools": "Показать инструменты разработчика",
177 "menu.view.toggleFullScreen": "Переключиться на полный экран", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Показать инструменты разработчика сервиса", 140 "menu.view.toggleServiceDevTools": "Показать инструменты разработчика сервиса",
179 "menu.view.toggleTodosDevTools": "Включить инструменты разработчика Todos", 141 "menu.view.toggleTodosDevTools": "Включить инструменты разработчика Todos",
180 "menu.view.zoomIn": "Увеличить масштаб", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Уменьшить масштаб", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Окно", 144 "menu.window": "Window",
183 "menu.window.close": "Закрыть", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Свернуть", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Окружение", 147 "menu.workspaces": "Окружение",
186 "menu.workspaces.addNewWorkspace": "Добавить Новое Окружение...", 148 "menu.workspaces.addNewWorkspace": "Добавить Новое Окружение...",
187 "menu.workspaces.closeWorkspaceDrawer": "Закрыть меню окружений", 149 "menu.workspaces.closeWorkspaceDrawer": "Закрыть меню окружений",
@@ -194,11 +156,7 @@
194 "password.noUser": "Не найдено пользователя с таким адресом электронной почты", 156 "password.noUser": "Не найдено пользователя с таким адресом электронной почты",
195 "password.submit.label": "Принять", 157 "password.submit.label": "Принять",
196 "password.successInfo": "Проверьте вашу электронную почту", 158 "password.successInfo": "Проверьте вашу электронную почту",
197 "premiumFeature.button.upgradeAccount": "Апгрейдить аккаунт",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Всегда бесплатен с рекламой",
200 "pricing.features.appDelays": "Без экранов ожидания",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Добавить пользовательские веб-сайты", 160 "pricing.features.customWebsites": "Добавить пользовательские веб-сайты",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Команда управления", 166 "pricing.features.teamManagement": "Команда управления",
209 "pricing.features.thirdPartyServices": "Установить сторонние сервисы", 167 "pricing.features.thirdPartyServices": "Установить сторонние сервисы",
210 "pricing.features.unlimitedServices": "Добавить неограниченные сервисы", 168 "pricing.features.unlimitedServices": "Добавить неограниченные сервисы",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Окружение", 169 "pricing.features.workspaces": "Окружение",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Да, обновите мой аккаунт до Ferdi Professional",
223 "pricing.trial.cta.skip": "Перейти к Ферди",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "К сожалению, мы не смогли активировать ваш пробный период!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Перезагрузить {name}", 170 "service.crashHandler.action": "Перезагрузить {name}",
236 "service.crashHandler.autoReload": "Пытаюсь автоматически восстановить {name} в течение {seconds} секунд", 171 "service.crashHandler.autoReload": "Пытаюсь автоматически восстановить {name} в течение {seconds} секунд",
237 "service.crashHandler.headline": "О, нет!", 172 "service.crashHandler.headline": "О, нет!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "О, нет!", 178 "service.errorHandler.headline": "О, нет!",
244 "service.errorHandler.message": "Ошибка", 179 "service.errorHandler.message": "Ошибка",
245 "service.errorHandler.text": "{name} не смог загрузиться.", 180 "service.errorHandler.text": "{name} не смог загрузиться.",
246 "service.restrictedHandler.action": "Повысить уровень учетной записи",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Начать работу", 182 "services.getStarted": "Начать работу",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Добро пожаловать во Ferdi", 186 "services.welcome": "Добро пожаловать во Ferdi",
257 "settings.account.account.editButton": "Редактировать аккаунт", 187 "settings.account.account.editButton": "Редактировать аккаунт",
258 "settings.account.accountType.basic": "Базовый аккаунт",
259 "settings.account.accountType.premium": "Премиум аккаунт",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Обновить профиль", 190 "settings.account.buttonSave": "Обновить профиль",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Счета", 197 "settings.account.headlineInvoices": "Счета",
270 "settings.account.headlinePassword": "Сменить пароль", 198 "settings.account.headlinePassword": "Сменить пароль",
271 "settings.account.headlineProfile": "Обновить профиль", 199 "settings.account.headlineProfile": "Обновить профиль",
272 "settings.account.headlineSubscription": "Ваша подписка",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Скачать",
276 "settings.account.manageSubscription.label": "Управление вашей подпиской",
277 "settings.account.successInfo": "Ваши изменения были сохранены", 200 "settings.account.successInfo": "Ваши изменения были сохранены",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Попробовать снова", 201 "settings.account.tryReloadServices": "Попробовать снова",
282 "settings.account.tryReloadUserInfoRequest": "Попробовать снова", 202 "settings.account.tryReloadUserInfoRequest": "Попробовать снова",
283 "settings.account.upgradeToPro.label": "Повысьте до Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Невозможно загрузить информацию пользователя", 203 "settings.account.userInfoRequestFailed": "Невозможно загрузить информацию пользователя",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Включить проверку правописания", 227 "settings.app.form.enableSpellchecking": "Включить проверку правописания",
309 "settings.app.form.enableSystemTray": "Показывать Ferdi в системном трее", 228 "settings.app.form.enableSystemTray": "Показывать Ferdi в системном трее",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Настройки", 259 "settings.app.headline": "Настройки",
341 "settings.app.headlineAdvanced": "Дополнительно", 260 "settings.app.headlineAdvanced": "Дополнительно",
342 "settings.app.headlineAppearance": "Внешний вид", 261 "settings.app.headlineAppearance": "Внешний вид",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Официальная поддержка только для английского и немецкого языков. Остальные языки переведены сообществом.", 268 "settings.app.languageDisclaimer": "Официальная поддержка только для английского и немецкого языков. Остальные языки переведены сообществом.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Пароль", 270 "settings.app.lockedPassword": "Пароль",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Изменения требуют перезагрузки приложения", 272 "settings.app.restartRequired": "Изменения требуют перезагрузки приложения",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Отправка телеметрии позволяет нам находить ошибки в Ferdi - мы не будем отправлять никакой личной информации! Изменение этой опции требует перезапуска Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Кэш", 277 "settings.app.subheadlineCache": "Кэш",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Открыть папку", 300 "settings.recipes.customService.openFolder": "Открыть папку",
382 "settings.recipes.headline": "Доступные сервисы", 301 "settings.recipes.headline": "Доступные сервисы",
383 "settings.recipes.missingService": "Не можете найти сервис?", 302 "settings.recipes.missingService": "Не можете найти сервис?",
384 "settings.recipes.mostPopular": "Самые популярные",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Сервис успешно добавлен", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Сервис успешно добавлен",
387 "settings.searchService": "Найти сервис", 305 "settings.searchService": "Найти сервис",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Добавление {name}", 309 "settings.service.form.addServiceHeadline": "Добавление {name}",
392 "settings.service.form.availableServices": "Доступные сервисы", 310 "settings.service.form.availableServices": "Доступные сервисы",
393 "settings.service.form.customUrl": "Пользовательский сервер", 311 "settings.service.form.customUrl": "Пользовательский сервер",
394 "settings.service.form.customUrlPremiumInfo": "Для добавления сервиса на своем хостинге необходим премиум аккаунт Ferdi.",
395 "settings.service.form.customUrlUpgradeAccount": "Улучшить ваш аккаунт",
396 "settings.service.form.customUrlValidationError": "Невозможно проверить сервер {name}.", 312 "settings.service.form.customUrlValidationError": "Невозможно проверить сервер {name}.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Команда", 380 "settings.team.headline": "Команда",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Улучшить ваш аккаунт",
470 "settings.user.form.accountType.company": "Компания", 385 "settings.user.form.accountType.company": "Компания",
471 "settings.user.form.accountType.individual": "Индивидуальный", 386 "settings.user.form.accountType.individual": "Индивидуальный",
472 "settings.user.form.accountType.label": "Тип аккаунта", 387 "settings.user.form.accountType.label": "Тип аккаунта",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Уже есть аккаунт, войти?", 431 "signup.link.login": "Уже есть аккаунт, войти?",
517 "signup.password.label": "Пароль", 432 "signup.password.label": "Пароль",
518 "signup.submit.label": "Создать аккаунт", 433 "signup.submit.label": "Создать аккаунт",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Показать все варианты",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Повысить уровень учетной записи",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Отмена",
531 "subscriptionPopup.buttonDone": "Готово",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Удалить сервис", 435 "tabs.item.deleteService": "Удалить сервис",
534 "tabs.item.disableAudio": "Отключить звук", 436 "tabs.item.disableAudio": "Отключить звук",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Отключить уведомления", 438 "tabs.item.disableNotifications": "Отключить уведомления",
536 "tabs.item.disableService": "Отключить сервис", 439 "tabs.item.disableService": "Отключить сервис",
537 "tabs.item.edit": "Правка", 440 "tabs.item.edit": "Правка",
538 "tabs.item.enableAudio": "Включить звук", 441 "tabs.item.enableAudio": "Включить звук",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Включить уведомления", 443 "tabs.item.enableNotification": "Включить уведомления",
540 "tabs.item.enableService": "Включить сервис", 444 "tabs.item.enableService": "Включить сервис",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Перезагрузить", 446 "tabs.item.reload": "Перезагрузить",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} недействительно", 448 "validation.email": "{field} недействительно",
543 "validation.minLength": "{field} должно быть не менее {length} символов", 449 "validation.minLength": "{field} должно быть не менее {length} символов",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Окружение", 462 "workspaceDrawer.headline": "Окружение",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Восстановить премиум аккаунт",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/si.json b/src/i18n/locales/si.json
index 346180959..940864fa0 100644
--- a/src/i18n/locales/si.json
+++ b/src/i18n/locales/si.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
19 "feature.planSelection.cta.upgradePro": "Choose Professional",
20 "feature.planSelection.free.text": "Basic functionality",
21 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
24 "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.",
25 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
26 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
30 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
31 "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.",
32 "feature.shareFranz.action.email": "Send as email", 8 "feature.shareFranz.action.email": "Send as email",
33 "feature.shareFranz.action.facebook": "Share on Facebook", 9 "feature.shareFranz.action.facebook": "Share on Facebook",
34 "feature.shareFranz.action.twitter": "Share on Twitter", 10 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 12 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
37 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 13 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
38 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 14 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
39 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
40 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade": "Upgrade Account",
42 "feature.trialStatusBar.cta": "Upgrade now",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
46 "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.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
49 "global.api.unhealthy": "ෆ්රාන්ස් මාර්ගගත සේවාවන් වෙත සම්බන්ධ වීමට නොහැක.", 15 "global.api.unhealthy": "ෆ්රාන්ස් මාර්ගගත සේවාවන් වෙත සම්බන්ධ වීමට නොහැක.",
50 "global.franzProRequired": "Ferdi Professional Required", 16 "global.franzProRequired": "Ferdi Professional Required",
51 "global.notConnectedToTheInternet": "ඔබ අන්තර්ජාලයට සම්බන්ධ වී නැත.", 17 "global.notConnectedToTheInternet": "ඔබ අන්තර්ජාලයට සම්බන්ධ වී නැත.",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "Detect language automatically", 19 "global.spellchecking.autodetect": "Detect language automatically",
54 "global.spellchecking.autodetect.short": "Automatic", 20 "global.spellchecking.autodetect.short": "Automatic",
55 "global.spellchecking.language": "Spell checking language", 21 "global.spellchecking.language": "Spell checking language",
56 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
57 "import.headline": "ඔබගේ ෆ්රාන්ස් සේවාවන් නැවත ඇතුලත් කරගන්න.", 22 "import.headline": "ඔබගේ ෆ්රාන්ස් සේවාවන් නැවත ඇතුලත් කරගන්න.",
58 "import.notSupportedHeadline": "සේවාවන් සඳහා ෆ්රාන්ස් 5 හි තවමත් පහසුකම් සලසා නැත.", 23 "import.notSupportedHeadline": "සේවාවන් සඳහා ෆ්රාන්ස් 5 හි තවමත් පහසුකම් සලසා නැත.",
59 "import.skip.label": "සේවාවන් මවිසින් ඇතුලත් කල යුතුය. ", 24 "import.skip.label": "සේවාවන් මවිසින් ඇතුලත් කල යුතුය. ",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "සේවාවන් නැවත ඇරඹීම", 28 "infobar.buttonReloadServices": "සේවාවන් නැවත ඇරඹීම",
64 "infobar.requiredRequestsFailed": "සේවාවන් සහ පරිශීලක තොරතුරු ලබාගත නොහැක.", 29 "infobar.requiredRequestsFailed": "සේවාවන් සහ පරිශීලක තොරතුරු ලබාගත නොහැක.",
65 "infobar.servicesUpdated": "ඔබගේ සේවාවන් යාවත්කාල කර ඇත.", 30 "infobar.servicesUpdated": "ඔබගේ සේවාවන් යාවත්කාල කර ඇත.",
66 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable": "ෆ්රාන්ස් හි නව සංස්කරණයක් දැන් ලබා ගත හැක.", 31 "infobar.updateAvailable": "ෆ්රාන්ස් හි නව සංස්කරණයක් දැන් ලබා ගත හැක.",
68 "invite.email.label": "විද්‍යුත් තැපැල් ලිපිනය ", 32 "invite.email.label": "විද්‍යුත් තැපැල් ලිපිනය ",
69 "invite.headline.friends": "මිතුරන් 3කට ආරාධනා කරන්න.", 33 "invite.headline.friends": "මිතුරන් 3කට ආරාධනා කරන්න.",
@@ -122,9 +86,7 @@
122 "menu.todos": "Todos", 86 "menu.todos": "Todos",
123 "menu.todos.enableTodos": "Enable Todos", 87 "menu.todos.enableTodos": "Enable Todos",
124 "menu.view": "View", 88 "menu.view": "View",
125 "menu.view.enterFullScreen": "Enter Full Screen", 89 "menu.view.reloadFerdi": "Reload Ferdi",
126 "menu.view.exitFullScreen": "Exit Full Screen",
127 "menu.view.reloadFranz": "Reload Ferdi",
128 "menu.view.reloadService": "Reload Service", 90 "menu.view.reloadService": "Reload Service",
129 "menu.view.reloadTodos": "Reload ToDos", 91 "menu.view.reloadTodos": "Reload ToDos",
130 "menu.view.resetZoom": "Actual Size", 92 "menu.view.resetZoom": "Actual Size",
@@ -166,27 +128,6 @@
166 "pricing.features.upToSixServices": "Add up to 6 services", 128 "pricing.features.upToSixServices": "Add up to 6 services",
167 "pricing.features.upToThreeServices": "Add up to 3 services", 129 "pricing.features.upToThreeServices": "Add up to 3 services",
168 "pricing.features.workspaces": "Workspaces", 130 "pricing.features.workspaces": "Workspaces",
169 "pricing.plan.free": "Free",
170 "pricing.plan.legacy": "Premium",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal Monthly",
173 "pricing.plan.personal-yearly": "Personal Yearly",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional Monthly",
176 "pricing.plan.pro-yearly": "Professional Yearly",
177 "pricing.trial.cta.accept": "Start my 14-day Ferdi Professional Trial ",
178 "pricing.trial.cta.skip": "Continue to Ferdi",
179 "pricing.trial.cta.start": "Start using Ferdi",
180 "pricing.trial.error": "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline": "Ferdi Professional includes:",
182 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
183 "pricing.trial.intro.happyMessaging": "Happy messaging,",
184 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
185 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline": "No strings attached",
188 "pricing.trial.terms.noCreditCard": "No credit card required",
189 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action": "{name} නැවත ලබාගන්න", 131 "service.crashHandler.action": "{name} නැවත ලබාගන්න",
191 "service.crashHandler.autoReload": "{name} ස්වයංක්‍රීය ප්‍රතිෂ්ඨාපනය තවත් තත්පර {seconds}කින් ", 132 "service.crashHandler.autoReload": "{name} ස්වයංක්‍රීය ප්‍රතිෂ්ඨාපනය තවත් තත්පර {seconds}කින් ",
192 "service.crashHandler.headline": "අපොයි!", 133 "service.crashHandler.headline": "අපොයි!",
@@ -198,11 +139,6 @@
198 "service.errorHandler.headline": "අපොයි!", 139 "service.errorHandler.headline": "අපොයි!",
199 "service.errorHandler.message": "Error", 140 "service.errorHandler.message": "Error",
200 "service.errorHandler.text": "{name} has failed to load.", 141 "service.errorHandler.text": "{name} has failed to load.",
201 "service.restrictedHandler.action": "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
203 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading": "Loading", 142 "service.webviewLoader.loading": "Loading",
207 "services.getStarted": "ආරම්භ කරන්න", 143 "services.getStarted": "ආරම්භ කරන්න",
208 "services.welcome": "ෆ්‍රාන්ස් වෙත සාදරයෙන් පිළිගනිමු", 144 "services.welcome": "ෆ්‍රාන්ස් වෙත සාදරයෙන් පිළිගනිමු",
@@ -219,18 +155,9 @@
219 "settings.account.headlineInvoices": "ලදුපත් ", 155 "settings.account.headlineInvoices": "ලදුපත් ",
220 "settings.account.headlinePassword": "මුරපදය වෙනස් කරන්න", 156 "settings.account.headlinePassword": "මුරපදය වෙනස් කරන්න",
221 "settings.account.headlineProfile": "පැතිකඩ යාවත්කාල කරන්න ", 157 "settings.account.headlineProfile": "පැතිකඩ යාවත්කාල කරන්න ",
222 "settings.account.headlineSubscription": "ඔබගේ දායකත්වය ",
223 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
224 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
225 "settings.account.invoiceDownload": "Download",
226 "settings.account.manageSubscription.label": "Manage your subscription",
227 "settings.account.successInfo": "Your changes have been saved", 158 "settings.account.successInfo": "Your changes have been saved",
228 "settings.account.trial": "Free Trial",
229 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices": "Try again", 159 "settings.account.tryReloadServices": "Try again",
232 "settings.account.tryReloadUserInfoRequest": "Try again", 160 "settings.account.tryReloadUserInfoRequest": "Try again",
233 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
234 "settings.account.userInfoRequestFailed": "Could not load user information", 161 "settings.account.userInfoRequestFailed": "Could not load user information",
235 "settings.account.yourLicense": "Your Ferdi License", 162 "settings.account.yourLicense": "Your Ferdi License",
236 "settings.app.buttonClearAllCache": "Clear cache", 163 "settings.app.buttonClearAllCache": "Clear cache",
@@ -284,7 +211,6 @@
284 "settings.recipes.customService.openFolder": "Open folder", 211 "settings.recipes.customService.openFolder": "Open folder",
285 "settings.recipes.headline": "Available services", 212 "settings.recipes.headline": "Available services",
286 "settings.recipes.missingService": "Missing a service?", 213 "settings.recipes.missingService": "Missing a service?",
287 "settings.recipes.mostPopular": "Most popular",
288 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 214 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
289 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 215 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
290 "settings.searchService": "Search service", 216 "settings.searchService": "Search service",
@@ -391,19 +317,6 @@
391 "signup.link.login": "Already have an account, sign in?", 317 "signup.link.login": "Already have an account, sign in?",
392 "signup.password.label": "මුරපදය", 318 "signup.password.label": "මුරපදය",
393 "signup.submit.label": "Create account", 319 "signup.submit.label": "Create account",
394 "subscription.bestValue": "Best value",
395 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
396 "subscription.cta.allOptions": "See all options",
397 "subscription.cta.choosePlan": "Choose your plan",
398 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
399 "subscription.interval.per": "per {interval}",
400 "subscription.interval.perMonth": "per month",
401 "subscription.interval.perMonthPerUser": "per month & user",
402 "subscription.planItem.upgradeAccount": "Upgrade Account",
403 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
404 "subscription.teaser.intro": "Ferdi 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!",
405 "subscriptionPopup.buttonCancel": "Cancel",
406 "subscriptionPopup.buttonDone": "Done",
407 "tabs.item.deleteService": "Delete service", 320 "tabs.item.deleteService": "Delete service",
408 "tabs.item.disableAudio": "Disable audio", 321 "tabs.item.disableAudio": "Disable audio",
409 "tabs.item.disableNotifications": "Disable notifications", 322 "tabs.item.disableNotifications": "Disable notifications",
@@ -431,7 +344,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "edit", 344 "workspaceDrawer.item.contextMenuEdit": "edit",
432 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 345 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 346 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge": "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 347 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 348 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 349 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index d0a7fd565..03bd0d976 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh nie! Ferdi stratil pripojenie k {name}.", 12 "connectionLostBanner.message": "Oh nie! Ferdi stratil pripojenie k {name}.",
13 "feature.announcements.changelog.headline": "Zmeny vo Ferdi {version}", 13 "feature.announcements.changelog.headline": "Zmeny vo Ferdi {version}",
14 "feature.debugger.title": "Zverejniť informácie ladenia", 14 "feature.debugger.title": "Zverejniť informácie ladenia",
15 "feature.delayApp.headline": "Prosím, kúp si licenciu Ferdi Supporter a nebudeš musieť čakať",
16 "feature.delayApp.text": "Ferdi bude pokračovať v {seconds} sekundách.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Získajte licenciu pre Ferdi podporu",
21 "feature.delayApp.upgrade.actionShort": "Upgradovať účet",
22 "feature.nightlyBuilds.activate": "Aktivovať", 15 "feature.nightlyBuilds.activate": "Aktivovať",
23 "feature.nightlyBuilds.cancel": "Zrušiť", 16 "feature.nightlyBuilds.cancel": "Zrušiť",
24 "feature.nightlyBuilds.info": "Tzv. \"nočné verzie\" sú vysoko experimentálne verzie Ferdi, ktoré môžu obsahovať nedoladená alebo nedokončené funkcie. Tieto verzie sú používané predovšetkým vývojármi, aby otestovali novo-vyvíjané funkcie a spôsob, akým sa budú správať vo finálnej verzii. Ak neviete čo robíte, navrhujeme neaktivovať tieto experimentálne verzie.", 17 "feature.nightlyBuilds.info": "Tzv. \"nočné verzie\" sú vysoko experimentálne verzie Ferdi, ktoré môžu obsahovať nedoladená alebo nedokončené funkcie. Tieto verzie sú používané predovšetkým vývojármi, aby otestovali novo-vyvíjané funkcie a spôsob, akým sa budú správať vo finálnej verzii. Ak neviete čo robíte, navrhujeme neaktivovať tieto experimentálne verzie.",
25 "feature.nightlyBuilds.title": "Vývojárske verzie", 18 "feature.nightlyBuilds.title": "Vývojárske verzie",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Ochrana osobných údajov", 21 "feature.publishDebugInfo.privacy": "Ochrana osobných údajov",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Hľadať...", 27 "feature.quickSwitch.search": "Hľadať...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Odoslať ako e-mail", 29 "feature.shareFranz.action.email": "Odoslať ako e-mail",
54 "feature.shareFranz.action.facebook": "Zdielať na Facebook-u", 30 "feature.shareFranz.action.facebook": "Zdielať na Facebook-u",
55 "feature.shareFranz.action.twitter": "Zdieľať na Twitter-i", 31 "feature.shareFranz.action.twitter": "Zdieľať na Twitter-i",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Pridali sme {count} služieb do Ferdi! Získajte zadarmo aplikáciu pre WhatsApp, Messenger, Slack, Skype a iné na www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Pridali sme {count} služieb do Ferdi! Získajte zadarmo aplikáciu pre WhatsApp, Messenger, Slack, Skype a iné na www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Pridal som {count} služieb do Ferdi! Získajte zadarmo aplikáciu pre WhatsApp, Messenger, Slack, Skype a iné na www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Pridal som {count} služieb do Ferdi! Získajte zadarmo aplikáciu pre WhatsApp, Messenger, Slack, Skype a iné na www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Povedzte vašim priateľom a známym aký je Ferdi skvelý a pomôžte nám rozšíriť sa do sveta.", 35 "feature.shareFranz.text": "Povedzte vašim priateľom a známym aký je Ferdi skvelý a pomôžte nám rozšíriť sa do sveta.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Vylepšite svoj účet",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Nedá sa pripojiť k online službám Ferdi", 36 "global.api.unhealthy": "Nedá sa pripojiť k online službám Ferdi",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "Nie ste pripojení k internetu.", 37 "global.notConnectedToTheInternet": "Nie ste pripojení k internetu.",
73 "global.spellchecker.useDefault": "Použiť predvolené nastavenie systému ({default})", 38 "global.spellchecker.useDefault": "Použiť predvolené nastavenie systému ({default})",
74 "global.spellchecking.autodetect": "Automaticky rozpoznať jazyk", 39 "global.spellchecking.autodetect": "Automaticky rozpoznať jazyk",
75 "global.spellchecking.autodetect.short": "Automatický", 40 "global.spellchecking.autodetect.short": "Automatický",
76 "global.spellchecking.language": "Jazyk kontroly pravopisu", 41 "global.spellchecking.language": "Jazyk kontroly pravopisu",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importovať vaše služby z Ferdi 4", 44 "import.headline": "Importovať vaše služby z Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Skryť", 52 "infobar.hide": "Skryť",
89 "infobar.requiredRequestsFailed": "Nie je možné načítať služby a informácie o používateľovi", 53 "infobar.requiredRequestsFailed": "Nie je možné načítať služby a informácie o používateľovi",
90 "infobar.servicesUpdated": "Vaše služby boli aktualizované.", 54 "infobar.servicesUpdated": "Vaše služby boli aktualizované.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Je k dispozícii nová aktualizácia Ferdi.", 55 "infobar.updateAvailable": "Je k dispozícii nová aktualizácia Ferdi.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "E-mailová adresa", 57 "invite.email.label": "E-mailová adresa",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "Skontrolovať aktualizácie", 88 "menu.app.checkForUpdates": "Skontrolovať aktualizácie",
126 "menu.app.hide": "Skryť", 89 "menu.app.hide": "Skryť",
127 "menu.app.hideOthers": "Skryť ostatné", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Ukončiť", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Nastavenia", 92 "menu.app.settings": "Nastavenia",
130 "menu.app.unhide": "Odkryť", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Upraviť", 94 "menu.edit": "Upraviť",
132 "menu.edit.copy": "Kopírovať", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Vystrihnúť", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Zmazať", 97 "menu.edit.delete": "Zmazať",
135 "menu.edit.emojiSymbols": "Emoji a symboly", 98 "menu.edit.emojiSymbols": "Emoji a symboly",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Vložiť", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Vložiť s prevzatím jestvujúceho štýlu", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Znovu", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Vybrať všetko", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Rozprávanie", 104 "menu.edit.speech": "Rozprávanie",
142 "menu.edit.startDictation": "Začať diktovanie", 105 "menu.edit.startDictation": "Začať diktovanie",
143 "menu.edit.startSpeaking": "Začať rozprávanie", 106 "menu.edit.startSpeaking": "Začať rozprávanie",
144 "menu.edit.stopSpeaking": "Zastaviť rozprávanie", 107 "menu.edit.stopSpeaking": "Zastaviť rozprávanie",
145 "menu.edit.undo": "Späť", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Súbor", 109 "menu.file": "Súbor",
147 "menu.help": "Pomocník", 110 "menu.help": "Help",
148 "menu.help.changelog": "Záznam zmien", 111 "menu.help.changelog": "Záznam zmien",
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Zistiť viac", 116 "menu.help.learnMore": "Zistiť viac",
153 "menu.help.privacy": "Vyhlásenie o ochrane súkromia", 117 "menu.help.privacy": "Vyhlásenie o ochrane súkromia",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Zobraziť", 128 "menu.view": "Zobraziť",
165 "menu.view.back": "Naspäť", 129 "menu.view.back": "Naspäť",
166 "menu.view.enterFullScreen": "Na celú obrazovku",
167 "menu.view.exitFullScreen": "Ukončiť režim na celú obrazovku",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Uzamknúť Ferdi", 131 "menu.view.lockFerdi": "Uzamknúť Ferdi",
170 "menu.view.openQuickSwitch": "Otvoriť prepínač služieb", 132 "menu.view.openQuickSwitch": "Otvoriť prepínač služieb",
171 "menu.view.reloadFranz": "Obnoviť Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Obnoviť službu", 134 "menu.view.reloadService": "Obnoviť službu",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Pôvodná veľkosť", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Zapnúť Tmavý Mód", 137 "menu.view.toggleDarkMode": "Zapnúť Tmavý Mód",
176 "menu.view.toggleDevTools": "Prepnúť vývojárske nástroje", 138 "menu.view.toggleDevTools": "Prepnúť vývojárske nástroje",
177 "menu.view.toggleFullScreen": "Prepnúť na celú obrazovku", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Prepnúť vývojárske nástroje služby", 140 "menu.view.toggleServiceDevTools": "Prepnúť vývojárske nástroje služby",
179 "menu.view.toggleTodosDevTools": "Prepnúť vývojárske nástroje", 141 "menu.view.toggleTodosDevTools": "Prepnúť vývojárske nástroje",
180 "menu.view.zoomIn": "Priblížiť", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Oddialiť", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Okno", 144 "menu.window": "Window",
183 "menu.window.close": "Zatvoriť", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimalizovať", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Pracovný priestor", 147 "menu.workspaces": "Pracovný priestor",
186 "menu.workspaces.addNewWorkspace": "Pridať nový pracovný priestor ...", 148 "menu.workspaces.addNewWorkspace": "Pridať nový pracovný priestor ...",
187 "menu.workspaces.closeWorkspaceDrawer": "Zavrieť workspace záložku", 149 "menu.workspaces.closeWorkspaceDrawer": "Zavrieť workspace záložku",
@@ -194,11 +156,7 @@
194 "password.noUser": "Používateľ s touto e-mailovou adresou nebol nájdený", 156 "password.noUser": "Používateľ s touto e-mailovou adresou nebol nájdený",
195 "password.submit.label": "Odoslať", 157 "password.submit.label": "Odoslať",
196 "password.successInfo": "Skontrolujte prosím váš e-mail", 158 "password.successInfo": "Skontrolujte prosím váš e-mail",
197 "premiumFeature.button.upgradeAccount": "Upgradovať účet",
198 "pricing.features.accountSync": "Synchronizácia účtu", 159 "pricing.features.accountSync": "Synchronizácia účtu",
199 "pricing.features.adFree": "Navždy bez reklám",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Pridať vlastnú webstránku", 160 "pricing.features.customWebsites": "Pridať vlastnú webstránku",
203 "pricing.features.desktopNotifications": "Upozornenie na ploche", 161 "pricing.features.desktopNotifications": "Upozornenie na ploche",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Manažment tímu", 166 "pricing.features.teamManagement": "Manažment tímu",
209 "pricing.features.thirdPartyServices": "Inštalovať inú službu", 167 "pricing.features.thirdPartyServices": "Inštalovať inú službu",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Pracovný priestor", 169 "pricing.features.workspaces": "Pracovný priestor",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Mesačne",
221 "pricing.plan.pro-yearly": "Ferdi Professional Ročne",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Znovu načítať {name}", 170 "service.crashHandler.action": "Znovu načítať {name}",
236 "service.crashHandler.autoReload": "Najbližší pokus o automatické obnovenie {name} o {seconds} sekúnd", 171 "service.crashHandler.autoReload": "Najbližší pokus o automatické obnovenie {name} o {seconds} sekúnd",
237 "service.crashHandler.headline": "Ale nie!", 172 "service.crashHandler.headline": "Ale nie!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Ale nie!", 178 "service.errorHandler.headline": "Ale nie!",
244 "service.errorHandler.message": "Chyba", 179 "service.errorHandler.message": "Chyba",
245 "service.errorHandler.text": "{name} sa nepodarilo načítať.", 180 "service.errorHandler.text": "{name} sa nepodarilo načítať.",
246 "service.restrictedHandler.action": "Vylepšite svoj účet",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "Dosiahli ste limit počtu zariadení.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Načítavam {service}", 181 "service.webviewLoader.loading": "Načítavam {service}",
252 "services.getStarted": "Začíname", 182 "services.getStarted": "Začíname",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Vítajte v aplikácii Ferdi", 186 "services.welcome": "Vítajte v aplikácii Ferdi",
257 "settings.account.account.editButton": "Upraviť účet", 187 "settings.account.account.editButton": "Upraviť účet",
258 "settings.account.accountType.basic": "Základný účet",
259 "settings.account.accountType.premium": "Prémiový účet podporovateľa",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Aktualizovať profil", 190 "settings.account.buttonSave": "Aktualizovať profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Faktúry", 197 "settings.account.headlineInvoices": "Faktúry",
270 "settings.account.headlinePassword": "Zmeniť heslo", 198 "settings.account.headlinePassword": "Zmeniť heslo",
271 "settings.account.headlineProfile": "Aktualizovať profil", 199 "settings.account.headlineProfile": "Aktualizovať profil",
272 "settings.account.headlineSubscription": "Vaše odoberanie",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Prevziať",
276 "settings.account.manageSubscription.label": "Spravovať vaše odoberanie",
277 "settings.account.successInfo": "Vaše zmeny boli uložené", 200 "settings.account.successInfo": "Vaše zmeny boli uložené",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Skúsiť znova", 201 "settings.account.tryReloadServices": "Skúsiť znova",
282 "settings.account.tryReloadUserInfoRequest": "Skúsiť znova", 202 "settings.account.tryReloadUserInfoRequest": "Skúsiť znova",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Nebolo možné načítať informácie o používateľovi", 203 "settings.account.userInfoRequestFailed": "Nebolo možné načítať informácie o používateľovi",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Zapnúť kontrolu pravopisu", 227 "settings.app.form.enableSpellchecking": "Zapnúť kontrolu pravopisu",
309 "settings.app.form.enableSystemTray": "Zobrazovať Ferdi v systémovej lište", 228 "settings.app.form.enableSystemTray": "Zobrazovať Ferdi v systémovej lište",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Nastavenia", 259 "settings.app.headline": "Nastavenia",
341 "settings.app.headlineAdvanced": "Pokročilé", 260 "settings.app.headlineAdvanced": "Pokročilé",
342 "settings.app.headlineAppearance": "Vzhľad", 261 "settings.app.headlineAppearance": "Vzhľad",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Oficiálne preklady sú angličtina a nemčina. Všetky ostatné jazyky sú preklady založené na komunite.", 268 "settings.app.languageDisclaimer": "Oficiálne preklady sú angličtina a nemčina. Všetky ostatné jazyky sú preklady založené na komunite.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Heslo", 270 "settings.app.lockedPassword": "Heslo",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Zmeny vyžadujú reštart", 272 "settings.app.restartRequired": "Zmeny vyžadujú reštart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Vyrovnávacia pamäť", 277 "settings.app.subheadlineCache": "Vyrovnávacia pamäť",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Otvoriť priečinok", 300 "settings.recipes.customService.openFolder": "Otvoriť priečinok",
382 "settings.recipes.headline": "Dostupné služby", 301 "settings.recipes.headline": "Dostupné služby",
383 "settings.recipes.missingService": "Chýba vám služba?", 302 "settings.recipes.missingService": "Chýba vám služba?",
384 "settings.recipes.mostPopular": "Najpopulárnejšie",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Služba bola úspešne pridaná", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Služba bola úspešne pridaná",
387 "settings.searchService": "Vyhľadať službu", 305 "settings.searchService": "Vyhľadať službu",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Pridať {name}", 309 "settings.service.form.addServiceHeadline": "Pridať {name}",
392 "settings.service.form.availableServices": "Dostupné služby", 310 "settings.service.form.availableServices": "Dostupné služby",
393 "settings.service.form.customUrl": "Vlastný server", 311 "settings.service.form.customUrl": "Vlastný server",
394 "settings.service.form.customUrlPremiumInfo": "Ak chcete pridať vlastné hostované služby, potrebujete účet Ferdi Premium Supporter.",
395 "settings.service.form.customUrlUpgradeAccount": "Povýšte váš účet",
396 "settings.service.form.customUrlValidationError": "Nebolo možné overiť vlastný server: {name}.", 312 "settings.service.form.customUrlValidationError": "Nebolo možné overiť vlastný server: {name}.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Tím", 380 "settings.team.headline": "Tím",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Vylepšite svoj účet",
470 "settings.user.form.accountType.company": "Spoločnosť", 385 "settings.user.form.accountType.company": "Spoločnosť",
471 "settings.user.form.accountType.individual": "Osoba", 386 "settings.user.form.accountType.individual": "Osoba",
472 "settings.user.form.accountType.label": "Typ účtu", 387 "settings.user.form.accountType.label": "Typ účtu",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Už máte účet, chcete sa prihlásiť?", 431 "signup.link.login": "Už máte účet, chcete sa prihlásiť?",
517 "signup.password.label": "Heslo", 432 "signup.password.label": "Heslo",
518 "signup.submit.label": "Vytvoriť účet", 433 "signup.submit.label": "Vytvoriť účet",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Pozrieť všetky nastavenia",
522 "subscription.cta.choosePlan": "Vyberte váš plán",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "za { interval}",
525 "subscription.interval.perMonth": "za mesiac",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Vylepšite svoj účet",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Zrušiť",
531 "subscriptionPopup.buttonDone": "Dokončiť",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Odstrániť službu", 435 "tabs.item.deleteService": "Odstrániť službu",
534 "tabs.item.disableAudio": "Vypnúť zvuk", 436 "tabs.item.disableAudio": "Vypnúť zvuk",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Zakázať oznámenia", 438 "tabs.item.disableNotifications": "Zakázať oznámenia",
536 "tabs.item.disableService": "Vypnúť službu", 439 "tabs.item.disableService": "Vypnúť službu",
537 "tabs.item.edit": "Upraviť", 440 "tabs.item.edit": "Upraviť",
538 "tabs.item.enableAudio": "Zapnúť zvuk", 441 "tabs.item.enableAudio": "Zapnúť zvuk",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Povoliť oznámenia", 443 "tabs.item.enableNotification": "Povoliť oznámenia",
540 "tabs.item.enableService": "Povoliť službu", 444 "tabs.item.enableService": "Povoliť službu",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Obnoviť", 446 "tabs.item.reload": "Obnoviť",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} je neplatný", 448 "validation.email": "{field} je neplatný",
543 "validation.minLength": "{field} by malo byť dlhé aspoň {length} znakov", 449 "validation.minLength": "{field} by malo byť dlhé aspoň {length} znakov",
544 "validation.oneRequired": "Je nutné zadať aspoň jeden", 450 "validation.oneRequired": "Je nutné zadať aspoň jeden",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Pracovný priestor", 462 "workspaceDrawer.headline": "Pracovný priestor",
557 "workspaceDrawer.item.contextMenuEdit": "Upraviť", 463 "workspaceDrawer.item.contextMenuEdit": "Upraviť",
558 "workspaceDrawer.item.noServicesAddedYet": "Zatiaľ žiadne služby", 464 "workspaceDrawer.item.noServicesAddedYet": "Zatiaľ žiadne služby",
559 "workspaceDrawer.premiumCtaButtonLabel": "Vytvorte váš prvý workspace",
560 "workspaceDrawer.proFeatureBadge": "Prémiová funkcia",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Obnovte svoj prémiový účet",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspace vám umožňujú sústrediť sa na to, čo je práve dôležité. Nastavte si rozličné skupiny služieb a jednoducho medzi nimi kedykoľvek prepínajte.</p><p>Vy rozhodujete ktoré služby, kedy a kde potrebujete, a my vám potom vieme pomôcť sústrediť sa na prácu - alebo jednoducho prepnúť z práce na čokoľvek iné. </p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspace vám umožňujú sústrediť sa na to, čo je práve dôležité. Nastavte si rozličné skupiny služieb a jednoducho medzi nimi kedykoľvek prepínajte.</p><p>Vy rozhodujete ktoré služby, kedy a kde potrebujete, a my vám potom vieme pomôcť sústrediť sa na prácu - alebo jednoducho prepnúť z práce na čokoľvek iné. </p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Upraviť nastavenia workspace", 466 "workspaceDrawer.workspacesSettingsTooltip": "Upraviť nastavenia workspace",
564 "workspaces.switchingIndicator.switchingTo": "Prepínanie na" 467 "workspaces.switchingIndicator.switchingTo": "Prepínanie na"
diff --git a/src/i18n/locales/sl.json b/src/i18n/locales/sl.json
index 3447ea7ac..3e185e73b 100644
--- a/src/i18n/locales/sl.json
+++ b/src/i18n/locales/sl.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Upgrade account",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cancel", 16 "feature.nightlyBuilds.cancel": "Cancel",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Send as email", 29 "feature.shareFranz.action.email": "Send as email",
54 "feature.shareFranz.action.facebook": "Share on Facebook", 30 "feature.shareFranz.action.facebook": "Share on Facebook",
55 "feature.shareFranz.action.twitter": "Share on Twitter", 31 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Can't connect to Ferdi online services", 36 "global.api.unhealthy": "Can't connect to Ferdi online services",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "You are not connected to the internet.", 37 "global.notConnectedToTheInternet": "You are not connected to the internet.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Import your Ferdi 4 services", 44 "import.headline": "Import your Ferdi 4 services",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Hide", 52 "infobar.hide": "Hide",
89 "infobar.requiredRequestsFailed": "Could not load services and user information", 53 "infobar.requiredRequestsFailed": "Could not load services and user information",
90 "infobar.servicesUpdated": "Your services have been updated.", 54 "infobar.servicesUpdated": "Your services have been updated.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "A new update for Ferdi is available.", 55 "infobar.updateAvailable": "A new update for Ferdi is available.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email address", 57 "invite.email.label": "Email address",
@@ -149,6 +112,7 @@
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Learn More", 116 "menu.help.learnMore": "Learn More",
153 "menu.help.privacy": "Privacy Statement", 117 "menu.help.privacy": "Privacy Statement",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,12 +127,10 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Enter Full Screen",
167 "menu.view.exitFullScreen": "Exit Full Screen",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Reload Service", 134 "menu.view.reloadService": "Reload Service",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Actual Size", 136 "menu.view.resetZoom": "Actual Size",
@@ -194,11 +156,7 @@
194 "password.noUser": "No user with that email address was found", 156 "password.noUser": "No user with that email address was found",
195 "password.submit.label": "Submit", 157 "password.submit.label": "Submit",
196 "password.successInfo": "Please check your email", 158 "password.successInfo": "Please check your email",
197 "premiumFeature.button.upgradeAccount": "Upgrade account",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "Error", 179 "service.errorHandler.message": "Error",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Get started", 182 "services.getStarted": "Get started",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welcome to Ferdi", 186 "services.welcome": "Welcome to Ferdi",
257 "settings.account.account.editButton": "Edit account", 187 "settings.account.account.editButton": "Edit account",
258 "settings.account.accountType.basic": "Basic Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Update profile", 190 "settings.account.buttonSave": "Update profile",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Invoices", 197 "settings.account.headlineInvoices": "Invoices",
270 "settings.account.headlinePassword": "Change password", 198 "settings.account.headlinePassword": "Change password",
271 "settings.account.headlineProfile": "Update profile", 199 "settings.account.headlineProfile": "Update profile",
272 "settings.account.headlineSubscription": "Your subscription",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Manage your subscription",
277 "settings.account.successInfo": "Your changes have been saved", 200 "settings.account.successInfo": "Your changes have been saved",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Try again", 201 "settings.account.tryReloadServices": "Try again",
282 "settings.account.tryReloadUserInfoRequest": "Try again", 202 "settings.account.tryReloadUserInfoRequest": "Try again",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Could not load user information", 203 "settings.account.userInfoRequestFailed": "Could not load user information",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 228 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Settings", 259 "settings.app.headline": "Settings",
341 "settings.app.headlineAdvanced": "Advanced", 260 "settings.app.headlineAdvanced": "Advanced",
342 "settings.app.headlineAppearance": "Appearance", 261 "settings.app.headlineAppearance": "Appearance",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Changes require restart", 272 "settings.app.restartRequired": "Changes require restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Available services", 301 "settings.recipes.headline": "Available services",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "Most popular",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
387 "settings.searchService": "Search service", 305 "settings.searchService": "Search service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Add {name}", 309 "settings.service.form.addServiceHeadline": "Add {name}",
392 "settings.service.form.availableServices": "Available services", 310 "settings.service.form.availableServices": "Available services",
393 "settings.service.form.customUrl": "Custom server", 311 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Company", 385 "settings.user.form.accountType.company": "Company",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Account type", 387 "settings.user.form.accountType.label": "Account type",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Already have an account, sign in?", 431 "signup.link.login": "Already have an account, sign in?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Create account", 433 "signup.submit.label": "Create account",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Cancel",
531 "subscriptionPopup.buttonDone": "Done",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Delete service", 435 "tabs.item.deleteService": "Delete service",
534 "tabs.item.disableAudio": "Disable audio", 436 "tabs.item.disableAudio": "Disable audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Disable notifications", 438 "tabs.item.disableNotifications": "Disable notifications",
536 "tabs.item.disableService": "Disable service", 439 "tabs.item.disableService": "Disable service",
537 "tabs.item.edit": "Edit", 440 "tabs.item.edit": "Edit",
538 "tabs.item.enableAudio": "Enable audio", 441 "tabs.item.enableAudio": "Enable audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Enable notifications", 443 "tabs.item.enableNotification": "Enable notifications",
540 "tabs.item.enableService": "Enable service", 444 "tabs.item.enableService": "Enable service",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Reload", 446 "tabs.item.reload": "Reload",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/sq.json b/src/i18n/locales/sq.json
index 09bb10fb2..fd1cbf1fd 100644
--- a/src/i18n/locales/sq.json
+++ b/src/i18n/locales/sq.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 7 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
8 "feature.delayApp.headline": "Upgrade your Ferdi plan to skip the wait",
9 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
10 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
11 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
12 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14-days trial and skip the wait",
13 "feature.delayApp.upgrade.action": "Upgrade Ferdi",
14 "feature.delayApp.upgrade.actionShort": "Upgrade account",
15 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
16 "feature.planSelection.cta.stayOnFree": "Stay on Free",
17 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
18 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
19 "feature.planSelection.cta.upgradePro": "Choose Professional",
20 "feature.planSelection.free.text": "Basic functionality",
21 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
24 "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.",
25 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
26 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
27 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}?",
28 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
30 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
31 "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.",
32 "feature.shareFranz.action.email": "Send as email", 8 "feature.shareFranz.action.email": "Send as email",
33 "feature.shareFranz.action.facebook": "Share on Facebook", 9 "feature.shareFranz.action.facebook": "Share on Facebook",
34 "feature.shareFranz.action.twitter": "Share on Twitter", 10 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 12 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
37 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 13 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
38 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 14 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
39 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
40 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade": "Upgrade Account",
42 "feature.trialStatusBar.cta": "Upgrade now",
43 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
46 "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.",
47 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
48 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
49 "global.api.unhealthy": "Can't connect to Ferdi online services", 15 "global.api.unhealthy": "Can't connect to Ferdi online services",
50 "global.franzProRequired": "Ferdi Professional Required", 16 "global.franzProRequired": "Ferdi Professional Required",
51 "global.notConnectedToTheInternet": "You are not connected to the internet.", 17 "global.notConnectedToTheInternet": "You are not connected to the internet.",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "Detect language automatically", 19 "global.spellchecking.autodetect": "Detect language automatically",
54 "global.spellchecking.autodetect.short": "Automatic", 20 "global.spellchecking.autodetect.short": "Automatic",
55 "global.spellchecking.language": "Spell checking language", 21 "global.spellchecking.language": "Spell checking language",
56 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
57 "import.headline": "Import your Ferdi 4 services", 22 "import.headline": "Import your Ferdi 4 services",
58 "import.notSupportedHeadline": "Services not yet supported in Ferdi 5", 23 "import.notSupportedHeadline": "Services not yet supported in Ferdi 5",
59 "import.skip.label": "I want to add services manually", 24 "import.skip.label": "I want to add services manually",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "Reload services", 28 "infobar.buttonReloadServices": "Reload services",
64 "infobar.requiredRequestsFailed": "Could not load services and user information", 29 "infobar.requiredRequestsFailed": "Could not load services and user information",
65 "infobar.servicesUpdated": "Your services have been updated.", 30 "infobar.servicesUpdated": "Your services have been updated.",
66 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
67 "infobar.updateAvailable": "A new update for Ferdi is available.", 31 "infobar.updateAvailable": "A new update for Ferdi is available.",
68 "invite.email.label": "Email address", 32 "invite.email.label": "Email address",
69 "invite.headline.friends": "Invite 3 of your friends or colleagues", 33 "invite.headline.friends": "Invite 3 of your friends or colleagues",
@@ -122,9 +86,7 @@
122 "menu.todos": "Todos", 86 "menu.todos": "Todos",
123 "menu.todos.enableTodos": "Enable Todos", 87 "menu.todos.enableTodos": "Enable Todos",
124 "menu.view": "View", 88 "menu.view": "View",
125 "menu.view.enterFullScreen": "Enter Full Screen", 89 "menu.view.reloadFerdi": "Reload Ferdi",
126 "menu.view.exitFullScreen": "Exit Full Screen",
127 "menu.view.reloadFranz": "Reload Ferdi",
128 "menu.view.reloadService": "Reload Service", 90 "menu.view.reloadService": "Reload Service",
129 "menu.view.reloadTodos": "Reload ToDos", 91 "menu.view.reloadTodos": "Reload ToDos",
130 "menu.view.resetZoom": "Actual Size", 92 "menu.view.resetZoom": "Actual Size",
@@ -166,27 +128,6 @@
166 "pricing.features.upToSixServices": "Add up to 6 services", 128 "pricing.features.upToSixServices": "Add up to 6 services",
167 "pricing.features.upToThreeServices": "Add up to 3 services", 129 "pricing.features.upToThreeServices": "Add up to 3 services",
168 "pricing.features.workspaces": "Workspaces", 130 "pricing.features.workspaces": "Workspaces",
169 "pricing.plan.free": "Free",
170 "pricing.plan.legacy": "Premium",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal Monthly",
173 "pricing.plan.personal-yearly": "Personal Yearly",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional Monthly",
176 "pricing.plan.pro-yearly": "Professional Yearly",
177 "pricing.trial.cta.accept": "Start my 14-day Ferdi Professional Trial ",
178 "pricing.trial.cta.skip": "Continue to Ferdi",
179 "pricing.trial.cta.start": "Start using Ferdi",
180 "pricing.trial.error": "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline": "Ferdi Professional includes:",
182 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
183 "pricing.trial.intro.happyMessaging": "Happy messaging,",
184 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
185 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline": "No strings attached",
188 "pricing.trial.terms.noCreditCard": "No credit card required",
189 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action": "Reload {name}", 131 "service.crashHandler.action": "Reload {name}",
191 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 132 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
192 "service.crashHandler.headline": "Oh no!", 133 "service.crashHandler.headline": "Oh no!",
@@ -198,11 +139,6 @@
198 "service.errorHandler.headline": "Oh no!", 139 "service.errorHandler.headline": "Oh no!",
199 "service.errorHandler.message": "Error", 140 "service.errorHandler.message": "Error",
200 "service.errorHandler.text": "{name} has failed to load.", 141 "service.errorHandler.text": "{name} has failed to load.",
201 "service.restrictedHandler.action": "Upgrade Account",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
203 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading": "Loading", 142 "service.webviewLoader.loading": "Loading",
207 "services.getStarted": "Get started", 143 "services.getStarted": "Get started",
208 "services.welcome": "Welcome to Ferdi", 144 "services.welcome": "Welcome to Ferdi",
@@ -219,18 +155,9 @@
219 "settings.account.headlineInvoices": "Invoices", 155 "settings.account.headlineInvoices": "Invoices",
220 "settings.account.headlinePassword": "Change password", 156 "settings.account.headlinePassword": "Change password",
221 "settings.account.headlineProfile": "Update profile", 157 "settings.account.headlineProfile": "Update profile",
222 "settings.account.headlineSubscription": "Your subscription",
223 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
224 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
225 "settings.account.invoiceDownload": "Download",
226 "settings.account.manageSubscription.label": "Manage your subscription",
227 "settings.account.successInfo": "Your changes have been saved", 158 "settings.account.successInfo": "Your changes have been saved",
228 "settings.account.trial": "Free Trial",
229 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices": "Try again", 159 "settings.account.tryReloadServices": "Try again",
232 "settings.account.tryReloadUserInfoRequest": "Try again", 160 "settings.account.tryReloadUserInfoRequest": "Try again",
233 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
234 "settings.account.userInfoRequestFailed": "Could not load user information", 161 "settings.account.userInfoRequestFailed": "Could not load user information",
235 "settings.account.yourLicense": "Your Ferdi License", 162 "settings.account.yourLicense": "Your Ferdi License",
236 "settings.app.buttonClearAllCache": "Clear cache", 163 "settings.app.buttonClearAllCache": "Clear cache",
@@ -284,7 +211,6 @@
284 "settings.recipes.customService.openFolder": "Open folder", 211 "settings.recipes.customService.openFolder": "Open folder",
285 "settings.recipes.headline": "Available services", 212 "settings.recipes.headline": "Available services",
286 "settings.recipes.missingService": "Missing a service?", 213 "settings.recipes.missingService": "Missing a service?",
287 "settings.recipes.mostPopular": "Most popular",
288 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 214 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
289 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 215 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
290 "settings.searchService": "Search service", 216 "settings.searchService": "Search service",
@@ -391,19 +317,6 @@
391 "signup.link.login": "Already have an account, sign in?", 317 "signup.link.login": "Already have an account, sign in?",
392 "signup.password.label": "Password", 318 "signup.password.label": "Password",
393 "signup.submit.label": "Create account", 319 "signup.submit.label": "Create account",
394 "subscription.bestValue": "Best value",
395 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
396 "subscription.cta.allOptions": "See all options",
397 "subscription.cta.choosePlan": "Choose your plan",
398 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
399 "subscription.interval.per": "per {interval}",
400 "subscription.interval.perMonth": "per month",
401 "subscription.interval.perMonthPerUser": "per month & user",
402 "subscription.planItem.upgradeAccount": "Upgrade Account",
403 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
404 "subscription.teaser.intro": "Ferdi 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!",
405 "subscriptionPopup.buttonCancel": "Cancel",
406 "subscriptionPopup.buttonDone": "Done",
407 "tabs.item.deleteService": "Delete service", 320 "tabs.item.deleteService": "Delete service",
408 "tabs.item.disableAudio": "Disable audio", 321 "tabs.item.disableAudio": "Disable audio",
409 "tabs.item.disableNotifications": "Disable notifications", 322 "tabs.item.disableNotifications": "Disable notifications",
@@ -431,7 +344,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "edit", 344 "workspaceDrawer.item.contextMenuEdit": "edit",
432 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 345 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 346 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge": "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 347 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 348 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 349 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json
index a2eddf812..e92dd141f 100644
--- a/src/i18n/locales/sr.json
+++ b/src/i18n/locales/sr.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 13 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
14 "feature.debugger.title": "Publish debugging information", 14 "feature.debugger.title": "Publish debugging information",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "Надоградите налог",
22 "feature.nightlyBuilds.activate": "Активирај", 15 "feature.nightlyBuilds.activate": "Активирај",
23 "feature.nightlyBuilds.cancel": "Odustani", 16 "feature.nightlyBuilds.cancel": "Odustani",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Search...", 27 "feature.quickSwitch.search": "Search...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Пошаљите као Е-мејл", 29 "feature.shareFranz.action.email": "Пошаљите као Е-мејл",
54 "feature.shareFranz.action.facebook": "Поделите на Фејсбуку", 30 "feature.shareFranz.action.facebook": "Поделите на Фејсбуку",
55 "feature.shareFranz.action.twitter": "Поделите на Твитеру", 31 "feature.shareFranz.action.twitter": "Поделите на Твитеру",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Nije moguće pristupiti Ferdi-ovim on-line servisima. ", 36 "global.api.unhealthy": "Nije moguće pristupiti Ferdi-ovim on-line servisima. ",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "Niste povezani sa serverom.", 37 "global.notConnectedToTheInternet": "Niste povezani sa serverom.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Аутоматски", 40 "global.spellchecking.autodetect.short": "Аутоматски",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Uvezite svoje Ferdi 4 servise", 44 "import.headline": "Uvezite svoje Ferdi 4 servise",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Sakrij", 52 "infobar.hide": "Sakrij",
89 "infobar.requiredRequestsFailed": "Nemoguće učitati servise i korisničke informacije", 53 "infobar.requiredRequestsFailed": "Nemoguće učitati servise i korisničke informacije",
90 "infobar.servicesUpdated": "Vaši servisi su ažurirani. ", 54 "infobar.servicesUpdated": "Vaši servisi su ažurirani. ",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Novo ažuriranje Ferdi-a je dostupno. ", 55 "infobar.updateAvailable": "Novo ažuriranje Ferdi-a je dostupno. ",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Vaša e-adresa", 57 "invite.email.label": "Vaša e-adresa",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "Potraži ažuriranja", 88 "menu.app.checkForUpdates": "Potraži ažuriranja",
126 "menu.app.hide": "Sakrij", 89 "menu.app.hide": "Sakrij",
127 "menu.app.hideOthers": "Sakrij ostale", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Izađi", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Postavke", 92 "menu.app.settings": "Postavke",
130 "menu.app.unhide": "Otkrij", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Uredi", 94 "menu.edit": "Uredi",
132 "menu.edit.copy": "Kopiraj", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Iseci", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Obriši", 97 "menu.edit.delete": "Obriši",
135 "menu.edit.emojiSymbols": "Smajliji i simboli", 98 "menu.edit.emojiSymbols": "Smajliji i simboli",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Nalepi", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Налепи не мењајући стил", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Понови", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Изабери све", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Говор", 104 "menu.edit.speech": "Говор",
142 "menu.edit.startDictation": "Започни диктирање", 105 "menu.edit.startDictation": "Започни диктирање",
143 "menu.edit.startSpeaking": "Започни изговор", 106 "menu.edit.startSpeaking": "Започни изговор",
144 "menu.edit.stopSpeaking": "Заустави изговор", 107 "menu.edit.stopSpeaking": "Заустави изговор",
145 "menu.edit.undo": "Поништи", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Датотека", 109 "menu.file": "Датотека",
147 "menu.help": "Помоћ", 110 "menu.help": "Help",
148 "menu.help.changelog": "Дневник измена", 111 "menu.help.changelog": "Дневник измена",
149 "menu.help.debugInfo": "Copy Debug Information", 112 "menu.help.debugInfo": "Copy Debug Information",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Сазнајте више", 116 "menu.help.learnMore": "Сазнајте више",
153 "menu.help.privacy": "Izjava o privatnosti", 117 "menu.help.privacy": "Izjava o privatnosti",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Преглед", 128 "menu.view": "Преглед",
165 "menu.view.back": "Back", 129 "menu.view.back": "Back",
166 "menu.view.enterFullScreen": "Отвори у целом екрану",
167 "menu.view.exitFullScreen": "Напусти цео екран",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Поново учитај Франз", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Поново учирај услугу", 134 "menu.view.reloadService": "Поново учирај услугу",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Стварна величина", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Toggle Dark Mode", 137 "menu.view.toggleDarkMode": "Toggle Dark Mode",
176 "menu.view.toggleDevTools": "Промени алатке за развој", 138 "menu.view.toggleDevTools": "Промени алатке за развој",
177 "menu.view.toggleFullScreen": "Преко целог екрана", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools", 140 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "Увећај приказ", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Умањи приказ", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "У прозору", 144 "menu.window": "Window",
183 "menu.window.close": "Затвори", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Умањи", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Workspaces", 147 "menu.workspaces": "Workspaces",
186 "menu.workspaces.addNewWorkspace": "Add New Workspace...", 148 "menu.workspaces.addNewWorkspace": "Add New Workspace...",
187 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer", 149 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer",
@@ -194,11 +156,7 @@
194 "password.noUser": "Ne postoji ni jedan korisnik s tom e-mail adresom", 156 "password.noUser": "Ne postoji ni jedan korisnik s tom e-mail adresom",
195 "password.submit.label": "Pošalji", 157 "password.submit.label": "Pošalji",
196 "password.successInfo": "Molimo Vas da provjerite vašu e-mail adresu", 158 "password.successInfo": "Molimo Vas da provjerite vašu e-mail adresu",
197 "premiumFeature.button.upgradeAccount": "Надоградите налог",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Osvježi {name}", 170 "service.crashHandler.action": "Osvježi {name}",
236 "service.crashHandler.autoReload": "Pokušaću automatski povratiti {name} u {seconds} sekundi", 171 "service.crashHandler.autoReload": "Pokušaću automatski povratiti {name} u {seconds} sekundi",
237 "service.crashHandler.headline": "O, ne! ", 172 "service.crashHandler.headline": "O, ne! ",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "O, ne! ", 178 "service.errorHandler.headline": "O, ne! ",
244 "service.errorHandler.message": "Greška ", 179 "service.errorHandler.message": "Greška ",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Započnimo! ", 182 "services.getStarted": "Započnimo! ",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Dobrodošli u Ferdi", 186 "services.welcome": "Dobrodošli u Ferdi",
257 "settings.account.account.editButton": "Uredi račun", 187 "settings.account.account.editButton": "Uredi račun",
258 "settings.account.accountType.basic": "Osnovni račun",
259 "settings.account.accountType.premium": "Premium račun",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Ažuriraj profil", 190 "settings.account.buttonSave": "Ažuriraj profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Fakture", 197 "settings.account.headlineInvoices": "Fakture",
270 "settings.account.headlinePassword": "Promijenite lozinku", 198 "settings.account.headlinePassword": "Promijenite lozinku",
271 "settings.account.headlineProfile": "Ažuriraj profil", 199 "settings.account.headlineProfile": "Ažuriraj profil",
272 "settings.account.headlineSubscription": "Vaša pretplata",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Preuzmite",
276 "settings.account.manageSubscription.label": "Upravljajte pretplatama",
277 "settings.account.successInfo": "Vaše promjene su spremljene", 200 "settings.account.successInfo": "Vaše promjene su spremljene",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Pokušajte ponovno", 201 "settings.account.tryReloadServices": "Pokušajte ponovno",
282 "settings.account.tryReloadUserInfoRequest": "Pokušajte ponovno", 202 "settings.account.tryReloadUserInfoRequest": "Pokušajte ponovno",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Nije moguće učitati informacije o korisniku", 203 "settings.account.userInfoRequestFailed": "Nije moguće učitati informacije o korisniku",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Omogući provjeru pravopisa", 227 "settings.app.form.enableSpellchecking": "Omogući provjeru pravopisa",
309 "settings.app.form.enableSystemTray": "Prikaži aplikaciju u sustavskoj traci", 228 "settings.app.form.enableSystemTray": "Prikaži aplikaciju u sustavskoj traci",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Postavke", 259 "settings.app.headline": "Postavke",
341 "settings.app.headlineAdvanced": "Napredne alatke", 260 "settings.app.headlineAdvanced": "Napredne alatke",
342 "settings.app.headlineAppearance": "Izgled", 261 "settings.app.headlineAppearance": "Izgled",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Лозинка", 270 "settings.app.lockedPassword": "Лозинка",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Promjene postavki zahtijevaju ponovni pogon", 272 "settings.app.restartRequired": "Promjene postavki zahtijevaju ponovni pogon",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Кеш", 277 "settings.app.subheadlineCache": "Кеш",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Dostupne usluge", 301 "settings.recipes.headline": "Dostupne usluge",
383 "settings.recipes.missingService": "Da li neki servis nedostaje?", 302 "settings.recipes.missingService": "Da li neki servis nedostaje?",
384 "settings.recipes.mostPopular": "Najpopularniji",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Usluga uspješno dodana", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Usluga uspješno dodana",
387 "settings.searchService": "Претражи услуге", 305 "settings.searchService": "Претражи услуге",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Dodaj {name}", 309 "settings.service.form.addServiceHeadline": "Dodaj {name}",
392 "settings.service.form.availableServices": "Dostupne usluge", 310 "settings.service.form.availableServices": "Dostupne usluge",
393 "settings.service.form.customUrl": "Prilagođen server", 311 "settings.service.form.customUrl": "Prilagođen server",
394 "settings.service.form.customUrlPremiumInfo": "Da bi ste dodali samo-hostovane usluge, potreban vam je Premium račun.",
395 "settings.service.form.customUrlUpgradeAccount": "Nadogradite Vaš račun",
396 "settings.service.form.customUrlValidationError": "Nije moguće odobriti prilagođeno {name} servera.", 312 "settings.service.form.customUrlValidationError": "Nije moguće odobriti prilagođeno {name} servera.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Tim", 380 "settings.team.headline": "Tim",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Tvrtka", 385 "settings.user.form.accountType.company": "Tvrtka",
471 "settings.user.form.accountType.individual": "Pojedinac", 386 "settings.user.form.accountType.individual": "Pojedinac",
472 "settings.user.form.accountType.label": "Tip računa", 387 "settings.user.form.accountType.label": "Tip računa",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Imate račun? Prijavite se.", 431 "signup.link.login": "Imate račun? Prijavite se.",
517 "signup.password.label": "Лозинка", 432 "signup.password.label": "Лозинка",
518 "signup.submit.label": "Napravite novi račun", 433 "signup.submit.label": "Napravite novi račun",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Odustani",
531 "subscriptionPopup.buttonDone": "Završeno",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Izbriši uslugu", 435 "tabs.item.deleteService": "Izbriši uslugu",
534 "tabs.item.disableAudio": "Onemogući zvuk", 436 "tabs.item.disableAudio": "Onemogući zvuk",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Onemogući obavijesti", 438 "tabs.item.disableNotifications": "Onemogući obavijesti",
536 "tabs.item.disableService": "Onemogući servis", 439 "tabs.item.disableService": "Onemogući servis",
537 "tabs.item.edit": "Uredi", 440 "tabs.item.edit": "Uredi",
538 "tabs.item.enableAudio": "Omogućite zvuk", 441 "tabs.item.enableAudio": "Omogućite zvuk",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Omogućite obavijesti", 443 "tabs.item.enableNotification": "Omogućite obavijesti",
540 "tabs.item.enableService": "Omogućite usluge", 444 "tabs.item.enableService": "Omogućite usluge",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Ponovno učitavanje", 446 "tabs.item.reload": "Ponovno učitavanje",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} није валидно", 448 "validation.email": "{field} није валидно",
543 "validation.minLength": "{field} треба да буде најмање {length} карактера дугачко", 449 "validation.minLength": "{field} треба да буде најмање {length} карактера дугачко",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/sv.json b/src/i18n/locales/sv.json
index c6bd739e6..9545511b4 100644
--- a/src/i18n/locales/sv.json
+++ b/src/i18n/locales/sv.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Åh nej! Ferdi förlorade anslutningen till {name}.", 12 "connectionLostBanner.message": "Åh nej! Ferdi förlorade anslutningen till {name}.",
13 "feature.announcements.changelog.headline": "Ändringar i Ferdi {version}", 13 "feature.announcements.changelog.headline": "Ändringar i Ferdi {version}",
14 "feature.debugger.title": "Skicka felsökningsinformation", 14 "feature.debugger.title": "Skicka felsökningsinformation",
15 "feature.delayApp.headline": "Vänligen köp en Ferdi Supporter-licens för att slippa vänta",
16 "feature.delayApp.text": "Ferdi återupptas om {seconds} sekunder.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Skaffa en Ferdi Supporter-licens",
21 "feature.delayApp.upgrade.actionShort": "Uppgradera konto",
22 "feature.nightlyBuilds.activate": "Aktivera", 15 "feature.nightlyBuilds.activate": "Aktivera",
23 "feature.nightlyBuilds.cancel": "Avbryt", 16 "feature.nightlyBuilds.cancel": "Avbryt",
24 "feature.nightlyBuilds.info": "Nattliga kompileringar är väldigt experimentella versioner av Ferdi som kan innehålla ofärdiga och ännu ej testade funktioner. Nattliga kompilering är i första hand tänkt för utvecklare för att kunna testa hur nya funktioner fungerar och presterar. Är du osäker på vad detta innebär rekommenderas du att inte aktivera nattliga kompileringar.", 17 "feature.nightlyBuilds.info": "Nattliga kompileringar är väldigt experimentella versioner av Ferdi som kan innehålla ofärdiga och ännu ej testade funktioner. Nattliga kompilering är i första hand tänkt för utvecklare för att kunna testa hur nya funktioner fungerar och presterar. Är du osäker på vad detta innebär rekommenderas du att inte aktivera nattliga kompileringar.",
25 "feature.nightlyBuilds.title": "Nattlig kompilering", 18 "feature.nightlyBuilds.title": "Nattlig kompilering",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Ett fel uppstod när felsökningsinformationen skulle skickas. Försök igen senare eller se konsolen för mer information.", 19 "feature.publishDebugInfo.error": "Ett fel uppstod när felsökningsinformationen skulle skickas. Försök igen senare eller se konsolen för mer information.",
43 "feature.publishDebugInfo.info": "Genom att skicka oss din felsökningsinformation hjälper du oss att hitta problem och fel i Ferdi. Genom att skicka din felsökningsinformation godkänner du Ferdi-debuggerns sekretesspolicy och användarvillkor", 20 "feature.publishDebugInfo.info": "Genom att skicka oss din felsökningsinformation hjälper du oss att hitta problem och fel i Ferdi. Genom att skicka din felsökningsinformation godkänner du Ferdi-debuggerns sekretesspolicy och användarvillkor",
44 "feature.publishDebugInfo.privacy": "Integritetspolicy", 21 "feature.publishDebugInfo.privacy": "Integritetspolicy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Välj en tjänst med TAB, ↑ and ↓. Öppna en tjänst med ENTER.", 26 "feature.quickSwitch.info": "Välj en tjänst med TAB, ↑ and ↓. Öppna en tjänst med ENTER.",
50 "feature.quickSwitch.search": "Sök...", 27 "feature.quickSwitch.search": "Sök...",
51 "feature.quickSwitch.title": "Snabbväxling", 28 "feature.quickSwitch.title": "Snabbväxling",
52 "feature.serviceLimit.limitReached": "Du har lagt till {amount} av {limit} tjänster som ingår i ditt abonnemang. Uppgradera ditt konto för att lägga till fler tjänster.",
53 "feature.shareFranz.action.email": "Skicka som e-post", 29 "feature.shareFranz.action.email": "Skicka som e-post",
54 "feature.shareFranz.action.facebook": "Dela på Facebook", 30 "feature.shareFranz.action.facebook": "Dela på Facebook",
55 "feature.shareFranz.action.twitter": "Dela på Twitter", 31 "feature.shareFranz.action.twitter": "Dela på Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Jag har lagt till {count} tjänster till Ferdi! Skaffa en gratis app för WhatsApp, Messenger, Slack, Skype och många fler på www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Jag har lagt till {count} tjänster till Ferdi! Skaffa en gratis app för WhatsApp, Messenger, Slack, Skype och många fler på www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Jag har lagt till {count} tjänster till Ferdi! Skaffa en gratis app för WhatsApp, Messenger, Slack, Skype och många fler på www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "Jag har lagt till {count} tjänster till Ferdi! Skaffa en gratis app för WhatsApp, Messenger, Slack, Skype och många fler på www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Berätta för dina vänner och kollegor hur grymt Ferdi är och hjälp oss att sprida ordet.", 35 "feature.shareFranz.text": "Berätta för dina vänner och kollegor hur grymt Ferdi är och hjälp oss att sprida ordet.",
60 "feature.todos.premium.info": "Ferdi Todos är tillgängligt för premiumanvändare nu!",
61 "feature.todos.premium.rollout": "Alla andra får lov att vänta lite längre.",
62 "feature.todos.premium.upgrade": "Uppgradera konto",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Kan inte ansluta till Ferdis onlinetjänster", 36 "global.api.unhealthy": "Kan inte ansluta till Ferdis onlinetjänster",
71 "global.franzProRequired": "Ferdi Professional krävs",
72 "global.notConnectedToTheInternet": "Du är inte ansluten till Internet.", 37 "global.notConnectedToTheInternet": "Du är inte ansluten till Internet.",
73 "global.spellchecker.useDefault": "Använd systemstandard ({default})", 38 "global.spellchecker.useDefault": "Använd systemstandard ({default})",
74 "global.spellchecking.autodetect": "Identifiera språk automatiskt", 39 "global.spellchecking.autodetect": "Identifiera språk automatiskt",
75 "global.spellchecking.autodetect.short": "Automatisk", 40 "global.spellchecking.autodetect.short": "Automatisk",
76 "global.spellchecking.language": "Rättstavningsspråk", 41 "global.spellchecking.language": "Rättstavningsspråk",
77 "global.upgradeButton.upgradeToPro": "Uppgradera till Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Importera dina Ferdi 4-tjänster", 44 "import.headline": "Importera dina Ferdi 4-tjänster",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Dölj", 52 "infobar.hide": "Dölj",
89 "infobar.requiredRequestsFailed": "Kunde inte ladda tjänster och användarinformation", 53 "infobar.requiredRequestsFailed": "Kunde inte ladda tjänster och användarinformation",
90 "infobar.servicesUpdated": "Dina tjänster har uppdaterats.", 54 "infobar.servicesUpdated": "Dina tjänster har uppdaterats.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "En ny uppdatering för Ferdi finns tillgänglig.", 55 "infobar.updateAvailable": "En ny uppdatering för Ferdi finns tillgänglig.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "E-postadress", 57 "invite.email.label": "E-postadress",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Dölj menyraden automatiskt", 87 "menu.app.autohideMenuBar": "Dölj menyraden automatiskt",
125 "menu.app.checkForUpdates": "Sök efter uppdateringar", 88 "menu.app.checkForUpdates": "Sök efter uppdateringar",
126 "menu.app.hide": "Dölj", 89 "menu.app.hide": "Dölj",
127 "menu.app.hideOthers": "Dölj övriga", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Avsluta", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Inställningar", 92 "menu.app.settings": "Inställningar",
130 "menu.app.unhide": "Sluta dölja", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Redigera", 94 "menu.edit": "Redigera",
132 "menu.edit.copy": "Kopiera", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Klipp ut", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Radera", 97 "menu.edit.delete": "Radera",
135 "menu.edit.emojiSymbols": "Emojis & symboler", 98 "menu.edit.emojiSymbols": "Emojis & symboler",
136 "menu.edit.findInPage": "Hitta på sidan", 99 "menu.edit.findInPage": "Hitta på sidan",
137 "menu.edit.paste": "Klistra in", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Klistra in och matcha stil", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Gör om", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Markera allt", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Tal", 104 "menu.edit.speech": "Tal",
142 "menu.edit.startDictation": "Börja diktera", 105 "menu.edit.startDictation": "Börja diktera",
143 "menu.edit.startSpeaking": "Börja tala", 106 "menu.edit.startSpeaking": "Börja tala",
144 "menu.edit.stopSpeaking": "Sluta prata", 107 "menu.edit.stopSpeaking": "Sluta prata",
145 "menu.edit.undo": "Ångra", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Fil", 109 "menu.file": "Fil",
147 "menu.help": "Hlp", 110 "menu.help": "Help",
148 "menu.help.changelog": "Ändringslogg", 111 "menu.help.changelog": "Ändringslogg",
149 "menu.help.debugInfo": "Kopiera felsökningsinformation", 112 "menu.help.debugInfo": "Kopiera felsökningsinformation",
150 "menu.help.debugInfoCopiedBody": "Din felsökningsinformation har kopierats till ditt urklipp.", 113 "menu.help.debugInfoCopiedBody": "Din felsökningsinformation har kopierats till ditt urklipp.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi felsökningsinformation", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi felsökningsinformation",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Läs mer", 116 "menu.help.learnMore": "Läs mer",
153 "menu.help.privacy": "Integritetspolicy", 117 "menu.help.privacy": "Integritetspolicy",
154 "menu.help.publishDebugInfo": "Skicka felsökningsinformation", 118 "menu.help.publishDebugInfo": "Skicka felsökningsinformation",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Aktivera Todos", 127 "menu.todos.enableTodos": "Aktivera Todos",
164 "menu.view": "Visa", 128 "menu.view": "Visa",
165 "menu.view.back": "Tillbaka", 129 "menu.view.back": "Tillbaka",
166 "menu.view.enterFullScreen": "Helskärmsläge",
167 "menu.view.exitFullScreen": "Lämna helskärmsläget",
168 "menu.view.forward": "Framåt", 130 "menu.view.forward": "Framåt",
169 "menu.view.lockFerdi": "Lås Ferdi", 131 "menu.view.lockFerdi": "Lås Ferdi",
170 "menu.view.openQuickSwitch": "Öppna snabbväxling", 132 "menu.view.openQuickSwitch": "Öppna snabbväxling",
171 "menu.view.reloadFranz": "Ladda om Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Ladda om tjänst", 134 "menu.view.reloadService": "Ladda om tjänst",
173 "menu.view.reloadTodos": "Ladda om: AttGöra", 135 "menu.view.reloadTodos": "Ladda om: AttGöra",
174 "menu.view.resetZoom": "Originalstorlek", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Växla mörkt läge", 137 "menu.view.toggleDarkMode": "Växla mörkt läge",
176 "menu.view.toggleDevTools": "Växla utvecklarverktyg", 138 "menu.view.toggleDevTools": "Växla utvecklarverktyg",
177 "menu.view.toggleFullScreen": "Växla helskärmsläge", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Växla tjänsteverktyg för utvecklare", 140 "menu.view.toggleServiceDevTools": "Växla tjänsteverktyg för utvecklare",
179 "menu.view.toggleTodosDevTools": "Växla Todos utvecklarverktyg", 141 "menu.view.toggleTodosDevTools": "Växla Todos utvecklarverktyg",
180 "menu.view.zoomIn": "Zooma in", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Zooma ut", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "nster", 144 "menu.window": "Window",
183 "menu.window.close": "Stäng", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Minimera", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Arbetsytor", 147 "menu.workspaces": "Arbetsytor",
186 "menu.workspaces.addNewWorkspace": "Skapa ny arbetsyta...", 148 "menu.workspaces.addNewWorkspace": "Skapa ny arbetsyta...",
187 "menu.workspaces.closeWorkspaceDrawer": "Stäng arbetsytan", 149 "menu.workspaces.closeWorkspaceDrawer": "Stäng arbetsytan",
@@ -194,11 +156,7 @@
194 "password.noUser": "Ingen användare med den e-postadressen hittades", 156 "password.noUser": "Ingen användare med den e-postadressen hittades",
195 "password.submit.label": "Skicka", 157 "password.submit.label": "Skicka",
196 "password.successInfo": "Vänligen kontrollera din e-post", 158 "password.successInfo": "Vänligen kontrollera din e-post",
197 "premiumFeature.button.upgradeAccount": "Uppgradera konto",
198 "pricing.features.accountSync": "Synkronisering av konto", 159 "pricing.features.accountSync": "Synkronisering av konto",
199 "pricing.features.adFree": "Reklamfritt för alltid",
200 "pricing.features.appDelays": "Inga vänteskärmar",
201 "pricing.features.appDelaysEnabled": "Tillfälliga väntande skärmar",
202 "pricing.features.customWebsites": "Lägg till egna webbplatser", 160 "pricing.features.customWebsites": "Lägg till egna webbplatser",
203 "pricing.features.desktopNotifications": "Skrivbordsaviseringar", 161 "pricing.features.desktopNotifications": "Skrivbordsaviseringar",
204 "pricing.features.onPremise": "Lokala tjänster och andra värdtjänster", 162 "pricing.features.onPremise": "Lokala tjänster och andra värdtjänster",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Hantera grupp", 166 "pricing.features.teamManagement": "Hantera grupp",
209 "pricing.features.thirdPartyServices": "Installera tjänster från tredje part", 167 "pricing.features.thirdPartyServices": "Installera tjänster från tredje part",
210 "pricing.features.unlimitedServices": "Lägg till obegränsat antal tjänster", 168 "pricing.features.unlimitedServices": "Lägg till obegränsat antal tjänster",
211 "pricing.features.upToSixServices": "Lägg till upp till 6 tjänster",
212 "pricing.features.upToThreeServices": "Lägg till upp till 3 tjänster",
213 "pricing.features.workspaces": "Arbetsytor", 169 "pricing.features.workspaces": "Arbetsytor",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal månatlig",
218 "pricing.plan.personal-yearly": "Ferdi Professional årsvis",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional månatlig",
221 "pricing.plan.pro-yearly": "Ferdi Professional årsvis",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Ladda om {name}", 170 "service.crashHandler.action": "Ladda om {name}",
236 "service.crashHandler.autoReload": "Försöker automatiskt återställa {name} om {seconds} sekunder", 171 "service.crashHandler.autoReload": "Försöker automatiskt återställa {name} om {seconds} sekunder",
237 "service.crashHandler.headline": "Åh nej!", 172 "service.crashHandler.headline": "Åh nej!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Åh nej!", 178 "service.errorHandler.headline": "Åh nej!",
244 "service.errorHandler.message": "Fel", 179 "service.errorHandler.message": "Fel",
245 "service.errorHandler.text": "{name} kunde inte laddas.", 180 "service.errorHandler.text": "{name} kunde inte laddas.",
246 "service.restrictedHandler.action": "Uppgradera konto",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional krävs",
248 "service.restrictedHandler.customUrl.text": "Vänligen uppgradera till Ferdi Professional-abonnemanget för att använda anpassade webbadresser & själv-hostade tjänster.",
249 "service.restrictedHandler.serviceLimit.headline": "Du har nått gränsen för antalet tjänster.",
250 "service.restrictedHandler.serviceLimit.text": "Uppgradera ditt konto för att använda mer än {count} tjänster.",
251 "service.webviewLoader.loading": "Laddar {service}", 181 "service.webviewLoader.loading": "Laddar {service}",
252 "services.getStarted": "Kom igång", 182 "services.getStarted": "Kom igång",
253 "services.login": "Logga in för att använda Ferdi.", 183 "services.login": "Logga in för att använda Ferdi.",
254 "services.serverInfo": "Om du vill kan du ändra din Ferdi-server genom att klicka på kugghjulet i det nedre vänstra hörnet.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Använd Ferdi utan ett konto", 185 "services.serverless": "Använd Ferdi utan ett konto",
256 "services.welcome": "Välkommen till Ferdi", 186 "services.welcome": "Välkommen till Ferdi",
257 "settings.account.account.editButton": "Redigera konto", 187 "settings.account.account.editButton": "Redigera konto",
258 "settings.account.accountType.basic": "Standardkonto",
259 "settings.account.accountType.premium": "Premium Supporterkonto",
260 "settings.account.accountUnavailable": "Kontot är inte tillgängligt", 188 "settings.account.accountUnavailable": "Kontot är inte tillgängligt",
261 "settings.account.accountUnavailableInfo": "Du använder Ferdi utan ett konto. Om du vill använda Ferdi med ett konto och hålla dina tjänster synkroniserade mellan installationer, välj en server i fliken Inställningar och logga in.", 189 "settings.account.accountUnavailableInfo": "Du använder Ferdi utan ett konto. Om du vill använda Ferdi med ett konto och hålla dina tjänster synkroniserade mellan installationer, välj en server i fliken Inställningar och logga in.",
262 "settings.account.buttonSave": "Uppdatera profil", 190 "settings.account.buttonSave": "Uppdatera profil",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Fakturor", 197 "settings.account.headlineInvoices": "Fakturor",
270 "settings.account.headlinePassword": "Ändra lösenord", 198 "settings.account.headlinePassword": "Ändra lösenord",
271 "settings.account.headlineProfile": "Uppdatera profil", 199 "settings.account.headlineProfile": "Uppdatera profil",
272 "settings.account.headlineSubscription": "Ditt abonnemang",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Uppgradera ditt konto för att få den hela Ferdi-upplevelsen",
275 "settings.account.invoiceDownload": "Nerladdning",
276 "settings.account.manageSubscription.label": "Hantera ditt abonnemang",
277 "settings.account.successInfo": "Dina ändringar har sparats", 200 "settings.account.successInfo": "Dina ändringar har sparats",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Försök igen", 201 "settings.account.tryReloadServices": "Försök igen",
282 "settings.account.tryReloadUserInfoRequest": "Försök igen", 202 "settings.account.tryReloadUserInfoRequest": "Försök igen",
283 "settings.account.upgradeToPro.label": "Uppgradera till Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Kunde inte ladda användarinformation", 203 "settings.account.userInfoRequestFailed": "Kunde inte ladda användarinformation",
285 "settings.account.yourLicense": "Din Ferdi-licens", 204 "settings.account.yourLicense": "Din Ferdi-licens",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Aktivera stavningskontroll", 227 "settings.app.form.enableSpellchecking": "Aktivera stavningskontroll",
309 "settings.app.form.enableSystemTray": "Visa Ferdi i systemfältet", 228 "settings.app.form.enableSystemTray": "Visa Ferdi i systemfältet",
310 "settings.app.form.enableTodos": "Aktivera Ferdi Todos", 229 "settings.app.form.enableTodos": "Aktivera Ferdi Todos",
311 "settings.app.form.hibernate": "Sätt tjänst i vila",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Strategi för vila", 231 "settings.app.form.hibernationStrategy": "Strategi för vila",
314 "settings.app.form.iconSize": "Ikonstorlek för tjänster", 232 "settings.app.form.iconSize": "Ikonstorlek för tjänster",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Aktivera globalt mörkt läge", 255 "settings.app.form.universalDarkMode": "Aktivera globalt mörkt läge",
338 "settings.app.form.useTouchIdToUnlock": "Tillåt att TouchID används för att låsa upp Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Tillåt att TouchID används för att låsa upp Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Inställningar", 259 "settings.app.headline": "Inställningar",
341 "settings.app.headlineAdvanced": "Avancerat", 260 "settings.app.headlineAdvanced": "Avancerat",
342 "settings.app.headlineAppearance": "Utseende", 261 "settings.app.headlineAppearance": "Utseende",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "Som standard kommer Ferdi att hålla alla dina tjänster öppna och laddade i bakgrunden så att de är redo när du vill använda dem. Viloläget kommer att stänga dina tjänster efter ett angivet belopp. Detta är användbart för att spara på arbetsminne eller se till att tjänster inte saktar ner datorn.", 266 "settings.app.hibernateInfo": "Som standard kommer Ferdi att hålla alla dina tjänster öppna och laddade i bakgrunden så att de är redo när du vill använda dem. Viloläget kommer att stänga dina tjänster efter ett angivet belopp. Detta är användbart för att spara på arbetsminne eller se till att tjänster inte saktar ner datorn.",
348 "settings.app.inactivityLockInfo": "Antal minuter av inaktivitet, varefter Ferdi låses automatiskt. Ange 0 för att inaktivera", 267 "settings.app.inactivityLockInfo": "Antal minuter av inaktivitet, varefter Ferdi låses automatiskt. Ange 0 för att inaktivera",
349 "settings.app.languageDisclaimer": "Engelska och tyska är officella översättningar. Övriga språk har översatts av gemenskapen.", 268 "settings.app.languageDisclaimer": "Engelska och tyska är officella översättningar. Övriga språk har översatts av gemenskapen.",
350 "settings.app.lockInfo": "Lösenordslås låter dig skydda dina meddelanden.\nMed lösenordslås kommer du bli ombedd att ange ditt lösenord varje gång du startar Ferdi. Du kan också låsa Ferdi själv med hjälp av låssymbolen i det nedre vänstra hörnet eller med kortkommandot CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Lösenord", 270 "settings.app.lockedPassword": "Lösenord",
352 "settings.app.lockedPasswordInfo": "Se till att du anger ett lösenord du kommer att komma ihåg.\nOm du tappar bort detta lösenord måste du installera om Ferdi.", 271 "settings.app.lockedPasswordInfo": "Se till att du anger ett lösenord du kommer att komma ihåg.\nOm du tappar bort detta lösenord måste du installera om Ferdi.",
353 "settings.app.restartRequired": "Ändringar kräver omstart", 272 "settings.app.restartRequired": "Ändringar kräver omstart",
354 "settings.app.scheduledDNDInfo": "Schemalagd \"Stör ej\" låter dig definiera en tidsperiod inom vilken du inte vill få meddelanden från Ferdi.", 273 "settings.app.scheduledDNDInfo": "Schemalagd \"Stör ej\" låter dig definiera en tidsperiod inom vilken du inte vill få meddelanden från Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Tid i 24-timmarsformat. Sluttid kan vara före starttid (t.ex. start 17:00, slut 09:00) för att aktivera \"Stör ej\" över natten.", 274 "settings.app.scheduledDNDTimeInfo": "Tid i 24-timmarsformat. Sluttid kan vara före starttid (t.ex. start 17:00, slut 09:00) för att aktivera \"Stör ej\" över natten.",
356 "settings.app.sentryInfo": "Genom att skicka telemetridata kan vi hitta buggar i Ferdi - vi kommer inte att skicka någon personlig information (som dina meddelandedata)! Att ändra detta alternativ kräver en omstart av Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "Denna server kommer att användas för \"Ferdi Todo\"-funktionen.", 278 "settings.app.todoServerInfo": "Denna server kommer att användas för \"Ferdi Todo\"-funktionen.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Öppna mapp", 300 "settings.recipes.customService.openFolder": "Öppna mapp",
382 "settings.recipes.headline": "Tillgängliga tjänster", 301 "settings.recipes.headline": "Tillgängliga tjänster",
383 "settings.recipes.missingService": "Saknar du en tjänst?", 302 "settings.recipes.missingService": "Saknar du en tjänst?",
384 "settings.recipes.mostPopular": "Mest populära",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Tjänsten har lagts till", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Tjänsten har lagts till",
387 "settings.searchService": "Sök efter tjänst", 305 "settings.searchService": "Sök efter tjänst",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Lägg till {name}", 309 "settings.service.form.addServiceHeadline": "Lägg till {name}",
392 "settings.service.form.availableServices": "Tillgängliga tjänster", 310 "settings.service.form.availableServices": "Tillgängliga tjänster",
393 "settings.service.form.customUrl": "Anpassad server", 311 "settings.service.form.customUrl": "Anpassad server",
394 "settings.service.form.customUrlPremiumInfo": "För att lägga till egna tjänster behöver du ett Ferdi Premium supporter-konto.",
395 "settings.service.form.customUrlUpgradeAccount": "Uppgradera ditt konto",
396 "settings.service.form.customUrlValidationError": "Kunde inte validera anpassad {name} -server.", 312 "settings.service.form.customUrlValidationError": "Kunde inte validera anpassad {name} -server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Hantera Franz-grupp", 378 "settings.team.contentHeadline": "Hantera Franz-grupp",
463 "settings.team.copy": "Grupphanteringen i Franz låter dig hantera Franz-abonnemang för flera användare. Observera att ett Franz Premium-abonnemang inte ger dig några extra funktioner i Ferdi: Den enda anledningen till att du fortfarande har tillgång till grupphanteringen är att du kan hantera dina äldre Franz-grupper så att du inte förlorar någon funktionalitet i hanteringen av ditt konto.", 379 "settings.team.copy": "Grupphanteringen i Franz låter dig hantera Franz-abonnemang för flera användare. Observera att ett Franz Premium-abonnemang inte ger dig några extra funktioner i Ferdi: Den enda anledningen till att du fortfarande har tillgång till grupphanteringen är att du kan hantera dina äldre Franz-grupper så att du inte förlorar någon funktionalitet i hanteringen av ditt konto.",
464 "settings.team.headline": "Grupp", 380 "settings.team.headline": "Grupp",
465 "settings.team.intro": "Du använder för närvarande Franz servrar, vilket är anledningen till att du har tillgång till grupphanteringen.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Hantera din grupp på meetfranz.com", 382 "settings.team.manageAction": "Hantera din grupp på meetfranz.com",
467 "settings.team.teamsUnavailable": "Grupper är inte tillgängliga", 383 "settings.team.teamsUnavailable": "Grupper är inte tillgängliga",
468 "settings.team.teamsUnavailableInfo": "Grupper är för närvarande endast tillgängliga när du använder Franz Server och har betalat för Franz Professional. Vänligen ändra din server till https://api.franzinfra.com för att använda gruppfunktionalitet.", 384 "settings.team.teamsUnavailableInfo": "Grupper är för närvarande endast tillgängliga när du använder Franz Server och har betalat för Franz Professional. Vänligen ändra din server till https://api.franzinfra.com för att använda gruppfunktionalitet.",
469 "settings.team.upgradeAction": "Uppgradera ditt konto",
470 "settings.user.form.accountType.company": "Företag", 385 "settings.user.form.accountType.company": "Företag",
471 "settings.user.form.accountType.individual": "Privatperson", 386 "settings.user.form.accountType.individual": "Privatperson",
472 "settings.user.form.accountType.label": "Kontotyp", 387 "settings.user.form.accountType.label": "Kontotyp",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Har du redan ett konto? Logga in", 431 "signup.link.login": "Har du redan ett konto? Logga in",
517 "signup.password.label": "Lösenord", 432 "signup.password.label": "Lösenord",
518 "signup.submit.label": "Skapa konto", 433 "signup.submit.label": "Skapa konto",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "Se alla alternativ",
522 "subscription.cta.choosePlan": "Välj abonnemang",
523 "subscription.includedProFeatures": "I Ferdi Professional-abonnemanget ingår:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per månad",
526 "subscription.interval.perMonthPerUser": "per månad & användare",
527 "subscription.planItem.upgradeAccount": "Uppgradera konto",
528 "subscription.teaser.includedFeatures": "De avgiftsbelagda Ferdi-abonnemangen inkluderar:",
529 "subscription.teaser.intro": "Ferdi 5 kommer med ett brett utbud av nya funktioner för att förbättra din dagliga kommunikation. Kolla in våra nya abonnemang och ta reda på vilket av dem som passar dig bäst!",
530 "subscriptionPopup.buttonCancel": "Avbryt",
531 "subscriptionPopup.buttonDone": "Klar",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Ta bort tjänst", 435 "tabs.item.deleteService": "Ta bort tjänst",
534 "tabs.item.disableAudio": "Inaktivera ljud", 436 "tabs.item.disableAudio": "Inaktivera ljud",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Inaktivera aviseringar", 438 "tabs.item.disableNotifications": "Inaktivera aviseringar",
536 "tabs.item.disableService": "Inaktivera tjänst", 439 "tabs.item.disableService": "Inaktivera tjänst",
537 "tabs.item.edit": "Redigera", 440 "tabs.item.edit": "Redigera",
538 "tabs.item.enableAudio": "Aktivera ljud", 441 "tabs.item.enableAudio": "Aktivera ljud",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Aktivera aviseringar", 443 "tabs.item.enableNotification": "Aktivera aviseringar",
540 "tabs.item.enableService": "Aktivera tjänst", 444 "tabs.item.enableService": "Aktivera tjänst",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Ladda om", 446 "tabs.item.reload": "Ladda om",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} är felaktig", 448 "validation.email": "{field} är felaktig",
543 "validation.minLength": "{field} bör vara minst {length} tecken lång", 449 "validation.minLength": "{field} bör vara minst {length} tecken lång",
544 "validation.oneRequired": "Minst en krävs", 450 "validation.oneRequired": "Minst en krävs",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Arbetsytor", 462 "workspaceDrawer.headline": "Arbetsytor",
557 "workspaceDrawer.item.contextMenuEdit": "redigera", 463 "workspaceDrawer.item.contextMenuEdit": "redigera",
558 "workspaceDrawer.item.noServicesAddedYet": "Inga tjänster har lagts till", 464 "workspaceDrawer.item.noServicesAddedYet": "Inga tjänster har lagts till",
559 "workspaceDrawer.premiumCtaButtonLabel": "Skapa din första arbetsyta",
560 "workspaceDrawer.proFeatureBadge": "Premium-funktion",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Återaktivera premiumkonto",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi-arbetsytor låter dig fokusera på det som är viktigt just nu. Konfigurera olika uppsättningar av tjänster och växla enkelt mellan dem när som helst.</p><p>Du bestämmer vilka tjänster du behöver när och var, så att vi kan hjälpa dig att hålla koll på läget - eller enkelt koppla bort från jobbet när du vill.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi-arbetsytor låter dig fokusera på det som är viktigt just nu. Konfigurera olika uppsättningar av tjänster och växla enkelt mellan dem när som helst.</p><p>Du bestämmer vilka tjänster du behöver när och var, så att vi kan hjälpa dig att hålla koll på läget - eller enkelt koppla bort från jobbet när du vill.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Redigera inställningar för arbetsytor", 466 "workspaceDrawer.workspacesSettingsTooltip": "Redigera inställningar för arbetsytor",
564 "workspaces.switchingIndicator.switchingTo": "Byter till" 467 "workspaces.switchingIndicator.switchingTo": "Byter till"
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index 25b528cd1..651f0da50 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Nayır, nolamaz! Ferdi {name} ile bağlantısını yitirdi.", 12 "connectionLostBanner.message": "Nayır, nolamaz! Ferdi {name} ile bağlantısını yitirdi.",
13 "feature.announcements.changelog.headline": "Ferdi {version} Sürümündeki Değişiklikler", 13 "feature.announcements.changelog.headline": "Ferdi {version} Sürümündeki Değişiklikler",
14 "feature.debugger.title": "Hata ayıklama bilgisini yayımla", 14 "feature.debugger.title": "Hata ayıklama bilgisini yayımla",
15 "feature.delayApp.headline": "Beklememek için Ferdi Destek Lisansı'nı satın alın",
16 "feature.delayApp.text": "Ferdi {seconds} saniye sonra devam edecek.",
17 "feature.delayApp.trial.action": "Evet, Ferdi Professional'ın 14 günlük ücretsiz denemesini istiyorum",
18 "feature.delayApp.trial.actionShort": "Ferdi Professional'ın denemesini aktive et",
19 "feature.delayApp.trial.headline": "Ferdi Professional'ın 14 günlük denemesini et ve sıranın önüne geç",
20 "feature.delayApp.upgrade.action": "Ferdi Destek Lisansı'nı alın",
21 "feature.delayApp.upgrade.actionShort": "Hesabı Yükselt",
22 "feature.nightlyBuilds.activate": "Etkinleştir", 15 "feature.nightlyBuilds.activate": "Etkinleştir",
23 "feature.nightlyBuilds.cancel": "İptal", 16 "feature.nightlyBuilds.cancel": "İptal",
24 "feature.nightlyBuilds.info": "Nightly yapılar Ferdi'nin deneysel sürümleri olup tamamlanmamış özellikler içerebilir. Bu nightly yapılar genellikle geliştiriciler tarafından yeni özellikleri deneyip geliştirmek için kullanılır. Ne yaptığınızı bilmiyorsanız nightly yapıları etkinleştirmeyin.", 17 "feature.nightlyBuilds.info": "Nightly yapılar Ferdi'nin deneysel sürümleri olup tamamlanmamış özellikler içerebilir. Bu nightly yapılar genellikle geliştiriciler tarafından yeni özellikleri deneyip geliştirmek için kullanılır. Ne yaptığınızı bilmiyorsanız nightly yapıları etkinleştirmeyin.",
25 "feature.nightlyBuilds.title": "Nightly Yapılar", 18 "feature.nightlyBuilds.title": "Nightly Yapılar",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Privacy policy", 21 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "TAB, ↑ ve ↓ ile bir servis seç. ENTER ile bir servisi aç.", 26 "feature.quickSwitch.info": "TAB, ↑ ve ↓ ile bir servis seç. ENTER ile bir servisi aç.",
50 "feature.quickSwitch.search": "Ara...", 27 "feature.quickSwitch.search": "Ara...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "feature.serviceLimit.limitReached": "Hesabında {limit} adet servis limiti olmasına rağmen {amount} servis ekledin. Lütfen daha fazla servis eklemek için hesabını yükselt.",
53 "feature.shareFranz.action.email": "Mail olarak gönder", 29 "feature.shareFranz.action.email": "Mail olarak gönder",
54 "feature.shareFranz.action.facebook": "Facebook'ta Paylaş", 30 "feature.shareFranz.action.facebook": "Facebook'ta Paylaş",
55 "feature.shareFranz.action.twitter": "Twitter'da Paylaş", 31 "feature.shareFranz.action.twitter": "Twitter'da Paylaş",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Ferdi'a {count} tane servis ekledim! WhatsApp, Messenger, Slack ve fazlasını içeren ücretsiz uygulamayı www.getferdi.com adresinden edinin.", 33 "feature.shareFranz.shareText.email": "Ferdi'a {count} tane servis ekledim! WhatsApp, Messenger, Slack ve fazlasını içeren ücretsiz uygulamayı www.getferdi.com adresinden edinin.",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Arkadaşlarına ve meslektaşlarına Ferdi'ın ne kadar harika olduğunu söyle ve bize bu kelimeyi yaymamızda yardım et.", 35 "feature.shareFranz.text": "Arkadaşlarına ve meslektaşlarına Ferdi'ın ne kadar harika olduğunu söyle ve bize bu kelimeyi yaymamızda yardım et.",
60 "feature.todos.premium.info": "Ferdi Yapılacaklar Listesi şimdi Premium kullanıcılar için kullanılabilir!",
61 "feature.todos.premium.rollout": "Diğer herkes biraz daha beklemek zorunda.",
62 "feature.todos.premium.upgrade": "Hesabını Yükselt",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Ferdi hizmetlerine şu anda erişilemiyor", 36 "global.api.unhealthy": "Ferdi hizmetlerine şu anda erişilemiyor",
71 "global.franzProRequired": "Ferdi Professional Gerekli",
72 "global.notConnectedToTheInternet": "İnternete bağlı değilsiniz.", 37 "global.notConnectedToTheInternet": "İnternete bağlı değilsiniz.",
73 "global.spellchecker.useDefault": "Sistem Dilini Kullan ({default})", 38 "global.spellchecker.useDefault": "Sistem Dilini Kullan ({default})",
74 "global.spellchecking.autodetect": "Dili otomatik tespit et", 39 "global.spellchecking.autodetect": "Dili otomatik tespit et",
75 "global.spellchecking.autodetect.short": "Otomatik", 40 "global.spellchecking.autodetect.short": "Otomatik",
76 "global.spellchecking.language": "İmla kontrol dili", 41 "global.spellchecking.language": "İmla kontrol dili",
77 "global.upgradeButton.upgradeToPro": "Ferdi Professional'a Yükselt",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Ferdi 4 servislerinizi içeri aktarın", 44 "import.headline": "Ferdi 4 servislerinizi içeri aktarın",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Gizle", 52 "infobar.hide": "Gizle",
89 "infobar.requiredRequestsFailed": "Hizmetler ve kullanıcı bilgileri yüklenemedi", 53 "infobar.requiredRequestsFailed": "Hizmetler ve kullanıcı bilgileri yüklenemedi",
90 "infobar.servicesUpdated": "Hizmetleriniz güncellendi.", 54 "infobar.servicesUpdated": "Hizmetleriniz güncellendi.",
91 "infobar.trialActivated": "Denemen başarıyla aktifleştirildi. Mutlu mesajlaşmalar!",
92 "infobar.updateAvailable": "Yeni Ferdi güncellemesi mevcut.", 55 "infobar.updateAvailable": "Yeni Ferdi güncellemesi mevcut.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "E-posta adresi", 57 "invite.email.label": "E-posta adresi",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Menü çubuğunu otomatik otomatik olarak gizle", 87 "menu.app.autohideMenuBar": "Menü çubuğunu otomatik otomatik olarak gizle",
125 "menu.app.checkForUpdates": "Güncellemeleri kontrol et", 88 "menu.app.checkForUpdates": "Güncellemeleri kontrol et",
126 "menu.app.hide": "Gizle", 89 "menu.app.hide": "Gizle",
127 "menu.app.hideOthers": "Diğerlerini Gizle", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Çıkış", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Ayarlar", 92 "menu.app.settings": "Ayarlar",
130 "menu.app.unhide": "Göster", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Düzenle", 94 "menu.edit": "Düzenle",
132 "menu.edit.copy": "Kopyala", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Kes", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Sil", 97 "menu.edit.delete": "Sil",
135 "menu.edit.emojiSymbols": "Emoji & Semboller", 98 "menu.edit.emojiSymbols": "Emoji & Semboller",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "Yapıştır", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Yapıştır ve Stili leştir", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Yeniden Yap", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Hepsini Seç", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Konuşma", 104 "menu.edit.speech": "Konuşma",
142 "menu.edit.startDictation": "İmlaya Başla", 105 "menu.edit.startDictation": "İmlaya Başla",
143 "menu.edit.startSpeaking": "Konuşmaya Başla", 106 "menu.edit.startSpeaking": "Konuşmaya Başla",
144 "menu.edit.stopSpeaking": "Konuşmayı Bırak/Durdur", 107 "menu.edit.stopSpeaking": "Konuşmayı Bırak/Durdur",
145 "menu.edit.undo": "Geri al", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Dosya", 109 "menu.file": "Dosya",
147 "menu.help": "Yardım", 110 "menu.help": "Help",
148 "menu.help.changelog": "Değişim Günlüğü", 111 "menu.help.changelog": "Değişim Günlüğü",
149 "menu.help.debugInfo": "Hata ayıklama bilgisini kopyala", 112 "menu.help.debugInfo": "Hata ayıklama bilgisini kopyala",
150 "menu.help.debugInfoCopiedBody": "Hata ayıklama bilgilerin panoya kopyalandı.", 113 "menu.help.debugInfoCopiedBody": "Hata ayıklama bilgilerin panoya kopyalandı.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Hata Ayıklama Bilgisi", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Hata Ayıklama Bilgisi",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Daha Fazlasını Öğrenin", 116 "menu.help.learnMore": "Daha Fazlasını Öğrenin",
153 "menu.help.privacy": "Gizlilik Sözleşmesi", 117 "menu.help.privacy": "Gizlilik Sözleşmesi",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Yapılacaklar Listesi'ni Aç", 127 "menu.todos.enableTodos": "Yapılacaklar Listesi'ni Aç",
164 "menu.view": "Görünüm", 128 "menu.view": "Görünüm",
165 "menu.view.back": "Geri", 129 "menu.view.back": "Geri",
166 "menu.view.enterFullScreen": "Tam Ekrana Geç",
167 "menu.view.exitFullScreen": "Tam Ekrandan Çık",
168 "menu.view.forward": "İleri", 130 "menu.view.forward": "İleri",
169 "menu.view.lockFerdi": "Ferdi'yi Kilitle", 131 "menu.view.lockFerdi": "Ferdi'yi Kilitle",
170 "menu.view.openQuickSwitch": "QuickSwitch'i aç", 132 "menu.view.openQuickSwitch": "QuickSwitch'i aç",
171 "menu.view.reloadFranz": "Ferdi'ı Yeniden Yükle", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Servisi Tekrar Yükle", 134 "menu.view.reloadService": "Servisi Tekrar Yükle",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Orijinal Boyut", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Gece Modunu kapat", 137 "menu.view.toggleDarkMode": "Gece Modunu kapat",
176 "menu.view.toggleDevTools": "Geliştirici Araçlarına Geç", 138 "menu.view.toggleDevTools": "Geliştirici Araçlarına Geç",
177 "menu.view.toggleFullScreen": "Tam Ekrana Geç", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Hizmet Geliştirici Araçlarını Değiştir", 140 "menu.view.toggleServiceDevTools": "Hizmet Geliştirici Araçlarını Değiştir",
179 "menu.view.toggleTodosDevTools": "Yapılacaklar Listesi Geliştirici Araçlarını Aç", 141 "menu.view.toggleTodosDevTools": "Yapılacaklar Listesi Geliştirici Araçlarını Aç",
180 "menu.view.zoomIn": "Yakınlaştır", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Uzaklaştır", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Pencere", 144 "menu.window": "Window",
183 "menu.window.close": "Kapat", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Simge Durumuna Küçült", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Çalışma Alanları", 147 "menu.workspaces": "Çalışma Alanları",
186 "menu.workspaces.addNewWorkspace": "Yeni Çalışma Alanı ekle...", 148 "menu.workspaces.addNewWorkspace": "Yeni Çalışma Alanı ekle...",
187 "menu.workspaces.closeWorkspaceDrawer": "Çalışma alanı çekmecesini kapat", 149 "menu.workspaces.closeWorkspaceDrawer": "Çalışma alanı çekmecesini kapat",
@@ -194,11 +156,7 @@
194 "password.noUser": "Bu e-posta adresinde bir kullanıcı bulunamadı", 156 "password.noUser": "Bu e-posta adresinde bir kullanıcı bulunamadı",
195 "password.submit.label": "Gönder", 157 "password.submit.label": "Gönder",
196 "password.successInfo": "E-postanızı kontrol ediniz", 158 "password.successInfo": "E-postanızı kontrol ediniz",
197 "premiumFeature.button.upgradeAccount": "Hesabı Yükselt",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Sonsuza dek reklamsız",
200 "pricing.features.appDelays": "Yükleme Ekranları Yok",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Özel Siteler Ekle", 160 "pricing.features.customWebsites": "Özel Siteler Ekle",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Takım yönetimi", 166 "pricing.features.teamManagement": "Takım yönetimi",
209 "pricing.features.thirdPartyServices": "3. parti servisleri yükleme", 167 "pricing.features.thirdPartyServices": "3. parti servisleri yükleme",
210 "pricing.features.unlimitedServices": "Sınırsız servis ekleme", 168 "pricing.features.unlimitedServices": "Sınırsız servis ekleme",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Çalışma Alanları", 169 "pricing.features.workspaces": "Çalışma Alanları",
214 "pricing.plan.free": "Ferdi - Ücretsiz",
215 "pricing.plan.legacy": "Ferdi - Premium",
216 "pricing.plan.personal": "Ferdi - Kişisel",
217 "pricing.plan.personal-monthly": "Ferdi - Aylık Kişisel",
218 "pricing.plan.personal-yearly": "Ferdi - Yıllık Kişisel",
219 "pricing.plan.pro": "Ferdi - Professional",
220 "pricing.plan.pro-monthly": "Ferdi - Aylık Professional",
221 "pricing.plan.pro-yearly": "Ferdi - Yıllık Professional",
222 "pricing.trial.cta.accept": "Evet, hesabını Ferdi Professional'a yükselt",
223 "pricing.trial.cta.skip": "Ferdi'ye Devam Et",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Üzgünüz, ücretsiz denemeni başlatamadık!",
226 "pricing.trial.features.headline": "Ferdi Professional şunları içerir:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "Kredi kartı gerektirmez",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "{name} yeniden yükle", 170 "service.crashHandler.action": "{name} yeniden yükle",
236 "service.crashHandler.autoReload": "{name}'i {seconds} saniye içerisinde otomatik onarmayı deniyoruz", 171 "service.crashHandler.autoReload": "{name}'i {seconds} saniye içerisinde otomatik onarmayı deniyoruz",
237 "service.crashHandler.headline": "Olamaz!", 172 "service.crashHandler.headline": "Olamaz!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Olamaz!", 178 "service.errorHandler.headline": "Olamaz!",
244 "service.errorHandler.message": "Hata", 179 "service.errorHandler.message": "Hata",
245 "service.errorHandler.text": "{name} yüklenemedi.", 180 "service.errorHandler.text": "{name} yüklenemedi.",
246 "service.restrictedHandler.action": "Hesabını Yükselt",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Haydi başlayalım", 182 "services.getStarted": "Haydi başlayalım",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Ferdi'yi bir hesap olmadan kullan", 185 "services.serverless": "Ferdi'yi bir hesap olmadan kullan",
256 "services.welcome": "Ferdi'a Hoşgeldiniz", 186 "services.welcome": "Ferdi'a Hoşgeldiniz",
257 "settings.account.account.editButton": "Hesabı düzenle", 187 "settings.account.account.editButton": "Hesabı düzenle",
258 "settings.account.accountType.basic": "Basit Hesap",
259 "settings.account.accountType.premium": "Premium Destekçi Hesabı",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Profili güncelle", 190 "settings.account.buttonSave": "Profili güncelle",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Faturalar", 197 "settings.account.headlineInvoices": "Faturalar",
270 "settings.account.headlinePassword": "Parolayı değiştir", 198 "settings.account.headlinePassword": "Parolayı değiştir",
271 "settings.account.headlineProfile": "Profili güncelle", 199 "settings.account.headlineProfile": "Profili güncelle",
272 "settings.account.headlineSubscription": "Aboneliğin",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "İndir",
276 "settings.account.manageSubscription.label": "Aboneliğini yönet",
277 "settings.account.successInfo": "Değişikliklerin kaydedildi", 200 "settings.account.successInfo": "Değişikliklerin kaydedildi",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Ücretsiz denemen {duration} içinde bitiyor.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Tekrar deneyin", 201 "settings.account.tryReloadServices": "Tekrar deneyin",
282 "settings.account.tryReloadUserInfoRequest": "Tekrar deneyin", 202 "settings.account.tryReloadUserInfoRequest": "Tekrar deneyin",
283 "settings.account.upgradeToPro.label": "Ferdi Professional'a Yükselt",
284 "settings.account.userInfoRequestFailed": "Kullanıcı bilgisi yüklenemedi", 203 "settings.account.userInfoRequestFailed": "Kullanıcı bilgisi yüklenemedi",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Yazım denetimini etkinleştir", 227 "settings.app.form.enableSpellchecking": "Yazım denetimini etkinleştir",
309 "settings.app.form.enableSystemTray": "Ferdi'ı sistem tepsisinde göster", 228 "settings.app.form.enableSystemTray": "Ferdi'ı sistem tepsisinde göster",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Ayarlar", 259 "settings.app.headline": "Ayarlar",
341 "settings.app.headlineAdvanced": "Gelişmiş", 260 "settings.app.headlineAdvanced": "Gelişmiş",
342 "settings.app.headlineAppearance": "Görünüm", 261 "settings.app.headlineAppearance": "Görünüm",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Şifre", 270 "settings.app.lockedPassword": "Şifre",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Değişiklikler yeniden başlatmayı gerektiriyor", 272 "settings.app.restartRequired": "Değişiklikler yeniden başlatmayı gerektiriyor",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Önbellek", 277 "settings.app.subheadlineCache": "Önbellek",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Mevcut servisler", 301 "settings.recipes.headline": "Mevcut servisler",
383 "settings.recipes.missingService": "Aradığın servisi bulamadın mı?", 302 "settings.recipes.missingService": "Aradığın servisi bulamadın mı?",
384 "settings.recipes.mostPopular": "En popüler",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Servis başarıyla eklendi", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Servis başarıyla eklendi",
387 "settings.searchService": "Hizmeti ara", 305 "settings.searchService": "Hizmeti ara",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "{name} Ekle", 309 "settings.service.form.addServiceHeadline": "{name} Ekle",
392 "settings.service.form.availableServices": "Mevcut servisler", 310 "settings.service.form.availableServices": "Mevcut servisler",
393 "settings.service.form.customUrl": "Özel sunucu", 311 "settings.service.form.customUrl": "Özel sunucu",
394 "settings.service.form.customUrlPremiumInfo": "Kendi barındırdığın servisi ekleyebilmek için Ferdi Premium Destek Hesabına ihtiyacın var.",
395 "settings.service.form.customUrlUpgradeAccount": "Hesabını yükselt",
396 "settings.service.form.customUrlValidationError": "{name} özel sunucu doğrulanamadı.", 312 "settings.service.form.customUrlValidationError": "{name} özel sunucu doğrulanamadı.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Takım", 380 "settings.team.headline": "Takım",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Kurum", 385 "settings.user.form.accountType.company": "Kurum",
471 "settings.user.form.accountType.individual": "Bireysel", 386 "settings.user.form.accountType.individual": "Bireysel",
472 "settings.user.form.accountType.label": "Hesap tipi", 387 "settings.user.form.accountType.label": "Hesap tipi",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Hali hazırda hesabınız varsa giriş yapmak ister misiniz?", 431 "signup.link.login": "Hali hazırda hesabınız varsa giriş yapmak ister misiniz?",
517 "signup.password.label": "Şifre", 432 "signup.password.label": "Şifre",
518 "signup.submit.label": "Hesap oluştur", 433 "signup.submit.label": "Hesap oluştur",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Hesabını Yükselt",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "İptal",
531 "subscriptionPopup.buttonDone": "Tamamlandı",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Servisi sil", 435 "tabs.item.deleteService": "Servisi sil",
534 "tabs.item.disableAudio": "Sesi kapat", 436 "tabs.item.disableAudio": "Sesi kapat",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Bildirimleri devre dışı bırak", 438 "tabs.item.disableNotifications": "Bildirimleri devre dışı bırak",
536 "tabs.item.disableService": "Servisi devre dışı bırak", 439 "tabs.item.disableService": "Servisi devre dışı bırak",
537 "tabs.item.edit": "Düzenle", 440 "tabs.item.edit": "Düzenle",
538 "tabs.item.enableAudio": "Sesi etkinleştirin", 441 "tabs.item.enableAudio": "Sesi etkinleştirin",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Bildirimleri etkinleştir", 443 "tabs.item.enableNotification": "Bildirimleri etkinleştir",
540 "tabs.item.enableService": "Servisi etkinleştir", 444 "tabs.item.enableService": "Servisi etkinleştir",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Yenile", 446 "tabs.item.reload": "Yenile",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} geçerli değil", 448 "validation.email": "{field} geçerli değil",
543 "validation.minLength": "{field} en az {length} karakter uzunluğunda olmalı", 449 "validation.minLength": "{field} en az {length} karakter uzunluğunda olmalı",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Çalışma Alanları", 462 "workspaceDrawer.headline": "Çalışma Alanları",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index fac58b028..3c6a01397 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "О ні! Ферді втратив з'єднання з {name}.", 12 "connectionLostBanner.message": "О ні! Ферді втратив з'єднання з {name}.",
13 "feature.announcements.changelog.headline": "Зміни у Ferdi {version}", 13 "feature.announcements.changelog.headline": "Зміни у Ferdi {version}",
14 "feature.debugger.title": "Опублікувати інформацію для налагодження", 14 "feature.debugger.title": "Опублікувати інформацію для налагодження",
15 "feature.delayApp.headline": "Будь ласка, придбайте ліцензію Ferdi Supporter аби пропустити очікування",
16 "feature.delayApp.text": "Ferdi відновить роботу за {seconds} секунд",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Отримати ліцензію Ferdi Supporter ",
21 "feature.delayApp.upgrade.actionShort": "Преміум акаунт",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Відмінити", 16 "feature.nightlyBuilds.cancel": "Відмінити",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "Сталася помилка під час спроби опублікувати інформацію для налагодження. Будь ласка, спробуйте ще раз пізніше або перегляньте консоль для отримання додаткової інформації.", 19 "feature.publishDebugInfo.error": "Сталася помилка під час спроби опублікувати інформацію для налагодження. Будь ласка, спробуйте ще раз пізніше або перегляньте консоль для отримання додаткової інформації.",
43 "feature.publishDebugInfo.info": "Публікація інформації для налагодження допоможе нам знайти проблеми та помилки у Fredi. Публікуючи вашу зневаджувальну інформацію, ви приймаєте політику конфіденційності Ferdi Debugger та умови використання", 20 "feature.publishDebugInfo.info": "Публікація інформації для налагодження допоможе нам знайти проблеми та помилки у Fredi. Публікуючи вашу зневаджувальну інформацію, ви приймаєте політику конфіденційності Ferdi Debugger та умови використання",
44 "feature.publishDebugInfo.privacy": "Політика конфіденційності", 21 "feature.publishDebugInfo.privacy": "Політика конфіденційності",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Виберіть сервіс за допомогою TAB, стрілок ↑ та ↓. Натисніть ENTER, щоб відкрити.", 26 "feature.quickSwitch.info": "Виберіть сервіс за допомогою TAB, стрілок ↑ та ↓. Натисніть ENTER, щоб відкрити.",
50 "feature.quickSwitch.search": "Пошук...", 27 "feature.quickSwitch.search": "Пошук...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "Надіслати електронною поштою", 29 "feature.shareFranz.action.email": "Надіслати електронною поштою",
54 "feature.shareFranz.action.facebook": "Поділитися на Facebook", 30 "feature.shareFranz.action.facebook": "Поділитися на Facebook",
55 "feature.shareFranz.action.twitter": "Поділитись у Twitter", 31 "feature.shareFranz.action.twitter": "Поділитись у Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "Я додав {count} служб до Ферді! Завантажте безкоштовний додаток на WhatsApp, Messenger, Slack, Skype та co на www.getferdi.com", 33 "feature.shareFranz.shareText.email": "Я додав {count} служб до Ферді! Завантажте безкоштовний додаток на WhatsApp, Messenger, Slack, Skype та co на www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "Я додав {count} служб до Ферді! Завантажте безкоштовний додаток на WhatsApp, Messenger, Slack, Skype та co на www.getferdi.com", 34 "feature.shareFranz.shareText.twitter": "Я додав {count} служб до Ферді! Завантажте безкоштовний додаток на WhatsApp, Messenger, Slack, Skype та co на www.getferdi.com",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos доступні для преміум-користувачів!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Не можливо підключитись до онлайн сервісів Ferdi", 36 "global.api.unhealthy": "Не можливо підключитись до онлайн сервісів Ferdi",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "Ви не підключені до Інтернету.", 37 "global.notConnectedToTheInternet": "Ви не підключені до Інтернету.",
73 "global.spellchecker.useDefault": "Використовувати системні параметри за змовчуванням ({default})", 38 "global.spellchecker.useDefault": "Використовувати системні параметри за змовчуванням ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Мова перевірки правопису", 41 "global.spellchecking.language": "Мова перевірки правопису",
77 "global.upgradeButton.upgradeToPro": "Підвищити до Fredi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "Ідентифікатор браузера", 43 "global.userAgentPref": "Ідентифікатор браузера",
80 "import.headline": "Імпортувати ваші сервіси з Ferdi 4", 44 "import.headline": "Імпортувати ваші сервіси з Ferdi 4",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Приховати", 52 "infobar.hide": "Приховати",
89 "infobar.requiredRequestsFailed": "Не вдалося завантажити сервіси та інформацію користувача", 53 "infobar.requiredRequestsFailed": "Не вдалося завантажити сервіси та інформацію користувача",
90 "infobar.servicesUpdated": "Ваші сервіси було оновлено.", 54 "infobar.servicesUpdated": "Ваші сервіси було оновлено.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "Нове оновлення для Ferdi доступне.", 55 "infobar.updateAvailable": "Нове оновлення для Ferdi доступне.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email адреса", 57 "invite.email.label": "Email адреса",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Автоматично приховувати меню", 87 "menu.app.autohideMenuBar": "Автоматично приховувати меню",
125 "menu.app.checkForUpdates": "Перевірити наявність оновлень", 88 "menu.app.checkForUpdates": "Перевірити наявність оновлень",
126 "menu.app.hide": "Приховати", 89 "menu.app.hide": "Приховати",
127 "menu.app.hideOthers": "Приховати інші", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Вийти", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Налаштування", 92 "menu.app.settings": "Налаштування",
130 "menu.app.unhide": "Показати", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Редагувати", 94 "menu.edit": "Редагувати",
132 "menu.edit.copy": "Копіювати", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Вирізати", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Видалити", 97 "menu.edit.delete": "Видалити",
135 "menu.edit.emojiSymbols": "Емодзі та символи", 98 "menu.edit.emojiSymbols": "Емодзі та символи",
136 "menu.edit.findInPage": "Знайти на сторінці", 99 "menu.edit.findInPage": "Знайти на сторінці",
137 "menu.edit.paste": "Вставити", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Вставити з дотриманням стилю", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Повернути", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Виділити все", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Мова", 104 "menu.edit.speech": "Мова",
142 "menu.edit.startDictation": "Почати диктувати", 105 "menu.edit.startDictation": "Почати диктувати",
143 "menu.edit.startSpeaking": "Почати говорити", 106 "menu.edit.startSpeaking": "Почати говорити",
144 "menu.edit.stopSpeaking": "Закінчити говорити", 107 "menu.edit.stopSpeaking": "Закінчити говорити",
145 "menu.edit.undo": "Відмінити", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Файл", 109 "menu.file": "Файл",
147 "menu.help": "Довідка", 110 "menu.help": "Help",
148 "menu.help.changelog": "Журнал змін", 111 "menu.help.changelog": "Журнал змін",
149 "menu.help.debugInfo": "Копіювати інформацію для налагодження", 112 "menu.help.debugInfo": "Копіювати інформацію для налагодження",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Інформація для відладки", 114 "menu.help.debugInfoCopiedHeadline": "Інформація для відладки",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Докладніше", 116 "menu.help.learnMore": "Докладніше",
153 "menu.help.privacy": "Заява про конфіденційність", 117 "menu.help.privacy": "Заява про конфіденційність",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "Вигляд", 128 "menu.view": "Вигляд",
165 "menu.view.back": "Назад", 129 "menu.view.back": "Назад",
166 "menu.view.enterFullScreen": "Вікно на повний екран",
167 "menu.view.exitFullScreen": "Вийти з повного екрану",
168 "menu.view.forward": "Вперед", 130 "menu.view.forward": "Вперед",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Перезавантажити Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Перезавантажити сервіс", 134 "menu.view.reloadService": "Перезавантажити сервіс",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Фактичний розмір", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Toggle Dark Mode", 137 "menu.view.toggleDarkMode": "Toggle Dark Mode",
176 "menu.view.toggleDevTools": "Переключити інструмент розробника", 138 "menu.view.toggleDevTools": "Переключити інструмент розробника",
177 "menu.view.toggleFullScreen": "Переключитися на повний екран", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Переключити інструменти розробника сервісу", 140 "menu.view.toggleServiceDevTools": "Переключити інструменти розробника сервісу",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "Збільшити масштаб", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Зменшити масштаб", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Вікно", 144 "menu.window": "Window",
183 "menu.window.close": "Закрити", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Згорнути", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Workspaces", 147 "menu.workspaces": "Workspaces",
186 "menu.workspaces.addNewWorkspace": "Add New Workspace...", 148 "menu.workspaces.addNewWorkspace": "Add New Workspace...",
187 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer", 149 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer",
@@ -194,11 +156,7 @@
194 "password.noUser": "Не знайдено жодного користувача з цією email адресою", 156 "password.noUser": "Не знайдено жодного користувача з цією email адресою",
195 "password.submit.label": "Подати", 157 "password.submit.label": "Подати",
196 "password.successInfo": "Будь ласка, перевірте ваш email", 158 "password.successInfo": "Будь ласка, перевірте ваш email",
197 "premiumFeature.button.upgradeAccount": "Преміум акаунт",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Перезавантажити {name}", 170 "service.crashHandler.action": "Перезавантажити {name}",
236 "service.crashHandler.autoReload": "Спробую автоматично відновити {name} через {seconds} с", 171 "service.crashHandler.autoReload": "Спробую автоматично відновити {name} через {seconds} с",
237 "service.crashHandler.headline": "О, ні!", 172 "service.crashHandler.headline": "О, ні!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "О, ні!", 178 "service.errorHandler.headline": "О, ні!",
244 "service.errorHandler.message": "Помилка", 179 "service.errorHandler.message": "Помилка",
245 "service.errorHandler.text": "{name} не завантажено", 180 "service.errorHandler.text": "{name} не завантажено",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Завантаження {service}", 181 "service.webviewLoader.loading": "Завантаження {service}",
252 "services.getStarted": "Почати", 182 "services.getStarted": "Почати",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Ласкаво просимо в Ferdi", 186 "services.welcome": "Ласкаво просимо в Ferdi",
257 "settings.account.account.editButton": "Редагувати акаунт", 187 "settings.account.account.editButton": "Редагувати акаунт",
258 "settings.account.accountType.basic": "Базовий акаунт",
259 "settings.account.accountType.premium": "Преміум Акаунт Прихильника",
260 "settings.account.accountUnavailable": "Обліковий запис недоступний", 188 "settings.account.accountUnavailable": "Обліковий запис недоступний",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Оновити профіль", 190 "settings.account.buttonSave": "Оновити профіль",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Інвойси", 197 "settings.account.headlineInvoices": "Інвойси",
270 "settings.account.headlinePassword": "Змінити пароль", 198 "settings.account.headlinePassword": "Змінити пароль",
271 "settings.account.headlineProfile": "Оновити профіль", 199 "settings.account.headlineProfile": "Оновити профіль",
272 "settings.account.headlineSubscription": "Ваша підписка",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Завантажити",
276 "settings.account.manageSubscription.label": "Керування вашою підпискою",
277 "settings.account.successInfo": "Ваші зміни були збережені", 200 "settings.account.successInfo": "Ваші зміни були збережені",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Спробуйте ще раз", 201 "settings.account.tryReloadServices": "Спробуйте ще раз",
282 "settings.account.tryReloadUserInfoRequest": "Спробуйте ще раз", 202 "settings.account.tryReloadUserInfoRequest": "Спробуйте ще раз",
283 "settings.account.upgradeToPro.label": "Підвищити до Fredi Professional",
284 "settings.account.userInfoRequestFailed": "Не вдалося завантажити інформацію користувача", 203 "settings.account.userInfoRequestFailed": "Не вдалося завантажити інформацію користувача",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Увімкнути перевірку орфографії", 227 "settings.app.form.enableSpellchecking": "Увімкнути перевірку орфографії",
309 "settings.app.form.enableSystemTray": "Показувати Ferdi у системному лотку", 228 "settings.app.form.enableSystemTray": "Показувати Ferdi у системному лотку",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Увімкнути універсальний темний режим", 255 "settings.app.form.universalDarkMode": "Увімкнути універсальний темний режим",
338 "settings.app.form.useTouchIdToUnlock": "Дозволити використання TouchID для розблокування Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Дозволити використання TouchID для розблокування Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Налаштування", 259 "settings.app.headline": "Налаштування",
341 "settings.app.headlineAdvanced": "Додаткові налаштування", 260 "settings.app.headlineAdvanced": "Додаткові налаштування",
342 "settings.app.headlineAppearance": "Вигляд", 261 "settings.app.headlineAppearance": "Вигляд",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Пароль", 270 "settings.app.lockedPassword": "Пароль",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Зміни потребують перезапуску", 272 "settings.app.restartRequired": "Зміни потребують перезапуску",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Кеш", 277 "settings.app.subheadlineCache": "Кеш",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Доступні сервіси", 301 "settings.recipes.headline": "Доступні сервіси",
383 "settings.recipes.missingService": "Не знайшли сервісу?", 302 "settings.recipes.missingService": "Не знайшли сервісу?",
384 "settings.recipes.mostPopular": "Найбільш популярні",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Сервіс успішно додано", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Сервіс успішно додано",
387 "settings.searchService": "Знайти сервіс", 305 "settings.searchService": "Знайти сервіс",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Додати {name}", 309 "settings.service.form.addServiceHeadline": "Додати {name}",
392 "settings.service.form.availableServices": "Доступні сервіси", 310 "settings.service.form.availableServices": "Доступні сервіси",
393 "settings.service.form.customUrl": "Користувацький сервер", 311 "settings.service.form.customUrl": "Користувацький сервер",
394 "settings.service.form.customUrlPremiumInfo": "Щоб додати самостійно розміщені сервіси, вам потріьно мати Преміумним Акаунт Прихильника Ferdi.",
395 "settings.service.form.customUrlUpgradeAccount": "Оновити ваш обліковий запис",
396 "settings.service.form.customUrlValidationError": "Не вдалось підтвердити власний {name} сервер.", 312 "settings.service.form.customUrlValidationError": "Не вдалось підтвердити власний {name} сервер.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Команда", 380 "settings.team.headline": "Команда",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Компанія", 385 "settings.user.form.accountType.company": "Компанія",
471 "settings.user.form.accountType.individual": "Індивідуальний", 386 "settings.user.form.accountType.individual": "Індивідуальний",
472 "settings.user.form.accountType.label": "Тип акаунту", 387 "settings.user.form.accountType.label": "Тип акаунту",
@@ -516,29 +431,20 @@
516 "signup.link.login": "У вас вже є обліковий запис, увійти?", 431 "signup.link.login": "У вас вже є обліковий запис, увійти?",
517 "signup.password.label": "Пароль", 432 "signup.password.label": "Пароль",
518 "signup.submit.label": "Створити акаунт", 433 "signup.submit.label": "Створити акаунт",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Відмінити",
531 "subscriptionPopup.buttonDone": "Готово",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Видалити сервіс", 435 "tabs.item.deleteService": "Видалити сервіс",
534 "tabs.item.disableAudio": "відключити звук", 436 "tabs.item.disableAudio": "відключити звук",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Вимкнути сповіщення", 438 "tabs.item.disableNotifications": "Вимкнути сповіщення",
536 "tabs.item.disableService": "Вимкнути сервіс", 439 "tabs.item.disableService": "Вимкнути сервіс",
537 "tabs.item.edit": "Редагувати", 440 "tabs.item.edit": "Редагувати",
538 "tabs.item.enableAudio": "Увімкнути звук", 441 "tabs.item.enableAudio": "Увімкнути звук",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Увімкнути сповіщення", 443 "tabs.item.enableNotification": "Увімкнути сповіщення",
540 "tabs.item.enableService": "Увімкнути сервіс", 444 "tabs.item.enableService": "Увімкнути сервіс",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Перезавантажити", 446 "tabs.item.reload": "Перезавантажити",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} не валідне", 448 "validation.email": "{field} не валідне",
543 "validation.minLength": "Кількість символів в {field} повина бути не меньше {length} ", 449 "validation.minLength": "Кількість символів в {field} повина бути не меньше {length} ",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "Немає доданих сервісів", 464 "workspaceDrawer.item.noServicesAddedYet": "Немає доданих сервісів",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/vi.json b/src/i18n/locales/vi.json
index 83fc02f45..c67e9a067 100644
--- a/src/i18n/locales/vi.json
+++ b/src/i18n/locales/vi.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Mất kết nối tới {name}.", 12 "connectionLostBanner.message": "Mất kết nối tới {name}.",
13 "feature.announcements.changelog.headline": "Những thay đổi trong phiên bản {version}", 13 "feature.announcements.changelog.headline": "Những thay đổi trong phiên bản {version}",
14 "feature.debugger.title": "Gửi thông tin gỡ lỗi", 14 "feature.debugger.title": "Gửi thông tin gỡ lỗi",
15 "feature.delayApp.headline": "Hãy trả phí để không phải chờ đợi",
16 "feature.delayApp.text": "Vui lòng đợi {seconds} giây.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Lấy mã kích hoạt",
21 "feature.delayApp.upgrade.actionShort": "Nâng cấp tài khoản",
22 "feature.nightlyBuilds.activate": "Kích hoạt", 15 "feature.nightlyBuilds.activate": "Kích hoạt",
23 "feature.nightlyBuilds.cancel": "Hủy", 16 "feature.nightlyBuilds.cancel": "Hủy",
24 "feature.nightlyBuilds.info": "Các bản Nightly là các phiên bản Ferdi mang tính thử nghiệm có thể chứa các tính năng chưa được hoàn thiện. Các bản Nightly chủ yếu được các nhà phát triển sử dụng để kiểm tra các tính năng mới được phát triển của họ và cách chúng sẽ hoạt động trong bản dựng cuối cùng. Nếu bạn không biết mình đang làm gì, chúng tôi khuyên bạn không nên kích hoạt các bản dựng hàng đêm.", 17 "feature.nightlyBuilds.info": "Các bản Nightly là các phiên bản Ferdi mang tính thử nghiệm có thể chứa các tính năng chưa được hoàn thiện. Các bản Nightly chủ yếu được các nhà phát triển sử dụng để kiểm tra các tính năng mới được phát triển của họ và cách chúng sẽ hoạt động trong bản dựng cuối cùng. Nếu bạn không biết mình đang làm gì, chúng tôi khuyên bạn không nên kích hoạt các bản dựng hàng đêm.",
25 "feature.nightlyBuilds.title": "Phiên bản Nightly", 18 "feature.nightlyBuilds.title": "Phiên bản Nightly",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "Chính sách", 21 "feature.publishDebugInfo.privacy": "Chính sách",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "Tìm kiếm...", 27 "feature.quickSwitch.search": "Tìm kiếm...",
51 "feature.quickSwitch.title": "Chuyển đổi nhanh", 28 "feature.quickSwitch.title": "Chuyển đổi nhanh",
52 "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.",
53 "feature.shareFranz.action.email": "Gửi dưới dạng E-mail", 29 "feature.shareFranz.action.email": "Gửi dưới dạng E-mail",
54 "feature.shareFranz.action.facebook": "Chia sẻ lên Facebook", 30 "feature.shareFranz.action.facebook": "Chia sẻ lên Facebook",
55 "feature.shareFranz.action.twitter": "Chia sẻ lên Twitter", 31 "feature.shareFranz.action.twitter": "Chia sẻ lên Twitter",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Nâng cấp Tài khoản",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Không thể kết nối đến máy chủ trực tuyến của Ferdi", 36 "global.api.unhealthy": "Không thể kết nối đến máy chủ trực tuyến của Ferdi",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "You are not connected to the internet.", 37 "global.notConnectedToTheInternet": "You are not connected to the internet.",
73 "global.spellchecker.useDefault": "Dùng mặc định hệ thống ({default})", 38 "global.spellchecker.useDefault": "Dùng mặc định hệ thống ({default})",
74 "global.spellchecking.autodetect": "Tự động phát hiện ngôn ngữ", 39 "global.spellchecking.autodetect": "Tự động phát hiện ngôn ngữ",
75 "global.spellchecking.autodetect.short": "Tự động", 40 "global.spellchecking.autodetect.short": "Tự động",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Import your Ferdi 4 services", 44 "import.headline": "Import your Ferdi 4 services",
@@ -88,7 +52,6 @@
88 "infobar.hide": "Ẩn", 52 "infobar.hide": "Ẩn",
89 "infobar.requiredRequestsFailed": "Could not load services and user information", 53 "infobar.requiredRequestsFailed": "Could not load services and user information",
90 "infobar.servicesUpdated": "Your services have been updated.", 54 "infobar.servicesUpdated": "Your services have been updated.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "A new update for Ferdi is available.", 55 "infobar.updateAvailable": "A new update for Ferdi is available.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Địa chỉ E-mail", 57 "invite.email.label": "Địa chỉ E-mail",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Tự động ẩn thanh Menu", 87 "menu.app.autohideMenuBar": "Tự động ẩn thanh Menu",
125 "menu.app.checkForUpdates": "Kiểm tra cập nhật", 88 "menu.app.checkForUpdates": "Kiểm tra cập nhật",
126 "menu.app.hide": "Ẩn", 89 "menu.app.hide": "Ẩn",
127 "menu.app.hideOthers": "Ẩn các mục khác", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "Thoát", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "Các thiết lập", 92 "menu.app.settings": "Các thiết lập",
130 "menu.app.unhide": "Bỏ ẩn", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "Chỉnh sửa", 94 "menu.edit": "Chỉnh sửa",
132 "menu.edit.copy": "Sao chép", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "Cắt", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "Xóa", 97 "menu.edit.delete": "Xóa",
135 "menu.edit.emojiSymbols": "Biểu tượng cảm xúc", 98 "menu.edit.emojiSymbols": "Biểu tượng cảm xúc",
136 "menu.edit.findInPage": "Tìm trong trang", 99 "menu.edit.findInPage": "Tìm trong trang",
137 "menu.edit.paste": "Dán", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "Dán Khớp Kiểu", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "Làm lại", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "Chọn tất cả", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "Nói", 104 "menu.edit.speech": "Nói",
142 "menu.edit.startDictation": "Bắt đầu đăng kí", 105 "menu.edit.startDictation": "Bắt đầu đăng kí",
143 "menu.edit.startSpeaking": "Bắt đầu nói", 106 "menu.edit.startSpeaking": "Bắt đầu nói",
144 "menu.edit.stopSpeaking": "Dừng Nói", 107 "menu.edit.stopSpeaking": "Dừng Nói",
145 "menu.edit.undo": "Hoàn tác", 108 "menu.edit.undo": "Undo",
146 "menu.file": "Tập tin", 109 "menu.file": "Tập tin",
147 "menu.help": "Hỗ trợ", 110 "menu.help": "Help",
148 "menu.help.changelog": "Nhật ký thay đổi", 111 "menu.help.changelog": "Nhật ký thay đổi",
149 "menu.help.debugInfo": "Sao chép thông tin gỡ lỗi", 112 "menu.help.debugInfo": "Sao chép thông tin gỡ lỗi",
150 "menu.help.debugInfoCopiedBody": "Thông tin sản phẩm đã được sao chép vào bộ nhớ tạm của bạn.", 113 "menu.help.debugInfoCopiedBody": "Thông tin sản phẩm đã được sao chép vào bộ nhớ tạm của bạn.",
151 "menu.help.debugInfoCopiedHeadline": "Thông tin gỡ lỗi", 114 "menu.help.debugInfoCopiedHeadline": "Thông tin gỡ lỗi",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Tìm Hiểu Thêm", 116 "menu.help.learnMore": "Tìm Hiểu Thêm",
153 "menu.help.privacy": "Privacy Statement", 117 "menu.help.privacy": "Privacy Statement",
154 "menu.help.publishDebugInfo": "Gửi thông tin gỡ lỗi", 118 "menu.help.publishDebugInfo": "Gửi thông tin gỡ lỗi",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Mở danh sách cần làm", 127 "menu.todos.enableTodos": "Mở danh sách cần làm",
164 "menu.view": "View", 128 "menu.view": "View",
165 "menu.view.back": "Quay lại", 129 "menu.view.back": "Quay lại",
166 "menu.view.enterFullScreen": "Xem toàn màn hình",
167 "menu.view.exitFullScreen": "Thoát toàn màn hình",
168 "menu.view.forward": "Tới trước", 130 "menu.view.forward": "Tới trước",
169 "menu.view.lockFerdi": "Khoá ứng dụng", 131 "menu.view.lockFerdi": "Khoá ứng dụng",
170 "menu.view.openQuickSwitch": "Mở chuyển nhanh", 132 "menu.view.openQuickSwitch": "Mở chuyển nhanh",
171 "menu.view.reloadFranz": "Làm mới", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "Tải lại dịch vụ", 134 "menu.view.reloadService": "Tải lại dịch vụ",
173 "menu.view.reloadTodos": "Làm mới lại ds cần làm", 135 "menu.view.reloadTodos": "Làm mới lại ds cần làm",
174 "menu.view.resetZoom": "ch thước thật", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Chuyển sang Chế độ nền tối", 137 "menu.view.toggleDarkMode": "Chuyển sang Chế độ nền tối",
176 "menu.view.toggleDevTools": "Chuyển sang Công cụ dành cho nhà phát triển", 138 "menu.view.toggleDevTools": "Chuyển sang Công cụ dành cho nhà phát triển",
177 "menu.view.toggleFullScreen": "Chuyển sang Chế độ toàn màn nh", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools", 140 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "Phóng lớn", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "Thu nhỏ", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "Cửa sổ", 144 "menu.window": "Window",
183 "menu.window.close": "Đóng", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "Thu nhỏ", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "Không gian làm việc", 147 "menu.workspaces": "Không gian làm việc",
186 "menu.workspaces.addNewWorkspace": "Thêm mới Không gian làm việc...", 148 "menu.workspaces.addNewWorkspace": "Thêm mới Không gian làm việc...",
187 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer", 149 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer",
@@ -194,11 +156,7 @@
194 "password.noUser": "Không tìm thấy người dùng được đăng ký với địa chỉ e-mail này", 156 "password.noUser": "Không tìm thấy người dùng được đăng ký với địa chỉ e-mail này",
195 "password.submit.label": "Gửi", 157 "password.submit.label": "Gửi",
196 "password.successInfo": "Vui lòng kiểm tra hộp thư của bạn", 158 "password.successInfo": "Vui lòng kiểm tra hộp thư của bạn",
197 "premiumFeature.button.upgradeAccount": "Nâng cấp tài khoản",
198 "pricing.features.accountSync": "Đồng bộ hóa Tài khoản", 159 "pricing.features.accountSync": "Đồng bộ hóa Tài khoản",
199 "pricing.features.adFree": "Luôn miễn phí",
200 "pricing.features.appDelays": "Không có màn hình chờ",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Thêm Trang web tùy chỉnh", 160 "pricing.features.customWebsites": "Thêm Trang web tùy chỉnh",
203 "pricing.features.desktopNotifications": "Thông báo", 161 "pricing.features.desktopNotifications": "Thông báo",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Thêm dịch vụ không giới hạn", 168 "pricing.features.unlimitedServices": "Thêm dịch vụ không giới hạn",
211 "pricing.features.upToSixServices": "Lên đến 6 dịch vụ",
212 "pricing.features.upToThreeServices": "Lên đến 3 dịch vụ",
213 "pricing.features.workspaces": "Không gian làm việc", 169 "pricing.features.workspaces": "Không gian làm việc",
214 "pricing.plan.free": "Ferdi Miễn phí",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Cá nhân",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Ồ không!", 172 "service.crashHandler.headline": "Ồ không!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Ồ không!", 178 "service.errorHandler.headline": "Ồ không!",
244 "service.errorHandler.message": "Lỗi", 179 "service.errorHandler.message": "Lỗi",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Nâng cấp Tài khoản",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "Bạn đã đạt đến giới hạn dịch vụ.",
250 "service.restrictedHandler.serviceLimit.text": "Vui lòng nâng cấp tài khoản để sử dụng nhiều hơn {count} dịch vụ.",
251 "service.webviewLoader.loading": "Đang tải {service}", 181 "service.webviewLoader.loading": "Đang tải {service}",
252 "services.getStarted": "Bắt đầu", 182 "services.getStarted": "Bắt đầu",
253 "services.login": "Vui lòng đăng nhập để sử dụng Ferdi.", 183 "services.login": "Vui lòng đăng nhập để sử dụng Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Sử dụng Ferdi không cần Đăng nhập Tài khoản", 185 "services.serverless": "Sử dụng Ferdi không cần Đăng nhập Tài khoản",
256 "services.welcome": "Chào mừng bạn đến với Ferdi", 186 "services.welcome": "Chào mừng bạn đến với Ferdi",
257 "settings.account.account.editButton": "Chỉnh sửa Tài khoản", 187 "settings.account.account.editButton": "Chỉnh sửa Tài khoản",
258 "settings.account.accountType.basic": "Basic Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Tài khoản không hợp lệ", 188 "settings.account.accountUnavailable": "Tài khoản không hợp lệ",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Cập nhật Hồ sơ", 190 "settings.account.buttonSave": "Cập nhật Hồ sơ",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Thanh toán", 197 "settings.account.headlineInvoices": "Thanh toán",
270 "settings.account.headlinePassword": "Thay đổi Mật khẩu", 198 "settings.account.headlinePassword": "Thay đổi Mật khẩu",
271 "settings.account.headlineProfile": "Cập nhật Hồ sơ", 199 "settings.account.headlineProfile": "Cập nhật Hồ sơ",
272 "settings.account.headlineSubscription": "Đăng ký của bạn",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Tải về",
276 "settings.account.manageSubscription.label": "Manage your subscription",
277 "settings.account.successInfo": "Mọi thay đổi đã được lưu lại", 200 "settings.account.successInfo": "Mọi thay đổi đã được lưu lại",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Thử lại", 201 "settings.account.tryReloadServices": "Thử lại",
282 "settings.account.tryReloadUserInfoRequest": "Thử lại", 202 "settings.account.tryReloadUserInfoRequest": "Thử lại",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Không thể tải được thông tin người dùng", 203 "settings.account.userInfoRequestFailed": "Không thể tải được thông tin người dùng",
285 "settings.account.yourLicense": "Giấy phép Ferdi của bạn", 204 "settings.account.yourLicense": "Giấy phép Ferdi của bạn",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 228 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
310 "settings.app.form.enableTodos": "Cho phép Ferdi Todos", 229 "settings.app.form.enableTodos": "Cho phép Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Kích thước icon Dịch vụ", 232 "settings.app.form.iconSize": "Kích thước icon Dịch vụ",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "Các thiết lập", 259 "settings.app.headline": "Các thiết lập",
341 "settings.app.headlineAdvanced": "Advanced", 260 "settings.app.headlineAdvanced": "Advanced",
342 "settings.app.headlineAppearance": "Giao diện", 261 "settings.app.headlineAppearance": "Giao diện",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Mật khẩu", 270 "settings.app.lockedPassword": "Mật khẩu",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Changes require restart", 272 "settings.app.restartRequired": "Changes require restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Mở thư mục", 300 "settings.recipes.customService.openFolder": "Mở thư mục",
382 "settings.recipes.headline": "Available services", 301 "settings.recipes.headline": "Available services",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "Phổ biến nhất",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
387 "settings.searchService": "Tìm kiếm dịch vụ", 305 "settings.searchService": "Tìm kiếm dịch vụ",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Add {name}", 309 "settings.service.form.addServiceHeadline": "Add {name}",
392 "settings.service.form.availableServices": "Available services", 310 "settings.service.form.availableServices": "Available services",
393 "settings.service.form.customUrl": "Custom server", 311 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Nâng cấp Tài khoản",
470 "settings.user.form.accountType.company": "Company", 385 "settings.user.form.accountType.company": "Company",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Loại tài khoản", 387 "settings.user.form.accountType.label": "Loại tài khoản",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Already have an account, sign in?", 431 "signup.link.login": "Already have an account, sign in?",
517 "signup.password.label": "Mật khẩu", 432 "signup.password.label": "Mật khẩu",
518 "signup.submit.label": "Tạo Tài khoản", 433 "signup.submit.label": "Tạo Tài khoản",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Chọn gói",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "trên tháng",
526 "subscription.interval.perMonthPerUser": "trên tháng & người dùng",
527 "subscription.planItem.upgradeAccount": "Nâng cấp Tài khoản",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Hủy",
531 "subscriptionPopup.buttonDone": "Xong",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Xóa dịch vụ", 435 "tabs.item.deleteService": "Xóa dịch vụ",
534 "tabs.item.disableAudio": "Disable audio", 436 "tabs.item.disableAudio": "Disable audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Disable notifications", 438 "tabs.item.disableNotifications": "Disable notifications",
536 "tabs.item.disableService": "Disable service", 439 "tabs.item.disableService": "Disable service",
537 "tabs.item.edit": "Chỉnh sửa", 440 "tabs.item.edit": "Chỉnh sửa",
538 "tabs.item.enableAudio": "Cho phép âm thanh", 441 "tabs.item.enableAudio": "Cho phép âm thanh",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Enable notifications", 443 "tabs.item.enableNotification": "Enable notifications",
540 "tabs.item.enableService": "Enable service", 444 "tabs.item.enableService": "Enable service",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "Tải lại", 446 "tabs.item.reload": "Tải lại",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Không gian làm việc", 462 "workspaceDrawer.headline": "Không gian làm việc",
557 "workspaceDrawer.item.contextMenuEdit": "chỉnh sửa", 463 "workspaceDrawer.item.contextMenuEdit": "chỉnh sửa",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json
index 70a18936a..057d86253 100644
--- a/src/i18n/locales/zh-CN.json
+++ b/src/i18n/locales/zh-CN.json
@@ -3,29 +3,6 @@
3 "app.errorHandler.headline": "Something went wrong", 3 "app.errorHandler.headline": "Something went wrong",
4 "feature.announcements.changelog.headline": "Changes in Ferdi {version}", 4 "feature.announcements.changelog.headline": "Changes in Ferdi {version}",
5 "feature.debugger.title": "Publish debugging information", 5 "feature.debugger.title": "Publish debugging information",
6 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
7 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
8 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
9 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
10 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
11 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
12 "feature.delayApp.upgrade.actionShort": "Upgrade account",
13 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
14 "feature.planSelection.cta.stayOnFree": "Stay on Free",
15 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
16 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
17 "feature.planSelection.cta.upgradePro": "Choose Professional",
18 "feature.planSelection.free.text": "Basic functionality",
19 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
20 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
21 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
22 "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.",
23 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
24 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
25 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
26 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
27 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
28 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
29 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 6 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
30 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 7 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
31 "feature.publishDebugInfo.privacy": "Privacy policy", 8 "feature.publishDebugInfo.privacy": "Privacy policy",
@@ -36,7 +13,6 @@
36 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 13 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
37 "feature.quickSwitch.search": "Search...", 14 "feature.quickSwitch.search": "Search...",
38 "feature.quickSwitch.title": "QuickSwitch", 15 "feature.quickSwitch.title": "QuickSwitch",
39 "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.",
40 "feature.shareFranz.action.email": "Send as email", 16 "feature.shareFranz.action.email": "Send as email",
41 "feature.shareFranz.action.facebook": "Share on Facebook", 17 "feature.shareFranz.action.facebook": "Share on Facebook",
42 "feature.shareFranz.action.twitter": "Share on Twitter", 18 "feature.shareFranz.action.twitter": "Share on Twitter",
@@ -44,16 +20,6 @@
44 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 20 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
45 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 21 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
46 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 22 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
47 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
48 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
49 "feature.todos.premium.upgrade": "Upgrade Account",
50 "feature.trialStatusBar.cta": "Upgrade now",
51 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
52 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
53 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
54 "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.",
55 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
56 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
57 "global.api.unhealthy": "Can't connect to Ferdi online services", 23 "global.api.unhealthy": "Can't connect to Ferdi online services",
58 "global.franzProRequired": "Ferdi Professional Required", 24 "global.franzProRequired": "Ferdi Professional Required",
59 "global.notConnectedToTheInternet": "You are not connected to the internet.", 25 "global.notConnectedToTheInternet": "You are not connected to the internet.",
@@ -61,7 +27,6 @@
61 "global.spellchecking.autodetect": "Detect language automatically", 27 "global.spellchecking.autodetect": "Detect language automatically",
62 "global.spellchecking.autodetect.short": "Automatic", 28 "global.spellchecking.autodetect.short": "Automatic",
63 "global.spellchecking.language": "Spell checking language", 29 "global.spellchecking.language": "Spell checking language",
64 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
65 "import.headline": "Import your Ferdi 4 services", 30 "import.headline": "Import your Ferdi 4 services",
66 "import.notSupportedHeadline": "Services not yet supported in Ferdi 5", 31 "import.notSupportedHeadline": "Services not yet supported in Ferdi 5",
67 "import.skip.label": "I want to add services manually", 32 "import.skip.label": "I want to add services manually",
@@ -72,7 +37,6 @@
72 "infobar.buttonReloadServices": "Reload services", 37 "infobar.buttonReloadServices": "Reload services",
73 "infobar.requiredRequestsFailed": "Could not load services and user information", 38 "infobar.requiredRequestsFailed": "Could not load services and user information",
74 "infobar.servicesUpdated": "Your services have been updated.", 39 "infobar.servicesUpdated": "Your services have been updated.",
75 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
76 "infobar.updateAvailable": "A new update for Ferdi is available.", 40 "infobar.updateAvailable": "A new update for Ferdi is available.",
77 "invite.email.label": "Email address", 41 "invite.email.label": "Email address",
78 "invite.headline.friends": "Invite 3 of your friends or colleagues", 42 "invite.headline.friends": "Invite 3 of your friends or colleagues",
@@ -142,12 +106,10 @@
142 "menu.todos.enableTodos": "Enable Todos", 106 "menu.todos.enableTodos": "Enable Todos",
143 "menu.view": "View", 107 "menu.view": "View",
144 "menu.view.back": "Back", 108 "menu.view.back": "Back",
145 "menu.view.enterFullScreen": "Enter Full Screen",
146 "menu.view.exitFullScreen": "Exit Full Screen",
147 "menu.view.forward": "Forward", 109 "menu.view.forward": "Forward",
148 "menu.view.lockFerdi": "Lock Ferdi", 110 "menu.view.lockFerdi": "Lock Ferdi",
149 "menu.view.openQuickSwitch": "Open Quick Switch", 111 "menu.view.openQuickSwitch": "Open Quick Switch",
150 "menu.view.reloadFranz": "Reload Ferdi", 112 "menu.view.reloadFerdi": "Reload Ferdi",
151 "menu.view.reloadService": "Reload Service", 113 "menu.view.reloadService": "Reload Service",
152 "menu.view.resetZoom": "Actual Size", 114 "menu.view.resetZoom": "Actual Size",
153 "menu.view.toggleDevTools": "Toggle Developer Tools", 115 "menu.view.toggleDevTools": "Toggle Developer Tools",
@@ -187,27 +149,6 @@
187 "pricing.features.upToSixServices": "Add up to 6 services", 149 "pricing.features.upToSixServices": "Add up to 6 services",
188 "pricing.features.upToThreeServices": "Add up to 3 services", 150 "pricing.features.upToThreeServices": "Add up to 3 services",
189 "pricing.features.workspaces": "Workspaces", 151 "pricing.features.workspaces": "Workspaces",
190 "pricing.plan.free": "Ferdi Free",
191 "pricing.plan.legacy": "Ferdi Premium",
192 "pricing.plan.personal": "Ferdi Personal",
193 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
194 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
195 "pricing.plan.pro": "Ferdi Professional",
196 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
197 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
198 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
199 "pricing.trial.cta.skip": "Continue to Ferdi",
200 "pricing.trial.cta.start": "Start using Ferdi",
201 "pricing.trial.error": "Sorry, we could not activate your trial!",
202 "pricing.trial.features.headline": "Ferdi Professional includes:",
203 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
204 "pricing.trial.intro.happyMessaging": "Happy messaging,",
205 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
206 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
207 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
208 "pricing.trial.terms.headline": "No strings attached",
209 "pricing.trial.terms.noCreditCard": "No credit card required",
210 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
211 "service.crashHandler.action": "Reload {name}", 152 "service.crashHandler.action": "Reload {name}",
212 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 153 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
213 "service.crashHandler.headline": "Oh no!", 154 "service.crashHandler.headline": "Oh no!",
@@ -219,15 +160,10 @@
219 "service.errorHandler.headline": "Oh no!", 160 "service.errorHandler.headline": "Oh no!",
220 "service.errorHandler.message": "Error", 161 "service.errorHandler.message": "Error",
221 "service.errorHandler.text": "{name} has failed to load.", 162 "service.errorHandler.text": "{name} has failed to load.",
222 "service.restrictedHandler.action": "Upgrade Account",
223 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
224 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
225 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
226 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
227 "service.webviewLoader.loading": "Loading {service}", 163 "service.webviewLoader.loading": "Loading {service}",
228 "services.getStarted": "Get started", 164 "services.getStarted": "Get started",
229 "services.login": "Please login to use Ferdi.", 165 "services.login": "Please login to use Ferdi.",
230 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 166 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
231 "services.serverless": "Use Ferdi without an Account", 167 "services.serverless": "Use Ferdi without an Account",
232 "services.welcome": "Welcome to Ferdi", 168 "services.welcome": "Welcome to Ferdi",
233 "settings.account.account.editButton": "Edit account", 169 "settings.account.account.editButton": "Edit account",
@@ -245,18 +181,9 @@
245 "settings.account.headlineInvoices": "Invoices", 181 "settings.account.headlineInvoices": "Invoices",
246 "settings.account.headlinePassword": "Change password", 182 "settings.account.headlinePassword": "Change password",
247 "settings.account.headlineProfile": "Update profile", 183 "settings.account.headlineProfile": "Update profile",
248 "settings.account.headlineSubscription": "Your subscription",
249 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
250 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
251 "settings.account.invoiceDownload": "Download",
252 "settings.account.manageSubscription.label": "Manage your subscription",
253 "settings.account.successInfo": "Your changes have been saved", 184 "settings.account.successInfo": "Your changes have been saved",
254 "settings.account.trial": "Free Trial",
255 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
256 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
257 "settings.account.tryReloadServices": "Try again", 185 "settings.account.tryReloadServices": "Try again",
258 "settings.account.tryReloadUserInfoRequest": "Try again", 186 "settings.account.tryReloadUserInfoRequest": "Try again",
259 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
260 "settings.account.userInfoRequestFailed": "Could not load user information", 187 "settings.account.userInfoRequestFailed": "Could not load user information",
261 "settings.account.yourLicense": "Your Ferdi License", 188 "settings.account.yourLicense": "Your Ferdi License",
262 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 189 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -276,7 +203,6 @@
276 "settings.app.form.enableSpellchecking": "Enable spell checking", 203 "settings.app.form.enableSpellchecking": "Enable spell checking",
277 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 204 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
278 "settings.app.form.enableTodos": "Enable Ferdi Todos", 205 "settings.app.form.enableTodos": "Enable Ferdi Todos",
279 "settings.app.form.hibernate": "Enable service hibernation",
280 "settings.app.form.hibernationStrategy": "Hibernation strategy", 206 "settings.app.form.hibernationStrategy": "Hibernation strategy",
281 "settings.app.form.iconSize": "Service icon size", 207 "settings.app.form.iconSize": "Service icon size",
282 "settings.app.form.inactivityLock": "Lock after inactivity", 208 "settings.app.form.inactivityLock": "Lock after inactivity",
@@ -309,13 +235,13 @@
309 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 235 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
310 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 236 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
311 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 237 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
312 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 238 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
313 "settings.app.lockedPassword": "Password", 239 "settings.app.lockedPassword": "Password",
314 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 240 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
315 "settings.app.restartRequired": "Changes require restart", 241 "settings.app.restartRequired": "Changes require restart",
316 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 242 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
317 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 243 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
318 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 244 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
319 "settings.app.serverInfo": "We advice you to logout after changing your server as your settings might not be saved otherwise.", 245 "settings.app.serverInfo": "We advice you to logout after changing your server as your settings might not be saved otherwise.",
320 "settings.app.serverMoneyInfo": "You are using the official Franz Server for Ferdi.\nWe know that Ferdi allows you to use all its features for free but you are still using Franz's server resources - which Franz's creator has to pay for.\nPlease still consider [Link 1]paying for a Franz account[/Link] or [Link 2]using a self-hosted ferdi-server[/Link] (if you have the knowledge and resources to do so). \nBy using Ferdi, you still profit greatly from Franz's recipe store, server resources and its development.", 246 "settings.app.serverMoneyInfo": "You are using the official Franz Server for Ferdi.\nWe know that Ferdi allows you to use all its features for free but you are still using Franz's server resources - which Franz's creator has to pay for.\nPlease still consider [Link 1]paying for a Franz account[/Link] or [Link 2]using a self-hosted ferdi-server[/Link] (if you have the knowledge and resources to do so). \nBy using Ferdi, you still profit greatly from Franz's recipe store, server resources and its development.",
321 "settings.app.subheadlineCache": "Cache", 247 "settings.app.subheadlineCache": "Cache",
@@ -344,7 +270,6 @@
344 "settings.recipes.customService.openFolder": "Open folder", 270 "settings.recipes.customService.openFolder": "Open folder",
345 "settings.recipes.headline": "Available services", 271 "settings.recipes.headline": "Available services",
346 "settings.recipes.missingService": "Missing a service?", 272 "settings.recipes.missingService": "Missing a service?",
347 "settings.recipes.mostPopular": "Most popular",
348 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 273 "settings.recipes.nothingFound": "Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
349 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 274 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
350 "settings.searchService": "Search service", 275 "settings.searchService": "Search service",
@@ -457,19 +382,6 @@
457 "signup.link.login": "Already have an account, sign in?", 382 "signup.link.login": "Already have an account, sign in?",
458 "signup.password.label": "Password", 383 "signup.password.label": "Password",
459 "signup.submit.label": "Create account", 384 "signup.submit.label": "Create account",
460 "subscription.bestValue": "Best value",
461 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
462 "subscription.cta.allOptions": "See all options",
463 "subscription.cta.choosePlan": "Choose your plan",
464 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
465 "subscription.interval.per": "per {interval}",
466 "subscription.interval.perMonth": "per month",
467 "subscription.interval.perMonthPerUser": "per month & user",
468 "subscription.planItem.upgradeAccount": "Upgrade Account",
469 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
470 "subscription.teaser.intro": "Ferdi 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!",
471 "subscriptionPopup.buttonCancel": "Cancel",
472 "subscriptionPopup.buttonDone": "Done",
473 "tabs.item.deleteService": "Delete service", 385 "tabs.item.deleteService": "Delete service",
474 "tabs.item.disableAudio": "Disable audio", 386 "tabs.item.disableAudio": "Disable audio",
475 "tabs.item.disableNotifications": "Disable notifications", 387 "tabs.item.disableNotifications": "Disable notifications",
@@ -497,7 +409,6 @@
497 "workspaceDrawer.item.contextMenuEdit": "edit", 409 "workspaceDrawer.item.contextMenuEdit": "edit",
498 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 410 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
499 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 411 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
500 "workspaceDrawer.proFeatureBadge": "Premium feature",
501 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 412 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
502 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 413 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
503 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 414 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
diff --git a/src/i18n/locales/zh-HANS.json b/src/i18n/locales/zh-HANS.json
index 3d329e18b..b7de29eb5 100644
--- a/src/i18n/locales/zh-HANS.json
+++ b/src/i18n/locales/zh-HANS.json
@@ -5,30 +5,6 @@
5 "connectionLostBanner.informationLink": "What happened?", 5 "connectionLostBanner.informationLink": "What happened?",
6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 6 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
7 "feature.announcements.changelog.headline": "在{version}版本中的更改", 7 "feature.announcements.changelog.headline": "在{version}版本中的更改",
8 "feature.delayApp.headline": "升级您的Ferdi订阅计划以跳过等待",
9 "feature.delayApp.text": "Ferdi会在 {seconds} 秒后继续。",
10 "feature.delayApp.trial.action": "是的,我想开始14天的Ferdi 专业版免费试用",
11 "feature.delayApp.trial.actionShort": "激活免费的Ferdi 专业版试用",
12 "feature.delayApp.trial.headline": "免费获得Ferdi 专业版 14天试用版,无需等待",
13 "feature.delayApp.upgrade.action": "更新Ferdi",
14 "feature.delayApp.upgrade.actionShort": "升级账户",
15 "feature.planSelection.cta.ctaDowngradeFree": "降级到Free订阅计划",
16 "feature.planSelection.cta.stayOnFree": "保持Free订阅计划",
17 "feature.planSelection.cta.trial": "开始我的14天免费试用",
18 "feature.planSelection.cta.upgradePersonal": "选择Personal订阅计划",
19 "feature.planSelection.cta.upgradePro": "选择Professional订阅计划",
20 "feature.planSelection.free.text": "基本功能",
21 "feature.planSelection.fullFeatureList": "完整的对比所有订阅计划",
22 "feature.planSelection.fullscreen.dialog.cta.downgrade": "降级到Free",
23 "feature.planSelection.fullscreen.dialog.cta.upgrade": "选择Personal订阅计划",
24 "feature.planSelection.fullscreen.dialog.message": "您将降级到我们的免费帐户。您确定吗?单击此处每月只需{currency} {price}即可获得更多服务和功能。",
25 "feature.planSelection.fullscreen.dialog.title": "降级您的Ferdi订阅计划",
26 "feature.planSelection.fullscreen.subheadline": "是时候做出选择了。 Ferdi在我们的Personal和Professional订阅计划上表现最佳。请看看并为做出您的最佳选择。",
27 "feature.planSelection.fullscreen.welcome": "你已经准备好了吗, {name}?",
28 "feature.planSelection.personal.text": "更多的服务,无需等待 - 个人使用的理想选择。",
29 "feature.planSelection.pricesBasedOnAnnualPayment": "所有价格均基于年度付款",
30 "feature.planSelection.pro.text": "为您和您的团队提供无限的服务和专业功能。",
31 "feature.serviceLimit.limitReached": "您已在计划中包含的{limit}个服务中添加了{amount}个。请升级您的帐户以添加更多服务。",
32 "feature.shareFranz.action.email": "使用电子邮件发送", 8 "feature.shareFranz.action.email": "使用电子邮件发送",
33 "feature.shareFranz.action.facebook": "在Facebook上分享", 9 "feature.shareFranz.action.facebook": "在Facebook上分享",
34 "feature.shareFranz.action.twitter": "在Twitter上分享", 10 "feature.shareFranz.action.twitter": "在Twitter上分享",
@@ -36,16 +12,6 @@
36 "feature.shareFranz.shareText.email": "我们在Ferdi里添加了 {count} 服务!请前往 www.getferdi.com 获得支持WhatsApp,Messenger,Slack,Skype的免费应用程序. ", 12 "feature.shareFranz.shareText.email": "我们在Ferdi里添加了 {count} 服务!请前往 www.getferdi.com 获得支持WhatsApp,Messenger,Slack,Skype的免费应用程序. ",
37 "feature.shareFranz.shareText.twitter": "我已经为Ferdi添加了{count}个服务!在www.getferdi.com/cc @FerdiMessenger上获得适用于WhatsApp,Messenger,Slack,Skype和co的免费应用程序", 13 "feature.shareFranz.shareText.twitter": "我已经为Ferdi添加了{count}个服务!在www.getferdi.com/cc @FerdiMessenger上获得适用于WhatsApp,Messenger,Slack,Skype和co的免费应用程序",
38 "feature.shareFranz.text": "告诉你的朋友和同事Ferdi有多棒并且帮助我们传播Ferdi。", 14 "feature.shareFranz.text": "告诉你的朋友和同事Ferdi有多棒并且帮助我们传播Ferdi。",
39 "feature.todos.premium.info": "Ferdi Todos现在对高级用户可用!",
40 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
41 "feature.todos.premium.upgrade": "升级帐户",
42 "feature.trialStatusBar.cta": "立即升级",
43 "feature.trialStatusBar.expired": "您的Ferdi免费订阅计划{plan}已过期,请升级您的帐户。",
44 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "降级free订阅计划",
45 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "选择Personal订阅计划",
46 "feature.trialStatusBar.fullscreen.dialog.message": "您将降级到我们的免费帐户。您确定吗?单击此处每月只需{currency} {price}即可获得更多服务和功能。",
47 "feature.trialStatusBar.fullscreen.dialog.title": "降级您的Ferdi订阅计划",
48 "feature.trialStatusBar.restTime": "您的 Ferdi 免费 {plan} 试用期在 {时间} 结束。",
49 "global.api.unhealthy": "无法连接Ferdi在线服务", 15 "global.api.unhealthy": "无法连接Ferdi在线服务",
50 "global.franzProRequired": "需要 Ferdi 专业版。", 16 "global.franzProRequired": "需要 Ferdi 专业版。",
51 "global.notConnectedToTheInternet": "没有网络服务", 17 "global.notConnectedToTheInternet": "没有网络服务",
@@ -53,7 +19,6 @@
53 "global.spellchecking.autodetect": "自动检测语言", 19 "global.spellchecking.autodetect": "自动检测语言",
54 "global.spellchecking.autodetect.short": "自动", 20 "global.spellchecking.autodetect.short": "自动",
55 "global.spellchecking.language": "语言拼写检查", 21 "global.spellchecking.language": "语言拼写检查",
56 "global.upgradeButton.upgradeToPro": "升级到 Ferdi 专业版。",
57 "import.headline": "导入自定义Ferdi 4服务", 22 "import.headline": "导入自定义Ferdi 4服务",
58 "import.notSupportedHeadline": "Ferdi 5 目前不支持此项服务", 23 "import.notSupportedHeadline": "Ferdi 5 目前不支持此项服务",
59 "import.skip.label": "手动添加服务", 24 "import.skip.label": "手动添加服务",
@@ -63,7 +28,6 @@
63 "infobar.buttonReloadServices": "重新加载服务", 28 "infobar.buttonReloadServices": "重新加载服务",
64 "infobar.requiredRequestsFailed": "无法加载服务列表和用户信息", 29 "infobar.requiredRequestsFailed": "无法加载服务列表和用户信息",
65 "infobar.servicesUpdated": "服务已更新", 30 "infobar.servicesUpdated": "服务已更新",
66 "infobar.trialActivated": "您的试用已成功激活。祝您愉快!",
67 "infobar.updateAvailable": "Ferdi更新可用.", 31 "infobar.updateAvailable": "Ferdi更新可用.",
68 "invite.email.label": "电子邮件地址", 32 "invite.email.label": "电子邮件地址",
69 "invite.headline.friends": "邀请3个好友或同事", 33 "invite.headline.friends": "邀请3个好友或同事",
@@ -122,9 +86,7 @@
122 "menu.todos": "Todos", 86 "menu.todos": "Todos",
123 "menu.todos.enableTodos": "Enable Todos", 87 "menu.todos.enableTodos": "Enable Todos",
124 "menu.view": "视图", 88 "menu.view": "视图",
125 "menu.view.enterFullScreen": "全屏", 89 "menu.view.reloadFerdi": "重启Ferdi",
126 "menu.view.exitFullScreen": "退出全屏",
127 "menu.view.reloadFranz": "重启Ferdi",
128 "menu.view.reloadService": "重启服务", 90 "menu.view.reloadService": "重启服务",
129 "menu.view.reloadTodos": "Reload ToDos", 91 "menu.view.reloadTodos": "Reload ToDos",
130 "menu.view.resetZoom": "实际尺寸", 92 "menu.view.resetZoom": "实际尺寸",
@@ -166,27 +128,6 @@
166 "pricing.features.upToSixServices": "Add up to 6 services", 128 "pricing.features.upToSixServices": "Add up to 6 services",
167 "pricing.features.upToThreeServices": "Add up to 3 services", 129 "pricing.features.upToThreeServices": "Add up to 3 services",
168 "pricing.features.workspaces": "工作组", 130 "pricing.features.workspaces": "工作组",
169 "pricing.plan.free": "免费",
170 "pricing.plan.legacy": "Premium",
171 "pricing.plan.personal": "Personal",
172 "pricing.plan.personal-monthly": "Personal Monthly",
173 "pricing.plan.personal-yearly": "Personal Yearly",
174 "pricing.plan.pro": "Professional",
175 "pricing.plan.pro-monthly": "Professional Monthly",
176 "pricing.plan.pro-yearly": "Professional Yearly",
177 "pricing.trial.cta.accept": "Start my 14-day Ferdi Professional Trial ",
178 "pricing.trial.cta.skip": "Continue to Ferdi",
179 "pricing.trial.cta.start": "Start using Ferdi",
180 "pricing.trial.error": "Sorry, we could not activate your trial!",
181 "pricing.trial.features.headline": "Ferdi Professional includes:",
182 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
183 "pricing.trial.intro.happyMessaging": "Happy messaging,",
184 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
185 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
186 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
187 "pricing.trial.terms.headline": "No strings attached",
188 "pricing.trial.terms.noCreditCard": "No credit card required",
189 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
190 "service.crashHandler.action": "重新载入", 131 "service.crashHandler.action": "重新载入",
191 "service.crashHandler.autoReload": "在{seconds}秒内尝试自动恢复{name}", 132 "service.crashHandler.autoReload": "在{seconds}秒内尝试自动恢复{name}",
192 "service.crashHandler.headline": "啊,糟糕!", 133 "service.crashHandler.headline": "啊,糟糕!",
@@ -198,11 +139,6 @@
198 "service.errorHandler.headline": "啊,糟糕!", 139 "service.errorHandler.headline": "啊,糟糕!",
199 "service.errorHandler.message": "错误", 140 "service.errorHandler.message": "错误",
200 "service.errorHandler.text": "{name} 没有办法加载", 141 "service.errorHandler.text": "{name} 没有办法加载",
201 "service.restrictedHandler.action": "升级帐户",
202 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
203 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
204 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
205 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
206 "service.webviewLoader.loading": "正在加载,请稍后", 142 "service.webviewLoader.loading": "正在加载,请稍后",
207 "services.getStarted": "开始", 143 "services.getStarted": "开始",
208 "services.welcome": "欢迎使用 Ferdi", 144 "services.welcome": "欢迎使用 Ferdi",
@@ -219,18 +155,9 @@
219 "settings.account.headlineInvoices": "发票", 155 "settings.account.headlineInvoices": "发票",
220 "settings.account.headlinePassword": "修改密码", 156 "settings.account.headlinePassword": "修改密码",
221 "settings.account.headlineProfile": "更新个人资料", 157 "settings.account.headlineProfile": "更新个人资料",
222 "settings.account.headlineSubscription": "您的订阅",
223 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
224 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
225 "settings.account.invoiceDownload": "下载",
226 "settings.account.manageSubscription.label": "管理您的订阅",
227 "settings.account.successInfo": "已保存您的设置", 158 "settings.account.successInfo": "已保存您的设置",
228 "settings.account.trial": "Free Trial",
229 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
230 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
231 "settings.account.tryReloadServices": "重试", 159 "settings.account.tryReloadServices": "重试",
232 "settings.account.tryReloadUserInfoRequest": "重试", 160 "settings.account.tryReloadUserInfoRequest": "重试",
233 "settings.account.upgradeToPro.label": "升级到 Ferdi 专业版。",
234 "settings.account.userInfoRequestFailed": "无法加载用户信息", 161 "settings.account.userInfoRequestFailed": "无法加载用户信息",
235 "settings.account.yourLicense": "Your Ferdi License", 162 "settings.account.yourLicense": "Your Ferdi License",
236 "settings.app.buttonClearAllCache": "清除缓存", 163 "settings.app.buttonClearAllCache": "清除缓存",
@@ -284,7 +211,6 @@
284 "settings.recipes.customService.openFolder": "Open folder", 211 "settings.recipes.customService.openFolder": "Open folder",
285 "settings.recipes.headline": "可用的服务", 212 "settings.recipes.headline": "可用的服务",
286 "settings.recipes.missingService": "服务丢失?", 213 "settings.recipes.missingService": "服务丢失?",
287 "settings.recipes.mostPopular": "最受欢迎的",
288 "settings.recipes.nothingFound": "抱歉,没有找到相关服务", 214 "settings.recipes.nothingFound": "抱歉,没有找到相关服务",
289 "settings.recipes.servicesSuccessfulAddedInfo": "服务添加成功", 215 "settings.recipes.servicesSuccessfulAddedInfo": "服务添加成功",
290 "settings.searchService": "搜索服务", 216 "settings.searchService": "搜索服务",
@@ -391,19 +317,6 @@
391 "signup.link.login": "已有账户?登陆", 317 "signup.link.login": "已有账户?登陆",
392 "signup.password.label": "密码:", 318 "signup.password.label": "密码:",
393 "signup.submit.label": "创建账户", 319 "signup.submit.label": "创建账户",
394 "subscription.bestValue": "Best value",
395 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
396 "subscription.cta.allOptions": "See all options",
397 "subscription.cta.choosePlan": "Choose your plan",
398 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
399 "subscription.interval.per": "per {interval}",
400 "subscription.interval.perMonth": "per month",
401 "subscription.interval.perMonthPerUser": "per month & user",
402 "subscription.planItem.upgradeAccount": "升级帐户",
403 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
404 "subscription.teaser.intro": "Ferdi 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!",
405 "subscriptionPopup.buttonCancel": "取消",
406 "subscriptionPopup.buttonDone": "完成",
407 "tabs.item.deleteService": "删除服务", 320 "tabs.item.deleteService": "删除服务",
408 "tabs.item.disableAudio": "禁止声音", 321 "tabs.item.disableAudio": "禁止声音",
409 "tabs.item.disableNotifications": "停止通知", 322 "tabs.item.disableNotifications": "停止通知",
@@ -431,7 +344,6 @@
431 "workspaceDrawer.item.contextMenuEdit": "edit", 344 "workspaceDrawer.item.contextMenuEdit": "edit",
432 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 345 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
433 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 346 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
434 "workspaceDrawer.proFeatureBadge": "Premium feature",
435 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 347 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
436 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 348 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
437 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 349 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
diff --git a/src/i18n/locales/zh-HANT.json b/src/i18n/locales/zh-HANT.json
index 637d7c9de..97b2e155a 100644
--- a/src/i18n/locales/zh-HANT.json
+++ b/src/i18n/locales/zh-HANT.json
@@ -12,33 +12,10 @@
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.",
13 "feature.announcements.changelog.headline": "Ferdi 有了更新 {version}", 13 "feature.announcements.changelog.headline": "Ferdi 有了更新 {version}",
14 "feature.debugger.title": "發布除錯訊息", 14 "feature.debugger.title": "發布除錯訊息",
15 "feature.delayApp.headline": "Please purchase a Ferdi Supporter License to skip waiting",
16 "feature.delayApp.text": "Ferdi will continue in {seconds} seconds.",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
21 "feature.delayApp.upgrade.actionShort": "升級帳戶",
22 "feature.nightlyBuilds.activate": "Activate", 15 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "取消", 16 "feature.nightlyBuilds.cancel": "取消",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 19 "feature.publishDebugInfo.error": "There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "隱私權政策", 21 "feature.publishDebugInfo.privacy": "隱私權政策",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "搜尋...", 27 "feature.quickSwitch.search": "搜尋...",
51 "feature.quickSwitch.title": "QuickSwitch", 28 "feature.quickSwitch.title": "QuickSwitch",
52 "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.",
53 "feature.shareFranz.action.email": "送作為電子郵件", 29 "feature.shareFranz.action.email": "送作為電子郵件",
54 "feature.shareFranz.action.facebook": "在 Facebook 上分享", 30 "feature.shareFranz.action.facebook": "在 Facebook 上分享",
55 "feature.shareFranz.action.twitter": "在 Twitter 上分享", 31 "feature.shareFranz.action.twitter": "在 Twitter 上分享",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "升级账户",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "無法連接到Ferdi網路服務", 36 "global.api.unhealthy": "無法連接到Ferdi網路服務",
71 "global.franzProRequired": "Ferdi Professional Required",
72 "global.notConnectedToTheInternet": "您未連上網際網路", 37 "global.notConnectedToTheInternet": "您未連上網際網路",
73 "global.spellchecker.useDefault": "使用系統預設值({default})", 38 "global.spellchecker.useDefault": "使用系統預設值({default})",
74 "global.spellchecking.autodetect": "自動檢測語言", 39 "global.spellchecking.autodetect": "自動檢測語言",
75 "global.spellchecking.autodetect.short": "自動", 40 "global.spellchecking.autodetect.short": "自動",
76 "global.spellchecking.language": "拼字檢查語言", 41 "global.spellchecking.language": "拼字檢查語言",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "匯入您的 Ferdi 4 服務", 44 "import.headline": "匯入您的 Ferdi 4 服務",
@@ -88,7 +52,6 @@
88 "infobar.hide": "隱藏", 52 "infobar.hide": "隱藏",
89 "infobar.requiredRequestsFailed": "無法載入服務與帳戶資訊", 53 "infobar.requiredRequestsFailed": "無法載入服務與帳戶資訊",
90 "infobar.servicesUpdated": "您的服務已更新", 54 "infobar.servicesUpdated": "您的服務已更新",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "有新的更新可安裝", 55 "infobar.updateAvailable": "有新的更新可安裝",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "電子郵件信箱", 57 "invite.email.label": "電子郵件信箱",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "自動隱藏功能表列", 87 "menu.app.autohideMenuBar": "自動隱藏功能表列",
125 "menu.app.checkForUpdates": "檢查更新", 88 "menu.app.checkForUpdates": "檢查更新",
126 "menu.app.hide": "隱藏", 89 "menu.app.hide": "隱藏",
127 "menu.app.hideOthers": "隱藏其他視窗", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "退出", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "設置", 92 "menu.app.settings": "設置",
130 "menu.app.unhide": "顯示", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "編輯", 94 "menu.edit": "編輯",
132 "menu.edit.copy": "複製", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "剪下", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "刪除", 97 "menu.edit.delete": "刪除",
135 "menu.edit.emojiSymbols": "Emoji & Symbols", 98 "menu.edit.emojiSymbols": "Emoji & Symbols",
136 "menu.edit.findInPage": "Find in Page", 99 "menu.edit.findInPage": "Find in Page",
137 "menu.edit.paste": "貼上", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "貼上並比對樣式", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "重做", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "選取全部", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "語音", 104 "menu.edit.speech": "語音",
142 "menu.edit.startDictation": "開始聽寫", 105 "menu.edit.startDictation": "開始聽寫",
143 "menu.edit.startSpeaking": "開始朗讀", 106 "menu.edit.startSpeaking": "開始朗讀",
144 "menu.edit.stopSpeaking": "停止朗讀", 107 "menu.edit.stopSpeaking": "停止朗讀",
145 "menu.edit.undo": "復原", 108 "menu.edit.undo": "Undo",
146 "menu.file": "檔案", 109 "menu.file": "檔案",
147 "menu.help": "說明", 110 "menu.help": "Help",
148 "menu.help.changelog": "更新日誌", 111 "menu.help.changelog": "更新日誌",
149 "menu.help.debugInfo": "複製除錯資訊", 112 "menu.help.debugInfo": "複製除錯資訊",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "了解更多", 116 "menu.help.learnMore": "了解更多",
153 "menu.help.privacy": "隱私聲明", 117 "menu.help.privacy": "隱私聲明",
154 "menu.help.publishDebugInfo": "Publish Debug Information", 118 "menu.help.publishDebugInfo": "Publish Debug Information",
@@ -163,25 +127,23 @@
163 "menu.todos.enableTodos": "Enable Todos", 127 "menu.todos.enableTodos": "Enable Todos",
164 "menu.view": "檢視", 128 "menu.view": "檢視",
165 "menu.view.back": "返回", 129 "menu.view.back": "返回",
166 "menu.view.enterFullScreen": "進入全螢幕",
167 "menu.view.exitFullScreen": "離開全螢幕",
168 "menu.view.forward": "前進", 130 "menu.view.forward": "前進",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "重新載入", 134 "menu.view.reloadService": "重新載入",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "實際大小", 136 "menu.view.resetZoom": "Actual Size",
175 "menu.view.toggleDarkMode": "Toggle Dark Mode", 137 "menu.view.toggleDarkMode": "Toggle Dark Mode",
176 "menu.view.toggleDevTools": "切換開發人員工具", 138 "menu.view.toggleDevTools": "切換開發人員工具",
177 "menu.view.toggleFullScreen": "切換全螢幕", 139 "menu.view.toggleFullScreen": "Toggle Full Screen",
178 "menu.view.toggleServiceDevTools": "切換開發人員服務工具", 140 "menu.view.toggleServiceDevTools": "切換開發人員服務工具",
179 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools", 141 "menu.view.toggleTodosDevTools": "Toggle Todos Developer Tools",
180 "menu.view.zoomIn": "放大", 142 "menu.view.zoomIn": "Zoom In",
181 "menu.view.zoomOut": "縮小", 143 "menu.view.zoomOut": "Zoom Out",
182 "menu.window": "窗口", 144 "menu.window": "Window",
183 "menu.window.close": "關閉", 145 "menu.window.close": "Close",
184 "menu.window.minimize": "最小化", 146 "menu.window.minimize": "Minimize",
185 "menu.workspaces": "工作區", 147 "menu.workspaces": "工作區",
186 "menu.workspaces.addNewWorkspace": "新增工作區…", 148 "menu.workspaces.addNewWorkspace": "新增工作區…",
187 "menu.workspaces.closeWorkspaceDrawer": "關閉工作區", 149 "menu.workspaces.closeWorkspaceDrawer": "關閉工作區",
@@ -194,11 +156,7 @@
194 "password.noUser": "此電子郵件帳戶不存在", 156 "password.noUser": "此電子郵件帳戶不存在",
195 "password.submit.label": "送出", 157 "password.submit.label": "送出",
196 "password.successInfo": "請重新確認您的電子郵件信箱", 158 "password.successInfo": "請重新確認您的電子郵件信箱",
197 "premiumFeature.button.upgradeAccount": "升級帳戶",
198 "pricing.features.accountSync": "帳號同步", 159 "pricing.features.accountSync": "帳號同步",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "添加自訂網站", 160 "pricing.features.customWebsites": "添加自訂網站",
203 "pricing.features.desktopNotifications": "桌面通知", 161 "pricing.features.desktopNotifications": "桌面通知",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "工作區", 169 "pricing.features.workspaces": "工作區",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "唉呀 糟糕!", 172 "service.crashHandler.headline": "唉呀 糟糕!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "唉呀 糟糕!", 178 "service.errorHandler.headline": "唉呀 糟糕!",
244 "service.errorHandler.message": "錯誤", 179 "service.errorHandler.message": "錯誤",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "升级账户",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "正在載入 {service}", 181 "service.webviewLoader.loading": "正在載入 {service}",
252 "services.getStarted": "開始使用", 182 "services.getStarted": "開始使用",
253 "services.login": "登入至 Ferdi", 183 "services.login": "登入至 Ferdi",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "歡迎使用 Ferdi", 186 "services.welcome": "歡迎使用 Ferdi",
257 "settings.account.account.editButton": "更改帳戶資訊", 187 "settings.account.account.editButton": "更改帳戶資訊",
258 "settings.account.accountType.basic": "基本帳戶",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "帳號無法使用", 188 "settings.account.accountUnavailable": "帳號無法使用",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "更新帳戶資訊", 190 "settings.account.buttonSave": "更新帳戶資訊",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "发票", 197 "settings.account.headlineInvoices": "发票",
270 "settings.account.headlinePassword": "更改密碼", 198 "settings.account.headlinePassword": "更改密碼",
271 "settings.account.headlineProfile": "更新帳戶資訊", 199 "settings.account.headlineProfile": "更新帳戶資訊",
272 "settings.account.headlineSubscription": "您的訂閱",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "下載",
276 "settings.account.manageSubscription.label": "管理訂閱",
277 "settings.account.successInfo": "您的更改已經儲存", 200 "settings.account.successInfo": "您的更改已經儲存",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "再試一次", 201 "settings.account.tryReloadServices": "再試一次",
282 "settings.account.tryReloadUserInfoRequest": "再試一次", 202 "settings.account.tryReloadUserInfoRequest": "再試一次",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "無法載入帳戶資訊", 203 "settings.account.userInfoRequestFailed": "無法載入帳戶資訊",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "在系統匣上顯示", 228 "settings.app.form.enableSystemTray": "在系統匣上顯示",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "服務圖示大小", 232 "settings.app.form.iconSize": "服務圖示大小",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "設置", 259 "settings.app.headline": "設置",
341 "settings.app.headlineAdvanced": "高級設置", 260 "settings.app.headlineAdvanced": "高級設置",
342 "settings.app.headlineAppearance": "外觀", 261 "settings.app.headlineAppearance": "外觀",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "密碼", 270 "settings.app.lockedPassword": "密碼",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "更改需要重新開機", 272 "settings.app.restartRequired": "更改需要重新開機",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "開啟資料夾", 300 "settings.recipes.customService.openFolder": "開啟資料夾",
382 "settings.recipes.headline": "可用服務", 301 "settings.recipes.headline": "可用服務",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "熱門",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "新增服務成功", 304 "settings.recipes.servicesSuccessfulAddedInfo": "新增服務成功",
387 "settings.searchService": "Search service", 305 "settings.searchService": "Search service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "新增 {name}", 309 "settings.service.form.addServiceHeadline": "新增 {name}",
392 "settings.service.form.availableServices": "可用服務", 310 "settings.service.form.availableServices": "可用服務",
393 "settings.service.form.customUrl": "Custom server", 311 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "升級帳戶",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "團隊", 380 "settings.team.headline": "團隊",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "公司", 385 "settings.user.form.accountType.company": "公司",
471 "settings.user.form.accountType.individual": "個人", 386 "settings.user.form.accountType.individual": "個人",
472 "settings.user.form.accountType.label": "帳戶類型", 387 "settings.user.form.accountType.label": "帳戶類型",
@@ -516,29 +431,20 @@
516 "signup.link.login": "您已有一個帳戶,請問是否要登入?", 431 "signup.link.login": "您已有一個帳戶,請問是否要登入?",
517 "signup.password.label": "密碼", 432 "signup.password.label": "密碼",
518 "signup.submit.label": "建立帳戶", 433 "signup.submit.label": "建立帳戶",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "顯示所有選項",
522 "subscription.cta.choosePlan": "選擇你的計劃",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "每月",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "升级账户",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "取消",
531 "subscriptionPopup.buttonDone": "完成",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "刪除", 435 "tabs.item.deleteService": "刪除",
534 "tabs.item.disableAudio": "停用音效", 436 "tabs.item.disableAudio": "停用音效",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "停用通知", 438 "tabs.item.disableNotifications": "停用通知",
536 "tabs.item.disableService": "停用服務", 439 "tabs.item.disableService": "停用服務",
537 "tabs.item.edit": "編輯", 440 "tabs.item.edit": "編輯",
538 "tabs.item.enableAudio": "啟用音效", 441 "tabs.item.enableAudio": "啟用音效",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "啟用通知", 443 "tabs.item.enableNotification": "啟用通知",
540 "tabs.item.enableService": "啟用服務", 444 "tabs.item.enableService": "啟用服務",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "重新加載", 446 "tabs.item.reload": "重新加載",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "工作區", 462 "workspaceDrawer.headline": "工作區",
557 "workspaceDrawer.item.contextMenuEdit": "編輯", 463 "workspaceDrawer.item.contextMenuEdit": "編輯",
558 "workspaceDrawer.item.noServicesAddedYet": "未有添加服務", 464 "workspaceDrawer.item.noServicesAddedYet": "未有添加服務",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "切換到" 467 "workspaces.switchingIndicator.switchingTo": "切換到"
diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json
index f4bf16afb..d2b86d5ef 100644
--- a/src/i18n/locales/zh-TW.json
+++ b/src/i18n/locales/zh-TW.json
@@ -2,14 +2,6 @@
2 "app.errorHandler.action": "重新整理", 2 "app.errorHandler.action": "重新整理",
3 "app.errorHandler.headline": "糟糕!有些地方出問題了。", 3 "app.errorHandler.headline": "糟糕!有些地方出問題了。",
4 "feature.announcements.changelog.headline": "透過 email 傳送", 4 "feature.announcements.changelog.headline": "透過 email 傳送",
5 "feature.delayApp.headline": "請購買 Ferdi 支援授權以跳過等候",
6 "feature.delayApp.text": "Ferdi 會在 {seconds} 秒後繼續。",
7 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
8 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
9 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action": "取得 Ferdi 支援授權",
11 "feature.delayApp.upgrade.actionShort": "升級帳號",
12 "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.",
13 "feature.shareFranz.action.email": "以電子郵件傳送", 5 "feature.shareFranz.action.email": "以電子郵件傳送",
14 "feature.shareFranz.action.facebook": "透過 Facebook 分享", 6 "feature.shareFranz.action.facebook": "透過 Facebook 分享",
15 "feature.shareFranz.action.twitter": "在 Twitter 上分享", 7 "feature.shareFranz.action.twitter": "在 Twitter 上分享",
@@ -17,9 +9,6 @@
17 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 9 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
18 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 10 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
19 "feature.shareFranz.text": "告訴所有朋友和同事Ferdi有多棒!", 11 "feature.shareFranz.text": "告訴所有朋友和同事Ferdi有多棒!",
20 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
21 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
22 "feature.todos.premium.upgrade": "Upgrade Account",
23 "global.api.unhealthy": "無法連線至 Ferdi 的伺服器", 12 "global.api.unhealthy": "無法連線至 Ferdi 的伺服器",
24 "global.franzProRequired": "Ferdi Professional Required", 13 "global.franzProRequired": "Ferdi Professional Required",
25 "global.notConnectedToTheInternet": "你沒有連上網路。", 14 "global.notConnectedToTheInternet": "你沒有連上網路。",
@@ -27,7 +16,6 @@
27 "global.spellchecking.autodetect": "自動偵測語言", 16 "global.spellchecking.autodetect": "自動偵測語言",
28 "global.spellchecking.autodetect.short": "自動的", 17 "global.spellchecking.autodetect.short": "自動的",
29 "global.spellchecking.language": "拼字檢查語言", 18 "global.spellchecking.language": "拼字檢查語言",
30 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
31 "import.headline": "匯入 Ferdi 4 的服務", 19 "import.headline": "匯入 Ferdi 4 的服務",
32 "import.notSupportedHeadline": "Ferdi 5 尚未支援此服務", 20 "import.notSupportedHeadline": "Ferdi 5 尚未支援此服務",
33 "import.skip.label": "手動添加服務", 21 "import.skip.label": "手動添加服務",
@@ -37,7 +25,6 @@
37 "infobar.buttonReloadServices": "重新載入服務", 25 "infobar.buttonReloadServices": "重新載入服務",
38 "infobar.requiredRequestsFailed": "無法載入服務和使用者資訊", 26 "infobar.requiredRequestsFailed": "無法載入服務和使用者資訊",
39 "infobar.servicesUpdated": "已經更新你的服務", 27 "infobar.servicesUpdated": "已經更新你的服務",
40 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
41 "infobar.updateAvailable": "Ferdi 有可用的更新", 28 "infobar.updateAvailable": "Ferdi 有可用的更新",
42 "invite.email.label": "電子郵件地址", 29 "invite.email.label": "電子郵件地址",
43 "invite.headline.friends": "邀請 3 位朋友或同事", 30 "invite.headline.friends": "邀請 3 位朋友或同事",
@@ -95,9 +82,7 @@
95 "menu.todos": "Todos", 82 "menu.todos": "Todos",
96 "menu.todos.enableTodos": "Enable Todos", 83 "menu.todos.enableTodos": "Enable Todos",
97 "menu.view": "檢視", 84 "menu.view": "檢視",
98 "menu.view.enterFullScreen": "進入全螢幕模式", 85 "menu.view.reloadFerdi": "重新載入 Ferdi",
99 "menu.view.exitFullScreen": "離開全螢幕模式",
100 "menu.view.reloadFranz": "重新載入 Ferdi",
101 "menu.view.reloadService": "重新載入服務", 86 "menu.view.reloadService": "重新載入服務",
102 "menu.view.resetZoom": "實際大小", 87 "menu.view.resetZoom": "實際大小",
103 "menu.view.toggleDevTools": "切換開發者工具", 88 "menu.view.toggleDevTools": "切換開發者工具",
@@ -132,23 +117,6 @@
132 "pricing.features.thirdPartyServices": "Install 3rd party services", 117 "pricing.features.thirdPartyServices": "Install 3rd party services",
133 "pricing.features.unlimitedServices": "Add unlimited services", 118 "pricing.features.unlimitedServices": "Add unlimited services",
134 "pricing.features.workspaces": "工作區", 119 "pricing.features.workspaces": "工作區",
135 "pricing.plan.free": "Ferdi Free",
136 "pricing.plan.legacy": "Ferdi Premium",
137 "pricing.plan.personal": "Ferdi Personal",
138 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
139 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
140 "pricing.plan.pro": "Ferdi Professional",
141 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
142 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
143 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
144 "pricing.trial.cta.skip": "Continue to Ferdi",
145 "pricing.trial.error": "Sorry, we could not activate your trial!",
146 "pricing.trial.features.headline": "Ferdi Professional includes:",
147 "pricing.trial.headline": "Ferdi Professional",
148 "pricing.trial.subheadline": "Your personal welcome offer:",
149 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
150 "pricing.trial.terms.headline": "No strings attached",
151 "pricing.trial.terms.noCreditCard": "No credit card required",
152 "service.crashHandler.action": "重新載入{name}", 120 "service.crashHandler.action": "重新載入{name}",
153 "service.crashHandler.autoReload": "嘗試在{seconds}秒內自動恢復{name}", 121 "service.crashHandler.autoReload": "嘗試在{seconds}秒內自動恢復{name}",
154 "service.crashHandler.headline": "噢不!", 122 "service.crashHandler.headline": "噢不!",
@@ -160,11 +128,6 @@
160 "service.errorHandler.headline": "噢不!", 128 "service.errorHandler.headline": "噢不!",
161 "service.errorHandler.message": "錯誤", 129 "service.errorHandler.message": "錯誤",
162 "service.errorHandler.text": "{name} 載入失敗。", 130 "service.errorHandler.text": "{name} 載入失敗。",
163 "service.restrictedHandler.action": "Upgrade Account",
164 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
165 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
166 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
167 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
168 "service.webviewLoader.loading": "正在載入", 131 "service.webviewLoader.loading": "正在載入",
169 "services.getStarted": "開始", 132 "services.getStarted": "開始",
170 "services.welcome": "歡迎使用 Ferdi", 133 "services.welcome": "歡迎使用 Ferdi",
@@ -181,18 +144,9 @@
181 "settings.account.headlineInvoices": "帳單", 144 "settings.account.headlineInvoices": "帳單",
182 "settings.account.headlinePassword": "變更密碼", 145 "settings.account.headlinePassword": "變更密碼",
183 "settings.account.headlineProfile": "更新簡介", 146 "settings.account.headlineProfile": "更新簡介",
184 "settings.account.headlineSubscription": "您的訂閱",
185 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
186 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
187 "settings.account.invoiceDownload": "下載",
188 "settings.account.manageSubscription.label": "管理您的訂閱",
189 "settings.account.successInfo": "您的更變已經被儲存", 147 "settings.account.successInfo": "您的更變已經被儲存",
190 "settings.account.trial": "Free Trial",
191 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
192 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
193 "settings.account.tryReloadServices": "再試一次", 148 "settings.account.tryReloadServices": "再試一次",
194 "settings.account.tryReloadUserInfoRequest": "再試一次", 149 "settings.account.tryReloadUserInfoRequest": "再試一次",
195 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
196 "settings.account.userInfoRequestFailed": "無法載入使用者資訊。", 150 "settings.account.userInfoRequestFailed": "無法載入使用者資訊。",
197 "settings.account.yourLicense": "Your Ferdi License", 151 "settings.account.yourLicense": "Your Ferdi License",
198 "settings.app.buttonClearAllCache": "清除快取", 152 "settings.app.buttonClearAllCache": "清除快取",
@@ -247,7 +201,6 @@
247 "settings.recipes.customService.openFolder": "Open folder", 201 "settings.recipes.customService.openFolder": "Open folder",
248 "settings.recipes.headline": "可使用的服務", 202 "settings.recipes.headline": "可使用的服務",
249 "settings.recipes.missingService": "缺少服務?", 203 "settings.recipes.missingService": "缺少服務?",
250 "settings.recipes.mostPopular": "最熱門",
251 "settings.recipes.nothingFound": "很抱歉,沒有與您的搜尋字詞符合的服務", 204 "settings.recipes.nothingFound": "很抱歉,沒有與您的搜尋字詞符合的服務",
252 "settings.recipes.servicesSuccessfulAddedInfo": "服務已成功新增。", 205 "settings.recipes.servicesSuccessfulAddedInfo": "服務已成功新增。",
253 "settings.searchService": "尋找服務", 206 "settings.searchService": "尋找服務",
@@ -349,14 +302,6 @@
349 "signup.link.login": "已經有一個帳戶,登入?", 302 "signup.link.login": "已經有一個帳戶,登入?",
350 "signup.password.label": "密碼", 303 "signup.password.label": "密碼",
351 "signup.submit.label": "建立帳號", 304 "signup.submit.label": "建立帳號",
352 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
353 "subscription.cta.allOptions": "See all options",
354 "subscription.cta.choosePlan": "Choose your plan",
355 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
356 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
357 "subscription.teaser.intro": "Ferdi 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!",
358 "subscriptionPopup.buttonCancel": "取消",
359 "subscriptionPopup.buttonDone": "完成",
360 "tabs.item.deleteService": "刪除服務", 305 "tabs.item.deleteService": "刪除服務",
361 "tabs.item.disableAudio": "停用音訊", 306 "tabs.item.disableAudio": "停用音訊",
362 "tabs.item.disableNotifications": "停用通知", 307 "tabs.item.disableNotifications": "停用通知",
@@ -379,7 +324,6 @@
379 "workspaceDrawer.item.contextMenuEdit": "edit", 324 "workspaceDrawer.item.contextMenuEdit": "edit",
380 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 325 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
381 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", 326 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
382 "workspaceDrawer.proFeatureBadge": "Premium feature",
383 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", 327 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
384 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 328 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
385 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 329 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json
index c9a54b464..590d5093e 100644
--- a/src/i18n/locales/zh.json
+++ b/src/i18n/locales/zh.json
@@ -5,40 +5,17 @@
5 "changeserver.headline": "Change server", 5 "changeserver.headline": "Change server",
6 "changeserver.label": "服务器:", 6 "changeserver.label": "服务器:",
7 "changeserver.submit": "Submit", 7 "changeserver.submit": "Submit",
8 "changeserver.urlError": "Enter a valid URL", 8 "changeserver.urlError": "输入有效的URL",
9 "changeserver.warning": "Extra settings offered by Ferdi will not be saved", 9 "changeserver.warning": "Ferdi提供的额外设置将不会被保存",
10 "connectionLostBanner.cta": "重新加载服务", 10 "connectionLostBanner.cta": "重新加载服务",
11 "connectionLostBanner.informationLink": "What happened?", 11 "connectionLostBanner.informationLink": "发生了什么?",
12 "connectionLostBanner.message": "Oh no! Ferdi lost the connection to {name}.", 12 "connectionLostBanner.message": "哦不!Ferdi失去了与 {name} 的连接。",
13 "feature.announcements.changelog.headline": "Ferdi的变化", 13 "feature.announcements.changelog.headline": "Ferdi的变化",
14 "feature.debugger.title": "发布调试信息", 14 "feature.debugger.title": "发布调试信息",
15 "feature.delayApp.headline": "请购买Ferdi 支持者许可证来跳过等待", 15 "feature.nightlyBuilds.activate": "激活",
16 "feature.delayApp.text": "Ferdi将在 {seconds} 秒后继续。",
17 "feature.delayApp.trial.action": "Yes, I want the free 14 day trial of Ferdi Professional",
18 "feature.delayApp.trial.actionShort": "Activate the free Ferdi Professional trial",
19 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
20 "feature.delayApp.upgrade.action": "获得Ferdi 支持者许可证",
21 "feature.delayApp.upgrade.actionShort": "升级账户",
22 "feature.nightlyBuilds.activate": "Activate",
23 "feature.nightlyBuilds.cancel": "Cancel", 16 "feature.nightlyBuilds.cancel": "Cancel",
24 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.", 17 "feature.nightlyBuilds.info": "Nightly builds are highly experimental versions of Ferdi that may contain unpolished or uncompleted features. These nightly builds are mainly used by developers to test their newly developed features and how they will perform in the final build. If you don't know what you are doing, we suggest not activating nightly builds.",
25 "feature.nightlyBuilds.title": "Nightly Builds", 18 "feature.nightlyBuilds.title": "Nightly Builds",
26 "feature.planSelection.cta.ctaDowngradeFree": "Downgrade to Free",
27 "feature.planSelection.cta.stayOnFree": "Stay on Free",
28 "feature.planSelection.cta.trial": "Start my free 14-days Trial",
29 "feature.planSelection.cta.upgradePersonal": "Choose Personal",
30 "feature.planSelection.cta.upgradePro": "Choose Professional",
31 "feature.planSelection.free.text": "Basic functionality",
32 "feature.planSelection.fullFeatureList": "Complete comparison of all plans",
33 "feature.planSelection.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
34 "feature.planSelection.fullscreen.dialog.cta.upgrade": "Choose Personal",
35 "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.",
36 "feature.planSelection.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
37 "feature.planSelection.fullscreen.subheadline": "It's time to make a choice. Ferdi works best on our Personal and Professional plans. Please have a look and choose the best one for you.",
38 "feature.planSelection.fullscreen.welcome": "Are you ready to choose, {name}",
39 "feature.planSelection.personal.text": "More services, no waiting - ideal for personal use.",
40 "feature.planSelection.pricesBasedOnAnnualPayment": "All prices based on yearly payment",
41 "feature.planSelection.pro.text": "Unlimited services and professional features for you - and your team.",
42 "feature.publishDebugInfo.error": "发布调试信息时出错。请稍后再试或查看控制台以获取更多信息。", 19 "feature.publishDebugInfo.error": "发布调试信息时出错。请稍后再试或查看控制台以获取更多信息。",
43 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 20 "feature.publishDebugInfo.info": "Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
44 "feature.publishDebugInfo.privacy": "隐私权政策", 21 "feature.publishDebugInfo.privacy": "隐私权政策",
@@ -49,7 +26,6 @@
49 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.", 26 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
50 "feature.quickSwitch.search": "搜索...", 27 "feature.quickSwitch.search": "搜索...",
51 "feature.quickSwitch.title": "快速切换", 28 "feature.quickSwitch.title": "快速切换",
52 "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.",
53 "feature.shareFranz.action.email": "以邮件形式发送", 29 "feature.shareFranz.action.email": "以邮件形式发送",
54 "feature.shareFranz.action.facebook": "在 Facebook 上分享", 30 "feature.shareFranz.action.facebook": "在 Facebook 上分享",
55 "feature.shareFranz.action.twitter": "在Twitter上分享", 31 "feature.shareFranz.action.twitter": "在Twitter上分享",
@@ -57,24 +33,12 @@
57 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com", 33 "feature.shareFranz.shareText.email": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com",
58 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger", 34 "feature.shareFranz.shareText.twitter": "I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.getferdi.com /cc @FerdiMessenger",
59 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.", 35 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Ferdi is and help us to spread the word.",
60 "feature.todos.premium.info": "Ferdi Todos are available to premium users now!",
61 "feature.todos.premium.rollout": "Everyone else will have to wait a little longer.",
62 "feature.todos.premium.upgrade": "Upgrade Account",
63 "feature.trialStatusBar.cta": "Upgrade now",
64 "feature.trialStatusBar.expired": "Your free Ferdi {plan} Trial has expired, please upgrade your account.",
65 "feature.trialStatusBar.fullscreen.dialog.cta.downgrade": "Downgrade to Free",
66 "feature.trialStatusBar.fullscreen.dialog.cta.upgrade": "Choose Personal",
67 "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.",
68 "feature.trialStatusBar.fullscreen.dialog.title": "Downgrade your Ferdi Plan",
69 "feature.trialStatusBar.restTime": "Your Free Ferdi {plan} Trial ends in {time}.",
70 "global.api.unhealthy": "Can't connect to Ferdi online services", 36 "global.api.unhealthy": "Can't connect to Ferdi online services",
71 "global.franzProRequired": "需要Ferdi 专业版",
72 "global.notConnectedToTheInternet": "You are not connected to the internet.", 37 "global.notConnectedToTheInternet": "You are not connected to the internet.",
73 "global.spellchecker.useDefault": "Use System Default ({default})", 38 "global.spellchecker.useDefault": "Use System Default ({default})",
74 "global.spellchecking.autodetect": "Detect language automatically", 39 "global.spellchecking.autodetect": "Detect language automatically",
75 "global.spellchecking.autodetect.short": "Automatic", 40 "global.spellchecking.autodetect.short": "Automatic",
76 "global.spellchecking.language": "Spell checking language", 41 "global.spellchecking.language": "Spell checking language",
77 "global.upgradeButton.upgradeToPro": "Upgrade to Ferdi Professional",
78 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.", 42 "global.userAgentHelp": "Use 'https://whatmyuseragent.com/' (to discover) or 'https://developers.whatismybrowser.com/useragents/explore/' (to choose) your desired user agent and copy-paste it here.",
79 "global.userAgentPref": "User Agent", 43 "global.userAgentPref": "User Agent",
80 "import.headline": "Import your Ferdi 4 services", 44 "import.headline": "Import your Ferdi 4 services",
@@ -88,7 +52,6 @@
88 "infobar.hide": "隐藏", 52 "infobar.hide": "隐藏",
89 "infobar.requiredRequestsFailed": "Could not load services and user information", 53 "infobar.requiredRequestsFailed": "Could not load services and user information",
90 "infobar.servicesUpdated": "Your services have been updated.", 54 "infobar.servicesUpdated": "Your services have been updated.",
91 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
92 "infobar.updateAvailable": "A new update for Ferdi is available.", 55 "infobar.updateAvailable": "A new update for Ferdi is available.",
93 "infobox.dismiss": "Dismiss", 56 "infobox.dismiss": "Dismiss",
94 "invite.email.label": "Email address", 57 "invite.email.label": "Email address",
@@ -124,31 +87,32 @@
124 "menu.app.autohideMenuBar": "Auto-hide menu bar", 87 "menu.app.autohideMenuBar": "Auto-hide menu bar",
125 "menu.app.checkForUpdates": "Check for updates", 88 "menu.app.checkForUpdates": "Check for updates",
126 "menu.app.hide": "隐藏", 89 "menu.app.hide": "隐藏",
127 "menu.app.hideOthers": "隐藏其它", 90 "menu.app.hideOthers": "Hide Others",
128 "menu.app.quit": "退出", 91 "menu.app.quit": "Quit",
129 "menu.app.settings": "设置", 92 "menu.app.settings": "设置",
130 "menu.app.unhide": "取消隐藏", 93 "menu.app.unhide": "Unhide",
131 "menu.edit": "编辑", 94 "menu.edit": "编辑",
132 "menu.edit.copy": "复制", 95 "menu.edit.copy": "Copy",
133 "menu.edit.cut": "剪切", 96 "menu.edit.cut": "Cut",
134 "menu.edit.delete": "删除", 97 "menu.edit.delete": "删除",
135 "menu.edit.emojiSymbols": "Emoji 和符号", 98 "menu.edit.emojiSymbols": "Emoji 和符号",
136 "menu.edit.findInPage": "页内搜索", 99 "menu.edit.findInPage": "页内搜索",
137 "menu.edit.paste": "粘贴", 100 "menu.edit.paste": "Paste",
138 "menu.edit.pasteAndMatchStyle": "粘贴和匹配样式", 101 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
139 "menu.edit.redo": "重做", 102 "menu.edit.redo": "Redo",
140 "menu.edit.selectAll": "选择所有", 103 "menu.edit.selectAll": "Select All",
141 "menu.edit.speech": "语音", 104 "menu.edit.speech": "语音",
142 "menu.edit.startDictation": "Start Dictation", 105 "menu.edit.startDictation": "Start Dictation",
143 "menu.edit.startSpeaking": "开始说话", 106 "menu.edit.startSpeaking": "开始说话",
144 "menu.edit.stopSpeaking": "停止说话", 107 "menu.edit.stopSpeaking": "停止说话",
145 "menu.edit.undo": "撤销", 108 "menu.edit.undo": "Undo",
146 "menu.file": "文件", 109 "menu.file": "文件",
147 "menu.help": "帮助", 110 "menu.help": "Help",
148 "menu.help.changelog": "更新日志", 111 "menu.help.changelog": "更新日志",
149 "menu.help.debugInfo": "复制调试信息", 112 "menu.help.debugInfo": "复制调试信息",
150 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.", 113 "menu.help.debugInfoCopiedBody": "Your Debug Information has been copied to your clipboard.",
151 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information", 114 "menu.help.debugInfoCopiedHeadline": "Ferdi Debug Information",
115 "menu.help.importExportData": "Import/Export Configuration Data",
152 "menu.help.learnMore": "Learn More", 116 "menu.help.learnMore": "Learn More",
153 "menu.help.privacy": "Privacy Statement", 117 "menu.help.privacy": "Privacy Statement",
154 "menu.help.publishDebugInfo": "发布调试信息", 118 "menu.help.publishDebugInfo": "发布调试信息",
@@ -163,12 +127,10 @@
163 "menu.todos.enableTodos": "启用待办事项", 127 "menu.todos.enableTodos": "启用待办事项",
164 "menu.view": "查看", 128 "menu.view": "查看",
165 "menu.view.back": "返回", 129 "menu.view.back": "返回",
166 "menu.view.enterFullScreen": "进入全屏",
167 "menu.view.exitFullScreen": "退出全屏",
168 "menu.view.forward": "Forward", 130 "menu.view.forward": "Forward",
169 "menu.view.lockFerdi": "Lock Ferdi", 131 "menu.view.lockFerdi": "Lock Ferdi",
170 "menu.view.openQuickSwitch": "Open Quick Switch", 132 "menu.view.openQuickSwitch": "Open Quick Switch",
171 "menu.view.reloadFranz": "Reload Ferdi", 133 "menu.view.reloadFerdi": "Reload Ferdi",
172 "menu.view.reloadService": "重新加载服务", 134 "menu.view.reloadService": "重新加载服务",
173 "menu.view.reloadTodos": "Reload ToDos", 135 "menu.view.reloadTodos": "Reload ToDos",
174 "menu.view.resetZoom": "Actual Size", 136 "menu.view.resetZoom": "Actual Size",
@@ -194,11 +156,7 @@
194 "password.noUser": "No user with that email address was found", 156 "password.noUser": "No user with that email address was found",
195 "password.submit.label": "Submit", 157 "password.submit.label": "Submit",
196 "password.successInfo": "Please check your email", 158 "password.successInfo": "Please check your email",
197 "premiumFeature.button.upgradeAccount": "升级账户",
198 "pricing.features.accountSync": "Account Synchronisation", 159 "pricing.features.accountSync": "Account Synchronisation",
199 "pricing.features.adFree": "Forever ad-free",
200 "pricing.features.appDelays": "No Waiting Screens",
201 "pricing.features.appDelaysEnabled": "Occasional Waiting Screens",
202 "pricing.features.customWebsites": "Add Custom Websites", 160 "pricing.features.customWebsites": "Add Custom Websites",
203 "pricing.features.desktopNotifications": "Desktop Notifications", 161 "pricing.features.desktopNotifications": "Desktop Notifications",
204 "pricing.features.onPremise": "On-premise & other Hosted Services", 162 "pricing.features.onPremise": "On-premise & other Hosted Services",
@@ -208,30 +166,7 @@
208 "pricing.features.teamManagement": "Team Management", 166 "pricing.features.teamManagement": "Team Management",
209 "pricing.features.thirdPartyServices": "Install 3rd party services", 167 "pricing.features.thirdPartyServices": "Install 3rd party services",
210 "pricing.features.unlimitedServices": "Add unlimited services", 168 "pricing.features.unlimitedServices": "Add unlimited services",
211 "pricing.features.upToSixServices": "Add up to 6 services",
212 "pricing.features.upToThreeServices": "Add up to 3 services",
213 "pricing.features.workspaces": "Workspaces", 169 "pricing.features.workspaces": "Workspaces",
214 "pricing.plan.free": "Ferdi Free",
215 "pricing.plan.legacy": "Ferdi Premium",
216 "pricing.plan.personal": "Ferdi Personal",
217 "pricing.plan.personal-monthly": "Ferdi Personal Monthly",
218 "pricing.plan.personal-yearly": "Ferdi Personal Yearly",
219 "pricing.plan.pro": "Ferdi Professional",
220 "pricing.plan.pro-monthly": "Ferdi Professional Monthly",
221 "pricing.plan.pro-yearly": "Ferdi Professional Yearly",
222 "pricing.trial.cta.accept": "Yes, upgrade my account to Ferdi Professional",
223 "pricing.trial.cta.skip": "Continue to Ferdi",
224 "pricing.trial.cta.start": "Start using Ferdi",
225 "pricing.trial.error": "Sorry, we could not activate your trial!",
226 "pricing.trial.features.headline": "Ferdi Professional includes:",
227 "pricing.trial.headline.pro": "Hi {name}, welcome to Ferdi",
228 "pricing.trial.intro.happyMessaging": "Happy messaging,",
229 "pricing.trial.intro.specialTreat": "We have a special treat for you.",
230 "pricing.trial.intro.tryPro": "Enjoy the full Ferdi Professional experience completely free for 14 days.",
231 "pricing.trial.terms.automaticTrialEnd": "Your free trial ends automatically after 14 days",
232 "pricing.trial.terms.headline": "No strings attached",
233 "pricing.trial.terms.noCreditCard": "No credit card required",
234 "pricing.trial.terms.trialWorth": "Free trial (normally {currency}{price} per month)",
235 "service.crashHandler.action": "Reload {name}", 170 "service.crashHandler.action": "Reload {name}",
236 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds", 171 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
237 "service.crashHandler.headline": "Oh no!", 172 "service.crashHandler.headline": "Oh no!",
@@ -243,20 +178,13 @@
243 "service.errorHandler.headline": "Oh no!", 178 "service.errorHandler.headline": "Oh no!",
244 "service.errorHandler.message": "Error", 179 "service.errorHandler.message": "Error",
245 "service.errorHandler.text": "{name} has failed to load.", 180 "service.errorHandler.text": "{name} has failed to load.",
246 "service.restrictedHandler.action": "Upgrade Account",
247 "service.restrictedHandler.customUrl.headline": "Ferdi Professional Plan required",
248 "service.restrictedHandler.customUrl.text": "Please upgrade to the Ferdi Professional plan to use custom urls & self hosted services.",
249 "service.restrictedHandler.serviceLimit.headline": "You have reached your service limit.",
250 "service.restrictedHandler.serviceLimit.text": "Please upgrade your account to use more than {count} services.",
251 "service.webviewLoader.loading": "Loading {service}", 181 "service.webviewLoader.loading": "Loading {service}",
252 "services.getStarted": "Get started", 182 "services.getStarted": "Get started",
253 "services.login": "Please login to use Ferdi.", 183 "services.login": "Please login to use Ferdi.",
254 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 184 "services.serverInfo": "Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
255 "services.serverless": "Use Ferdi without an Account", 185 "services.serverless": "Use Ferdi without an Account",
256 "services.welcome": "Welcome to Ferdi", 186 "services.welcome": "Welcome to Ferdi",
257 "settings.account.account.editButton": "Edit account", 187 "settings.account.account.editButton": "Edit account",
258 "settings.account.accountType.basic": "Basic Account",
259 "settings.account.accountType.premium": "Premium Supporter Account",
260 "settings.account.accountUnavailable": "Account is unavailable", 188 "settings.account.accountUnavailable": "Account is unavailable",
261 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 189 "settings.account.accountUnavailableInfo": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
262 "settings.account.buttonSave": "Update profile", 190 "settings.account.buttonSave": "Update profile",
@@ -269,18 +197,9 @@
269 "settings.account.headlineInvoices": "Invoices", 197 "settings.account.headlineInvoices": "Invoices",
270 "settings.account.headlinePassword": "Change password", 198 "settings.account.headlinePassword": "Change password",
271 "settings.account.headlineProfile": "Update profile", 199 "settings.account.headlineProfile": "Update profile",
272 "settings.account.headlineSubscription": "Your subscription",
273 "settings.account.headlineTrialUpgrade": "Get the free 14 day Ferdi Professional Trial",
274 "settings.account.headlineUpgradeAccount": "Upgrade your account & get the full Ferdi experience",
275 "settings.account.invoiceDownload": "Download",
276 "settings.account.manageSubscription.label": "Manage your subscription",
277 "settings.account.successInfo": "Your changes have been saved", 200 "settings.account.successInfo": "Your changes have been saved",
278 "settings.account.trial": "Free Trial",
279 "settings.account.trialEndsIn": "Your free trial ends in {duration}.",
280 "settings.account.trialUpdateBillingInfo": "Please update your billing info to continue using {license} after your trial period.",
281 "settings.account.tryReloadServices": "Try again", 201 "settings.account.tryReloadServices": "Try again",
282 "settings.account.tryReloadUserInfoRequest": "Try again", 202 "settings.account.tryReloadUserInfoRequest": "Try again",
283 "settings.account.upgradeToPro.label": "Upgrade to Ferdi Professional",
284 "settings.account.userInfoRequestFailed": "Could not load user information", 203 "settings.account.userInfoRequestFailed": "Could not load user information",
285 "settings.account.yourLicense": "Your Ferdi License", 204 "settings.account.yourLicense": "Your Ferdi License",
286 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 205 "settings.app.accentColorInfo": "Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
@@ -308,7 +227,6 @@
308 "settings.app.form.enableSpellchecking": "Enable spell checking", 227 "settings.app.form.enableSpellchecking": "Enable spell checking",
309 "settings.app.form.enableSystemTray": "Show Ferdi in system tray", 228 "settings.app.form.enableSystemTray": "Show Ferdi in system tray",
310 "settings.app.form.enableTodos": "Enable Ferdi Todos", 229 "settings.app.form.enableTodos": "Enable Ferdi Todos",
311 "settings.app.form.hibernate": "Enable service hibernation",
312 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 230 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
313 "settings.app.form.hibernationStrategy": "Hibernation strategy", 231 "settings.app.form.hibernationStrategy": "Hibernation strategy",
314 "settings.app.form.iconSize": "Service icon size", 232 "settings.app.form.iconSize": "Service icon size",
@@ -337,6 +255,7 @@
337 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 255 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
338 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi", 256 "settings.app.form.useTouchIdToUnlock": "Allow using TouchID to unlock Ferdi",
339 "settings.app.form.useVerticalStyle": "Use vertical style", 257 "settings.app.form.useVerticalStyle": "Use vertical style",
258 "settings.app.form.wakeUpStrategy": "Wake up strategy",
340 "settings.app.headline": "设置", 259 "settings.app.headline": "设置",
341 "settings.app.headlineAdvanced": "Advanced", 260 "settings.app.headlineAdvanced": "Advanced",
342 "settings.app.headlineAppearance": "Appearance", 261 "settings.app.headlineAppearance": "Appearance",
@@ -347,13 +266,13 @@
347 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 266 "settings.app.hibernateInfo": "By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
348 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 267 "settings.app.inactivityLockInfo": "Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
349 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", 268 "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.",
350 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 269 "settings.app.lockInfo": "Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
351 "settings.app.lockedPassword": "Password", 270 "settings.app.lockedPassword": "Password",
352 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 271 "settings.app.lockedPasswordInfo": "Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
353 "settings.app.restartRequired": "Changes require restart", 272 "settings.app.restartRequired": "Changes require restart",
354 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 273 "settings.app.scheduledDNDInfo": "Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
355 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 274 "settings.app.scheduledDNDTimeInfo": "Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
356 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 275 "settings.app.sentryInfo": "Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
357 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 276 "settings.app.spellCheckerLanguageInfo": "Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
358 "settings.app.subheadlineCache": "Cache", 277 "settings.app.subheadlineCache": "Cache",
359 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.", 278 "settings.app.todoServerInfo": "This server will be used for the \"Ferdi Todo\" feature.",
@@ -381,7 +300,6 @@
381 "settings.recipes.customService.openFolder": "Open folder", 300 "settings.recipes.customService.openFolder": "Open folder",
382 "settings.recipes.headline": "Available services", 301 "settings.recipes.headline": "Available services",
383 "settings.recipes.missingService": "Missing a service?", 302 "settings.recipes.missingService": "Missing a service?",
384 "settings.recipes.mostPopular": "Most popular",
385 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 303 "settings.recipes.nothingFound": "Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
386 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 304 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
387 "settings.searchService": "Search service", 305 "settings.searchService": "Search service",
@@ -391,8 +309,6 @@
391 "settings.service.form.addServiceHeadline": "Add {name}", 309 "settings.service.form.addServiceHeadline": "Add {name}",
392 "settings.service.form.availableServices": "Available services", 310 "settings.service.form.availableServices": "Available services",
393 "settings.service.form.customUrl": "Custom server", 311 "settings.service.form.customUrl": "Custom server",
394 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Ferdi Premium Supporter Account.",
395 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
396 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.", 312 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
397 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness", 313 "settings.service.form.darkReaderBrightness": "Dark Reader Brightness",
398 "settings.service.form.darkReaderContrast": "Dark Reader Contrast", 314 "settings.service.form.darkReaderContrast": "Dark Reader Contrast",
@@ -462,11 +378,10 @@
462 "settings.team.contentHeadline": "Franz Team Management", 378 "settings.team.contentHeadline": "Franz Team Management",
463 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 379 "settings.team.copy": "Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
464 "settings.team.headline": "Team", 380 "settings.team.headline": "Team",
465 "settings.team.intro": "Your are currently using Franz Servers, which is why you have access to Team Management.", 381 "settings.team.intro": "You are currently using Franz Servers, which is why you have access to Team Management.",
466 "settings.team.manageAction": "Manage your Team on meetfranz.com", 382 "settings.team.manageAction": "Manage your Team on meetfranz.com",
467 "settings.team.teamsUnavailable": "Teams are unavailable", 383 "settings.team.teamsUnavailable": "Teams are unavailable",
468 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 384 "settings.team.teamsUnavailableInfo": "Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
469 "settings.team.upgradeAction": "Upgrade your Account",
470 "settings.user.form.accountType.company": "Company", 385 "settings.user.form.accountType.company": "Company",
471 "settings.user.form.accountType.individual": "Individual", 386 "settings.user.form.accountType.individual": "Individual",
472 "settings.user.form.accountType.label": "Account type", 387 "settings.user.form.accountType.label": "Account type",
@@ -516,29 +431,20 @@
516 "signup.link.login": "Already have an account, sign in?", 431 "signup.link.login": "Already have an account, sign in?",
517 "signup.password.label": "Password", 432 "signup.password.label": "Password",
518 "signup.submit.label": "Create account", 433 "signup.submit.label": "Create account",
519 "subscription.bestValue": "Best value",
520 "subscription.cta.activateTrial": "Yes, start the free Ferdi Professional trial",
521 "subscription.cta.allOptions": "See all options",
522 "subscription.cta.choosePlan": "Choose your plan",
523 "subscription.includedProFeatures": "The Ferdi Professional Plan includes:",
524 "subscription.interval.per": "per {interval}",
525 "subscription.interval.perMonth": "per month",
526 "subscription.interval.perMonthPerUser": "per month & user",
527 "subscription.planItem.upgradeAccount": "Upgrade Account",
528 "subscription.teaser.includedFeatures": "Paid Ferdi Plans include:",
529 "subscription.teaser.intro": "Ferdi 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!",
530 "subscriptionPopup.buttonCancel": "Cancel",
531 "subscriptionPopup.buttonDone": "Done",
532 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?", 434 "tabs.item.confirmDeleteService": "Do you really want to delete the {serviceName} service?",
533 "tabs.item.deleteService": "Delete service", 435 "tabs.item.deleteService": "Delete service",
534 "tabs.item.disableAudio": "Disable audio", 436 "tabs.item.disableAudio": "Disable audio",
437 "tabs.item.disableDarkMode": "Disable Dark mode",
535 "tabs.item.disableNotifications": "Disable notifications", 438 "tabs.item.disableNotifications": "Disable notifications",
536 "tabs.item.disableService": "Disable service", 439 "tabs.item.disableService": "Disable service",
537 "tabs.item.edit": "编辑", 440 "tabs.item.edit": "编辑",
538 "tabs.item.enableAudio": "Enable audio", 441 "tabs.item.enableAudio": "Enable audio",
442 "tabs.item.enableDarkMode": "Enable Dark mode",
539 "tabs.item.enableNotification": "Enable notifications", 443 "tabs.item.enableNotification": "Enable notifications",
540 "tabs.item.enableService": "Enable service", 444 "tabs.item.enableService": "Enable service",
445 "tabs.item.hibernateService": "Hibernate service",
541 "tabs.item.reload": "重新加载", 446 "tabs.item.reload": "重新加载",
447 "tabs.item.wakeUpService": "Wake up service",
542 "validation.email": "{field} is not valid", 448 "validation.email": "{field} is not valid",
543 "validation.minLength": "{field} should be at least {length} characters long", 449 "validation.minLength": "{field} should be at least {length} characters long",
544 "validation.oneRequired": "At least one is required", 450 "validation.oneRequired": "At least one is required",
@@ -556,9 +462,6 @@
556 "workspaceDrawer.headline": "Workspaces", 462 "workspaceDrawer.headline": "Workspaces",
557 "workspaceDrawer.item.contextMenuEdit": "edit", 463 "workspaceDrawer.item.contextMenuEdit": "edit",
558 "workspaceDrawer.item.noServicesAddedYet": "No services added yet", 464 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
559 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
560 "workspaceDrawer.proFeatureBadge": "Premium feature",
561 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
562 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>", 465 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>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.</p>",
563 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 466 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
564 "workspaces.switchingIndicator.switchingTo": "Switching to" 467 "workspaces.switchingIndicator.switchingTo": "Switching to"
diff --git a/src/i18n/messages/src/components/TrialActivationInfoBar.json b/src/i18n/messages/src/components/TrialActivationInfoBar.json
deleted file mode 100644
index 65dd964a6..000000000
--- a/src/i18n/messages/src/components/TrialActivationInfoBar.json
+++ /dev/null
@@ -1,15 +0,0 @@
1[
2 {
3 "id": "infobar.trialActivated",
4 "defaultMessage": "!!!Your trial was successfully activated. Happy messaging!",
5 "file": "src/components/TrialActivationInfoBar.js",
6 "start": {
7 "line": 11,
8 "column": 11
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 }
15] \ 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
deleted file mode 100644
index b5b7d72a8..000000000
--- a/src/i18n/messages/src/components/auth/Pricing.json
+++ /dev/null
@@ -1,171 +0,0 @@
1[
2 {
3 "id": "pricing.trial.headline.pro",
4 "defaultMessage": "!!!Hi {name}, welcome to Franz",
5 "file": "src/components/auth/Pricing.js",
6 "start": {
7 "line": 14,
8 "column": 12
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.trial.intro.specialTreat",
17 "defaultMessage": "!!!We have a special treat for you.",
18 "file": "src/components/auth/Pricing.js",
19 "start": {
20 "line": 18,
21 "column": 16
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "pricing.trial.intro.tryPro",
30 "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.",
31 "file": "src/components/auth/Pricing.js",
32 "start": {
33 "line": 22,
34 "column": 10
35 },
36 "end": {
37 "line": 25,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.trial.intro.happyMessaging",
43 "defaultMessage": "!!!Happy messaging,",
44 "file": "src/components/auth/Pricing.js",
45 "start": {
46 "line": 26,
47 "column": 18
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.trial.terms.headline",
56 "defaultMessage": "!!!No strings attached",
57 "file": "src/components/auth/Pricing.js",
58 "start": {
59 "line": 30,
60 "column": 29
61 },
62 "end": {
63 "line": 33,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.trial.terms.noCreditCard",
69 "defaultMessage": "!!!No credit card required",
70 "file": "src/components/auth/Pricing.js",
71 "start": {
72 "line": 34,
73 "column": 16
74 },
75 "end": {
76 "line": 37,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.trial.terms.automaticTrialEnd",
82 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
83 "file": "src/components/auth/Pricing.js",
84 "start": {
85 "line": 38,
86 "column": 21
87 },
88 "end": {
89 "line": 41,
90 "column": 3
91 }
92 },
93 {
94 "id": "pricing.trial.terms.trialWorth",
95 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)",
96 "file": "src/components/auth/Pricing.js",
97 "start": {
98 "line": 42,
99 "column": 14
100 },
101 "end": {
102 "line": 45,
103 "column": 3
104 }
105 },
106 {
107 "id": "pricing.trial.error",
108 "defaultMessage": "!!!Sorry, we could not activate your trial!",
109 "file": "src/components/auth/Pricing.js",
110 "start": {
111 "line": 46,
112 "column": 19
113 },
114 "end": {
115 "line": 49,
116 "column": 3
117 }
118 },
119 {
120 "id": "pricing.trial.cta.accept",
121 "defaultMessage": "!!!Start my 14-day Franz Professional Trial",
122 "file": "src/components/auth/Pricing.js",
123 "start": {
124 "line": 50,
125 "column": 13
126 },
127 "end": {
128 "line": 53,
129 "column": 3
130 }
131 },
132 {
133 "id": "pricing.trial.cta.start",
134 "defaultMessage": "!!!Start using Franz",
135 "file": "src/components/auth/Pricing.js",
136 "start": {
137 "line": 54,
138 "column": 12
139 },
140 "end": {
141 "line": 57,
142 "column": 3
143 }
144 },
145 {
146 "id": "pricing.trial.cta.skip",
147 "defaultMessage": "!!!Continue to Ferdi",
148 "file": "src/components/auth/Pricing.js",
149 "start": {
150 "line": 58,
151 "column": 11
152 },
153 "end": {
154 "line": 61,
155 "column": 3
156 }
157 },
158 {
159 "id": "pricing.trial.features.headline",
160 "defaultMessage": "!!!Franz Professional includes:",
161 "file": "src/components/auth/Pricing.js",
162 "start": {
163 "line": 62,
164 "column": 20
165 },
166 "end": {
167 "line": 65,
168 "column": 3
169 }
170 }
171] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/auth/SetupAssistant.json b/src/i18n/messages/src/components/auth/SetupAssistant.json
index 03593cfbc..f950228b7 100644
--- a/src/i18n/messages/src/components/auth/SetupAssistant.json
+++ b/src/i18n/messages/src/components/auth/SetupAssistant.json
@@ -21,7 +21,7 @@
21 "column": 15 21 "column": 15
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 26, 24 "line": 27,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Let's go", 30 "defaultMessage": "!!!Let's go",
31 "file": "src/components/auth/SetupAssistant.js", 31 "file": "src/components/auth/SetupAssistant.js",
32 "start": { 32 "start": {
33 "line": 27, 33 "line": 28,
34 "column": 21 34 "column": 21
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 30, 37 "line": 31,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Invitations sent successfully", 43 "defaultMessage": "!!!Invitations sent successfully",
44 "file": "src/components/auth/SetupAssistant.js", 44 "file": "src/components/auth/SetupAssistant.js",
45 "start": { 45 "start": {
46 "line": 31, 46 "line": 32,
47 "column": 21 47 "column": 21
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 34, 50 "line": 35,
51 "column": 3 51 "column": 3
52 } 52 }
53 } 53 }
diff --git a/src/i18n/messages/src/components/auth/Signup.json b/src/i18n/messages/src/components/auth/Signup.json
index 2628c9aa3..4a32628ef 100644
--- a/src/i18n/messages/src/components/auth/Signup.json
+++ b/src/i18n/messages/src/components/auth/Signup.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Sign up", 4 "defaultMessage": "!!!Sign up",
5 "file": "src/components/auth/Signup.js", 5 "file": "src/components/auth/Signup.js",
6 "start": { 6 "start": {
7 "line": 19, 7 "line": 20,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 22, 11 "line": 23,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Firstname", 17 "defaultMessage": "!!!Firstname",
18 "file": "src/components/auth/Signup.js", 18 "file": "src/components/auth/Signup.js",
19 "start": { 19 "start": {
20 "line": 23, 20 "line": 24,
21 "column": 18 21 "column": 18
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 26, 24 "line": 27,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Lastname", 30 "defaultMessage": "!!!Lastname",
31 "file": "src/components/auth/Signup.js", 31 "file": "src/components/auth/Signup.js",
32 "start": { 32 "start": {
33 "line": 27, 33 "line": 28,
34 "column": 17 34 "column": 17
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 30, 37 "line": 31,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Email address", 43 "defaultMessage": "!!!Email address",
44 "file": "src/components/auth/Signup.js", 44 "file": "src/components/auth/Signup.js",
45 "start": { 45 "start": {
46 "line": 31, 46 "line": 32,
47 "column": 14 47 "column": 14
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 34, 50 "line": 35,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Password", 56 "defaultMessage": "!!!Password",
57 "file": "src/components/auth/Signup.js", 57 "file": "src/components/auth/Signup.js",
58 "start": { 58 "start": {
59 "line": 39, 59 "line": 40,
60 "column": 17 60 "column": 17
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 42, 63 "line": 43,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!By creating a Ferdi account you accept the", 69 "defaultMessage": "!!!By creating a Ferdi account you accept the",
70 "file": "src/components/auth/Signup.js", 70 "file": "src/components/auth/Signup.js",
71 "start": { 71 "start": {
72 "line": 43, 72 "line": 44,
73 "column": 13 73 "column": 13
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 46, 76 "line": 47,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Terms of service", 82 "defaultMessage": "!!!Terms of service",
83 "file": "src/components/auth/Signup.js", 83 "file": "src/components/auth/Signup.js",
84 "start": { 84 "start": {
85 "line": 47, 85 "line": 48,
86 "column": 9 86 "column": 9
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 50, 89 "line": 51,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Privacy Statement", 95 "defaultMessage": "!!!Privacy Statement",
96 "file": "src/components/auth/Signup.js", 96 "file": "src/components/auth/Signup.js",
97 "start": { 97 "start": {
98 "line": 51, 98 "line": 52,
99 "column": 11 99 "column": 11
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 54, 102 "line": 55,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Create account", 108 "defaultMessage": "!!!Create account",
109 "file": "src/components/auth/Signup.js", 109 "file": "src/components/auth/Signup.js",
110 "start": { 110 "start": {
111 "line": 55, 111 "line": 56,
112 "column": 21 112 "column": 21
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 58, 115 "line": 59,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Already have an account, sign in?", 121 "defaultMessage": "!!!Already have an account, sign in?",
122 "file": "src/components/auth/Signup.js", 122 "file": "src/components/auth/Signup.js",
123 "start": { 123 "start": {
124 "line": 59, 124 "line": 60,
125 "column": 13 125 "column": 13
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 62, 128 "line": 63,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Change server", 134 "defaultMessage": "!!!Change server",
135 "file": "src/components/auth/Signup.js", 135 "file": "src/components/auth/Signup.js",
136 "start": { 136 "start": {
137 "line": 63, 137 "line": 64,
138 "column": 16 138 "column": 16
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 66, 141 "line": 67,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Use Ferdi without an Account", 147 "defaultMessage": "!!!Use Ferdi without an Account",
148 "file": "src/components/auth/Signup.js", 148 "file": "src/components/auth/Signup.js",
149 "start": { 149 "start": {
150 "line": 67, 150 "line": 68,
151 "column": 14 151 "column": 14
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 70, 154 "line": 71,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!A user with that email address already exists", 160 "defaultMessage": "!!!A user with that email address already exists",
161 "file": "src/components/auth/Signup.js", 161 "file": "src/components/auth/Signup.js",
162 "start": { 162 "start": {
163 "line": 71, 163 "line": 72,
164 "column": 18 164 "column": 18
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 74, 167 "line": 75,
168 "column": 3 168 "column": 3
169 } 169 }
170 } 170 }
diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json
index 554758f82..e3f5658b2 100644
--- a/src/i18n/messages/src/components/layout/AppLayout.json
+++ b/src/i18n/messages/src/components/layout/AppLayout.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your services have been updated.", 4 "defaultMessage": "!!!Your services have been updated.",
5 "file": "src/components/layout/AppLayout.js", 5 "file": "src/components/layout/AppLayout.js",
6 "start": { 6 "start": {
7 "line": 32, 7 "line": 29,
8 "column": 19 8 "column": 19
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 35, 11 "line": 32,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Reload services", 17 "defaultMessage": "!!!Reload services",
18 "file": "src/components/layout/AppLayout.js", 18 "file": "src/components/layout/AppLayout.js",
19 "start": { 19 "start": {
20 "line": 36, 20 "line": 33,
21 "column": 24 21 "column": 24
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 39, 24 "line": 36,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Could not load services and user information", 30 "defaultMessage": "!!!Could not load services and user information",
31 "file": "src/components/layout/AppLayout.js", 31 "file": "src/components/layout/AppLayout.js",
32 "start": { 32 "start": {
33 "line": 40, 33 "line": 37,
34 "column": 26 34 "column": 26
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 43, 37 "line": 40,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 43 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
44 "file": "src/components/layout/AppLayout.js", 44 "file": "src/components/layout/AppLayout.js",
45 "start": { 45 "start": {
46 "line": 44, 46 "line": 41,
47 "column": 21 47 "column": 21
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 47, 50 "line": 45,
51 "column": 3 51 "column": 3
52 } 52 }
53 } 53 }
diff --git a/src/i18n/messages/src/components/layout/Sidebar.json b/src/i18n/messages/src/components/layout/Sidebar.json
index 2d8fe0676..f16baea32 100644
--- a/src/i18n/messages/src/components/layout/Sidebar.json
+++ b/src/i18n/messages/src/components/layout/Sidebar.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Settings", 4 "defaultMessage": "!!!Settings",
5 "file": "src/components/layout/Sidebar.js", 5 "file": "src/components/layout/Sidebar.js",
6 "start": { 6 "start": {
7 "line": 20, 7 "line": 17,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 23, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Add new service", 17 "defaultMessage": "!!!Add new service",
18 "file": "src/components/layout/Sidebar.js", 18 "file": "src/components/layout/Sidebar.js",
19 "start": { 19 "start": {
20 "line": 24, 20 "line": 21,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 27, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Disable notifications & audio", 30 "defaultMessage": "!!!Disable notifications & audio",
31 "file": "src/components/layout/Sidebar.js", 31 "file": "src/components/layout/Sidebar.js",
32 "start": { 32 "start": {
33 "line": 28, 33 "line": 25,
34 "column": 8 34 "column": 8
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 31, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Enable notifications & audio", 43 "defaultMessage": "!!!Enable notifications & audio",
44 "file": "src/components/layout/Sidebar.js", 44 "file": "src/components/layout/Sidebar.js",
45 "start": { 45 "start": {
46 "line": 32, 46 "line": 29,
47 "column": 10 47 "column": 10
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 35, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Open workspace drawer", 56 "defaultMessage": "!!!Open workspace drawer",
57 "file": "src/components/layout/Sidebar.js", 57 "file": "src/components/layout/Sidebar.js",
58 "start": { 58 "start": {
59 "line": 36, 59 "line": 33,
60 "column": 23 60 "column": 23
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 39, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Close workspace drawer", 69 "defaultMessage": "!!!Close workspace drawer",
70 "file": "src/components/layout/Sidebar.js", 70 "file": "src/components/layout/Sidebar.js",
71 "start": { 71 "start": {
72 "line": 40, 72 "line": 37,
73 "column": 24 73 "column": 24
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 43, 76 "line": 40,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Open Franz Todos", 82 "defaultMessage": "!!!Open Franz Todos",
83 "file": "src/components/layout/Sidebar.js", 83 "file": "src/components/layout/Sidebar.js",
84 "start": { 84 "start": {
85 "line": 44, 85 "line": 41,
86 "column": 19 86 "column": 19
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 47, 89 "line": 44,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Close Franz Todos", 95 "defaultMessage": "!!!Close Franz Todos",
96 "file": "src/components/layout/Sidebar.js", 96 "file": "src/components/layout/Sidebar.js",
97 "start": { 97 "start": {
98 "line": 48, 98 "line": 45,
99 "column": 20 99 "column": 20
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 51, 102 "line": 48,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Lock Ferdi", 108 "defaultMessage": "!!!Lock Ferdi",
109 "file": "src/components/layout/Sidebar.js", 109 "file": "src/components/layout/Sidebar.js",
110 "start": { 110 "start": {
111 "line": 52, 111 "line": 49,
112 "column": 13 112 "column": 13
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 55, 115 "line": 52,
116 "column": 3 116 "column": 3
117 } 117 }
118 } 118 }
diff --git a/src/i18n/messages/src/components/services/content/ConnectionLostBanner.json b/src/i18n/messages/src/components/services/content/ConnectionLostBanner.json
index bcfb6ab94..6805b4d67 100644
--- a/src/i18n/messages/src/components/services/content/ConnectionLostBanner.json
+++ b/src/i18n/messages/src/components/services/content/ConnectionLostBanner.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Oh no! Ferdi lost the connection to {name}.", 4 "defaultMessage": "!!!Oh no! Ferdi lost the connection to {name}.",
5 "file": "src/components/services/content/ConnectionLostBanner.js", 5 "file": "src/components/services/content/ConnectionLostBanner.js",
6 "start": { 6 "start": {
7 "line": 15, 7 "line": 13,
8 "column": 8 8 "column": 8
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 18, 11 "line": 16,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!What happened?", 17 "defaultMessage": "!!!What happened?",
18 "file": "src/components/services/content/ConnectionLostBanner.js", 18 "file": "src/components/services/content/ConnectionLostBanner.js",
19 "start": { 19 "start": {
20 "line": 19, 20 "line": 17,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 22, 24 "line": 20,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Reload Service", 30 "defaultMessage": "!!!Reload Service",
31 "file": "src/components/services/content/ConnectionLostBanner.js", 31 "file": "src/components/services/content/ConnectionLostBanner.js",
32 "start": { 32 "start": {
33 "line": 23, 33 "line": 21,
34 "column": 7 34 "column": 7
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 26, 37 "line": 24,
38 "column": 3 38 "column": 3
39 } 39 }
40 } 40 }
diff --git a/src/i18n/messages/src/components/services/content/ServiceRestricted.json b/src/i18n/messages/src/components/services/content/ServiceRestricted.json
deleted file mode 100644
index c1984afe3..000000000
--- a/src/i18n/messages/src/components/services/content/ServiceRestricted.json
+++ /dev/null
@@ -1,67 +0,0 @@
1[
2 {
3 "id": "service.restrictedHandler.serviceLimit.headline",
4 "defaultMessage": "!!!You have reached your service limit.",
5 "file": "src/components/services/content/ServiceRestricted.js",
6 "start": {
7 "line": 11,
8 "column": 24
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "service.restrictedHandler.serviceLimit.text",
17 "defaultMessage": "!!!Please upgrade your account to use more than {count} services.",
18 "file": "src/components/services/content/ServiceRestricted.js",
19 "start": {
20 "line": 15,
21 "column": 20
22 },
23 "end": {
24 "line": 18,
25 "column": 3
26 }
27 },
28 {
29 "id": "service.restrictedHandler.customUrl.headline",
30 "defaultMessage": "!!!Franz Professional Plan required",
31 "file": "src/components/services/content/ServiceRestricted.js",
32 "start": {
33 "line": 19,
34 "column": 21
35 },
36 "end": {
37 "line": 22,
38 "column": 3
39 }
40 },
41 {
42 "id": "service.restrictedHandler.customUrl.text",
43 "defaultMessage": "!!!Please upgrade to the Franz Professional plan to use custom urls & self hosted services.",
44 "file": "src/components/services/content/ServiceRestricted.js",
45 "start": {
46 "line": 23,
47 "column": 17
48 },
49 "end": {
50 "line": 26,
51 "column": 3
52 }
53 },
54 {
55 "id": "service.restrictedHandler.action",
56 "defaultMessage": "!!!Upgrade Account",
57 "file": "src/components/services/content/ServiceRestricted.js",
58 "start": {
59 "line": 27,
60 "column": 10
61 },
62 "end": {
63 "line": 30,
64 "column": 3
65 }
66 }
67] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/services/content/Services.json b/src/i18n/messages/src/components/services/content/Services.json
index 6a5eb052e..304c93f3c 100644
--- a/src/i18n/messages/src/components/services/content/Services.json
+++ b/src/i18n/messages/src/components/services/content/Services.json
@@ -53,7 +53,7 @@
53 }, 53 },
54 { 54 {
55 "id": "services.serverInfo", 55 "id": "services.serverInfo",
56 "defaultMessage": "!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner.", 56 "defaultMessage": "!!!Optionally, you can change your Ferdi server by clicking the cog in the bottom left corner. If you are switching over (from one of the hosted servers) to using Ferdi without an account, please be informed that you can export your data from that server and subsequently import it using the Help menu to resurrect all your workspaces and configured services!",
57 "file": "src/components/services/content/Services.js", 57 "file": "src/components/services/content/Services.js",
58 "start": { 58 "start": {
59 "line": 31, 59 "line": 31,
diff --git a/src/i18n/messages/src/components/services/tabs/TabItem.json b/src/i18n/messages/src/components/services/tabs/TabItem.json
index a1b0d2435..92ff6fb14 100644
--- a/src/i18n/messages/src/components/services/tabs/TabItem.json
+++ b/src/i18n/messages/src/components/services/tabs/TabItem.json
@@ -78,8 +78,8 @@
78 } 78 }
79 }, 79 },
80 { 80 {
81 "id": "tabs.item.disableService", 81 "id": "tabs.item.enableDarkMode",
82 "defaultMessage": "!!!Disable Service", 82 "defaultMessage": "!!!Enable Dark mode",
83 "file": "src/components/services/tabs/TabItem.js", 83 "file": "src/components/services/tabs/TabItem.js",
84 "start": { 84 "start": {
85 "line": 44, 85 "line": 44,
@@ -91,15 +91,67 @@
91 } 91 }
92 }, 92 },
93 { 93 {
94 "id": "tabs.item.disableDarkMode",
95 "defaultMessage": "!!!Disable Dark mode",
96 "file": "src/components/services/tabs/TabItem.js",
97 "start": {
98 "line": 48,
99 "column": 19
100 },
101 "end": {
102 "line": 51,
103 "column": 3
104 }
105 },
106 {
107 "id": "tabs.item.disableService",
108 "defaultMessage": "!!!Disable Service",
109 "file": "src/components/services/tabs/TabItem.js",
110 "start": {
111 "line": 52,
112 "column": 18
113 },
114 "end": {
115 "line": 55,
116 "column": 3
117 }
118 },
119 {
94 "id": "tabs.item.enableService", 120 "id": "tabs.item.enableService",
95 "defaultMessage": "!!!Enable Service", 121 "defaultMessage": "!!!Enable Service",
96 "file": "src/components/services/tabs/TabItem.js", 122 "file": "src/components/services/tabs/TabItem.js",
97 "start": { 123 "start": {
98 "line": 48, 124 "line": 56,
99 "column": 17 125 "column": 17
100 }, 126 },
101 "end": { 127 "end": {
102 "line": 51, 128 "line": 59,
129 "column": 3
130 }
131 },
132 {
133 "id": "tabs.item.hibernateService",
134 "defaultMessage": "!!!Hibernate Service",
135 "file": "src/components/services/tabs/TabItem.js",
136 "start": {
137 "line": 60,
138 "column": 20
139 },
140 "end": {
141 "line": 63,
142 "column": 3
143 }
144 },
145 {
146 "id": "tabs.item.wakeUpService",
147 "defaultMessage": "!!!Wake Up Service",
148 "file": "src/components/services/tabs/TabItem.js",
149 "start": {
150 "line": 64,
151 "column": 17
152 },
153 "end": {
154 "line": 67,
103 "column": 3 155 "column": 3
104 } 156 }
105 }, 157 },
@@ -108,11 +160,11 @@
108 "defaultMessage": "!!!Delete Service", 160 "defaultMessage": "!!!Delete Service",
109 "file": "src/components/services/tabs/TabItem.js", 161 "file": "src/components/services/tabs/TabItem.js",
110 "start": { 162 "start": {
111 "line": 52, 163 "line": 68,
112 "column": 17 164 "column": 17
113 }, 165 },
114 "end": { 166 "end": {
115 "line": 55, 167 "line": 71,
116 "column": 3 168 "column": 3
117 } 169 }
118 }, 170 },
@@ -121,11 +173,11 @@
121 "defaultMessage": "!!!Do you really want to delete the {serviceName} service?", 173 "defaultMessage": "!!!Do you really want to delete the {serviceName} service?",
122 "file": "src/components/services/tabs/TabItem.js", 174 "file": "src/components/services/tabs/TabItem.js",
123 "start": { 175 "start": {
124 "line": 56, 176 "line": 72,
125 "column": 24 177 "column": 24
126 }, 178 },
127 "end": { 179 "end": {
128 "line": 59, 180 "line": 76,
129 "column": 3 181 "column": 3
130 } 182 }
131 } 183 }
diff --git a/src/i18n/messages/src/components/settings/account/AccountDashboard.json b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
index f0bb087d6..b0cc2dcc7 100644
--- a/src/i18n/messages/src/components/settings/account/AccountDashboard.json
+++ b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
@@ -4,24 +4,11 @@
4 "defaultMessage": "!!!Account", 4 "defaultMessage": "!!!Account",
5 "file": "src/components/settings/account/AccountDashboard.js", 5 "file": "src/components/settings/account/AccountDashboard.js",
6 "start": { 6 "start": {
7 "line": 17, 7 "line": 14,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 20, 11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.account.headlineSubscription",
17 "defaultMessage": "!!!Your Subscription",
18 "file": "src/components/settings/account/AccountDashboard.js",
19 "start": {
20 "line": 21,
21 "column": 24
22 },
23 "end": {
24 "line": 24,
25 "column": 3 12 "column": 3
26 } 13 }
27 }, 14 },
@@ -30,63 +17,11 @@
30 "defaultMessage": "!!Danger Zone", 17 "defaultMessage": "!!Danger Zone",
31 "file": "src/components/settings/account/AccountDashboard.js", 18 "file": "src/components/settings/account/AccountDashboard.js",
32 "start": { 19 "start": {
33 "line": 25, 20 "line": 18,
34 "column": 22 21 "column": 22
35 }, 22 },
36 "end": { 23 "end": {
37 "line": 28, 24 "line": 21,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.account.manageSubscription.label",
43 "defaultMessage": "!!!Manage your subscription",
44 "file": "src/components/settings/account/AccountDashboard.js",
45 "start": {
46 "line": 29,
47 "column": 33
48 },
49 "end": {
50 "line": 32,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.account.upgradeToPro.label",
56 "defaultMessage": "!!!Upgrade to Franz Professional",
57 "file": "src/components/settings/account/AccountDashboard.js",
58 "start": {
59 "line": 33,
60 "column": 23
61 },
62 "end": {
63 "line": 36,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.account.accountType.basic",
69 "defaultMessage": "!!!Basic Account",
70 "file": "src/components/settings/account/AccountDashboard.js",
71 "start": {
72 "line": 37,
73 "column": 20
74 },
75 "end": {
76 "line": 40,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.account.accountType.premium",
82 "defaultMessage": "!!!Premium Supporter Account",
83 "file": "src/components/settings/account/AccountDashboard.js",
84 "start": {
85 "line": 41,
86 "column": 22
87 },
88 "end": {
89 "line": 44,
90 "column": 3 25 "column": 3
91 } 26 }
92 }, 27 },
@@ -95,11 +30,11 @@
95 "defaultMessage": "!!!Edit Account", 30 "defaultMessage": "!!!Edit Account",
96 "file": "src/components/settings/account/AccountDashboard.js", 31 "file": "src/components/settings/account/AccountDashboard.js",
97 "start": { 32 "start": {
98 "line": 45, 33 "line": 22,
99 "column": 21 34 "column": 21
100 }, 35 },
101 "end": { 36 "end": {
102 "line": 48, 37 "line": 25,
103 "column": 3 38 "column": 3
104 } 39 }
105 }, 40 },
@@ -108,24 +43,11 @@
108 "defaultMessage": "!!Invoices", 43 "defaultMessage": "!!Invoices",
109 "file": "src/components/settings/account/AccountDashboard.js", 44 "file": "src/components/settings/account/AccountDashboard.js",
110 "start": { 45 "start": {
111 "line": 49, 46 "line": 26,
112 "column": 18 47 "column": 18
113 }, 48 },
114 "end": { 49 "end": {
115 "line": 52, 50 "line": 29,
116 "column": 3
117 }
118 },
119 {
120 "id": "settings.account.invoiceDownload",
121 "defaultMessage": "!!!Download",
122 "file": "src/components/settings/account/AccountDashboard.js",
123 "start": {
124 "line": 53,
125 "column": 19
126 },
127 "end": {
128 "line": 56,
129 "column": 3 51 "column": 3
130 } 52 }
131 }, 53 },
@@ -134,11 +56,11 @@
134 "defaultMessage": "!!!Could not load user information", 56 "defaultMessage": "!!!Could not load user information",
135 "file": "src/components/settings/account/AccountDashboard.js", 57 "file": "src/components/settings/account/AccountDashboard.js",
136 "start": { 58 "start": {
137 "line": 57, 59 "line": 30,
138 "column": 25 60 "column": 25
139 }, 61 },
140 "end": { 62 "end": {
141 "line": 60, 63 "line": 33,
142 "column": 3 64 "column": 3
143 } 65 }
144 }, 66 },
@@ -147,11 +69,11 @@
147 "defaultMessage": "!!!Try again", 69 "defaultMessage": "!!!Try again",
148 "file": "src/components/settings/account/AccountDashboard.js", 70 "file": "src/components/settings/account/AccountDashboard.js",
149 "start": { 71 "start": {
150 "line": 61, 72 "line": 34,
151 "column": 28 73 "column": 28
152 }, 74 },
153 "end": { 75 "end": {
154 "line": 64, 76 "line": 37,
155 "column": 3 77 "column": 3
156 } 78 }
157 }, 79 },
@@ -160,11 +82,11 @@
160 "defaultMessage": "!!!Delete account", 82 "defaultMessage": "!!!Delete account",
161 "file": "src/components/settings/account/AccountDashboard.js", 83 "file": "src/components/settings/account/AccountDashboard.js",
162 "start": { 84 "start": {
163 "line": 65, 85 "line": 38,
164 "column": 17 86 "column": 17
165 }, 87 },
166 "end": { 88 "end": {
167 "line": 68, 89 "line": 41,
168 "column": 3 90 "column": 3
169 } 91 }
170 }, 92 },
@@ -173,11 +95,11 @@
173 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.", 95 "defaultMessage": "!!!If you don't need your Ferdi account any longer, you can delete your account and all related data here.",
174 "file": "src/components/settings/account/AccountDashboard.js", 96 "file": "src/components/settings/account/AccountDashboard.js",
175 "start": { 97 "start": {
176 "line": 69, 98 "line": 42,
177 "column": 14 99 "column": 14
178 }, 100 },
179 "end": { 101 "end": {
180 "line": 73, 102 "line": 46,
181 "column": 3 103 "column": 3
182 } 104 }
183 }, 105 },
@@ -186,24 +108,11 @@
186 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 108 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
187 "file": "src/components/settings/account/AccountDashboard.js", 109 "file": "src/components/settings/account/AccountDashboard.js",
188 "start": { 110 "start": {
189 "line": 74, 111 "line": 47,
190 "column": 19 112 "column": 19
191 }, 113 },
192 "end": { 114 "end": {
193 "line": 78, 115 "line": 51,
194 "column": 3
195 }
196 },
197 {
198 "id": "settings.account.trial",
199 "defaultMessage": "!!!Free Trial",
200 "file": "src/components/settings/account/AccountDashboard.js",
201 "start": {
202 "line": 79,
203 "column": 9
204 },
205 "end": {
206 "line": 82,
207 "column": 3 116 "column": 3
208 } 117 }
209 }, 118 },
@@ -212,37 +121,11 @@
212 "defaultMessage": "!!!Your Franz License:", 121 "defaultMessage": "!!!Your Franz License:",
213 "file": "src/components/settings/account/AccountDashboard.js", 122 "file": "src/components/settings/account/AccountDashboard.js",
214 "start": { 123 "start": {
215 "line": 83, 124 "line": 52,
216 "column": 15
217 },
218 "end": {
219 "line": 86,
220 "column": 3
221 }
222 },
223 {
224 "id": "settings.account.trialEndsIn",
225 "defaultMessage": "!!!Your free trial ends in {duration}.",
226 "file": "src/components/settings/account/AccountDashboard.js",
227 "start": {
228 "line": 87,
229 "column": 15 125 "column": 15
230 }, 126 },
231 "end": { 127 "end": {
232 "line": 90, 128 "line": 55,
233 "column": 3
234 }
235 },
236 {
237 "id": "settings.account.trialUpdateBillingInfo",
238 "defaultMessage": "!!!Please update your billing info to continue using {license} after your trial period.",
239 "file": "src/components/settings/account/AccountDashboard.js",
240 "start": {
241 "line": 91,
242 "column": 33
243 },
244 "end": {
245 "line": 95,
246 "column": 3 129 "column": 3
247 } 130 }
248 }, 131 },
@@ -251,11 +134,11 @@
251 "defaultMessage": "Account is unavailable", 134 "defaultMessage": "Account is unavailable",
252 "file": "src/components/settings/account/AccountDashboard.js", 135 "file": "src/components/settings/account/AccountDashboard.js",
253 "start": { 136 "start": {
254 "line": 96, 137 "line": 56,
255 "column": 22 138 "column": 22
256 }, 139 },
257 "end": { 140 "end": {
258 "line": 99, 141 "line": 59,
259 "column": 3 142 "column": 3
260 } 143 }
261 }, 144 },
@@ -264,11 +147,11 @@
264 "defaultMessage": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.", 147 "defaultMessage": "You are using Ferdi without an account. If you want to use Ferdi with an account and keep your services synchronized across installations, please select a server in the Settings tab then login.",
265 "file": "src/components/settings/account/AccountDashboard.js", 148 "file": "src/components/settings/account/AccountDashboard.js",
266 "start": { 149 "start": {
267 "line": 100, 150 "line": 60,
268 "column": 26 151 "column": 26
269 }, 152 },
270 "end": { 153 "end": {
271 "line": 103, 154 "line": 63,
272 "column": 3 155 "column": 3
273 } 156 }
274 } 157 }
diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
index d7906fa7d..705b7cee3 100644
--- a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
+++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Available services", 4 "defaultMessage": "!!!Available services",
5 "file": "src/components/settings/navigation/SettingsNavigation.js", 5 "file": "src/components/settings/navigation/SettingsNavigation.js",
6 "start": { 6 "start": {
7 "line": 17, 7 "line": 15,
8 "column": 21 8 "column": 21
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 20, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Your services", 17 "defaultMessage": "!!!Your services",
18 "file": "src/components/settings/navigation/SettingsNavigation.js", 18 "file": "src/components/settings/navigation/SettingsNavigation.js",
19 "start": { 19 "start": {
20 "line": 21, 20 "line": 19,
21 "column": 16 21 "column": 16
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 24, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Your workspaces", 30 "defaultMessage": "!!!Your workspaces",
31 "file": "src/components/settings/navigation/SettingsNavigation.js", 31 "file": "src/components/settings/navigation/SettingsNavigation.js",
32 "start": { 32 "start": {
33 "line": 25, 33 "line": 23,
34 "column": 18 34 "column": 18
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 28, 37 "line": 26,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Account", 43 "defaultMessage": "!!!Account",
44 "file": "src/components/settings/navigation/SettingsNavigation.js", 44 "file": "src/components/settings/navigation/SettingsNavigation.js",
45 "start": { 45 "start": {
46 "line": 29, 46 "line": 27,
47 "column": 11 47 "column": 11
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 32, 50 "line": 30,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Manage Team", 56 "defaultMessage": "!!!Manage Team",
57 "file": "src/components/settings/navigation/SettingsNavigation.js", 57 "file": "src/components/settings/navigation/SettingsNavigation.js",
58 "start": { 58 "start": {
59 "line": 33, 59 "line": 31,
60 "column": 8 60 "column": 8
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 36, 63 "line": 34,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Settings", 69 "defaultMessage": "!!!Settings",
70 "file": "src/components/settings/navigation/SettingsNavigation.js", 70 "file": "src/components/settings/navigation/SettingsNavigation.js",
71 "start": { 71 "start": {
72 "line": 37, 72 "line": 35,
73 "column": 12 73 "column": 12
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 40, 76 "line": 38,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!About Ferdi", 82 "defaultMessage": "!!!About Ferdi",
83 "file": "src/components/settings/navigation/SettingsNavigation.js", 83 "file": "src/components/settings/navigation/SettingsNavigation.js",
84 "start": { 84 "start": {
85 "line": 41, 85 "line": 39,
86 "column": 16 86 "column": 16
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 44, 89 "line": 42,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Logout", 95 "defaultMessage": "!!!Logout",
96 "file": "src/components/settings/navigation/SettingsNavigation.js", 96 "file": "src/components/settings/navigation/SettingsNavigation.js",
97 "start": { 97 "start": {
98 "line": 45, 98 "line": 43,
99 "column": 10 99 "column": 10
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 48, 102 "line": 46,
103 "column": 3 103 "column": 3
104 } 104 }
105 } 105 }
diff --git a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
index bbb55c7a0..7ab2916f5 100644
--- a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
+++ b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Available Services", 4 "defaultMessage": "!!!Available Services",
5 "file": "src/components/settings/recipes/RecipesDashboard.js", 5 "file": "src/components/settings/recipes/RecipesDashboard.js",
6 "start": { 6 "start": {
7 "line": 21, 7 "line": 19,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 24, 11 "line": 22,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,24 +17,11 @@
17 "defaultMessage": "!!!Search service", 17 "defaultMessage": "!!!Search service",
18 "file": "src/components/settings/recipes/RecipesDashboard.js", 18 "file": "src/components/settings/recipes/RecipesDashboard.js",
19 "start": { 19 "start": {
20 "line": 25, 20 "line": 23,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 28, 24 "line": 26,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.recipes.mostPopular",
30 "defaultMessage": "!!!Most popular",
31 "file": "src/components/settings/recipes/RecipesDashboard.js",
32 "start": {
33 "line": 29,
34 "column": 22
35 },
36 "end": {
37 "line": 32,
38 "column": 3 25 "column": 3
39 } 26 }
40 }, 27 },
@@ -43,11 +30,11 @@
43 "defaultMessage": "!!!All services", 30 "defaultMessage": "!!!All services",
44 "file": "src/components/settings/recipes/RecipesDashboard.js", 31 "file": "src/components/settings/recipes/RecipesDashboard.js",
45 "start": { 32 "start": {
46 "line": 33, 33 "line": 27,
47 "column": 14 34 "column": 14
48 }, 35 },
49 "end": { 36 "end": {
50 "line": 36, 37 "line": 30,
51 "column": 3 38 "column": 3
52 } 39 }
53 }, 40 },
@@ -56,11 +43,11 @@
56 "defaultMessage": "!!!Custom Services", 43 "defaultMessage": "!!!Custom Services",
57 "file": "src/components/settings/recipes/RecipesDashboard.js", 44 "file": "src/components/settings/recipes/RecipesDashboard.js",
58 "start": { 45 "start": {
59 "line": 37, 46 "line": 31,
60 "column": 17 47 "column": 17
61 }, 48 },
62 "end": { 49 "end": {
63 "line": 40, 50 "line": 34,
64 "column": 3 51 "column": 3
65 } 52 }
66 }, 53 },
@@ -69,11 +56,11 @@
69 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 56 "defaultMessage": "!!!Sorry, but no service matched your search term - but you can still probably add it using the \"Custom Website\" option. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
70 "file": "src/components/settings/recipes/RecipesDashboard.js", 57 "file": "src/components/settings/recipes/RecipesDashboard.js",
71 "start": { 58 "start": {
72 "line": 41, 59 "line": 35,
73 "column": 16 60 "column": 16
74 }, 61 },
75 "end": { 62 "end": {
76 "line": 44, 63 "line": 38,
77 "column": 3 64 "column": 3
78 } 65 }
79 }, 66 },
@@ -82,11 +69,11 @@
82 "defaultMessage": "!!!Service successfully added", 69 "defaultMessage": "!!!Service successfully added",
83 "file": "src/components/settings/recipes/RecipesDashboard.js", 70 "file": "src/components/settings/recipes/RecipesDashboard.js",
84 "start": { 71 "start": {
85 "line": 45, 72 "line": 39,
86 "column": 31 73 "column": 31
87 }, 74 },
88 "end": { 75 "end": {
89 "line": 48, 76 "line": 42,
90 "column": 3 77 "column": 3
91 } 78 }
92 }, 79 },
@@ -95,11 +82,11 @@
95 "defaultMessage": "!!!Missing a service?", 82 "defaultMessage": "!!!Missing a service?",
96 "file": "src/components/settings/recipes/RecipesDashboard.js", 83 "file": "src/components/settings/recipes/RecipesDashboard.js",
97 "start": { 84 "start": {
98 "line": 49, 85 "line": 43,
99 "column": 18 86 "column": 18
100 }, 87 },
101 "end": { 88 "end": {
102 "line": 52, 89 "line": 46,
103 "column": 3 90 "column": 3
104 } 91 }
105 }, 92 },
@@ -108,11 +95,11 @@
108 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:", 95 "defaultMessage": "!!!To add a custom service, copy the recipe folder into:",
109 "file": "src/components/settings/recipes/RecipesDashboard.js", 96 "file": "src/components/settings/recipes/RecipesDashboard.js",
110 "start": { 97 "start": {
111 "line": 53, 98 "line": 47,
112 "column": 21 99 "column": 21
113 }, 100 },
114 "end": { 101 "end": {
115 "line": 56, 102 "line": 50,
116 "column": 3 103 "column": 3
117 } 104 }
118 }, 105 },
@@ -121,11 +108,11 @@
121 "defaultMessage": "!!!Open directory", 108 "defaultMessage": "!!!Open directory",
122 "file": "src/components/settings/recipes/RecipesDashboard.js", 109 "file": "src/components/settings/recipes/RecipesDashboard.js",
123 "start": { 110 "start": {
124 "line": 57, 111 "line": 51,
125 "column": 14 112 "column": 14
126 }, 113 },
127 "end": { 114 "end": {
128 "line": 60, 115 "line": 54,
129 "column": 3 116 "column": 3
130 } 117 }
131 }, 118 },
@@ -134,11 +121,11 @@
134 "defaultMessage": "!!!Developer Documentation", 121 "defaultMessage": "!!!Developer Documentation",
135 "file": "src/components/settings/recipes/RecipesDashboard.js", 122 "file": "src/components/settings/recipes/RecipesDashboard.js",
136 "start": { 123 "start": {
137 "line": 61, 124 "line": 55,
138 "column": 15 125 "column": 15
139 }, 126 },
140 "end": { 127 "end": {
141 "line": 64, 128 "line": 58,
142 "column": 3 129 "column": 3
143 } 130 }
144 }, 131 },
@@ -147,11 +134,11 @@
147 "defaultMessage": "!!!Custom 3rd Party Recipes", 134 "defaultMessage": "!!!Custom 3rd Party Recipes",
148 "file": "src/components/settings/recipes/RecipesDashboard.js", 135 "file": "src/components/settings/recipes/RecipesDashboard.js",
149 "start": { 136 "start": {
150 "line": 65, 137 "line": 59,
151 "column": 25 138 "column": 25
152 }, 139 },
153 "end": { 140 "end": {
154 "line": 68, 141 "line": 62,
155 "column": 3 142 "column": 3
156 } 143 }
157 }, 144 },
@@ -160,11 +147,11 @@
160 "defaultMessage": "!!!Community 3rd Party Recipes", 147 "defaultMessage": "!!!Community 3rd Party Recipes",
161 "file": "src/components/settings/recipes/RecipesDashboard.js", 148 "file": "src/components/settings/recipes/RecipesDashboard.js",
162 "start": { 149 "start": {
163 "line": 69, 150 "line": 63,
164 "column": 28 151 "column": 28
165 }, 152 },
166 "end": { 153 "end": {
167 "line": 72, 154 "line": 66,
168 "column": 3 155 "column": 3
169 } 156 }
170 }, 157 },
@@ -173,11 +160,11 @@
173 "defaultMessage": "!!!Your Development Service Recipes", 160 "defaultMessage": "!!!Your Development Service Recipes",
174 "file": "src/components/settings/recipes/RecipesDashboard.js", 161 "file": "src/components/settings/recipes/RecipesDashboard.js",
175 "start": { 162 "start": {
176 "line": 73, 163 "line": 67,
177 "column": 22 164 "column": 22
178 }, 165 },
179 "end": { 166 "end": {
180 "line": 76, 167 "line": 70,
181 "column": 3 168 "column": 3
182 } 169 }
183 } 170 }
diff --git a/src/i18n/messages/src/components/settings/services/EditServiceForm.json b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
index 0aee52148..d7830f198 100644
--- a/src/i18n/messages/src/components/settings/services/EditServiceForm.json
+++ b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Save service", 4 "defaultMessage": "!!!Save service",
5 "file": "src/components/settings/services/EditServiceForm.js", 5 "file": "src/components/settings/services/EditServiceForm.js",
6 "start": { 6 "start": {
7 "line": 27, 7 "line": 23,
8 "column": 15 8 "column": 15
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 30, 11 "line": 26,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Delete Service", 17 "defaultMessage": "!!!Delete Service",
18 "file": "src/components/settings/services/EditServiceForm.js", 18 "file": "src/components/settings/services/EditServiceForm.js",
19 "start": { 19 "start": {
20 "line": 31, 20 "line": 27,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 34, 24 "line": 30,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Open darkmode.css", 30 "defaultMessage": "!!!Open darkmode.css",
31 "file": "src/components/settings/services/EditServiceForm.js", 31 "file": "src/components/settings/services/EditServiceForm.js",
32 "start": { 32 "start": {
33 "line": 35, 33 "line": 31,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 38, 37 "line": 34,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Open user.css", 43 "defaultMessage": "!!!Open user.css",
44 "file": "src/components/settings/services/EditServiceForm.js", 44 "file": "src/components/settings/services/EditServiceForm.js",
45 "start": { 45 "start": {
46 "line": 39, 46 "line": 35,
47 "column": 15 47 "column": 15
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 42, 50 "line": 38,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Open user.js", 56 "defaultMessage": "!!!Open user.js",
57 "file": "src/components/settings/services/EditServiceForm.js", 57 "file": "src/components/settings/services/EditServiceForm.js",
58 "start": { 58 "start": {
59 "line": 43, 59 "line": 39,
60 "column": 14 60 "column": 14
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 46, 63 "line": 42,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.", 69 "defaultMessage": "!!!Your user files will be inserted into the webpage so you can customize services in any way you like. User files are only stored locally and are not transferred to other computers using the same account.",
70 "file": "src/components/settings/services/EditServiceForm.js", 70 "file": "src/components/settings/services/EditServiceForm.js",
71 "start": { 71 "start": {
72 "line": 47, 72 "line": 43,
73 "column": 18 73 "column": 18
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 50, 76 "line": 46,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Available services", 82 "defaultMessage": "!!!Available services",
83 "file": "src/components/settings/services/EditServiceForm.js", 83 "file": "src/components/settings/services/EditServiceForm.js",
84 "start": { 84 "start": {
85 "line": 51, 85 "line": 47,
86 "column": 21 86 "column": 21
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 54, 89 "line": 50,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Your services", 95 "defaultMessage": "!!!Your services",
96 "file": "src/components/settings/services/EditServiceForm.js", 96 "file": "src/components/settings/services/EditServiceForm.js",
97 "start": { 97 "start": {
98 "line": 55, 98 "line": 51,
99 "column": 16 99 "column": 16
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 58, 102 "line": 54,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Add {name}", 108 "defaultMessage": "!!!Add {name}",
109 "file": "src/components/settings/services/EditServiceForm.js", 109 "file": "src/components/settings/services/EditServiceForm.js",
110 "start": { 110 "start": {
111 "line": 59, 111 "line": 55,
112 "column": 22 112 "column": 22
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 62, 115 "line": 58,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Edit {name}", 121 "defaultMessage": "!!!Edit {name}",
122 "file": "src/components/settings/services/EditServiceForm.js", 122 "file": "src/components/settings/services/EditServiceForm.js",
123 "start": { 123 "start": {
124 "line": 63, 124 "line": 59,
125 "column": 23 125 "column": 23
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 66, 128 "line": 62,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Hosted", 134 "defaultMessage": "!!!Hosted",
135 "file": "src/components/settings/services/EditServiceForm.js", 135 "file": "src/components/settings/services/EditServiceForm.js",
136 "start": { 136 "start": {
137 "line": 67, 137 "line": 63,
138 "column": 13 138 "column": 13
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 70, 141 "line": 66,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Self hosted ⭐️", 147 "defaultMessage": "!!!Self hosted ⭐️",
148 "file": "src/components/settings/services/EditServiceForm.js", 148 "file": "src/components/settings/services/EditServiceForm.js",
149 "start": { 149 "start": {
150 "line": 71, 150 "line": 67,
151 "column": 16 151 "column": 16
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 74, 154 "line": 70,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Use the hosted {name} service.", 160 "defaultMessage": "!!!Use the hosted {name} service.",
161 "file": "src/components/settings/services/EditServiceForm.js", 161 "file": "src/components/settings/services/EditServiceForm.js",
162 "start": { 162 "start": {
163 "line": 75, 163 "line": 71,
164 "column": 20 164 "column": 20
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 78, 167 "line": 74,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,37 +173,11 @@
173 "defaultMessage": "!!!Could not validate custom {name} server.", 173 "defaultMessage": "!!!Could not validate custom {name} server.",
174 "file": "src/components/settings/services/EditServiceForm.js", 174 "file": "src/components/settings/services/EditServiceForm.js",
175 "start": { 175 "start": {
176 "line": 79, 176 "line": 75,
177 "column": 28 177 "column": 28
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 82, 180 "line": 78,
181 "column": 3
182 }
183 },
184 {
185 "id": "settings.service.form.customUrlPremiumInfo",
186 "defaultMessage": "!!!To add self hosted services, you need a Ferdi Premium Supporter Account.",
187 "file": "src/components/settings/services/EditServiceForm.js",
188 "start": {
189 "line": 83,
190 "column": 24
191 },
192 "end": {
193 "line": 86,
194 "column": 3
195 }
196 },
197 {
198 "id": "settings.service.form.customUrlUpgradeAccount",
199 "defaultMessage": "!!!Upgrade your account",
200 "file": "src/components/settings/services/EditServiceForm.js",
201 "start": {
202 "line": 87,
203 "column": 27
204 },
205 "end": {
206 "line": 90,
207 "column": 3 181 "column": 3
208 } 182 }
209 }, 183 },
@@ -212,11 +186,11 @@
212 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 186 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
213 "file": "src/components/settings/services/EditServiceForm.js", 187 "file": "src/components/settings/services/EditServiceForm.js",
214 "start": { 188 "start": {
215 "line": 91, 189 "line": 79,
216 "column": 23 190 "column": 23
217 }, 191 },
218 "end": { 192 "end": {
219 "line": 94, 193 "line": 82,
220 "column": 3 194 "column": 3
221 } 195 }
222 }, 196 },
@@ -225,11 +199,11 @@
225 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", 199 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
226 "file": "src/components/settings/services/EditServiceForm.js", 200 "file": "src/components/settings/services/EditServiceForm.js",
227 "start": { 201 "start": {
228 "line": 95, 202 "line": 83,
229 "column": 15 203 "column": 15
230 }, 204 },
231 "end": { 205 "end": {
232 "line": 98, 206 "line": 86,
233 "column": 3 207 "column": 3
234 } 208 }
235 }, 209 },
@@ -238,11 +212,11 @@
238 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.", 212 "defaultMessage": "!!!When enabled, a service will be shut down after a period of time to save system resources.",
239 "file": "src/components/settings/services/EditServiceForm.js", 213 "file": "src/components/settings/services/EditServiceForm.js",
240 "start": { 214 "start": {
241 "line": 99, 215 "line": 87,
242 "column": 28 216 "column": 28
243 }, 217 },
244 "end": { 218 "end": {
245 "line": 102, 219 "line": 90,
246 "column": 3 220 "column": 3
247 } 221 }
248 }, 222 },
@@ -251,11 +225,11 @@
251 "defaultMessage": "!!!Notifications", 225 "defaultMessage": "!!!Notifications",
252 "file": "src/components/settings/services/EditServiceForm.js", 226 "file": "src/components/settings/services/EditServiceForm.js",
253 "start": { 227 "start": {
254 "line": 103, 228 "line": 91,
255 "column": 25 229 "column": 25
256 }, 230 },
257 "end": { 231 "end": {
258 "line": 106, 232 "line": 94,
259 "column": 3 233 "column": 3
260 } 234 }
261 }, 235 },
@@ -264,11 +238,11 @@
264 "defaultMessage": "!!!Unread message badges", 238 "defaultMessage": "!!!Unread message badges",
265 "file": "src/components/settings/services/EditServiceForm.js", 239 "file": "src/components/settings/services/EditServiceForm.js",
266 "start": { 240 "start": {
267 "line": 107, 241 "line": 95,
268 "column": 18 242 "column": 18
269 }, 243 },
270 "end": { 244 "end": {
271 "line": 110, 245 "line": 98,
272 "column": 3 246 "column": 3
273 } 247 }
274 }, 248 },
@@ -277,11 +251,11 @@
277 "defaultMessage": "!!!General", 251 "defaultMessage": "!!!General",
278 "file": "src/components/settings/services/EditServiceForm.js", 252 "file": "src/components/settings/services/EditServiceForm.js",
279 "start": { 253 "start": {
280 "line": 111, 254 "line": 99,
281 "column": 19 255 "column": 19
282 }, 256 },
283 "end": { 257 "end": {
284 "line": 114, 258 "line": 102,
285 "column": 3 259 "column": 3
286 } 260 }
287 }, 261 },
@@ -290,11 +264,11 @@
290 "defaultMessage": "!!!Dark Reader Settings", 264 "defaultMessage": "!!!Dark Reader Settings",
291 "file": "src/components/settings/services/EditServiceForm.js", 265 "file": "src/components/settings/services/EditServiceForm.js",
292 "start": { 266 "start": {
293 "line": 115, 267 "line": 103,
294 "column": 30 268 "column": 30
295 }, 269 },
296 "end": { 270 "end": {
297 "line": 118, 271 "line": 106,
298 "column": 3 272 "column": 3
299 } 273 }
300 }, 274 },
@@ -303,11 +277,11 @@
303 "defaultMessage": "!!!Delete", 277 "defaultMessage": "!!!Delete",
304 "file": "src/components/settings/services/EditServiceForm.js", 278 "file": "src/components/settings/services/EditServiceForm.js",
305 "start": { 279 "start": {
306 "line": 119, 280 "line": 107,
307 "column": 14 281 "column": 14
308 }, 282 },
309 "end": { 283 "end": {
310 "line": 122, 284 "line": 110,
311 "column": 3 285 "column": 3
312 } 286 }
313 }, 287 },
@@ -316,11 +290,11 @@
316 "defaultMessage": "!!!Drop your image, or click here", 290 "defaultMessage": "!!!Drop your image, or click here",
317 "file": "src/components/settings/services/EditServiceForm.js", 291 "file": "src/components/settings/services/EditServiceForm.js",
318 "start": { 292 "start": {
319 "line": 123, 293 "line": 111,
320 "column": 14 294 "column": 14
321 }, 295 },
322 "end": { 296 "end": {
323 "line": 126, 297 "line": 114,
324 "column": 3 298 "column": 3
325 } 299 }
326 }, 300 },
@@ -329,11 +303,11 @@
329 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", 303 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
330 "file": "src/components/settings/services/EditServiceForm.js", 304 "file": "src/components/settings/services/EditServiceForm.js",
331 "start": { 305 "start": {
332 "line": 127, 306 "line": 115,
333 "column": 17 307 "column": 17
334 }, 308 },
335 "end": { 309 "end": {
336 "line": 130, 310 "line": 118,
337 "column": 3 311 "column": 3
338 } 312 }
339 }, 313 },
@@ -342,11 +316,11 @@
342 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.", 316 "defaultMessage": "!!!Please restart Ferdi after changing proxy Settings.",
343 "file": "src/components/settings/services/EditServiceForm.js", 317 "file": "src/components/settings/services/EditServiceForm.js",
344 "start": { 318 "start": {
345 "line": 131, 319 "line": 119,
346 "column": 20 320 "column": 20
347 }, 321 },
348 "end": { 322 "end": {
349 "line": 134, 323 "line": 122,
350 "column": 3 324 "column": 3
351 } 325 }
352 }, 326 },
@@ -355,11 +329,11 @@
355 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.", 329 "defaultMessage": "!!!Proxy settings will not be synchronized with the Ferdi servers.",
356 "file": "src/components/settings/services/EditServiceForm.js", 330 "file": "src/components/settings/services/EditServiceForm.js",
357 "start": { 331 "start": {
358 "line": 135, 332 "line": 123,
359 "column": 13 333 "column": 13
360 }, 334 },
361 "end": { 335 "end": {
362 "line": 138, 336 "line": 126,
363 "column": 3 337 "column": 3
364 } 338 }
365 } 339 }
diff --git a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
index fed05111e..7e7c5d67e 100644
--- a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
+++ b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your services", 4 "defaultMessage": "!!!Your services",
5 "file": "src/components/settings/services/ServicesDashboard.js", 5 "file": "src/components/settings/services/ServicesDashboard.js",
6 "start": { 6 "start": {
7 "line": 16, 7 "line": 15,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 19, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Search service", 17 "defaultMessage": "!!!Search service",
18 "file": "src/components/settings/services/ServicesDashboard.js", 18 "file": "src/components/settings/services/ServicesDashboard.js",
19 "start": { 19 "start": {
20 "line": 20, 20 "line": 19,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 23, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Start by adding a service.", 30 "defaultMessage": "!!!Start by adding a service.",
31 "file": "src/components/settings/services/ServicesDashboard.js", 31 "file": "src/components/settings/services/ServicesDashboard.js",
32 "start": { 32 "start": {
33 "line": 24, 33 "line": 23,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 27, 37 "line": 26,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.", 43 "defaultMessage": "!!!Sorry, but no service matched your search term. Please note that the website might show more services that have been added to Ferdi since the version that you are currently on. To get those new services, please consider upgrading to a newer version of Ferdi.",
44 "file": "src/components/settings/services/ServicesDashboard.js", 44 "file": "src/components/settings/services/ServicesDashboard.js",
45 "start": { 45 "start": {
46 "line": 28, 46 "line": 27,
47 "column": 18 47 "column": 18
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 31, 50 "line": 30,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Discover services", 56 "defaultMessage": "!!!Discover services",
57 "file": "src/components/settings/services/ServicesDashboard.js", 57 "file": "src/components/settings/services/ServicesDashboard.js",
58 "start": { 58 "start": {
59 "line": 32, 59 "line": 31,
60 "column": 20 60 "column": 20
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 35, 63 "line": 34,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Could not load your services", 69 "defaultMessage": "!!!Could not load your services",
70 "file": "src/components/settings/services/ServicesDashboard.js", 70 "file": "src/components/settings/services/ServicesDashboard.js",
71 "start": { 71 "start": {
72 "line": 36, 72 "line": 35,
73 "column": 25 73 "column": 25
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 39, 76 "line": 38,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Try again", 82 "defaultMessage": "!!!Try again",
83 "file": "src/components/settings/services/ServicesDashboard.js", 83 "file": "src/components/settings/services/ServicesDashboard.js",
84 "start": { 84 "start": {
85 "line": 40, 85 "line": 39,
86 "column": 21 86 "column": 21
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 43, 89 "line": 42,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Your changes have been saved", 95 "defaultMessage": "!!!Your changes have been saved",
96 "file": "src/components/settings/services/ServicesDashboard.js", 96 "file": "src/components/settings/services/ServicesDashboard.js",
97 "start": { 97 "start": {
98 "line": 44, 98 "line": 43,
99 "column": 15 99 "column": 15
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 47, 102 "line": 46,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Service has been deleted", 108 "defaultMessage": "!!!Service has been deleted",
109 "file": "src/components/settings/services/ServicesDashboard.js", 109 "file": "src/components/settings/services/ServicesDashboard.js",
110 "start": { 110 "start": {
111 "line": 48, 111 "line": 47,
112 "column": 15 112 "column": 15
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 51, 115 "line": 50,
116 "column": 3 116 "column": 3
117 } 117 }
118 } 118 }
diff --git a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
index a1e8c714e..548d52af9 100644
--- a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
+++ b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Settings", 4 "defaultMessage": "!!!Settings",
5 "file": "src/components/settings/settings/EditSettingsForm.js", 5 "file": "src/components/settings/settings/EditSettingsForm.js",
6 "start": { 6 "start": {
7 "line": 24, 7 "line": 23,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 27, 11 "line": 26,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,24 +17,24 @@
17 "defaultMessage": "!!!General", 17 "defaultMessage": "!!!General",
18 "file": "src/components/settings/settings/EditSettingsForm.js", 18 "file": "src/components/settings/settings/EditSettingsForm.js",
19 "start": { 19 "start": {
20 "line": 28, 20 "line": 27,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 31, 24 "line": 30,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
28 { 28 {
29 "id": "settings.app.sentryInfo", 29 "id": "settings.app.sentryInfo",
30 "defaultMessage": "!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data! Changing this option requires you to restart Ferdi.", 30 "defaultMessage": "!!!Sending telemetry data allows us to find errors in Ferdi - we will not send any personal information like your message data!",
31 "file": "src/components/settings/settings/EditSettingsForm.js", 31 "file": "src/components/settings/settings/EditSettingsForm.js",
32 "start": { 32 "start": {
33 "line": 32, 33 "line": 31,
34 "column": 14 34 "column": 14
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 35, 37 "line": 34,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.", 43 "defaultMessage": "!!!By default, Ferdi will keep all your services open and loaded in the background so they are ready when you want to use them. Service Hibernation will unload your services after a specified amount. This is useful to save RAM or keeping services from slowing down your computer.",
44 "file": "src/components/settings/settings/EditSettingsForm.js", 44 "file": "src/components/settings/settings/EditSettingsForm.js",
45 "start": { 45 "start": {
46 "line": 36, 46 "line": 35,
47 "column": 17 47 "column": 17
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 39, 50 "line": 38,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable", 56 "defaultMessage": "!!!Minutes of inactivity, after which Ferdi should automatically lock. Use 0 to disable",
57 "file": "src/components/settings/settings/EditSettingsForm.js", 57 "file": "src/components/settings/settings/EditSettingsForm.js",
58 "start": { 58 "start": {
59 "line": 40, 59 "line": 39,
60 "column": 22 60 "column": 22
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 43, 63 "line": 42,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)", 69 "defaultMessage": "!!!This server will be used for the \"Franz Todo\" feature. (default: https://app.franztodos.com)",
70 "file": "src/components/settings/settings/EditSettingsForm.js", 70 "file": "src/components/settings/settings/EditSettingsForm.js",
71 "start": { 71 "start": {
72 "line": 44, 72 "line": 43,
73 "column": 18 73 "column": 18
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 47, 76 "line": 46,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Password", 82 "defaultMessage": "!!!Password",
83 "file": "src/components/settings/settings/EditSettingsForm.js", 83 "file": "src/components/settings/settings/EditSettingsForm.js",
84 "start": { 84 "start": {
85 "line": 48, 85 "line": 47,
86 "column": 18 86 "column": 18
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 51, 89 "line": 50,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,24 +95,24 @@
95 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.", 95 "defaultMessage": "!!!Please make sure to set a password you'll remember.\nIf you loose this password, you will have to reinstall Ferdi.",
96 "file": "src/components/settings/settings/EditSettingsForm.js", 96 "file": "src/components/settings/settings/EditSettingsForm.js",
97 "start": { 97 "start": {
98 "line": 52, 98 "line": 51,
99 "column": 22 99 "column": 22
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 55, 102 "line": 54,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
106 { 106 {
107 "id": "settings.app.lockInfo", 107 "id": "settings.app.lockInfo",
108 "defaultMessage": "!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut CMD/CTRL+Shift+L.", 108 "defaultMessage": "!!!Password Lock allows you to keep your messages protected.\nUsing Password Lock, you will be prompted to enter your password everytime you start Ferdi or lock Ferdi yourself using the lock symbol in the bottom left corner or the shortcut {lockShortcut}.",
109 "file": "src/components/settings/settings/EditSettingsForm.js", 109 "file": "src/components/settings/settings/EditSettingsForm.js",
110 "start": { 110 "start": {
111 "line": 56, 111 "line": 55,
112 "column": 12 112 "column": 12
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 59, 115 "line": 58,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.", 121 "defaultMessage": "!!!Times in 24-Hour-Format. End time can be before start time (e.g. start 17:00, end 09:00) to enable Do-not-Disturb overnight.",
122 "file": "src/components/settings/settings/EditSettingsForm.js", 122 "file": "src/components/settings/settings/EditSettingsForm.js",
123 "start": { 123 "start": {
124 "line": 60, 124 "line": 59,
125 "column": 24 125 "column": 24
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 63, 128 "line": 62,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.", 134 "defaultMessage": "!!!Scheduled Do-not-Disturb allows you to define a period of time in which you do not want to get Notifications from Ferdi.",
135 "file": "src/components/settings/settings/EditSettingsForm.js", 135 "file": "src/components/settings/settings/EditSettingsForm.js",
136 "start": { 136 "start": {
137 "line": 64, 137 "line": 63,
138 "column": 20 138 "column": 20
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 67, 141 "line": 66,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Language", 147 "defaultMessage": "!!!Language",
148 "file": "src/components/settings/settings/EditSettingsForm.js", 148 "file": "src/components/settings/settings/EditSettingsForm.js",
149 "start": { 149 "start": {
150 "line": 68, 150 "line": 67,
151 "column": 20 151 "column": 20
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 71, 154 "line": 70,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Updates", 160 "defaultMessage": "!!!Updates",
161 "file": "src/components/settings/settings/EditSettingsForm.js", 161 "file": "src/components/settings/settings/EditSettingsForm.js",
162 "start": { 162 "start": {
163 "line": 72, 163 "line": 71,
164 "column": 19 164 "column": 19
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 75, 167 "line": 74,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Appearance", 173 "defaultMessage": "!!!Appearance",
174 "file": "src/components/settings/settings/EditSettingsForm.js", 174 "file": "src/components/settings/settings/EditSettingsForm.js",
175 "start": { 175 "start": {
176 "line": 76, 176 "line": 75,
177 "column": 22 177 "column": 22
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 79, 180 "line": 78,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.", 186 "defaultMessage": "!!!Universal Dark Mode tries to dynamically generate dark mode styles for services that are otherwise not currently supported.",
187 "file": "src/components/settings/settings/EditSettingsForm.js", 187 "file": "src/components/settings/settings/EditSettingsForm.js",
188 "start": { 188 "start": {
189 "line": 80, 189 "line": 79,
190 "column": 25 190 "column": 25
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 83, 193 "line": 82,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})", 199 "defaultMessage": "!!!Write your accent color in a CSS-compatible format. (Default: {defaultAccentColor})",
200 "file": "src/components/settings/settings/EditSettingsForm.js", 200 "file": "src/components/settings/settings/EditSettingsForm.js",
201 "start": { 201 "start": {
202 "line": 84, 202 "line": 83,
203 "column": 19 203 "column": 19
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 87, 206 "line": 86,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Privacy", 212 "defaultMessage": "!!!Privacy",
213 "file": "src/components/settings/settings/EditSettingsForm.js", 213 "file": "src/components/settings/settings/EditSettingsForm.js",
214 "start": { 214 "start": {
215 "line": 88, 215 "line": 87,
216 "column": 19 216 "column": 19
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 91, 219 "line": 90,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Advanced", 225 "defaultMessage": "!!!Advanced",
226 "file": "src/components/settings/settings/EditSettingsForm.js", 226 "file": "src/components/settings/settings/EditSettingsForm.js",
227 "start": { 227 "start": {
228 "line": 92, 228 "line": 91,
229 "column": 20 229 "column": 20
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 95, 232 "line": 94,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Help us to translate Ferdi into your language.", 238 "defaultMessage": "!!!Help us to translate Ferdi into your language.",
239 "file": "src/components/settings/settings/EditSettingsForm.js", 239 "file": "src/components/settings/settings/EditSettingsForm.js",
240 "start": { 240 "start": {
241 "line": 96, 241 "line": 95,
242 "column": 19 242 "column": 19
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 99, 245 "line": 98,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.", 251 "defaultMessage": "!!!Ferdi uses your Mac's build-in spellchecker to check for typos. If you want to change the languages the spellchecker checks for, you can do so in your Mac's System Preferences.",
252 "file": "src/components/settings/settings/EditSettingsForm.js", 252 "file": "src/components/settings/settings/EditSettingsForm.js",
253 "start": { 253 "start": {
254 "line": 100, 254 "line": 99,
255 "column": 28 255 "column": 28
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 103, 258 "line": 102,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Cache", 264 "defaultMessage": "!!!Cache",
265 "file": "src/components/settings/settings/EditSettingsForm.js", 265 "file": "src/components/settings/settings/EditSettingsForm.js",
266 "start": { 266 "start": {
267 "line": 104, 267 "line": 103,
268 "column": 20 268 "column": 20
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 107, 271 "line": 106,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.", 277 "defaultMessage": "!!!Ferdi cache is currently using {size} of disk space.",
278 "file": "src/components/settings/settings/EditSettingsForm.js", 278 "file": "src/components/settings/settings/EditSettingsForm.js",
279 "start": { 279 "start": {
280 "line": 108, 280 "line": 107,
281 "column": 13 281 "column": 13
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 111, 284 "line": 110,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Couldn't clear all cache", 290 "defaultMessage": "!!!Couldn't clear all cache",
291 "file": "src/components/settings/settings/EditSettingsForm.js", 291 "file": "src/components/settings/settings/EditSettingsForm.js",
292 "start": { 292 "start": {
293 "line": 112, 293 "line": 111,
294 "column": 19 294 "column": 19
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 115, 297 "line": 114,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Clear cache", 303 "defaultMessage": "!!!Clear cache",
304 "file": "src/components/settings/settings/EditSettingsForm.js", 304 "file": "src/components/settings/settings/EditSettingsForm.js",
305 "start": { 305 "start": {
306 "line": 116, 306 "line": 115,
307 "column": 23 307 "column": 23
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 119, 310 "line": 118,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Check for updates", 316 "defaultMessage": "!!!Check for updates",
317 "file": "src/components/settings/settings/EditSettingsForm.js", 317 "file": "src/components/settings/settings/EditSettingsForm.js",
318 "start": { 318 "start": {
319 "line": 120, 319 "line": 119,
320 "column": 25 320 "column": 25
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 123, 323 "line": 122,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!Restart & install update", 329 "defaultMessage": "!!!Restart & install update",
330 "file": "src/components/settings/settings/EditSettingsForm.js", 330 "file": "src/components/settings/settings/EditSettingsForm.js",
331 "start": { 331 "start": {
332 "line": 124, 332 "line": 123,
333 "column": 23 333 "column": 23
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 127, 336 "line": 126,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!Is searching for update", 342 "defaultMessage": "!!!Is searching for update",
343 "file": "src/components/settings/settings/EditSettingsForm.js", 343 "file": "src/components/settings/settings/EditSettingsForm.js",
344 "start": { 344 "start": {
345 "line": 128, 345 "line": 127,
346 "column": 25 346 "column": 25
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 131, 349 "line": 130,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Update available, downloading...", 355 "defaultMessage": "!!!Update available, downloading...",
356 "file": "src/components/settings/settings/EditSettingsForm.js", 356 "file": "src/components/settings/settings/EditSettingsForm.js",
357 "start": { 357 "start": {
358 "line": 132, 358 "line": 131,
359 "column": 25 359 "column": 25
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 135, 362 "line": 134,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!You are using the latest version of Ferdi", 368 "defaultMessage": "!!!You are using the latest version of Ferdi",
369 "file": "src/components/settings/settings/EditSettingsForm.js", 369 "file": "src/components/settings/settings/EditSettingsForm.js",
370 "start": { 370 "start": {
371 "line": 136, 371 "line": 135,
372 "column": 24 372 "column": 24
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 139, 375 "line": 138,
376 "column": 3 376 "column": 3
377 } 377 }
378 }, 378 },
@@ -381,11 +381,11 @@
381 "defaultMessage": "!!!Current version:", 381 "defaultMessage": "!!!Current version:",
382 "file": "src/components/settings/settings/EditSettingsForm.js", 382 "file": "src/components/settings/settings/EditSettingsForm.js",
383 "start": { 383 "start": {
384 "line": 140, 384 "line": 139,
385 "column": 18 385 "column": 18
386 }, 386 },
387 "end": { 387 "end": {
388 "line": 143, 388 "line": 142,
389 "column": 3 389 "column": 3
390 } 390 }
391 }, 391 },
@@ -394,11 +394,11 @@
394 "defaultMessage": "!!!Changes require restart", 394 "defaultMessage": "!!!Changes require restart",
395 "file": "src/components/settings/settings/EditSettingsForm.js", 395 "file": "src/components/settings/settings/EditSettingsForm.js",
396 "start": { 396 "start": {
397 "line": 144, 397 "line": 143,
398 "column": 22 398 "column": 22
399 }, 399 },
400 "end": { 400 "end": {
401 "line": 147, 401 "line": 146,
402 "column": 3 402 "column": 3
403 } 403 }
404 }, 404 },
@@ -407,11 +407,11 @@
407 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", 407 "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.",
408 "file": "src/components/settings/settings/EditSettingsForm.js", 408 "file": "src/components/settings/settings/EditSettingsForm.js",
409 "start": { 409 "start": {
410 "line": 148, 410 "line": 147,
411 "column": 22 411 "column": 22
412 }, 412 },
413 "end": { 413 "end": {
414 "line": 151, 414 "line": 150,
415 "column": 3 415 "column": 3
416 } 416 }
417 } 417 }
diff --git a/src/i18n/messages/src/components/settings/team/TeamDashboard.json b/src/i18n/messages/src/components/settings/team/TeamDashboard.json
index 0a3b818a7..ac42ad98a 100644
--- a/src/i18n/messages/src/components/settings/team/TeamDashboard.json
+++ b/src/i18n/messages/src/components/settings/team/TeamDashboard.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Team", 4 "defaultMessage": "!!!Team",
5 "file": "src/components/settings/team/TeamDashboard.js", 5 "file": "src/components/settings/team/TeamDashboard.js",
6 "start": { 6 "start": {
7 "line": 18, 7 "line": 15,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 21, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Franz Team Management", 17 "defaultMessage": "!!!Franz Team Management",
18 "file": "src/components/settings/team/TeamDashboard.js", 18 "file": "src/components/settings/team/TeamDashboard.js",
19 "start": { 19 "start": {
20 "line": 22, 20 "line": 19,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 25, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Your are currently using Franz Servers, which is why you have access to Team Management.", 30 "defaultMessage": "!!!Your are currently using Franz Servers, which is why you have access to Team Management.",
31 "file": "src/components/settings/team/TeamDashboard.js", 31 "file": "src/components/settings/team/TeamDashboard.js",
32 "start": { 32 "start": {
33 "line": 26, 33 "line": 23,
34 "column": 9 34 "column": 9
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 29, 37 "line": 26,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.", 43 "defaultMessage": "!!!Franz's Team Management allows you to manage Franz Subscriptions for multiple users. Please keep in mind that having a Franz Premium subscription will give you no advantages in using Ferdi: The only reason you still have access to Team Management is so you can manage your legacy Franz Teams and so that you don't loose any functionality in managing your account.",
44 "file": "src/components/settings/team/TeamDashboard.js", 44 "file": "src/components/settings/team/TeamDashboard.js",
45 "start": { 45 "start": {
46 "line": 30, 46 "line": 27,
47 "column": 8 47 "column": 8
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 33, 50 "line": 30,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,24 +56,11 @@
56 "defaultMessage": "!!!Manage your Team on meetfranz.com", 56 "defaultMessage": "!!!Manage your Team on meetfranz.com",
57 "file": "src/components/settings/team/TeamDashboard.js", 57 "file": "src/components/settings/team/TeamDashboard.js",
58 "start": { 58 "start": {
59 "line": 34, 59 "line": 31,
60 "column": 16 60 "column": 16
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 37, 63 "line": 34,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.team.upgradeAction",
69 "defaultMessage": "!!!Upgrade your Account",
70 "file": "src/components/settings/team/TeamDashboard.js",
71 "start": {
72 "line": 38,
73 "column": 17
74 },
75 "end": {
76 "line": 41,
77 "column": 3 64 "column": 3
78 } 65 }
79 }, 66 },
@@ -82,11 +69,11 @@
82 "defaultMessage": "!!!Teams are unavailable", 69 "defaultMessage": "!!!Teams are unavailable",
83 "file": "src/components/settings/team/TeamDashboard.js", 70 "file": "src/components/settings/team/TeamDashboard.js",
84 "start": { 71 "start": {
85 "line": 42, 72 "line": 35,
86 "column": 20 73 "column": 20
87 }, 74 },
88 "end": { 75 "end": {
89 "line": 45, 76 "line": 38,
90 "column": 3 77 "column": 3
91 } 78 }
92 }, 79 },
@@ -95,11 +82,11 @@
95 "defaultMessage": "!!!Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.", 82 "defaultMessage": "!!!Teams are currently only available when using the Franz Server and after paying for Franz Professional. Please change your server to https://api.franzinfra.com to use teams.",
96 "file": "src/components/settings/team/TeamDashboard.js", 83 "file": "src/components/settings/team/TeamDashboard.js",
97 "start": { 84 "start": {
98 "line": 46, 85 "line": 39,
99 "column": 24 86 "column": 24
100 }, 87 },
101 "end": { 88 "end": {
102 "line": 49, 89 "line": 42,
103 "column": 3 90 "column": 3
104 } 91 }
105 } 92 }
diff --git a/src/i18n/messages/src/components/subscription/SubscriptionForm.json b/src/i18n/messages/src/components/subscription/SubscriptionForm.json
deleted file mode 100644
index 6d235254e..000000000
--- a/src/i18n/messages/src/components/subscription/SubscriptionForm.json
+++ /dev/null
@@ -1,54 +0,0 @@
1[
2 {
3 "id": "subscription.cta.choosePlan",
4 "defaultMessage": "!!!Choose your plan",
5 "file": "src/components/subscription/SubscriptionForm.js",
6 "start": {
7 "line": 13,
8 "column": 21
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.account.headlineUpgradeAccount",
17 "defaultMessage": "!!!Upgrade your account and get the full Franz experience",
18 "file": "src/components/subscription/SubscriptionForm.js",
19 "start": {
20 "line": 17,
21 "column": 18
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "subscription.teaser.intro",
30 "defaultMessage": "!!!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!",
31 "file": "src/components/subscription/SubscriptionForm.js",
32 "start": {
33 "line": 21,
34 "column": 14
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 },
41 {
42 "id": "subscription.teaser.includedFeatures",
43 "defaultMessage": "!!!Paid Franz Plans include:",
44 "file": "src/components/subscription/SubscriptionForm.js",
45 "start": {
46 "line": 25,
47 "column": 20
48 },
49 "end": {
50 "line": 28,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/subscription/SubscriptionPopup.json b/src/i18n/messages/src/components/subscription/SubscriptionPopup.json
deleted file mode 100644
index c06da7531..000000000
--- a/src/i18n/messages/src/components/subscription/SubscriptionPopup.json
+++ /dev/null
@@ -1,28 +0,0 @@
1[
2 {
3 "id": "subscriptionPopup.buttonCancel",
4 "defaultMessage": "!!!Cancel",
5 "file": "src/components/subscription/SubscriptionPopup.js",
6 "start": {
7 "line": 11,
8 "column": 16
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscriptionPopup.buttonDone",
17 "defaultMessage": "!!!Done",
18 "file": "src/components/subscription/SubscriptionPopup.js",
19 "start": {
20 "line": 15,
21 "column": 14
22 },
23 "end": {
24 "line": 18,
25 "column": 3
26 }
27 }
28] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/subscription/TrialForm.json b/src/i18n/messages/src/components/subscription/TrialForm.json
deleted file mode 100644
index 8b387ba36..000000000
--- a/src/i18n/messages/src/components/subscription/TrialForm.json
+++ /dev/null
@@ -1,93 +0,0 @@
1[
2 {
3 "id": "subscription.cta.activateTrial",
4 "defaultMessage": "!!!Yes, start the free Franz Professional trial",
5 "file": "src/components/subscription/TrialForm.js",
6 "start": {
7 "line": 14,
8 "column": 21
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscription.cta.allOptions",
17 "defaultMessage": "!!!See all options",
18 "file": "src/components/subscription/TrialForm.js",
19 "start": {
20 "line": 18,
21 "column": 20
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.account.headlineTrialUpgrade",
30 "defaultMessage": "!!!Get the free 14 day Franz Professional Trial",
31 "file": "src/components/subscription/TrialForm.js",
32 "start": {
33 "line": 22,
34 "column": 18
35 },
36 "end": {
37 "line": 25,
38 "column": 3
39 }
40 },
41 {
42 "id": "subscription.includedProFeatures",
43 "defaultMessage": "!!!The Franz Professional Plan includes:",
44 "file": "src/components/subscription/TrialForm.js",
45 "start": {
46 "line": 26,
47 "column": 20
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.trial.terms.headline",
56 "defaultMessage": "!!!No strings attached",
57 "file": "src/components/subscription/TrialForm.js",
58 "start": {
59 "line": 30,
60 "column": 29
61 },
62 "end": {
63 "line": 33,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.trial.terms.noCreditCard",
69 "defaultMessage": "!!!No credit card required",
70 "file": "src/components/subscription/TrialForm.js",
71 "start": {
72 "line": 34,
73 "column": 16
74 },
75 "end": {
76 "line": 37,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.trial.terms.automaticTrialEnd",
82 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
83 "file": "src/components/subscription/TrialForm.js",
84 "start": {
85 "line": 38,
86 "column": 21
87 },
88 "end": {
89 "line": 41,
90 "column": 3
91 }
92 }
93] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/ActivateTrialButton/index.json b/src/i18n/messages/src/components/ui/ActivateTrialButton/index.json
deleted file mode 100644
index fd969da78..000000000
--- a/src/i18n/messages/src/components/ui/ActivateTrialButton/index.json
+++ /dev/null
@@ -1,93 +0,0 @@
1[
2 {
3 "id": "feature.delayApp.upgrade.action",
4 "defaultMessage": "!!!Get a Franz Supporter License",
5 "file": "src/components/ui/ActivateTrialButton/index.js",
6 "start": {
7 "line": 13,
8 "column": 10
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.delayApp.trial.action",
17 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
18 "file": "src/components/ui/ActivateTrialButton/index.js",
19 "start": {
20 "line": 17,
21 "column": 15
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.delayApp.upgrade.actionShort",
30 "defaultMessage": "!!!Upgrade account",
31 "file": "src/components/ui/ActivateTrialButton/index.js",
32 "start": {
33 "line": 21,
34 "column": 15
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.delayApp.trial.actionShort",
43 "defaultMessage": "!!!Activate the free Franz Professional trial",
44 "file": "src/components/ui/ActivateTrialButton/index.js",
45 "start": {
46 "line": 25,
47 "column": 20
48 },
49 "end": {
50 "line": 28,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.trial.terms.headline",
56 "defaultMessage": "!!!No strings attached",
57 "file": "src/components/ui/ActivateTrialButton/index.js",
58 "start": {
59 "line": 29,
60 "column": 29
61 },
62 "end": {
63 "line": 32,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.trial.terms.noCreditCard",
69 "defaultMessage": "!!!No credit card required",
70 "file": "src/components/ui/ActivateTrialButton/index.js",
71 "start": {
72 "line": 33,
73 "column": 16
74 },
75 "end": {
76 "line": 36,
77 "column": 3
78 }
79 },
80 {
81 "id": "pricing.trial.terms.automaticTrialEnd",
82 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
83 "file": "src/components/ui/ActivateTrialButton/index.js",
84 "start": {
85 "line": 37,
86 "column": 21
87 },
88 "end": {
89 "line": 40,
90 "column": 3
91 }
92 }
93] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/FeatureList.json b/src/i18n/messages/src/components/ui/FeatureList.json
index 8d1dc4360..eb4bc483b 100644
--- a/src/i18n/messages/src/components/ui/FeatureList.json
+++ b/src/i18n/messages/src/components/ui/FeatureList.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Choose from more than 70 Services", 4 "defaultMessage": "!!!Choose from more than 70 Services",
5 "file": "src/components/ui/FeatureList.js", 5 "file": "src/components/ui/FeatureList.js",
6 "start": { 6 "start": {
7 "line": 9, 7 "line": 8,
8 "column": 20 8 "column": 20
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 12, 11 "line": 11,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Account Synchronisation", 17 "defaultMessage": "!!!Account Synchronisation",
18 "file": "src/components/ui/FeatureList.js", 18 "file": "src/components/ui/FeatureList.js",
19 "start": { 19 "start": {
20 "line": 13, 20 "line": 12,
21 "column": 15 21 "column": 15
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 16, 24 "line": 15,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Desktop Notifications", 30 "defaultMessage": "!!!Desktop Notifications",
31 "file": "src/components/ui/FeatureList.js", 31 "file": "src/components/ui/FeatureList.js",
32 "start": { 32 "start": {
33 "line": 17, 33 "line": 16,
34 "column": 24 34 "column": 24
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 20, 37 "line": 19,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,37 +43,11 @@
43 "defaultMessage": "!!!Add unlimited services", 43 "defaultMessage": "!!!Add unlimited services",
44 "file": "src/components/ui/FeatureList.js", 44 "file": "src/components/ui/FeatureList.js",
45 "start": { 45 "start": {
46 "line": 21, 46 "line": 20,
47 "column": 21 47 "column": 21
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 24, 50 "line": 23,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.features.upToThreeServices",
56 "defaultMessage": "!!!Add up to 3 services",
57 "file": "src/components/ui/FeatureList.js",
58 "start": {
59 "line": 25,
60 "column": 21
61 },
62 "end": {
63 "line": 28,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.features.upToSixServices",
69 "defaultMessage": "!!!Add up to 6 services",
70 "file": "src/components/ui/FeatureList.js",
71 "start": {
72 "line": 29,
73 "column": 19
74 },
75 "end": {
76 "line": 32,
77 "column": 3 51 "column": 3
78 } 52 }
79 }, 53 },
@@ -82,11 +56,11 @@
82 "defaultMessage": "!!!Spellchecker support", 56 "defaultMessage": "!!!Spellchecker support",
83 "file": "src/components/ui/FeatureList.js", 57 "file": "src/components/ui/FeatureList.js",
84 "start": { 58 "start": {
85 "line": 33, 59 "line": 24,
86 "column": 16 60 "column": 16
87 }, 61 },
88 "end": { 62 "end": {
89 "line": 36, 63 "line": 27,
90 "column": 3 64 "column": 3
91 } 65 }
92 }, 66 },
@@ -95,11 +69,11 @@
95 "defaultMessage": "!!!Workspaces", 69 "defaultMessage": "!!!Workspaces",
96 "file": "src/components/ui/FeatureList.js", 70 "file": "src/components/ui/FeatureList.js",
97 "start": { 71 "start": {
98 "line": 37, 72 "line": 28,
99 "column": 14 73 "column": 14
100 }, 74 },
101 "end": { 75 "end": {
102 "line": 40, 76 "line": 31,
103 "column": 3 77 "column": 3
104 } 78 }
105 }, 79 },
@@ -108,11 +82,11 @@
108 "defaultMessage": "!!!Add Custom Websites", 82 "defaultMessage": "!!!Add Custom Websites",
109 "file": "src/components/ui/FeatureList.js", 83 "file": "src/components/ui/FeatureList.js",
110 "start": { 84 "start": {
111 "line": 41, 85 "line": 32,
112 "column": 18 86 "column": 18
113 }, 87 },
114 "end": { 88 "end": {
115 "line": 44, 89 "line": 35,
116 "column": 3 90 "column": 3
117 } 91 }
118 }, 92 },
@@ -121,11 +95,11 @@
121 "defaultMessage": "!!!On-premise & other Hosted Services", 95 "defaultMessage": "!!!On-premise & other Hosted Services",
122 "file": "src/components/ui/FeatureList.js", 96 "file": "src/components/ui/FeatureList.js",
123 "start": { 97 "start": {
124 "line": 45, 98 "line": 36,
125 "column": 13 99 "column": 13
126 }, 100 },
127 "end": { 101 "end": {
128 "line": 48, 102 "line": 39,
129 "column": 3 103 "column": 3
130 } 104 }
131 }, 105 },
@@ -134,11 +108,11 @@
134 "defaultMessage": "!!!Install 3rd party services", 108 "defaultMessage": "!!!Install 3rd party services",
135 "file": "src/components/ui/FeatureList.js", 109 "file": "src/components/ui/FeatureList.js",
136 "start": { 110 "start": {
137 "line": 49, 111 "line": 40,
138 "column": 22 112 "column": 22
139 }, 113 },
140 "end": { 114 "end": {
141 "line": 52, 115 "line": 43,
142 "column": 3 116 "column": 3
143 } 117 }
144 }, 118 },
@@ -147,11 +121,11 @@
147 "defaultMessage": "!!!Service Proxies", 121 "defaultMessage": "!!!Service Proxies",
148 "file": "src/components/ui/FeatureList.js", 122 "file": "src/components/ui/FeatureList.js",
149 "start": { 123 "start": {
150 "line": 53, 124 "line": 44,
151 "column": 18 125 "column": 18
152 }, 126 },
153 "end": { 127 "end": {
154 "line": 56, 128 "line": 47,
155 "column": 3 129 "column": 3
156 } 130 }
157 }, 131 },
@@ -160,50 +134,11 @@
160 "defaultMessage": "!!!Team Management", 134 "defaultMessage": "!!!Team Management",
161 "file": "src/components/ui/FeatureList.js", 135 "file": "src/components/ui/FeatureList.js",
162 "start": { 136 "start": {
163 "line": 57, 137 "line": 48,
164 "column": 18 138 "column": 18
165 }, 139 },
166 "end": { 140 "end": {
167 "line": 60, 141 "line": 51,
168 "column": 3
169 }
170 },
171 {
172 "id": "pricing.features.appDelays",
173 "defaultMessage": "!!!No Waiting Screens",
174 "file": "src/components/ui/FeatureList.js",
175 "start": {
176 "line": 61,
177 "column": 13
178 },
179 "end": {
180 "line": 64,
181 "column": 3
182 }
183 },
184 {
185 "id": "pricing.features.adFree",
186 "defaultMessage": "!!!Forever ad-free",
187 "file": "src/components/ui/FeatureList.js",
188 "start": {
189 "line": 65,
190 "column": 10
191 },
192 "end": {
193 "line": 68,
194 "column": 3
195 }
196 },
197 {
198 "id": "pricing.features.appDelaysEnabled",
199 "defaultMessage": "!!!Occasional Waiting Screens",
200 "file": "src/components/ui/FeatureList.js",
201 "start": {
202 "line": 69,
203 "column": 19
204 },
205 "end": {
206 "line": 72,
207 "column": 3 142 "column": 3
208 } 143 }
209 } 144 }
diff --git a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json
deleted file mode 100644
index 0cde4cee5..000000000
--- a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json
+++ /dev/null
@@ -1,15 +0,0 @@
1[
2 {
3 "id": "premiumFeature.button.upgradeAccount",
4 "defaultMessage": "!!!Upgrade account",
5 "file": "src/components/ui/PremiumFeatureContainer/index.js",
6 "start": {
7 "line": 16,
8 "column": 10
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/UpgradeButton/index.json b/src/i18n/messages/src/components/ui/UpgradeButton/index.json
deleted file mode 100644
index 28e44cb66..000000000
--- a/src/i18n/messages/src/components/ui/UpgradeButton/index.json
+++ /dev/null
@@ -1,15 +0,0 @@
1[
2 {
3 "id": "global.upgradeButton.upgradeToPro",
4 "defaultMessage": "!!!Upgrade to Franz Professional",
5 "file": "src/components/ui/UpgradeButton/index.js",
6 "start": {
7 "line": 13,
8 "column": 16
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/containers/settings/EditServiceScreen.json b/src/i18n/messages/src/containers/settings/EditServiceScreen.json
index ad97781c4..6744a9ff3 100644
--- a/src/i18n/messages/src/containers/settings/EditServiceScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditServiceScreen.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Name", 4 "defaultMessage": "!!!Name",
5 "file": "src/containers/settings/EditServiceScreen.js", 5 "file": "src/containers/settings/EditServiceScreen.js",
6 "start": { 6 "start": {
7 "line": 29, 7 "line": 28,
8 "column": 8 8 "column": 8
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 32, 11 "line": 31,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Enable service", 17 "defaultMessage": "!!!Enable service",
18 "file": "src/containers/settings/EditServiceScreen.js", 18 "file": "src/containers/settings/EditServiceScreen.js",
19 "start": { 19 "start": {
20 "line": 33, 20 "line": 32,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 36, 24 "line": 35,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Enable hibernation", 30 "defaultMessage": "!!!Enable hibernation",
31 "file": "src/containers/settings/EditServiceScreen.js", 31 "file": "src/containers/settings/EditServiceScreen.js",
32 "start": { 32 "start": {
33 "line": 37, 33 "line": 36,
34 "column": 21 34 "column": 21
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 40, 37 "line": 39,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Enable Notifications", 43 "defaultMessage": "!!!Enable Notifications",
44 "file": "src/containers/settings/EditServiceScreen.js", 44 "file": "src/containers/settings/EditServiceScreen.js",
45 "start": { 45 "start": {
46 "line": 41, 46 "line": 40,
47 "column": 22 47 "column": 22
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 44, 50 "line": 43,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Show unread message badges", 56 "defaultMessage": "!!!Show unread message badges",
57 "file": "src/containers/settings/EditServiceScreen.js", 57 "file": "src/containers/settings/EditServiceScreen.js",
58 "start": { 58 "start": {
59 "line": 45, 59 "line": 44,
60 "column": 15 60 "column": 15
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 48, 63 "line": 47,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Enable audio", 69 "defaultMessage": "!!!Enable audio",
70 "file": "src/containers/settings/EditServiceScreen.js", 70 "file": "src/containers/settings/EditServiceScreen.js",
71 "start": { 71 "start": {
72 "line": 49, 72 "line": 48,
73 "column": 15 73 "column": 15
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 52, 76 "line": 51,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Team", 82 "defaultMessage": "!!!Team",
83 "file": "src/containers/settings/EditServiceScreen.js", 83 "file": "src/containers/settings/EditServiceScreen.js",
84 "start": { 84 "start": {
85 "line": 53, 85 "line": 52,
86 "column": 8 86 "column": 8
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 56, 89 "line": 55,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Service URL", 95 "defaultMessage": "!!!Service URL",
96 "file": "src/containers/settings/EditServiceScreen.js", 96 "file": "src/containers/settings/EditServiceScreen.js",
97 "start": { 97 "start": {
98 "line": 57, 98 "line": 56,
99 "column": 13 99 "column": 13
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 60, 102 "line": 59,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Show message badge for all new messages", 108 "defaultMessage": "!!!Show message badge for all new messages",
109 "file": "src/containers/settings/EditServiceScreen.js", 109 "file": "src/containers/settings/EditServiceScreen.js",
110 "start": { 110 "start": {
111 "line": 61, 111 "line": 60,
112 "column": 20 112 "column": 20
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 64, 115 "line": 63,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Custom icon", 121 "defaultMessage": "!!!Custom icon",
122 "file": "src/containers/settings/EditServiceScreen.js", 122 "file": "src/containers/settings/EditServiceScreen.js",
123 "start": { 123 "start": {
124 "line": 65, 124 "line": 64,
125 "column": 8 125 "column": 8
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 68, 128 "line": 67,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Enable Dark Mode", 134 "defaultMessage": "!!!Enable Dark Mode",
135 "file": "src/containers/settings/EditServiceScreen.js", 135 "file": "src/containers/settings/EditServiceScreen.js",
136 "start": { 136 "start": {
137 "line": 69, 137 "line": 68,
138 "column": 18 138 "column": 18
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 72, 141 "line": 71,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Dark Reader Brightness", 147 "defaultMessage": "!!!Dark Reader Brightness",
148 "file": "src/containers/settings/EditServiceScreen.js", 148 "file": "src/containers/settings/EditServiceScreen.js",
149 "start": { 149 "start": {
150 "line": 73, 150 "line": 72,
151 "column": 24 151 "column": 24
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 76, 154 "line": 75,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Dark Reader Contrast", 160 "defaultMessage": "!!!Dark Reader Contrast",
161 "file": "src/containers/settings/EditServiceScreen.js", 161 "file": "src/containers/settings/EditServiceScreen.js",
162 "start": { 162 "start": {
163 "line": 77, 163 "line": 76,
164 "column": 22 164 "column": 22
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 80, 167 "line": 79,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Dark Reader Sepia", 173 "defaultMessage": "!!!Dark Reader Sepia",
174 "file": "src/containers/settings/EditServiceScreen.js", 174 "file": "src/containers/settings/EditServiceScreen.js",
175 "start": { 175 "start": {
176 "line": 81, 176 "line": 80,
177 "column": 19 177 "column": 19
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 84, 180 "line": 83,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Use Proxy", 186 "defaultMessage": "!!!Use Proxy",
187 "file": "src/containers/settings/EditServiceScreen.js", 187 "file": "src/containers/settings/EditServiceScreen.js",
188 "start": { 188 "start": {
189 "line": 85, 189 "line": 84,
190 "column": 15 190 "column": 15
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 88, 193 "line": 87,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Proxy Host/IP", 199 "defaultMessage": "!!!Proxy Host/IP",
200 "file": "src/containers/settings/EditServiceScreen.js", 200 "file": "src/containers/settings/EditServiceScreen.js",
201 "start": { 201 "start": {
202 "line": 89, 202 "line": 88,
203 "column": 13 203 "column": 13
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 92, 206 "line": 91,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Port", 212 "defaultMessage": "!!!Port",
213 "file": "src/containers/settings/EditServiceScreen.js", 213 "file": "src/containers/settings/EditServiceScreen.js",
214 "start": { 214 "start": {
215 "line": 93, 215 "line": 92,
216 "column": 13 216 "column": 13
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 96, 219 "line": 95,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!User", 225 "defaultMessage": "!!!User",
226 "file": "src/containers/settings/EditServiceScreen.js", 226 "file": "src/containers/settings/EditServiceScreen.js",
227 "start": { 227 "start": {
228 "line": 97, 228 "line": 96,
229 "column": 13 229 "column": 13
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 100, 232 "line": 99,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Password", 238 "defaultMessage": "!!!Password",
239 "file": "src/containers/settings/EditServiceScreen.js", 239 "file": "src/containers/settings/EditServiceScreen.js",
240 "start": { 240 "start": {
241 "line": 101, 241 "line": 100,
242 "column": 17 242 "column": 17
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 104, 245 "line": 103,
246 "column": 3 246 "column": 3
247 } 247 }
248 } 248 }
diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
index cd5462b59..b98c54d7d 100644
--- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
+++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Launch Ferdi on start", 4 "defaultMessage": "!!!Launch Ferdi on start",
5 "file": "src/containers/settings/EditSettingsScreen.js", 5 "file": "src/containers/settings/EditSettingsScreen.js",
6 "start": { 6 "start": {
7 "line": 31, 7 "line": 32,
8 "column": 21 8 "column": 21
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 34, 11 "line": 35,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Open in background", 17 "defaultMessage": "!!!Open in background",
18 "file": "src/containers/settings/EditSettingsScreen.js", 18 "file": "src/containers/settings/EditSettingsScreen.js",
19 "start": { 19 "start": {
20 "line": 35, 20 "line": 36,
21 "column": 26 21 "column": 26
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 38, 24 "line": 39,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Keep Ferdi in background when closing the window", 30 "defaultMessage": "!!!Keep Ferdi in background when closing the window",
31 "file": "src/containers/settings/EditSettingsScreen.js", 31 "file": "src/containers/settings/EditSettingsScreen.js",
32 "start": { 32 "start": {
33 "line": 39, 33 "line": 40,
34 "column": 19 34 "column": 19
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 42, 37 "line": 43,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Start minimized", 43 "defaultMessage": "!!!Start minimized",
44 "file": "src/containers/settings/EditSettingsScreen.js", 44 "file": "src/containers/settings/EditSettingsScreen.js",
45 "start": { 45 "start": {
46 "line": 43, 46 "line": 44,
47 "column": 18 47 "column": 18
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 46, 50 "line": 47,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Always show Ferdi in System Tray", 56 "defaultMessage": "!!!Always show Ferdi in System Tray",
57 "file": "src/containers/settings/EditSettingsScreen.js", 57 "file": "src/containers/settings/EditSettingsScreen.js",
58 "start": { 58 "start": {
59 "line": 47, 59 "line": 48,
60 "column": 20 60 "column": 20
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 50, 63 "line": 51,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Always show Ferdi in Menu Bar", 69 "defaultMessage": "!!!Always show Ferdi in Menu Bar",
70 "file": "src/containers/settings/EditSettingsScreen.js", 70 "file": "src/containers/settings/EditSettingsScreen.js",
71 "start": { 71 "start": {
72 "line": 51, 72 "line": 52,
73 "column": 17 73 "column": 17
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 54, 76 "line": 55,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Reload Ferdi after system resume", 82 "defaultMessage": "!!!Reload Ferdi after system resume",
83 "file": "src/containers/settings/EditSettingsScreen.js", 83 "file": "src/containers/settings/EditSettingsScreen.js",
84 "start": { 84 "start": {
85 "line": 55, 85 "line": 56,
86 "column": 21 86 "column": 21
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 58, 89 "line": 59,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Minimize Ferdi to system tray", 95 "defaultMessage": "!!!Minimize Ferdi to system tray",
96 "file": "src/containers/settings/EditSettingsScreen.js", 96 "file": "src/containers/settings/EditSettingsScreen.js",
97 "start": { 97 "start": {
98 "line": 59, 98 "line": 60,
99 "column": 24 99 "column": 24
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 62, 102 "line": 63,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Close Ferdi to system tray", 108 "defaultMessage": "!!!Close Ferdi to system tray",
109 "file": "src/containers/settings/EditSettingsScreen.js", 109 "file": "src/containers/settings/EditSettingsScreen.js",
110 "start": { 110 "start": {
111 "line": 63, 111 "line": 64,
112 "column": 21 112 "column": 21
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 66, 115 "line": 67,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Don't show message content in notifications", 121 "defaultMessage": "!!!Don't show message content in notifications",
122 "file": "src/containers/settings/EditSettingsScreen.js", 122 "file": "src/containers/settings/EditSettingsScreen.js",
123 "start": { 123 "start": {
124 "line": 67, 124 "line": 68,
125 "column": 24 125 "column": 24
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 70, 128 "line": 71,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Don't show notifications for clipboard events", 134 "defaultMessage": "!!!Don't show notifications for clipboard events",
135 "file": "src/containers/settings/EditSettingsScreen.js", 135 "file": "src/containers/settings/EditSettingsScreen.js",
136 "start": { 136 "start": {
137 "line": 71, 137 "line": 72,
138 "column": 26 138 "column": 26
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 74, 141 "line": 75,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Notify TaskBar/Dock on new message", 147 "defaultMessage": "!!!Notify TaskBar/Dock on new message",
148 "file": "src/containers/settings/EditSettingsScreen.js", 148 "file": "src/containers/settings/EditSettingsScreen.js",
149 "start": { 149 "start": {
150 "line": 75, 150 "line": 76,
151 "column": 26 151 "column": 26
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 78, 154 "line": 79,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Navigation bar behaviour", 160 "defaultMessage": "!!!Navigation bar behaviour",
161 "file": "src/containers/settings/EditSettingsScreen.js", 161 "file": "src/containers/settings/EditSettingsScreen.js",
162 "start": { 162 "start": {
163 "line": 79, 163 "line": 80,
164 "column": 26 164 "column": 26
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 82, 167 "line": 83,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Search engine", 173 "defaultMessage": "!!!Search engine",
174 "file": "src/containers/settings/EditSettingsScreen.js", 174 "file": "src/containers/settings/EditSettingsScreen.js",
175 "start": { 175 "start": {
176 "line": 83, 176 "line": 84,
177 "column": 16 177 "column": 16
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 86, 180 "line": 87,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,50 +186,50 @@
186 "defaultMessage": "!!!Send telemetry data", 186 "defaultMessage": "!!!Send telemetry data",
187 "file": "src/containers/settings/EditSettingsScreen.js", 187 "file": "src/containers/settings/EditSettingsScreen.js",
188 "start": { 188 "start": {
189 "line": 87, 189 "line": 88,
190 "column": 10 190 "column": 10
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 90, 193 "line": 91,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
197 { 197 {
198 "id": "settings.app.form.hibernate", 198 "id": "settings.app.form.hibernateOnStartup",
199 "defaultMessage": "!!!Enable service hibernation", 199 "defaultMessage": "!!!Keep services in hibernation on startup",
200 "file": "src/containers/settings/EditSettingsScreen.js", 200 "file": "src/containers/settings/EditSettingsScreen.js",
201 "start": { 201 "start": {
202 "line": 91, 202 "line": 92,
203 "column": 13 203 "column": 22
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 94, 206 "line": 95,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
210 { 210 {
211 "id": "settings.app.form.hibernateOnStartup", 211 "id": "settings.app.form.hibernationStrategy",
212 "defaultMessage": "!!!Keep services in hibernation on startup", 212 "defaultMessage": "!!!Hibernation strategy",
213 "file": "src/containers/settings/EditSettingsScreen.js", 213 "file": "src/containers/settings/EditSettingsScreen.js",
214 "start": { 214 "start": {
215 "line": 95, 215 "line": 96,
216 "column": 22 216 "column": 23
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 98, 219 "line": 99,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
223 { 223 {
224 "id": "settings.app.form.hibernationStrategy", 224 "id": "settings.app.form.wakeUpStrategy",
225 "defaultMessage": "!!!Hibernation strategy", 225 "defaultMessage": "!!!Wake up strategy",
226 "file": "src/containers/settings/EditSettingsScreen.js", 226 "file": "src/containers/settings/EditSettingsScreen.js",
227 "start": { 227 "start": {
228 "line": 99, 228 "line": 100,
229 "column": 23 229 "column": 18
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 102, 232 "line": 103,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Todo Server", 238 "defaultMessage": "!!!Todo Server",
239 "file": "src/containers/settings/EditSettingsScreen.js", 239 "file": "src/containers/settings/EditSettingsScreen.js",
240 "start": { 240 "start": {
241 "line": 103, 241 "line": 104,
242 "column": 24 242 "column": 24
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 106, 245 "line": 107,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Custom TodoServer", 251 "defaultMessage": "!!!Custom TodoServer",
252 "file": "src/containers/settings/EditSettingsScreen.js", 252 "file": "src/containers/settings/EditSettingsScreen.js",
253 "start": { 253 "start": {
254 "line": 107, 254 "line": 108,
255 "column": 20 255 "column": 20
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 110, 258 "line": 111,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Enable Password Lock", 264 "defaultMessage": "!!!Enable Password Lock",
265 "file": "src/containers/settings/EditSettingsScreen.js", 265 "file": "src/containers/settings/EditSettingsScreen.js",
266 "start": { 266 "start": {
267 "line": 111, 267 "line": 112,
268 "column": 14 268 "column": 14
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 114, 271 "line": 115,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Password", 277 "defaultMessage": "!!!Password",
278 "file": "src/containers/settings/EditSettingsScreen.js", 278 "file": "src/containers/settings/EditSettingsScreen.js",
279 "start": { 279 "start": {
280 "line": 115, 280 "line": 116,
281 "column": 16 281 "column": 16
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 118, 284 "line": 119,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Allow using Touch ID to unlock", 290 "defaultMessage": "!!!Allow using Touch ID to unlock",
291 "file": "src/containers/settings/EditSettingsScreen.js", 291 "file": "src/containers/settings/EditSettingsScreen.js",
292 "start": { 292 "start": {
293 "line": 119, 293 "line": 120,
294 "column": 22 294 "column": 22
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 122, 297 "line": 123,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Lock after inactivity", 303 "defaultMessage": "!!!Lock after inactivity",
304 "file": "src/containers/settings/EditSettingsScreen.js", 304 "file": "src/containers/settings/EditSettingsScreen.js",
305 "start": { 305 "start": {
306 "line": 123, 306 "line": 124,
307 "column": 18 307 "column": 18
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 126, 310 "line": 127,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Enable scheduled Do-not-Disturb", 316 "defaultMessage": "!!!Enable scheduled Do-not-Disturb",
317 "file": "src/containers/settings/EditSettingsScreen.js", 317 "file": "src/containers/settings/EditSettingsScreen.js",
318 "start": { 318 "start": {
319 "line": 127, 319 "line": 128,
320 "column": 23 320 "column": 23
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 130, 323 "line": 131,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!From", 329 "defaultMessage": "!!!From",
330 "file": "src/containers/settings/EditSettingsScreen.js", 330 "file": "src/containers/settings/EditSettingsScreen.js",
331 "start": { 331 "start": {
332 "line": 131, 332 "line": 132,
333 "column": 21 333 "column": 21
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 134, 336 "line": 135,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!To", 342 "defaultMessage": "!!!To",
343 "file": "src/containers/settings/EditSettingsScreen.js", 343 "file": "src/containers/settings/EditSettingsScreen.js",
344 "start": { 344 "start": {
345 "line": 135, 345 "line": 136,
346 "column": 19 346 "column": 19
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 138, 349 "line": 139,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Language", 355 "defaultMessage": "!!!Language",
356 "file": "src/containers/settings/EditSettingsScreen.js", 356 "file": "src/containers/settings/EditSettingsScreen.js",
357 "start": { 357 "start": {
358 "line": 139, 358 "line": 140,
359 "column": 12 359 "column": 12
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 142, 362 "line": 143,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!Dark Mode", 368 "defaultMessage": "!!!Dark Mode",
369 "file": "src/containers/settings/EditSettingsScreen.js", 369 "file": "src/containers/settings/EditSettingsScreen.js",
370 "start": { 370 "start": {
371 "line": 143, 371 "line": 144,
372 "column": 12 372 "column": 12
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 146, 375 "line": 147,
376 "column": 3 376 "column": 3
377 } 377 }
378 }, 378 },
@@ -381,11 +381,11 @@
381 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting", 381 "defaultMessage": "!!!Synchronize dark mode with my OS's dark mode setting",
382 "file": "src/containers/settings/EditSettingsScreen.js", 382 "file": "src/containers/settings/EditSettingsScreen.js",
383 "start": { 383 "start": {
384 "line": 147, 384 "line": 148,
385 "column": 21 385 "column": 21
386 }, 386 },
387 "end": { 387 "end": {
388 "line": 150, 388 "line": 151,
389 "column": 3 389 "column": 3
390 } 390 }
391 }, 391 },
@@ -394,11 +394,11 @@
394 "defaultMessage": "!!!Enable universal Dark Mode", 394 "defaultMessage": "!!!Enable universal Dark Mode",
395 "file": "src/containers/settings/EditSettingsScreen.js", 395 "file": "src/containers/settings/EditSettingsScreen.js",
396 "start": { 396 "start": {
397 "line": 151, 397 "line": 152,
398 "column": 21 398 "column": 21
399 }, 399 },
400 "end": { 400 "end": {
401 "line": 154, 401 "line": 155,
402 "column": 3 402 "column": 3
403 } 403 }
404 }, 404 },
@@ -407,11 +407,11 @@
407 "defaultMessage": "!!!Sidebar width", 407 "defaultMessage": "!!!Sidebar width",
408 "file": "src/containers/settings/EditSettingsScreen.js", 408 "file": "src/containers/settings/EditSettingsScreen.js",
409 "start": { 409 "start": {
410 "line": 155, 410 "line": 156,
411 "column": 22 411 "column": 22
412 }, 412 },
413 "end": { 413 "end": {
414 "line": 158, 414 "line": 159,
415 "column": 3 415 "column": 3
416 } 416 }
417 }, 417 },
@@ -420,11 +420,11 @@
420 "defaultMessage": "!!!Service icon size", 420 "defaultMessage": "!!!Service icon size",
421 "file": "src/containers/settings/EditSettingsScreen.js", 421 "file": "src/containers/settings/EditSettingsScreen.js",
422 "start": { 422 "start": {
423 "line": 159, 423 "line": 160,
424 "column": 12 424 "column": 12
425 }, 425 },
426 "end": { 426 "end": {
427 "line": 162, 427 "line": 163,
428 "column": 3 428 "column": 3
429 } 429 }
430 }, 430 },
@@ -433,11 +433,11 @@
433 "defaultMessage": "!!!Use vertical style", 433 "defaultMessage": "!!!Use vertical style",
434 "file": "src/containers/settings/EditSettingsScreen.js", 434 "file": "src/containers/settings/EditSettingsScreen.js",
435 "start": { 435 "start": {
436 "line": 163, 436 "line": 164,
437 "column": 20 437 "column": 20
438 }, 438 },
439 "end": { 439 "end": {
440 "line": 166, 440 "line": 167,
441 "column": 3 441 "column": 3
442 } 442 }
443 }, 443 },
@@ -446,11 +446,11 @@
446 "defaultMessage": "!!!Always show workspace drawer", 446 "defaultMessage": "!!!Always show workspace drawer",
447 "file": "src/containers/settings/EditSettingsScreen.js", 447 "file": "src/containers/settings/EditSettingsScreen.js",
448 "start": { 448 "start": {
449 "line": 167, 449 "line": 168,
450 "column": 24 450 "column": 24
451 }, 451 },
452 "end": { 452 "end": {
453 "line": 170, 453 "line": 171,
454 "column": 3 454 "column": 3
455 } 455 }
456 }, 456 },
@@ -459,11 +459,11 @@
459 "defaultMessage": "!!!Accent color", 459 "defaultMessage": "!!!Accent color",
460 "file": "src/containers/settings/EditSettingsScreen.js", 460 "file": "src/containers/settings/EditSettingsScreen.js",
461 "start": { 461 "start": {
462 "line": 171, 462 "line": 172,
463 "column": 15 463 "column": 15
464 }, 464 },
465 "end": { 465 "end": {
466 "line": 174, 466 "line": 175,
467 "column": 3 467 "column": 3
468 } 468 }
469 }, 469 },
@@ -472,11 +472,11 @@
472 "defaultMessage": "!!!Display disabled services tabs", 472 "defaultMessage": "!!!Display disabled services tabs",
473 "file": "src/containers/settings/EditSettingsScreen.js", 473 "file": "src/containers/settings/EditSettingsScreen.js",
474 "start": { 474 "start": {
475 "line": 175, 475 "line": 176,
476 "column": 24 476 "column": 24
477 }, 477 },
478 "end": { 478 "end": {
479 "line": 178, 479 "line": 179,
480 "column": 3 480 "column": 3
481 } 481 }
482 }, 482 },
@@ -485,11 +485,11 @@
485 "defaultMessage": "!!!Show unread message badge when notifications are disabled", 485 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
486 "file": "src/containers/settings/EditSettingsScreen.js", 486 "file": "src/containers/settings/EditSettingsScreen.js",
487 "start": { 487 "start": {
488 "line": 179, 488 "line": 180,
489 "column": 29 489 "column": 29
490 }, 490 },
491 "end": { 491 "end": {
492 "line": 182, 492 "line": 183,
493 "column": 3 493 "column": 3
494 } 494 }
495 }, 495 },
@@ -498,11 +498,11 @@
498 "defaultMessage": "!!!Show draggable area on window", 498 "defaultMessage": "!!!Show draggable area on window",
499 "file": "src/containers/settings/EditSettingsScreen.js", 499 "file": "src/containers/settings/EditSettingsScreen.js",
500 "start": { 500 "start": {
501 "line": 183, 501 "line": 184,
502 "column": 16 502 "column": 16
503 }, 503 },
504 "end": { 504 "end": {
505 "line": 186, 505 "line": 187,
506 "column": 3 506 "column": 3
507 } 507 }
508 }, 508 },
@@ -511,11 +511,11 @@
511 "defaultMessage": "!!!Enable spell checking", 511 "defaultMessage": "!!!Enable spell checking",
512 "file": "src/containers/settings/EditSettingsScreen.js", 512 "file": "src/containers/settings/EditSettingsScreen.js",
513 "start": { 513 "start": {
514 "line": 187, 514 "line": 188,
515 "column": 23 515 "column": 23
516 }, 516 },
517 "end": { 517 "end": {
518 "line": 190, 518 "line": 191,
519 "column": 3 519 "column": 3
520 } 520 }
521 }, 521 },
@@ -524,11 +524,11 @@
524 "defaultMessage": "!!!Enable GPU Acceleration", 524 "defaultMessage": "!!!Enable GPU Acceleration",
525 "file": "src/containers/settings/EditSettingsScreen.js", 525 "file": "src/containers/settings/EditSettingsScreen.js",
526 "start": { 526 "start": {
527 "line": 191, 527 "line": 192,
528 "column": 25 528 "column": 25
529 }, 529 },
530 "end": { 530 "end": {
531 "line": 194, 531 "line": 195,
532 "column": 3 532 "column": 3
533 } 533 }
534 }, 534 },
@@ -537,11 +537,11 @@
537 "defaultMessage": "!!!Include beta versions", 537 "defaultMessage": "!!!Include beta versions",
538 "file": "src/containers/settings/EditSettingsScreen.js", 538 "file": "src/containers/settings/EditSettingsScreen.js",
539 "start": { 539 "start": {
540 "line": 195, 540 "line": 196,
541 "column": 8 541 "column": 8
542 }, 542 },
543 "end": { 543 "end": {
544 "line": 198, 544 "line": 199,
545 "column": 3 545 "column": 3
546 } 546 }
547 }, 547 },
@@ -550,11 +550,11 @@
550 "defaultMessage": "!!!Enable updates", 550 "defaultMessage": "!!!Enable updates",
551 "file": "src/containers/settings/EditSettingsScreen.js", 551 "file": "src/containers/settings/EditSettingsScreen.js",
552 "start": { 552 "start": {
553 "line": 199, 553 "line": 200,
554 "column": 20 554 "column": 20
555 }, 555 },
556 "end": { 556 "end": {
557 "line": 202, 557 "line": 203,
558 "column": 3 558 "column": 3
559 } 559 }
560 }, 560 },
@@ -563,11 +563,11 @@
563 "defaultMessage": "!!!Enable Franz Todos", 563 "defaultMessage": "!!!Enable Franz Todos",
564 "file": "src/containers/settings/EditSettingsScreen.js", 564 "file": "src/containers/settings/EditSettingsScreen.js",
565 "start": { 565 "start": {
566 "line": 203, 566 "line": 204,
567 "column": 15 567 "column": 15
568 }, 568 },
569 "end": { 569 "end": {
570 "line": 206, 570 "line": 207,
571 "column": 3 571 "column": 3
572 } 572 }
573 }, 573 },
@@ -576,11 +576,11 @@
576 "defaultMessage": "!!!Keep all workspaces loaded", 576 "defaultMessage": "!!!Keep all workspaces loaded",
577 "file": "src/containers/settings/EditSettingsScreen.js", 577 "file": "src/containers/settings/EditSettingsScreen.js",
578 "start": { 578 "start": {
579 "line": 207, 579 "line": 208,
580 "column": 27 580 "column": 27
581 }, 581 },
582 "end": { 582 "end": {
583 "line": 210, 583 "line": 211,
584 "column": 3 584 "column": 3
585 } 585 }
586 } 586 }
diff --git a/src/i18n/messages/src/features/delayApp/Component.json b/src/i18n/messages/src/features/delayApp/Component.json
deleted file mode 100644
index 7ec0e69a0..000000000
--- a/src/i18n/messages/src/features/delayApp/Component.json
+++ /dev/null
@@ -1,67 +0,0 @@
1[
2 {
3 "id": "feature.delayApp.headline",
4 "defaultMessage": "!!!Please purchase license to skip waiting",
5 "file": "src/features/delayApp/Component.js",
6 "start": {
7 "line": 16,
8 "column": 12
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.delayApp.trial.headline",
17 "defaultMessage": "!!!Get the free Franz Professional 14 day trial and skip the line",
18 "file": "src/features/delayApp/Component.js",
19 "start": {
20 "line": 20,
21 "column": 17
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.delayApp.upgrade.action",
30 "defaultMessage": "!!!Upgrade Franz",
31 "file": "src/features/delayApp/Component.js",
32 "start": {
33 "line": 24,
34 "column": 10
35 },
36 "end": {
37 "line": 27,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.delayApp.trial.action",
43 "defaultMessage": "!!!Yes, I want the free 14 day trial of Franz Professional",
44 "file": "src/features/delayApp/Component.js",
45 "start": {
46 "line": 28,
47 "column": 15
48 },
49 "end": {
50 "line": 31,
51 "column": 3
52 }
53 },
54 {
55 "id": "feature.delayApp.text",
56 "defaultMessage": "!!!Ferdi will continue in {seconds} seconds.",
57 "file": "src/features/delayApp/Component.js",
58 "start": {
59 "line": 32,
60 "column": 8
61 },
62 "end": {
63 "line": 35,
64 "column": 3
65 }
66 }
67] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/planSelection/components/PlanItem.json b/src/i18n/messages/src/features/planSelection/components/PlanItem.json
deleted file mode 100644
index 5a94f32ee..000000000
--- a/src/i18n/messages/src/features/planSelection/components/PlanItem.json
+++ /dev/null
@@ -1,41 +0,0 @@
1[
2 {
3 "id": "subscription.interval.perMonth",
4 "defaultMessage": "!!!per month",
5 "file": "src/features/planSelection/components/PlanItem.js",
6 "start": {
7 "line": 15,
8 "column": 12
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscription.interval.perMonthPerUser",
17 "defaultMessage": "!!!per month & user",
18 "file": "src/features/planSelection/components/PlanItem.js",
19 "start": {
20 "line": 19,
21 "column": 19
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "subscription.bestValue",
30 "defaultMessage": "!!!Best value",
31 "file": "src/features/planSelection/components/PlanItem.js",
32 "start": {
33 "line": 23,
34 "column": 13
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 }
41] \ 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
deleted file mode 100644
index ed354146e..000000000
--- a/src/i18n/messages/src/features/planSelection/components/PlanSelection.json
+++ /dev/null
@@ -1,158 +0,0 @@
1[
2 {
3 "id": "feature.planSelection.fullscreen.welcome",
4 "defaultMessage": "!!!Are you ready to choose, {name}",
5 "file": "src/features/planSelection/components/PlanSelection.js",
6 "start": {
7 "line": 17,
8 "column": 11
9 },
10 "end": {
11 "line": 20,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.planSelection.fullscreen.subheadline",
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.",
18 "file": "src/features/planSelection/components/PlanSelection.js",
19 "start": {
20 "line": 21,
21 "column": 15
22 },
23 "end": {
24 "line": 24,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.planSelection.free.text",
30 "defaultMessage": "!!!Basic functionality",
31 "file": "src/features/planSelection/components/PlanSelection.js",
32 "start": {
33 "line": 25,
34 "column": 12
35 },
36 "end": {
37 "line": 28,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.planSelection.personal.text",
43 "defaultMessage": "!!!More services, no waiting - ideal for personal use.",
44 "file": "src/features/planSelection/components/PlanSelection.js",
45 "start": {
46 "line": 29,
47 "column": 16
48 },
49 "end": {
50 "line": 32,
51 "column": 3
52 }
53 },
54 {
55 "id": "feature.planSelection.pro.text",
56 "defaultMessage": "!!!Unlimited services and professional features for you - and your team.",
57 "file": "src/features/planSelection/components/PlanSelection.js",
58 "start": {
59 "line": 33,
60 "column": 20
61 },
62 "end": {
63 "line": 36,
64 "column": 3
65 }
66 },
67 {
68 "id": "feature.planSelection.cta.stayOnFree",
69 "defaultMessage": "!!!Stay on Free",
70 "file": "src/features/planSelection/components/PlanSelection.js",
71 "start": {
72 "line": 37,
73 "column": 17
74 },
75 "end": {
76 "line": 40,
77 "column": 3
78 }
79 },
80 {
81 "id": "feature.planSelection.cta.ctaDowngradeFree",
82 "defaultMessage": "!!!Downgrade to Free",
83 "file": "src/features/planSelection/components/PlanSelection.js",
84 "start": {
85 "line": 41,
86 "column": 20
87 },
88 "end": {
89 "line": 44,
90 "column": 3
91 }
92 },
93 {
94 "id": "feature.planSelection.cta.trial",
95 "defaultMessage": "!!!Start my free 14-days Trial",
96 "file": "src/features/planSelection/components/PlanSelection.js",
97 "start": {
98 "line": 45,
99 "column": 15
100 },
101 "end": {
102 "line": 48,
103 "column": 3
104 }
105 },
106 {
107 "id": "feature.planSelection.cta.upgradePersonal",
108 "defaultMessage": "!!!Choose Personal",
109 "file": "src/features/planSelection/components/PlanSelection.js",
110 "start": {
111 "line": 49,
112 "column": 23
113 },
114 "end": {
115 "line": 52,
116 "column": 3
117 }
118 },
119 {
120 "id": "feature.planSelection.cta.upgradePro",
121 "defaultMessage": "!!!Choose Professional",
122 "file": "src/features/planSelection/components/PlanSelection.js",
123 "start": {
124 "line": 53,
125 "column": 18
126 },
127 "end": {
128 "line": 56,
129 "column": 3
130 }
131 },
132 {
133 "id": "feature.planSelection.fullFeatureList",
134 "defaultMessage": "!!!Complete comparison of all plans",
135 "file": "src/features/planSelection/components/PlanSelection.js",
136 "start": {
137 "line": 57,
138 "column": 19
139 },
140 "end": {
141 "line": 60,
142 "column": 3
143 }
144 },
145 {
146 "id": "feature.planSelection.pricesBasedOnAnnualPayment",
147 "defaultMessage": "!!!All prices based on yearly payment",
148 "file": "src/features/planSelection/components/PlanSelection.js",
149 "start": {
150 "line": 61,
151 "column": 30
152 },
153 "end": {
154 "line": 64,
155 "column": 3
156 }
157 }
158] \ 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
deleted file mode 100644
index 015304a2e..000000000
--- a/src/i18n/messages/src/features/planSelection/components/PlanTeaser.json
+++ /dev/null
@@ -1,28 +0,0 @@
1[
2 {
3 "id": "subscription.interval.per",
4 "defaultMessage": "!!!per {interval}",
5 "file": "src/features/planSelection/components/PlanTeaser.js",
6 "start": {
7 "line": 16,
8 "column": 7
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscription.planItem.upgradeAccount",
17 "defaultMessage": "!!!Upgrade Account",
18 "file": "src/features/planSelection/components/PlanTeaser.js",
19 "start": {
20 "line": 20,
21 "column": 7
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 }
28] \ 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
deleted file mode 100644
index 40e08c233..000000000
--- a/src/i18n/messages/src/features/planSelection/containers/PlanSelectionScreen.json
+++ /dev/null
@@ -1,54 +0,0 @@
1[
2 {
3 "id": "feature.planSelection.fullscreen.dialog.title",
4 "defaultMessage": "!!!Downgrade your Franz Plan",
5 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
6 "start": {
7 "line": 15,
8 "column": 15
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.planSelection.fullscreen.dialog.message",
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.",
18 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
19 "start": {
20 "line": 19,
21 "column": 17
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.planSelection.fullscreen.dialog.cta.downgrade",
30 "defaultMessage": "!!!Downgrade to Free",
31 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
32 "start": {
33 "line": 23,
34 "column": 22
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.planSelection.fullscreen.dialog.cta.upgrade",
43 "defaultMessage": "!!!Choose Personal",
44 "file": "src/features/planSelection/containers/PlanSelectionScreen.js",
45 "start": {
46 "line": 27,
47 "column": 20
48 },
49 "end": {
50 "line": 30,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json b/src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json
deleted file mode 100644
index e6e3cef99..000000000
--- a/src/i18n/messages/src/features/serviceLimit/components/AnnouncementScreen.json
+++ /dev/null
@@ -1,15 +0,0 @@
1[
2 {
3 "id": "feature.announcements.changelog.headline",
4 "defaultMessage": "!!!Changes in Franz {version}",
5 "file": "src/features/serviceLimit/components/AnnouncementScreen.js",
6 "start": {
7 "line": 20,
8 "column": 12
9 },
10 "end": {
11 "line": 23,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json b/src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json
deleted file mode 100644
index e35ad8dd8..000000000
--- a/src/i18n/messages/src/features/serviceLimit/components/LimitReachedInfobox.json
+++ /dev/null
@@ -1,28 +0,0 @@
1[
2 {
3 "id": "feature.serviceLimit.limitReached",
4 "defaultMessage": "!!!You have added {amount} of {limit} services. Please upgrade your account to add more services.",
5 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
6 "start": {
7 "line": 9,
8 "column": 16
9 },
10 "end": {
11 "line": 12,
12 "column": 3
13 }
14 },
15 {
16 "id": "premiumFeature.button.upgradeAccount",
17 "defaultMessage": "!!!Upgrade account",
18 "file": "src/features/serviceLimit/components/LimitReachedInfobox.js",
19 "start": {
20 "line": 13,
21 "column": 10
22 },
23 "end": {
24 "line": 16,
25 "column": 3
26 }
27 }
28] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/shareFranz/Component.json b/src/i18n/messages/src/features/shareFranz/Component.json
index 402865ec5..428bd5fbc 100644
--- a/src/i18n/messages/src/features/shareFranz/Component.json
+++ b/src/i18n/messages/src/features/shareFranz/Component.json
@@ -66,7 +66,7 @@
66 }, 66 },
67 { 67 {
68 "id": "feature.shareFranz.shareText.email", 68 "id": "feature.shareFranz.shareText.email",
69 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", 69 "defaultMessage": "!!! I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
70 "file": "src/features/shareFranz/Component.js", 70 "file": "src/features/shareFranz/Component.js",
71 "start": { 71 "start": {
72 "line": 37, 72 "line": 37,
@@ -79,7 +79,7 @@
79 }, 79 },
80 { 80 {
81 "id": "feature.shareFranz.shareText.twitter", 81 "id": "feature.shareFranz.shareText.twitter",
82 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", 82 "defaultMessage": "!!! I've added {count} services to Ferdi! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger",
83 "file": "src/features/shareFranz/Component.js", 83 "file": "src/features/shareFranz/Component.js",
84 "start": { 84 "start": {
85 "line": 41, 85 "line": 41,
diff --git a/src/i18n/messages/src/features/todos/components/TodosWebview.json b/src/i18n/messages/src/features/todos/components/TodosWebview.json
deleted file mode 100644
index ff6e037fc..000000000
--- a/src/i18n/messages/src/features/todos/components/TodosWebview.json
+++ /dev/null
@@ -1,41 +0,0 @@
1[
2 {
3 "id": "feature.todos.premium.info",
4 "defaultMessage": "!!!Franz Todos are available to premium users now!",
5 "file": "src/features/todos/components/TodosWebview.js",
6 "start": {
7 "line": 31,
8 "column": 15
9 },
10 "end": {
11 "line": 34,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.todos.premium.upgrade",
17 "defaultMessage": "!!!Upgrade Account",
18 "file": "src/features/todos/components/TodosWebview.js",
19 "start": {
20 "line": 35,
21 "column": 14
22 },
23 "end": {
24 "line": 38,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.todos.premium.rollout",
30 "defaultMessage": "!!!Everyone else will have to wait a little longer.",
31 "file": "src/features/todos/components/TodosWebview.js",
32 "start": {
33 "line": 39,
34 "column": 15
35 },
36 "end": {
37 "line": 42,
38 "column": 3
39 }
40 }
41] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json b/src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json
deleted file mode 100644
index bf211a016..000000000
--- a/src/i18n/messages/src/features/trialStatusBar/components/TrialStatusBar.json
+++ /dev/null
@@ -1,41 +0,0 @@
1[
2 {
3 "id": "feature.trialStatusBar.restTime",
4 "defaultMessage": "!!!Your Free Franz {plan} Trial ends in {time}.",
5 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
6 "start": {
7 "line": 13,
8 "column": 12
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.trialStatusBar.expired",
17 "defaultMessage": "!!!Your free Franz {plan} Trial has expired, please upgrade your account.",
18 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
19 "start": {
20 "line": 17,
21 "column": 11
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.trialStatusBar.cta",
30 "defaultMessage": "!!!Upgrade now",
31 "file": "src/features/trialStatusBar/components/TrialStatusBar.js",
32 "start": {
33 "line": 21,
34 "column": 7
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 }
41] \ 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
deleted file mode 100644
index 306cd0fee..000000000
--- a/src/i18n/messages/src/features/trialStatusBar/containers/TrialStatusBarScreen.json
+++ /dev/null
@@ -1,54 +0,0 @@
1[
2 {
3 "id": "feature.trialStatusBar.fullscreen.dialog.title",
4 "defaultMessage": "!!!Downgrade your Franz Plan",
5 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
6 "start": {
7 "line": 16,
8 "column": 15
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.trialStatusBar.fullscreen.dialog.message",
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.",
18 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
19 "start": {
20 "line": 20,
21 "column": 17
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.trialStatusBar.fullscreen.dialog.cta.downgrade",
30 "defaultMessage": "!!!Downgrade to Free",
31 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
32 "start": {
33 "line": 24,
34 "column": 22
35 },
36 "end": {
37 "line": 27,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.trialStatusBar.fullscreen.dialog.cta.upgrade",
43 "defaultMessage": "!!!Choose Personal",
44 "file": "src/features/trialStatusBar/containers/TrialStatusBarScreen.js",
45 "start": {
46 "line": 28,
47 "column": 20
48 },
49 "end": {
50 "line": 31,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/webControls/components/WebControls.json b/src/i18n/messages/src/features/webControls/components/WebControls.json
index 969437e98..7676ec0b1 100644
--- a/src/i18n/messages/src/features/webControls/components/WebControls.json
+++ b/src/i18n/messages/src/features/webControls/components/WebControls.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Home", 4 "defaultMessage": "!!!Home",
5 "file": "src/features/webControls/components/WebControls.js", 5 "file": "src/features/webControls/components/WebControls.js",
6 "start": { 6 "start": {
7 "line": 13, 7 "line": 17,
8 "column": 10 8 "column": 10
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 16, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Open in Browser", 17 "defaultMessage": "!!!Open in Browser",
18 "file": "src/features/webControls/components/WebControls.js", 18 "file": "src/features/webControls/components/WebControls.js",
19 "start": { 19 "start": {
20 "line": 17, 20 "line": 21,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 20, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Back", 30 "defaultMessage": "!!!Back",
31 "file": "src/features/webControls/components/WebControls.js", 31 "file": "src/features/webControls/components/WebControls.js",
32 "start": { 32 "start": {
33 "line": 21, 33 "line": 25,
34 "column": 8 34 "column": 8
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 24, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Forward", 43 "defaultMessage": "!!!Forward",
44 "file": "src/features/webControls/components/WebControls.js", 44 "file": "src/features/webControls/components/WebControls.js",
45 "start": { 45 "start": {
46 "line": 25, 46 "line": 29,
47 "column": 11 47 "column": 11
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 28, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Reload", 56 "defaultMessage": "!!!Reload",
57 "file": "src/features/webControls/components/WebControls.js", 57 "file": "src/features/webControls/components/WebControls.js",
58 "start": { 58 "start": {
59 "line": 29, 59 "line": 33,
60 "column": 10 60 "column": 10
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 32, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 } 66 }
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
index 9f0935620..431f12710 100644
--- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Workspaces", 4 "defaultMessage": "!!!Workspaces",
5 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 5 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6 "start": { 6 "start": {
7 "line": 16, 7 "line": 15,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 19, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!All services", 17 "defaultMessage": "!!!All services",
18 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 18 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
19 "start": { 19 "start": {
20 "line": 20, 20 "line": 19,
21 "column": 15 21 "column": 15
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 23, 24 "line": 22,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Workspaces settings", 30 "defaultMessage": "!!!Workspaces settings",
31 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 31 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
32 "start": { 32 "start": {
33 "line": 24, 33 "line": 23,
34 "column": 29 34 "column": 29
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 27, 37 "line": 26,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,37 +43,11 @@
43 "defaultMessage": "!!!Info about workspace feature", 43 "defaultMessage": "!!!Info about workspace feature",
44 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 44 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
45 "start": { 45 "start": {
46 "line": 28, 46 "line": 27,
47 "column": 24 47 "column": 24
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 31, 50 "line": 30,
51 "column": 3
52 }
53 },
54 {
55 "id": "workspaceDrawer.premiumCtaButtonLabel",
56 "defaultMessage": "!!!Create your first workspace",
57 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
58 "start": {
59 "line": 32,
60 "column": 25
61 },
62 "end": {
63 "line": 35,
64 "column": 3
65 }
66 },
67 {
68 "id": "workspaceDrawer.reactivatePremiumAccountLabel",
69 "defaultMessage": "!!!Reactivate premium account",
70 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
71 "start": {
72 "line": 36,
73 "column": 28
74 },
75 "end": {
76 "line": 39,
77 "column": 3 51 "column": 3
78 } 52 }
79 }, 53 },
@@ -82,24 +56,11 @@
82 "defaultMessage": "!!!add new workspace", 56 "defaultMessage": "!!!add new workspace",
83 "file": "src/features/workspaces/components/WorkspaceDrawer.js", 57 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
84 "start": { 58 "start": {
85 "line": 40, 59 "line": 31,
86 "column": 24 60 "column": 24
87 }, 61 },
88 "end": { 62 "end": {
89 "line": 43, 63 "line": 34,
90 "column": 3
91 }
92 },
93 {
94 "id": "workspaceDrawer.proFeatureBadge",
95 "defaultMessage": "!!!Premium feature",
96 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
97 "start": {
98 "line": 44,
99 "column": 23
100 },
101 "end": {
102 "line": 47,
103 "column": 3 64 "column": 3
104 } 65 }
105 } 66 }
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
index d67bc492d..39c9c30fb 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 @@
4 "defaultMessage": "!!!Your workspaces", 4 "defaultMessage": "!!!Your workspaces",
5 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 5 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
6 "start": { 6 "start": {
7 "line": 20, 7 "line": 17,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 23, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!You haven't created any workspaces yet.", 17 "defaultMessage": "!!!You haven't created any workspaces yet.",
18 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 18 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
19 "start": { 19 "start": {
20 "line": 24, 20 "line": 21,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 27, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Could not load your workspaces", 30 "defaultMessage": "!!!Could not load your workspaces",
31 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 31 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
32 "start": { 32 "start": {
33 "line": 28, 33 "line": 25,
34 "column": 27 34 "column": 27
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 31, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Try again", 43 "defaultMessage": "!!!Try again",
44 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 44 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
45 "start": { 45 "start": {
46 "line": 32, 46 "line": 29,
47 "column": 23 47 "column": 23
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 35, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Your changes have been saved", 56 "defaultMessage": "!!!Your changes have been saved",
57 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 57 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
58 "start": { 58 "start": {
59 "line": 36, 59 "line": 33,
60 "column": 15 60 "column": 15
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 39, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Workspace has been deleted", 69 "defaultMessage": "!!!Workspace has been deleted",
70 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 70 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
71 "start": { 71 "start": {
72 "line": 40, 72 "line": 37,
73 "column": 15 73 "column": 15
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 43, 76 "line": 40,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Info about workspace feature", 82 "defaultMessage": "!!!Info about workspace feature",
83 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 83 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
84 "start": { 84 "start": {
85 "line": 44, 85 "line": 41,
86 "column": 24 86 "column": 24
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 47, 89 "line": 44,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces", 95 "defaultMessage": "!!!Less is More: Introducing Ferdi Workspaces",
96 "file": "src/features/workspaces/components/WorkspacesDashboard.js", 96 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
97 "start": { 97 "start": {
98 "line": 48, 98 "line": 45,
99 "column": 28 99 "column": 28
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 51, 102 "line": 48,
103 "column": 3 103 "column": 3
104 } 104 }
105 } 105 }
diff --git a/src/i18n/messages/src/helpers/plan-helpers.json b/src/i18n/messages/src/helpers/plan-helpers.json
deleted file mode 100644
index 3f3e7e85d..000000000
--- a/src/i18n/messages/src/helpers/plan-helpers.json
+++ /dev/null
@@ -1,54 +0,0 @@
1[
2 {
3 "id": "pricing.plan.pro",
4 "defaultMessage": "!!!Professional",
5 "file": "src/helpers/plan-helpers.js",
6 "start": {
7 "line": 5,
8 "column": 15
9 },
10 "end": {
11 "line": 8,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.plan.personal",
17 "defaultMessage": "!!!Personal",
18 "file": "src/helpers/plan-helpers.js",
19 "start": {
20 "line": 9,
21 "column": 20
22 },
23 "end": {
24 "line": 12,
25 "column": 3
26 }
27 },
28 {
29 "id": "pricing.plan.free",
30 "defaultMessage": "!!!Free",
31 "file": "src/helpers/plan-helpers.js",
32 "start": {
33 "line": 13,
34 "column": 16
35 },
36 "end": {
37 "line": 16,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.plan.legacy",
43 "defaultMessage": "!!!Premium",
44 "file": "src/helpers/plan-helpers.js",
45 "start": {
46 "line": 17,
47 "column": 18
48 },
49 "end": {
50 "line": 20,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/helpers/pricing-helpers.json b/src/i18n/messages/src/helpers/pricing-helpers.json
deleted file mode 100644
index 4030a3e3b..000000000
--- a/src/i18n/messages/src/helpers/pricing-helpers.json
+++ /dev/null
@@ -1,80 +0,0 @@
1[
2 {
3 "id": "pricing.plan.pro-yearly",
4 "defaultMessage": "!!!Franz Professional Yearly",
5 "file": "src/helpers/pricing-helpers.js",
6 "start": {
7 "line": 5,
8 "column": 22
9 },
10 "end": {
11 "line": 8,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.plan.pro-monthly",
17 "defaultMessage": "!!!Franz Professional Monthly",
18 "file": "src/helpers/pricing-helpers.js",
19 "start": {
20 "line": 9,
21 "column": 23
22 },
23 "end": {
24 "line": 12,
25 "column": 3
26 }
27 },
28 {
29 "id": "pricing.plan.personal-yearly",
30 "defaultMessage": "!!!Franz Personal Yearly",
31 "file": "src/helpers/pricing-helpers.js",
32 "start": {
33 "line": 13,
34 "column": 27
35 },
36 "end": {
37 "line": 16,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.plan.personal-monthly",
43 "defaultMessage": "!!!Franz Personal Monthly",
44 "file": "src/helpers/pricing-helpers.js",
45 "start": {
46 "line": 17,
47 "column": 28
48 },
49 "end": {
50 "line": 20,
51 "column": 3
52 }
53 },
54 {
55 "id": "pricing.plan.free",
56 "defaultMessage": "!!!Franz Free",
57 "file": "src/helpers/pricing-helpers.js",
58 "start": {
59 "line": 21,
60 "column": 16
61 },
62 "end": {
63 "line": 24,
64 "column": 3
65 }
66 },
67 {
68 "id": "pricing.plan.legacy",
69 "defaultMessage": "!!!Franz Premium",
70 "file": "src/helpers/pricing-helpers.js",
71 "start": {
72 "line": 25,
73 "column": 18
74 },
75 "end": {
76 "line": 28,
77 "column": 3
78 }
79 }
80] \ No newline at end of file
diff --git a/src/i18n/messages/src/i18n/globalMessages.json b/src/i18n/messages/src/i18n/globalMessages.json
index 5778a3389..ed2bfa092 100644
--- a/src/i18n/messages/src/i18n/globalMessages.json
+++ b/src/i18n/messages/src/i18n/globalMessages.json
@@ -102,18 +102,5 @@
102 "line": 35, 102 "line": 35,
103 "column": 3 103 "column": 3
104 } 104 }
105 },
106 {
107 "id": "global.franzProRequired",
108 "defaultMessage": "!!!Franz Professional Required",
109 "file": "src/i18n/globalMessages.js",
110 "start": {
111 "line": 36,
112 "column": 15
113 },
114 "end": {
115 "line": 39,
116 "column": 3
117 }
118 } 105 }
119] \ No newline at end of file 106] \ No newline at end of file
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index 5b185c4e7..e8fa0d10b 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Edit", 4 "defaultMessage": "!!!Edit",
5 "file": "src/lib/Menu.js", 5 "file": "src/lib/Menu.js",
6 "start": { 6 "start": {
7 "line": 19, 7 "line": 20,
8 "column": 8 8 "column": 8
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 22, 11 "line": 23,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Undo", 17 "defaultMessage": "!!!Undo",
18 "file": "src/lib/Menu.js", 18 "file": "src/lib/Menu.js",
19 "start": { 19 "start": {
20 "line": 23, 20 "line": 24,
21 "column": 8 21 "column": 8
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 26, 24 "line": 27,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Redo", 30 "defaultMessage": "!!!Redo",
31 "file": "src/lib/Menu.js", 31 "file": "src/lib/Menu.js",
32 "start": { 32 "start": {
33 "line": 27, 33 "line": 28,
34 "column": 8 34 "column": 8
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 30, 37 "line": 31,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Cut", 43 "defaultMessage": "!!!Cut",
44 "file": "src/lib/Menu.js", 44 "file": "src/lib/Menu.js",
45 "start": { 45 "start": {
46 "line": 31, 46 "line": 32,
47 "column": 7 47 "column": 7
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 34, 50 "line": 35,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Copy", 56 "defaultMessage": "!!!Copy",
57 "file": "src/lib/Menu.js", 57 "file": "src/lib/Menu.js",
58 "start": { 58 "start": {
59 "line": 35, 59 "line": 36,
60 "column": 8 60 "column": 8
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 38, 63 "line": 39,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Paste", 69 "defaultMessage": "!!!Paste",
70 "file": "src/lib/Menu.js", 70 "file": "src/lib/Menu.js",
71 "start": { 71 "start": {
72 "line": 39, 72 "line": 40,
73 "column": 9 73 "column": 9
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 42, 76 "line": 43,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Paste And Match Style", 82 "defaultMessage": "!!!Paste And Match Style",
83 "file": "src/lib/Menu.js", 83 "file": "src/lib/Menu.js",
84 "start": { 84 "start": {
85 "line": 43, 85 "line": 44,
86 "column": 22 86 "column": 22
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 46, 89 "line": 47,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Delete", 95 "defaultMessage": "!!!Delete",
96 "file": "src/lib/Menu.js", 96 "file": "src/lib/Menu.js",
97 "start": { 97 "start": {
98 "line": 47, 98 "line": 48,
99 "column": 10 99 "column": 10
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 50, 102 "line": 51,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Select All", 108 "defaultMessage": "!!!Select All",
109 "file": "src/lib/Menu.js", 109 "file": "src/lib/Menu.js",
110 "start": { 110 "start": {
111 "line": 51, 111 "line": 52,
112 "column": 13 112 "column": 13
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 54, 115 "line": 55,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Find in Page", 121 "defaultMessage": "!!!Find in Page",
122 "file": "src/lib/Menu.js", 122 "file": "src/lib/Menu.js",
123 "start": { 123 "start": {
124 "line": 55, 124 "line": 56,
125 "column": 14 125 "column": 14
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 58, 128 "line": 59,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Speech", 134 "defaultMessage": "!!!Speech",
135 "file": "src/lib/Menu.js", 135 "file": "src/lib/Menu.js",
136 "start": { 136 "start": {
137 "line": 59, 137 "line": 60,
138 "column": 10 138 "column": 10
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 62, 141 "line": 63,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Start Speaking", 147 "defaultMessage": "!!!Start Speaking",
148 "file": "src/lib/Menu.js", 148 "file": "src/lib/Menu.js",
149 "start": { 149 "start": {
150 "line": 63, 150 "line": 64,
151 "column": 17 151 "column": 17
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 66, 154 "line": 67,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Stop Speaking", 160 "defaultMessage": "!!!Stop Speaking",
161 "file": "src/lib/Menu.js", 161 "file": "src/lib/Menu.js",
162 "start": { 162 "start": {
163 "line": 67, 163 "line": 68,
164 "column": 16 164 "column": 16
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 70, 167 "line": 71,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Start Dictation", 173 "defaultMessage": "!!!Start Dictation",
174 "file": "src/lib/Menu.js", 174 "file": "src/lib/Menu.js",
175 "start": { 175 "start": {
176 "line": 71, 176 "line": 72,
177 "column": 18 177 "column": 18
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 74, 180 "line": 75,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Emoji & Symbols", 186 "defaultMessage": "!!!Emoji & Symbols",
187 "file": "src/lib/Menu.js", 187 "file": "src/lib/Menu.js",
188 "start": { 188 "start": {
189 "line": 75, 189 "line": 76,
190 "column": 16 190 "column": 16
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 78, 193 "line": 79,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Open Quick Switch", 199 "defaultMessage": "!!!Open Quick Switch",
200 "file": "src/lib/Menu.js", 200 "file": "src/lib/Menu.js",
201 "start": { 201 "start": {
202 "line": 79, 202 "line": 80,
203 "column": 19 203 "column": 19
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 82, 206 "line": 83,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Back", 212 "defaultMessage": "!!!Back",
213 "file": "src/lib/Menu.js", 213 "file": "src/lib/Menu.js",
214 "start": { 214 "start": {
215 "line": 83, 215 "line": 84,
216 "column": 8 216 "column": 8
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 86, 219 "line": 87,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Forward", 225 "defaultMessage": "!!!Forward",
226 "file": "src/lib/Menu.js", 226 "file": "src/lib/Menu.js",
227 "start": { 227 "start": {
228 "line": 87, 228 "line": 88,
229 "column": 11 229 "column": 11
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 90, 232 "line": 91,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Actual Size", 238 "defaultMessage": "!!!Actual Size",
239 "file": "src/lib/Menu.js", 239 "file": "src/lib/Menu.js",
240 "start": { 240 "start": {
241 "line": 91, 241 "line": 92,
242 "column": 13 242 "column": 13
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 94, 245 "line": 95,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Zoom In", 251 "defaultMessage": "!!!Zoom In",
252 "file": "src/lib/Menu.js", 252 "file": "src/lib/Menu.js",
253 "start": { 253 "start": {
254 "line": 95, 254 "line": 96,
255 "column": 10 255 "column": 10
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 98, 258 "line": 99,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,37 +264,11 @@
264 "defaultMessage": "!!!Zoom Out", 264 "defaultMessage": "!!!Zoom Out",
265 "file": "src/lib/Menu.js", 265 "file": "src/lib/Menu.js",
266 "start": { 266 "start": {
267 "line": 99, 267 "line": 100,
268 "column": 11 268 "column": 11
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 102,
272 "column": 3
273 }
274 },
275 {
276 "id": "menu.view.enterFullScreen",
277 "defaultMessage": "!!!Enter Full Screen",
278 "file": "src/lib/Menu.js",
279 "start": {
280 "line": 103, 271 "line": 103,
281 "column": 19
282 },
283 "end": {
284 "line": 106,
285 "column": 3
286 }
287 },
288 {
289 "id": "menu.view.exitFullScreen",
290 "defaultMessage": "!!!Exit Full Screen",
291 "file": "src/lib/Menu.js",
292 "start": {
293 "line": 107,
294 "column": 18
295 },
296 "end": {
297 "line": 110,
298 "column": 3 272 "column": 3
299 } 273 }
300 }, 274 },
@@ -303,11 +277,11 @@
303 "defaultMessage": "!!!Toggle Full Screen", 277 "defaultMessage": "!!!Toggle Full Screen",
304 "file": "src/lib/Menu.js", 278 "file": "src/lib/Menu.js",
305 "start": { 279 "start": {
306 "line": 111, 280 "line": 104,
307 "column": 20 281 "column": 20
308 }, 282 },
309 "end": { 283 "end": {
310 "line": 114, 284 "line": 107,
311 "column": 3 285 "column": 3
312 } 286 }
313 }, 287 },
@@ -316,11 +290,11 @@
316 "defaultMessage": "!!!Toggle Dark Mode", 290 "defaultMessage": "!!!Toggle Dark Mode",
317 "file": "src/lib/Menu.js", 291 "file": "src/lib/Menu.js",
318 "start": { 292 "start": {
319 "line": 115, 293 "line": 108,
320 "column": 18 294 "column": 18
321 }, 295 },
322 "end": { 296 "end": {
323 "line": 118, 297 "line": 111,
324 "column": 3 298 "column": 3
325 } 299 }
326 }, 300 },
@@ -329,11 +303,11 @@
329 "defaultMessage": "!!!Toggle Developer Tools", 303 "defaultMessage": "!!!Toggle Developer Tools",
330 "file": "src/lib/Menu.js", 304 "file": "src/lib/Menu.js",
331 "start": { 305 "start": {
332 "line": 119, 306 "line": 112,
333 "column": 18 307 "column": 18
334 }, 308 },
335 "end": { 309 "end": {
336 "line": 122, 310 "line": 115,
337 "column": 3 311 "column": 3
338 } 312 }
339 }, 313 },
@@ -342,11 +316,11 @@
342 "defaultMessage": "!!!Toggle Todos Developer Tools", 316 "defaultMessage": "!!!Toggle Todos Developer Tools",
343 "file": "src/lib/Menu.js", 317 "file": "src/lib/Menu.js",
344 "start": { 318 "start": {
345 "line": 123, 319 "line": 116,
346 "column": 23 320 "column": 23
347 }, 321 },
348 "end": { 322 "end": {
349 "line": 126, 323 "line": 119,
350 "column": 3 324 "column": 3
351 } 325 }
352 }, 326 },
@@ -355,11 +329,11 @@
355 "defaultMessage": "!!!Toggle Service Developer Tools", 329 "defaultMessage": "!!!Toggle Service Developer Tools",
356 "file": "src/lib/Menu.js", 330 "file": "src/lib/Menu.js",
357 "start": { 331 "start": {
358 "line": 127, 332 "line": 120,
359 "column": 25 333 "column": 25
360 }, 334 },
361 "end": { 335 "end": {
362 "line": 130, 336 "line": 123,
363 "column": 3 337 "column": 3
364 } 338 }
365 }, 339 },
@@ -368,24 +342,24 @@
368 "defaultMessage": "!!!Reload Service", 342 "defaultMessage": "!!!Reload Service",
369 "file": "src/lib/Menu.js", 343 "file": "src/lib/Menu.js",
370 "start": { 344 "start": {
371 "line": 131, 345 "line": 124,
372 "column": 17 346 "column": 17
373 }, 347 },
374 "end": { 348 "end": {
375 "line": 134, 349 "line": 127,
376 "column": 3 350 "column": 3
377 } 351 }
378 }, 352 },
379 { 353 {
380 "id": "menu.view.reloadFranz", 354 "id": "menu.view.reloadFerdi",
381 "defaultMessage": "!!!Reload Ferdi", 355 "defaultMessage": "!!!Reload Ferdi",
382 "file": "src/lib/Menu.js", 356 "file": "src/lib/Menu.js",
383 "start": { 357 "start": {
384 "line": 135, 358 "line": 128,
385 "column": 15 359 "column": 15
386 }, 360 },
387 "end": { 361 "end": {
388 "line": 138, 362 "line": 131,
389 "column": 3 363 "column": 3
390 } 364 }
391 }, 365 },
@@ -394,11 +368,11 @@
394 "defaultMessage": "!!!Lock Ferdi", 368 "defaultMessage": "!!!Lock Ferdi",
395 "file": "src/lib/Menu.js", 369 "file": "src/lib/Menu.js",
396 "start": { 370 "start": {
397 "line": 139, 371 "line": 132,
398 "column": 13 372 "column": 13
399 }, 373 },
400 "end": { 374 "end": {
401 "line": 142, 375 "line": 135,
402 "column": 3 376 "column": 3
403 } 377 }
404 }, 378 },
@@ -407,11 +381,11 @@
407 "defaultMessage": "!!!Reload ToDos", 381 "defaultMessage": "!!!Reload ToDos",
408 "file": "src/lib/Menu.js", 382 "file": "src/lib/Menu.js",
409 "start": { 383 "start": {
410 "line": 143, 384 "line": 136,
411 "column": 15 385 "column": 15
412 }, 386 },
413 "end": { 387 "end": {
414 "line": 146, 388 "line": 139,
415 "column": 3 389 "column": 3
416 } 390 }
417 }, 391 },
@@ -420,11 +394,11 @@
420 "defaultMessage": "!!!Minimize", 394 "defaultMessage": "!!!Minimize",
421 "file": "src/lib/Menu.js", 395 "file": "src/lib/Menu.js",
422 "start": { 396 "start": {
423 "line": 147, 397 "line": 140,
424 "column": 12 398 "column": 12
425 }, 399 },
426 "end": { 400 "end": {
427 "line": 150, 401 "line": 143,
428 "column": 3 402 "column": 3
429 } 403 }
430 }, 404 },
@@ -433,11 +407,11 @@
433 "defaultMessage": "!!!Close", 407 "defaultMessage": "!!!Close",
434 "file": "src/lib/Menu.js", 408 "file": "src/lib/Menu.js",
435 "start": { 409 "start": {
436 "line": 151, 410 "line": 144,
437 "column": 9 411 "column": 9
438 }, 412 },
439 "end": { 413 "end": {
440 "line": 154, 414 "line": 147,
441 "column": 3 415 "column": 3
442 } 416 }
443 }, 417 },
@@ -446,11 +420,11 @@
446 "defaultMessage": "!!!Learn More", 420 "defaultMessage": "!!!Learn More",
447 "file": "src/lib/Menu.js", 421 "file": "src/lib/Menu.js",
448 "start": { 422 "start": {
449 "line": 155, 423 "line": 148,
450 "column": 13 424 "column": 13
451 }, 425 },
452 "end": { 426 "end": {
453 "line": 158, 427 "line": 151,
454 "column": 3 428 "column": 3
455 } 429 }
456 }, 430 },
@@ -459,11 +433,24 @@
459 "defaultMessage": "!!!Changelog", 433 "defaultMessage": "!!!Changelog",
460 "file": "src/lib/Menu.js", 434 "file": "src/lib/Menu.js",
461 "start": { 435 "start": {
462 "line": 159, 436 "line": 152,
463 "column": 13 437 "column": 13
464 }, 438 },
465 "end": { 439 "end": {
466 "line": 162, 440 "line": 155,
441 "column": 3
442 }
443 },
444 {
445 "id": "menu.help.importExportData",
446 "defaultMessage": "!!!Import/Export Configuration Data",
447 "file": "src/lib/Menu.js",
448 "start": {
449 "line": 156,
450 "column": 20
451 },
452 "end": {
453 "line": 159,
467 "column": 3 454 "column": 3
468 } 455 }
469 }, 456 },
@@ -472,11 +459,11 @@
472 "defaultMessage": "!!!Support", 459 "defaultMessage": "!!!Support",
473 "file": "src/lib/Menu.js", 460 "file": "src/lib/Menu.js",
474 "start": { 461 "start": {
475 "line": 163, 462 "line": 160,
476 "column": 11 463 "column": 11
477 }, 464 },
478 "end": { 465 "end": {
479 "line": 166, 466 "line": 163,
480 "column": 3 467 "column": 3
481 } 468 }
482 }, 469 },
@@ -485,11 +472,11 @@
485 "defaultMessage": "!!!Copy Debug Information", 472 "defaultMessage": "!!!Copy Debug Information",
486 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
487 "start": { 474 "start": {
488 "line": 167, 475 "line": 164,
489 "column": 13 476 "column": 13
490 }, 477 },
491 "end": { 478 "end": {
492 "line": 170, 479 "line": 167,
493 "column": 3 480 "column": 3
494 } 481 }
495 }, 482 },
@@ -498,11 +485,11 @@
498 "defaultMessage": "!!!Publish Debug Information", 485 "defaultMessage": "!!!Publish Debug Information",
499 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
500 "start": { 487 "start": {
501 "line": 171, 488 "line": 168,
502 "column": 20 489 "column": 20
503 }, 490 },
504 "end": { 491 "end": {
505 "line": 174, 492 "line": 171,
506 "column": 3 493 "column": 3
507 } 494 }
508 }, 495 },
@@ -511,11 +498,11 @@
511 "defaultMessage": "!!!Ferdi Debug Information", 498 "defaultMessage": "!!!Ferdi Debug Information",
512 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
513 "start": { 500 "start": {
514 "line": 175, 501 "line": 172,
515 "column": 27 502 "column": 27
516 }, 503 },
517 "end": { 504 "end": {
518 "line": 178, 505 "line": 175,
519 "column": 3 506 "column": 3
520 } 507 }
521 }, 508 },
@@ -524,11 +511,11 @@
524 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 511 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
525 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
526 "start": { 513 "start": {
527 "line": 179, 514 "line": 176,
528 "column": 23 515 "column": 23
529 }, 516 },
530 "end": { 517 "end": {
531 "line": 182, 518 "line": 179,
532 "column": 3 519 "column": 3
533 } 520 }
534 }, 521 },
@@ -537,11 +524,11 @@
537 "defaultMessage": "!!!Unlock with Touch ID", 524 "defaultMessage": "!!!Unlock with Touch ID",
538 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
539 "start": { 526 "start": {
540 "line": 183, 527 "line": 180,
541 "column": 11 528 "column": 11
542 }, 529 },
543 "end": { 530 "end": {
544 "line": 186, 531 "line": 183,
545 "column": 3 532 "column": 3
546 } 533 }
547 }, 534 },
@@ -550,11 +537,11 @@
550 "defaultMessage": "!!!unlock via Touch ID", 537 "defaultMessage": "!!!unlock via Touch ID",
551 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
552 "start": { 539 "start": {
553 "line": 187, 540 "line": 184,
554 "column": 17 541 "column": 17
555 }, 542 },
556 "end": { 543 "end": {
557 "line": 190, 544 "line": 187,
558 "column": 3 545 "column": 3
559 } 546 }
560 }, 547 },
@@ -563,11 +550,11 @@
563 "defaultMessage": "!!!Terms of Service", 550 "defaultMessage": "!!!Terms of Service",
564 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
565 "start": { 552 "start": {
566 "line": 191, 553 "line": 188,
567 "column": 7 554 "column": 7
568 }, 555 },
569 "end": { 556 "end": {
570 "line": 194, 557 "line": 191,
571 "column": 3 558 "column": 3
572 } 559 }
573 }, 560 },
@@ -576,11 +563,11 @@
576 "defaultMessage": "!!!Privacy Statement", 563 "defaultMessage": "!!!Privacy Statement",
577 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
578 "start": { 565 "start": {
579 "line": 195, 566 "line": 192,
580 "column": 11 567 "column": 11
581 }, 568 },
582 "end": { 569 "end": {
583 "line": 198, 570 "line": 195,
584 "column": 3 571 "column": 3
585 } 572 }
586 }, 573 },
@@ -589,11 +576,11 @@
589 "defaultMessage": "!!!File", 576 "defaultMessage": "!!!File",
590 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
591 "start": { 578 "start": {
592 "line": 199, 579 "line": 196,
593 "column": 8 580 "column": 8
594 }, 581 },
595 "end": { 582 "end": {
596 "line": 202, 583 "line": 199,
597 "column": 3 584 "column": 3
598 } 585 }
599 }, 586 },
@@ -602,11 +589,11 @@
602 "defaultMessage": "!!!View", 589 "defaultMessage": "!!!View",
603 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
604 "start": { 591 "start": {
605 "line": 203, 592 "line": 200,
606 "column": 8 593 "column": 8
607 }, 594 },
608 "end": { 595 "end": {
609 "line": 206, 596 "line": 203,
610 "column": 3 597 "column": 3
611 } 598 }
612 }, 599 },
@@ -615,11 +602,11 @@
615 "defaultMessage": "!!!Services", 602 "defaultMessage": "!!!Services",
616 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
617 "start": { 604 "start": {
618 "line": 207, 605 "line": 204,
619 "column": 12 606 "column": 12
620 }, 607 },
621 "end": { 608 "end": {
622 "line": 210, 609 "line": 207,
623 "column": 3 610 "column": 3
624 } 611 }
625 }, 612 },
@@ -628,11 +615,11 @@
628 "defaultMessage": "!!!Window", 615 "defaultMessage": "!!!Window",
629 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
630 "start": { 617 "start": {
631 "line": 211, 618 "line": 208,
632 "column": 10 619 "column": 10
633 }, 620 },
634 "end": { 621 "end": {
635 "line": 214, 622 "line": 211,
636 "column": 3 623 "column": 3
637 } 624 }
638 }, 625 },
@@ -641,11 +628,11 @@
641 "defaultMessage": "!!!Help", 628 "defaultMessage": "!!!Help",
642 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
643 "start": { 630 "start": {
644 "line": 215, 631 "line": 212,
645 "column": 8 632 "column": 8
646 }, 633 },
647 "end": { 634 "end": {
648 "line": 218, 635 "line": 215,
649 "column": 3 636 "column": 3
650 } 637 }
651 }, 638 },
@@ -654,11 +641,11 @@
654 "defaultMessage": "!!!About Ferdi", 641 "defaultMessage": "!!!About Ferdi",
655 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
656 "start": { 643 "start": {
657 "line": 219, 644 "line": 216,
658 "column": 9 645 "column": 9
659 }, 646 },
660 "end": { 647 "end": {
661 "line": 222, 648 "line": 219,
662 "column": 3 649 "column": 3
663 } 650 }
664 }, 651 },
@@ -667,11 +654,11 @@
667 "defaultMessage": "!!!What's new?", 654 "defaultMessage": "!!!What's new?",
668 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
669 "start": { 656 "start": {
670 "line": 223, 657 "line": 220,
671 "column": 16 658 "column": 16
672 }, 659 },
673 "end": { 660 "end": {
674 "line": 226, 661 "line": 223,
675 "column": 3 662 "column": 3
676 } 663 }
677 }, 664 },
@@ -680,11 +667,11 @@
680 "defaultMessage": "!!!Settings", 667 "defaultMessage": "!!!Settings",
681 "file": "src/lib/Menu.js", 668 "file": "src/lib/Menu.js",
682 "start": { 669 "start": {
683 "line": 227, 670 "line": 224,
684 "column": 12 671 "column": 12
685 }, 672 },
686 "end": { 673 "end": {
687 "line": 230, 674 "line": 227,
688 "column": 3 675 "column": 3
689 } 676 }
690 }, 677 },
@@ -693,11 +680,11 @@
693 "defaultMessage": "!!!Check for updates", 680 "defaultMessage": "!!!Check for updates",
694 "file": "src/lib/Menu.js", 681 "file": "src/lib/Menu.js",
695 "start": { 682 "start": {
696 "line": 231, 683 "line": 228,
697 "column": 19 684 "column": 19
698 }, 685 },
699 "end": { 686 "end": {
700 "line": 234, 687 "line": 231,
701 "column": 3 688 "column": 3
702 } 689 }
703 }, 690 },
@@ -706,11 +693,11 @@
706 "defaultMessage": "!!!Hide", 693 "defaultMessage": "!!!Hide",
707 "file": "src/lib/Menu.js", 694 "file": "src/lib/Menu.js",
708 "start": { 695 "start": {
709 "line": 235, 696 "line": 232,
710 "column": 8 697 "column": 8
711 }, 698 },
712 "end": { 699 "end": {
713 "line": 238, 700 "line": 235,
714 "column": 3 701 "column": 3
715 } 702 }
716 }, 703 },
@@ -719,11 +706,11 @@
719 "defaultMessage": "!!!Hide Others", 706 "defaultMessage": "!!!Hide Others",
720 "file": "src/lib/Menu.js", 707 "file": "src/lib/Menu.js",
721 "start": { 708 "start": {
722 "line": 239, 709 "line": 236,
723 "column": 14 710 "column": 14
724 }, 711 },
725 "end": { 712 "end": {
726 "line": 242, 713 "line": 239,
727 "column": 3 714 "column": 3
728 } 715 }
729 }, 716 },
@@ -732,11 +719,11 @@
732 "defaultMessage": "!!!Unhide", 719 "defaultMessage": "!!!Unhide",
733 "file": "src/lib/Menu.js", 720 "file": "src/lib/Menu.js",
734 "start": { 721 "start": {
735 "line": 243, 722 "line": 240,
736 "column": 10 723 "column": 10
737 }, 724 },
738 "end": { 725 "end": {
739 "line": 246, 726 "line": 243,
740 "column": 3 727 "column": 3
741 } 728 }
742 }, 729 },
@@ -745,11 +732,11 @@
745 "defaultMessage": "!!!Auto-hide menu bar", 732 "defaultMessage": "!!!Auto-hide menu bar",
746 "file": "src/lib/Menu.js", 733 "file": "src/lib/Menu.js",
747 "start": { 734 "start": {
748 "line": 247, 735 "line": 244,
749 "column": 19 736 "column": 19
750 }, 737 },
751 "end": { 738 "end": {
752 "line": 250, 739 "line": 247,
753 "column": 3 740 "column": 3
754 } 741 }
755 }, 742 },
@@ -758,11 +745,11 @@
758 "defaultMessage": "!!!Quit", 745 "defaultMessage": "!!!Quit",
759 "file": "src/lib/Menu.js", 746 "file": "src/lib/Menu.js",
760 "start": { 747 "start": {
761 "line": 251, 748 "line": 248,
762 "column": 8 749 "column": 8
763 }, 750 },
764 "end": { 751 "end": {
765 "line": 254, 752 "line": 251,
766 "column": 3 753 "column": 3
767 } 754 }
768 }, 755 },
@@ -771,11 +758,11 @@
771 "defaultMessage": "!!!Add New Service...", 758 "defaultMessage": "!!!Add New Service...",
772 "file": "src/lib/Menu.js", 759 "file": "src/lib/Menu.js",
773 "start": { 760 "start": {
774 "line": 255, 761 "line": 252,
775 "column": 17 762 "column": 17
776 }, 763 },
777 "end": { 764 "end": {
778 "line": 258, 765 "line": 255,
779 "column": 3 766 "column": 3
780 } 767 }
781 }, 768 },
@@ -784,11 +771,11 @@
784 "defaultMessage": "!!!Add New Workspace...", 771 "defaultMessage": "!!!Add New Workspace...",
785 "file": "src/lib/Menu.js", 772 "file": "src/lib/Menu.js",
786 "start": { 773 "start": {
787 "line": 259, 774 "line": 256,
788 "column": 19 775 "column": 19
789 }, 776 },
790 "end": { 777 "end": {
791 "line": 262, 778 "line": 259,
792 "column": 3 779 "column": 3
793 } 780 }
794 }, 781 },
@@ -797,11 +784,11 @@
797 "defaultMessage": "!!!Open workspace drawer", 784 "defaultMessage": "!!!Open workspace drawer",
798 "file": "src/lib/Menu.js", 785 "file": "src/lib/Menu.js",
799 "start": { 786 "start": {
800 "line": 263, 787 "line": 260,
801 "column": 23 788 "column": 23
802 }, 789 },
803 "end": { 790 "end": {
804 "line": 266, 791 "line": 263,
805 "column": 3 792 "column": 3
806 } 793 }
807 }, 794 },
@@ -810,11 +797,11 @@
810 "defaultMessage": "!!!Close workspace drawer", 797 "defaultMessage": "!!!Close workspace drawer",
811 "file": "src/lib/Menu.js", 798 "file": "src/lib/Menu.js",
812 "start": { 799 "start": {
813 "line": 267, 800 "line": 264,
814 "column": 24 801 "column": 24
815 }, 802 },
816 "end": { 803 "end": {
817 "line": 270, 804 "line": 267,
818 "column": 3 805 "column": 3
819 } 806 }
820 }, 807 },
@@ -823,11 +810,11 @@
823 "defaultMessage": "!!!Activate next service...", 810 "defaultMessage": "!!!Activate next service...",
824 "file": "src/lib/Menu.js", 811 "file": "src/lib/Menu.js",
825 "start": { 812 "start": {
826 "line": 271, 813 "line": 268,
827 "column": 23 814 "column": 23
828 }, 815 },
829 "end": { 816 "end": {
830 "line": 274, 817 "line": 271,
831 "column": 3 818 "column": 3
832 } 819 }
833 }, 820 },
@@ -836,11 +823,11 @@
836 "defaultMessage": "!!!Activate previous service...", 823 "defaultMessage": "!!!Activate previous service...",
837 "file": "src/lib/Menu.js", 824 "file": "src/lib/Menu.js",
838 "start": { 825 "start": {
839 "line": 275, 826 "line": 272,
840 "column": 27 827 "column": 27
841 }, 828 },
842 "end": { 829 "end": {
843 "line": 278, 830 "line": 275,
844 "column": 3 831 "column": 3
845 } 832 }
846 }, 833 },
@@ -849,11 +836,11 @@
849 "defaultMessage": "!!!Disable notifications & audio", 836 "defaultMessage": "!!!Disable notifications & audio",
850 "file": "src/lib/Menu.js", 837 "file": "src/lib/Menu.js",
851 "start": { 838 "start": {
852 "line": 279, 839 "line": 276,
853 "column": 11 840 "column": 11
854 }, 841 },
855 "end": { 842 "end": {
856 "line": 282, 843 "line": 279,
857 "column": 3 844 "column": 3
858 } 845 }
859 }, 846 },
@@ -862,11 +849,11 @@
862 "defaultMessage": "!!!Enable notifications & audio", 849 "defaultMessage": "!!!Enable notifications & audio",
863 "file": "src/lib/Menu.js", 850 "file": "src/lib/Menu.js",
864 "start": { 851 "start": {
865 "line": 283, 852 "line": 280,
866 "column": 13 853 "column": 13
867 }, 854 },
868 "end": { 855 "end": {
869 "line": 286, 856 "line": 283,
870 "column": 3 857 "column": 3
871 } 858 }
872 }, 859 },
@@ -875,11 +862,11 @@
875 "defaultMessage": "!!!Workspaces", 862 "defaultMessage": "!!!Workspaces",
876 "file": "src/lib/Menu.js", 863 "file": "src/lib/Menu.js",
877 "start": { 864 "start": {
878 "line": 287, 865 "line": 284,
879 "column": 14 866 "column": 14
880 }, 867 },
881 "end": { 868 "end": {
882 "line": 290, 869 "line": 287,
883 "column": 3 870 "column": 3
884 } 871 }
885 }, 872 },
@@ -888,11 +875,11 @@
888 "defaultMessage": "!!!Default", 875 "defaultMessage": "!!!Default",
889 "file": "src/lib/Menu.js", 876 "file": "src/lib/Menu.js",
890 "start": { 877 "start": {
891 "line": 291, 878 "line": 288,
892 "column": 20 879 "column": 20
893 }, 880 },
894 "end": { 881 "end": {
895 "line": 294, 882 "line": 291,
896 "column": 3 883 "column": 3
897 } 884 }
898 }, 885 },
@@ -901,11 +888,11 @@
901 "defaultMessage": "!!!Todos", 888 "defaultMessage": "!!!Todos",
902 "file": "src/lib/Menu.js", 889 "file": "src/lib/Menu.js",
903 "start": { 890 "start": {
904 "line": 295, 891 "line": 292,
905 "column": 9 892 "column": 9
906 }, 893 },
907 "end": { 894 "end": {
908 "line": 298, 895 "line": 295,
909 "column": 3 896 "column": 3
910 } 897 }
911 }, 898 },
@@ -914,11 +901,11 @@
914 "defaultMessage": "!!!Open Todos drawer", 901 "defaultMessage": "!!!Open Todos drawer",
915 "file": "src/lib/Menu.js", 902 "file": "src/lib/Menu.js",
916 "start": { 903 "start": {
917 "line": 299, 904 "line": 296,
918 "column": 19 905 "column": 19
919 }, 906 },
920 "end": { 907 "end": {
921 "line": 302, 908 "line": 299,
922 "column": 3 909 "column": 3
923 } 910 }
924 }, 911 },
@@ -927,11 +914,11 @@
927 "defaultMessage": "!!!Close Todos drawer", 914 "defaultMessage": "!!!Close Todos drawer",
928 "file": "src/lib/Menu.js", 915 "file": "src/lib/Menu.js",
929 "start": { 916 "start": {
930 "line": 303, 917 "line": 300,
931 "column": 20 918 "column": 20
932 }, 919 },
933 "end": { 920 "end": {
934 "line": 306, 921 "line": 303,
935 "column": 3 922 "column": 3
936 } 923 }
937 }, 924 },
@@ -940,11 +927,11 @@
940 "defaultMessage": "!!!Enable Todos", 927 "defaultMessage": "!!!Enable Todos",
941 "file": "src/lib/Menu.js", 928 "file": "src/lib/Menu.js",
942 "start": { 929 "start": {
943 "line": 307, 930 "line": 304,
944 "column": 15 931 "column": 15
945 }, 932 },
946 "end": { 933 "end": {
947 "line": 310, 934 "line": 307,
948 "column": 3 935 "column": 3
949 } 936 }
950 }, 937 },
@@ -953,11 +940,11 @@
953 "defaultMessage": "!!!Home", 940 "defaultMessage": "!!!Home",
954 "file": "src/lib/Menu.js", 941 "file": "src/lib/Menu.js",
955 "start": { 942 "start": {
956 "line": 311, 943 "line": 308,
957 "column": 17 944 "column": 17
958 }, 945 },
959 "end": { 946 "end": {
960 "line": 314, 947 "line": 311,
961 "column": 3 948 "column": 3
962 } 949 }
963 } 950 }
diff --git a/src/index.html b/src/index.html
index 6b67cc248..929aec3ad 100644
--- a/src/index.html
+++ b/src/index.html
@@ -1,60 +1,84 @@
1<!DOCTYPE html> 1<!DOCTYPE html>
2<html lang="en"> 2<html lang="en">
3<head> 3 <head>
4 <title>Ferdi</title> 4 <title>Ferdi</title>
5 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> 5 <meta charset="UTF-8" />
6 <link rel="stylesheet" type="text/css" href="./styles/main.css" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1" />
7 <script type="text/javascript" src="./app.js"></script> 7 <link rel="stylesheet" type="text/css" href="./styles/main.css" />
8</head> 8 <link
9<body> 9 rel="stylesheet"
10 <div class="window-draggable"></div> 10 type="text/css"
11 <div class="dev-warning">DEV MODE</div> 11 href="./styles/animations.css"
12 <div id="root"></div> 12 media="(prefers-reduced-motion: no-preference)"
13 <div id="portalContainer"></div> 13 />
14 <script> 14 <script type="text/javascript" src="./app.js"></script>
15 document.querySelector('body').classList.add(process.env.OS_PLATFORM ? process.env.OS_PLATFORM : process.platform); 15 </head>
16 <body>
17 <div class="window-draggable"></div>
18 <div class="dev-warning">DEV MODE</div>
19 <div id="root"></div>
20 <div id="portalContainer"></div>
21 <script>
22 document
23 .querySelector('body')
24 .classList.add(
25 process.env.OS_PLATFORM ? process.env.OS_PLATFORM : process.platform,
26 );
16 27
17 require('./sentry') 28 require('./sentry');
18 const { isDevMode } = require('./environment'); 29 const { isDevMode } = require('./environment');
19 if (isDevMode) { 30 if (isDevMode) {
20 const debugging = require('debug'); 31 const debugging = require('debug');
21 debugging.enable(process.env.DEBUG); 32 debugging.enable(process.env.DEBUG);
22 33
23 const debug = debugging('Index'); 34 const debug = debugging('Index');
24 35
25 document.querySelector('body').classList.add('isDevMode'); 36 document.querySelector('body').classList.add('isDevMode');
26 37
27 (function() { 38 (function () {
28 const lrHost = 'http://localhost:35729'; 39 const lrHost = 'http://localhost:35729';
29 const s = document.createElement('script'); 40 const s = document.createElement('script');
30 s.async = true; 41 s.async = true;
31 s.setAttribute('src', lrHost + '/livereload.js'); 42 s.setAttribute('src', lrHost + '/livereload.js');
32 document.body.appendChild(s); 43 document.body.appendChild(s);
33 44
34 s.onload = () => { 45 s.onload = () => {
35 debug('livereload loaded'); 46 debug('livereload loaded');
36 const originalReloadBehaviour = window._onLiveReloadFileChanged; 47 const originalReloadBehaviour = window._onLiveReloadFileChanged;
37 48
38 window._onLiveReloadFileChanged = (file) => { 49 window._onLiveReloadFileChanged = file => {
39 const isTodoPreloadPath = file.path.includes('/build/features/todos/preload.js'); 50 const isTodoPreloadPath = file.path.includes(
40 if (!file.path.includes('/build/webview/') && !file.path.includes('/build/index.js') && !file.path.includes('/build/electron/') && !isTodoPreloadPath) { 51 '/build/features/todos/preload.js',
41 originalReloadBehaviour(file); 52 );
42 } else { 53 if (
43 if (isTodoPreloadPath) { 54 !file.path.includes('/build/webview/') &&
44 debug('Livereload: Reloading all webviews'); 55 !file.path.includes('/build/index.js') &&
45 const webview = document.querySelector('webview[partition="persist:todos"]'); 56 !file.path.includes('/build/electron/') &&
46 if (webview) webview.reload(); 57 !isTodoPreloadPath
47 } else if (file.path.includes('/build/webview/')) { 58 ) {
48 debug('Livereload: Reloading all webviews'); 59 originalReloadBehaviour(file);
49 const webviews = document.querySelectorAll('webview').forEach(webview => webview.reload());
50 } else { 60 } else {
51 debug('Livereload: skip reload as only main process files have changed'); 61 if (isTodoPreloadPath) {
62 debug('Livereload: Reloading all webviews');
63 const webview = document.querySelector(
64 'webview[partition="persist:todos"]',
65 );
66 if (webview) webview.reload();
67 } else if (file.path.includes('/build/webview/')) {
68 debug('Livereload: Reloading all webviews');
69 const webviews = document
70 .querySelectorAll('webview')
71 .forEach(webview => webview.reload());
72 } else {
73 debug(
74 'Livereload: skip reload as only main process files have changed',
75 );
76 }
52 } 77 }
53 } 78 };
54 } 79 };
55 } 80 })();
56 })(); 81 }
57 } 82 </script>
58 </script> 83 </body>
59</body>
60</html> 84</html>
diff --git a/src/index.js b/src/index.js
index 91004aac7..9146a23da 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,15 +1,9 @@
1/* eslint-disable import/first */ 1/* eslint-disable import/first */
2 2
3import { 3import { app, BrowserWindow, shell, ipcMain, session } from 'electron';
4 app, 4
5 BrowserWindow, 5import { emptyDirSync, ensureFileSync } from 'fs-extra';
6 shell, 6import { join } from 'path';
7 ipcMain,
8 session,
9} from 'electron';
10
11import fs from 'fs-extra';
12import path from 'path';
13import windowStateKeeper from 'electron-window-state'; 7import windowStateKeeper from 'electron-window-state';
14import { enforceMacOSAppLocation } from 'electron-util'; 8import { enforceMacOSAppLocation } from 'electron-util';
15import ms from 'ms'; 9import ms from 'ms';
@@ -25,6 +19,8 @@ import {
25 isWindows, 19 isWindows,
26 isLinux, 20 isLinux,
27 aboutAppDetails, 21 aboutAppDetails,
22 userDataRecipesPath,
23 userDataPath,
28} from './environment'; 24} from './environment';
29 25
30import { mainIpcHandler as basicAuthHandler } from './features/basicAuth'; 26import { mainIpcHandler as basicAuthHandler } from './features/basicAuth';
@@ -69,8 +65,8 @@ function onDidLoad(fn) {
69} 65}
70 66
71// Ensure that the recipe directory exists 67// Ensure that the recipe directory exists
72fs.emptyDirSync(path.join(app.getPath('userData'), 'recipes', 'temp')); 68emptyDirSync(userDataRecipesPath('temp'));
73fs.ensureFileSync(path.join(app.getPath('userData'), 'window-state.json')); 69ensureFileSync(userDataPath('window-state.json'));
74 70
75// Set App ID for Windows 71// Set App ID for Windows
76if (isWindows) { 72if (isWindows) {
@@ -90,7 +86,9 @@ if (settings.get('sentry')) {
90const liftSingleInstanceLock = settings.get('liftSingleInstanceLock') || false; 86const liftSingleInstanceLock = settings.get('liftSingleInstanceLock') || false;
91 87
92// Force single window 88// Force single window
93const gotTheLock = liftSingleInstanceLock ? true : app.requestSingleInstanceLock(); 89const gotTheLock = liftSingleInstanceLock
90 ? true
91 : app.requestSingleInstanceLock();
94if (!gotTheLock) { 92if (!gotTheLock) {
95 app.quit(); 93 app.quit();
96} else { 94} else {
@@ -106,7 +104,7 @@ if (!gotTheLock) {
106 mainWindow.focus(); 104 mainWindow.focus();
107 105
108 if (isWindows) { 106 if (isWindows) {
109 onDidLoad((window) => { 107 onDidLoad(window => {
110 // Keep only command line / deep linked arguments 108 // Keep only command line / deep linked arguments
111 const url = argv.slice(1); 109 const url = argv.slice(1);
112 if (url) { 110 if (url) {
@@ -117,8 +115,14 @@ if (!gotTheLock) {
117 // Needs to be delayed to not interfere with mainWindow.restore(); 115 // Needs to be delayed to not interfere with mainWindow.restore();
118 setTimeout(() => { 116 setTimeout(() => {
119 debug('Resetting windows via Task'); 117 debug('Resetting windows via Task');
120 window.setPosition(DEFAULT_WINDOW_OPTIONS.x + 100, DEFAULT_WINDOW_OPTIONS.y + 100); 118 window.setPosition(
121 window.setSize(DEFAULT_WINDOW_OPTIONS.width, DEFAULT_WINDOW_OPTIONS.height); 119 DEFAULT_WINDOW_OPTIONS.x + 100,
120 DEFAULT_WINDOW_OPTIONS.y + 100,
121 );
122 window.setSize(
123 DEFAULT_WINDOW_OPTIONS.width,
124 DEFAULT_WINDOW_OPTIONS.height,
125 );
122 }, 1); 126 }, 1);
123 } else if (argv.includes('--quit')) { 127 } else if (argv.includes('--quit')) {
124 // Needs to be delayed to not interfere with mainWindow.restore(); 128 // Needs to be delayed to not interfere with mainWindow.restore();
@@ -135,7 +139,10 @@ if (!gotTheLock) {
135 139
136// Fix Unity indicator issue 140// Fix Unity indicator issue
137// https://github.com/electron/electron/issues/9046 141// https://github.com/electron/electron/issues/9046
138if (isLinux && ['Pantheon', 'Unity:Unity7'].indexOf(process.env.XDG_CURRENT_DESKTOP) !== -1) { 142if (
143 isLinux &&
144 ['Pantheon', 'Unity:Unity7'].indexOf(process.env.XDG_CURRENT_DESKTOP) !== -1
145) {
139 process.env.XDG_CURRENT_DESKTOP = 'Unity'; 146 process.env.XDG_CURRENT_DESKTOP = 'Unity';
140} 147}
141 148
@@ -169,7 +176,9 @@ const createWindow = () => {
169 } 176 }
170 177
171 // Create the browser window. 178 // Create the browser window.
172 const backgroundColor = settings.get('darkMode') ? '#1E1E1E' : settings.get('accentColor'); 179 const backgroundColor = settings.get('darkMode')
180 ? '#1E1E1E'
181 : settings.get('accentColor');
173 182
174 mainWindow = new BrowserWindow({ 183 mainWindow = new BrowserWindow({
175 x: posX, 184 x: posX,
@@ -181,19 +190,20 @@ const createWindow = () => {
181 show: false, 190 show: false,
182 titleBarStyle: isMac ? 'hidden' : '', 191 titleBarStyle: isMac ? 'hidden' : '',
183 frame: isLinux, 192 frame: isLinux,
193 spellcheck: settings.get('enableSpellchecking'),
184 backgroundColor, 194 backgroundColor,
185 webPreferences: { 195 webPreferences: {
186 nodeIntegration: true, 196 nodeIntegration: true,
187 contextIsolation: false, 197 contextIsolation: false,
188 webviewTag: true, 198 webviewTag: true,
189 preload: path.join(__dirname, 'sentry.js'), 199 preload: join(__dirname, 'sentry.js'),
190 enableRemoteModule: true, 200 enableRemoteModule: true,
191 }, 201 },
192 }); 202 });
193 203
194 app.on('web-contents-created', (e, contents) => { 204 app.on('web-contents-created', (e, contents) => {
195 if (contents.getType() === 'webview') { 205 if (contents.getType() === 'webview') {
196 contents.on('new-window', (event) => { 206 contents.on('new-window', event => {
197 event.preventDefault(); 207 event.preventDefault();
198 }); 208 });
199 } 209 }
@@ -242,7 +252,7 @@ const createWindow = () => {
242 252
243 // Windows deep linking handling on app launch 253 // Windows deep linking handling on app launch
244 if (isWindows) { 254 if (isWindows) {
245 onDidLoad((window) => { 255 onDidLoad(window => {
246 const url = process.argv.slice(1); 256 const url = process.argv.slice(1);
247 if (url) { 257 if (url) {
248 handleDeepLink(window, url.toString()); 258 handleDeepLink(window, url.toString());
@@ -251,12 +261,16 @@ const createWindow = () => {
251 } 261 }
252 262
253 // Emitted when the window is closed. 263 // Emitted when the window is closed.
254 mainWindow.on('close', (e) => { 264 mainWindow.on('close', e => {
255 debug('Window: close window'); 265 debug('Window: close window');
256 // Dereference the window object, usually you would store windows 266 // Dereference the window object, usually you would store windows
257 // in an array if your app supports multi windows, this is the time 267 // in an array if your app supports multi windows, this is the time
258 // when you should delete the corresponding element. 268 // when you should delete the corresponding element.
259 if (!willQuitApp && (settings.get('runInBackground') === undefined || settings.get('runInBackground'))) { 269 if (
270 !willQuitApp &&
271 (settings.get('runInBackground') === undefined ||
272 settings.get('runInBackground'))
273 ) {
260 e.preventDefault(); 274 e.preventDefault();
261 if (isWindows) { 275 if (isWindows) {
262 debug('Window: minimize'); 276 debug('Window: minimize');
@@ -315,7 +329,7 @@ const createWindow = () => {
315 329
316 if (isMac) { 330 if (isMac) {
317 // eslint-disable-next-line global-require 331 // eslint-disable-next-line global-require
318 const { default: askFormacOSPermissions } = require('./electron/macOSPermissions'); 332 const { askFormacOSPermissions } = require('./electron/macOSPermissions');
319 setTimeout(() => askFormacOSPermissions(mainWindow), ms('30s')); 333 setTimeout(() => askFormacOSPermissions(mainWindow), ms('30s'));
320 } 334 }
321 335
@@ -351,15 +365,24 @@ const createWindow = () => {
351const argv = require('minimist')(process.argv.slice(1)); 365const argv = require('minimist')(process.argv.slice(1));
352 366
353if (argv['auth-server-whitelist']) { 367if (argv['auth-server-whitelist']) {
354 app.commandLine.appendSwitch('auth-server-whitelist', argv['auth-server-whitelist']); 368 app.commandLine.appendSwitch(
369 'auth-server-whitelist',
370 argv['auth-server-whitelist'],
371 );
355} 372}
356if (argv['auth-negotiate-delegate-whitelist']) { 373if (argv['auth-negotiate-delegate-whitelist']) {
357 app.commandLine.appendSwitch('auth-negotiate-delegate-whitelist', argv['auth-negotiate-delegate-whitelist']); 374 app.commandLine.appendSwitch(
375 'auth-negotiate-delegate-whitelist',
376 argv['auth-negotiate-delegate-whitelist'],
377 );
358} 378}
359 379
360// Disable Chromium's poor MPRIS implementation 380// Disable Chromium's poor MPRIS implementation
361// and apply workaround for https://github.com/electron/electron/pull/26432 381// and apply workaround for https://github.com/electron/electron/pull/26432
362app.commandLine.appendSwitch('disable-features', 'HardwareMediaKeyHandling,MediaSessionService,CrossOriginOpenerPolicy'); 382app.commandLine.appendSwitch(
383 'disable-features',
384 'HardwareMediaKeyHandling,MediaSessionService,CrossOriginOpenerPolicy',
385);
363 386
364// This method will be called when Electron has finished 387// This method will be called when Electron has finished
365// initialization and is ready to create browser windows. 388// initialization and is ready to create browser windows.
@@ -369,26 +392,36 @@ app.on('ready', () => {
369 enforceMacOSAppLocation(); 392 enforceMacOSAppLocation();
370 393
371 // Register App URL 394 // Register App URL
372 app.setAsDefaultProtocolClient('ferdi');
373
374 if (isDevMode) { 395 if (isDevMode) {
375 app.setAsDefaultProtocolClient('ferdi-dev'); 396 app.setAsDefaultProtocolClient('ferdi-dev');
397 } else {
398 app.setAsDefaultProtocolClient('ferdi');
376 } 399 }
377 400
378 if (isWindows) { 401 if (isWindows) {
379 app.setUserTasks([{ 402 app.setUserTasks([
380 program: process.execPath, 403 {
381 arguments: `${isDevMode ? `${__dirname} ` : ''}--reset-window`, 404 program: process.execPath,
382 iconPath: asarPath(path.join(isDevMode ? `${__dirname}../src/` : __dirname, 'assets/images/taskbar/win32/display.ico')), 405 arguments: `${isDevMode ? `${__dirname} ` : ''}--reset-window`,
383 iconIndex: 0, 406 iconPath: asarPath(
384 title: 'Move Ferdi to Current Display', 407 join(
385 description: 'Restore the position and size of Ferdi', 408 isDevMode ? `${__dirname}../src/` : __dirname,
386 }, { 409 'assets/images/taskbar/win32/display.ico',
387 program: process.execPath, 410 ),
388 arguments: `${isDevMode ? `${__dirname} ` : ''}--quit`, 411 ),
389 iconIndex: 0, 412 iconIndex: 0,
390 title: 'Quit Ferdi', 413 title: 'Move Ferdi to Current Display',
391 }]); 414 description: 'Restore the position and size of Ferdi',
415 },
416 {
417 program: process.execPath,
418 arguments: `${isDevMode ? `${__dirname} ` : ''}--quit`,
419 iconIndex: 0,
420 iconPath: null,
421 title: 'Quit Ferdi',
422 description: null,
423 },
424 ]);
392 } 425 }
393 426
394 createWindow(); 427 createWindow();
@@ -420,27 +453,35 @@ ipcMain.on('feature-basic-auth-credentials', (e, { user, password }) => {
420 453
421ipcMain.on('open-browser-window', (e, { url, serviceId }) => { 454ipcMain.on('open-browser-window', (e, { url, serviceId }) => {
422 const serviceSession = session.fromPartition(`persist:service-${serviceId}`); 455 const serviceSession = session.fromPartition(`persist:service-${serviceId}`);
423 const child = new BrowserWindow({ parent: mainWindow, webPreferences: { session: serviceSession } }); 456 const child = new BrowserWindow({
457 parent: mainWindow,
458 webPreferences: { session: serviceSession },
459 });
424 child.show(); 460 child.show();
425 child.loadURL(url); 461 child.loadURL(url);
426 debug('Received open-browser-window', url); 462 debug('Received open-browser-window', url);
427}); 463});
428 464
429ipcMain.on('modifyRequestHeaders', (e, { modifiedRequestHeaders, serviceId }) => { 465ipcMain.on(
430 debug('Received modifyRequestHeaders', modifiedRequestHeaders, serviceId); 466 'modifyRequestHeaders',
431 modifiedRequestHeaders.forEach((headerFilterSet) => { 467 (e, { modifiedRequestHeaders, serviceId }) => {
432 const { headers, requestFilters } = headerFilterSet; 468 debug('Received modifyRequestHeaders', modifiedRequestHeaders, serviceId);
433 session.fromPartition(`persist:service-${serviceId}`).webRequest.onBeforeSendHeaders(requestFilters, (details, callback) => { 469 modifiedRequestHeaders.forEach(headerFilterSet => {
434 for (const key in headers) { 470 const { headers, requestFilters } = headerFilterSet;
435 if (Object.prototype.hasOwnProperty.call(headers, key)) { 471 session
436 const value = headers[key]; 472 .fromPartition(`persist:service-${serviceId}`)
437 details.requestHeaders[key] = value; 473 .webRequest.onBeforeSendHeaders(requestFilters, (details, callback) => {
438 } 474 for (const key in headers) {
439 } 475 if (Object.prototype.hasOwnProperty.call(headers, key)) {
440 callback({ requestHeaders: details.requestHeaders }); 476 const value = headers[key];
477 details.requestHeaders[key] = value;
478 }
479 }
480 callback({ requestHeaders: details.requestHeaders });
481 });
441 }); 482 });
442 }); 483 },
443}); 484);
444 485
445ipcMain.on('feature-basic-auth-cancel', () => { 486ipcMain.on('feature-basic-auth-cancel', () => {
446 debug('Cancel basic auth'); 487 debug('Cancel basic auth');
@@ -449,16 +490,52 @@ ipcMain.on('feature-basic-auth-cancel', () => {
449 authCallback = noop; 490 authCallback = noop;
450}); 491});
451 492
493// Handle synchronous messages from service webviews.
494
495ipcMain.on('find-in-page', (e, text, options) => {
496 const { sender: webContents } = e;
497 if (webContents !== mainWindow.webContents && typeof text === 'string') {
498 const sanitizedOptions = {};
499 for (const option of ['forward', 'findNext', 'matchCase']) {
500 if (option in options) {
501 sanitizedOptions[option] = !!options[option];
502 }
503 }
504 const requestId = webContents.findInPage(text, sanitizedOptions);
505 debug('Find in page', text, options, requestId);
506 e.returnValue = requestId;
507 } else {
508 e.returnValue = null;
509 }
510});
511
512ipcMain.on('stop-find-in-page', (e, action) => {
513 const { sender: webContents } = e;
514 if (webContents !== mainWindow.webContents) {
515 const validActions = [
516 'clearSelection',
517 'keepSelection',
518 'activateSelection',
519 ];
520 if (validActions.includes(action)) {
521 webContents.stopFindInPage(action);
522 }
523 }
524 e.returnValue = null;
525});
526
452// Quit when all windows are closed. 527// Quit when all windows are closed.
453app.on('window-all-closed', () => { 528app.on('window-all-closed', () => {
454 // On OS X it is common for applications and their menu bar 529 // On OS X it is common for applications and their menu bar
455 // to stay active until the user quits explicitly with Cmd + Q 530 // to stay active until the user quits explicitly with Cmd + Q
456 if (settings.get('runInBackground') === undefined 531 if (
457 || settings.get('runInBackground')) { 532 settings.get('runInBackground') === undefined ||
533 settings.get('runInBackground')
534 ) {
458 debug('Window: all windows closed, quit app'); 535 debug('Window: all windows closed, quit app');
459 app.quit(); 536 app.quit();
460 } else { 537 } else {
461 debug('Window: don\'t quit app'); 538 debug("Window: don't quit app");
462 } 539 }
463}); 540});
464 541
@@ -487,7 +564,7 @@ app.on('will-finish-launching', () => {
487 app.on('open-url', (event, url) => { 564 app.on('open-url', (event, url) => {
488 event.preventDefault(); 565 event.preventDefault();
489 566
490 onDidLoad((window) => { 567 onDidLoad(window => {
491 debug('open-url event', url); 568 debug('open-url event', url);
492 handleDeepLink(window, url); 569 handleDeepLink(window, url);
493 }); 570 });
diff --git a/src/internal-server b/src/internal-server
deleted file mode 160000
Subproject 2e15f753b79491df2cad5e436e00c8cf44faf5c
diff --git a/src/internal-server/ace b/src/internal-server/ace
new file mode 100644
index 000000000..42f8f10d1
--- /dev/null
+++ b/src/internal-server/ace
@@ -0,0 +1,21 @@
1'use strict'
2
3/*
4|--------------------------------------------------------------------------
5| Ace Commands
6|--------------------------------------------------------------------------
7|
8| The ace file is just a regular Javascript file but with no extension. You
9| can call `node ace` followed by the command name and it just works.
10|
11| Also you can use `adonis` followed by the command name, since the adonis
12| global proxies all the ace commands.
13|
14*/
15
16const { Ignitor } = require('@adonisjs/ignitor')
17
18new Ignitor(require('@adonisjs/fold'))
19 .appRoot(__dirname)
20 .fireAce()
21 .catch(console.error)
diff --git a/src/internal-server/app/Controllers/Http/RecipeController.js b/src/internal-server/app/Controllers/Http/RecipeController.js
new file mode 100644
index 000000000..8a6b4f684
--- /dev/null
+++ b/src/internal-server/app/Controllers/Http/RecipeController.js
@@ -0,0 +1,120 @@
1const Recipe = use('App/Models/Recipe');
2const Drive = use('Drive');
3const {
4 validateAll,
5} = use('Validator');
6const Env = use('Env');
7
8const fetch = require('node-fetch');
9
10const RECIPES_URL = 'https://api.getferdi.com/v1/recipes';
11
12class RecipeController {
13 // List official and custom recipes
14 async list({
15 response,
16 }) {
17 const officialRecipes = JSON.parse(await (await fetch(RECIPES_URL)).text());
18 const customRecipesArray = (await Recipe.all()).rows;
19 const customRecipes = customRecipesArray.map(recipe => ({
20 id: recipe.recipeId,
21 name: recipe.name,
22 ...JSON.parse(recipe.data),
23 }));
24
25 const recipes = [
26 ...officialRecipes,
27 ...customRecipes,
28 ];
29
30 return response.send(recipes);
31 }
32
33 // Search official and custom recipes
34 async search({
35 request,
36 response,
37 }) {
38 // Validate user input
39 const validation = await validateAll(request.all(), {
40 needle: 'required',
41 });
42 if (validation.fails()) {
43 return response.status(401).send({
44 message: 'Please provide a needle',
45 messages: validation.messages(),
46 status: 401,
47 });
48 }
49
50 const needle = request.input('needle');
51
52 // Get results
53 let results;
54
55 if (needle === 'ferdi:custom') {
56 const dbResults = (await Recipe.all()).toJSON();
57 results = dbResults.map(recipe => ({
58 id: recipe.recipeId,
59 name: recipe.name,
60 ...JSON.parse(recipe.data),
61 }));
62 } else {
63 let remoteResults = [];
64 if (Env.get('CONNECT_WITH_FRANZ') == 'true') { // eslint-disable-line eqeqeq
65 remoteResults = JSON.parse(await (await fetch(`${RECIPES_URL}/search?needle=${encodeURIComponent(needle)}`)).text());
66 }
67 const localResultsArray = (await Recipe.query().where('name', 'LIKE', `%${needle}%`).fetch()).toJSON();
68 const localResults = localResultsArray.map(recipe => ({
69 id: recipe.recipeId,
70 name: recipe.name,
71 ...JSON.parse(recipe.data),
72 }));
73
74 results = [
75 ...localResults,
76 ...remoteResults || [],
77 ];
78 }
79
80 return response.send(results);
81 }
82
83 // Download a recipe
84 async download({
85 response,
86 params,
87 }) {
88 // Validate user input
89 const validation = await validateAll(params, {
90 recipe: 'required|accepted',
91 });
92 if (validation.fails()) {
93 return response.status(401).send({
94 message: 'Please provide a recipe ID',
95 messages: validation.messages(),
96 status: 401,
97 });
98 }
99
100 const service = params.recipe;
101
102 // Check for invalid characters
103 if (/\.{1,}/.test(service) || /\/{1,}/.test(service)) {
104 return response.send('Invalid recipe name');
105 }
106
107 // Check if recipe exists in recipes folder
108 if (await Drive.exists(`${service}.tar.gz`)) {
109 return response.send(await Drive.get(`${service}.tar.gz`));
110 } if (Env.get('CONNECT_WITH_FRANZ') == 'true') { // eslint-disable-line eqeqeq
111 return response.redirect(`${RECIPES_URL}/download/${service}`);
112 }
113 return response.status(400).send({
114 message: 'Recipe not found',
115 code: 'recipe-not-found',
116 });
117 }
118}
119
120module.exports = RecipeController;
diff --git a/src/internal-server/app/Controllers/Http/ServiceController.js b/src/internal-server/app/Controllers/Http/ServiceController.js
new file mode 100644
index 000000000..c76a287f7
--- /dev/null
+++ b/src/internal-server/app/Controllers/Http/ServiceController.js
@@ -0,0 +1,292 @@
1const Service = use('App/Models/Service');
2const { validateAll } = use('Validator');
3const Env = use('Env');
4
5const uuid = require('uuid/v4');
6const path = require('path');
7const fs = require('fs-extra');
8const { LOCAL_HOSTNAME } = require('../../../../config');
9
10const hostname = LOCAL_HOSTNAME;
11const port = Env.get('PORT');
12
13class ServiceController {
14 // Create a new service for user
15 async create({ request, response }) {
16 // Validate user input
17 const validation = await validateAll(request.all(), {
18 name: 'required|string',
19 recipeId: 'required',
20 });
21 if (validation.fails()) {
22 return response.status(401).send({
23 message: 'Invalid POST arguments',
24 messages: validation.messages(),
25 status: 401,
26 });
27 }
28
29 const data = request.all();
30
31 // Get new, unused uuid
32 let serviceId;
33 do {
34 serviceId = uuid();
35 } while (
36 (await Service.query().where('serviceId', serviceId).fetch()).rows
37 .length > 0
38 ); // eslint-disable-line no-await-in-loop
39
40 await Service.create({
41 serviceId,
42 name: data.name,
43 recipeId: data.recipeId,
44 settings: JSON.stringify(data),
45 });
46
47 return response.send({
48 data: {
49 userId: 1,
50 id: serviceId,
51 isEnabled: true,
52 isNotificationEnabled: true,
53 isBadgeEnabled: true,
54 isMuted: false,
55 isDarkModeEnabled: '', // TODO: This should ideally be a boolean (false). But, changing it caused the sidebar toggle to not work.
56 spellcheckerLanguage: '',
57 order: 1,
58 customRecipe: false,
59 hasCustomIcon: false,
60 workspaces: [],
61 iconUrl: null,
62 ...data,
63 },
64 status: ['created'],
65 });
66 }
67
68 // List all services a user has created
69 async list({ response }) {
70 const services = (await Service.all()).rows;
71 // Convert to array with all data Franz wants
72 const servicesArray = services.map(service => {
73 const settings =
74 typeof service.settings === 'string'
75 ? JSON.parse(service.settings)
76 : service.settings;
77
78 return {
79 customRecipe: false,
80 hasCustomIcon: false,
81 isBadgeEnabled: true,
82 isDarkModeEnabled: '', // TODO: This should ideally be a boolean (false). But, changing it caused the sidebar toggle to not work.
83 isEnabled: true,
84 isMuted: false,
85 isNotificationEnabled: true,
86 order: 1,
87 spellcheckerLanguage: '',
88 workspaces: [],
89 ...JSON.parse(service.settings),
90 iconUrl: settings.iconId
91 ? `http://${hostname}:${port}/v1/icon/${settings.iconId}`
92 : null,
93 id: service.serviceId,
94 name: service.name,
95 recipeId: service.recipeId,
96 userId: 1,
97 };
98 });
99
100 return response.send(servicesArray);
101 }
102
103 async edit({ request, response, params }) {
104 if (request.file('icon')) {
105 // Upload custom service icon
106 await fs.ensureDir(path.join(Env.get('USER_PATH'), 'icons'));
107
108 const icon = request.file('icon', {
109 types: ['image'],
110 size: '2mb',
111 });
112 const { id } = params;
113 const service = (await Service.query().where('serviceId', id).fetch())
114 .rows[0];
115 const settings =
116 typeof service.settings === 'string'
117 ? JSON.parse(service.settings)
118 : service.settings;
119
120 // Generate new icon ID
121 let iconId;
122 do {
123 iconId = uuid() + uuid();
124 } while (fs.existsSync(path.join(Env.get('USER_PATH'), 'icons', iconId)));
125
126 await icon.move(path.join(Env.get('USER_PATH'), 'icons'), {
127 name: iconId,
128 overwrite: true,
129 });
130
131 if (!icon.moved()) {
132 return response.status(500).send(icon.error());
133 }
134
135 const newSettings = {
136 ...settings,
137 ...{
138 iconId,
139 customIconVersion:
140 settings && settings.customIconVersion
141 ? settings.customIconVersion + 1
142 : 1,
143 },
144 };
145
146 // Update data in database
147 await Service.query()
148 .where('serviceId', id)
149 .update({
150 name: service.name,
151 settings: JSON.stringify(newSettings),
152 });
153
154 return response.send({
155 data: {
156 id,
157 name: service.name,
158 ...newSettings,
159 iconUrl: `http://${hostname}:${port}/v1/icon/${
160 newSettings.iconId
161 }`,
162 userId: 1,
163 },
164 status: ['updated'],
165 });
166 }
167 // Update service info
168 const data = request.all();
169 const { id } = params;
170
171 // Get current settings from db
172 const serviceData = (await Service.query().where('serviceId', id).fetch())
173 .rows[0];
174
175 const settings = {
176 ...(typeof serviceData.settings === 'string'
177 ? JSON.parse(serviceData.settings)
178 : serviceData.settings),
179 ...data,
180 };
181
182 // Update data in database
183 await Service.query()
184 .where('serviceId', id)
185 .update({
186 name: data.name,
187 settings: JSON.stringify(settings),
188 });
189
190 // Get updated row
191 const service = (await Service.query().where('serviceId', id).fetch())
192 .rows[0];
193
194 return response.send({
195 data: {
196 id,
197 name: service.name,
198 ...settings,
199 iconUrl: `${Env.get('APP_URL')}/v1/icon/${settings.iconId}`,
200 userId: 1,
201 },
202 status: ['updated'],
203 });
204 }
205
206 async icon({ params, response }) {
207 const { id } = params;
208
209 const iconPath = path.join(Env.get('USER_PATH'), 'icons', id);
210 if (!fs.existsSync(iconPath)) {
211 return response.status(404).send({
212 status: "Icon doesn't exist",
213 });
214 }
215
216 return response.download(iconPath);
217 }
218
219 async reorder({ request, response }) {
220 const data = request.all();
221
222 for (const service of Object.keys(data)) {
223 // Get current settings from db
224 const serviceData = (
225 await Service.query() // eslint-disable-line no-await-in-loop
226 .where('serviceId', service)
227 .fetch()
228 ).rows[0];
229
230 const settings = {
231 ...JSON.parse(serviceData.settings),
232 order: data[service],
233 };
234
235 // Update data in database
236 await Service.query() // eslint-disable-line no-await-in-loop
237 .where('serviceId', service)
238 .update({
239 settings: JSON.stringify(settings),
240 });
241 }
242
243 // Get new services
244 const services = (await Service.all()).rows;
245 // Convert to array with all data Franz wants
246 const servicesArray = services.map(service => {
247 const settings =
248 typeof service.settings === 'string'
249 ? JSON.parse(service.settings)
250 : service.settings;
251
252 return {
253 customRecipe: false,
254 hasCustomIcon: false,
255 isBadgeEnabled: true,
256 isDarkModeEnabled: '', // TODO: This should ideally be a boolean (false). But, changing it caused the sidebar toggle to not work.
257 isEnabled: true,
258 isMuted: false,
259 isNotificationEnabled: true,
260 order: 1,
261 spellcheckerLanguage: '',
262 workspaces: [],
263 ...JSON.parse(service.settings),
264 iconUrl: settings.iconId
265 ? `http://${hostname}:${port}/v1/icon/${settings.iconId}`
266 : null,
267 id: service.serviceId,
268 name: service.name,
269 recipeId: service.recipeId,
270 userId: 1,
271 };
272 });
273
274 return response.send(servicesArray);
275 }
276
277 update({ response }) {
278 return response.send([]);
279 }
280
281 async delete({ params, response }) {
282 // Update data in database
283 await Service.query().where('serviceId', params.id).delete();
284
285 return response.send({
286 message: 'Sucessfully deleted service',
287 status: 200,
288 });
289 }
290}
291
292module.exports = ServiceController;
diff --git a/src/internal-server/app/Controllers/Http/StaticController.js b/src/internal-server/app/Controllers/Http/StaticController.js
new file mode 100644
index 000000000..b9a145061
--- /dev/null
+++ b/src/internal-server/app/Controllers/Http/StaticController.js
@@ -0,0 +1,37 @@
1/**
2 * Controller for routes with static responses
3 */
4
5class StaticController {
6 // Enable all features
7 features({
8 response,
9 }) {
10 return response.send({
11 isServiceProxyEnabled: true,
12 isWorkspaceEnabled: true,
13 isAnnouncementsEnabled: true,
14 isSettingsWSEnabled: false,
15 isMagicBarEnabled: true,
16 isTodosEnabled: true,
17 subscribeURL: 'https://getferdi.com',
18 hasInlineCheckout: true,
19 });
20 }
21
22 // Return an empty array
23 emptyArray({
24 response,
25 }) {
26 return response.send([]);
27 }
28
29 // Show announcements
30 announcement({
31 response,
32 }) {
33 return response.send({});
34 }
35}
36
37module.exports = StaticController;
diff --git a/src/internal-server/app/Controllers/Http/UserController.js b/src/internal-server/app/Controllers/Http/UserController.js
new file mode 100644
index 000000000..a3ad736fa
--- /dev/null
+++ b/src/internal-server/app/Controllers/Http/UserController.js
@@ -0,0 +1,370 @@
1const User = use('App/Models/User');
2const Service = use('App/Models/Service');
3const Workspace = use('App/Models/Workspace');
4const {
5 validateAll,
6} = use('Validator');
7
8const btoa = require('btoa');
9const fetch = require('node-fetch');
10const uuid = require('uuid/v4');
11const crypto = require('crypto');
12const { DEFAULT_APP_SETTINGS } = require('../../../../environment');
13
14const apiRequest = (url, route, method, auth) => new Promise((resolve, reject) => {
15 const base = `${url}/v1/`;
16 const user = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Ferdi/5.3.0-beta.1 Chrome/69.0.3497.128 Electron/4.2.4 Safari/537.36';
17
18 try {
19 fetch(base + route, {
20 method,
21 headers: {
22 Authorization: `Bearer ${auth}`,
23 'User-Agent': user,
24 },
25 })
26 .then(data => data.json())
27 .then(json => resolve(json));
28 } catch (e) {
29 reject();
30 }
31});
32
33class UserController {
34 // Register a new user
35 async signup({
36 request,
37 response,
38 }) {
39 // Validate user input
40 const validation = await validateAll(request.all(), {
41 firstname: 'required',
42 email: 'required|email',
43 password: 'required',
44 });
45 if (validation.fails()) {
46 return response.status(401).send({
47 message: 'Invalid POST arguments',
48 messages: validation.messages(),
49 status: 401,
50 });
51 }
52
53 return response.send({
54 message: 'Successfully created account',
55 token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJGZXJkaSBJbnRlcm5hbCBTZXJ2ZXIiLCJpYXQiOjE1NzEwNDAyMTUsImV4cCI6MjUzMzk1NDE3ODQ0LCJhdWQiOiJnZXRmZXJkaS5jb20iLCJzdWIiOiJmZXJkaUBsb2NhbGhvc3QiLCJ1c2VySWQiOiIxIn0.9_TWFGp6HROv8Yg82Rt6i1-95jqWym40a-HmgrdMC6M',
56 });
57 }
58
59 // Login using an existing user
60 async login({
61 request,
62 response,
63 }) {
64 if (!request.header('Authorization')) {
65 return response.status(401).send({
66 message: 'Please provide authorization',
67 status: 401,
68 });
69 }
70
71 return response.send({
72 message: 'Successfully logged in',
73 token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJGZXJkaSBJbnRlcm5hbCBTZXJ2ZXIiLCJpYXQiOjE1NzEwNDAyMTUsImV4cCI6MjUzMzk1NDE3ODQ0LCJhdWQiOiJnZXRmZXJkaS5jb20iLCJzdWIiOiJmZXJkaUBsb2NhbGhvc3QiLCJ1c2VySWQiOiIxIn0.9_TWFGp6HROv8Yg82Rt6i1-95jqWym40a-HmgrdMC6M',
74 });
75 }
76
77 // Return information about the current user
78 async me({
79 response,
80 }) {
81 const user = await User.find(1);
82
83 const settings = typeof user.settings === 'string' ? JSON.parse(user.settings) : user.settings;
84
85 return response.send({
86 accountType: 'individual',
87 beta: false,
88 donor: {},
89 email: '',
90 emailValidated: true,
91 features: {},
92 firstname: 'Ferdi',
93 id: '82c1cf9d-ab58-4da2-b55e-aaa41d2142d8',
94 isSubscriptionOwner: true,
95 lastname: 'Application',
96 locale: DEFAULT_APP_SETTINGS.fallbackLocale,
97 ...settings || {},
98 });
99 }
100
101 async updateMe({
102 request,
103 response,
104 }) {
105 const user = await User.find(1);
106
107 let settings = user.settings || {};
108 if (typeof settings === 'string') {
109 settings = JSON.parse(settings);
110 }
111
112 const newSettings = {
113 ...settings,
114 ...request.all(),
115 };
116
117 user.settings = JSON.stringify(newSettings);
118 await user.save();
119
120 return response.send({
121 data: {
122 accountType: 'individual',
123 beta: false,
124 donor: {},
125 email: '',
126 emailValidated: true,
127 features: {},
128 firstname: 'Ferdi',
129 id: '82c1cf9d-ab58-4da2-b55e-aaa41d2142d8',
130 isSubscriptionOwner: true,
131 lastname: 'Application',
132 locale: DEFAULT_APP_SETTINGS.fallbackLocale,
133 ...newSettings,
134 },
135 status: [
136 'data-updated',
137 ],
138 });
139 }
140
141 async import({
142 request,
143 response,
144 }) {
145 // Validate user input
146 const validation = await validateAll(request.all(), {
147 email: 'required|email',
148 password: 'required',
149 server: 'required',
150 });
151 if (validation.fails()) {
152 let errorMessage = 'There was an error while trying to import your account:\n';
153 for (const message of validation.messages()) {
154 if (message.validation === 'required') {
155 errorMessage += `- Please make sure to supply your ${message.field}\n`;
156 } else if (message.validation === 'unique') {
157 errorMessage += '- There is already a user with this email.\n';
158 } else {
159 errorMessage += `${message.message}\n`;
160 }
161 }
162 return response.status(401).send(errorMessage);
163 }
164
165 const {
166 email,
167 password,
168 server,
169 } = request.all();
170
171 const hashedPassword = crypto.createHash('sha256').update(password).digest('base64');
172
173 const base = `${server}/v1/`;
174 const userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Ferdi/5.3.0-beta.1 Chrome/69.0.3497.128 Electron/4.2.4 Safari/537.36';
175
176 // Try to get an authentication token
177 let token;
178 try {
179 const basicToken = btoa(`${email}:${hashedPassword}`);
180
181 const rawResponse = await fetch(`${base}auth/login`, {
182 method: 'POST',
183 headers: {
184 Authorization: `Basic ${basicToken}`,
185 'User-Agent': userAgent,
186 },
187 });
188 const content = await rawResponse.json();
189
190 if (!content.message || content.message !== 'Successfully logged in') {
191 const errorMessage = 'Could not login into Franz with your supplied credentials. Please check and try again';
192 return response.status(401).send(errorMessage);
193 }
194
195 // eslint-disable-next-line prefer-destructuring
196 token = content.token;
197 } catch (e) {
198 return response.status(401).send({
199 message: 'Cannot login to Franz',
200 error: e,
201 });
202 }
203
204 // Get user information
205 let userInf = false;
206 try {
207 userInf = await apiRequest(server, 'me', 'GET', token);
208 } catch (e) {
209 const errorMessage = `Could not get your user info from Franz. Please check your credentials or try again later.\nError: ${e}`;
210 return response.status(401).send(errorMessage);
211 }
212 if (!userInf) {
213 const errorMessage = 'Could not get your user info from Franz. Please check your credentials or try again later';
214 return response.status(401).send(errorMessage);
215 }
216
217 const serviceIdTranslation = {};
218
219 // Import services
220 try {
221 const services = await apiRequest(server, 'me/services', 'GET', token);
222
223 for (const service of services) {
224 // Get new, unused uuid
225 let serviceId;
226 do {
227 serviceId = uuid();
228 } while ((await Service.query().where('serviceId', serviceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop
229
230 await Service.create({ // eslint-disable-line no-await-in-loop
231 serviceId,
232 name: service.name,
233 recipeId: service.recipeId,
234 settings: JSON.stringify(service),
235 });
236
237 serviceIdTranslation[service.id] = serviceId;
238 }
239 } catch (e) {
240 const errorMessage = `Could not import your services into our system.\nError: ${e}`;
241 return response.status(401).send(errorMessage);
242 }
243
244 // Import workspaces
245 try {
246 const workspaces = await apiRequest(server, 'workspace', 'GET', token);
247
248 for (const workspace of workspaces) {
249 let workspaceId;
250 do {
251 workspaceId = uuid();
252 } while ((await Workspace.query().where('workspaceId', workspaceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop
253
254 const services = workspace.services.map(service => serviceIdTranslation[service]);
255
256 await Workspace.create({ // eslint-disable-line no-await-in-loop
257 workspaceId,
258 name: workspace.name,
259 order: workspace.order,
260 services: JSON.stringify(services),
261 data: JSON.stringify({}),
262 });
263 }
264 } catch (e) {
265 const errorMessage = `Could not import your workspaces into our system.\nError: ${e}`;
266 return response.status(401).send(errorMessage);
267 }
268
269 return response.send('Your account has been imported. You can now use your Franz account in Ferdi.');
270 }
271
272 // Account import/export
273 async export({
274 // eslint-disable-next-line no-unused-vars
275 auth,
276 response,
277 }) {
278 const services = (await Service.all()).toJSON();
279 const workspaces = (await Workspace.all()).toJSON();
280
281 const exportData = {
282 username: 'Ferdi',
283 mail: 'internal@getferdi.com',
284 services,
285 workspaces,
286 };
287
288 return response
289 .header('Content-Type', 'application/force-download')
290 .header('Content-disposition', 'attachment; filename=export.ferdi-data')
291 .send(exportData);
292 }
293
294 async importFerdi({
295 request,
296 response,
297 }) {
298 const validation = await validateAll(request.all(), {
299 file: 'required',
300 });
301 if (validation.fails()) {
302 return response.send(validation.messages());
303 }
304
305 let file;
306 try {
307 file = JSON.parse(request.input('file'));
308 } catch (e) {
309 return response.send('Could not import: Invalid file, could not read file');
310 }
311
312 if (!file || !file.services || !file.workspaces) {
313 return response.send('Could not import: Invalid file (2)');
314 }
315
316 const serviceIdTranslation = {};
317
318 // Import services
319 try {
320 for (const service of file.services) {
321 // Get new, unused uuid
322 let serviceId;
323 do {
324 serviceId = uuid();
325 } while ((await Service.query().where('serviceId', serviceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop
326
327 await Service.create({ // eslint-disable-line no-await-in-loop
328 serviceId,
329 name: service.name,
330 recipeId: service.recipeId,
331 settings: JSON.stringify(service.settings),
332 });
333
334 serviceIdTranslation[service.id] = serviceId;
335 }
336 } catch (e) {
337 const errorMessage = `Could not import your services into our system.\nError: ${e}`;
338 return response.send(errorMessage);
339 }
340
341 // Import workspaces
342 try {
343 for (const workspace of file.workspaces) {
344 let workspaceId;
345 do {
346 workspaceId = uuid();
347 } while ((await Workspace.query().where('workspaceId', workspaceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop
348
349 const services = (workspace.services && typeof (workspace.services) === 'object') ?
350 workspace.services.map((service) => serviceIdTranslation[service]) :
351 [];
352
353 await Workspace.create({ // eslint-disable-line no-await-in-loop
354 workspaceId,
355 name: workspace.name,
356 order: workspace.order,
357 services: JSON.stringify(services),
358 data: JSON.stringify(workspace.data),
359 });
360 }
361 } catch (e) {
362 const errorMessage = `Could not import your workspaces into our system.\nError: ${e}`;
363 return response.status(401).send(errorMessage);
364 }
365
366 return response.send('Your account has been imported.');
367 }
368}
369
370module.exports = UserController;
diff --git a/src/internal-server/app/Controllers/Http/WorkspaceController.js b/src/internal-server/app/Controllers/Http/WorkspaceController.js
new file mode 100644
index 000000000..4189fbcdd
--- /dev/null
+++ b/src/internal-server/app/Controllers/Http/WorkspaceController.js
@@ -0,0 +1,148 @@
1const Workspace = use('App/Models/Workspace');
2const {
3 validateAll,
4} = use('Validator');
5
6const uuid = require('uuid/v4');
7
8class WorkspaceController {
9 // Create a new workspace for user
10 async create({
11 request,
12 response,
13 }) {
14 // Validate user input
15 const validation = await validateAll(request.all(), {
16 name: 'required',
17 });
18 if (validation.fails()) {
19 return response.status(401).send({
20 message: 'Invalid POST arguments',
21 messages: validation.messages(),
22 status: 401,
23 });
24 }
25
26 const data = request.all();
27
28 // Get new, unused uuid
29 let workspaceId;
30 do {
31 workspaceId = uuid();
32 } while ((await Workspace.query().where('workspaceId', workspaceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop
33
34 const order = (await Workspace.all()).rows.length;
35
36 await Workspace.create({
37 workspaceId,
38 name: data.name,
39 order,
40 services: JSON.stringify([]),
41 data: JSON.stringify(data),
42 });
43
44 return response.send({
45 userId: 1,
46 name: data.name,
47 id: workspaceId,
48 order,
49 workspaces: [],
50 });
51 }
52
53 async edit({
54 request,
55 response,
56 params,
57 }) {
58 // Validate user input
59 const validation = await validateAll(request.all(), {
60 name: 'required',
61 services: 'required|array',
62 });
63 if (validation.fails()) {
64 return response.status(401).send({
65 message: 'Invalid POST arguments',
66 messages: validation.messages(),
67 status: 401,
68 });
69 }
70
71 const data = request.all();
72 const {
73 id,
74 } = params;
75
76 // Update data in database
77 await (Workspace.query()
78 .where('workspaceId', id)).update({
79 name: data.name,
80 services: JSON.stringify(data.services),
81 });
82
83 // Get updated row
84 const workspace = (await Workspace.query()
85 .where('workspaceId', id).fetch()).rows[0];
86
87 return response.send({
88 id: workspace.workspaceId,
89 name: data.name,
90 order: workspace.order,
91 services: data.services,
92 userId: 1,
93 });
94 }
95
96 async delete({
97 // eslint-disable-next-line no-unused-vars
98 request,
99 response,
100 params,
101 }) {
102 // Validate user input
103 const validation = await validateAll(params, {
104 id: 'required',
105 });
106 if (validation.fails()) {
107 return response.status(401).send({
108 message: 'Invalid arguments',
109 messages: validation.messages(),
110 status: 401,
111 });
112 }
113
114 const {
115 id,
116 } = params;
117
118 // Update data in database
119 await (Workspace.query()
120 .where('workspaceId', id)).delete();
121
122 return response.send({
123 message: 'Successfully deleted workspace',
124 });
125 }
126
127 // List all workspaces a user has created
128 async list({
129 response,
130 }) {
131 const workspaces = (await Workspace.all()).rows;
132 // Convert to array with all data Franz wants
133 let workspacesArray = [];
134 if (workspaces) {
135 workspacesArray = workspaces.map(workspace => ({
136 id: workspace.workspaceId,
137 name: workspace.name,
138 order: workspace.order,
139 services: typeof workspace.services === 'string' ? JSON.parse(workspace.services) : workspace.services,
140 userId: 1,
141 }));
142 }
143
144 return response.send(workspacesArray);
145 }
146}
147
148module.exports = WorkspaceController;
diff --git a/src/internal-server/app/Exceptions/Handler.js b/src/internal-server/app/Exceptions/Handler.js
new file mode 100644
index 000000000..ab323fd38
--- /dev/null
+++ b/src/internal-server/app/Exceptions/Handler.js
@@ -0,0 +1,40 @@
1const BaseExceptionHandler = use('BaseExceptionHandler');
2
3/**
4 * This class handles all exceptions thrown during
5 * the HTTP request lifecycle.
6 *
7 * @class ExceptionHandler
8 */
9class ExceptionHandler extends BaseExceptionHandler {
10 /**
11 * Handle exception thrown during the HTTP lifecycle
12 *
13 * @method handle
14 *
15 * @param {Object} error
16 * @param {object} options.response
17 *
18 * @return {Promise<void>}
19 */
20 async handle(error, { response }) {
21 if (error.name === 'ValidationException') {
22 return response.status(400).send('Invalid arguments');
23 }
24
25 return response.status(error.status).send(error.message);
26 }
27
28 /**
29 * Report exception for logging or debugging.
30 *
31 * @method report
32 *
33 * @return {Promise<boolean>}
34 */
35 async report() {
36 return true;
37 }
38}
39
40module.exports = ExceptionHandler;
diff --git a/src/internal-server/app/Middleware/ConvertEmptyStringsToNull.js b/src/internal-server/app/Middleware/ConvertEmptyStringsToNull.js
new file mode 100644
index 000000000..87f1f6c25
--- /dev/null
+++ b/src/internal-server/app/Middleware/ConvertEmptyStringsToNull.js
@@ -0,0 +1,15 @@
1class ConvertEmptyStringsToNull {
2 async handle({ request }, next) {
3 if (Object.keys(request.body).length) {
4 request.body = Object.assign(
5 ...Object.keys(request.body).map(key => ({
6 [key]: request.body[key] !== '' ? request.body[key] : null,
7 })),
8 );
9 }
10
11 await next();
12 }
13}
14
15module.exports = ConvertEmptyStringsToNull;
diff --git a/src/internal-server/app/Models/Recipe.js b/src/internal-server/app/Models/Recipe.js
new file mode 100644
index 000000000..bd9741114
--- /dev/null
+++ b/src/internal-server/app/Models/Recipe.js
@@ -0,0 +1,7 @@
1/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */
2const Model = use('Model');
3
4class Recipe extends Model {
5}
6
7module.exports = Recipe;
diff --git a/src/internal-server/app/Models/Service.js b/src/internal-server/app/Models/Service.js
new file mode 100644
index 000000000..a2e5c981e
--- /dev/null
+++ b/src/internal-server/app/Models/Service.js
@@ -0,0 +1,7 @@
1/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */
2const Model = use('Model');
3
4class Service extends Model {
5}
6
7module.exports = Service;
diff --git a/src/internal-server/app/Models/Token.js b/src/internal-server/app/Models/Token.js
new file mode 100644
index 000000000..83e989117
--- /dev/null
+++ b/src/internal-server/app/Models/Token.js
@@ -0,0 +1,7 @@
1/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */
2const Model = use('Model');
3
4class Token extends Model {
5}
6
7module.exports = Token;
diff --git a/src/internal-server/app/Models/Traits/NoTimestamp.js b/src/internal-server/app/Models/Traits/NoTimestamp.js
new file mode 100644
index 000000000..914f542f0
--- /dev/null
+++ b/src/internal-server/app/Models/Traits/NoTimestamp.js
@@ -0,0 +1,14 @@
1class NoTimestamp {
2 register(Model) {
3 Object.defineProperties(Model, {
4 createdAtColumn: {
5 get: () => null,
6 },
7 updatedAtColumn: {
8 get: () => null,
9 },
10 });
11 }
12}
13
14module.exports = NoTimestamp;
diff --git a/src/internal-server/app/Models/User.js b/src/internal-server/app/Models/User.js
new file mode 100644
index 000000000..907710d8d
--- /dev/null
+++ b/src/internal-server/app/Models/User.js
@@ -0,0 +1,8 @@
1// File is required by AdonisJS but not used by the server
2/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */
3const Model = use('Model');
4
5class User extends Model {
6}
7
8module.exports = User;
diff --git a/src/internal-server/app/Models/Workspace.js b/src/internal-server/app/Models/Workspace.js
new file mode 100644
index 000000000..dcf39ac75
--- /dev/null
+++ b/src/internal-server/app/Models/Workspace.js
@@ -0,0 +1,7 @@
1/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */
2const Model = use('Model');
3
4class Workspace extends Model {
5}
6
7module.exports = Workspace;
diff --git a/src/internal-server/config/app.js b/src/internal-server/config/app.js
new file mode 100644
index 000000000..0a1644932
--- /dev/null
+++ b/src/internal-server/config/app.js
@@ -0,0 +1,240 @@
1/** @type {import('@adonisjs/framework/src/Env')} */
2const Env = use('Env');
3
4module.exports = {
5
6 /*
7 |--------------------------------------------------------------------------
8 | Application Name
9 |--------------------------------------------------------------------------
10 |
11 | This value is the name of your application and can used when you
12 | need to place the application's name in a email, view or
13 | other location.
14 |
15 */
16
17 name: Env.get('APP_NAME', 'Ferdi Internal Server'),
18
19 /*
20 |--------------------------------------------------------------------------
21 | App Key
22 |--------------------------------------------------------------------------
23 |
24 | App key is a randomly generated 16 or 32 characters long string required
25 | to encrypt cookies, sessions and other sensitive data.
26 |
27 */
28 appKey: Env.getOrFail('APP_KEY'),
29
30 http: {
31 /*
32 |--------------------------------------------------------------------------
33 | Allow Method Spoofing
34 |--------------------------------------------------------------------------
35 |
36 | Method spoofing allows to make requests by spoofing the http verb.
37 | Which means you can make a GET request but instruct the server to
38 | treat as a POST or PUT request. If you want this feature, set the
39 | below value to true.
40 |
41 */
42 allowMethodSpoofing: true,
43
44 /*
45 |--------------------------------------------------------------------------
46 | Trust Proxy
47 |--------------------------------------------------------------------------
48 |
49 | Trust proxy defines whether X-Forwarded-* headers should be trusted or not.
50 | When your application is behind a proxy server like nginx, these values
51 | are set automatically and should be trusted. Apart from setting it
52 | to true or false Adonis supports handful or ways to allow proxy
53 | values. Read documentation for that.
54 |
55 */
56 trustProxy: false,
57
58 /*
59 |--------------------------------------------------------------------------
60 | Subdomains
61 |--------------------------------------------------------------------------
62 |
63 | Offset to be used for returning subdomains for a given request.For
64 | majority of applications it will be 2, until you have nested
65 | sudomains.
66 | cheatsheet.adonisjs.com - offset - 2
67 | virk.cheatsheet.adonisjs.com - offset - 3
68 |
69 */
70 subdomainOffset: 2,
71
72 /*
73 |--------------------------------------------------------------------------
74 | JSONP Callback
75 |--------------------------------------------------------------------------
76 |
77 | Default jsonp callback to be used when callback query string is missing
78 | in request url.
79 |
80 */
81 jsonpCallback: 'callback',
82
83 /*
84 |--------------------------------------------------------------------------
85 | Etag
86 |--------------------------------------------------------------------------
87 |
88 | Set etag on all HTTP response. In order to disable for selected routes,
89 | you can call the `response.send` with an options object as follows.
90 |
91 | response.send('Hello', { ignoreEtag: true })
92 |
93 */
94 etag: false,
95 },
96
97 views: {
98 /*
99 |--------------------------------------------------------------------------
100 | Cache Views
101 |--------------------------------------------------------------------------
102 |
103 | Define whether or not to cache the compiled view. Set it to true in
104 | production to optimize view loading time.
105 |
106 */
107 cache: Env.get('CACHE_VIEWS', true),
108 },
109
110 static: {
111 /*
112 |--------------------------------------------------------------------------
113 | Dot Files
114 |--------------------------------------------------------------------------
115 |
116 | Define how to treat dot files when trying to server static resources.
117 | By default it is set to ignore, which will pretend that dotfiles
118 | does not exists.
119 |
120 | Can be one of the following
121 | ignore, deny, allow
122 |
123 */
124 dotfiles: 'ignore',
125
126 /*
127 |--------------------------------------------------------------------------
128 | ETag
129 |--------------------------------------------------------------------------
130 |
131 | Enable or disable etag generation
132 |
133 */
134 etag: true,
135
136 /*
137 |--------------------------------------------------------------------------
138 | Extensions
139 |--------------------------------------------------------------------------
140 |
141 | Set file extension fallbacks. When set, if a file is not found, the given
142 | extensions will be added to the file name and search for. The first
143 | that exists will be served. Example: ['html', 'htm'].
144 |
145 */
146 extensions: false,
147 },
148
149 locales: {
150 /*
151 |--------------------------------------------------------------------------
152 | Loader
153 |--------------------------------------------------------------------------
154 |
155 | The loader to be used for fetching and updating locales. Below is the
156 | list of available options.
157 |
158 | file, database
159 |
160 */
161 loader: 'file',
162
163 /*
164 |--------------------------------------------------------------------------
165 | Default Locale
166 |--------------------------------------------------------------------------
167 |
168 | Default locale to be used by Antl provider. You can always switch drivers
169 | in runtime or use the official Antl middleware to detect the driver
170 | based on HTTP headers/query string.
171 |
172 */
173 locale: 'en',
174 },
175
176 logger: {
177 /*
178 |--------------------------------------------------------------------------
179 | Transport
180 |--------------------------------------------------------------------------
181 |
182 | Transport to be used for logging messages. You can have multiple
183 | transports using same driver.
184 |
185 | Available drivers are: `file` and `console`.
186 |
187 */
188 transport: 'console',
189
190 /*
191 |--------------------------------------------------------------------------
192 | Console Transport
193 |--------------------------------------------------------------------------
194 |
195 | Using `console` driver for logging. This driver writes to `stdout`
196 | and `stderr`
197 |
198 */
199 console: {
200 driver: 'console',
201 name: 'adonis-app',
202 level: 'info',
203 },
204
205 /*
206 |--------------------------------------------------------------------------
207 | File Transport
208 |--------------------------------------------------------------------------
209 |
210 | File transport uses file driver and writes log messages for a given
211 | file inside `tmp` directory for your app.
212 |
213 | For a different directory, set an absolute path for the filename.
214 |
215 */
216 file: {
217 driver: 'file',
218 name: 'adonis-app',
219 filename: 'adonis.log',
220 level: 'info',
221 },
222 },
223
224 /*
225 |--------------------------------------------------------------------------
226 | Generic Cookie Options
227 |--------------------------------------------------------------------------
228 |
229 | The following cookie options are generic settings used by AdonisJs to create
230 | cookies. However, some parts of the application like `sessions` can have
231 | separate settings for cookies inside `config/session.js`.
232 |
233 */
234 cookie: {
235 httpOnly: true,
236 sameSite: false,
237 path: '/',
238 maxAge: 7200,
239 },
240};
diff --git a/src/internal-server/config/auth.js b/src/internal-server/config/auth.js
new file mode 100644
index 000000000..adb38126a
--- /dev/null
+++ b/src/internal-server/config/auth.js
@@ -0,0 +1,92 @@
1/** @type {import('@adonisjs/framework/src/Env')} */
2const Env = use('Env');
3
4module.exports = {
5 /*
6 |--------------------------------------------------------------------------
7 | Authenticator
8 |--------------------------------------------------------------------------
9 |
10 | Authentication is a combination of serializer and scheme with extra
11 | config to define on how to authenticate a user.
12 |
13 | Available Schemes - basic, session, jwt, api
14 | Available Serializers - lucid, database
15 |
16 */
17 authenticator: 'jwt',
18
19 /*
20 |--------------------------------------------------------------------------
21 | Session
22 |--------------------------------------------------------------------------
23 |
24 | Session authenticator makes use of sessions to authenticate a user.
25 | Session authentication is always persistent.
26 |
27 */
28 session: {
29 serializer: 'lucid',
30 model: 'App/Models/User',
31 scheme: 'session',
32 uid: 'email',
33 password: 'password',
34 },
35
36 /*
37 |--------------------------------------------------------------------------
38 | Basic Auth
39 |--------------------------------------------------------------------------
40 |
41 | The basic auth authenticator uses basic auth header to authenticate a
42 | user.
43 |
44 | NOTE:
45 | This scheme is not persistent and users are supposed to pass
46 | login credentials on each request.
47 |
48 */
49 basic: {
50 serializer: 'lucid',
51 model: 'App/Models/User',
52 scheme: 'basic',
53 uid: 'email',
54 password: 'password',
55 },
56
57 /*
58 |--------------------------------------------------------------------------
59 | Jwt
60 |--------------------------------------------------------------------------
61 |
62 | The jwt authenticator works by passing a jwt token on each HTTP request
63 | via HTTP `Authorization` header.
64 |
65 */
66 jwt: {
67 serializer: 'lucid',
68 model: 'App/Models/User',
69 scheme: 'jwt',
70 uid: 'email',
71 password: 'password',
72 options: {
73 secret: Env.get('APP_KEY'),
74 },
75 },
76
77 /*
78 |--------------------------------------------------------------------------
79 | Api
80 |--------------------------------------------------------------------------
81 |
82 | The Api scheme makes use of API personal tokens to authenticate a user.
83 |
84 */
85 api: {
86 serializer: 'lucid',
87 model: 'App/Models/User',
88 scheme: 'api',
89 uid: 'email',
90 password: 'password',
91 },
92};
diff --git a/src/internal-server/config/bodyParser.js b/src/internal-server/config/bodyParser.js
new file mode 100644
index 000000000..8a5406f9e
--- /dev/null
+++ b/src/internal-server/config/bodyParser.js
@@ -0,0 +1,155 @@
1module.exports = {
2 /*
3 |--------------------------------------------------------------------------
4 | JSON Parser
5 |--------------------------------------------------------------------------
6 |
7 | Below settings are applied when the request body contains a JSON payload.
8 | If you want body parser to ignore JSON payloads, then simply set `types`
9 | to an empty array.
10 */
11 json: {
12 /*
13 |--------------------------------------------------------------------------
14 | limit
15 |--------------------------------------------------------------------------
16 |
17 | Defines the limit of JSON that can be sent by the client. If payload
18 | is over 1mb it will not be processed.
19 |
20 */
21 limit: '50mb',
22
23 /*
24 |--------------------------------------------------------------------------
25 | strict
26 |--------------------------------------------------------------------------
27 |
28 | When `strict` is set to true, body parser will only parse Arrays and
29 | Object. Otherwise everything parseable by `JSON.parse` is parsed.
30 |
31 */
32 strict: true,
33
34 /*
35 |--------------------------------------------------------------------------
36 | types
37 |--------------------------------------------------------------------------
38 |
39 | Which content types are processed as JSON payloads. You are free to
40 | add your own types here, but the request body should be parseable
41 | by `JSON.parse` method.
42 |
43 */
44 types: [
45 'application/json',
46 'application/json-patch+json',
47 'application/vnd.api+json',
48 'application/csp-report',
49 ],
50 },
51
52 /*
53 |--------------------------------------------------------------------------
54 | Raw Parser
55 |--------------------------------------------------------------------------
56 |
57 |
58 |
59 */
60 raw: {
61 types: [
62 'text/*',
63 ],
64 },
65
66 /*
67 |--------------------------------------------------------------------------
68 | Form Parser
69 |--------------------------------------------------------------------------
70 |
71 |
72 |
73 */
74 form: {
75 types: [
76 'application/x-www-form-urlencoded',
77 ],
78 },
79
80 /*
81 |--------------------------------------------------------------------------
82 | Files Parser
83 |--------------------------------------------------------------------------
84 |
85 |
86 |
87 */
88 files: {
89 types: [
90 'multipart/form-data',
91 ],
92
93 /*
94 |--------------------------------------------------------------------------
95 | Max Size
96 |--------------------------------------------------------------------------
97 |
98 | Below value is the max size of all the files uploaded to the server. It
99 | is validated even before files have been processed and hard exception
100 | is thrown.
101 |
102 | Consider setting a reasonable value here, otherwise people may upload GB's
103 | of files which will keep your server busy.
104 |
105 | Also this value is considered when `autoProcess` is set to true.
106 |
107 */
108 maxSize: '20mb',
109
110 /*
111 |--------------------------------------------------------------------------
112 | Auto Process
113 |--------------------------------------------------------------------------
114 |
115 | Whether or not to auto-process files. Since HTTP servers handle files via
116 | couple of specific endpoints. It is better to set this value off and
117 | manually process the files when required.
118 |
119 | This value can contain a boolean or an array of route patterns
120 | to be autoprocessed.
121 */
122 autoProcess: true,
123
124 /*
125 |--------------------------------------------------------------------------
126 | Process Manually
127 |--------------------------------------------------------------------------
128 |
129 | The list of routes that should not process files and instead rely on
130 | manual process. This list should only contain routes when autoProcess
131 | is to true. Otherwise everything is processed manually.
132 |
133 */
134 processManually: [],
135
136 /*
137 |--------------------------------------------------------------------------
138 | Temporary file name
139 |--------------------------------------------------------------------------
140 |
141 | Define a function, which should return a string to be used as the
142 | tmp file name.
143 |
144 | If not defined, Bodyparser will use `uuid` as the tmp file name.
145 |
146 | To be defined as. If you are defining the function, then do make sure
147 | to return a value from it.
148 |
149 | tmpFileName () {
150 | return 'some-unique-value'
151 | }
152 |
153 */
154 },
155};
diff --git a/src/internal-server/config/cors.js b/src/internal-server/config/cors.js
new file mode 100644
index 000000000..ca57dff0d
--- /dev/null
+++ b/src/internal-server/config/cors.js
@@ -0,0 +1,85 @@
1module.exports = {
2 /*
3 |--------------------------------------------------------------------------
4 | Origin
5 |--------------------------------------------------------------------------
6 |
7 | Set a list of origins to be allowed. The value can be one of the following
8 |
9 | Boolean: true - Allow current request origin
10 | Boolean: false - Disallow all
11 | String - Comma separated list of allowed origins
12 | Array - An array of allowed origins
13 | String: * - A wildcard to allow current request origin
14 | Function - Receives the current origin and should return one of the above values.
15 |
16 */
17 origin: false,
18
19 /*
20 |--------------------------------------------------------------------------
21 | Methods
22 |--------------------------------------------------------------------------
23 |
24 | HTTP methods to be allowed. The value can be one of the following
25 |
26 | String - Comma separated list of allowed methods
27 | Array - An array of allowed methods
28 |
29 */
30 methods: ['GET', 'PUT', 'PATCH', 'POST', 'DELETE'],
31
32 /*
33 |--------------------------------------------------------------------------
34 | Headers
35 |--------------------------------------------------------------------------
36 |
37 | List of headers to be allowed via Access-Control-Request-Headers header.
38 | The value can be one of the following.
39 |
40 | Boolean: true - Allow current request headers
41 | Boolean: false - Disallow all
42 | String - Comma separated list of allowed headers
43 | Array - An array of allowed headers
44 | String: * - A wildcard to allow current request headers
45 | Function - Receives the current header and should return one of the above values.
46 |
47 */
48 headers: true,
49
50 /*
51 |--------------------------------------------------------------------------
52 | Expose Headers
53 |--------------------------------------------------------------------------
54 |
55 | A list of headers to be exposed via `Access-Control-Expose-Headers`
56 | header. The value can be one of the following.
57 |
58 | Boolean: false - Disallow all
59 | String: Comma separated list of allowed headers
60 | Array - An array of allowed headers
61 |
62 */
63 exposeHeaders: false,
64
65 /*
66 |--------------------------------------------------------------------------
67 | Credentials
68 |--------------------------------------------------------------------------
69 |
70 | Define Access-Control-Allow-Credentials header. It should always be a
71 | boolean.
72 |
73 */
74 credentials: false,
75
76 /*
77 |--------------------------------------------------------------------------
78 | MaxAge
79 |--------------------------------------------------------------------------
80 |
81 | Define Access-Control-Allow-Max-Age
82 |
83 */
84 maxAge: 90,
85};
diff --git a/src/internal-server/config/database.js b/src/internal-server/config/database.js
new file mode 100644
index 000000000..1b5974359
--- /dev/null
+++ b/src/internal-server/config/database.js
@@ -0,0 +1,82 @@
1/** @type {import('@adonisjs/framework/src/Env')} */
2const Env = use('Env');
3
4const dbPath = process.env.DB_PATH;
5
6module.exports = {
7 /*
8 |--------------------------------------------------------------------------
9 | Default Connection
10 |--------------------------------------------------------------------------
11 |
12 | Connection defines the default connection settings to be used while
13 | interacting with SQL databases.
14 |
15 */
16 connection: Env.get('DB_CONNECTION', 'sqlite'),
17
18 /*
19 |--------------------------------------------------------------------------
20 | Sqlite
21 |--------------------------------------------------------------------------
22 |
23 | Sqlite is a flat file database and can be a good choice for a development
24 | environment.
25 |
26 | npm i --save sqlite3
27 |
28 */
29 sqlite: {
30 client: 'sqlite3',
31 connection: {
32 // filename: Helpers.databasePath(`${Env.get('DB_DATABASE', 'development')}.sqlite`),
33 filename: dbPath,
34 },
35 useNullAsDefault: true,
36 debug: Env.get('DB_DEBUG', false),
37 },
38
39 /*
40 |--------------------------------------------------------------------------
41 | MySQL
42 |--------------------------------------------------------------------------
43 |
44 | Here we define connection settings for MySQL database.
45 |
46 | npm i --save mysql
47 |
48 */
49 mysql: {
50 client: 'mysql',
51 connection: {
52 host: Env.get('DB_HOST', 'localhost'),
53 port: Env.get('DB_PORT', ''),
54 user: Env.get('DB_USER', 'root'),
55 password: Env.get('DB_PASSWORD', ''),
56 database: Env.get('DB_DATABASE', 'adonis'),
57 },
58 debug: Env.get('DB_DEBUG', false),
59 },
60
61 /*
62 |--------------------------------------------------------------------------
63 | PostgreSQL
64 |--------------------------------------------------------------------------
65 |
66 | Here we define connection settings for PostgreSQL database.
67 |
68 | npm i --save pg
69 |
70 */
71 pg: {
72 client: 'pg',
73 connection: {
74 host: Env.get('DB_HOST', 'localhost'),
75 port: Env.get('DB_PORT', ''),
76 user: Env.get('DB_USER', 'root'),
77 password: Env.get('DB_PASSWORD', ''),
78 database: Env.get('DB_DATABASE', 'adonis'),
79 },
80 debug: Env.get('DB_DEBUG', false),
81 },
82};
diff --git a/src/internal-server/config/drive.js b/src/internal-server/config/drive.js
new file mode 100644
index 000000000..617ce470a
--- /dev/null
+++ b/src/internal-server/config/drive.js
@@ -0,0 +1,45 @@
1const Env = use('Env');
2
3module.exports = {
4 /*
5 |--------------------------------------------------------------------------
6 | Default disk
7 |--------------------------------------------------------------------------
8 |
9 | The default disk is used when you interact with the file system without
10 | defining a disk name
11 |
12 */
13 default: 'local',
14
15 disks: {
16 /*
17 |--------------------------------------------------------------------------
18 | Local
19 |--------------------------------------------------------------------------
20 |
21 | Local disk interacts with the a local folder inside your application
22 |
23 */
24 local: {
25 root: `${__dirname}/../recipes`,
26 driver: 'local',
27 },
28
29 /*
30 |--------------------------------------------------------------------------
31 | S3
32 |--------------------------------------------------------------------------
33 |
34 | S3 disk interacts with a bucket on aws s3
35 |
36 */
37 s3: {
38 driver: 's3',
39 key: Env.get('S3_KEY'),
40 secret: Env.get('S3_SECRET'),
41 bucket: Env.get('S3_BUCKET'),
42 region: Env.get('S3_REGION'),
43 },
44 },
45};
diff --git a/src/internal-server/config/hash.js b/src/internal-server/config/hash.js
new file mode 100644
index 000000000..bbf32f691
--- /dev/null
+++ b/src/internal-server/config/hash.js
@@ -0,0 +1,47 @@
1/** @type {import('@adonisjs/framework/src/Env')} */
2const Env = use('Env');
3
4module.exports = {
5 /*
6 |--------------------------------------------------------------------------
7 | Driver
8 |--------------------------------------------------------------------------
9 |
10 | Driver to be used for hashing values. The same driver is used by the
11 | auth module too.
12 |
13 */
14 driver: Env.get('HASH_DRIVER', 'bcrypt'),
15
16 /*
17 |--------------------------------------------------------------------------
18 | Bcrypt
19 |--------------------------------------------------------------------------
20 |
21 | Config related to bcrypt hashing. https://www.npmjs.com/package/bcrypt
22 | package is used internally.
23 |
24 */
25 bcrypt: {
26 rounds: 10,
27 },
28
29 /*
30 |--------------------------------------------------------------------------
31 | Argon
32 |--------------------------------------------------------------------------
33 |
34 | Config related to argon. https://www.npmjs.com/package/argon2 package is
35 | used internally.
36 |
37 | Since argon is optional, you will have to install the dependency yourself
38 |
39 |============================================================================
40 | npm i argon2
41 |============================================================================
42 |
43 */
44 argon: {
45 type: 1,
46 },
47};
diff --git a/src/internal-server/config/session.js b/src/internal-server/config/session.js
new file mode 100644
index 000000000..3ce3cc4da
--- /dev/null
+++ b/src/internal-server/config/session.js
@@ -0,0 +1,97 @@
1const Env = use('Env');
2
3module.exports = {
4 /*
5 |--------------------------------------------------------------------------
6 | Session Driver
7 |--------------------------------------------------------------------------
8 |
9 | The session driver to be used for storing session values. It can be
10 | cookie, file or redis.
11 |
12 | For `redis` driver, make sure to install and register `@adonisjs/redis`
13 |
14 */
15 driver: Env.get('SESSION_DRIVER', 'cookie'),
16
17 /*
18 |--------------------------------------------------------------------------
19 | Cookie Name
20 |--------------------------------------------------------------------------
21 |
22 | The name of the cookie to be used for saving session id. Session ids
23 | are signed and encrypted.
24 |
25 */
26 cookieName: 'adonis-session',
27
28 /*
29 |--------------------------------------------------------------------------
30 | Clear session when browser closes
31 |--------------------------------------------------------------------------
32 |
33 | If this value is true, the session cookie will be temporary and will be
34 | removed when browser closes.
35 |
36 */
37 clearWithBrowser: true,
38
39 /*
40 |--------------------------------------------------------------------------
41 | Session age
42 |--------------------------------------------------------------------------
43 |
44 | This value is only used when `clearWithBrowser` is set to false. The
45 | age must be a valid https://npmjs.org/package/ms string or should
46 | be in milliseconds.
47 |
48 | Valid values are:
49 | '2h', '10d', '5y', '2.5 hrs'
50 |
51 */
52 age: '2h',
53
54 /*
55 |--------------------------------------------------------------------------
56 | Cookie options
57 |--------------------------------------------------------------------------
58 |
59 | Cookie options defines the options to be used for setting up session
60 | cookie
61 |
62 */
63 cookie: {
64 httpOnly: true,
65 path: '/',
66 sameSite: false,
67 },
68
69 /*
70 |--------------------------------------------------------------------------
71 | Sessions location
72 |--------------------------------------------------------------------------
73 |
74 | If driver is set to file, we need to define the relative location from
75 | the temporary path or absolute url to any location.
76 |
77 */
78 file: {
79 location: 'sessions',
80 },
81
82 /*
83 |--------------------------------------------------------------------------
84 | Redis config
85 |--------------------------------------------------------------------------
86 |
87 | The configuration for the redis driver.
88 |
89 */
90 redis: {
91 host: 'localhost',
92 port: 6379,
93 password: null,
94 db: 0,
95 keyPrefix: '',
96 },
97};
diff --git a/src/internal-server/config/shield.js b/src/internal-server/config/shield.js
new file mode 100644
index 000000000..76f430e91
--- /dev/null
+++ b/src/internal-server/config/shield.js
@@ -0,0 +1,143 @@
1module.exports = {
2 /*
3 |--------------------------------------------------------------------------
4 | Content Security Policy
5 |--------------------------------------------------------------------------
6 |
7 | Content security policy filters out the origins not allowed to execute
8 | and load resources like scripts, styles and fonts. There are wide
9 | variety of options to choose from.
10 */
11 csp: {
12 /*
13 |--------------------------------------------------------------------------
14 | Directives
15 |--------------------------------------------------------------------------
16 |
17 | All directives are defined in camelCase and here is the list of
18 | available directives and their possible values.
19 |
20 | https://content-security-policy.com
21 |
22 | @example
23 | directives: {
24 | defaultSrc: ['self', '@nonce', 'cdnjs.cloudflare.com']
25 | }
26 |
27 */
28 directives: {
29 },
30 /*
31 |--------------------------------------------------------------------------
32 | Report only
33 |--------------------------------------------------------------------------
34 |
35 | Setting `reportOnly=true` will not block the scripts from running and
36 | instead report them to a URL.
37 |
38 */
39 reportOnly: false,
40 /*
41 |--------------------------------------------------------------------------
42 | Set all headers
43 |--------------------------------------------------------------------------
44 |
45 | Headers staring with `X` have been depreciated, since all major browsers
46 | supports the standard CSP header. So its better to disable deperciated
47 | headers, unless you want them to be set.
48 |
49 */
50 setAllHeaders: false,
51
52 /*
53 |--------------------------------------------------------------------------
54 | Disable on android
55 |--------------------------------------------------------------------------
56 |
57 | Certain versions of android are buggy with CSP policy. So you can set
58 | this value to true, to disable it for Android versions with buggy
59 | behavior.
60 |
61 | Here is an issue reported on a different package, but helpful to read
62 | if you want to know the behavior. https://github.com/helmetjs/helmet/pull/82
63 |
64 */
65 disableAndroid: true,
66 },
67
68 /*
69 |--------------------------------------------------------------------------
70 | X-XSS-Protection
71 |--------------------------------------------------------------------------
72 |
73 | X-XSS Protection saves from applications from XSS attacks. It is adopted
74 | by IE and later followed by some other browsers.
75 |
76 | Learn more at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection
77 |
78 */
79 xss: {
80 enabled: true,
81 enableOnOldIE: false,
82 },
83
84 /*
85 |--------------------------------------------------------------------------
86 | Iframe Options
87 |--------------------------------------------------------------------------
88 |
89 | xframe defines whether or not your website can be embedded inside an
90 | iframe. Choose from one of the following options.
91 | @available options
92 | DENY, SAMEORIGIN, ALLOW-FROM http://example.com
93 |
94 | Learn more at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
95 */
96 xframe: 'DENY',
97
98 /*
99 |--------------------------------------------------------------------------
100 | No Sniff
101 |--------------------------------------------------------------------------
102 |
103 | Browsers have a habit of sniffing content-type of a response. Which means
104 | files with .txt extension containing Javascript code will be executed as
105 | Javascript. You can disable this behavior by setting nosniff to false.
106 |
107 | Learn more at https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
108 |
109 */
110 nosniff: true,
111
112 /*
113 |--------------------------------------------------------------------------
114 | No Open
115 |--------------------------------------------------------------------------
116 |
117 | IE users can execute webpages in the context of your website, which is
118 | a serious security risk. Below option will manage this for you.
119 |
120 */
121 noopen: true,
122
123 /*
124 |--------------------------------------------------------------------------
125 | CSRF Protection
126 |--------------------------------------------------------------------------
127 |
128 | CSRF Protection adds another layer of security by making sure, actionable
129 | routes does have a valid token to execute an action.
130 |
131 */
132 csrf: {
133 enable: true,
134 methods: ['POST', 'PUT', 'DELETE'],
135 filterUris: [],
136 cookieOptions: {
137 httpOnly: false,
138 sameSite: true,
139 path: '/',
140 maxAge: 7200,
141 },
142 },
143};
diff --git a/src/internal-server/database/factory.js b/src/internal-server/database/factory.js
new file mode 100644
index 000000000..8534fc20a
--- /dev/null
+++ b/src/internal-server/database/factory.js
@@ -0,0 +1,19 @@
1/*
2|--------------------------------------------------------------------------
3| Factory
4|--------------------------------------------------------------------------
5|
6| Factories are used to define blueprints for database tables or Lucid
7| models. Later you can use these blueprints to seed your database
8| with dummy data.
9|
10*/
11
12/** @type {import('@adonisjs/lucid/src/Factory')} */
13// const Factory = use('Factory')
14
15// Factory.blueprint('App/Models/User', (faker) => {
16// return {
17// username: faker.username()
18// }
19// })
diff --git a/src/internal-server/database/migrations/1503250034279_user.js b/src/internal-server/database/migrations/1503250034279_user.js
new file mode 100644
index 000000000..80b49020a
--- /dev/null
+++ b/src/internal-server/database/migrations/1503250034279_user.js
@@ -0,0 +1,18 @@
1/** @type {import('@adonisjs/lucid/src/Schema')} */
2const Schema = use('Schema');
3
4class UserSchema extends Schema {
5 up() {
6 this.create('users', (table) => {
7 table.increments();
8 table.json('settings');
9 table.timestamps();
10 });
11 }
12
13 down() {
14 this.drop('users');
15 }
16}
17
18module.exports = UserSchema;
diff --git a/src/internal-server/database/migrations/1566385379883_service_schema.js b/src/internal-server/database/migrations/1566385379883_service_schema.js
new file mode 100644
index 000000000..d887ef193
--- /dev/null
+++ b/src/internal-server/database/migrations/1566385379883_service_schema.js
@@ -0,0 +1,21 @@
1/** @type {import('@adonisjs/lucid/src/Schema')} */
2const Schema = use('Schema');
3
4class ServiceSchema extends Schema {
5 up() {
6 this.create('services', (table) => {
7 table.increments();
8 table.string('serviceId', 80).notNullable();
9 table.string('name', 80).notNullable();
10 table.string('recipeId', 254).notNullable();
11 table.json('settings');
12 table.timestamps();
13 });
14 }
15
16 down() {
17 this.drop('services');
18 }
19}
20
21module.exports = ServiceSchema;
diff --git a/src/internal-server/database/migrations/1566554231482_recipe_schema.js b/src/internal-server/database/migrations/1566554231482_recipe_schema.js
new file mode 100644
index 000000000..514d57600
--- /dev/null
+++ b/src/internal-server/database/migrations/1566554231482_recipe_schema.js
@@ -0,0 +1,20 @@
1/** @type {import('@adonisjs/lucid/src/Schema')} */
2const Schema = use('Schema');
3
4class RecipeSchema extends Schema {
5 up() {
6 this.create('recipes', (table) => {
7 table.increments();
8 table.string('name', 80).notNullable();
9 table.string('recipeId', 254).notNullable().unique();
10 table.json('data');
11 table.timestamps();
12 });
13 }
14
15 down() {
16 this.drop('recipes');
17 }
18}
19
20module.exports = RecipeSchema;
diff --git a/src/internal-server/database/migrations/1566554359294_workspace_schema.js b/src/internal-server/database/migrations/1566554359294_workspace_schema.js
new file mode 100644
index 000000000..421a406b5
--- /dev/null
+++ b/src/internal-server/database/migrations/1566554359294_workspace_schema.js
@@ -0,0 +1,22 @@
1/** @type {import('@adonisjs/lucid/src/Schema')} */
2const Schema = use('Schema');
3
4class WorkspaceSchema extends Schema {
5 up() {
6 this.create('workspaces', (table) => {
7 table.increments();
8 table.string('workspaceId', 80).notNullable().unique();
9 table.string('name', 80).notNullable();
10 table.integer('order');
11 table.json('services');
12 table.json('data');
13 table.timestamps();
14 });
15 }
16
17 down() {
18 this.drop('workspaces');
19 }
20}
21
22module.exports = WorkspaceSchema;
diff --git a/src/internal-server/database/template.sqlite b/src/internal-server/database/template.sqlite
new file mode 100644
index 000000000..3750f92c7
--- /dev/null
+++ b/src/internal-server/database/template.sqlite
Binary files differ
diff --git a/src/internal-server/env.ini b/src/internal-server/env.ini
new file mode 100644
index 000000000..8df57db66
--- /dev/null
+++ b/src/internal-server/env.ini
@@ -0,0 +1,16 @@
1HOST=localhost
2PORT=45569
3NODE_ENV=development
4APP_NAME=Ferdi Internal Server
5APP_URL=http://${HOST}:${PORT}
6CACHE_VIEWS=false
7APP_KEY=FERDIINTERNALSERVER
8DB_CONNECTION=sqlite
9DB_HOST=localhost
10DB_PORT=3306
11DB_USER=root
12DB_PASSWORD=
13DB_DATABASE=ferdi
14HASH_DRIVER=bcrypt
15IS_CREATION_ENABLED=true
16CONNECT_WITH_FRANZ=true
diff --git a/src/internal-server/package.json b/src/internal-server/package.json
new file mode 100644
index 000000000..14ab704d8
--- /dev/null
+++ b/src/internal-server/package.json
@@ -0,0 +1,3 @@
1{
2 "main": "index.js"
3}
diff --git a/src/internal-server/public/css/main.css b/src/internal-server/public/css/main.css
new file mode 100644
index 000000000..b20b67922
--- /dev/null
+++ b/src/internal-server/public/css/main.css
@@ -0,0 +1,72 @@
1input {
2 margin-bottom: 1rem;
3 width: 100%;
4 padding: 0.5rem;
5}
6
7button,
8.button {
9 display: flex;
10 overflow: hidden;
11 padding: 12px 12px;
12 cursor: pointer;
13 width: 100%;
14 -webkit-user-select: none;
15 -moz-user-select: none;
16 -ms-user-select: none;
17 user-select: none;
18 @media (prefers-reduced-motion: no-preference) {
19 transition: all 150ms linear;
20 }
21 text-align: center;
22 white-space: nowrap;
23 text-decoration: none !important;
24 text-transform: none;
25 text-transform: capitalize;
26 color: #fff !important;
27 border: 0 none;
28 border-radius: 4px;
29 font-size: 13px;
30 font-weight: 500;
31 line-height: 1.3;
32 -webkit-appearance: none;
33 -moz-appearance: none;
34 appearance: none;
35 justify-content: center;
36 align-items: center;
37 flex: 0 0 160px;
38 box-shadow: 2px 5px 10px #e4e4e4;
39 color: #ffffff;
40 background: #161616;
41}
42
43#dropzone {
44 width: 100%;
45 height: 30vh;
46 background-color: #ebebeb;
47
48 display: flex;
49 align-items: center;
50 justify-content: center;
51 text-align: center;
52
53 cursor: pointer;
54}
55
56#dropzone p {
57 font-size: 0.85rem;
58}
59
60#files {
61 display: none;
62}
63
64.alert {
65 background-color: #e7a8a6;
66 padding: 0.8rem;
67 margin-bottom: 1rem;
68}
69
70td {
71 word-break: break-all;
72}
diff --git a/src/internal-server/public/css/vanilla.css b/src/internal-server/public/css/vanilla.css
new file mode 100644
index 000000000..37bc051a2
--- /dev/null
+++ b/src/internal-server/public/css/vanilla.css
@@ -0,0 +1,138 @@
1/* Reset */
2html, body, div, span, applet, object, iframe,
3h1, h2, h3, h4, h5, h6, p, blockquote, pre,
4a, abbr, acronym, address, big, cite, code,
5del, dfn, em, img, ins, kbd, q, s, samp,
6small, strike, strong, sub, sup, tt, var,
7b, u, i, center,
8dl, dt, dd, ol, ul, li,
9fieldset, form, label, legend,
10table, caption, tbody, tfoot, thead, tr, th, td,
11article, aside, canvas, details, embed,
12figure, figcaption, footer, header, hgroup,
13menu, nav, output, ruby, section, summary,
14time, mark, audio, video {
15 margin: 0;
16 padding: 0;
17 border: 0;
18 font-size: 100%;
19 font: inherit;
20 vertical-align: baseline;
21}
22* {
23 box-sizing: border-box;
24}
25
26
27
28/* Variables */
29:root {
30 --desktop-font-size: 1.3rem/1.5;
31 --mobile-font-size: 1.1rem/1.4;
32 --text-color: #2d2d2d;
33 --link-color: blue;
34 --primary-color: lightsteelblue;
35 --secondary-color: aliceblue;
36 --tertiary-color: whitesmoke;
37}
38
39
40
41
42/* Typography */
43body {
44 color: var(--text-color);
45 padding: 3rem;
46 font: var(--desktop-font-size) -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto, Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji", "Segoe UI Symbol";
47}
48
49h1,h2,h3,h4,h5,h6,p,blockquote,dl,img,figure {
50 margin: 2rem 0;
51}
52
53h1,h2,h3,h4,h5,h6 { font-weight: bold; }
54h1 { font-size: 200%; }
55h2 { font-size: 150%; }
56h3 { font-size: 120%; }
57h4,h5,h6 { font-size: 100%; }
58h5, h6 { text-transform: uppercase; }
59
60header h1 { border-bottom: 1px solid; }
61
62p { margin: 2rem 0; }
63
64a,a:visited { color: var(--link-color); }
65
66strong, time, b { font-weight: bold; }
67em, dfn, i { font-style: italic; }
68sub { font-size: 60%; vertical-align: bottom; }
69small { font-size: 80%; }
70
71blockquote, q {
72 background: var(--secondary-color);
73 border-left: 10px solid var(--primary-color);
74 font-family: "Georgia", serif;
75 padding: 1rem;
76}
77blockquote p:first-child { margin-top: 0; }
78cite {
79 font-family: "Georgia", serif;
80 font-style: italic;
81 font-weight: bold;
82}
83
84kbd,code,samp,pre,var { font-family: monospace; font-weight: bold; }
85code, pre {
86 background: var(--tertiary-color);
87 padding: 0.5rem 1rem;
88}
89code pre , pre code { padding: 0; }
90
91
92
93/* Elements */
94hr {
95 background: var(--text-color);
96 border: 0;
97 height: 1px;
98 margin: 4rem 0;
99}
100
101img { max-width: 100%; }
102
103figure {
104 border: 1px solid var(--primary-color);
105 display: inline-block;
106 padding: 1rem;
107 width: auto;
108}
109figure img { margin: 0; }
110figure figcaption { font-size: 80%; }
111
112ul, ol { margin: 2rem 0; padding: 0 0 0 4rem; }
113
114dl dd { padding-left: 2rem; }
115
116table {
117 border: 1px solid var(--primary-color);
118 border-collapse: collapse;
119 table-layout: fixed;
120 width: 100%;
121}
122table caption { margin: 2rem 0; }
123table thead { text-align: center; }
124table tbody { text-align: right; }
125table tr { border-bottom: 1px solid var(--primary-color); }
126table tbody tr:nth-child(even) { background: var(--tertiary-color); }
127table th { background: var(--secondary-color); font-weight: bold; }
128table th, table td { padding: 1rem; }
129table th:not(last-of-type), table td:not(last-of-type) { border-right: 1px solid var(--primary-color); }
130
131
132
133/* Mobile Styling */
134@media screen and (max-width: 50rem) {
135 body {
136 font: var(--mobile-font-size) -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto, Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji", "Segoe UI Symbol"
137 }
138} \ No newline at end of file
diff --git a/src/internal-server/public/images/logo.png b/src/internal-server/public/images/logo.png
new file mode 100644
index 000000000..4145a077a
--- /dev/null
+++ b/src/internal-server/public/images/logo.png
Binary files differ
diff --git a/src/internal-server/public/js/transfer.js b/src/internal-server/public/js/transfer.js
new file mode 100644
index 000000000..8382bba02
--- /dev/null
+++ b/src/internal-server/public/js/transfer.js
@@ -0,0 +1,13 @@
1const submitBtn = document.getElementById('submit');
2const fileInput = document.getElementById('file');
3const fileOutput = document.getElementById('fileoutput');
4
5fileInput.addEventListener('change', () => {
6 const reader = new FileReader();
7 reader.onload = () => {
8 const text = reader.result;
9 fileOutput.value = text;
10 submitBtn.disabled = false;
11 };
12 reader.readAsText(fileInput.files[0]);
13});
diff --git a/src/internal-server/resources/views/import.edge b/src/internal-server/resources/views/import.edge
new file mode 100644
index 000000000..561021a0c
--- /dev/null
+++ b/src/internal-server/resources/views/import.edge
@@ -0,0 +1,18 @@
1@layout('layouts.main')
2
3@section('content')
4<h1>Import a Franz account</h1>
5<p>Please login using your Franz account. We will import your services and workspaces.</p>
6<form action="import" method="post">
7 <label for="email">E-Mail address</label><br />
8 <input type="email" name="email" placeholder="joe@example.com" required><br />
9
10 <label for="password">Password</label><br />
11 <input type="password" name="password" placeholder="********" required><br />
12
13 <label for="server">API Server to import from</label><br />
14 <input type="text" name="server" value="https://api.franzinfra.com" required><br />
15
16 <button type="submit" id="submitbutton">Import Franz account</button>
17</form>
18@endsection
diff --git a/src/internal-server/resources/views/index.edge b/src/internal-server/resources/views/index.edge
new file mode 100644
index 000000000..b01bd7569
--- /dev/null
+++ b/src/internal-server/resources/views/index.edge
@@ -0,0 +1,19 @@
1@layout('layouts.main')
2
3@section('content')
4<style>
5 ol,
6 p {
7 margin: 0.5rem 0;
8 }
9
10</style>
11<h1>Internal Ferdi Server</h1>
12<p>You are accessing the local server instance of your Ferdi application. This server is used to enable Ferdi's "Use without an Account" feature.</p>
13<p>
14 To use Ferdi without an account, log out of your current account (if you are already logged in) and choose "Use Ferdi without an Account".
15</p>
16<p>
17 Alternatively, you can <a href="/import">import your account from a remote server</a> or <a href="/transfer">import your data from a ".ferdi-data" file</a> or <a href="/transfer">export your data to a ".ferdi-data" file</a>.
18</p>
19@endsection
diff --git a/src/internal-server/resources/views/layouts/main.edge b/src/internal-server/resources/views/layouts/main.edge
new file mode 100644
index 000000000..8856b5d1e
--- /dev/null
+++ b/src/internal-server/resources/views/layouts/main.edge
@@ -0,0 +1,19 @@
1<!DOCTYPE html>
2<html lang="en">
3
4<head>
5 <meta charset="UTF-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
7 <meta http-equiv="X-UA-Compatible" content="ie=edge">
8 <title>ferdi-internal-server</title>
9
10 {{ style('css/vanilla') }}
11 {{ style('css/main') }}
12</head>
13
14<body>
15 <img src='images/logo.png' width='300' />
16 @!section('content')
17</body>
18
19</html>
diff --git a/src/internal-server/resources/views/transfer.edge b/src/internal-server/resources/views/transfer.edge
new file mode 100644
index 000000000..58febb24b
--- /dev/null
+++ b/src/internal-server/resources/views/transfer.edge
@@ -0,0 +1,32 @@
1@layout('layouts.main')
2
3@section('content')
4<h2>Import/Export data from another Ferdi server</h2>
5@if(success === true)
6 <div class="alert" style="background-color:#28C76F;">
7 Sucessfully imported your account data
8 </div>
9@endif
10
11<h3>Import data</h3>
12<div>
13 <label>Account data</label>
14 <div>
15 <input type="file" name="file" id="file" value="" accept=".json,.ferdi-data" required>
16 </div>
17</div>
18
19<form action="/transfer" method="POST">
20 <input type="hidden" name="file" id="fileoutput" value="">
21 <div>
22 <button style="background-color:#28C76F;margin-bottom:1rem;" id="submit" disabled>Import data</button>
23 </div>
24</form>
25
26<h3>Export data</h3>
27<a class="button" style="background-color:#28C76F;margin-bottom:1rem;" href="/export">Export data</a>
28
29</div>
30<script src="/js/transfer.js"></script>
31
32@endsection \ No newline at end of file
diff --git a/src/internal-server/start.js b/src/internal-server/start.js
new file mode 100644
index 000000000..5ccc1330e
--- /dev/null
+++ b/src/internal-server/start.js
@@ -0,0 +1,51 @@
1/*
2|--------------------------------------------------------------------------
3| Http server
4|--------------------------------------------------------------------------
5|
6| This file bootstraps Adonisjs to start the HTTP server. You are free to
7| customize the process of booting the http server.
8|
9| """ Loading ace commands """
10| At times you may want to load ace commands when starting the HTTP server.
11| Same can be done by chaining `loadCommands()` method after
12|
13| """ Preloading files """
14| Also you can preload files by calling `preLoad('path/to/file')` method.
15| Make sure to pass a relative path from the project root.
16*/
17
18const fold = require('@adonisjs/fold');
19const { Ignitor } = require('@adonisjs/ignitor');
20const fs = require('fs-extra');
21const path = require('path');
22const { LOCAL_HOSTNAME } = require('../config');
23const { isWindows } = require('../environment');
24
25process.env.ENV_PATH = path.join(__dirname, 'env.ini');
26
27module.exports = async (userPath, port) => {
28 const dbPath = path.join(userPath, 'server.sqlite');
29 const dbTemplatePath = path.join(__dirname, 'database', 'template.sqlite');
30
31 if (!fs.existsSync(dbPath)) {
32 // Manually copy file
33 // We can't use copyFile here as it will cause the file to be readonly on Windows
34 const dbTemplate = await fs.readFile(dbTemplatePath);
35 await fs.writeFile(dbPath, dbTemplate);
36
37 // Change permissions to ensure to file is not read-only
38 if (isWindows) {
39 // eslint-disable-next-line no-bitwise
40 fs.chmodSync(dbPath, fs.statSync(dbPath).mode | 146);
41 }
42 }
43
44 // Note: These env vars are used by adonis as env vars
45 process.env.DB_PATH = dbPath;
46 process.env.USER_PATH = userPath;
47 process.env.HOST = LOCAL_HOSTNAME;
48 process.env.PORT = port;
49
50 new Ignitor(fold).appRoot(__dirname).fireHttpServer().catch(console.error); // eslint-disable-line no-console
51};
diff --git a/src/internal-server/start/app.js b/src/internal-server/start/app.js
new file mode 100644
index 000000000..8b1a49f57
--- /dev/null
+++ b/src/internal-server/start/app.js
@@ -0,0 +1,61 @@
1/*
2|--------------------------------------------------------------------------
3| Providers
4|--------------------------------------------------------------------------
5|
6| Providers are building blocks for your Adonis app. Anytime you install
7| a new Adonis specific package, chances are you will register the
8| provider here.
9|
10*/
11const providers = [
12 '@adonisjs/framework/providers/AppProvider',
13 '@adonisjs/bodyparser/providers/BodyParserProvider',
14 '@adonisjs/cors/providers/CorsProvider',
15 '@adonisjs/lucid/providers/LucidProvider',
16 '@adonisjs/drive/providers/DriveProvider',
17 '@adonisjs/validator/providers/ValidatorProvider',
18 '@adonisjs/framework/providers/ViewProvider',
19 '@adonisjs/shield/providers/ShieldProvider',
20];
21
22/*
23|--------------------------------------------------------------------------
24| Ace Providers
25|--------------------------------------------------------------------------
26|
27| Ace providers are required only when running ace commands. For example
28| Providers for migrations, tests etc.
29|
30*/
31const aceProviders = [
32 '@adonisjs/lucid/providers/MigrationsProvider',
33];
34
35/*
36|--------------------------------------------------------------------------
37| Aliases
38|--------------------------------------------------------------------------
39|
40| Aliases are short unique names for IoC container bindings. You are free
41| to create your own aliases.
42|
43| For example:
44| { Route: 'Adonis/Src/Route' }
45|
46*/
47const aliases = {};
48
49/*
50|--------------------------------------------------------------------------
51| Commands
52|--------------------------------------------------------------------------
53|
54| Here you store ace commands for your package
55|
56*/
57const commands = [];
58
59module.exports = {
60 providers, aceProviders, aliases, commands,
61};
diff --git a/src/internal-server/start/kernel.js b/src/internal-server/start/kernel.js
new file mode 100644
index 000000000..7b540f829
--- /dev/null
+++ b/src/internal-server/start/kernel.js
@@ -0,0 +1,55 @@
1/** @type {import('@adonisjs/framework/src/Server')} */
2const Server = use('Server');
3
4/*
5|--------------------------------------------------------------------------
6| Global Middleware
7|--------------------------------------------------------------------------
8|
9| Global middleware are executed on each http request only when the routes
10| match.
11|
12*/
13const globalMiddleware = [
14 'Adonis/Middleware/BodyParser',
15 'App/Middleware/ConvertEmptyStringsToNull',
16];
17
18/*
19|--------------------------------------------------------------------------
20| Named Middleware
21|--------------------------------------------------------------------------
22|
23| Named middleware is key/value object to conditionally add middleware on
24| specific routes or group of routes.
25|
26| // define
27| {
28| auth: 'Adonis/Middleware/Auth'
29| }
30|
31| // use
32| Route.get().middleware('auth')
33|
34*/
35const namedMiddleware = {
36};
37
38/*
39|--------------------------------------------------------------------------
40| Server Middleware
41|--------------------------------------------------------------------------
42|
43| Server level middleware are executed even when route for a given URL is
44| not registered. Features like `static assets` and `cors` needs better
45| control over request lifecycle.
46|
47*/
48const serverMiddleware = [
49 'Adonis/Middleware/Static',
50];
51
52Server
53 .registerGlobal(globalMiddleware)
54 .registerNamed(namedMiddleware)
55 .use(serverMiddleware);
diff --git a/src/internal-server/start/migrate.js b/src/internal-server/start/migrate.js
new file mode 100644
index 000000000..c27e07bc5
--- /dev/null
+++ b/src/internal-server/start/migrate.js
@@ -0,0 +1,46 @@
1const { ferdiVersion } = require('../../environment');
2
3/**
4 * Migrate server database to work with current Ferdi version
5 */
6const Database = use('Database');
7const User = use('App/Models/User');
8
9const migrateLog = (text) => {
10 console.log('\x1b[36m%s\x1b[0m', 'Ferdi Migration:', '\x1b[0m', text);
11};
12
13module.exports = async () => {
14 migrateLog('🧙‍ Running database migration wizard');
15
16 // Make sure user table exists
17 await Database.raw('CREATE TABLE IF NOT EXISTS `users` (`id` integer not null primary key autoincrement, `settings` text, `created_at` datetime, `updated_at` datetime);');
18
19 const user = await User.find(1);
20 let settings;
21 if (!user) {
22 migrateLog('🎩 Migrating from old Ferdi version as user doesn\'t exist');
23
24 // Create new user
25 await Database.raw('INSERT INTO "users" ("id") VALUES (\'1\');');
26 } else {
27 settings = typeof user.settings === 'string' ? JSON.parse(user.settings) : user.settings;
28 }
29
30 if (!settings || !settings.db_version || settings.db_version !== ferdiVersion) {
31 const srcVersion = settings && settings.db_version ? settings.db_version : '5.4.0-beta.2';
32 migrateLog(`🔮 Migrating table from ${srcVersion} to ${ferdiVersion}`);
33
34 // Migrate database to current Ferdi version
35 // Currently no migrations
36
37 // Update version number in database
38 if (!settings) settings = {};
39 settings.db_version = ferdiVersion;
40 const newUser = await User.find(1); // Fetch user again as we might have only just created it
41 newUser.settings = JSON.stringify(settings);
42 await newUser.save();
43 } else {
44 migrateLog('🔧 Nothing to migrate, already on the newest version');
45 }
46};
diff --git a/src/internal-server/start/routes.js b/src/internal-server/start/routes.js
new file mode 100644
index 000000000..6668f3062
--- /dev/null
+++ b/src/internal-server/start/routes.js
@@ -0,0 +1,86 @@
1/*
2|--------------------------------------------------------------------------
3| Routes
4|--------------------------------------------------------------------------
5|
6*/
7
8/** @type {typeof import('@adonisjs/framework/src/Route/Manager')} */
9const Route = use('Route');
10
11// Run latest database migration
12const migrate = require('./migrate');
13
14migrate();
15
16const OnlyAllowFerdi = async ({ request, response }, next) => {
17 const version = request.header('X-Franz-Version');
18 if (!version) {
19 return response.status(403).redirect('/');
20 }
21
22 await next();
23 return true;
24};
25
26// Health: Returning if all systems function correctly
27Route.get('health', ({
28 response,
29}) => response.send({
30 api: 'success',
31 db: 'success',
32})).middleware(OnlyAllowFerdi);
33
34// API is grouped under '/v1/' route
35Route.group(() => {
36 // User authentification
37 Route.post('auth/signup', 'UserController.signup');
38 Route.post('auth/login', 'UserController.login');
39
40 // User info
41 Route.get('me', 'UserController.me');
42 Route.put('me', 'UserController.updateMe');
43
44 // Service info
45 Route.post('service', 'ServiceController.create');
46 Route.put('service/reorder', 'ServiceController.reorder');
47 Route.put('service/:id', 'ServiceController.edit');
48 Route.delete('service/:id', 'ServiceController.delete');
49 Route.get('me/services', 'ServiceController.list');
50
51 // Recipe store
52 Route.get('recipe', 'ServiceController.list');
53 Route.post('recipes/update', 'ServiceController.update');
54 Route.get('recipes', 'RecipeController.list');
55 Route.get('recipes/download/:recipe', 'RecipeController.download');
56 Route.get('recipes/search', 'RecipeController.search');
57 Route.get('recipes/update', 'StaticController.emptyArray');
58
59 // Workspaces
60 Route.put('workspace/:id', 'WorkspaceController.edit');
61 Route.delete('workspace/:id', 'WorkspaceController.delete');
62 Route.post('workspace', 'WorkspaceController.create');
63 Route.get('workspace', 'WorkspaceController.list');
64
65 // Static responses
66 Route.get('features/:mode?', 'StaticController.features');
67 Route.get('services', 'StaticController.emptyArray');
68 Route.get('news', 'StaticController.emptyArray');
69 Route.get('announcements/:version', 'StaticController.announcement');
70}).prefix('v1').middleware(OnlyAllowFerdi);
71
72Route.group(() => {
73 Route.get('icon/:id', 'ServiceController.icon');
74}).prefix('v1');
75
76// Franz account import
77Route.post('import', 'UserController.import');
78Route.get('import', ({ view }) => view.render('import'));
79
80// Account transfer
81Route.get('export', 'UserController.export');
82Route.post('transfer', 'UserController.importFerdi');
83Route.get('transfer', ({ view }) => view.render('transfer'));
84
85// Index
86Route.get('/', ({ view }) => view.render('index'));
diff --git a/src/internal-server/test.js b/src/internal-server/test.js
new file mode 100644
index 000000000..8d4807d06
--- /dev/null
+++ b/src/internal-server/test.js
@@ -0,0 +1,9 @@
1const path = require('path');
2const fs = require('fs-extra');
3const server = require('./start');
4
5const dummyUserFolder = path.join(__dirname, 'user_data');
6
7fs.ensureDirSync(dummyUserFolder);
8
9server(dummyUserFolder, 45568);
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index c60536f0c..e4056e536 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -6,7 +6,7 @@ import { autorun, observable } from 'mobx';
6import { defineMessages } from 'react-intl'; 6import { defineMessages } from 'react-intl';
7import { CUSTOM_WEBSITE_RECIPE_ID, GITHUB_FERDI_URL, LIVE_API_FERDI_WEBSITE } from '../config'; 7import { CUSTOM_WEBSITE_RECIPE_ID, GITHUB_FERDI_URL, LIVE_API_FERDI_WEBSITE } from '../config';
8import { 8import {
9 cmdKey, ctrlKey, isLinux, isMac, aboutAppDetails, termsBase, 9 shortcutKey, altKey, shiftKey, settingsShortcutKey, isLinux, isMac, aboutAppDetails, lockFerdiShortcutKey, todosToggleShortcutKey, workspaceToggleShortcutKey, addNewServiceShortcutKey, muteFerdiShortcutKey,
10} from '../environment'; 10} from '../environment';
11import { announcementsStore } from '../features/announcements'; 11import { announcementsStore } from '../features/announcements';
12import { announcementActions } from '../features/announcements/actions'; 12import { announcementActions } from '../features/announcements/actions';
@@ -14,6 +14,7 @@ import { todosStore } from '../features/todos';
14import { todoActions } from '../features/todos/actions'; 14import { todoActions } from '../features/todos/actions';
15import { workspaceActions } from '../features/workspaces/actions'; 15import { workspaceActions } from '../features/workspaces/actions';
16import { workspaceStore } from '../features/workspaces/index'; 16import { workspaceStore } from '../features/workspaces/index';
17import apiBase, { termsBase } from '../api/apiBase';
17 18
18const menuItems = defineMessages({ 19const menuItems = defineMessages({
19 edit: { 20 edit: {
@@ -100,14 +101,6 @@ const menuItems = defineMessages({
100 id: 'menu.view.zoomOut', 101 id: 'menu.view.zoomOut',
101 defaultMessage: '!!!Zoom Out', 102 defaultMessage: '!!!Zoom Out',
102 }, 103 },
103 enterFullScreen: {
104 id: 'menu.view.enterFullScreen',
105 defaultMessage: '!!!Enter Full Screen',
106 },
107 exitFullScreen: {
108 id: 'menu.view.exitFullScreen',
109 defaultMessage: '!!!Exit Full Screen',
110 },
111 toggleFullScreen: { 104 toggleFullScreen: {
112 id: 'menu.view.toggleFullScreen', 105 id: 'menu.view.toggleFullScreen',
113 defaultMessage: '!!!Toggle Full Screen', 106 defaultMessage: '!!!Toggle Full Screen',
@@ -132,8 +125,8 @@ const menuItems = defineMessages({
132 id: 'menu.view.reloadService', 125 id: 'menu.view.reloadService',
133 defaultMessage: '!!!Reload Service', 126 defaultMessage: '!!!Reload Service',
134 }, 127 },
135 reloadFranz: { 128 reloadFerdi: {
136 id: 'menu.view.reloadFranz', 129 id: 'menu.view.reloadFerdi',
137 defaultMessage: '!!!Reload Ferdi', 130 defaultMessage: '!!!Reload Ferdi',
138 }, 131 },
139 lockFerdi: { 132 lockFerdi: {
@@ -160,6 +153,10 @@ const menuItems = defineMessages({
160 id: 'menu.help.changelog', 153 id: 'menu.help.changelog',
161 defaultMessage: '!!!Changelog', 154 defaultMessage: '!!!Changelog',
162 }, 155 },
156 importExportData: {
157 id: 'menu.help.importExportData',
158 defaultMessage: '!!!Import/Export Configuration Data',
159 },
163 support: { 160 support: {
164 id: 'menu.help.support', 161 id: 'menu.help.support',
165 defaultMessage: '!!!Support', 162 defaultMessage: '!!!Support',
@@ -318,9 +315,10 @@ function getActiveWebview() {
318 return window.ferdi.stores.services.active.webview; 315 return window.ferdi.stores.services.active.webview;
319} 316}
320 317
321const _templateFactory = (intl, locked) => [ 318const _titleBarTemplateFactory = (intl, locked) => [
322 { 319 {
323 label: intl.formatMessage(menuItems.edit), 320 label: intl.formatMessage(menuItems.edit),
321 accelerator: `${altKey}+E`,
324 submenu: [ 322 submenu: [
325 { 323 {
326 label: intl.formatMessage(menuItems.undo), 324 label: intl.formatMessage(menuItems.undo),
@@ -335,23 +333,23 @@ const _templateFactory = (intl, locked) => [
335 }, 333 },
336 { 334 {
337 label: intl.formatMessage(menuItems.cut), 335 label: intl.formatMessage(menuItems.cut),
338 accelerator: 'Cmd+X', 336 accelerator: `${shortcutKey()}+X`,
339 selector: 'cut:', 337 role: 'cut',
340 }, 338 },
341 { 339 {
342 label: intl.formatMessage(menuItems.copy), 340 label: intl.formatMessage(menuItems.copy),
343 accelerator: 'Cmd+C', 341 accelerator: `${shortcutKey()}+C`,
344 selector: 'copy:', 342 role: 'copy',
345 }, 343 },
346 { 344 {
347 label: intl.formatMessage(menuItems.paste), 345 label: intl.formatMessage(menuItems.paste),
348 accelerator: 'Cmd+V', 346 accelerator: `${shortcutKey()}+V`,
349 selector: 'paste:', 347 role: 'paste',
350 }, 348 },
351 { 349 {
352 label: intl.formatMessage(menuItems.pasteAndMatchStyle), 350 label: intl.formatMessage(menuItems.pasteAndMatchStyle),
353 accelerator: 'Cmd+Shift+V', 351 accelerator: `${shortcutKey()}+${shiftKey}+V`, // Override the accelerator since this adds new key combo in macos
354 selector: 'pasteAndMatchStyle:', 352 role: 'pasteAndMatchStyle',
355 click() { 353 click() {
356 getActiveWebview().pasteAndMatchStyle(); 354 getActiveWebview().pasteAndMatchStyle();
357 }, 355 },
@@ -362,13 +360,14 @@ const _templateFactory = (intl, locked) => [
362 }, 360 },
363 { 361 {
364 label: intl.formatMessage(menuItems.selectAll), 362 label: intl.formatMessage(menuItems.selectAll),
365 accelerator: 'Cmd+A', 363 accelerator: `${shortcutKey()}+A`,
366 selector: 'selectAll:', 364 role: 'selectall',
367 }, 365 },
368 ], 366 ],
369 }, 367 },
370 { 368 {
371 label: intl.formatMessage(menuItems.view), 369 label: intl.formatMessage(menuItems.view),
370 accelerator: `${altKey}+V`,
372 visible: !locked, 371 visible: !locked,
373 submenu: [ 372 submenu: [
374 { 373 {
@@ -376,7 +375,7 @@ const _templateFactory = (intl, locked) => [
376 }, 375 },
377 { 376 {
378 label: intl.formatMessage(menuItems.openQuickSwitch), 377 label: intl.formatMessage(menuItems.openQuickSwitch),
379 accelerator: 'CmdOrCtrl+S', 378 accelerator: `${shortcutKey()}+S`,
380 click() { 379 click() {
381 window.ferdi.features.quickSwitch.state.isModalVisible = true; 380 window.ferdi.features.quickSwitch.state.isModalVisible = true;
382 }, 381 },
@@ -386,7 +385,7 @@ const _templateFactory = (intl, locked) => [
386 }, 385 },
387 { 386 {
388 label: intl.formatMessage(menuItems.findInPage), 387 label: intl.formatMessage(menuItems.findInPage),
389 accelerator: 'CmdOrCtrl+F', 388 accelerator: `${shortcutKey()}+F`,
390 click() { 389 click() {
391 // Check if there is a service active 390 // Check if there is a service active
392 if (!window.ferdi.stores.services.active) return; 391 if (!window.ferdi.stores.services.active) return;
@@ -407,18 +406,16 @@ const _templateFactory = (intl, locked) => [
407 }, 406 },
408 { 407 {
409 label: intl.formatMessage(menuItems.back), 408 label: intl.formatMessage(menuItems.back),
410 accelerator: 'CmdOrCtrl+Left', 409 accelerator: `${shortcutKey()}+Left`,
411 click() { 410 click() {
412 const activeService = getActiveWebview(); 411 getActiveWebview().goBack();
413 activeService.goBack();
414 }, 412 },
415 }, 413 },
416 { 414 {
417 label: intl.formatMessage(menuItems.forward), 415 label: intl.formatMessage(menuItems.forward),
418 accelerator: 'CmdOrCtrl+Right', 416 accelerator: `${shortcutKey()}+Right`,
419 click() { 417 click() {
420 const activeService = getActiveWebview(); 418 getActiveWebview().goForward();
421 activeService.goForward();
422 }, 419 },
423 }, 420 },
424 { 421 {
@@ -426,14 +423,16 @@ const _templateFactory = (intl, locked) => [
426 }, 423 },
427 { 424 {
428 label: intl.formatMessage(menuItems.resetZoom), 425 label: intl.formatMessage(menuItems.resetZoom),
429 accelerator: 'Cmd+0', 426 accelerator: `${shortcutKey()}+0`,
427 role: 'resetZoom',
430 click() { 428 click() {
431 getActiveWebview().setZoomLevel(0); 429 getActiveWebview().setZoomLevel(0);
432 }, 430 },
433 }, 431 },
434 { 432 {
435 label: intl.formatMessage(menuItems.zoomIn), 433 label: intl.formatMessage(menuItems.zoomIn),
436 accelerator: 'Cmd+plus', 434 accelerator: `${shortcutKey()}+plus`,
435 role: 'zoomIn',
437 click() { 436 click() {
438 const activeService = getActiveWebview(); 437 const activeService = getActiveWebview();
439 const level = activeService.getZoomLevel(); 438 const level = activeService.getZoomLevel();
@@ -444,7 +443,8 @@ const _templateFactory = (intl, locked) => [
444 }, 443 },
445 { 444 {
446 label: intl.formatMessage(menuItems.zoomOut), 445 label: intl.formatMessage(menuItems.zoomOut),
447 accelerator: 'Cmd+-', 446 accelerator: `${shortcutKey()}+-`,
447 role: 'zoomOut',
448 click() { 448 click() {
449 const activeService = getActiveWebview(); 449 const activeService = getActiveWebview();
450 const level = activeService.getZoomLevel(); 450 const level = activeService.getZoomLevel();
@@ -457,15 +457,13 @@ const _templateFactory = (intl, locked) => [
457 type: 'separator', 457 type: 'separator',
458 }, 458 },
459 { 459 {
460 label: app.mainWindow.isFullScreen() // label doesn't work, gets overridden by Electron 460 label: intl.formatMessage(menuItems.toggleFullScreen),
461 ? intl.formatMessage(menuItems.exitFullScreen) 461 role: 'toggleFullScreen',
462 : intl.formatMessage(menuItems.enterFullScreen),
463 role: 'togglefullscreen',
464 }, 462 },
465 { 463 {
466 label: intl.formatMessage(menuItems.toggleDarkMode), 464 label: intl.formatMessage(menuItems.toggleDarkMode),
467 type: 'checkbox', 465 type: 'checkbox',
468 accelerator: `${cmdKey}+Shift+D`, 466 accelerator: `${shortcutKey()}+${shiftKey}+D`,
469 checked: window.ferdi.stores.settings.app.darkMode, 467 checked: window.ferdi.stores.settings.app.darkMode,
470 click: () => { 468 click: () => {
471 window.ferdi.actions.settings.update({ 469 window.ferdi.actions.settings.update({
@@ -480,11 +478,13 @@ const _templateFactory = (intl, locked) => [
480 }, 478 },
481 { 479 {
482 label: intl.formatMessage(menuItems.services), 480 label: intl.formatMessage(menuItems.services),
481 accelerator: `${altKey}+S`,
483 visible: !locked, 482 visible: !locked,
484 submenu: [], 483 submenu: [],
485 }, 484 },
486 { 485 {
487 label: intl.formatMessage(menuItems.workspaces), 486 label: intl.formatMessage(menuItems.workspaces),
487 accelerator: `${altKey}+W`,
488 submenu: [], 488 submenu: [],
489 visible: !locked && workspaceStore.isFeatureEnabled, 489 visible: !locked && workspaceStore.isFeatureEnabled,
490 }, 490 },
@@ -509,6 +509,7 @@ const _templateFactory = (intl, locked) => [
509 }, 509 },
510 { 510 {
511 label: intl.formatMessage(menuItems.help), 511 label: intl.formatMessage(menuItems.help),
512 accelerator: `${altKey}+H`,
512 role: 'help', 513 role: 'help',
513 submenu: [ 514 submenu: [
514 { 515 {
@@ -516,274 +517,23 @@ const _templateFactory = (intl, locked) => [
516 click() { shell.openExternal(LIVE_API_FERDI_WEBSITE); }, 517 click() { shell.openExternal(LIVE_API_FERDI_WEBSITE); },
517 }, 518 },
518 { 519 {
519 label: intl.formatMessage(menuItems.announcement), 520 label: intl.formatMessage(menuItems.changelog),
520 click: () => { 521 click() { shell.openExternal(`${GITHUB_FERDI_URL}/ferdi/blob/master/CHANGELOG.md`); },
521 announcementActions.show();
522 },
523 visible: !locked && window.ferdi.stores.user.isLoggedIn && announcementsStore.areNewsAvailable,
524 },
525 {
526 type: 'separator',
527 },
528 {
529 label: intl.formatMessage(menuItems.support),
530 click() { shell.openExternal(`${LIVE_API_FERDI_WEBSITE}/contact`); },
531 },
532 {
533 type: 'separator',
534 },
535 {
536 label: intl.formatMessage(menuItems.tos),
537 click() { shell.openExternal(`${termsBase()}/terms`); },
538 },
539 {
540 label: intl.formatMessage(menuItems.privacy),
541 click() { shell.openExternal(`${termsBase()}/privacy`); },
542 },
543 ],
544 },
545];
546
547const _titleBarTemplateFactory = (intl, locked) => [
548 {
549 label: intl.formatMessage(menuItems.edit),
550 accelerator: 'Alt+E',
551 submenu: [
552 {
553 label: intl.formatMessage(menuItems.undo),
554 accelerator: `${ctrlKey}+Z`,
555 click() {
556 getActiveWebview().undo();
557 },
558 },
559 {
560 label: intl.formatMessage(menuItems.redo),
561 accelerator: `${ctrlKey}+Y`,
562 click() {
563 getActiveWebview().redo();
564 },
565 },
566 {
567 type: 'separator',
568 },
569 {
570 label: intl.formatMessage(menuItems.cut),
571 accelerator: `${ctrlKey}+X`,
572 click() {
573 getActiveWebview().cut();
574 },
575 },
576 {
577 label: intl.formatMessage(menuItems.copy),
578 accelerator: `${ctrlKey}+C`,
579 click() {
580 getActiveWebview().copy();
581 },
582 },
583 {
584 label: intl.formatMessage(menuItems.paste),
585 accelerator: `${ctrlKey}+V`,
586 click() {
587 getActiveWebview().paste();
588 },
589 },
590 {
591 label: intl.formatMessage(menuItems.pasteAndMatchStyle),
592 accelerator: `${ctrlKey}+Shift+V`,
593 click() {
594 getActiveWebview().pasteAndMatchStyle();
595 },
596 },
597 {
598 label: intl.formatMessage(menuItems.delete),
599 click() {
600 getActiveWebview().delete();
601 },
602 },
603 {
604 label: intl.formatMessage(menuItems.selectAll),
605 accelerator: `${ctrlKey}+A`,
606 click() {
607 getActiveWebview().selectAll();
608 },
609 },
610 ],
611 },
612 {
613 label: intl.formatMessage(menuItems.view),
614 accelerator: 'Alt+V',
615 visible: !locked,
616 submenu: [
617 {
618 type: 'separator',
619 },
620 {
621 label: intl.formatMessage(menuItems.openQuickSwitch),
622 accelerator: 'CmdOrCtrl+S',
623 click() {
624 window.ferdi.features.quickSwitch.state.isModalVisible = true;
625 },
626 },
627 {
628 type: 'separator',
629 },
630 {
631 label: intl.formatMessage(menuItems.findInPage),
632 accelerator: 'CmdOrCtrl+F',
633 click() {
634 // Check if there is a service active
635 if (!window.ferdi.stores.services.active) return;
636
637 // Focus webview so find in page popup gets focused
638 window.ferdi.stores.services.active.webview.focus();
639
640 const currentService = window.ferdi.stores.services.active.id;
641 window.ferdi.actions.service.sendIPCMessage({
642 serviceId: currentService,
643 channel: 'find-in-page',
644 args: {},
645 });
646 },
647 },
648 {
649 type: 'separator',
650 },
651 {
652 label: intl.formatMessage(menuItems.back),
653 accelerator: 'CmdOrCtrl+Left',
654 click() {
655 const activeService = getActiveWebview();
656 activeService.goBack();
657 },
658 },
659 {
660 label: intl.formatMessage(menuItems.forward),
661 accelerator: 'CmdOrCtrl+Right',
662 click() {
663 const activeService = getActiveWebview();
664 activeService.goForward();
665 },
666 },
667 {
668 type: 'separator',
669 },
670 {
671 label: intl.formatMessage(menuItems.resetZoom),
672 accelerator: `${ctrlKey}+0`,
673 click() {
674 getActiveWebview().setZoomLevel(0);
675 },
676 },
677 {
678 label: intl.formatMessage(menuItems.zoomIn),
679 accelerator: `${ctrlKey}+=`,
680 click() {
681 const activeService = getActiveWebview();
682 const level = activeService.getZoomLevel();
683
684 // level 9 =~ +300% and setZoomLevel wouldnt zoom in further
685 if (level < 9) activeService.setZoomLevel(level + 1);
686 },
687 }, 522 },
688 { 523 {
689 label: intl.formatMessage(menuItems.zoomOut), 524 label: intl.formatMessage(menuItems.importExportData),
690 accelerator: `${ctrlKey}+-`, 525 click() { shell.openExternal(apiBase(false)); },
691 click() { 526 enabled: !locked,
692 const activeService = getActiveWebview();
693 const level = activeService.getZoomLevel();
694
695 // level -9 =~ -50% and setZoomLevel wouldnt zoom out further
696 if (level > -9) activeService.setZoomLevel(level - 1);
697 },
698 }, 527 },
699 { 528 {
700 type: 'separator', 529 type: 'separator',
701 }, 530 },
702 { 531 {
703 label: app.mainWindow.isFullScreen() // label doesn't work, gets overridden by Electron 532 label: intl.formatMessage(menuItems.announcement),
704 ? intl.formatMessage(menuItems.exitFullScreen)
705 : intl.formatMessage(menuItems.enterFullScreen),
706 accelerator: 'F11',
707 click(menuItem, browserWindow) {
708 browserWindow.setFullScreen(!browserWindow.isFullScreen());
709 },
710 },
711 {
712 label: intl.formatMessage(menuItems.toggleDarkMode),
713 type: 'checkbox',
714 accelerator: `${cmdKey}+Shift+D`,
715 checked: window.ferdi.stores.settings.app.darkMode,
716 click: () => {
717 window.ferdi.actions.settings.update({
718 type: 'app',
719 data: {
720 darkMode: !window.ferdi.stores.settings.app.darkMode,
721 },
722 });
723 },
724 },
725 {
726 label: intl.formatMessage(menuItems.autohideMenuBar),
727 type: 'checkbox',
728 checked: window.ferdi.stores.settings.app.autohideMenuBar,
729 click: () => { 533 click: () => {
730 window.ferdi.actions.settings.update({ 534 announcementActions.show();
731 type: 'app',
732 data: {
733 autohideMenuBar: !window.ferdi.stores.settings.app.autohideMenuBar,
734 },
735 });
736 },
737 },
738 ],
739 },
740 {
741 label: intl.formatMessage(menuItems.services),
742 accelerator: 'Alt+S',
743 visible: !locked,
744 submenu: [],
745 },
746 {
747 label: intl.formatMessage(menuItems.workspaces),
748 accelerator: 'Alt+W',
749 submenu: [],
750 visible: !locked && workspaceStore.isFeatureEnabled,
751 },
752 {
753 label: intl.formatMessage(menuItems.todos),
754 submenu: [],
755 visible: !locked && todosStore.isFeatureEnabled,
756 },
757 {
758 label: intl.formatMessage(menuItems.window),
759 submenu: [
760 {
761 label: intl.formatMessage(menuItems.minimize),
762 accelerator: 'Ctrl+M',
763 click(menuItem, browserWindow) {
764 browserWindow.minimize();
765 }, 535 },
766 }, 536 enabled: !locked && window.ferdi.stores.user.isLoggedIn && announcementsStore.areNewsAvailable,
767 {
768 label: intl.formatMessage(menuItems.close),
769 accelerator: 'Ctrl+W',
770 click(menuItem, browserWindow) {
771 browserWindow.close();
772 },
773 },
774 ],
775 },
776 {
777 label: '?',
778 accelerator: 'Alt+?',
779 submenu: [
780 {
781 label: intl.formatMessage(menuItems.learnMore),
782 click() { shell.openExternal(LIVE_API_FERDI_WEBSITE); },
783 },
784 {
785 label: intl.formatMessage(menuItems.changelog),
786 click() { shell.openExternal(`${GITHUB_FERDI_URL}/ferdi/blob/master/CHANGELOG.md`); },
787 }, 537 },
788 { 538 {
789 type: 'separator', 539 type: 'separator',
@@ -831,30 +581,44 @@ export default class FranzMenu {
831 // need to clone object so we don't modify computed (cached) object 581 // need to clone object so we don't modify computed (cached) object
832 const serviceTpl = Object.assign([], this.serviceTpl()); 582 const serviceTpl = Object.assign([], this.serviceTpl());
833 583
834 // Don't initialize when window.franz is undefined or when we are on a payment window route 584 // Don't initialize when window.ferdi is undefined
835 if (window.ferdi === undefined || this.stores.router.location.pathname.startsWith('/payment/')) { 585 if (window.ferdi === undefined) {
836 console.log('skipping menu init'); 586 console.log('skipping menu init');
837 return; 587 return;
838 } 588 }
839 589
840 const { intl } = window.ferdi; 590 const { intl } = window.ferdi;
841 const tpl = isMac 591 const tpl = _titleBarTemplateFactory(intl, this.stores.settings.app.locked);
842 ? _templateFactory(intl, this.stores.settings.app.locked)
843 : _titleBarTemplateFactory(intl, this.stores.settings.app.locked);
844 const { actions } = this; 592 const { actions } = this;
845 593
594 if (!isMac) {
595 tpl[1].submenu.push({
596 label: intl.formatMessage(menuItems.autohideMenuBar),
597 type: 'checkbox',
598 checked: window.ferdi.stores.settings.app.autohideMenuBar,
599 click: () => {
600 window.ferdi.actions.settings.update({
601 type: 'app',
602 data: {
603 autohideMenuBar: !window.ferdi.stores.settings.app.autohideMenuBar,
604 },
605 });
606 },
607 });
608 }
609
846 if (!this.stores.settings.app.locked) { 610 if (!this.stores.settings.app.locked) {
847 tpl[1].submenu.push({ 611 tpl[1].submenu.push({
848 type: 'separator', 612 type: 'separator',
849 }, { 613 }, {
850 label: intl.formatMessage(menuItems.toggleDevTools), 614 label: intl.formatMessage(menuItems.toggleDevTools),
851 accelerator: `${cmdKey}+Alt+I`, 615 accelerator: `${shortcutKey()}+${altKey}+I`,
852 click: (menuItem, browserWindow) => { 616 click: (menuItem, browserWindow) => {
853 browserWindow.webContents.toggleDevTools(); 617 browserWindow.webContents.toggleDevTools();
854 }, 618 },
855 }, { 619 }, {
856 label: intl.formatMessage(menuItems.toggleServiceDevTools), 620 label: intl.formatMessage(menuItems.toggleServiceDevTools),
857 accelerator: `${cmdKey}+Shift+Alt+I`, 621 accelerator: `${shortcutKey()}+${shiftKey}+${altKey}+I`,
858 click: () => { 622 click: () => {
859 this.actions.service.openDevToolsForActiveService(); 623 this.actions.service.openDevToolsForActiveService();
860 }, 624 },
@@ -864,7 +628,7 @@ export default class FranzMenu {
864 if (this.stores.features.features.isTodosEnabled) { 628 if (this.stores.features.features.isTodosEnabled) {
865 tpl[1].submenu.push({ 629 tpl[1].submenu.push({
866 label: intl.formatMessage(menuItems.toggleTodosDevTools), 630 label: intl.formatMessage(menuItems.toggleTodosDevTools),
867 accelerator: `${cmdKey}+Shift+Alt+O`, 631 accelerator: `${shortcutKey()}+${shiftKey}+${altKey}+O`,
868 click: () => { 632 click: () => {
869 const webview = document.querySelector('#todos-panel webview'); 633 const webview = document.querySelector('#todos-panel webview');
870 if (webview) this.actions.todos.openDevTools(); 634 if (webview) this.actions.todos.openDevTools();
@@ -875,7 +639,7 @@ export default class FranzMenu {
875 tpl[1].submenu.unshift({ 639 tpl[1].submenu.unshift({
876 label: intl.formatMessage(menuItems.reloadService), 640 label: intl.formatMessage(menuItems.reloadService),
877 id: 'reloadService', // TODO: needed? 641 id: 'reloadService', // TODO: needed?
878 accelerator: `${cmdKey}+R`, 642 accelerator: `${shortcutKey()}+R`,
879 click: () => { 643 click: () => {
880 if (this.stores.user.isLoggedIn 644 if (this.stores.user.isLoggedIn
881 && this.stores.services.enabled.length > 0) { 645 && this.stores.services.enabled.length > 0) {
@@ -889,14 +653,14 @@ export default class FranzMenu {
889 } 653 }
890 }, 654 },
891 }, { 655 }, {
892 label: intl.formatMessage(menuItems.reloadFranz), 656 label: intl.formatMessage(menuItems.reloadFerdi),
893 accelerator: `${cmdKey}+Shift+R`, 657 accelerator: `${shortcutKey()}+${shiftKey}+R`,
894 click: () => { 658 click: () => {
895 window.location.reload(); 659 window.location.reload();
896 }, 660 },
897 }, { 661 }, {
898 label: intl.formatMessage(menuItems.reloadTodos), 662 label: intl.formatMessage(menuItems.reloadTodos),
899 accelerator: `${cmdKey}+Shift+Alt+R`, 663 accelerator: `${shortcutKey()}+${shiftKey}+${altKey}+R`,
900 click: () => { 664 click: () => {
901 this.actions.todos.reload(); 665 this.actions.todos.reload();
902 }, 666 },
@@ -904,7 +668,7 @@ export default class FranzMenu {
904 type: 'separator', 668 type: 'separator',
905 }, { 669 }, {
906 label: intl.formatMessage(menuItems.lockFerdi), 670 label: intl.formatMessage(menuItems.lockFerdi),
907 accelerator: 'CmdOrCtrl+Shift+L', 671 accelerator: `${lockFerdiShortcutKey()}`,
908 enabled: this.stores.user.isLoggedIn && this.stores.settings.app.lockingFeatureEnabled, 672 enabled: this.stores.user.isLoggedIn && this.stores.settings.app.lockingFeatureEnabled,
909 click() { 673 click() {
910 actions.settings.update({ 674 actions.settings.update({
@@ -932,7 +696,7 @@ export default class FranzMenu {
932 696
933 tpl[0].submenu.unshift({ 697 tpl[0].submenu.unshift({
934 label: intl.formatMessage(menuItems.touchId), 698 label: intl.formatMessage(menuItems.touchId),
935 accelerator: 'CmdOrCtrl+Shift+L', 699 accelerator: `${lockFerdiShortcutKey()}`,
936 visible: touchIdEnabled, 700 visible: touchIdEnabled,
937 click() { 701 click() {
938 systemPreferences.promptTouchID(intl.formatMessage(menuItems.touchIdPrompt)).then(() => { 702 systemPreferences.promptTouchID(intl.formatMessage(menuItems.touchIdPrompt)).then(() => {
@@ -952,7 +716,7 @@ export default class FranzMenu {
952 716
953 tpl.unshift({ 717 tpl.unshift({
954 label: isMac ? app.name : intl.formatMessage(menuItems.file), 718 label: isMac ? app.name : intl.formatMessage(menuItems.file),
955 accelerator: 'Alt+F', 719 accelerator: `${altKey}+F`,
956 submenu: [ 720 submenu: [
957 { 721 {
958 label: intl.formatMessage(menuItems.about), 722 label: intl.formatMessage(menuItems.about),
@@ -963,7 +727,7 @@ export default class FranzMenu {
963 }, 727 },
964 { 728 {
965 label: intl.formatMessage(menuItems.settings), 729 label: intl.formatMessage(menuItems.settings),
966 accelerator: 'CmdOrCtrl+,', 730 accelerator: `${settingsShortcutKey()}`,
967 click: () => { 731 click: () => {
968 this.actions.ui.openSettings({ path: 'app' }); 732 this.actions.ui.openSettings({ path: 'app' });
969 }, 733 },
@@ -995,7 +759,7 @@ export default class FranzMenu {
995 }, 759 },
996 { 760 {
997 label: intl.formatMessage(menuItems.hideOthers), 761 label: intl.formatMessage(menuItems.hideOthers),
998 role: 'hideothers', 762 role: 'hideOthers',
999 }, 763 },
1000 { 764 {
1001 label: intl.formatMessage(menuItems.unhide), 765 label: intl.formatMessage(menuItems.unhide),
@@ -1016,6 +780,7 @@ export default class FranzMenu {
1016 780
1017 const about = { 781 const about = {
1018 label: intl.formatMessage(menuItems.about), 782 label: intl.formatMessage(menuItems.about),
783 role: 'about',
1019 click: () => { 784 click: () => {
1020 dialog.showMessageBox({ 785 dialog.showMessageBox({
1021 type: 'info', 786 type: 'info',
@@ -1054,7 +819,7 @@ export default class FranzMenu {
1054 tpl[0].submenu = [ 819 tpl[0].submenu = [
1055 { 820 {
1056 label: intl.formatMessage(menuItems.settings), 821 label: intl.formatMessage(menuItems.settings),
1057 accelerator: 'Ctrl+P', 822 accelerator: `${settingsShortcutKey()}`,
1058 click: () => { 823 click: () => {
1059 this.actions.ui.openSettings({ path: 'app' }); 824 this.actions.ui.openSettings({ path: 'app' });
1060 }, 825 },
@@ -1067,7 +832,7 @@ export default class FranzMenu {
1067 { 832 {
1068 label: intl.formatMessage(menuItems.quit), 833 label: intl.formatMessage(menuItems.quit),
1069 role: 'quit', 834 role: 'quit',
1070 accelerator: 'Ctrl+Q', 835 accelerator: `${shortcutKey()}+Q`,
1071 click() { 836 click() {
1072 app.quit(); 837 app.quit();
1073 }, 838 },
@@ -1110,7 +875,7 @@ export default class FranzMenu {
1110 875
1111 menu.push({ 876 menu.push({
1112 label: intl.formatMessage(menuItems.addNewService), 877 label: intl.formatMessage(menuItems.addNewService),
1113 accelerator: `${cmdKey}+N`, 878 accelerator: `${addNewServiceShortcutKey()}`,
1114 click: () => { 879 click: () => {
1115 this.actions.ui.openSettings({ path: 'recipes' }); 880 this.actions.ui.openSettings({ path: 'recipes' });
1116 }, 881 },
@@ -1118,29 +883,29 @@ export default class FranzMenu {
1118 type: 'separator', 883 type: 'separator',
1119 }, { 884 }, {
1120 label: intl.formatMessage(menuItems.activateNextService), 885 label: intl.formatMessage(menuItems.activateNextService),
1121 accelerator: `${cmdKey}+tab`, 886 accelerator: `${shortcutKey()}+tab`,
1122 click: () => this.actions.service.setActiveNext(), 887 click: () => this.actions.service.setActiveNext(),
1123 visible: !cmdAltShortcutsVisibile, 888 visible: !cmdAltShortcutsVisibile,
1124 }, { 889 }, {
1125 label: intl.formatMessage(menuItems.activateNextService), 890 label: intl.formatMessage(menuItems.activateNextService),
1126 accelerator: `${cmdKey}+alt+right`, 891 accelerator: `${shortcutKey()}+${altKey}+right`,
1127 click: () => this.actions.service.setActiveNext(), 892 click: () => this.actions.service.setActiveNext(),
1128 visible: cmdAltShortcutsVisibile, 893 visible: cmdAltShortcutsVisibile,
1129 }, { 894 }, {
1130 label: intl.formatMessage(menuItems.activatePreviousService), 895 label: intl.formatMessage(menuItems.activatePreviousService),
1131 accelerator: `${cmdKey}+shift+tab`, 896 accelerator: `${shortcutKey()}+${shiftKey}+tab`,
1132 click: () => this.actions.service.setActivePrev(), 897 click: () => this.actions.service.setActivePrev(),
1133 visible: !cmdAltShortcutsVisibile, 898 visible: !cmdAltShortcutsVisibile,
1134 }, { 899 }, {
1135 label: intl.formatMessage(menuItems.activatePreviousService), 900 label: intl.formatMessage(menuItems.activatePreviousService),
1136 accelerator: `${cmdKey}+alt+left`, 901 accelerator: `${shortcutKey()}+${altKey}+left`,
1137 click: () => this.actions.service.setActivePrev(), 902 click: () => this.actions.service.setActivePrev(),
1138 visible: cmdAltShortcutsVisibile, 903 visible: cmdAltShortcutsVisibile,
1139 }, { 904 }, {
1140 label: intl.formatMessage( 905 label: intl.formatMessage(
1141 settings.all.app.isAppMuted ? menuItems.unmuteApp : menuItems.muteApp, 906 settings.all.app.isAppMuted ? menuItems.unmuteApp : menuItems.muteApp,
1142 ).replace('&', '&&'), 907 ).replace('&', '&&'),
1143 accelerator: `${cmdKey}+shift+m`, 908 accelerator: `${muteFerdiShortcutKey()}`,
1144 click: () => this.actions.app.toggleMuteApp(), 909 click: () => this.actions.app.toggleMuteApp(),
1145 }, { 910 }, {
1146 type: 'separator', 911 type: 'separator',
@@ -1148,7 +913,7 @@ export default class FranzMenu {
1148 913
1149 services.allDisplayed.forEach((service, i) => (menu.push({ 914 services.allDisplayed.forEach((service, i) => (menu.push({
1150 label: this._getServiceName(service), 915 label: this._getServiceName(service),
1151 accelerator: i < 9 ? `${cmdKey}+${i + 1}` : null, 916 accelerator: i < 9 ? `${shortcutKey()}+${i + 1}` : null,
1152 type: 'radio', 917 type: 'radio',
1153 checked: service.isActive, 918 checked: service.isActive,
1154 click: () => { 919 click: () => {
@@ -1165,7 +930,7 @@ export default class FranzMenu {
1165 type: 'separator', 930 type: 'separator',
1166 }, { 931 }, {
1167 label: intl.formatMessage(menuItems.serviceGoHome), 932 label: intl.formatMessage(menuItems.serviceGoHome),
1168 accelerator: `${cmdKey}+shift+H`, 933 accelerator: `${shortcutKey()}+${shiftKey}+H`,
1169 click: () => this.actions.service.reloadActive(), 934 click: () => this.actions.service.reloadActive(),
1170 }); 935 });
1171 } 936 }
@@ -1181,7 +946,7 @@ export default class FranzMenu {
1181 // Add new workspace item: 946 // Add new workspace item:
1182 menu.push({ 947 menu.push({
1183 label: intl.formatMessage(menuItems.addNewWorkspace), 948 label: intl.formatMessage(menuItems.addNewWorkspace),
1184 accelerator: `${cmdKey}+Shift+N`, 949 accelerator: `${shortcutKey()}+${shiftKey}+N`,
1185 click: () => { 950 click: () => {
1186 workspaceActions.openWorkspaceSettings(); 951 workspaceActions.openWorkspaceSettings();
1187 }, 952 },
@@ -1195,7 +960,7 @@ export default class FranzMenu {
1195 ); 960 );
1196 menu.push({ 961 menu.push({
1197 label: intl.formatMessage(drawerLabel), 962 label: intl.formatMessage(drawerLabel),
1198 accelerator: `${cmdKey}+D`, 963 accelerator: `${workspaceToggleShortcutKey()}`,
1199 click: () => { 964 click: () => {
1200 workspaceActions.toggleWorkspaceDrawer(); 965 workspaceActions.toggleWorkspaceDrawer();
1201 }, 966 },
@@ -1210,7 +975,7 @@ export default class FranzMenu {
1210 // Default workspace 975 // Default workspace
1211 menu.push({ 976 menu.push({
1212 label: intl.formatMessage(menuItems.defaultWorkspace), 977 label: intl.formatMessage(menuItems.defaultWorkspace),
1213 accelerator: `${cmdKey}+Alt+0`, 978 accelerator: `${shortcutKey()}+${altKey}+0`,
1214 type: 'radio', 979 type: 'radio',
1215 checked: !activeWorkspace, 980 checked: !activeWorkspace,
1216 click: () => { 981 click: () => {
@@ -1219,17 +984,15 @@ export default class FranzMenu {
1219 }); 984 });
1220 985
1221 // Workspace items 986 // Workspace items
1222 if (this.stores.user.isPremium) { 987 workspaces.forEach((workspace, i) => menu.push({
1223 workspaces.forEach((workspace, i) => menu.push({ 988 label: workspace.name,
1224 label: workspace.name, 989 accelerator: i < 9 ? `${shortcutKey()}+${altKey}+${i + 1}` : null,
1225 accelerator: i < 9 ? `${cmdKey}+Alt+${i + 1}` : null, 990 type: 'radio',
1226 type: 'radio', 991 checked: activeWorkspace ? workspace.id === activeWorkspace.id : false,
1227 checked: activeWorkspace ? workspace.id === activeWorkspace.id : false, 992 click: () => {
1228 click: () => { 993 workspaceActions.activate({ workspace });
1229 workspaceActions.activate({ workspace }); 994 },
1230 }, 995 }));
1231 }));
1232 }
1233 996
1234 return menu; 997 return menu;
1235 } 998 }
@@ -1243,7 +1006,7 @@ export default class FranzMenu {
1243 1006
1244 menu.push({ 1007 menu.push({
1245 label: intl.formatMessage(drawerLabel), 1008 label: intl.formatMessage(drawerLabel),
1246 accelerator: `${cmdKey}+T`, 1009 accelerator: `${todosToggleShortcutKey()}`,
1247 click: () => { 1010 click: () => {
1248 todoActions.toggleTodosPanel(); 1011 todoActions.toggleTodosPanel();
1249 }, 1012 },
diff --git a/src/lib/TouchBar.js b/src/lib/TouchBar.js
index 781cd0895..3397afdb2 100644
--- a/src/lib/TouchBar.js
+++ b/src/lib/TouchBar.js
@@ -23,10 +23,6 @@ export default class FranzTouchBar {
23 _build() { 23 _build() {
24 const currentWindow = getCurrentWindow(); 24 const currentWindow = getCurrentWindow();
25 25
26 if (this.stores.router.location.pathname.startsWith('/payment/')) {
27 return;
28 }
29
30 if (this.stores.user.isLoggedIn) { 26 if (this.stores.user.isLoggedIn) {
31 const { TouchBarButton, TouchBarSpacer } = TouchBar; 27 const { TouchBarButton, TouchBarSpacer } = TouchBar;
32 28
diff --git a/src/lib/Tray.js b/src/lib/Tray.js
index f37b4eb7b..f5970f7e7 100644
--- a/src/lib/Tray.js
+++ b/src/lib/Tray.js
@@ -1,7 +1,7 @@
1import { 1import {
2 app, Menu, nativeImage, nativeTheme, systemPreferences, Tray, ipcMain, 2 app, Menu, nativeImage, nativeTheme, systemPreferences, Tray, ipcMain,
3} from 'electron'; 3} from 'electron';
4import path from 'path'; 4import { join } from 'path';
5import macosVersion from 'macos-version'; 5import macosVersion from 'macos-version';
6import { isMac, isWindows, isLinux } from '../environment'; 6import { isMac, isWindows, isLinux } from '../environment';
7 7
@@ -174,7 +174,7 @@ export default class TrayIcon {
174 platform = `${platform}-dark`; 174 platform = `${platform}-dark`;
175 } 175 }
176 176
177 return nativeImage.createFromPath(path.join( 177 return nativeImage.createFromPath(join(
178 __dirname, '..', 'assets', 'images', type, platform, `${asset}.${FILE_EXTENSION}`, 178 __dirname, '..', 'assets', 'images', type, platform, `${asset}.${FILE_EXTENSION}`,
179 )); 179 ));
180 } 180 }
diff --git a/src/models/Plan.js b/src/models/Plan.js
deleted file mode 100644
index 3dedf0d5e..000000000
--- a/src/models/Plan.js
+++ /dev/null
@@ -1,17 +0,0 @@
1// @flow
2
3export default class Plan {
4 month = {
5 id: '',
6 price: 0,
7 }
8
9 year = {
10 id: '',
11 price: 0,
12 }
13
14 constructor(data) {
15 Object.assign(this, data);
16 }
17}
diff --git a/src/models/Recipe.js b/src/models/Recipe.js
index 4db056f26..0d97d4472 100644
--- a/src/models/Recipe.js
+++ b/src/models/Recipe.js
@@ -1,9 +1,9 @@
1import emailParser from 'address-rfc2822';
2import semver from 'semver'; 1import semver from 'semver';
3import fs from 'fs-extra'; 2import { pathExistsSync } from 'fs-extra';
4import path from 'path'; 3import { join } from 'path';
5 4
6export default class Recipe { 5export default class Recipe {
6 // Note: Do NOT change these default values. If they change, then the corresponding changes in the recipes needs to be done
7 id = ''; 7 id = '';
8 8
9 name = ''; 9 name = '';
@@ -12,6 +12,8 @@ export default class Recipe {
12 12
13 version = ''; 13 version = '';
14 14
15 aliases = [];
16
15 path = ''; 17 path = '';
16 18
17 serviceURL = ''; 19 serviceURL = '';
@@ -60,9 +62,8 @@ export default class Recipe {
60 62
61 this.id = data.id || this.id; 63 this.id = data.id || this.id;
62 this.name = data.name || this.name; 64 this.name = data.name || this.name;
63 this.rawAuthor = data.author || this.author;
64 this.description = data.description || this.description;
65 this.version = data.version || this.version; 65 this.version = data.version || this.version;
66 this.aliases = data.aliases || this.aliases;
66 this.path = data.path; 67 this.path = data.path;
67 68
68 this.serviceURL = data.config.serviceURL || this.serviceURL; 69 this.serviceURL = data.config.serviceURL || this.serviceURL;
@@ -86,18 +87,12 @@ export default class Recipe {
86 this.message = data.config.message || this.message; 87 this.message = data.config.message || this.message;
87 } 88 }
88 89
90 // TODO: Need to remove this if its not used anywhere
89 get author() { 91 get author() {
90 try {
91 const addresses = emailParser.parse(this.rawAuthor);
92 return addresses.map(a => ({ email: a.address, name: a.phrase }));
93 } catch (err) {
94 console.warn(`Not a valid author for ${this.name}`);
95 }
96
97 return []; 92 return [];
98 } 93 }
99 94
100 get hasDarkMode() { 95 get hasDarkMode() {
101 return fs.pathExistsSync(path.join(this.path, 'darkmode.css')); 96 return pathExistsSync(join(this.path, 'darkmode.css'));
102 } 97 }
103} 98}
diff --git a/src/models/RecipePreview.js b/src/models/RecipePreview.js
index cfb22f860..6a9ce3080 100644
--- a/src/models/RecipePreview.js
+++ b/src/models/RecipePreview.js
@@ -7,9 +7,10 @@ export default class RecipePreview {
7 7
8 icon = ''; 8 icon = '';
9 9
10 // TODO: check if this isn't replaced by `icons`
11 featured = false; 10 featured = false;
12 11
12 aliases = [];
13
13 constructor(data) { 14 constructor(data) {
14 if (!data.id) { 15 if (!data.id) {
15 throw Error('RecipePreview requires Id'); 16 throw Error('RecipePreview requires Id');
diff --git a/src/models/Service.js b/src/models/Service.js
index 5656295da..fe56e5a76 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -2,7 +2,7 @@ import { autorun, computed, observable } from 'mobx';
2import { ipcRenderer } from 'electron'; 2import { ipcRenderer } from 'electron';
3import { webContents } from '@electron/remote'; 3import { webContents } from '@electron/remote';
4import normalizeUrl from 'normalize-url'; 4import normalizeUrl from 'normalize-url';
5import path from 'path'; 5import { join } from 'path';
6 6
7import { todosStore } from '../features/todos'; 7import { todosStore } from '../features/todos';
8import { isValidExternalURL } from '../helpers/url-helpers'; 8import { isValidExternalURL } from '../helpers/url-helpers';
@@ -10,11 +10,6 @@ import UserAgent from './UserAgent';
10 10
11const debug = require('debug')('Ferdi:Service'); 11const debug = require('debug')('Ferdi:Service');
12 12
13export const RESTRICTION_TYPES = {
14 SERVICE_LIMIT: 0,
15 CUSTOM_URL: 1,
16};
17
18export default class Service { 13export default class Service {
19 id = ''; 14 id = '';
20 15
@@ -42,8 +37,6 @@ export default class Service {
42 37
43 @observable isMuted = false; 38 @observable isMuted = false;
44 39
45 @observable isHibernating = false;
46
47 @observable team = ''; 40 @observable team = '';
48 41
49 @observable customUrl = ''; 42 @observable customUrl = '';
@@ -82,10 +75,12 @@ export default class Service {
82 75
83 @observable isHibernationEnabled = false; 76 @observable isHibernationEnabled = false;
84 77
85 @observable isHibernating = false; 78 @observable isHibernationRequested = false;
86 79
87 @observable lastUsed = Date.now(); // timestamp 80 @observable lastUsed = Date.now(); // timestamp
88 81
82 @observable lastHibernated = null; // timestamp
83
89 @observable lastPoll = Date.now(); 84 @observable lastPoll = Date.now();
90 85
91 @observable lastPollAnswer = Date.now(); 86 @observable lastPollAnswer = Date.now();
@@ -150,14 +145,11 @@ export default class Service {
150 this.recipe = recipe; 145 this.recipe = recipe;
151 146
152 // Check if "Hibernate on Startup" is enabled and hibernate all services except active one 147 // Check if "Hibernate on Startup" is enabled and hibernate all services except active one
153 const { 148 const { hibernateOnStartup } = window.ferdi.stores.settings.app;
154 hibernate,
155 hibernateOnStartup,
156 } = window.ferdi.stores.settings.app;
157 // The service store is probably not loaded yet so we need to use localStorage data to get active service 149 // The service store is probably not loaded yet so we need to use localStorage data to get active service
158 const isActive = window.localStorage.service && JSON.parse(window.localStorage.service).activeService === this.id; 150 const isActive = window.localStorage.service && JSON.parse(window.localStorage.service).activeService === this.id;
159 if (hibernate && hibernateOnStartup && !isActive) { 151 if (hibernateOnStartup && !isActive) {
160 this.isHibernating = true; 152 this.isHibernationRequested = true;
161 } 153 }
162 154
163 autorun(() => { 155 autorun(() => {
@@ -190,6 +182,14 @@ export default class Service {
190 return this.recipe.id === todosStore.todoRecipeId; 182 return this.recipe.id === todosStore.todoRecipeId;
191 } 183 }
192 184
185 @computed get canHibernate() {
186 return this.isHibernationEnabled;
187 }
188
189 @computed get isHibernating() {
190 return this.canHibernate && this.isHibernationRequested;
191 }
192
193 get webview() { 193 get webview() {
194 if (this.isTodosService) { 194 if (this.isTodosService) {
195 return todosStore.webview; 195 return todosStore.webview;
@@ -230,7 +230,7 @@ export default class Service {
230 return this.iconUrl; 230 return this.iconUrl;
231 } 231 }
232 232
233 return path.join(this.recipe.path, 'icon.svg'); 233 return join(this.recipe.path, 'icon.svg');
234 } 234 }
235 235
236 @computed get hasCustomIcon() { 236 @computed get hasCustomIcon() {
@@ -275,11 +275,17 @@ export default class Service {
275 debug(this.name, 'modifyRequestHeaders is not defined in the recipe'); 275 debug(this.name, 'modifyRequestHeaders is not defined in the recipe');
276 } 276 }
277 277
278 this.webview.addEventListener('ipc-message', e => handleIPCMessage({ 278 this.webview.addEventListener('ipc-message', async (e) => {
279 serviceId: this.id, 279 if (e.channel === 'inject-js-unsafe') {
280 channel: e.channel, 280 await Promise.all(e.args.map((script) => this.webview.executeJavaScript(`"use strict"; (() => { ${script} })();`)));
281 args: e.args, 281 } else {
282 })); 282 handleIPCMessage({
283 serviceId: this.id,
284 channel: e.channel,
285 args: e.args,
286 });
287 }
288 });
283 289
284 this.webview.addEventListener('new-window', (event, url, frameName, options) => { 290 this.webview.addEventListener('new-window', (event, url, frameName, options) => {
285 debug('new-window', event, url, frameName, options); 291 debug('new-window', event, url, frameName, options);
@@ -334,6 +340,11 @@ export default class Service {
334 this.hasCrashed = true; 340 this.hasCrashed = true;
335 }); 341 });
336 342
343 this.webview.addEventListener('found-in-page', ({ result }) => {
344 debug('Found in page', result);
345 this.webview.send('found-in-page', result);
346 });
347
337 webviewWebContents.on('login', (event, request, authInfo, callback) => { 348 webviewWebContents.on('login', (event, request, authInfo, callback) => {
338 // const authCallback = callback; 349 // const authCallback = callback;
339 debug('browser login event', authInfo); 350 debug('browser login event', authInfo);
diff --git a/src/models/User.js b/src/models/User.js
index 74a39926b..d864dde0c 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -24,8 +24,6 @@ export default class User {
24 24
25 @observable hadSubscription = false; 25 @observable hadSubscription = false;
26 26
27 @observable isPremium = true;
28
29 @observable beta = false; 27 @observable beta = false;
30 28
31 @observable donor = {}; 29 @observable donor = {};
@@ -49,7 +47,6 @@ export default class User {
49 this.lastname = data.lastname || this.lastname; 47 this.lastname = data.lastname || this.lastname;
50 this.organization = data.organization || this.organization; 48 this.organization = data.organization || this.organization;
51 this.accountType = data.accountType || this.accountType; 49 this.accountType = data.accountType || this.accountType;
52 this.isPremium = true;
53 this.beta = data.beta || this.beta; 50 this.beta = data.beta || this.beta;
54 this.donor = data.donor || this.donor; 51 this.donor = data.donor || this.donor;
55 this.isDonor = data.isDonor || this.isDonor; 52 this.isDonor = data.isDonor || this.isDonor;
diff --git a/src/models/UserAgent.js b/src/models/UserAgent.js
index 6f91d4ed0..930ae19ef 100644
--- a/src/models/UserAgent.js
+++ b/src/models/UserAgent.js
@@ -95,10 +95,10 @@ export default class UserAgent {
95 _addWebviewEvents(webview) { 95 _addWebviewEvents(webview) {
96 debug('Adding event handlers'); 96 debug('Adding event handlers');
97 97
98 this._willNavigateListener = event => this._handleNavigate(event.url, true); 98 this._willNavigateListener = (event) => this._handleNavigate(event.url, true);
99 webview.addEventListener('will-navigate', this._willNavigateListener); 99 webview.addEventListener('will-navigate', this._willNavigateListener);
100 100
101 this._didNavigateListener = event => this._handleNavigate(event.url); 101 this._didNavigateListener = (event) => this._handleNavigate(event.url);
102 webview.addEventListener('did-navigate', this._didNavigateListener); 102 webview.addEventListener('did-navigate', this._didNavigateListener);
103 } 103 }
104 104
diff --git a/src/routes.js b/src/routes.js
index 5017ed837..d67ccee13 100644
--- a/src/routes.js
+++ b/src/routes.js
@@ -23,11 +23,9 @@ import PasswordScreen from './containers/auth/PasswordScreen';
23import ChangeServerScreen from './containers/auth/ChangeServerScreen'; 23import ChangeServerScreen from './containers/auth/ChangeServerScreen';
24import SignupScreen from './containers/auth/SignupScreen'; 24import SignupScreen from './containers/auth/SignupScreen';
25import ImportScreen from './containers/auth/ImportScreen'; 25import ImportScreen from './containers/auth/ImportScreen';
26import PricingScreen from './containers/auth/PricingScreen';
27import SetupAssistentScreen from './containers/auth/SetupAssistantScreen'; 26import SetupAssistentScreen from './containers/auth/SetupAssistantScreen';
28import InviteScreen from './containers/auth/InviteScreen'; 27import InviteScreen from './containers/auth/InviteScreen';
29import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; 28import AuthLayoutContainer from './containers/auth/AuthLayoutContainer';
30import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen';
31import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen'; 29import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen';
32import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen'; 30import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen';
33import { WORKSPACES_ROUTES } from './features/workspaces/constants'; 31import { WORKSPACES_ROUTES } from './features/workspaces/constants';
@@ -79,7 +77,6 @@ export default @inject('stores', 'actions') @observer class Routes extends Compo
79 <Route path="/auth/signup"> 77 <Route path="/auth/signup">
80 <IndexRedirect to="/auth/signup/form" /> 78 <IndexRedirect to="/auth/signup/form" />
81 <Route path="/auth/signup/form" component={SignupScreen} /> 79 <Route path="/auth/signup/form" component={SignupScreen} />
82 <Route path="/auth/signup/pricing" component={PricingScreen} />
83 <Route path="/auth/signup/import" component={ImportScreen} /> 80 <Route path="/auth/signup/import" component={ImportScreen} />
84 <Route path="/auth/signup/setup" component={SetupAssistentScreen} /> 81 <Route path="/auth/signup/setup" component={SetupAssistentScreen} />
85 <Route path="/auth/signup/invite" component={InviteScreen} /> 82 <Route path="/auth/signup/invite" component={InviteScreen} />
@@ -87,7 +84,6 @@ export default @inject('stores', 'actions') @observer class Routes extends Compo
87 <Route path="/auth/password" component={PasswordScreen} /> 84 <Route path="/auth/password" component={PasswordScreen} />
88 <Route path="/auth/logout" component={LoginScreen} /> 85 <Route path="/auth/logout" component={LoginScreen} />
89 </Route> 86 </Route>
90 <Route path="/payment/:url" component={SubscriptionPopupScreen} />
91 <Route path="*" component={AppLayoutContainer} /> 87 <Route path="*" component={AppLayoutContainer} />
92 </Router> 88 </Router>
93 ); 89 );
diff --git a/src/scripts/add-crowdin-contributors.js b/src/scripts/add-crowdin-contributors.js
index efe981b6e..ed29a0daf 100644
--- a/src/scripts/add-crowdin-contributors.js
+++ b/src/scripts/add-crowdin-contributors.js
@@ -58,7 +58,7 @@ const fs = require('fs-extra');
58const path = require('path'); 58const path = require('path');
59const allContributors = require('all-contributors-cli'); 59const allContributors = require('all-contributors-cli');
60 60
61const infoPath = path.join(__dirname, '../../.all-contributorsrc'); 61const infoPath = path.join(__dirname, '..', '..', '.all-contributorsrc');
62 62
63(async () => { 63(async () => {
64 const info = await fs.readJSON(infoPath); 64 const info = await fs.readJSON(infoPath);
diff --git a/src/scripts/build-theme-info.js b/src/scripts/build-theme-info.js
index cff33e3c4..4058be942 100644
--- a/src/scripts/build-theme-info.js
+++ b/src/scripts/build-theme-info.js
@@ -15,8 +15,8 @@ const accentColors = [
15 '#5e50ee', 15 '#5e50ee',
16]; 16];
17 17
18const cssFile = path.join(__dirname, '../../', 'build', 'styles', 'main.css'); 18const cssFile = path.join(__dirname, '..', '..', 'build', 'styles', 'main.css');
19const outputFile = path.join(__dirname, '../', 'assets', 'themeInfo.json'); 19const outputFile = path.join(__dirname, '..', 'assets', 'themeInfo.json');
20 20
21// Parse and extract the rules from a CSS stylesheet file 21// Parse and extract the rules from a CSS stylesheet file
22async function getRulesFromCssFile(file) { 22async function getRulesFromCssFile(file) {
diff --git a/src/scripts/link-readme.js b/src/scripts/link-readme.js
index 694b89700..1e47cddf8 100644
--- a/src/scripts/link-readme.js
+++ b/src/scripts/link-readme.js
@@ -11,7 +11,7 @@ const path = require('path');
11 11
12console.log('Linking issues and PRs in README.md'); 12console.log('Linking issues and PRs in README.md');
13 13
14const readmepath = path.join(__dirname, '../../', 'README.md'); 14const readmepath = path.join(__dirname, '..', '..', 'README.md');
15 15
16// Read README.md 16// Read README.md
17let readme = fs.readFileSync(readmepath, 'utf-8'); 17let readme = fs.readFileSync(readmepath, 'utf-8');
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index bbb5e6305..1d706f1ef 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -1,26 +1,38 @@
1import { ipcRenderer, shell } from 'electron'; 1import { ipcRenderer, shell } from 'electron';
2import { 2import {
3 app, screen, powerMonitor, nativeTheme, getCurrentWindow, process as remoteProcess, 3 app,
4 screen,
5 powerMonitor,
6 nativeTheme,
7 getCurrentWindow,
8 process as remoteProcess,
4} from '@electron/remote'; 9} from '@electron/remote';
5import { action, computed, observable } from 'mobx'; 10import { action, computed, observable } from 'mobx';
6import moment from 'moment'; 11import moment from 'moment';
7import AutoLaunch from 'auto-launch'; 12import AutoLaunch from 'auto-launch';
8import ms from 'ms'; 13import ms from 'ms';
9import { URL } from 'url'; 14import { URL } from 'url';
10import path from 'path';
11import { readJsonSync } from 'fs-extra'; 15import { readJsonSync } from 'fs-extra';
12 16
13import Store from './lib/Store'; 17import Store from './lib/Store';
14import Request from './lib/Request'; 18import Request from './lib/Request';
15import { CHECK_INTERVAL } from '../config'; 19import { CHECK_INTERVAL } from '../config';
16import { 20import {
17 DEFAULT_APP_SETTINGS, isMac, ferdiVersion, electronVersion, osRelease, 21 DEFAULT_APP_SETTINGS,
22 isMac,
23 ferdiVersion,
24 electronVersion,
25 osRelease,
26 userDataPath,
18} from '../environment'; 27} from '../environment';
19import locales from '../i18n/translations'; 28import locales from '../i18n/translations';
20import { onVisibilityChange } from '../helpers/visibility-helper'; 29import { onVisibilityChange } from '../helpers/visibility-helper';
21import { getLocale } from '../helpers/i18n-helpers'; 30import { getLocale } from '../helpers/i18n-helpers';
22 31
23import { getServiceIdsFromPartitions, removeServicePartitionDirectory } from '../helpers/service-helpers.js'; 32import {
33 getServiceIdsFromPartitions,
34 removeServicePartitionDirectory,
35} from '../helpers/service-helpers';
24import { isValidExternalURL } from '../helpers/url-helpers'; 36import { isValidExternalURL } from '../helpers/url-helpers';
25import { sleep } from '../helpers/async-helpers'; 37import { sleep } from '../helpers/async-helpers';
26 38
@@ -49,7 +61,10 @@ export default class AppStore extends Store {
49 61
50 @observable healthCheckRequest = new Request(this.api.app, 'health'); 62 @observable healthCheckRequest = new Request(this.api.app, 'health');
51 63
52 @observable getAppCacheSizeRequest = new Request(this.api.local, 'getAppCacheSize'); 64 @observable getAppCacheSizeRequest = new Request(
65 this.api.local,
66 'getAppCacheSize',
67 );
53 68
54 @observable clearAppCacheRequest = new Request(this.api.local, 'clearCache'); 69 @observable clearAppCacheRequest = new Request(this.api.local, 'clearCache');
55 70
@@ -93,7 +108,9 @@ export default class AppStore extends Store {
93 this.actions.app.openExternalUrl.listen(this._openExternalUrl.bind(this)); 108 this.actions.app.openExternalUrl.listen(this._openExternalUrl.bind(this));
94 this.actions.app.checkForUpdates.listen(this._checkForUpdates.bind(this)); 109 this.actions.app.checkForUpdates.listen(this._checkForUpdates.bind(this));
95 this.actions.app.installUpdate.listen(this._installUpdate.bind(this)); 110 this.actions.app.installUpdate.listen(this._installUpdate.bind(this));
96 this.actions.app.resetUpdateStatus.listen(this._resetUpdateStatus.bind(this)); 111 this.actions.app.resetUpdateStatus.listen(
112 this._resetUpdateStatus.bind(this),
113 );
97 this.actions.app.healthCheck.listen(this._healthCheck.bind(this)); 114 this.actions.app.healthCheck.listen(this._healthCheck.bind(this));
98 this.actions.app.muteApp.listen(this._muteApp.bind(this)); 115 this.actions.app.muteApp.listen(this._muteApp.bind(this));
99 this.actions.app.toggleMuteApp.listen(this._toggleMuteApp.bind(this)); 116 this.actions.app.toggleMuteApp.listen(this._toggleMuteApp.bind(this));
@@ -183,9 +200,7 @@ export default class AppStore extends Store {
183 // Handle deep linking (ferdi://) 200 // Handle deep linking (ferdi://)
184 ipcRenderer.on('navigateFromDeepLink', (event, data) => { 201 ipcRenderer.on('navigateFromDeepLink', (event, data) => {
185 debug('Navigate from deep link', data); 202 debug('Navigate from deep link', data);
186 let { 203 let { url } = data;
187 url,
188 } = data;
189 if (!url) return; 204 if (!url) return;
190 205
191 url = url.replace(/\/$/, ''); 206 url = url.replace(/\/$/, '');
@@ -221,7 +236,10 @@ export default class AppStore extends Store {
221 debug('System resumed, last suspended on', this.timeSuspensionStart); 236 debug('System resumed, last suspended on', this.timeSuspensionStart);
222 this.actions.service.resetLastPollTimer(); 237 this.actions.service.resetLastPollTimer();
223 238
224 if (this.timeSuspensionStart.add(10, 'm').isBefore(moment()) && this.stores.settings.app.get('reloadAfterResume')) { 239 if (
240 this.timeSuspensionStart.add(10, 'm').isBefore(moment())
241 && this.stores.settings.app.get('reloadAfterResume')
242 ) {
225 debug('Reloading services, user info and features'); 243 debug('Reloading services, user info and features');
226 244
227 setInterval(() => { 245 setInterval(() => {
@@ -266,15 +284,15 @@ export default class AppStore extends Store {
266 ferdi: { 284 ferdi: {
267 version: ferdiVersion, 285 version: ferdiVersion,
268 electron: electronVersion, 286 electron: electronVersion,
269 installedRecipes: this.stores.recipes.all.map(recipe => ({ 287 installedRecipes: this.stores.recipes.all.map((recipe) => ({
270 id: recipe.id, 288 id: recipe.id,
271 version: recipe.version, 289 version: recipe.version,
272 })), 290 })),
273 devRecipes: this.stores.recipePreviews.dev.map(recipe => ({ 291 devRecipes: this.stores.recipePreviews.dev.map((recipe) => ({
274 id: recipe.id, 292 id: recipe.id,
275 version: recipe.version, 293 version: recipe.version,
276 })), 294 })),
277 services: this.stores.services.all.map(service => ({ 295 services: this.stores.services.all.map((service) => ({
278 id: service.id, 296 id: service.id,
279 recipe: service.recipe.id, 297 recipe: service.recipe.id,
280 isAttached: service.isAttached, 298 isAttached: service.isAttached,
@@ -285,11 +303,11 @@ export default class AppStore extends Store {
285 isDarkModeEnabled: service.isDarkModeEnabled, 303 isDarkModeEnabled: service.isDarkModeEnabled,
286 })), 304 })),
287 messages: this.stores.globalError.messages, 305 messages: this.stores.globalError.messages,
288 workspaces: this.stores.workspaces.workspaces.map(workspace => ({ 306 workspaces: this.stores.workspaces.workspaces.map((workspace) => ({
289 id: workspace.id, 307 id: workspace.id,
290 services: workspace.services, 308 services: workspace.services,
291 })), 309 })),
292 windowSettings: readJsonSync(path.join(app.getPath('userData'), 'window-state.json')), 310 windowSettings: readJsonSync(userDataPath('window-state.json')),
293 settings, 311 settings,
294 features: this.stores.features.features, 312 features: this.stores.features.features,
295 user: this.stores.user.data.id, 313 user: this.stores.user.data.id,
@@ -299,10 +317,7 @@ export default class AppStore extends Store {
299 317
300 // Actions 318 // Actions
301 @action _notify({ 319 @action _notify({
302 title, 320 title, options, notificationId, serviceId = null,
303 options,
304 notificationId,
305 serviceId = null,
306 }) { 321 }) {
307 if (this.stores.settings.all.app.isAppMuted) return; 322 if (this.stores.settings.all.app.isAppMuted) return;
308 323
@@ -339,15 +354,15 @@ export default class AppStore extends Store {
339 }; 354 };
340 } 355 }
341 356
342 @action _setBadge({ 357 @action _setBadge({ unreadDirectMessageCount, unreadIndirectMessageCount }) {
343 unreadDirectMessageCount,
344 unreadIndirectMessageCount,
345 }) {
346 let indicator = unreadDirectMessageCount; 358 let indicator = unreadDirectMessageCount;
347 359
348 if (indicator === 0 && unreadIndirectMessageCount !== 0) { 360 if (indicator === 0 && unreadIndirectMessageCount !== 0) {
349 indicator = '•'; 361 indicator = '•';
350 } else if (unreadDirectMessageCount === 0 && unreadIndirectMessageCount === 0) { 362 } else if (
363 unreadDirectMessageCount === 0
364 && unreadIndirectMessageCount === 0
365 ) {
351 indicator = 0; 366 indicator = 0;
352 } else { 367 } else {
353 indicator = parseInt(indicator, 10); 368 indicator = parseInt(indicator, 10);
@@ -358,9 +373,7 @@ export default class AppStore extends Store {
358 }); 373 });
359 } 374 }
360 375
361 @action _launchOnStartup({ 376 @action _launchOnStartup({ enable }) {
362 enable,
363 }) {
364 this.autoLaunchOnStart = enable; 377 this.autoLaunchOnStart = enable;
365 378
366 try { 379 try {
@@ -376,9 +389,7 @@ export default class AppStore extends Store {
376 } 389 }
377 } 390 }
378 391
379 @action _openExternalUrl({ 392 @action _openExternalUrl({ url }) {
380 url,
381 }) {
382 const parsedUrl = new URL(url); 393 const parsedUrl = new URL(url);
383 debug('open external url', parsedUrl); 394 debug('open external url', parsedUrl);
384 395
@@ -414,10 +425,7 @@ export default class AppStore extends Store {
414 this.healthCheckRequest.execute(); 425 this.healthCheckRequest.execute();
415 } 426 }
416 427
417 @action _muteApp({ 428 @action _muteApp({ isMuted, overrideSystemMute = true }) {
418 isMuted,
419 overrideSystemMute = true,
420 }) {
421 this.isSystemMuteOverridden = overrideSystemMute; 429 this.isSystemMuteOverridden = overrideSystemMute;
422 this.actions.settings.update({ 430 this.actions.settings.update({
423 type: 'app', 431 type: 'app',
@@ -437,16 +445,24 @@ export default class AppStore extends Store {
437 this.isClearingAllCache = true; 445 this.isClearingAllCache = true;
438 const clearAppCache = this.clearAppCacheRequest.execute(); 446 const clearAppCache = this.clearAppCacheRequest.execute();
439 const allServiceIds = await getServiceIdsFromPartitions(); 447 const allServiceIds = await getServiceIdsFromPartitions();
440 const allOrphanedServiceIds = allServiceIds.filter(id => !this.stores.services.all.find(s => id.replace('service-', '') === s.id)); 448 const allOrphanedServiceIds = allServiceIds.filter(
449 (id) => !this.stores.services.all.find(
450 (s) => id.replace('service-', '') === s.id,
451 ),
452 );
441 453
442 try { 454 try {
443 await Promise.all(allOrphanedServiceIds.map(id => removeServicePartitionDirectory(id))); 455 await Promise.all(
456 allOrphanedServiceIds.map((id) => removeServicePartitionDirectory(id)),
457 );
444 } catch (ex) { 458 } catch (ex) {
445 console.log('Error while deleting service partition directory - ', ex); 459 console.log('Error while deleting service partition directory - ', ex);
446 } 460 }
447 await Promise.all(this.stores.services.all.map(s => this.actions.service.clearCache({ 461 await Promise.all(
448 serviceId: s.id, 462 this.stores.services.all.map((s) => this.actions.service.clearCache({
449 }))); 463 serviceId: s.id,
464 })),
465 );
450 466
451 await clearAppCache._promise; 467 await clearAppCache._promise;
452 468
@@ -476,7 +492,11 @@ export default class AppStore extends Store {
476 locale = this.stores.user.data.locale; 492 locale = this.stores.user.data.locale;
477 } 493 }
478 494
479 if (locale && Object.prototype.hasOwnProperty.call(locales, locale) && locale !== this.locale) { 495 if (
496 locale
497 && Object.prototype.hasOwnProperty.call(locales, locale)
498 && locale !== this.locale
499 ) {
480 this.locale = locale; 500 this.locale = locale;
481 } else if (!locale) { 501 } else if (!locale) {
482 this.locale = this._getDefaultLocale(); 502 this.locale = this._getDefaultLocale();
@@ -553,7 +573,10 @@ export default class AppStore extends Store {
553 const dnd = await ipcRenderer.invoke('get-dnd'); 573 const dnd = await ipcRenderer.invoke('get-dnd');
554 debug('Do not disturb mode is', dnd); 574 debug('Do not disturb mode is', dnd);
555 // ipcRenderer.on('autoUpdate', (event, data) => { 575 // ipcRenderer.on('autoUpdate', (event, data) => {
556 if (dnd !== this.stores.settings.all.app.isAppMuted && !this.isSystemMuteOverridden) { 576 if (
577 dnd !== this.stores.settings.all.app.isAppMuted
578 && !this.isSystemMuteOverridden
579 ) {
557 this.actions.app.muteApp({ 580 this.actions.app.muteApp({
558 isMuted: dnd, 581 isMuted: dnd,
559 overrideSystemMute: false, 582 overrideSystemMute: false,
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index 2fee9bdda..ac623c258 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -1,15 +1,12 @@
1import { 1import {
2 computed, 2 computed,
3 observable, 3 observable,
4 reaction,
5 runInAction, 4 runInAction,
6} from 'mobx'; 5} from 'mobx';
7 6
8import Store from './lib/Store'; 7import Store from './lib/Store';
9import CachedRequest from './lib/CachedRequest'; 8import CachedRequest from './lib/CachedRequest';
10 9
11import delayApp from '../features/delayApp';
12import spellchecker from '../features/spellchecker';
13import serviceProxy from '../features/serviceProxy'; 10import serviceProxy from '../features/serviceProxy';
14import basicAuth from '../features/basicAuth'; 11import basicAuth from '../features/basicAuth';
15import workspaces from '../features/workspaces'; 12import workspaces from '../features/workspaces';
@@ -19,12 +16,9 @@ import publishDebugInfo from '../features/publishDebugInfo';
19import shareFranz from '../features/shareFranz'; 16import shareFranz from '../features/shareFranz';
20import announcements from '../features/announcements'; 17import announcements from '../features/announcements';
21import settingsWS from '../features/settingsWS'; 18import settingsWS from '../features/settingsWS';
22import serviceLimit from '../features/serviceLimit';
23import communityRecipes from '../features/communityRecipes'; 19import communityRecipes from '../features/communityRecipes';
24import todos from '../features/todos'; 20import todos from '../features/todos';
25import appearance from '../features/appearance'; 21import appearance from '../features/appearance';
26import planSelection from '../features/planSelection';
27import trialStatusBar from '../features/trialStatusBar';
28 22
29import { DEFAULT_FEATURES_CONFIG } from '../config'; 23import { DEFAULT_FEATURES_CONFIG } from '../config';
30 24
@@ -43,13 +37,6 @@ export default class FeaturesStore extends Store {
43 37
44 await this.featuresRequest._promise; 38 await this.featuresRequest._promise;
45 setTimeout(this._setupFeatures.bind(this), 1); 39 setTimeout(this._setupFeatures.bind(this), 1);
46
47 // single key reaction
48 reaction(() => this.stores.user.data.isPremium, () => {
49 if (this.stores.user.isLoggedIn) {
50 this.featuresRequest.invalidate({ immediately: true });
51 }
52 });
53 } 40 }
54 41
55 @computed get anonymousFeatures() { 42 @computed get anonymousFeatures() {
@@ -80,8 +67,6 @@ export default class FeaturesStore extends Store {
80 } 67 }
81 68
82 _setupFeatures() { 69 _setupFeatures() {
83 delayApp(this.stores, this.actions);
84 spellchecker(this.stores, this.actions);
85 serviceProxy(this.stores, this.actions); 70 serviceProxy(this.stores, this.actions);
86 basicAuth(this.stores, this.actions); 71 basicAuth(this.stores, this.actions);
87 workspaces(this.stores, this.actions); 72 workspaces(this.stores, this.actions);
@@ -91,11 +76,8 @@ export default class FeaturesStore extends Store {
91 shareFranz(this.stores, this.actions); 76 shareFranz(this.stores, this.actions);
92 announcements(this.stores, this.actions); 77 announcements(this.stores, this.actions);
93 settingsWS(this.stores, this.actions); 78 settingsWS(this.stores, this.actions);
94 serviceLimit(this.stores, this.actions);
95 communityRecipes(this.stores, this.actions); 79 communityRecipes(this.stores, this.actions);
96 todos(this.stores, this.actions); 80 todos(this.stores, this.actions);
97 appearance(this.stores, this.actions); 81 appearance(this.stores, this.actions);
98 planSelection(this.stores, this.actions);
99 trialStatusBar(this.stores, this.actions);
100 } 82 }
101} 83}
diff --git a/src/stores/NewsStore.js b/src/stores/NewsStore.js
index 86e092592..66a17cb29 100644
--- a/src/stores/NewsStore.js
+++ b/src/stores/NewsStore.js
@@ -38,7 +38,7 @@ export default class NewsStore extends Store {
38 38
39 this.latestNewsRequest.invalidate().patch((result) => { 39 this.latestNewsRequest.invalidate().patch((result) => {
40 // TODO: check if we can use mobx.array remove 40 // TODO: check if we can use mobx.array remove
41 remove(result, n => n.id === newsId); 41 remove(result, (n) => n.id === newsId);
42 }); 42 });
43 } 43 }
44 44
diff --git a/src/stores/PaymentStore.js b/src/stores/PaymentStore.js
deleted file mode 100644
index 05bb5b3d0..000000000
--- a/src/stores/PaymentStore.js
+++ /dev/null
@@ -1,68 +0,0 @@
1import { action, observable, computed } from 'mobx';
2import { BrowserWindow, getCurrentWindow } from '@electron/remote';
3
4import Store from './lib/Store';
5import CachedRequest from './lib/CachedRequest';
6import Request from './lib/Request';
7
8export default class PaymentStore extends Store {
9 @observable plansRequest = new CachedRequest(this.api.payment, 'plans');
10
11 @observable createHostedPageRequest = new Request(this.api.payment, 'getHostedPage');
12
13 constructor(...args) {
14 super(...args);
15
16 this.actions.payment.createHostedPage.listen(this._createHostedPage.bind(this));
17 this.actions.payment.upgradeAccount.listen(this._upgradeAccount.bind(this));
18 }
19
20 @computed get plan() {
21 if (this.plansRequest.isError) {
22 return {};
23 }
24 return this.plansRequest.execute().result || {};
25 }
26
27 @action _createHostedPage({ planId }) {
28 const request = this.createHostedPageRequest.execute(planId);
29
30 return request;
31 }
32
33 @action _upgradeAccount({ planId, onCloseWindow = () => null }) {
34 let hostedPageURL = this.stores.features.features.subscribeURL;
35
36 const parsedUrl = new URL(hostedPageURL);
37 const params = new URLSearchParams(parsedUrl.search.slice(1));
38
39 params.set('plan', planId);
40
41 hostedPageURL = this.stores.user.getAuthURL(`${parsedUrl.origin}${parsedUrl.pathname}?${params.toString()}`);
42
43 const win = new BrowserWindow({
44 parent: getCurrentWindow(),
45 modal: true,
46 title: '🔒 Upgrade Your Franz Account',
47 width: 800,
48 height: window.innerHeight - 100,
49 maxWidth: 800,
50 minWidth: 600,
51 autoHideMenuBar: true,
52 webPreferences: {
53 nodeIntegration: true,
54 webviewTag: true,
55 enableRemoteModule: true,
56 contextIsolation: false,
57 },
58 });
59 win.loadURL(`file://${__dirname}/../index.html#/payment/${encodeURIComponent(hostedPageURL)}`);
60
61 win.on('closed', () => {
62 this.stores.user.getUserInfoRequest.invalidate({ immediately: true });
63 this.stores.features.featuresRequest.invalidate({ immediately: true });
64
65 onCloseWindow();
66 });
67 }
68}
diff --git a/src/stores/RecipePreviewsStore.js b/src/stores/RecipePreviewsStore.js
index 989e1124a..f4e39306c 100644
--- a/src/stores/RecipePreviewsStore.js
+++ b/src/stores/RecipePreviewsStore.js
@@ -7,8 +7,6 @@ import Request from './lib/Request';
7export default class RecipePreviewsStore extends Store { 7export default class RecipePreviewsStore extends Store {
8 @observable allRecipePreviewsRequest = new CachedRequest(this.api.recipePreviews, 'all'); 8 @observable allRecipePreviewsRequest = new CachedRequest(this.api.recipePreviews, 'all');
9 9
10 @observable featuredRecipePreviewsRequest = new CachedRequest(this.api.recipePreviews, 'featured');
11
12 @observable searchRecipePreviewsRequest = new Request(this.api.recipePreviews, 'search'); 10 @observable searchRecipePreviewsRequest = new Request(this.api.recipePreviews, 'search');
13 11
14 constructor(...args) { 12 constructor(...args) {
@@ -22,16 +20,12 @@ export default class RecipePreviewsStore extends Store {
22 return this.allRecipePreviewsRequest.execute().result || []; 20 return this.allRecipePreviewsRequest.execute().result || [];
23 } 21 }
24 22
25 @computed get featured() {
26 return this.featuredRecipePreviewsRequest.execute().result || [];
27 }
28
29 @computed get searchResults() { 23 @computed get searchResults() {
30 return this.searchRecipePreviewsRequest.result || []; 24 return this.searchRecipePreviewsRequest.result || [];
31 } 25 }
32 26
33 @computed get dev() { 27 @computed get dev() {
34 return this.stores.recipes.all.filter(r => r.local); 28 return this.stores.recipes.all.filter((r) => r.local);
35 } 29 }
36 30
37 // Actions 31 // Actions
diff --git a/src/stores/RecipesStore.js b/src/stores/RecipesStore.js
index b49fb72d9..d2acebb75 100644
--- a/src/stores/RecipesStore.js
+++ b/src/stores/RecipesStore.js
@@ -1,13 +1,12 @@
1import { action, computed, observable } from 'mobx'; 1import { action, computed, observable } from 'mobx';
2import fs from 'fs-extra'; 2import { readJSONSync } from 'fs-extra';
3import path from 'path';
4import semver from 'semver'; 3import semver from 'semver';
5 4
6import Store from './lib/Store'; 5import Store from './lib/Store';
7import CachedRequest from './lib/CachedRequest'; 6import CachedRequest from './lib/CachedRequest';
8import Request from './lib/Request'; 7import Request from './lib/Request';
9import { matchRoute } from '../helpers/routing-helpers'; 8import { matchRoute } from '../helpers/routing-helpers';
10import { RECIPES_PATH } from '../environment'; 9import { asarRecipesPath } from '../environment';
11 10
12const debug = require('debug')('Ferdi:RecipeStore'); 11const debug = require('debug')('Ferdi:RecipeStore');
13 12
@@ -54,11 +53,11 @@ export default class RecipesStore extends Store {
54 } 53 }
55 54
56 @computed get recipeIdForServices() { 55 @computed get recipeIdForServices() {
57 return this.stores.services.all.map(s => s.recipe.id); 56 return this.stores.services.all.map((s) => s.recipe.id);
58 } 57 }
59 58
60 one(id) { 59 one(id) {
61 return this.all.find(recipe => recipe.id === id); 60 return this.all.find((recipe) => recipe.id === id);
62 } 61 }
63 62
64 isInstalled(id) { 63 isInstalled(id) {
@@ -78,7 +77,7 @@ export default class RecipesStore extends Store {
78 const recipes = {}; 77 const recipes = {};
79 78
80 // Hackfix, reference this.all to fetch services 79 // Hackfix, reference this.all to fetch services
81 debug(`Check Recipe updates for ${this.all.map(recipe => recipe.id)}`); 80 debug(`Check Recipe updates for ${this.all.map((recipe) => recipe.id)}`);
82 81
83 recipeIds.forEach((r) => { 82 recipeIds.forEach((r) => {
84 const recipe = this.one(r); 83 const recipe = this.one(r);
@@ -90,15 +89,15 @@ export default class RecipesStore extends Store {
90 const remoteUpdates = await this.getRecipeUpdatesRequest.execute(recipes)._promise; 89 const remoteUpdates = await this.getRecipeUpdatesRequest.execute(recipes)._promise;
91 90
92 // Check for local updates 91 // Check for local updates
93 const allJsonFile = path.join(RECIPES_PATH, 'all.json'); 92 const allJsonFile = asarRecipesPath('all.json');
94 const allJson = await fs.readJSON(allJsonFile); 93 const allJson = readJSONSync(allJsonFile);
95 const localUpdates = []; 94 const localUpdates = [];
96 95
97 Object.keys(recipes).forEach((recipe) => { 96 Object.keys(recipes).forEach((recipe) => {
98 const version = recipes[recipe]; 97 const version = recipes[recipe];
99 98
100 // Find recipe in local recipe repository 99 // Find recipe in local recipe repository
101 const localRecipe = allJson.find(r => r.id === recipe); 100 const localRecipe = allJson.find((r) => r.id === recipe);
102 101
103 if (localRecipe && semver.lt(version, localRecipe.version)) { 102 if (localRecipe && semver.lt(version, localRecipe.version)) {
104 localUpdates.push(recipe); 103 localUpdates.push(recipe);
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 9b69cb7c6..4ccb995ae 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -1,25 +1,21 @@
1import { shell } from 'electron'; 1import { shell } from 'electron';
2import { 2import { action, reaction, computed, observable } from 'mobx';
3 action,
4 reaction,
5 computed,
6 observable,
7} from 'mobx';
8import { debounce, remove } from 'lodash'; 3import { debounce, remove } from 'lodash';
9import ms from 'ms'; 4import ms from 'ms';
10import { app } from '@electron/remote'; 5import { app } from '@electron/remote';
11import fs from 'fs-extra'; 6import { ensureFileSync, pathExistsSync, writeFileSync } from 'fs-extra';
12import path from 'path'; 7import { join } from 'path';
13 8
14import Store from './lib/Store'; 9import Store from './lib/Store';
15import Request from './lib/Request'; 10import Request from './lib/Request';
16import CachedRequest from './lib/CachedRequest'; 11import CachedRequest from './lib/CachedRequest';
17import { matchRoute } from '../helpers/routing-helpers'; 12import { matchRoute } from '../helpers/routing-helpers';
18import { isInTimeframe } from '../helpers/schedule-helpers'; 13import { isInTimeframe } from '../helpers/schedule-helpers';
19import { getRecipeDirectory, getDevRecipeDirectory } from '../helpers/recipe-helpers'; 14import {
15 getRecipeDirectory,
16 getDevRecipeDirectory,
17} from '../helpers/recipe-helpers';
20import { workspaceStore } from '../features/workspaces'; 18import { workspaceStore } from '../features/workspaces';
21import { serviceLimitStore } from '../features/serviceLimit';
22import { RESTRICTION_TYPES } from '../models/Service';
23import { KEEP_WS_LOADED_USID } from '../config'; 19import { KEEP_WS_LOADED_USID } from '../config';
24import { SPELLCHECKER_LOCALES } from '../i18n/languages'; 20import { SPELLCHECKER_LOCALES } from '../i18n/languages';
25 21
@@ -32,7 +28,10 @@ export default class ServicesStore extends Store {
32 28
33 @observable updateServiceRequest = new Request(this.api.services, 'update'); 29 @observable updateServiceRequest = new Request(this.api.services, 'update');
34 30
35 @observable reorderServicesRequest = new Request(this.api.services, 'reorder'); 31 @observable reorderServicesRequest = new Request(
32 this.api.services,
33 'reorder',
34 );
36 35
37 @observable deleteServiceRequest = new Request(this.api.services, 'delete'); 36 @observable deleteServiceRequest = new Request(this.api.services, 'delete');
38 37
@@ -53,22 +52,36 @@ export default class ServicesStore extends Store {
53 this.actions.service.blurActive.listen(this._blurActive.bind(this)); 52 this.actions.service.blurActive.listen(this._blurActive.bind(this));
54 this.actions.service.setActiveNext.listen(this._setActiveNext.bind(this)); 53 this.actions.service.setActiveNext.listen(this._setActiveNext.bind(this));
55 this.actions.service.setActivePrev.listen(this._setActivePrev.bind(this)); 54 this.actions.service.setActivePrev.listen(this._setActivePrev.bind(this));
56 this.actions.service.showAddServiceInterface.listen(this._showAddServiceInterface.bind(this)); 55 this.actions.service.showAddServiceInterface.listen(
56 this._showAddServiceInterface.bind(this),
57 );
57 this.actions.service.createService.listen(this._createService.bind(this)); 58 this.actions.service.createService.listen(this._createService.bind(this));
58 this.actions.service.createFromLegacyService.listen(this._createFromLegacyService.bind(this)); 59 this.actions.service.createFromLegacyService.listen(
60 this._createFromLegacyService.bind(this),
61 );
59 this.actions.service.updateService.listen(this._updateService.bind(this)); 62 this.actions.service.updateService.listen(this._updateService.bind(this));
60 this.actions.service.deleteService.listen(this._deleteService.bind(this)); 63 this.actions.service.deleteService.listen(this._deleteService.bind(this));
61 this.actions.service.openRecipeFile.listen(this._openRecipeFile.bind(this)); 64 this.actions.service.openRecipeFile.listen(this._openRecipeFile.bind(this));
62 this.actions.service.clearCache.listen(this._clearCache.bind(this)); 65 this.actions.service.clearCache.listen(this._clearCache.bind(this));
63 this.actions.service.setWebviewReference.listen(this._setWebviewReference.bind(this)); 66 this.actions.service.setWebviewReference.listen(
67 this._setWebviewReference.bind(this),
68 );
64 this.actions.service.detachService.listen(this._detachService.bind(this)); 69 this.actions.service.detachService.listen(this._detachService.bind(this));
65 this.actions.service.focusService.listen(this._focusService.bind(this)); 70 this.actions.service.focusService.listen(this._focusService.bind(this));
66 this.actions.service.focusActiveService.listen(this._focusActiveService.bind(this)); 71 this.actions.service.focusActiveService.listen(
72 this._focusActiveService.bind(this),
73 );
67 this.actions.service.toggleService.listen(this._toggleService.bind(this)); 74 this.actions.service.toggleService.listen(this._toggleService.bind(this));
68 this.actions.service.handleIPCMessage.listen(this._handleIPCMessage.bind(this)); 75 this.actions.service.handleIPCMessage.listen(
76 this._handleIPCMessage.bind(this),
77 );
69 this.actions.service.sendIPCMessage.listen(this._sendIPCMessage.bind(this)); 78 this.actions.service.sendIPCMessage.listen(this._sendIPCMessage.bind(this));
70 this.actions.service.sendIPCMessageToAllServices.listen(this._sendIPCMessageToAllServices.bind(this)); 79 this.actions.service.sendIPCMessageToAllServices.listen(
71 this.actions.service.setUnreadMessageCount.listen(this._setUnreadMessageCount.bind(this)); 80 this._sendIPCMessageToAllServices.bind(this),
81 );
82 this.actions.service.setUnreadMessageCount.listen(
83 this._setUnreadMessageCount.bind(this),
84 );
72 this.actions.service.openWindow.listen(this._openWindow.bind(this)); 85 this.actions.service.openWindow.listen(this._openWindow.bind(this));
73 this.actions.service.filter.listen(this._filter.bind(this)); 86 this.actions.service.filter.listen(this._filter.bind(this));
74 this.actions.service.resetFilter.listen(this._resetFilter.bind(this)); 87 this.actions.service.resetFilter.listen(this._resetFilter.bind(this));
@@ -76,16 +89,27 @@ export default class ServicesStore extends Store {
76 this.actions.service.reload.listen(this._reload.bind(this)); 89 this.actions.service.reload.listen(this._reload.bind(this));
77 this.actions.service.reloadActive.listen(this._reloadActive.bind(this)); 90 this.actions.service.reloadActive.listen(this._reloadActive.bind(this));
78 this.actions.service.reloadAll.listen(this._reloadAll.bind(this)); 91 this.actions.service.reloadAll.listen(this._reloadAll.bind(this));
79 this.actions.service.reloadUpdatedServices.listen(this._reloadUpdatedServices.bind(this)); 92 this.actions.service.reloadUpdatedServices.listen(
93 this._reloadUpdatedServices.bind(this),
94 );
80 this.actions.service.reorder.listen(this._reorder.bind(this)); 95 this.actions.service.reorder.listen(this._reorder.bind(this));
81 this.actions.service.toggleNotifications.listen(this._toggleNotifications.bind(this)); 96 this.actions.service.toggleNotifications.listen(
97 this._toggleNotifications.bind(this),
98 );
82 this.actions.service.toggleAudio.listen(this._toggleAudio.bind(this)); 99 this.actions.service.toggleAudio.listen(this._toggleAudio.bind(this));
100 this.actions.service.toggleDarkMode.listen(this._toggleDarkMode.bind(this));
83 this.actions.service.openDevTools.listen(this._openDevTools.bind(this)); 101 this.actions.service.openDevTools.listen(this._openDevTools.bind(this));
84 this.actions.service.openDevToolsForActiveService.listen(this._openDevToolsForActiveService.bind(this)); 102 this.actions.service.openDevToolsForActiveService.listen(
103 this._openDevToolsForActiveService.bind(this),
104 );
85 this.actions.service.hibernate.listen(this._hibernate.bind(this)); 105 this.actions.service.hibernate.listen(this._hibernate.bind(this));
86 this.actions.service.awake.listen(this._awake.bind(this)); 106 this.actions.service.awake.listen(this._awake.bind(this));
87 this.actions.service.resetLastPollTimer.listen(this._resetLastPollTimer.bind(this)); 107 this.actions.service.resetLastPollTimer.listen(
88 this.actions.service.shareSettingsWithServiceProcess.listen(this._shareSettingsWithServiceProcess.bind(this)); 108 this._resetLastPollTimer.bind(this),
109 );
110 this.actions.service.shareSettingsWithServiceProcess.listen(
111 this._shareSettingsWithServiceProcess.bind(this),
112 );
89 113
90 this.registerReactions([ 114 this.registerReactions([
91 this._focusServiceReaction.bind(this), 115 this._focusServiceReaction.bind(this),
@@ -94,7 +118,6 @@ export default class ServicesStore extends Store {
94 this._saveActiveService.bind(this), 118 this._saveActiveService.bind(this),
95 this._logoutReaction.bind(this), 119 this._logoutReaction.bind(this),
96 this._handleMuteSettings.bind(this), 120 this._handleMuteSettings.bind(this),
97 this._restrictServiceAccess.bind(this),
98 this._checkForActiveService.bind(this), 121 this._checkForActiveService.bind(this),
99 ]); 122 ]);
100 123
@@ -167,18 +190,42 @@ export default class ServicesStore extends Store {
167 * Run various maintenance tasks on services 190 * Run various maintenance tasks on services
168 */ 191 */
169 _serviceMaintenance() { 192 _serviceMaintenance() {
170 this.all.forEach((service) => { 193 this.all.forEach(service => {
171 // Defines which services should be hibernated. 194 // Defines which services should be hibernated or woken up
172 if (!service.isActive && (Date.now() - service.lastUsed > ms('5m'))) { 195 if (!service.isActive) {
173 // If service is stale for 5 min, hibernate it. 196 if (
174 this._hibernate({ serviceId: service.id }); 197 !service.lastHibernated &&
198 Date.now() - service.lastUsed >
199 ms(`${this.stores.settings.all.app.hibernationStrategy}s`)
200 ) {
201 // If service is stale, hibernate it.
202 this._hibernate({ serviceId: service.id });
203 }
204
205 if (
206 service.lastHibernated &&
207 Number(this.stores.settings.all.app.wakeUpStrategy) > 0
208 ) {
209 // If service is in hibernation and the wakeup time has elapsed, wake it.
210 if (
211 Date.now() - service.lastHibernated >
212 ms(`${this.stores.settings.all.app.wakeUpStrategy}s`)
213 ) {
214 this._awake({ serviceId: service.id });
215 }
216 }
175 } 217 }
176 218
177 if (service.lastPoll && (service.lastPoll - service.lastPollAnswer > ms('1m'))) { 219 if (
220 service.lastPoll &&
221 service.lastPoll - service.lastPollAnswer > ms('1m')
222 ) {
178 // If service did not reply for more than 1m try to reload. 223 // If service did not reply for more than 1m try to reload.
179 if (!service.isActive) { 224 if (!service.isActive) {
180 if (this.stores.app.isOnline && service.lostRecipeReloadAttempt < 3) { 225 if (this.stores.app.isOnline && service.lostRecipeReloadAttempt < 3) {
181 debug(`Reloading service: ${service.name} (${service.id}). Attempt: ${service.lostRecipeReloadAttempt}`); 226 debug(
227 `Reloading service: ${service.name} (${service.id}). Attempt: ${service.lostRecipeReloadAttempt}`,
228 );
182 // service.webview.reload(); 229 // service.webview.reload();
183 service.lostRecipeReloadAttempt += 1; 230 service.lostRecipeReloadAttempt += 1;
184 231
@@ -200,10 +247,16 @@ export default class ServicesStore extends Store {
200 if (this.stores.user.isLoggedIn) { 247 if (this.stores.user.isLoggedIn) {
201 const services = this.allServicesRequest.execute().result; 248 const services = this.allServicesRequest.execute().result;
202 if (services) { 249 if (services) {
203 return observable(services.slice().slice().sort((a, b) => a.order - b.order).map((s, index) => { 250 return observable(
204 s.index = index; 251 services
205 return s; 252 .slice()
206 })); 253 .slice()
254 .sort((a, b) => a.order - b.order)
255 .map((s, index) => {
256 s.index = index;
257 return s;
258 }),
259 );
207 } 260 }
208 } 261 }
209 return []; 262 return [];
@@ -214,7 +267,9 @@ export default class ServicesStore extends Store {
214 } 267 }
215 268
216 @computed get allDisplayed() { 269 @computed get allDisplayed() {
217 const services = this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled; 270 const services = this.stores.settings.all.app.showDisabledServices
271 ? this.all
272 : this.enabled;
218 return workspaceStore.filterServicesByActiveWorkspace(services); 273 return workspaceStore.filterServicesByActiveWorkspace(services);
219 } 274 }
220 275
@@ -223,7 +278,9 @@ export default class ServicesStore extends Store {
223 const { showDisabledServices } = this.stores.settings.all.app; 278 const { showDisabledServices } = this.stores.settings.all.app;
224 const { keepAllWorkspacesLoaded } = this.stores.workspaces.settings; 279 const { keepAllWorkspacesLoaded } = this.stores.workspaces.settings;
225 const services = this.allServicesRequest.execute().result || []; 280 const services = this.allServicesRequest.execute().result || [];
226 const filteredServices = showDisabledServices ? services : services.filter(service => service.isEnabled); 281 const filteredServices = showDisabledServices
282 ? services
283 : services.filter(service => service.isEnabled);
227 284
228 let displayedServices; 285 let displayedServices;
229 if (keepAllWorkspacesLoaded) { 286 if (keepAllWorkspacesLoaded) {
@@ -231,32 +288,38 @@ export default class ServicesStore extends Store {
231 displayedServices = filteredServices; 288 displayedServices = filteredServices;
232 } else { 289 } else {
233 // Keep all services in current workspace loaded 290 // Keep all services in current workspace loaded
234 displayedServices = workspaceStore.filterServicesByActiveWorkspace(filteredServices); 291 displayedServices =
292 workspaceStore.filterServicesByActiveWorkspace(filteredServices);
235 293
236 // Keep all services active in workspaces that should be kept loaded 294 // Keep all services active in workspaces that should be kept loaded
237 for (const workspace of this.stores.workspaces.workspaces) { 295 for (const workspace of this.stores.workspaces.workspaces) {
238 // Check if workspace needs to be kept loaded 296 // Check if workspace needs to be kept loaded
239 if (workspace.services.includes(KEEP_WS_LOADED_USID)) { 297 if (workspace.services.includes(KEEP_WS_LOADED_USID)) {
240 // Get services for workspace 298 // Get services for workspace
241 const serviceIDs = workspace.services.filter(i => i !== KEEP_WS_LOADED_USID); 299 const serviceIDs = workspace.services.filter(
242 const wsServices = filteredServices.filter(service => serviceIDs.includes(service.id)); 300 i => i !== KEEP_WS_LOADED_USID,
243 301 );
244 displayedServices = [ 302 const wsServices = filteredServices.filter(service =>
245 ...displayedServices, 303 serviceIDs.includes(service.id),
246 ...wsServices, 304 );
247 ]; 305
306 displayedServices = [...displayedServices, ...wsServices];
248 } 307 }
249 } 308 }
250 309
251 // Make sure every service is in the list only once 310 // Make sure every service is in the list only once
252 displayedServices = displayedServices.filter((v, i, a) => a.indexOf(v) === i); 311 displayedServices = displayedServices.filter(
312 (v, i, a) => a.indexOf(v) === i,
313 );
253 } 314 }
254 315
255 return displayedServices; 316 return displayedServices;
256 } 317 }
257 318
258 @computed get filtered() { 319 @computed get filtered() {
259 return this.all.filter(service => service.name.toLowerCase().includes(this.filterNeedle.toLowerCase())); 320 return this.all.filter(service =>
321 service.name.toLowerCase().includes(this.filterNeedle.toLowerCase()),
322 );
260 } 323 }
261 324
262 @computed get active() { 325 @computed get active() {
@@ -264,7 +327,10 @@ export default class ServicesStore extends Store {
264 } 327 }
265 328
266 @computed get activeSettings() { 329 @computed get activeSettings() {
267 const match = matchRoute('/settings/services/edit/:id', this.stores.router.location.pathname); 330 const match = matchRoute(
331 '/settings/services/edit/:id',
332 this.stores.router.location.pathname,
333 );
268 if (match) { 334 if (match) {
269 const activeService = this.one(match.id); 335 const activeService = this.one(match.id);
270 if (activeService) { 336 if (activeService) {
@@ -278,7 +344,11 @@ export default class ServicesStore extends Store {
278 } 344 }
279 345
280 @computed get isTodosServiceAdded() { 346 @computed get isTodosServiceAdded() {
281 return this.allDisplayed.find(service => service.isTodosService && service.isEnabled) || false; 347 return (
348 this.allDisplayed.find(
349 service => service.isTodosService && service.isEnabled,
350 ) || false
351 );
282 } 352 }
283 353
284 @computed get isTodosServiceActive() { 354 @computed get isTodosServiceActive() {
@@ -295,10 +365,11 @@ export default class ServicesStore extends Store {
295 365
296 // Actions 366 // Actions
297 async _createService({ 367 async _createService({
298 recipeId, serviceData, redirect = true, skipCleanup = false, 368 recipeId,
369 serviceData,
370 redirect = true,
371 skipCleanup = false,
299 }) { 372 }) {
300 if (serviceLimitStore.userHasReachedServiceLimit) return;
301
302 if (!this.stores.recipes.isInstalled(recipeId)) { 373 if (!this.stores.recipes.isInstalled(recipeId)) {
303 debug(`Recipe "${recipeId}" is not installed, installing recipe`); 374 debug(`Recipe "${recipeId}" is not installed, installing recipe`);
304 await this.stores.recipes._install({ recipeId }); 375 await this.stores.recipes._install({ recipeId });
@@ -307,17 +378,21 @@ export default class ServicesStore extends Store {
307 378
308 // set default values for serviceData 379 // set default values for serviceData
309 // eslint-disable-next-line prefer-object-spread 380 // eslint-disable-next-line prefer-object-spread
310 Object.assign({ 381 Object.assign(
311 isEnabled: true, 382 {
312 isHibernationEnabled: false, 383 isEnabled: true,
313 isNotificationEnabled: true, 384 isHibernationEnabled: false,
314 isBadgeEnabled: true, 385 isNotificationEnabled: true,
315 isMuted: false, 386 isBadgeEnabled: true,
316 customIcon: false, 387 isMuted: false,
317 isDarkModeEnabled: false, 388 customIcon: false,
318 spellcheckerLanguage: SPELLCHECKER_LOCALES[this.stores.settings.app.spellcheckerLanguage], 389 isDarkModeEnabled: false,
319 userAgentPref: '', 390 spellcheckerLanguage:
320 }, serviceData); 391 SPELLCHECKER_LOCALES[this.stores.settings.app.spellcheckerLanguage],
392 userAgentPref: '',
393 },
394 serviceData,
395 );
321 396
322 let data = serviceData; 397 let data = serviceData;
323 398
@@ -325,9 +400,10 @@ export default class ServicesStore extends Store {
325 data = this._cleanUpTeamIdAndCustomUrl(recipeId, serviceData); 400 data = this._cleanUpTeamIdAndCustomUrl(recipeId, serviceData);
326 } 401 }
327 402
328 const response = await this.createServiceRequest.execute(recipeId, data)._promise; 403 const response = await this.createServiceRequest.execute(recipeId, data)
404 ._promise;
329 405
330 this.allServicesRequest.patch((result) => { 406 this.allServicesRequest.patch(result => {
331 if (!result) return; 407 if (!result) return;
332 result.push(response.data); 408 result.push(response.data);
333 }); 409 });
@@ -371,7 +447,10 @@ export default class ServicesStore extends Store {
371 447
372 @action async _updateService({ serviceId, serviceData, redirect = true }) { 448 @action async _updateService({ serviceId, serviceData, redirect = true }) {
373 const service = this.one(serviceId); 449 const service = this.one(serviceId);
374 const data = this._cleanUpTeamIdAndCustomUrl(service.recipe.id, serviceData); 450 const data = this._cleanUpTeamIdAndCustomUrl(
451 service.recipe.id,
452 serviceData,
453 );
375 const request = this.updateServiceRequest.execute(serviceId, data); 454 const request = this.updateServiceRequest.execute(serviceId, data);
376 455
377 const newData = serviceData; 456 const newData = serviceData;
@@ -382,7 +461,7 @@ export default class ServicesStore extends Store {
382 newData.hasCustomUploadedIcon = true; 461 newData.hasCustomUploadedIcon = true;
383 } 462 }
384 463
385 this.allServicesRequest.patch((result) => { 464 this.allServicesRequest.patch(result => {
386 if (!result) return; 465 if (!result) return;
387 466
388 // patch custom icon deletion 467 // patch custom icon deletion
@@ -396,7 +475,10 @@ export default class ServicesStore extends Store {
396 newData.iconUrl = data.customIconUrl; 475 newData.iconUrl = data.customIconUrl;
397 } 476 }
398 477
399 Object.assign(result.find(c => c.id === serviceId), newData); 478 Object.assign(
479 result.find(c => c.id === serviceId),
480 newData,
481 );
400 }); 482 });
401 483
402 await request._promise; 484 await request._promise;
@@ -429,7 +511,7 @@ export default class ServicesStore extends Store {
429 this.stores.router.push(redirect); 511 this.stores.router.push(redirect);
430 } 512 }
431 513
432 this.allServicesRequest.patch((result) => { 514 this.allServicesRequest.patch(result => {
433 remove(result, c => c.id === serviceId); 515 remove(result, c => c.id === serviceId);
434 }); 516 });
435 517
@@ -443,9 +525,9 @@ export default class ServicesStore extends Store {
443 const devDirectory = getDevRecipeDirectory(recipe); 525 const devDirectory = getDevRecipeDirectory(recipe);
444 let directory; 526 let directory;
445 527
446 if (await fs.pathExists(normalDirectory)) { 528 if (pathExistsSync(normalDirectory)) {
447 directory = normalDirectory; 529 directory = normalDirectory;
448 } else if (await fs.pathExists(devDirectory)) { 530 } else if (pathExistsSync(devDirectory)) {
449 directory = devDirectory; 531 directory = devDirectory;
450 } else { 532 } else {
451 // Recipe cannot be found on drive 533 // Recipe cannot be found on drive
@@ -453,17 +535,19 @@ export default class ServicesStore extends Store {
453 } 535 }
454 536
455 // Create and open file 537 // Create and open file
456 const filePath = path.join(directory, file); 538 const filePath = join(directory, file);
457 if (file === 'user.js') { 539 if (file === 'user.js') {
458 if (!await fs.exists(filePath)) { 540 if (!pathExistsSync(filePath)) {
459 await fs.writeFile(filePath, `module.exports = (config, Ferdi) => { 541 writeFileSync(
542 filePath,
543 `module.exports = (config, Ferdi) => {
460 // Write your scripts here 544 // Write your scripts here
461 console.log("Hello, World!", config); 545 console.log("Hello, World!", config);
462} 546};
463`); 547`);
464 } 548 }
465 } else { 549 } else {
466 await fs.ensureFile(filePath); 550 ensureFileSync(filePath);
467 } 551 }
468 shell.showItemInFolder(filePath); 552 shell.showItemInFolder(filePath);
469 } 553 }
@@ -474,23 +558,27 @@ export default class ServicesStore extends Store {
474 await request._promise; 558 await request._promise;
475 } 559 }
476 560
477 @action _setActive({ serviceId, keepActiveRoute }) { 561 @action _setActive({ serviceId, keepActiveRoute = null }) {
478 if (!keepActiveRoute) this.stores.router.push('/'); 562 if (!keepActiveRoute) this.stores.router.push('/');
479 const service = this.one(serviceId); 563 const service = this.one(serviceId);
480 564
481 this.all.forEach((s, index) => { 565 this.all.forEach(s => {
482 this.all[index].isActive = false; 566 s.isActive = false;
483 }); 567 });
484 service.isActive = true; 568 service.isActive = true;
485 this._awake({ serviceId: service.id }); 569 this._awake({ serviceId: service.id });
486 service.lastUsed = Date.now();
487 570
488 if (this.isTodosServiceActive && !this.stores.todos.settings.isFeatureEnabledByUser) { 571 if (
572 this.isTodosServiceActive &&
573 !this.stores.todos.settings.isFeatureEnabledByUser
574 ) {
489 this.actions.todos.toggleTodosFeatureVisibility(); 575 this.actions.todos.toggleTodosFeatureVisibility();
490 } 576 }
491 577
492 // Update list of last used services 578 // Update list of last used services
493 this.lastUsedServices = this.lastUsedServices.filter(id => id !== serviceId); 579 this.lastUsedServices = this.lastUsedServices.filter(
580 id => id !== serviceId,
581 );
494 this.lastUsedServices.unshift(serviceId); 582 this.lastUsedServices.unshift(serviceId);
495 583
496 this._focusActiveService(); 584 this._focusActiveService();
@@ -502,7 +590,11 @@ export default class ServicesStore extends Store {
502 } 590 }
503 591
504 @action _setActiveNext() { 592 @action _setActiveNext() {
505 const nextIndex = this._wrapIndex(this.allDisplayed.findIndex(service => service.isActive), 1, this.allDisplayed.length); 593 const nextIndex = this._wrapIndex(
594 this.allDisplayed.findIndex(service => service.isActive),
595 1,
596 this.allDisplayed.length,
597 );
506 598
507 // TODO: simplify this; 599 // TODO: simplify this;
508 this.all.forEach((s, index) => { 600 this.all.forEach((s, index) => {
@@ -512,7 +604,11 @@ export default class ServicesStore extends Store {
512 } 604 }
513 605
514 @action _setActivePrev() { 606 @action _setActivePrev() {
515 const prevIndex = this._wrapIndex(this.allDisplayed.findIndex(service => service.isActive), -1, this.allDisplayed.length); 607 const prevIndex = this._wrapIndex(
608 this.allDisplayed.findIndex(service => service.isActive),
609 -1,
610 this.allDisplayed.length,
611 );
516 612
517 // TODO: simplify this; 613 // TODO: simplify this;
518 this.all.forEach((s, index) => { 614 this.all.forEach((s, index) => {
@@ -603,17 +699,21 @@ export default class ServicesStore extends Store {
603 const { options } = args[0]; 699 const { options } = args[0];
604 700
605 // Check if we are in scheduled Do-not-Disturb time 701 // Check if we are in scheduled Do-not-Disturb time
606 const { 702 const { scheduledDNDEnabled, scheduledDNDStart, scheduledDNDEnd } =
607 scheduledDNDEnabled, 703 this.stores.settings.all.app;
608 scheduledDNDStart,
609 scheduledDNDEnd,
610 } = this.stores.settings.all.app;
611 704
612 if (scheduledDNDEnabled && isInTimeframe(scheduledDNDStart, scheduledDNDEnd)) { 705 if (
706 scheduledDNDEnabled &&
707 isInTimeframe(scheduledDNDStart, scheduledDNDEnd)
708 ) {
613 return; 709 return;
614 } 710 }
615 711
616 if (service.recipe.hasNotificationSound || service.isMuted || this.stores.settings.all.app.isAppMuted) { 712 if (
713 service.recipe.hasNotificationSound ||
714 service.isMuted ||
715 this.stores.settings.all.app.isAppMuted
716 ) {
617 Object.assign(options, { 717 Object.assign(options, {
618 silent: true, 718 silent: true,
619 }); 719 });
@@ -623,7 +723,8 @@ export default class ServicesStore extends Store {
623 let title = `Notification from ${service.name}`; 723 let title = `Notification from ${service.name}`;
624 if (!this.stores.settings.all.app.privateNotifications) { 724 if (!this.stores.settings.all.app.privateNotifications) {
625 options.body = typeof options.body === 'string' ? options.body : ''; 725 options.body = typeof options.body === 'string' ? options.body : '';
626 title = typeof args[0].title === 'string' ? args[0].title : service.name; 726 title =
727 typeof args[0].title === 'string' ? args[0].title : service.name;
627 } else { 728 } else {
628 // Remove message data from notification in private mode 729 // Remove message data from notification in private mode
629 options.body = ''; 730 options.body = '';
@@ -686,11 +787,13 @@ export default class ServicesStore extends Store {
686 } 787 }
687 788
688 @action _sendIPCMessageToAllServices({ channel, args }) { 789 @action _sendIPCMessageToAllServices({ channel, args }) {
689 this.all.forEach(s => this.actions.service.sendIPCMessage({ 790 this.all.forEach(s =>
690 serviceId: s.id, 791 this.actions.service.sendIPCMessage({
691 channel, 792 serviceId: s.id,
692 args, 793 channel,
693 })); 794 args,
795 }),
796 );
694 } 797 }
695 798
696 @action _openWindow({ event }) { 799 @action _openWindow({ event }) {
@@ -737,9 +840,11 @@ export default class ServicesStore extends Store {
737 } 840 }
738 841
739 @action _reloadAll() { 842 @action _reloadAll() {
740 this.enabled.forEach(s => this._reload({ 843 this.enabled.forEach(s =>
741 serviceId: s.id, 844 this._reload({
742 })); 845 serviceId: s.id,
846 }),
847 );
743 } 848 }
744 849
745 @action _reloadUpdatedServices() { 850 @action _reloadUpdatedServices() {
@@ -758,10 +863,18 @@ export default class ServicesStore extends Store {
758 863
759 @action _reorderService({ oldIndex, newIndex }) { 864 @action _reorderService({ oldIndex, newIndex }) {
760 const { showDisabledServices } = this.stores.settings.all.app; 865 const { showDisabledServices } = this.stores.settings.all.app;
761 const oldEnabledSortIndex = showDisabledServices ? oldIndex : this.all.indexOf(this.enabled[oldIndex]); 866 const oldEnabledSortIndex = showDisabledServices
762 const newEnabledSortIndex = showDisabledServices ? newIndex : this.all.indexOf(this.enabled[newIndex]); 867 ? oldIndex
763 868 : this.all.indexOf(this.enabled[oldIndex]);
764 this.all.splice(newEnabledSortIndex, 0, this.all.splice(oldEnabledSortIndex, 1)[0]); 869 const newEnabledSortIndex = showDisabledServices
870 ? newIndex
871 : this.all.indexOf(this.enabled[newIndex]);
872
873 this.all.splice(
874 newEnabledSortIndex,
875 0,
876 this.all.splice(oldEnabledSortIndex, 1)[0],
877 );
765 878
766 const services = {}; 879 const services = {};
767 this.all.forEach((s, index) => { 880 this.all.forEach((s, index) => {
@@ -769,8 +882,8 @@ export default class ServicesStore extends Store {
769 }); 882 });
770 883
771 this.reorderServicesRequest.execute(services); 884 this.reorderServicesRequest.execute(services);
772 this.allServicesRequest.patch((data) => { 885 this.allServicesRequest.patch(data => {
773 data.forEach((s) => { 886 data.forEach(s => {
774 const service = s; 887 const service = s;
775 888
776 service.order = services[s.id]; 889 service.order = services[s.id];
@@ -804,6 +917,18 @@ export default class ServicesStore extends Store {
804 }); 917 });
805 } 918 }
806 919
920 @action _toggleDarkMode({ serviceId }) {
921 const service = this.one(serviceId);
922
923 this.actions.service.updateService({
924 serviceId,
925 serviceData: {
926 isDarkModeEnabled: !service.isDarkModeEnabled,
927 },
928 redirect: false,
929 });
930 }
931
807 @action _openDevTools({ serviceId }) { 932 @action _openDevTools({ serviceId }) {
808 const service = this.one(serviceId); 933 const service = this.one(serviceId);
809 if (service.isTodosService) { 934 if (service.isTodosService) {
@@ -825,26 +950,36 @@ export default class ServicesStore extends Store {
825 950
826 @action _hibernate({ serviceId }) { 951 @action _hibernate({ serviceId }) {
827 const service = this.one(serviceId); 952 const service = this.one(serviceId);
828 if (service.isActive || !service.isHibernationEnabled) { 953 if (!service.canHibernate) {
829 debug('Skipping service hibernation'); 954 return;
955 }
956 if (service.isActive) {
957 debug(`Skipping service hibernation for ${service.name}`);
830 return; 958 return;
831 } 959 }
832 960
833 debug(`Hibernate ${service.name}`); 961 debug(`Hibernate ${service.name}`);
834 962
835 service.isHibernating = true; 963 service.isHibernationRequested = true;
964 service.lastHibernated = Date.now();
836 } 965 }
837 966
838 @action _awake({ serviceId }) { 967 @action _awake({ serviceId }) {
839 const service = this.one(serviceId); 968 const service = this.one(serviceId);
840 service.isHibernating = false; 969 debug(`Waking up from service hibernation for ${service.name}`);
841 service.liveFrom = Date.now(); 970 service.isHibernationRequested = false;
971 service.lastUsed = Date.now();
972 service.lastHibernated = null;
842 } 973 }
843 974
844 @action _resetLastPollTimer({ serviceId = null }) { 975 @action _resetLastPollTimer({ serviceId = null }) {
845 debug(`Reset last poll timer for ${serviceId ? `service: "${serviceId}"` : 'all services'}`); 976 debug(
977 `Reset last poll timer for ${
978 serviceId ? `service: "${serviceId}"` : 'all services'
979 }`,
980 );
846 981
847 const resetTimer = (service) => { 982 const resetTimer = service => {
848 service.lastPollAnswer = Date.now(); 983 service.lastPollAnswer = Date.now();
849 service.lastPoll = Date.now(); 984 service.lastPoll = Date.now();
850 }; 985 };
@@ -884,9 +1019,13 @@ export default class ServicesStore extends Store {
884 _mapActiveServiceToServiceModelReaction() { 1019 _mapActiveServiceToServiceModelReaction() {
885 const { activeService } = this.stores.settings.all.service; 1020 const { activeService } = this.stores.settings.all.service;
886 if (this.allDisplayed.length) { 1021 if (this.allDisplayed.length) {
887 this.allDisplayed.map(service => Object.assign(service, { 1022 this.allDisplayed.map(service =>
888 isActive: activeService ? activeService === service.id : this.allDisplayed[0].id === service.id, 1023 Object.assign(service, {
889 })); 1024 isActive: activeService
1025 ? activeService === service.id
1026 : this.allDisplayed[0].id === service.id,
1027 }),
1028 );
890 } 1029 }
891 } 1030 }
892 1031
@@ -895,12 +1034,23 @@ export default class ServicesStore extends Store {
895 const { showMessageBadgesEvenWhenMuted } = this.stores.ui; 1034 const { showMessageBadgesEvenWhenMuted } = this.stores.ui;
896 1035
897 const unreadDirectMessageCount = this.allDisplayed 1036 const unreadDirectMessageCount = this.allDisplayed
898 .filter(s => (showMessageBadgeWhenMuted || s.isNotificationEnabled) && showMessageBadgesEvenWhenMuted && s.isBadgeEnabled) 1037 .filter(
1038 s =>
1039 (showMessageBadgeWhenMuted || s.isNotificationEnabled) &&
1040 showMessageBadgesEvenWhenMuted &&
1041 s.isBadgeEnabled,
1042 )
899 .map(s => s.unreadDirectMessageCount) 1043 .map(s => s.unreadDirectMessageCount)
900 .reduce((a, b) => a + b, 0); 1044 .reduce((a, b) => a + b, 0);
901 1045
902 const unreadIndirectMessageCount = this.allDisplayed 1046 const unreadIndirectMessageCount = this.allDisplayed
903 .filter(s => (showMessageBadgeWhenMuted && showMessageBadgesEvenWhenMuted) && (s.isBadgeEnabled && s.isIndirectMessageBadgeEnabled)) 1047 .filter(
1048 s =>
1049 showMessageBadgeWhenMuted &&
1050 showMessageBadgesEvenWhenMuted &&
1051 s.isBadgeEnabled &&
1052 s.isIndirectMessageBadgeEnabled,
1053 )
904 .map(s => s.unreadIndirectMessageCount) 1054 .map(s => s.unreadIndirectMessageCount)
905 .reduce((a, b) => a + b, 0); 1055 .reduce((a, b) => a + b, 0);
906 1056
@@ -927,7 +1077,7 @@ export default class ServicesStore extends Store {
927 const { enabled } = this; 1077 const { enabled } = this;
928 const { isAppMuted } = this.stores.settings.app; 1078 const { isAppMuted } = this.stores.settings.app;
929 1079
930 enabled.forEach((service) => { 1080 enabled.forEach(service => {
931 const { isAttached } = service; 1081 const { isAttached } = service;
932 const isMuted = isAppMuted || service.isMuted; 1082 const isMuted = isAppMuted || service.isMuted;
933 1083
@@ -954,48 +1104,30 @@ export default class ServicesStore extends Store {
954 1104
955 if (!recipe) return; 1105 if (!recipe) return;
956 1106
957 if (recipe.hasTeamId && recipe.hasCustomUrl && data.team && data.customUrl) { 1107 if (
1108 recipe.hasTeamId &&
1109 recipe.hasCustomUrl &&
1110 data.team &&
1111 data.customUrl
1112 ) {
958 delete serviceData.team; 1113 delete serviceData.team;
959 } 1114 }
960 1115
961 return serviceData; 1116 return serviceData;
962 } 1117 }
963 1118
964 _restrictServiceAccess() {
965 const { features } = this.stores.features;
966 const { userHasReachedServiceLimit, serviceLimit } = this.stores.serviceLimit;
967
968 this.all.map((service, index) => {
969 if (userHasReachedServiceLimit) {
970 service.isServiceAccessRestricted = index >= serviceLimit;
971
972 if (service.isServiceAccessRestricted) {
973 service.restrictionType = RESTRICTION_TYPES.SERVICE_LIMIT;
974
975 debug('Restricting access to server due to service limit');
976 }
977 }
978
979 if (service.isUsingCustomUrl) {
980 service.isServiceAccessRestricted = !features.isCustomUrlIncludedInCurrentPlan;
981
982 if (service.isServiceAccessRestricted) {
983 service.restrictionType = RESTRICTION_TYPES.CUSTOM_URL;
984
985 debug('Restricting access to server due to custom url');
986 }
987 }
988
989 return service;
990 });
991 }
992
993 _checkForActiveService() { 1119 _checkForActiveService() {
994 if (!this.stores.router.location || this.stores.router.location.pathname.includes('auth/signup')) { 1120 if (
1121 !this.stores.router.location ||
1122 this.stores.router.location.pathname.includes('auth/signup')
1123 ) {
995 return; 1124 return;
996 } 1125 }
997 1126
998 if (this.allDisplayed.findIndex(service => service.isActive) === -1 && this.allDisplayed.length !== 0) { 1127 if (
1128 this.allDisplayed.findIndex(service => service.isActive) === -1 &&
1129 this.allDisplayed.length !== 0
1130 ) {
999 debug('No active service found, setting active service to index 0'); 1131 debug('No active service found, setting active service to index 0');
1000 1132
1001 this._setActive({ serviceId: this.allDisplayed[0].id }); 1133 this._setActive({ serviceId: this.allDisplayed[0].id });
@@ -1008,13 +1140,19 @@ export default class ServicesStore extends Store {
1008 1140
1009 if (service.webview) { 1141 if (service.webview) {
1010 // We need to completely clone the object, otherwise Electron won't be able to send the object via IPC 1142 // We need to completely clone the object, otherwise Electron won't be able to send the object via IPC
1011 const shareWithWebview = JSON.parse(JSON.stringify(service.shareWithWebview)); 1143 const shareWithWebview = JSON.parse(
1144 JSON.stringify(service.shareWithWebview),
1145 );
1012 1146
1013 debug('Initialize recipe', service.recipe.id, service.name); 1147 debug('Initialize recipe', service.recipe.id, service.name);
1014 service.webview.send('initialize-recipe', { 1148 service.webview.send(
1015 ...shareWithWebview, 1149 'initialize-recipe',
1016 franzVersion: app.getVersion(), 1150 {
1017 }, service.recipe); 1151 ...shareWithWebview,
1152 franzVersion: app.getVersion(),
1153 },
1154 service.recipe,
1155 );
1018 } 1156 }
1019 } 1157 }
1020 1158
diff --git a/src/stores/SettingsStore.js b/src/stores/SettingsStore.js
index 292242552..cd627c2b8 100644
--- a/src/stores/SettingsStore.js
+++ b/src/stores/SettingsStore.js
@@ -164,11 +164,24 @@ export default class SettingsStore extends Store {
164 } 164 }
165 } 165 }
166 166
167 _ensureMigrationAndMarkDone(migrationName, callback) {
168 if (!this.all.migration[migrationName]) {
169 callback();
170
171 const data = {};
172 data[migrationName] = true;
173 this.actions.settings.update({
174 type: 'migration',
175 data,
176 });
177 }
178 }
179
167 // Helper 180 // Helper
168 async _migrate() { 181 async _migrate() {
169 const legacySettings = localStorage.getItem('app') || {}; 182 const legacySettings = localStorage.getItem('app') || {};
170 183
171 if (!this.all.migration['5.0.0-beta.17-settings']) { 184 this._ensureMigrationAndMarkDone('5.0.0-beta.17-settings', () => {
172 this.actions.settings.update({ 185 this.actions.settings.update({
173 type: 'app', 186 type: 'app',
174 data: { 187 data: {
@@ -193,19 +206,12 @@ export default class SettingsStore extends Store {
193 }, 206 },
194 }); 207 });
195 208
196 this.actions.settings.update({
197 type: 'migration',
198 data: {
199 '5.0.0-beta.17-settings': true,
200 },
201 });
202
203 localStorage.removeItem('app'); 209 localStorage.removeItem('app');
204 210
205 debug('Migrated settings to split stores'); 211 debug('Migrated settings to split stores');
206 } 212 });
207 213
208 if (!this.all.migration['5.0.0-beta.19-settings']) { 214 this._ensureMigrationAndMarkDone('5.0.0-beta.19-settings', () => {
209 const spellcheckerLanguage = getLocale({ 215 const spellcheckerLanguage = getLocale({
210 locale: this.stores.settings.app.locale, 216 locale: this.stores.settings.app.locale,
211 locales: SPELLCHECKER_LOCALES, 217 locales: SPELLCHECKER_LOCALES,
@@ -219,16 +225,9 @@ export default class SettingsStore extends Store {
219 spellcheckerLanguage, 225 spellcheckerLanguage,
220 }, 226 },
221 }); 227 });
228 });
222 229
223 this.actions.settings.update({ 230 this._ensureMigrationAndMarkDone('5.4.4-beta.2-settings', () => {
224 type: 'migration',
225 data: {
226 '5.0.0-beta.19-settings': true,
227 },
228 });
229 }
230
231 if (!this.all.migration['5.4.4-beta.2-settings']) {
232 const { 231 const {
233 showServiceNavigationBar, 232 showServiceNavigationBar,
234 } = this.all.app; 233 } = this.all.app;
@@ -239,53 +238,22 @@ export default class SettingsStore extends Store {
239 navigationBarBehaviour: showServiceNavigationBar ? 'custom' : 'never', 238 navigationBarBehaviour: showServiceNavigationBar ? 'custom' : 'never',
240 }, 239 },
241 }); 240 });
241 });
242 242
243 this.actions.settings.update({ 243 this._ensureMigrationAndMarkDone('5.4.4-beta.4-settings', () => {
244 type: 'migration',
245 data: {
246 '5.4.4-beta.2-settings': true,
247 },
248 });
249 }
250
251 if (!this.all.migration['5.4.4-beta.4-settings']) {
252 this.actions.settings.update({ 244 this.actions.settings.update({
253 type: 'app', 245 type: 'app',
254 data: { 246 data: {
255 todoServer: 'isUsingCustomTodoService', 247 todoServer: 'isUsingCustomTodoService',
256 customTodoServer: legacySettings.todoServer, 248 customTodoServer: legacySettings.todoServer,
257 },
258 });
259
260 this.actions.settings.update({
261 type: 'migration',
262 data: {
263 '5.4.4-beta.4-settings': true,
264 },
265 });
266
267 debug('Migrated old todo setting to new custom todo setting');
268 }
269
270 if (!this.all.migration['5.4.4-beta.4-settings']) {
271 this.actions.settings.update({
272 type: 'app',
273 data: {
274 automaticUpdates: !(legacySettings.noUpdates), 249 automaticUpdates: !(legacySettings.noUpdates),
275 }, 250 },
276 }); 251 });
277 252
278 this.actions.settings.update({ 253 debug('Migrated old todo setting to new custom todo setting');
279 type: 'migration', 254 });
280 data: {
281 '5.4.4-beta.4-settings': true,
282 },
283 });
284
285 debug('Migrated updates settings');
286 }
287 255
288 if (!this.all.migration['password-hashing']) { 256 this._ensureMigrationAndMarkDone('password-hashing', () => {
289 if (this.stores.settings.app.lockedPassword !== '') { 257 if (this.stores.settings.app.lockedPassword !== '') {
290 this.actions.settings.update({ 258 this.actions.settings.update({
291 type: 'app', 259 type: 'app',
@@ -295,46 +263,25 @@ export default class SettingsStore extends Store {
295 }); 263 });
296 } 264 }
297 265
298 this.actions.settings.update({
299 type: 'migration',
300 data: {
301 'password-hashing': true,
302 },
303 });
304
305 debug('Migrated updates settings'); 266 debug('Migrated updates settings');
306 } 267 });
307 268
308 if (!this.all.migration['5.6.0-beta.6-settings']) { 269 this._ensureMigrationAndMarkDone('5.6.0-beta.6-settings', () => {
309 this.actions.settings.update({ 270 this.actions.settings.update({
310 type: 'app', 271 type: 'app',
311 data: { 272 data: {
312 searchEngine: SEARCH_ENGINE_DDG, 273 searchEngine: SEARCH_ENGINE_DDG,
313 }, 274 },
314 }); 275 });
276 });
315 277
316 this.actions.settings.update({ 278 this._ensureMigrationAndMarkDone('user-agent-settings', () => {
317 type: 'migration',
318 data: {
319 '5.6.0-beta.6-settings': true,
320 },
321 });
322 }
323
324 if (!this.all.migration['user-agent-settings']) {
325 this.actions.settings.update({ 279 this.actions.settings.update({
326 type: 'app', 280 type: 'app',
327 data: { 281 data: {
328 userAgentPref: DEFAULT_APP_SETTINGS.userAgentPref, 282 userAgentPref: DEFAULT_APP_SETTINGS.userAgentPref,
329 }, 283 },
330 }); 284 });
331 285 });
332 this.actions.settings.update({
333 type: 'migration',
334 data: {
335 'user-agent-settings': true,
336 },
337 });
338 }
339 } 286 }
340} 287}
diff --git a/src/stores/UIStore.js b/src/stores/UIStore.js
index 0ca61046a..adcd776c1 100644
--- a/src/stores/UIStore.js
+++ b/src/stores/UIStore.js
@@ -71,7 +71,7 @@ export default class UIStore extends Store {
71 71
72 @computed get theme() { 72 @computed get theme() {
73 const themeId = (this.isDarkThemeActive || this.stores.settings.app.darkMode) ? 'dark' : 'default'; 73 const themeId = (this.isDarkThemeActive || this.stores.settings.app.darkMode) ? 'dark' : 'default';
74 const accentColor = this.stores.settings.app.accentColor; 74 const { accentColor } = this.stores.settings.app;
75 return theme(themeId, accentColor); 75 return theme(themeId, accentColor);
76 } 76 }
77 77
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index 7947e5a27..2e009893a 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -2,16 +2,13 @@ import { observable, computed, action } from 'mobx';
2import moment from 'moment'; 2import moment from 'moment';
3import jwt from 'jsonwebtoken'; 3import jwt from 'jsonwebtoken';
4import localStorage from 'mobx-localstorage'; 4import localStorage from 'mobx-localstorage';
5import ms from 'ms';
6import { session } from '@electron/remote'; 5import { session } from '@electron/remote';
7 6
8import { isDevMode } from '../environment'; 7import { isDevMode } from '../environment';
9import Store from './lib/Store'; 8import Store from './lib/Store';
10import Request from './lib/Request'; 9import Request from './lib/Request';
11import CachedRequest from './lib/CachedRequest'; 10import CachedRequest from './lib/CachedRequest';
12import { sleep } from '../helpers/async-helpers'; 11import { TODOS_PARTITION_ID } from '../config';
13import { getPlan } from '../helpers/plan-helpers';
14import { PLANS, TODOS_PARTITION_ID } from '../config';
15 12
16const debug = require('debug')('Ferdi:UserStore'); 13const debug = require('debug')('Ferdi:UserStore');
17 14
@@ -27,8 +24,6 @@ export default class UserStore extends Store {
27 24
28 SIGNUP_ROUTE = `${this.BASE_ROUTE}/signup`; 25 SIGNUP_ROUTE = `${this.BASE_ROUTE}/signup`;
29 26
30 PRICING_ROUTE = `${this.BASE_ROUTE}/signup/pricing`;
31
32 SETUP_ROUTE = `${this.BASE_ROUTE}/signup/setup`; 27 SETUP_ROUTE = `${this.BASE_ROUTE}/signup/setup`;
33 28
34 IMPORT_ROUTE = `${this.BASE_ROUTE}/signup/import`; 29 IMPORT_ROUTE = `${this.BASE_ROUTE}/signup/import`;
@@ -45,8 +40,6 @@ export default class UserStore extends Store {
45 40
46 @observable passwordRequest = new Request(this.api.user, 'password'); 41 @observable passwordRequest = new Request(this.api.user, 'password');
47 42
48 @observable activateTrialRequest = new Request(this.api.user, 'activateTrial');
49
50 @observable inviteRequest = new Request(this.api.user, 'invite'); 43 @observable inviteRequest = new Request(this.api.user, 'invite');
51 44
52 @observable getUserInfoRequest = new CachedRequest(this.api.user, 'getInfo'); 45 @observable getUserInfoRequest = new CachedRequest(this.api.user, 'getInfo');
@@ -71,8 +64,6 @@ export default class UserStore extends Store {
71 64
72 @observable hasCompletedSignup = false; 65 @observable hasCompletedSignup = false;
73 66
74 @observable hasActivatedTrial = false;
75
76 @observable userData = {}; 67 @observable userData = {};
77 68
78 @observable actionStatus = []; 69 @observable actionStatus = [];
@@ -93,7 +84,6 @@ export default class UserStore extends Store {
93 this.actions.user.retrievePassword.listen(this._retrievePassword.bind(this)); 84 this.actions.user.retrievePassword.listen(this._retrievePassword.bind(this));
94 this.actions.user.logout.listen(this._logout.bind(this)); 85 this.actions.user.logout.listen(this._logout.bind(this));
95 this.actions.user.signup.listen(this._signup.bind(this)); 86 this.actions.user.signup.listen(this._signup.bind(this));
96 this.actions.user.activateTrial.listen(this._activateTrial.bind(this));
97 this.actions.user.invite.listen(this._invite.bind(this)); 87 this.actions.user.invite.listen(this._invite.bind(this));
98 this.actions.user.update.listen(this._update.bind(this)); 88 this.actions.user.update.listen(this._update.bind(this));
99 this.actions.user.resetStatus.listen(this._resetStatus.bind(this)); 89 this.actions.user.resetStatus.listen(this._resetStatus.bind(this));
@@ -104,7 +94,6 @@ export default class UserStore extends Store {
104 this.registerReactions([ 94 this.registerReactions([
105 this._requireAuthenticatedUser.bind(this), 95 this._requireAuthenticatedUser.bind(this),
106 this._getUserData.bind(this), 96 this._getUserData.bind(this),
107 this._resetTrialActivationState.bind(this),
108 ]); 97 ]);
109 } 98 }
110 99
@@ -126,10 +115,6 @@ export default class UserStore extends Store {
126 return this.SIGNUP_ROUTE; 115 return this.SIGNUP_ROUTE;
127 } 116 }
128 117
129 get pricingRoute() {
130 return this.PRICING_ROUTE;
131 }
132
133 get setupRoute() { 118 get setupRoute() {
134 return this.SETUP_ROUTE; 119 return this.SETUP_ROUTE;
135 } 120 }
@@ -172,31 +157,6 @@ export default class UserStore extends Store {
172 return this.data.team || null; 157 return this.data.team || null;
173 } 158 }
174 159
175 @computed get isPremium() {
176 return true;
177 }
178
179 @computed get isPremiumOverride() {
180 return ((!this.team || !this.team.plan) && this.isPremium) || (this.team && this.team.state === 'expired' && this.isPremium);
181 }
182
183 @computed get isPersonal() {
184 if (!this.team || !this.team.plan) return false;
185 const plan = getPlan(this.team.plan);
186
187 return plan === PLANS.PERSONAL;
188 }
189
190 @computed get isPro() {
191 return true;
192 // if (this.isPremiumOverride) return true;
193
194 // if (!this.team || (!this.team.plan || this.team.state === 'expired')) return false;
195 // const plan = getPlan(this.team.plan);
196
197 // return plan === PLANS.PRO || plan === PLANS.LEGACY;
198 }
199
200 @computed get legacyServices() { 160 @computed get legacyServices() {
201 return this.getLegacyServicesRequest.execute() || {}; 161 return this.getLegacyServicesRequest.execute() || {};
202 } 162 }
@@ -244,23 +204,8 @@ export default class UserStore extends Store {
244 this.actionStatus = request.result.status || []; 204 this.actionStatus = request.result.status || [];
245 } 205 }
246 206
247 @action async _activateTrial({ planId }) {
248 debug('activate trial', planId);
249
250 this.activateTrialRequest.execute({
251 plan: planId,
252 });
253
254 await this.activateTrialRequest._promise;
255
256 this.hasActivatedTrial = true;
257
258 this.stores.features.featuresRequest.invalidate({ immediately: true });
259 this.stores.user.getUserInfoRequest.invalidate({ immediately: true });
260 }
261
262 @action async _invite({ invites }) { 207 @action async _invite({ invites }) {
263 const data = invites.filter(invite => invite.email !== ''); 208 const data = invites.filter((invite) => invite.email !== '');
264 209
265 const response = await this.inviteRequest.execute(data)._promise; 210 const response = await this.inviteRequest.execute(data)._promise;
266 211
@@ -305,7 +250,7 @@ export default class UserStore extends Store {
305 this.isImportLegacyServicesExecuting = true; 250 this.isImportLegacyServicesExecuting = true;
306 251
307 // Reduces recipe duplicates 252 // Reduces recipe duplicates
308 const recipes = services.filter((obj, pos, arr) => arr.map(mapObj => mapObj.recipe.id).indexOf(obj.recipe.id) === pos).map(s => s.recipe.id); 253 const recipes = services.filter((obj, pos, arr) => arr.map((mapObj) => mapObj.recipe.id).indexOf(obj.recipe.id) === pos).map((s) => s.recipe.id);
309 254
310 // Install recipes 255 // Install recipes
311 for (const recipe of recipes) { // eslint-disable-line no-unused-vars 256 for (const recipe of recipes) { // eslint-disable-line no-unused-vars
@@ -386,14 +331,6 @@ export default class UserStore extends Store {
386 } 331 }
387 } 332 }
388 333
389 async _resetTrialActivationState() {
390 if (this.hasActivatedTrial) {
391 await sleep(ms('12s'));
392
393 this.hasActivatedTrial = false;
394 }
395 }
396
397 // Helpers 334 // Helpers
398 _parseToken(authToken) { 335 _parseToken(authToken) {
399 try { 336 try {
diff --git a/src/stores/index.js b/src/stores/index.js
index 4eeef7982..b6e481e8a 100644
--- a/src/stores/index.js
+++ b/src/stores/index.js
@@ -6,16 +6,13 @@ import ServicesStore from './ServicesStore';
6import RecipesStore from './RecipesStore'; 6import RecipesStore from './RecipesStore';
7import RecipePreviewsStore from './RecipePreviewsStore'; 7import RecipePreviewsStore from './RecipePreviewsStore';
8import UIStore from './UIStore'; 8import UIStore from './UIStore';
9import PaymentStore from './PaymentStore';
10import NewsStore from './NewsStore'; 9import NewsStore from './NewsStore';
11import RequestStore from './RequestStore'; 10import RequestStore from './RequestStore';
12import GlobalErrorStore from './GlobalErrorStore'; 11import GlobalErrorStore from './GlobalErrorStore';
13import { workspaceStore } from '../features/workspaces'; 12import { workspaceStore } from '../features/workspaces';
14import { announcementsStore } from '../features/announcements'; 13import { announcementsStore } from '../features/announcements';
15import { serviceLimitStore } from '../features/serviceLimit';
16import { communityRecipesStore } from '../features/communityRecipes'; 14import { communityRecipesStore } from '../features/communityRecipes';
17import { todosStore } from '../features/todos'; 15import { todosStore } from '../features/todos';
18import { planSelectionStore } from '../features/planSelection';
19 16
20export default (api, actions, router) => { 17export default (api, actions, router) => {
21 const stores = {}; 18 const stores = {};
@@ -29,16 +26,13 @@ export default (api, actions, router) => {
29 recipes: new RecipesStore(stores, api, actions), 26 recipes: new RecipesStore(stores, api, actions),
30 recipePreviews: new RecipePreviewsStore(stores, api, actions), 27 recipePreviews: new RecipePreviewsStore(stores, api, actions),
31 ui: new UIStore(stores, api, actions), 28 ui: new UIStore(stores, api, actions),
32 payment: new PaymentStore(stores, api, actions),
33 news: new NewsStore(stores, api, actions), 29 news: new NewsStore(stores, api, actions),
34 requests: new RequestStore(stores, api, actions), 30 requests: new RequestStore(stores, api, actions),
35 globalError: new GlobalErrorStore(stores, api, actions), 31 globalError: new GlobalErrorStore(stores, api, actions),
36 workspaces: workspaceStore, 32 workspaces: workspaceStore,
37 announcements: announcementsStore, 33 announcements: announcementsStore,
38 serviceLimit: serviceLimitStore,
39 communityRecipes: communityRecipesStore, 34 communityRecipes: communityRecipesStore,
40 todos: todosStore, 35 todos: todosStore,
41 planSelection: planSelectionStore,
42 }); 36 });
43 // Initialize all stores 37 // Initialize all stores
44 Object.keys(stores).forEach((name) => { 38 Object.keys(stores).forEach((name) => {
diff --git a/src/stores/lib/CachedRequest.js b/src/stores/lib/CachedRequest.js
index 31c7ce241..94f615144 100644
--- a/src/stores/lib/CachedRequest.js
+++ b/src/stores/lib/CachedRequest.js
@@ -92,7 +92,7 @@ export default class CachedRequest extends Request {
92 } 92 }
93 93
94 removeCacheForCallWith(...args) { 94 removeCacheForCallWith(...args) {
95 remove(this._apiCalls, c => isEqual(c.args, args)); 95 remove(this._apiCalls, (c) => isEqual(c.args, args));
96 } 96 }
97 97
98 _addApiCall(args) { 98 _addApiCall(args) {
@@ -102,6 +102,6 @@ export default class CachedRequest extends Request {
102 } 102 }
103 103
104 _findApiCall(args) { 104 _findApiCall(args) {
105 return this._apiCalls.find(c => isEqual(c.args, args)); 105 return this._apiCalls.find((c) => isEqual(c.args, args));
106 } 106 }
107} 107}
diff --git a/src/stores/lib/Reaction.js b/src/stores/lib/Reaction.js
index f8009b7f6..7e1bc685e 100644
--- a/src/stores/lib/Reaction.js
+++ b/src/stores/lib/Reaction.js
@@ -26,6 +26,6 @@ export default class Reaction {
26 } 26 }
27} 27}
28 28
29export const createReactions = reactions => ( 29export const createReactions = (reactions) => (
30 reactions.map(r => new Reaction(r)) 30 reactions.map((r) => new Reaction(r))
31); 31);
diff --git a/src/stores/lib/Request.js b/src/stores/lib/Request.js
index cfc857c2e..32ffe4367 100644
--- a/src/stores/lib/Request.js
+++ b/src/stores/lib/Request.js
@@ -107,7 +107,7 @@ export default class Request {
107 } 107 }
108 108
109 _triggerHooks() { 109 _triggerHooks() {
110 Request._hooks.forEach(hook => hook(this)); 110 Request._hooks.forEach((hook) => hook(this));
111 } 111 }
112 112
113 reset = () => { 113 reset = () => {
diff --git a/src/stores/lib/Store.js b/src/stores/lib/Store.js
index 8d2fb4066..b03a7e725 100644
--- a/src/stores/lib/Store.js
+++ b/src/stores/lib/Store.js
@@ -28,18 +28,18 @@ export default class Store {
28 } 28 }
29 29
30 registerReactions(reactions) { 30 registerReactions(reactions) {
31 reactions.forEach(reaction => this._reactions.push(new Reaction(reaction))); 31 reactions.forEach((reaction) => this._reactions.push(new Reaction(reaction)));
32 } 32 }
33 33
34 setup() {} 34 setup() {}
35 35
36 initialize() { 36 initialize() {
37 this.setup(); 37 this.setup();
38 this._reactions.forEach(reaction => reaction.start()); 38 this._reactions.forEach((reaction) => reaction.start());
39 } 39 }
40 40
41 teardown() { 41 teardown() {
42 this._reactions.forEach(reaction => reaction.stop()); 42 this._reactions.forEach((reaction) => reaction.stop());
43 } 43 }
44 44
45 resetStatus() { 45 resetStatus() {
diff --git a/src/styles/badge.scss b/src/styles/badge.scss
index 69879de31..1f58b8089 100644
--- a/src/styles/badge.scss
+++ b/src/styles/badge.scss
@@ -5,8 +5,7 @@
5 border-radius: $theme-border-radius-small; 5 border-radius: $theme-border-radius-small;
6 color: $dark-theme-gray-lightest; 6 color: $dark-theme-gray-lightest;
7 7
8 &.badge--primary, 8 &.badge--primary {
9 &.badge--premium {
10 background: $theme-brand-primary; 9 background: $theme-brand-primary;
11 color: $dark-theme-gray-lightest; 10 color: $dark-theme-gray-lightest;
12 } 11 }
@@ -21,8 +20,7 @@
21 padding: 5px 10px; 20 padding: 5px 10px;
22 letter-spacing: 0; 21 letter-spacing: 0;
23 22
24 &.badge--primary, 23 &.badge--primary {
25 &.badge--premium {
26 background: $theme-brand-primary; 24 background: $theme-brand-primary;
27 color: #FFF; 25 color: #FFF;
28 } 26 }
diff --git a/src/styles/button.scss b/src/styles/button.scss
index d18b683d5..86b3501f0 100644
--- a/src/styles/button.scss
+++ b/src/styles/button.scss
@@ -4,29 +4,45 @@
4 background: $theme-brand-primary; 4 background: $theme-brand-primary;
5 color: $dark-theme-text-color; 5 color: $dark-theme-text-color;
6 6
7 &:hover { background: darken($theme-brand-primary, 5%); } 7 &:hover {
8 &:active { background: lighten($theme-brand-primary, 5%); } 8 background: darken($theme-brand-primary, 5%);
9 }
10 &:active {
11 background: lighten($theme-brand-primary, 5%);
12 }
9 13
10 &.franz-form__button--secondary { 14 &.franz-form__button--secondary {
11 background: $dark-theme-gray-dark; 15 background: $dark-theme-gray-dark;
12 color: $dark-theme-text-color; 16 color: $dark-theme-text-color;
13 17
14 &:hover { background: lighten($dark-theme-gray-dark, 10%); } 18 &:hover {
15 &:active { background: lighten($dark-theme-gray-dark, 20%); } 19 background: lighten($dark-theme-gray-dark, 10%);
20 }
21 &:active {
22 background: lighten($dark-theme-gray-dark, 20%);
23 }
16 } 24 }
17 25
18 &.franz-form__button--danger { 26 &.franz-form__button--danger {
19 background: $theme-brand-danger; 27 background: $theme-brand-danger;
20 28
21 &:hover { background: darken($theme-brand-danger, 5%); } 29 &:hover {
22 &:active { background: lighten($theme-brand-danger, 5%); } 30 background: darken($theme-brand-danger, 5%);
31 }
32 &:active {
33 background: lighten($theme-brand-danger, 5%);
34 }
23 } 35 }
24 36
25 &.franz-form__button--warning { 37 &.franz-form__button--warning {
26 background: $theme-brand-warning; 38 background: $theme-brand-warning;
27 39
28 &:hover { background: darken($theme-brand-warning, 5%); } 40 &:hover {
29 &:active { background: lighten($theme-brand-warning, 5%); } 41 background: darken($theme-brand-warning, 5%);
42 }
43 &:active {
44 background: lighten($theme-brand-warning, 5%);
45 }
30 } 46 }
31 47
32 &.franz-form__button--inverted { 48 &.franz-form__button--inverted {
@@ -39,27 +55,35 @@
39 } 55 }
40 } 56 }
41 57
42 &:disabled { opacity: .5; } 58 &:disabled {
59 opacity: 0.5;
60 }
43} 61}
44 62
45.franz-form__button { 63.franz-form__button {
46 background: $theme-brand-primary; 64 background: $theme-brand-primary;
47 border-radius: 3px; 65 border-radius: 3px;
48 display: block; 66 display: block;
49 color: #FFF; 67 color: #fff;
50 padding: 10px 20px; 68 padding: 10px 20px;
51 position: relative; 69 position: relative;
52 transition: background .5s; 70 @media (prefers-reduced-motion: no-preference) {
71 transition: background 0.5s;
72 }
53 text-align: center; 73 text-align: center;
54 74
55 &:hover { background: darken($theme-brand-primary, 5%) } 75 &:hover {
76 background: darken($theme-brand-primary, 5%);
77 }
56 78
57 &:active { 79 &:active {
58 background: lighten($theme-brand-primary, 5%); 80 background: lighten($theme-brand-primary, 5%);
59 transition: none; 81 transition: none;
60 } 82 }
61 83
62 &:disabled { opacity: .2; } 84 &:disabled {
85 opacity: 0.2;
86 }
63 87
64 &.franz-form__button--large { 88 &.franz-form__button--large {
65 width: 100%; 89 width: 100%;
@@ -70,22 +94,34 @@
70 background: $theme-gray-lighter; 94 background: $theme-gray-lighter;
71 color: $theme-gray; 95 color: $theme-gray;
72 96
73 &:hover { background: darken($theme-gray-lighter, 5%); } 97 &:hover {
74 &:active { background: lighten($theme-gray-lighter, 5%); } 98 background: darken($theme-gray-lighter, 5%);
99 }
100 &:active {
101 background: lighten($theme-gray-lighter, 5%);
102 }
75 } 103 }
76 104
77 &.franz-form__button--danger { 105 &.franz-form__button--danger {
78 background: $theme-brand-danger; 106 background: $theme-brand-danger;
79 107
80 &:hover { background: darken($theme-brand-danger, 5%); } 108 &:hover {
81 &:active { background: lighten($theme-brand-danger, 5%); } 109 background: darken($theme-brand-danger, 5%);
110 }
111 &:active {
112 background: lighten($theme-brand-danger, 5%);
113 }
82 } 114 }
83 115
84 &.franz-form__button--warning { 116 &.franz-form__button--warning {
85 background: $theme-brand-warning; 117 background: $theme-brand-warning;
86 118
87 &:hover { background: darken($theme-brand-warning, 5%); } 119 &:hover {
88 &:active { background: lighten($theme-brand-warning, 5%); } 120 background: darken($theme-brand-warning, 5%);
121 }
122 &:active {
123 background: lighten($theme-brand-warning, 5%);
124 }
89 } 125 }
90 126
91 &.franz-form__button--inverted { 127 &.franz-form__button--inverted {
@@ -93,11 +129,12 @@
93 border: 2px solid $theme-brand-primary; 129 border: 2px solid $theme-brand-primary;
94 color: $theme-brand-primary; 130 color: $theme-brand-primary;
95 padding: 10px 20px; 131 padding: 10px 20px;
96 transition: background .5s, color .5s; 132 @media (prefers-reduced-motion: no-preference) {
97 133 transition: background 0.5s, color 0.5s;
134 }
98 &:hover { 135 &:hover {
99 background: darken($theme-brand-primary, 5%); 136 background: darken($theme-brand-primary, 5%);
100 color: #FFF; 137 color: #fff;
101 } 138 }
102 } 139 }
103 140
@@ -122,20 +159,20 @@
122 z-index: 9998; 159 z-index: 9998;
123 list-style: none; 160 list-style: none;
124 background: $theme-brand-primary; 161 background: $theme-brand-primary;
125 162
126 position: absolute; 163 position: absolute;
127 bottom: 20px; 164 bottom: 20px;
128 right: 20px; 165 right: 20px;
129 166
130 cursor: pointer; 167 cursor: pointer;
131 168
132 display: flex; 169 display: flex;
133 justify-content: center; 170 justify-content: center;
134 align-items: center; 171 align-items: center;
135 172
136 a { 173 a {
137 font-size: 30px; 174 font-size: 30px;
138 color: #FFFFFF; 175 color: #ffffff;
139 cursor: pointer; 176 cursor: pointer;
140 } 177 }
141} 178}
diff --git a/src/styles/content-tabs.scss b/src/styles/content-tabs.scss
index 03befedcb..41bd2c251 100644
--- a/src/styles/content-tabs.scss
+++ b/src/styles/content-tabs.scss
@@ -9,7 +9,7 @@
9 .content-tabs__tabs { 9 .content-tabs__tabs {
10 .content-tabs__item { 10 .content-tabs__item {
11 background: $dark-theme-gray; 11 background: $dark-theme-gray;
12 color: #FFF; 12 color: #fff;
13 border: 0; 13 border: 0;
14 } 14 }
15 } 15 }
@@ -24,19 +24,26 @@
24 overflow: hidden; 24 overflow: hidden;
25 25
26 .content-tabs__item { 26 .content-tabs__item {
27 background: linear-gradient($theme-gray-lightest 80%, darken($theme-gray-lightest, 3%)); 27 background: linear-gradient(
28 $theme-gray-lightest 80%,
29 darken($theme-gray-lightest, 3%)
30 );
28 border-right: 1px solid $theme-gray-lighter; 31 border-right: 1px solid $theme-gray-lighter;
29 color: $theme-gray-dark; 32 color: $theme-gray-dark;
30 flex: 1; 33 flex: 1;
31 padding: 10px; 34 padding: 10px;
32 transition: background $theme-transition-time; 35 @media (prefers-reduced-motion: no-preference) {
36 transition: background $theme-transition-time;
37 }
33 38
34 &:last-of-type { border-right: 0; } 39 &:last-of-type {
40 border-right: 0;
41 }
35 42
36 &.is-active { 43 &.is-active {
37 background: $theme-brand-primary; 44 background: $theme-brand-primary;
38 box-shadow: none; 45 box-shadow: none;
39 color: #FFF; 46 color: #fff;
40 } 47 }
41 } 48 }
42 } 49 }
@@ -51,10 +58,16 @@
51 display: none; 58 display: none;
52 top: 0; 59 top: 0;
53 60
54 &.is-active { display: block; } 61 &.is-active {
62 display: block;
63 }
55 } 64 }
56 65
57 .franz-form__input-wrapper { background: #FFF; } 66 .franz-form__input-wrapper {
58 .franz-form__field:last-of-type { margin-bottom: 0; } 67 background: #fff;
68 }
69 .franz-form__field:last-of-type {
70 margin-bottom: 0;
71 }
59 } 72 }
60} 73}
diff --git a/src/styles/fonts.scss b/src/styles/fonts.scss
index bd96ea867..1b2c99945 100644
--- a/src/styles/fonts.scss
+++ b/src/styles/fonts.scss
@@ -1,44 +1,49 @@
1@import './config.scss'; 1@import './config.scss';
2// @import './node_modules/mdi/scss/materialdesignicons.scss';
3 2
4@font-face { 3@font-face {
5 font-family: 'Open Sans'; 4 font-family: 'Open Sans';
6 src: url('../assets/fonts/OpenSans-Light.ttf'); 5 src: url('../assets/fonts/OpenSans-Light.ttf');
7 font-weight: 300; 6 font-weight: 300;
8 font-style: normal; 7 font-style: normal;
8 display: swap;
9} 9}
10 10
11@font-face { 11@font-face {
12 font-family: 'Open Sans'; 12 font-family: 'Open Sans';
13 src: url('../assets/fonts/OpenSans-Regular.ttf'); 13 src: url('../assets/fonts/OpenSans-Regular.ttf');
14 font-weight: normal; 14 font-weight: normal;
15 font-style: normal; 15 font-style: normal;
16 display: swap;
16} 17}
17 18
18@font-face { 19@font-face {
19 font-family: 'Open Sans'; 20 font-family: 'Open Sans';
20 src: url('../assets/fonts/OpenSans-Bold.ttf'); 21 src: url('../assets/fonts/OpenSans-Bold.ttf');
21 font-weight: bold; 22 font-weight: bold;
22 font-style: normal; 23 font-style: normal;
24 display: swap;
23} 25}
24 26
25@font-face { 27@font-face {
26 font-family: 'Open Sans'; 28 font-family: 'Open Sans';
27 src: url('../assets/fonts/OpenSans-BoldItalic.ttf'); 29 src: url('../assets/fonts/OpenSans-BoldItalic.ttf');
28 font-weight: bold; 30 font-weight: bold;
29 font-style: italic; 31 font-style: italic;
32 display: swap;
30} 33}
31 34
32@font-face { 35@font-face {
33 font-family: 'Open Sans'; 36 font-family: 'Open Sans';
34 src: url('../assets/fonts/OpenSans-ExtraBold.ttf'); 37 src: url('../assets/fonts/OpenSans-ExtraBold.ttf');
35 font-weight: 800; 38 font-weight: 800;
36 font-style: normal; 39 font-style: normal;
40 display: swap;
37} 41}
38 42
39@font-face { 43@font-face {
40 font-family: 'Open Sans'; 44 font-family: 'Open Sans';
41 src: url('../assets/fonts/OpenSans-ExtraBoldItalic.ttf'); 45 src: url('../assets/fonts/OpenSans-ExtraBoldItalic.ttf');
42 font-weight: 800; 46 font-weight: 800;
43 font-style: italic; 47 font-style: italic;
48 display: swap;
44} 49}
diff --git a/src/styles/image-upload.scss b/src/styles/image-upload.scss
index 31300c227..b5f6d5cd4 100644
--- a/src/styles/image-upload.scss
+++ b/src/styles/image-upload.scss
@@ -5,17 +5,23 @@
5 color: $dark-theme-gray-lighter; 5 color: $dark-theme-gray-lighter;
6 6
7 &__action { 7 &__action {
8 &-background { background: rgba($dark-theme-black, .7); } 8 &-background {
9 background: rgba($dark-theme-black, 0.7);
10 }
9 11
10 button { 12 button {
11 color: $dark-theme-gray-lightest; 13 color: $dark-theme-gray-lightest;
12 14
13 .mdi { color: $dark-theme-gray-lightest; } 15 .mdi {
16 color: $dark-theme-gray-lightest;
17 }
14 } 18 }
15 } 19 }
16 } 20 }
17 21
18 .image-upload-wrapper .mdi { color: $dark-theme-gray-light; } 22 .image-upload-wrapper .mdi {
23 color: $dark-theme-gray-light;
24 }
19} 25}
20 26
21.image-upload { 27.image-upload {
@@ -49,11 +55,13 @@
49 justify-content: center; 55 justify-content: center;
50 opacity: 0; 56 opacity: 0;
51 position: relative; 57 position: relative;
52 transition: opacity .5s; 58 @media (prefers-reduced-motion: no-preference) {
59 transition: opacity 0.5s;
60 }
53 z-index: 10; 61 z-index: 10;
54 62
55 &-background { 63 &-background {
56 background: rgba($theme-gray, .7); 64 background: rgba($theme-gray, 0.7);
57 bottom: 0; 65 bottom: 0;
58 left: 0; 66 left: 0;
59 position: absolute; 67 position: absolute;
@@ -63,11 +71,13 @@
63 } 71 }
64 72
65 button { 73 button {
66 color: #FFF; 74 color: #fff;
67 position: relative; 75 position: relative;
68 z-index: 100; 76 z-index: 100;
69 77
70 .mdi { color: #FFF; } 78 .mdi {
79 color: #fff;
80 }
71 } 81 }
72 } 82 }
73 83
@@ -83,7 +93,9 @@
83 93
84 &__dropzone, 94 &__dropzone,
85 button { 95 button {
86 .mdi { margin-bottom: 5px; } 96 .mdi {
97 margin-bottom: 5px;
98 }
87 99
88 p { 100 p {
89 font-size: 10px; 101 font-size: 10px;
@@ -91,7 +103,9 @@
91 } 103 }
92 } 104 }
93 105
94 &:hover .image-upload__action { opacity: 1; } 106 &:hover .image-upload__action {
107 opacity: 1;
108 }
95} 109}
96 110
97.image-upload-wrapper .mdi { 111.image-upload-wrapper .mdi {
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index acbd65ad1..49e041022 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -1,6 +1,8 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3html { overflow: hidden; } 3html {
4 overflow: hidden;
5}
4 6
5@keyframes pulse-danger { 7@keyframes pulse-danger {
6 0% { 8 0% {
@@ -21,7 +23,7 @@ html { overflow: hidden; }
21 23
22 &::after { 24 &::after {
23 box-shadow: inset 0 0 5px 0 $dark-theme-black, 25 box-shadow: inset 0 0 5px 0 $dark-theme-black,
24 inset 0 0 2px 0 rgba(0, 0, 0, 0.4); 26 inset 0 0 2px 0 rgba(0, 0, 0, 0.4);
25 } 27 }
26 28
27 .sidebar__add-service { 29 .sidebar__add-service {
@@ -48,12 +50,12 @@ html { overflow: hidden; }
48 filter: grayscale(1); 50 filter: grayscale(1);
49 } 51 }
50 52
51 .update-available { 53 .update-available {
52 align-items: center; 54 align-items: center;
53 background: $theme-brand-danger; 55 background: $theme-brand-danger;
54 border-radius: 20px; 56 border-radius: 20px;
55 bottom: 5px; 57 bottom: 5px;
56 color: #FFF; 58 color: #fff;
57 display: flex; 59 display: flex;
58 justify-content: center; 60 justify-content: center;
59 padding: 0px 5px; 61 padding: 0px 5px;
@@ -71,7 +73,9 @@ html { overflow: hidden; }
71 } 73 }
72 } 74 }
73 75
74 .app-loader .app-loader__title { color: $dark-theme-gray-lightest; } 76 .app-loader .app-loader__title {
77 color: $dark-theme-gray-lightest;
78 }
75} 79}
76 80
77body.win32:not(.isFullScreen) .app .app__content { 81body.win32:not(.isFullScreen) .app .app__content {
@@ -96,7 +100,9 @@ body.win32:not(.isFullScreen) .app .app__content {
96 } 100 }
97} 101}
98 102
99.electron-app-title-bar { z-index: 99999999; } 103.electron-app-title-bar {
104 z-index: 99999999;
105}
100 106
101.window-draggable { 107.window-draggable {
102 height: 22px; 108 height: 22px;
@@ -109,7 +115,9 @@ body.win32:not(.isFullScreen) .app .app__content {
109 -webkit-app-region: drag; 115 -webkit-app-region: drag;
110} 116}
111 117
112.darwin .sidebar { padding-top: 23px; } 118.darwin .sidebar {
119 padding-top: 23px;
120}
113 121
114.sidebar { 122.sidebar {
115 position: relative; 123 position: relative;
@@ -133,8 +141,8 @@ body.win32:not(.isFullScreen) .app .app__content {
133 z-index: 1000; 141 z-index: 1000;
134 pointer-events: none; 142 pointer-events: none;
135 clip-path: inset(10px 0 10px 10px); 143 clip-path: inset(10px 0 10px 10px);
136 box-shadow: inset 0 0 10px 0 rgba(0, 0, 0, .12), 144 box-shadow: inset 0 0 10px 0 rgba(0, 0, 0, 0.12),
137 inset 0 0 2px 0 rgba(0, 0, 0, 0.24); 145 inset 0 0 2px 0 rgba(0, 0, 0, 0.24);
138 } 146 }
139 147
140 .sidebar__add-service { 148 .sidebar__add-service {
@@ -154,16 +162,25 @@ body.win32:not(.isFullScreen) .app .app__content {
154 width: $theme-sidebar-width; 162 width: $theme-sidebar-width;
155 163
156 &:hover, 164 &:hover,
157 &:active { color: lighten($theme-gray-light, 10%); } 165 &:active {
158 &.is-muted, &.is-active { color: $theme-brand-primary; } 166 color: lighten($theme-gray-light, 10%);
159 &--new-service { padding-bottom: 6px; } 167 }
168 &.is-muted,
169 &.is-active {
170 color: $theme-brand-primary;
171 }
172 &--new-service {
173 padding-bottom: 6px;
174 }
160 } 175 }
161 176
162 & > div { 177 & > div {
163 display: flex; 178 display: flex;
164 overflow-y: scroll; 179 overflow-y: scroll;
165 180
166 &::-webkit-scrollbar { display: none; } 181 &::-webkit-scrollbar {
182 display: none;
183 }
167 } 184 }
168} 185}
169 186
@@ -171,8 +188,12 @@ body.win32:not(.isFullScreen) .app .app__content {
171 display: flex; 188 display: flex;
172 flex-direction: row; 189 flex-direction: row;
173 190
174 & > * { margin-right: 20px; } 191 & > * {
175 & :last-child { margin-right: 0; } 192 margin-right: 20px;
193 }
194 & :last-child {
195 margin-right: 0;
196 }
176} 197}
177 198
178.app-loader { 199.app-loader {
@@ -181,19 +202,23 @@ body.win32:not(.isFullScreen) .app .app__content {
181 justify-content: center; 202 justify-content: center;
182 203
183 .app-loader__title { 204 .app-loader__title {
184 color: #FFF; 205 color: #fff;
185 font-size: 40px; 206 font-size: 40px;
186 } 207 }
187 208
188 & > span { height: auto; } 209 & > span {
210 height: auto;
211 }
189} 212}
190 213
191.dev-warning { display: none; } 214.dev-warning {
215 display: none;
216}
192 217
193.isDevMode .dev-warning { 218.isDevMode .dev-warning {
194 border-radius: 3px; 219 border-radius: 3px;
195 background: $theme-brand-warning; 220 background: $theme-brand-warning;
196 color: #FFF; 221 color: #fff;
197 display: block; 222 display: block;
198 font-size: 8px; 223 font-size: 8px;
199 height: auto; 224 height: auto;
@@ -201,12 +226,15 @@ body.win32:not(.isFullScreen) .app .app__content {
201 position: fixed; 226 position: fixed;
202 left: 9px; 227 left: 9px;
203 bottom: 0px; 228 bottom: 0px;
204 transition: opacity .5s ease; 229 @media (prefers-reduced-motion: no-preference) {
230 transition: opacity 0.5s ease;
231 }
205 width: auto; 232 width: auto;
206 z-index: 999999999; 233 z-index: 999999999;
207 pointer-events: none; 234 pointer-events: none;
208} 235}
209 236
210a, button { 237a,
238button {
211 cursor: pointer; 239 cursor: pointer;
212} 240}
diff --git a/src/styles/main.scss b/src/styles/main.scss
index c57dc6fcd..b0815e086 100644
--- a/src/styles/main.scss
+++ b/src/styles/main.scss
@@ -1,9 +1,9 @@
1$mdi-font-path: '../node_modules/mdi/fonts'; 1$mdi-font-path: '../node_modules/@mdi/font/fonts';
2@if $env == development { 2@if $env == development {
3 $mdi-font-path: '../../node_modules/mdi/fonts'; 3 $mdi-font-path: '../../node_modules/@mdi/font/fonts';
4} 4}
5 5
6@import './node_modules/mdi/scss/materialdesignicons.scss'; 6@import './node_modules/@mdi/font/scss/materialdesignicons.scss';
7@import './node_modules/electron-react-titlebar/assets/style'; 7@import './node_modules/electron-react-titlebar/assets/style';
8 8
9// modules 9// modules
@@ -22,11 +22,8 @@ $mdi-font-path: '../node_modules/mdi/fonts';
22@import './tooltip.scss'; 22@import './tooltip.scss';
23@import './info-bar.scss'; 23@import './info-bar.scss';
24@import './status-bar-target-url.scss'; 24@import './status-bar-target-url.scss';
25@import './animations.scss';
26@import './infobox.scss'; 25@import './infobox.scss';
27@import './badge.scss'; 26@import './badge.scss';
28@import './subscription.scss';
29@import './subscription-popup.scss';
30@import './content-tabs.scss'; 27@import './content-tabs.scss';
31@import './invite.scss'; 28@import './invite.scss';
32@import './title-bar.scss'; 29@import './title-bar.scss';
@@ -40,4 +37,4 @@ $mdi-font-path: '../node_modules/mdi/fonts';
40@import './searchInput.scss'; 37@import './searchInput.scss';
41@import './select.scss'; 38@import './select.scss';
42@import './image-upload.scss'; 39@import './image-upload.scss';
43@import './slider.scss'; \ No newline at end of file 40@import './slider.scss';
diff --git a/src/styles/radio.scss b/src/styles/radio.scss
index b1e148ca0..e8297408d 100644
--- a/src/styles/radio.scss
+++ b/src/styles/radio.scss
@@ -11,9 +11,10 @@
11 } 11 }
12} 12}
13 13
14
15.franz-form { 14.franz-form {
16 .franz-form__radio-wrapper { display: flex; } 15 .franz-form__radio-wrapper {
16 display: flex;
17 }
17 18
18 .franz-form__radio { 19 .franz-form__radio {
19 border: 2px solid $theme-gray-lighter; 20 border: 2px solid $theme-gray-lighter;
@@ -24,18 +25,24 @@
24 margin-right: 20px; 25 margin-right: 20px;
25 padding: 11px; 26 padding: 11px;
26 text-align: center; 27 text-align: center;
27 transition: background $theme-transition-time; 28 @media (prefers-reduced-motion: no-preference) {
29 transition: background $theme-transition-time;
30 }
28 31
29 &:last-of-type { margin-right: 0; } 32 &:last-of-type {
33 margin-right: 0;
34 }
30 35
31 &.is-selected { 36 &.is-selected {
32 background: #FFF; 37 background: #fff;
33 border-width: 2px; 38 border-width: 2px;
34 border-style: solid; 39 border-style: solid;
35 border-color: $theme-brand-primary; 40 border-color: $theme-brand-primary;
36 color: $theme-brand-primary; 41 color: $theme-brand-primary;
37 } 42 }
38 43
39 input { display: none; } 44 input {
45 display: none;
46 }
40 } 47 }
41} 48}
diff --git a/src/styles/recipes.scss b/src/styles/recipes.scss
index 5bdc60a57..628d28f05 100644
--- a/src/styles/recipes.scss
+++ b/src/styles/recipes.scss
@@ -4,7 +4,9 @@
4 background-color: $dark-theme-gray-dark; 4 background-color: $dark-theme-gray-dark;
5 color: $dark-theme-text-color; 5 color: $dark-theme-text-color;
6 6
7 &:hover { background-color: $dark-theme-gray; } 7 &:hover {
8 background-color: $dark-theme-gray;
9 }
8} 10}
9 11
10.recipes { 12.recipes {
@@ -17,7 +19,7 @@
17 19
18 &.recipes__list--disabled { 20 &.recipes__list--disabled {
19 filter: grayscale(100%); 21 filter: grayscale(100%);
20 opacity: .3; 22 opacity: 0.3;
21 pointer-events: none; 23 pointer-events: none;
22 } 24 }
23 } 25 }
@@ -26,16 +28,20 @@
26 height: auto; 28 height: auto;
27 margin-bottom: 35px; 29 margin-bottom: 35px;
28 30
29 .badge { margin-right: 10px; } 31 .badge {
32 margin-right: 10px;
33 }
30 34
31 &.recipes__navigation--disabled { 35 &.recipes__navigation--disabled {
32 filter: grayscale(100%); 36 filter: grayscale(100%);
33 opacity: .3; 37 opacity: 0.3;
34 pointer-events: none; 38 pointer-events: none;
35 } 39 }
36 } 40 }
37 41
38 &__service-request { float: right; } 42 &__service-request {
43 float: right;
44 }
39} 45}
40 46
41.recipe-teaser { 47.recipe-teaser {
@@ -45,24 +51,37 @@
45 margin: 0 20px 20px 0; 51 margin: 0 20px 20px 0;
46 overflow: hidden; 52 overflow: hidden;
47 position: relative; 53 position: relative;
48 transition: background $theme-transition-time; 54 @media (prefers-reduced-motion: no-preference) {
55 transition: background $theme-transition-time;
56 }
49 width: calc(25% - 20px); 57 width: calc(25% - 20px);
50 58
51 &:hover { background-color: $theme-gray-lighter; } 59 &:hover {
60 background-color: $theme-gray-lighter;
61 }
52 62
53 .recipe-teaser__icon { 63 .recipe-teaser__icon {
54 margin-bottom: 10px; 64 margin-bottom: 10px;
55 width: 50px; 65 width: 50px;
56 } 66 }
57 67
58 .recipe-teaser__label { display: block; } 68 .recipe-teaser__label {
69 display: block;
70 }
71
72 .recipe-teaser__alias_label {
73 display: block;
74 font-size: x-small;
75 }
59 76
60 h2 { z-index: 10; } 77 h2 {
78 z-index: 10;
79 }
61 80
62 &__dev-badge { 81 &__dev-badge {
63 background: $theme-brand-warning; 82 background: $theme-brand-warning;
64 box-shadow: 0 0 4px rgba(black, .2); 83 box-shadow: 0 0 4px rgba(black, 0.2);
65 color: #FFF; 84 color: #fff;
66 font-size: 10px; 85 font-size: 10px;
67 position: absolute; 86 position: absolute;
68 right: -13px; 87 right: -13px;
diff --git a/src/styles/settings.scss b/src/styles/settings.scss
index a25759f48..501f97b98 100644
--- a/src/styles/settings.scss
+++ b/src/styles/settings.scss
@@ -1,69 +1,85 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3%headline { 3%headline {
4 color: #FFF; 4 color: #fff;
5 font-size: 20px; 5 font-size: 20px;
6 font-weight: 400; 6 font-weight: 400;
7 letter-spacing: -1px; 7 letter-spacing: -1px;
8 8
9 a { color: #FFF } 9 a {
10 color: #fff;
11 }
10} 12}
11 13
12%headline__dark { 14%headline__dark {
13 color: #FFF; 15 color: #fff;
14 font-size: 20px; 16 font-size: 20px;
15 font-weight: 400; 17 font-weight: 400;
16 letter-spacing: -1px; 18 letter-spacing: -1px;
17 19
18 a { color: #FFF } 20 a {
21 color: #fff;
22 }
19} 23}
20 24
21.theme__dark { 25.theme__dark {
22 .settings-wrapper { background: rgba($dark-theme-black, .8); } 26 .settings-wrapper {
27 background: rgba($dark-theme-black, 0.8);
28 }
23 29
24 .settings { 30 .settings {
25 .settings__header { 31 .settings__header {
26 .mdi { color: #FFF } 32 .mdi {
33 color: #fff;
34 }
27 } 35 }
28 36
29 .settings__main { 37 .settings__main {
30 background: $dark-theme-gray-darkest; 38 background: $dark-theme-gray-darkest;
31 } 39 }
32 40
33 .settings__body::-webkit-scrollbar-thumb { background: $dark-theme-gray; } 41 .settings__body::-webkit-scrollbar-thumb {
42 background: $dark-theme-gray;
43 }
34 44
35 .settings__close { 45 .settings__close {
36 color: #FFF; 46 color: #fff;
37 } 47 }
38 48
39 &__settings-group h3 { color: $dark-theme-gray-lightest; } 49 &__settings-group h3 {
50 color: $dark-theme-gray-lightest;
51 }
40 52
41 .settings__message { 53 .settings__message {
42 border-top: 1px solid $theme-gray-lighter; 54 border-top: 1px solid $theme-gray-lighter;
43 color: $dark-theme-gray-lightest; 55 color: $dark-theme-gray-lightest;
44 56
45 .mdi { color: $dark-theme-gray-lightest; } 57 .mdi {
58 color: $dark-theme-gray-lightest;
59 }
46 } 60 }
47 61
48 .settings__help { color: $dark-theme-gray-lightest; } 62 .settings__help {
63 color: $dark-theme-gray-lightest;
64 }
49 65
50 .settings__controls { 66 .settings__controls {
51 background: $dark-theme-gray-darker; 67 background: $dark-theme-gray-darker;
52 68
53 .franz-form__button.franz-form__button--secondary { background: $theme-gray-light; } 69 .franz-form__button.franz-form__button--secondary {
70 background: $theme-gray-light;
71 }
54 } 72 }
55 73
56 .account { 74 .account {
57 .account__box { background: $dark-theme-gray-darker; } 75 .account__box {
76 background: $dark-theme-gray-darker;
77 }
58 } 78 }
59 79
60 .premium-info { 80 .legal {
61 background: $dark-theme-gray-darker; 81 color: $theme-gray-light;
62 border-width: 2px;
63 border-style: solid;
64 border-color: $theme-brand-primary;
65 } 82 }
66 .legal { color: $theme-gray-light; }
67 } 83 }
68 84
69 .settings-navigation { 85 .settings-navigation {
@@ -75,7 +91,7 @@
75 border-bottom: 1px solid darken($dark-theme-gray-darker, 3%); 91 border-bottom: 1px solid darken($dark-theme-gray-darker, 3%);
76 92
77 &:last-child { 93 &:last-child {
78 border: 0, 94 border: 0;
79 } 95 }
80 96
81 .badge { 97 .badge {
@@ -93,7 +109,7 @@
93 } 109 }
94 110
95 &.is-disabled { 111 &.is-disabled {
96 filter: grayscale(100%) opacity(.2); 112 filter: grayscale(100%) opacity(0.2);
97 } 113 }
98 114
99 &.is-active { 115 &.is-active {
@@ -107,13 +123,15 @@
107 } 123 }
108 } 124 }
109 125
110 .settings-navigation__action-badge { background: $theme-brand-danger; } 126 .settings-navigation__action-badge {
127 background: $theme-brand-danger;
128 }
111 } 129 }
112} 130}
113 131
114.settings-wrapper { 132.settings-wrapper {
115 align-items: center; 133 align-items: center;
116 background: rgba(black, .5); 134 background: rgba(black, 0.5);
117 display: flex; 135 display: flex;
118 height: 100%; 136 height: 100%;
119 left: 0; 137 left: 0;
@@ -135,7 +153,7 @@
135 153
136.settings { 154.settings {
137 border-radius: $theme-border-radius; 155 border-radius: $theme-border-radius;
138 box-shadow: 0 20px 50px rgba($dark-theme-black, .5); 156 box-shadow: 0 20px 50px rgba($dark-theme-black, 0.5);
139 display: flex; 157 display: flex;
140 height: 100%; 158 height: 100%;
141 max-height: 720px; 159 max-height: 720px;
@@ -153,7 +171,7 @@
153 height: auto; 171 height: auto;
154 border-radius: 0 $theme-border-radius $theme-border-radius 0; 172 border-radius: 0 $theme-border-radius $theme-border-radius 0;
155 overflow: hidden; 173 overflow: hidden;
156 background: #FFF; 174 background: #fff;
157 } 175 }
158 176
159 .settings__header { 177 .settings__header {
@@ -163,7 +181,7 @@
163 height: 50px; 181 height: 50px;
164 padding: 0 40px; 182 padding: 0 40px;
165 width: calc(100% - 60px); 183 width: calc(100% - 60px);
166 color: #FFF; 184 color: #fff;
167 185
168 h1 { 186 h1 {
169 @extend %headline; 187 @extend %headline;
@@ -183,11 +201,13 @@
183 transform: skew(15deg) rotate(2deg); 201 transform: skew(15deg) rotate(2deg);
184 } 202 }
185 203
186 .mdi { color: $theme-gray-light; } 204 .mdi {
205 color: $theme-gray-light;
206 }
187 } 207 }
188 208
189 .settings_titles { 209 .settings_titles {
190 display:inline-block; 210 display: inline-block;
191 } 211 }
192 212
193 .settings__body { 213 .settings__body {
@@ -196,9 +216,13 @@
196 overflow-y: scroll; 216 overflow-y: scroll;
197 padding: 25px 15px 15px 25px; 217 padding: 25px 15px 15px 25px;
198 218
199 .badge { margin-right: 10px; } 219 .badge {
220 margin-right: 10px;
221 }
200 222
201 &::-webkit-scrollbar { width: 8px; } 223 &::-webkit-scrollbar {
224 width: 8px;
225 }
202 226
203 /* Track */ 227 /* Track */
204 &::-webkit-scrollbar-track { 228 &::-webkit-scrollbar-track {
@@ -214,9 +238,16 @@
214 -webkit-border-radius: 10px; 238 -webkit-border-radius: 10px;
215 } 239 }
216 240
217 &::-webkit-scrollbar-thumb:window-inactive { background: none; } 241 &::-webkit-scrollbar-thumb:window-inactive {
218 .service-flex-grid { display: flex; } 242 background: none;
219 .service-name,.user-agent { flex: 1px; } 243 }
244 .service-flex-grid {
245 display: flex;
246 }
247 .service-name,
248 .user-agent {
249 flex: 1px;
250 }
220 251
221 .service-icon { 252 .service-icon {
222 float: right; 253 float: right;
@@ -238,20 +269,28 @@
238 .settings__close { 269 .settings__close {
239 background: $theme-brand-primary; 270 background: $theme-brand-primary;
240 // border-left: 1px solid darken($theme-brand-primary, 8%); 271 // border-left: 1px solid darken($theme-brand-primary, 8%);
241 color: #FFF; 272 color: #fff;
242 font-size: 20px; 273 font-size: 20px;
243 height: 50px; 274 height: 50px;
244 padding: 0 20px; 275 padding: 0 20px;
245 position: absolute; 276 position: absolute;
246 right: 0; 277 right: 0;
247 transition: background $theme-transition-time; 278 @media (prefers-reduced-motion: no-preference) {
279 transition: background $theme-transition-time;
280 }
248 cursor: pointer; 281 cursor: pointer;
249 282
250 &::before { cursor: pointer; } 283 &::before {
251 &:hover { background: darken($theme-brand-primary, 5%); } 284 cursor: pointer;
285 }
286 &:hover {
287 background: darken($theme-brand-primary, 5%);
288 }
252 } 289 }
253 290
254 .search-input { margin-bottom: 30px; } 291 .search-input {
292 margin-bottom: 30px;
293 }
255 294
256 &__options { 295 &__options {
257 flex: 1; 296 flex: 1;
@@ -264,10 +303,12 @@
264 h3 { 303 h3 {
265 color: $theme-gray-light; 304 color: $theme-gray-light;
266 font-weight: bold; 305 font-weight: bold;
267 letter-spacing: -.1px; 306 letter-spacing: -0.1px;
268 margin: 25px 0 15px; 307 margin: 25px 0 15px;
269 308
270 &:first-of-type { margin-top: 0; } 309 &:first-of-type {
310 margin-top: 0;
311 }
271 312
272 .badge { 313 .badge {
273 font-weight: normal; 314 font-weight: normal;
@@ -308,14 +349,20 @@
308 padding: 10px 20px; 349 padding: 10px 20px;
309 350
310 .franz-form__button { 351 .franz-form__button {
311 &[type='submit'] { margin-left: auto; } 352 &[type='submit'] {
312 &.franz-form__button--secondary { background: $theme-gray-light; } 353 margin-left: auto;
354 }
355 &.franz-form__button--secondary {
356 background: $theme-gray-light;
357 }
313 } 358 }
314 } 359 }
315 360
316 .settings__delete-button { right: 0; } 361 .settings__delete-button {
362 right: 0;
363 }
317 .settings__open-recipe-file-button { 364 .settings__open-recipe-file-button {
318 cursor:pointer; 365 cursor: pointer;
319 margin-right: 10px; 366 margin-right: 10px;
320 } 367 }
321 .settings__open-recipe-file-container { 368 .settings__open-recipe-file-container {
@@ -336,7 +383,9 @@
336 margin-bottom: 1em; 383 margin-bottom: 1em;
337 } 384 }
338 385
339 a.button { margin-top: 40px; } 386 a.button {
387 margin-top: 40px;
388 }
340 } 389 }
341 390
342 .account { 391 .account {
@@ -349,8 +398,12 @@
349 margin-bottom: 40px; 398 margin-bottom: 40px;
350 padding: 20px; 399 padding: 20px;
351 400
352 &.account__box--flex { display: flex; } 401 &.account__box--flex {
353 &.account__box--last { margin-bottom: 0; } 402 display: flex;
403 }
404 &.account__box--last {
405 margin-bottom: 0;
406 }
354 407
355 .auth__button { 408 .auth__button {
356 margin-top: 10px; 409 margin-top: 10px;
@@ -366,38 +419,44 @@
366 .account__info { 419 .account__info {
367 flex: 1; 420 flex: 1;
368 421
369 h2 { margin-bottom: 5px; } 422 h2 {
370 .badge { margin-top: 5px; } 423 margin-bottom: 5px;
371 .username { margin-right: 10 } 424 }
425 .badge {
426 margin-top: 5px;
427 }
428 .username {
429 margin-right: 10;
430 }
372 } 431 }
373 432
374 .account__subscription { 433 .account__subscription {
375 align-items: center; 434 align-items: center;
376 display: flex; 435 display: flex;
377 436
378 .badge { margin-left: 10px; } 437 .badge {
379 } 438 margin-left: 10px;
380 439 }
381 .badge--premium {
382 margin-left: 1px;
383 position: relative;
384 top: -3px;
385 padding-top: 4px;
386 color: #FFF;
387 border-radius: 3px;
388 } 440 }
389 441
390
391 .manage-user-links { 442 .manage-user-links {
392 margin-top: 20px; 443 margin-top: 20px;
393 display: flex; 444 display: flex;
394 justify-content: space-between; 445 justify-content: space-between;
395 } 446 }
396 447
397 .account__subscription-button { margin-left: auto; } 448 .account__subscription-button {
398 .franz-form__button { white-space: nowrap; } 449 margin-left: auto;
399 div { height: auto; } 450 }
400 [data-type="franz-button"] div { height: 20px } 451 .franz-form__button {
452 white-space: nowrap;
453 }
454 div {
455 height: auto;
456 }
457 [data-type='franz-button'] div {
458 height: 20px;
459 }
401 460
402 .invoices { 461 .invoices {
403 width: 100%; 462 width: 100%;
@@ -415,7 +474,9 @@
415 .invoices__action { 474 .invoices__action {
416 text-align: right; 475 text-align: right;
417 476
418 button { color: $theme-brand-primary; } 477 button {
478 color: $theme-brand-primary;
479 }
419 } 480 }
420 } 481 }
421 } 482 }
@@ -425,16 +486,12 @@
425 font-size: 40px; 486 font-size: 40px;
426 margin-bottom: 20px; 487 margin-bottom: 20px;
427 488
428 img { width: 40px; } 489 img {
429 } 490 width: 40px;
430 491 }
431 .premium-info {
432 background: lighten($theme-brand-primary, 40%);
433 border-radius: $theme-border-radius;
434 padding: 20px;
435 } 492 }
436 493
437 .content-tabs .premium-info { 494 .content-tabs {
438 background: none; 495 background: none;
439 padding: 0; 496 padding: 0;
440 } 497 }
@@ -454,8 +511,8 @@
454 width: 240px; 511 width: 240px;
455 height: 100%; 512 height: 100%;
456 align-self: center; 513 align-self: center;
457 border-top-left-radius: $theme-border-radius;; 514 border-top-left-radius: $theme-border-radius;
458 border-bottom-left-radius: $theme-border-radius;; 515 border-bottom-left-radius: $theme-border-radius;
459 overflow: hidden; 516 overflow: hidden;
460 517
461 .settings-navigation__link { 518 .settings-navigation__link {
@@ -467,12 +524,15 @@
467 height: 51px; 524 height: 51px;
468 padding: 0 20px; 525 padding: 0 20px;
469 text-decoration: none; 526 text-decoration: none;
470 transition: background $theme-transition-time, color $theme-transition-time; 527 @media (prefers-reduced-motion: no-preference) {
528 transition: background $theme-transition-time,
529 color $theme-transition-time;
530 }
471 border-bottom: 1px solid darken($theme-gray-lightest, 3%); 531 border-bottom: 1px solid darken($theme-gray-lightest, 3%);
472 532
473 .badge { 533 .badge {
474 background: $theme-gray-light; 534 background: $theme-gray-light;
475 color: #FFF; 535 color: #fff;
476 } 536 }
477 537
478 &:hover { 538 &:hover {
@@ -480,26 +540,31 @@
480 540
481 .badge { 541 .badge {
482 background: $theme-gray-light; 542 background: $theme-gray-light;
483 color: #FFF; 543 color: #fff;
484 } 544 }
485 } 545 }
486 546
487 &.is-active { 547 &.is-active {
488 background: $theme-brand-primary; 548 background: $theme-brand-primary;
489 color: #FFF; 549 color: #fff;
490 550
491 .badge { 551 .badge {
492 background: #FFF; 552 background: #fff;
493 color: $theme-brand-primary; 553 color: $theme-brand-primary;
494 } 554 }
495 } 555 }
496 } 556 }
497 557
498 .settings-navigation__expander { flex: 1; } 558 .settings-navigation__expander {
559 flex: 1;
560 }
499 561
500 .badge { 562 .badge {
501 display: initial; 563 display: initial;
502 transition: background $theme-transition-time, color $theme-transition-time; 564 @media (prefers-reduced-motion: no-preference) {
565 transition: background $theme-transition-time,
566 color $theme-transition-time;
567 }
503 } 568 }
504 569
505 .settings-navigation__action-badge { 570 .settings-navigation__action-badge {
@@ -513,5 +578,7 @@
513} 578}
514 579
515.settings__support-badges { 580.settings__support-badges {
516 a { margin-right: 10px } 581 a {
582 margin-right: 10px;
583 }
517} 584}
diff --git a/src/styles/slider.scss b/src/styles/slider.scss
index 8bb771586..85b31660f 100644
--- a/src/styles/slider.scss
+++ b/src/styles/slider.scss
@@ -3,43 +3,44 @@
3.theme__dark .franz-form .franz-form__slider-wrapper .slider { 3.theme__dark .franz-form .franz-form__slider-wrapper .slider {
4 border: 1px solid $dark-theme-gray; 4 border: 1px solid $dark-theme-gray;
5 background: $dark-theme-gray; 5 background: $dark-theme-gray;
6
7} 6}
8 7
9
10.franz-form { 8.franz-form {
11 .franz-form__slider-wrapper { 9 .franz-form__slider-wrapper {
12 display: flex; 10 display: flex;
13 flex-direction: row; 11 flex-direction: row;
14 12
15 .franz-form__label { margin-left: 20px; } 13 .franz-form__label {
14 margin-left: 20px;
15 }
16 16
17 .slider-container { 17 .slider-container {
18 width: 100%; /* Width of the outside container */ 18 width: 100%; /* Width of the outside container */
19 } 19 }
20 20
21 /* The slider itself */ 21 /* The slider itself */
22 .slider { 22 .slider {
23 -webkit-appearance: none; 23 -webkit-appearance: none;
24 width: 100%; 24 width: 100%;
25 height: 14px; 25 height: 14px;
26 border-radius: $theme-border-radius; 26 border-radius: $theme-border-radius;
27 background: $theme-gray-lighter; 27 background: $theme-gray-lighter;
28 outline: none; 28 outline: none;
29 opacity: 1.0; 29 opacity: 1;
30 -webkit-transition: .2s; 30 @media (prefers-reduced-motion: no-preference) {
31 transition: opacity .2s; 31 transition: opacity 0.2s;
32 }
32 } 33 }
33 34
34 .slider::-webkit-slider-thumb { 35 .slider::-webkit-slider-thumb {
35 -webkit-appearance: none; 36 -webkit-appearance: none;
36 appearance: none; 37 appearance: none;
37 width: 14px; 38 width: 14px;
38 height: 14px; 39 height: 14px;
39 border-radius: 50%; 40 border-radius: 50%;
40 background: $theme-brand-primary; 41 background: $theme-brand-primary;
41 box-shadow: 0 1px 4px rgba(0, 0, 0, .3); 42 box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
42 cursor: pointer; 43 cursor: pointer;
43 } 44 }
44 } 45 }
45} 46}
diff --git a/src/styles/subscription-popup.scss b/src/styles/subscription-popup.scss
deleted file mode 100644
index 14e05e65d..000000000
--- a/src/styles/subscription-popup.scss
+++ /dev/null
@@ -1,18 +0,0 @@
1.subscription-popup {
2 height: 100%;
3
4 &__content { height: calc(100% - 60px); }
5 &__webview {
6 height: 100%;
7 background: #FFF;
8 }
9
10 &__toolbar {
11 background: $theme-gray-lightest;
12 border-top: 1px solid $theme-gray-lighter;
13 display: flex;
14 height: 60px;
15 justify-content: space-between;
16 padding: 10px;
17 }
18}
diff --git a/src/styles/subscription.scss b/src/styles/subscription.scss
deleted file mode 100644
index 70fb41cde..000000000
--- a/src/styles/subscription.scss
+++ /dev/null
@@ -1,49 +0,0 @@
1.subscription {
2 .subscription__premium-features {
3 margin: 10px 0;
4
5 li {
6 align-items: center;
7 display: flex;
8 height: 30px;
9
10 &:before {
11 content: "👍";
12 margin-right: 10px;
13 }
14
15 .badge { margin-left: 10px; }
16 }
17 }
18
19 .subscription__premium-info { margin: 15px 0 25px; }
20}
21
22.paymentTiers .franz-form__radio-wrapper {
23 flex-flow: wrap;
24
25 .franz-form__radio {
26 flex: initial;
27 margin-right: 2%;
28 width: 32%;
29
30 &:nth-child(3) { margin-right: 0; }
31
32 &:nth-child(4) {
33 margin-right: 0;
34 margin-top: 2%;
35 width: 100%;
36 }
37 }
38}
39
40.settings .paymentTiers .franz-form__radio-wrapper .franz-form__radio {
41 width: 49%;
42
43 &:nth-child(2) { margin-right: 0; }
44
45 &:nth-child(3) {
46 margin-top: 2%;
47 width: 100%;
48 }
49}
diff --git a/src/styles/tabs.scss b/src/styles/tabs.scss
index 31a239387..df10da77c 100644
--- a/src/styles/tabs.scss
+++ b/src/styles/tabs.scss
@@ -4,11 +4,17 @@
4 &.is-active { 4 &.is-active {
5 background: $dark-theme-gray; 5 background: $dark-theme-gray;
6 6
7 .tab-item__icon { margin-left: -4px; } 7 .tab-item__icon {
8 margin-left: -4px;
9 }
8 } 10 }
9 11
10 &.is-disabled .tab-item__icon { filter: grayscale(100%) opacity(.2); } 12 &.is-disabled .tab-item__icon {
11 .tab-item__icon { width: 34px; } 13 filter: grayscale(100%) opacity(0.2);
14 }
15 .tab-item__icon {
16 width: 34px;
17 }
12} 18}
13 19
14.tabs { 20.tabs {
@@ -29,22 +35,34 @@
29 justify-content: center; 35 justify-content: center;
30 min-height: 50px; 36 min-height: 50px;
31 position: relative; 37 position: relative;
32 transition: background $theme-transition-time; 38 @media (prefers-reduced-motion: no-preference) {
39 transition: background $theme-transition-time;
40 }
33 width: $theme-sidebar-width; 41 width: $theme-sidebar-width;
34 42
35 &.is-active { 43 &.is-active {
36 background: change-color($theme-brand-primary, 44 background: change-color(
37 $lightness: min(lightness($theme-brand-primary) * 1.35, 100)); 45 $theme-brand-primary,
46 $lightness: min(lightness($theme-brand-primary) * 1.35, 100)
47 );
38 border-left-width: 4px; 48 border-left-width: 4px;
39 border-left-style: solid; 49 border-left-style: solid;
40 color: $theme-brand-primary; 50 color: $theme-brand-primary;
41 51
42 .tab-item__icon { margin-left: -4px; } 52 .tab-item__icon {
53 margin-left: -4px;
54 }
43 } 55 }
44 56
45 &.is-disabled .tab-item__icon { filter: grayscale(100%) opacity(0.2); } 57 &.is-disabled .tab-item__icon {
46 &.has-custom-icon .tab-item__icon { border-radius: $theme-border-radius; } 58 filter: grayscale(100%) opacity(0.2);
47 &:active .tab-item__icon { opacity: .7; } 59 }
60 &.has-custom-icon .tab-item__icon {
61 border-radius: $theme-border-radius;
62 }
63 &:active .tab-item__icon {
64 opacity: 0.7;
65 }
48 66
49 .tab-item__icon { 67 .tab-item__icon {
50 height: auto; 68 height: auto;
@@ -56,7 +74,7 @@
56 background: $theme-brand-danger; 74 background: $theme-brand-danger;
57 border-radius: 20px; 75 border-radius: 20px;
58 bottom: 8px; 76 bottom: 8px;
59 color: #FFF; 77 color: #fff;
60 display: flex; 78 display: flex;
61 font-size: 11px; 79 font-size: 11px;
62 justify-content: center; 80 justify-content: center;
@@ -66,13 +84,13 @@
66 position: absolute; 84 position: absolute;
67 right: 8px; 85 right: 8px;
68 86
69 &.is-indirect { 87 &.is-indirect {
70 padding-top: 0; 88 padding-top: 0;
71 background: #0088cc; 89 background: #0088cc;
72 } 90 }
73 &.hibernating { 91 &.hibernating {
74 padding-top: 0; 92 padding-top: 0;
75 background: $theme-gray; 93 background: $theme-gray;
76 font-size: 0px; 94 font-size: 0px;
77 min-height: 10px; 95 min-height: 10px;
78 min-width: 10px; 96 min-width: 10px;
@@ -96,11 +114,13 @@
96 right: 8px; 114 right: 8px;
97 width: 17px; 115 width: 17px;
98 116
99 &.is-indirect { 117 &.is-indirect {
100 padding-top: 0; 118 padding-top: 0;
101 background: #0088cc; 119 background: #0088cc;
102 } 120 }
103 } 121 }
104 122
105 &.is-reordering { z-index: 99999; } 123 &.is-reordering {
124 z-index: 99999;
125 }
106} 126}
diff --git a/src/styles/toggle.scss b/src/styles/toggle.scss
index 5cd9e4526..ed4c0d11b 100644
--- a/src/styles/toggle.scss
+++ b/src/styles/toggle.scss
@@ -39,7 +39,9 @@ $toggle-button-size: 22px;
39 left: 1px; 39 left: 1px;
40 top: 1px; 40 top: 1px;
41 position: absolute; 41 position: absolute;
42 transition: all 0.5s; 42 @media (prefers-reduced-motion: no-preference) {
43 transition: all 0.5s;
44 }
43 width: $toggle-size - 2; 45 width: $toggle-size - 2;
44 } 46 }
45 47
diff --git a/src/styles/type.scss b/src/styles/type.scss
index 37ec0bcca..234c4d5c4 100644
--- a/src/styles/type.scss
+++ b/src/styles/type.scss
@@ -2,9 +2,15 @@
2@import './mixins.scss'; 2@import './mixins.scss';
3 3
4.theme__dark { 4.theme__dark {
5 a { color: $dark-theme-gray-smoke; } 5 a {
6 .label { color: $dark-theme-gray-lightest; } 6 color: $dark-theme-gray-smoke;
7 .footnote { color: $dark-theme-gray-lightest; } 7 }
8 .label {
9 color: $dark-theme-gray-lightest;
10 }
11 .footnote {
12 color: $dark-theme-gray-lightest;
13 }
8} 14}
9 15
10h1 { 16h1 {
@@ -21,36 +27,45 @@ h2 {
21 margin-bottom: 25px; 27 margin-bottom: 25px;
22 margin-top: 5px; 28 margin-top: 5px;
23 29
24 &:first-of-type { margin-top: 0; } 30 &:first-of-type {
31 margin-top: 0;
32 }
25} 33}
26 34
27p { 35p {
28 margin-bottom: 10px; 36 margin-bottom: 10px;
29 line-height: 1.7rem; 37 line-height: 1.7rem;
30 38
31 &:last-of-type { margin-bottom: 0; } 39 &:last-of-type {
40 margin-bottom: 0;
41 }
32} 42}
33 43
34strong { font-weight: bold; } 44strong {
45 font-weight: bold;
46}
35 47
36a, button { 48a,
49button {
37 color: $theme-text-color; 50 color: $theme-text-color;
38 text-decoration: none; 51 text-decoration: none;
39 52
40 &.button { 53 &.button {
41 background: $theme-brand-primary; 54 background: $theme-brand-primary;
42 color: #FFF; 55 color: #fff;
43 border-radius: 3px; 56 border-radius: 3px;
44 display: inline-block; 57 display: inline-block;
45 padding: 10px 20px; 58 padding: 10px 20px;
46 position: relative; 59 position: relative;
47 text-align: center; 60 text-align: center;
48 transition: background .5s, color .5s; 61 @media (prefers-reduced-motion: no-preference) {
62 transition: background 0.5s, color 0.5s;
63 }
49 cursor: pointer; 64 cursor: pointer;
50 65
51 &:hover { 66 &:hover {
52 background: darken($theme-brand-primary, 10%); 67 background: darken($theme-brand-primary, 10%);
53 color: #FFF; 68 color: #fff;
54 } 69 }
55 } 70 }
56 71
@@ -60,14 +75,19 @@ a, button {
60 } 75 }
61} 76}
62 77
63.error-message, .error-message:last-of-type { 78.error-message,
79.error-message:last-of-type {
64 color: $theme-brand-danger; 80 color: $theme-brand-danger;
65 margin: 10px 0; 81 margin: 10px 0;
66} 82}
67 83
68.center { text-align: center; } 84.center {
85 text-align: center;
86}
69 87
70.label { @include formLabel(); } 88.label {
89 @include formLabel();
90}
71 91
72.footnote { 92.footnote {
73 color: $theme-gray-light; 93 color: $theme-gray-light;
diff --git a/src/styles/welcome.scss b/src/styles/welcome.scss
index c1f85391e..7202fe148 100644
--- a/src/styles/welcome.scss
+++ b/src/styles/welcome.scss
@@ -1,24 +1,26 @@
1.auth .welcome { 1.auth .welcome {
2 height: auto; 2 height: auto;
3 3
4 &__content { 4 &__content {
5 align-items: center; 5 align-items: center;
6 color: #FFF; 6 color: #fff;
7 display: flex; 7 display: flex;
8 justify-content: center; 8 justify-content: center;
9 height: auto; 9 height: auto;
10 } 10 }
11 11
12 &__logo { width: 100px; } 12 &__logo {
13 width: 100px;
14 }
13 15
14 &__text { 16 &__text {
15 border-left: 1px solid #FFF; 17 border-left: 1px solid #fff;
16 margin-left: 40px; 18 margin-left: 40px;
17 padding-left: 40px; 19 padding-left: 40px;
18 20
19 h1 { 21 h1 {
20 font-size: 60px; 22 font-size: 60px;
21 letter-spacing: -.4rem; 23 letter-spacing: -0.4rem;
22 margin-bottom: 5px; 24 margin-bottom: 5px;
23 } 25 }
24 26
@@ -42,33 +44,35 @@
42 text-align: center; 44 text-align: center;
43 height: auto; 45 height: auto;
44 46
45 .button:first-of-type { margin-right: 25px; } 47 .button:first-of-type {
48 margin-right: 25px;
49 }
46 } 50 }
47 51
48 .button { 52 .button {
49 border-color: #FFF; 53 border-color: #fff;
50 color: #FFF; 54 color: #fff;
51 cursor: pointer; 55 cursor: pointer;
52 56
53 &:hover { 57 &:hover {
54 background: #FFF; 58 background: #fff;
55 color: $theme-brand-primary; 59 color: $theme-brand-primary;
56 } 60 }
57 61
58 &__inverted { 62 &__inverted {
59 background: #FFF; 63 background: #fff;
60 color: $theme-brand-primary; 64 color: $theme-brand-primary;
61 } 65 }
62 66
63 &__inverted:hover { 67 &__inverted:hover {
64 background: none; 68 background: none;
65 color: #FFF; 69 color: #fff;
66 } 70 }
67 } 71 }
68 72
69 &__featured-services { 73 &__featured-services {
70 align-items: center; 74 align-items: center;
71 background: #FFF; 75 background: #fff;
72 border-radius: 6px; 76 border-radius: 6px;
73 display: flex; 77 display: flex;
74 flex-wrap: wrap; 78 flex-wrap: wrap;
@@ -82,9 +86,13 @@
82 &__featured-service { 86 &__featured-service {
83 margin: 0 10px 15px; 87 margin: 0 10px 15px;
84 height: 35px; 88 height: 35px;
85 transition: .5s filter, .5s opacity; 89 @media (prefers-reduced-motion: no-preference) {
90 transition: 0.5s filter, 0.5s opacity;
91 }
86 width: 35px; 92 width: 35px;
87 93
88 img { width: 35px; } 94 img {
95 width: 35px;
96 }
89 } 97 }
90} 98}
diff --git a/src/webview/badge.js b/src/webview/badge.js
new file mode 100644
index 000000000..1e02fb56a
--- /dev/null
+++ b/src/webview/badge.js
@@ -0,0 +1,33 @@
1const { ipcRenderer } = require('electron');
2
3const debug = require('debug')('Ferdi:Plugin:BadgeHandler');
4
5export class BadgeHandler {
6 constructor() {
7 this.countCache = {
8 direct: 0,
9 indirect: 0,
10 };
11 }
12
13 setBadge(direct, indirect) {
14 if (this.countCache.direct === direct
15 && this.countCache.indirect === indirect) return;
16
17 // Parse number to integer
18 // This will correct errors that recipes may introduce, e.g.
19 // by sending a String instead of an integer
20 const directInt = parseInt(direct, 10);
21 const indirectInt = parseInt(indirect, 10);
22
23 const count = {
24 direct: Math.max(directInt, 0),
25 indirect: Math.max(indirectInt, 0),
26 };
27
28 ipcRenderer.sendToHost('message-counts', count);
29 Object.assign(this.countCache, count);
30
31 debug('Sending badge count to host', count);
32 }
33}
diff --git a/src/webview/contextMenuBuilder.js b/src/webview/contextMenuBuilder.js
index 63eed2ebe..602ce06f5 100644
--- a/src/webview/contextMenuBuilder.js
+++ b/src/webview/contextMenuBuilder.js
@@ -10,7 +10,7 @@ import {
10 clipboard, ipcRenderer, nativeImage, shell, 10 clipboard, ipcRenderer, nativeImage, shell,
11} from 'electron'; 11} from 'electron';
12import { Menu, MenuItem } from '@electron/remote'; 12import { Menu, MenuItem } from '@electron/remote';
13import { isMac } from '../environment'; 13import { shortcutKey, isMac } from '../environment';
14 14
15import { SEARCH_ENGINE_NAMES, SEARCH_ENGINE_URLS } from '../config'; 15import { SEARCH_ENGINE_NAMES, SEARCH_ENGINE_URLS } from '../config';
16 16
@@ -28,6 +28,7 @@ const contextMenuStringTable = {
28 cut: () => 'Cut', 28 cut: () => 'Cut',
29 copy: () => 'Copy', 29 copy: () => 'Copy',
30 paste: () => 'Paste', 30 paste: () => 'Paste',
31 pasteAndMatchStyle: () => 'Paste and match style',
31 searchWith: ({ searchEngine }) => `Search with ${searchEngine}`, 32 searchWith: ({ searchEngine }) => `Search with ${searchEngine}`,
32 openLinkUrl: () => 'Open Link', 33 openLinkUrl: () => 'Open Link',
33 openLinkInFerdiUrl: () => 'Open Link in Ferdi', 34 openLinkInFerdiUrl: () => 'Open Link in Ferdi',
@@ -61,7 +62,7 @@ module.exports = class ContextMenuBuilder {
61 * @param {function} processMenu If passed, this method will be passed the menu to change 62 * @param {function} processMenu If passed, this method will be passed the menu to change
62 * it prior to display. Signature: (menu, info) => menu 63 * it prior to display. Signature: (menu, info) => menu
63 */ 64 */
64 constructor(webContents, debugMode = false, processMenu = m => m) { 65 constructor(webContents, debugMode = false, processMenu = (m) => m) {
65 this.debugMode = debugMode; 66 this.debugMode = debugMode;
66 this.processMenu = processMenu; 67 this.processMenu = processMenu;
67 this.menu = null; 68 this.menu = null;
@@ -261,7 +262,7 @@ module.exports = class ContextMenuBuilder {
261 if (menuInfo.misspelledWord) { 262 if (menuInfo.misspelledWord) {
262 menu.append( 263 menu.append(
263 new MenuItem({ 264 new MenuItem({
264 label: 'Add to dictionary', 265 label: this.stringTable.addToDictionary(),
265 click: () => webContents.session.addWordToSpellCheckerDictionary(menuInfo.misspelledWord), 266 click: () => webContents.session.addWordToSpellCheckerDictionary(menuInfo.misspelledWord),
266 }), 267 }),
267 ); 268 );
@@ -320,7 +321,7 @@ module.exports = class ContextMenuBuilder {
320 label: this.stringTable.copyImage(), 321 label: this.stringTable.copyImage(),
321 click: () => { 322 click: () => {
322 const result = this.convertImageToBase64(menuInfo.srcURL, 323 const result = this.convertImageToBase64(menuInfo.srcURL,
323 dataURL => clipboard.writeImage(nativeImage.createFromDataURL(dataURL))); 324 (dataURL) => clipboard.writeImage(nativeImage.createFromDataURL(dataURL)));
324 325
325 this._sendNotificationOnClipboardEvent(menuInfo.clipboardNotifications, () => `Image copied from URL: ${menuInfo.srcURL}`); 326 this._sendNotificationOnClipboardEvent(menuInfo.clipboardNotifications, () => `Image copied from URL: ${menuInfo.srcURL}`);
326 return result; 327 return result;
@@ -375,7 +376,7 @@ module.exports = class ContextMenuBuilder {
375 const webContents = this.getWebContents(); 376 const webContents = this.getWebContents();
376 menu.append(new MenuItem({ 377 menu.append(new MenuItem({
377 label: this.stringTable.cut(), 378 label: this.stringTable.cut(),
378 accelerator: 'CommandOrControl+X', 379 accelerator: `${shortcutKey()}+X`,
379 enabled: menuInfo.editFlags.canCut, 380 enabled: menuInfo.editFlags.canCut,
380 click: () => webContents.cut(), 381 click: () => webContents.cut(),
381 })); 382 }));
@@ -390,7 +391,7 @@ module.exports = class ContextMenuBuilder {
390 const webContents = this.getWebContents(); 391 const webContents = this.getWebContents();
391 menu.append(new MenuItem({ 392 menu.append(new MenuItem({
392 label: this.stringTable.copy(), 393 label: this.stringTable.copy(),
393 accelerator: 'CommandOrControl+C', 394 accelerator: `${shortcutKey()}+C`,
394 enabled: menuInfo.editFlags.canCopy, 395 enabled: menuInfo.editFlags.canCopy,
395 click: () => webContents.copy(), 396 click: () => webContents.copy(),
396 })); 397 }));
@@ -405,7 +406,7 @@ module.exports = class ContextMenuBuilder {
405 const webContents = this.getWebContents(); 406 const webContents = this.getWebContents();
406 menu.append(new MenuItem({ 407 menu.append(new MenuItem({
407 label: this.stringTable.paste(), 408 label: this.stringTable.paste(),
408 accelerator: 'CommandOrControl+V', 409 accelerator: `${shortcutKey()}+V`,
409 enabled: menuInfo.editFlags.canPaste, 410 enabled: menuInfo.editFlags.canPaste,
410 click: () => webContents.paste(), 411 click: () => webContents.paste(),
411 })); 412 }));
@@ -422,8 +423,8 @@ module.exports = class ContextMenuBuilder {
422 const webContents = this.getWebContents(); 423 const webContents = this.getWebContents();
423 menu.append( 424 menu.append(
424 new MenuItem({ 425 new MenuItem({
425 label: 'Paste as plain text', 426 label: this.stringTable.pasteAndMatchStyle(),
426 accelerator: 'CommandOrControl+Shift+V', 427 accelerator: `${shortcutKey()}+Shift+V`,
427 click: () => webContents.pasteAndMatchStyle(), 428 click: () => webContents.pasteAndMatchStyle(),
428 }), 429 }),
429 ); 430 );
@@ -489,7 +490,7 @@ module.exports = class ContextMenuBuilder {
489 const webContents = this.getWebContents(); 490 const webContents = this.getWebContents();
490 menu.append(new MenuItem({ 491 menu.append(new MenuItem({
491 label: this.stringTable.goBack(), 492 label: this.stringTable.goBack(),
492 accelerator: 'CommandOrControl+left', 493 accelerator: `${shortcutKey()}+left`,
493 enabled: webContents.canGoBack(), 494 enabled: webContents.canGoBack(),
494 click: () => webContents.goBack(), 495 click: () => webContents.goBack(),
495 })); 496 }));
@@ -504,7 +505,7 @@ module.exports = class ContextMenuBuilder {
504 const webContents = this.getWebContents(); 505 const webContents = this.getWebContents();
505 menu.append(new MenuItem({ 506 menu.append(new MenuItem({
506 label: this.stringTable.goForward(), 507 label: this.stringTable.goForward(),
507 accelerator: 'CommandOrControl+right', 508 accelerator: `${shortcutKey()}+right`,
508 enabled: webContents.canGoForward(), 509 enabled: webContents.canGoForward(),
509 click: () => webContents.goForward(), 510 click: () => webContents.goForward(),
510 })); 511 }));
@@ -535,7 +536,7 @@ module.exports = class ContextMenuBuilder {
535 const baseURL = new URL(menuInfo.pageURL); 536 const baseURL = new URL(menuInfo.pageURL);
536 menu.append(new MenuItem({ 537 menu.append(new MenuItem({
537 label: this.stringTable.goToHomePage(), 538 label: this.stringTable.goToHomePage(),
538 accelerator: 'CommandOrControl+Home', 539 accelerator: `${shortcutKey()}+Home`,
539 enabled: true, 540 enabled: true,
540 click: () => { 541 click: () => {
541 // webContents.loadURL(baseURL.origin); 542 // webContents.loadURL(baseURL.origin);
diff --git a/src/webview/darkmode.js b/src/webview/darkmode.js
index ab629435c..7435d6404 100644
--- a/src/webview/darkmode.js
+++ b/src/webview/darkmode.js
@@ -1,7 +1,7 @@
1/* eslint no-bitwise: ["error", { "int32Hint": true }] */ 1/* eslint no-bitwise: ["error", { "int32Hint": true }] */
2 2
3import path from 'path'; 3import { join } from 'path';
4import fs from 'fs-extra'; 4import { pathExistsSync, readFileSync } from 'fs-extra';
5 5
6const debug = require('debug')('Ferdi:DarkMode'); 6const debug = require('debug')('Ferdi:DarkMode');
7 7
@@ -10,9 +10,9 @@ const chars = [...'abcdefghijklmnopqrstuvwxyz'];
10const ID = [...Array(20)].map(() => chars[Math.random() * chars.length | 0]).join``; 10const ID = [...Array(20)].map(() => chars[Math.random() * chars.length | 0]).join``;
11 11
12export function injectDarkModeStyle(recipePath) { 12export function injectDarkModeStyle(recipePath) {
13 const darkModeStyle = path.join(recipePath, 'darkmode.css'); 13 const darkModeStyle = join(recipePath, 'darkmode.css');
14 if (fs.pathExistsSync(darkModeStyle)) { 14 if (pathExistsSync(darkModeStyle)) {
15 const data = fs.readFileSync(darkModeStyle); 15 const data = readFileSync(darkModeStyle);
16 const styles = document.createElement('style'); 16 const styles = document.createElement('style');
17 styles.id = ID; 17 styles.id = ID;
18 styles.innerHTML = data.toString(); 18 styles.innerHTML = data.toString();
diff --git a/src/webview/find.js b/src/webview/find.js
new file mode 100644
index 000000000..040811d68
--- /dev/null
+++ b/src/webview/find.js
@@ -0,0 +1,23 @@
1import { ipcRenderer } from 'electron';
2import { FindInPage as ElectronFindInPage } from 'electron-find';
3
4// Shim to expose webContents functionality to electron-find without @electron/remote
5const webContentsShim = {
6 findInPage: (text, options = {}) => ipcRenderer.sendSync('find-in-page', text, options),
7 stopFindInPage: (action) => {
8 ipcRenderer.sendSync('stop-find-in-page', action);
9 },
10 on: (eventName, listener) => {
11 if (eventName === 'found-in-page') {
12 ipcRenderer.on('found-in-page', (_, result) => {
13 listener({ sender: this }, result);
14 });
15 }
16 },
17};
18
19export default class FindInPage extends ElectronFindInPage {
20 constructor(options = {}) {
21 super(webContentsShim, options);
22 }
23}
diff --git a/src/webview/lib/RecipeWebview.js b/src/webview/lib/RecipeWebview.js
index b8fe7dc52..96caa125e 100644
--- a/src/webview/lib/RecipeWebview.js
+++ b/src/webview/lib/RecipeWebview.js
@@ -1,14 +1,12 @@
1import { ipcRenderer } from 'electron'; 1import { ipcRenderer } from 'electron';
2import { pathExistsSync, readFile } from 'fs-extra'; 2import { exists, pathExistsSync, readFileSync } from 'fs-extra';
3 3
4const debug = require('debug')('Ferdi:Plugin:RecipeWebview'); 4const debug = require('debug')('Ferdi:Plugin:RecipeWebview');
5 5
6class RecipeWebview { 6class RecipeWebview {
7 constructor() { 7 constructor(badgeHandler, notificationsHandler) {
8 this.countCache = { 8 this.badgeHandler = badgeHandler;
9 direct: 0, 9 this.notificationsHandler = notificationsHandler;
10 indirect: 0,
11 };
12 10
13 ipcRenderer.on('poll', () => { 11 ipcRenderer.on('poll', () => {
14 this.loopFunc(); 12 this.loopFunc();
@@ -45,24 +43,7 @@ class RecipeWebview {
45 * me directly to me eg. in a channel 43 * me directly to me eg. in a channel
46 */ 44 */
47 setBadge(direct = 0, indirect = 0) { 45 setBadge(direct = 0, indirect = 0) {
48 if (this.countCache.direct === direct 46 this.badgeHandler.setBadge(direct, indirect);
49 && this.countCache.indirect === indirect) return;
50
51 // Parse number to integer
52 // This will correct errors that recipes may introduce, e.g.
53 // by sending a String instead of an integer
54 const directInt = parseInt(direct, 10);
55 const indirectInt = parseInt(indirect, 10);
56
57 const count = {
58 direct: Math.max(directInt, 0),
59 indirect: Math.max(indirectInt, 0),
60 };
61
62 ipcRenderer.sendToHost('message-counts', count);
63 Object.assign(this.countCache, count);
64
65 debug('Sending badge count to host', count);
66 } 47 }
67 48
68 /** 49 /**
@@ -74,9 +55,8 @@ class RecipeWebview {
74 injectCSS(...files) { 55 injectCSS(...files) {
75 files.forEach(async (file) => { 56 files.forEach(async (file) => {
76 if (pathExistsSync(file)) { 57 if (pathExistsSync(file)) {
77 const data = await readFile(file, 'utf8');
78 const styles = document.createElement('style'); 58 const styles = document.createElement('style');
79 styles.innerHTML = data; 59 styles.innerHTML = readFileSync(file, 'utf8');
80 60
81 document.querySelector('head').appendChild(styles); 61 document.querySelector('head').appendChild(styles);
82 62
@@ -85,6 +65,22 @@ class RecipeWebview {
85 }); 65 });
86 } 66 }
87 67
68 injectJSUnsafe(...files) {
69 Promise.all(files.map(async (file) => {
70 if (await exists(file)) {
71 return readFileSync(file, 'utf8');
72 }
73 debug('Script not found', file);
74 return null;
75 })).then(async (scripts) => {
76 const scriptsFound = scripts.filter((script) => script !== null);
77 if (scriptsFound.length > 0) {
78 debug('Inject scripts to main world', scriptsFound);
79 ipcRenderer.sendToHost('inject-js-unsafe', ...scriptsFound);
80 }
81 });
82 }
83
88 /** 84 /**
89 * Set a custom handler for turning on and off dark mode 85 * Set a custom handler for turning on and off dark mode
90 * 86 *
@@ -96,7 +92,7 @@ class RecipeWebview {
96 92
97 onNotify(fn) { 93 onNotify(fn) {
98 if (typeof fn === 'function') { 94 if (typeof fn === 'function') {
99 window.Notification.prototype.onNotify = fn; 95 this.notificationsHandler.onNotify = fn;
100 } 96 }
101 } 97 }
102 98
diff --git a/src/webview/notifications.js b/src/webview/notifications.js
index 021f05cc3..205a3220c 100644
--- a/src/webview/notifications.js
+++ b/src/webview/notifications.js
@@ -3,49 +3,65 @@ import uuidV1 from 'uuid/v1';
3 3
4const debug = require('debug')('Ferdi:Notifications'); 4const debug = require('debug')('Ferdi:Notifications');
5 5
6class Notification { 6export class NotificationsHandler {
7 static permission = 'granted'; 7 onNotify = (data) => data;
8 8
9 constructor(title = '', options = {}) { 9 displayNotification(title, options) {
10 debug('New notification', title, options); 10 return new Promise((resolve) => {
11 this.title = title; 11 debug('New notification', title, options);
12 this.options = options; 12
13 this.notificationId = uuidV1(); 13 const notificationId = uuidV1();
14 14
15 ipcRenderer.sendToHost('notification', this.onNotify({ 15 ipcRenderer.sendToHost('notification', this.onNotify({
16 title: this.title, 16 title,
17 options: this.options, 17 options,
18 notificationId: this.notificationId, 18 notificationId,
19 })); 19 }));
20 20
21 ipcRenderer.once(`notification-onclick:${this.notificationId}`, () => { 21 ipcRenderer.once(`notification-onclick:${notificationId}`, () => {
22 if (typeof this.onclick === 'function') { 22 resolve();
23 this.onclick(); 23 });
24 }
25 }); 24 });
26 } 25 }
26}
27 27
28 static requestPermission(cb = null) { 28export const notificationsClassDefinition = `(() => {
29 if (!cb) { 29 class Notification {
30 return new Promise((resolve) => { 30 static permission = 'granted';
31 resolve(Notification.permission);
32 });
33 }
34 31
35 if (typeof (cb) === 'function') { 32 constructor(title = '', options = {}) {
36 return cb(Notification.permission); 33 this.title = title;
34 this.options = options;
35 window.ferdi.displayNotification(title, options)
36 .then(() => {
37 if (typeof (this.onClick) === 'function') {
38 this.onClick();
39 }
40 });
37 } 41 }
38 42
39 return Notification.permission; 43 static requestPermission(cb = null) {
40 } 44 if (!cb) {
45 return new Promise((resolve) => {
46 resolve(Notification.permission);
47 });
48 }
41 49
42 onNotify(data) { 50 if (typeof (cb) === 'function') {
43 return data; 51 return cb(Notification.permission);
44 } 52 }
45 53
46 onClick() {} 54 return Notification.permission;
55 }
47 56
48 close() {} 57 onNotify(data) {
49} 58 return data;
59 }
60
61 onClick() {}
62
63 close() {}
64 }
50 65
51window.Notification = Notification; 66 window.Notification = Notification;
67})();`;
diff --git a/src/webview/recipe.js b/src/webview/recipe.js
index 8da45864b..a45c34002 100644
--- a/src/webview/recipe.js
+++ b/src/webview/recipe.js
@@ -1,11 +1,9 @@
1/* eslint-disable import/first */ 1/* eslint-disable import/first */
2import { ipcRenderer } from 'electron'; 2import { contextBridge, ipcRenderer } from 'electron';
3import { getCurrentWebContents } from '@electron/remote'; 3import { join } from 'path';
4import path from 'path';
5import { autorun, computed, observable } from 'mobx'; 4import { autorun, computed, observable } from 'mobx';
6import fs from 'fs-extra'; 5import { pathExistsSync, readFileSync } from 'fs-extra';
7import { debounce } from 'lodash'; 6import { debounce } from 'lodash';
8import { FindInPage } from 'electron-find';
9 7
10// For some services darkreader tries to use the chrome extension message API 8// For some services darkreader tries to use the chrome extension message API
11// This will cause the service to fail loading 9// This will cause the service to fail loading
@@ -23,16 +21,99 @@ import customDarkModeCss from './darkmode/custom';
23import RecipeWebview from './lib/RecipeWebview'; 21import RecipeWebview from './lib/RecipeWebview';
24import Userscript from './lib/Userscript'; 22import Userscript from './lib/Userscript';
25 23
26import { switchDict, getSpellcheckerLocaleByFuzzyIdentifier } from './spellchecker'; 24import { BadgeHandler } from './badge';
27import { injectDarkModeStyle, isDarkModeStyleInjected, removeDarkModeStyle } from './darkmode';
28import contextMenu from './contextMenu'; 25import contextMenu from './contextMenu';
29import './notifications'; 26import {
30import { screenShareCss } from './screenshare'; 27 injectDarkModeStyle,
28 isDarkModeStyleInjected,
29 removeDarkModeStyle,
30} from './darkmode';
31import FindInPage from './find';
32import {
33 NotificationsHandler,
34 notificationsClassDefinition,
35} from './notifications';
36import {
37 getDisplayMediaSelector,
38 screenShareCss,
39 screenShareJs,
40} from './screenshare';
41import {
42 switchDict,
43 getSpellcheckerLocaleByFuzzyIdentifier,
44} from './spellchecker';
31 45
32import { DEFAULT_APP_SETTINGS, isDevMode } from '../environment'; 46import { DEFAULT_APP_SETTINGS } from '../environment';
33 47
34const debug = require('debug')('Ferdi:Plugin'); 48const debug = require('debug')('Ferdi:Plugin');
35 49
50const badgeHandler = new BadgeHandler();
51
52const notificationsHandler = new NotificationsHandler();
53
54// Patching window.open
55const originalWindowOpen = window.open;
56
57window.open = (url, frameName, features) => {
58 debug('window.open', url, frameName, features);
59 if (!url) {
60 // The service hasn't yet supplied a URL (as used in Skype).
61 // Return a new dummy window object and wait for the service to change the properties
62 const newWindow = {
63 location: {
64 href: '',
65 },
66 };
67
68 const checkInterval = setInterval(() => {
69 // Has the service changed the URL yet?
70 if (newWindow.location.href !== '') {
71 if (features) {
72 originalWindowOpen(newWindow.location.href, frameName, features);
73 } else {
74 // Open the new URL
75 ipcRenderer.sendToHost('new-window', newWindow.location.href);
76 }
77 clearInterval(checkInterval);
78 }
79 }, 0);
80
81 setTimeout(() => {
82 // Stop checking for location changes after 1 second
83 clearInterval(checkInterval);
84 }, 1000);
85
86 return newWindow;
87 }
88
89 // We need to differentiate if the link should be opened in a popup or in the systems default browser
90 if (!frameName && !features && typeof features !== 'string') {
91 return ipcRenderer.sendToHost('new-window', url);
92 }
93
94 if (url) {
95 return originalWindowOpen(url, frameName, features);
96 }
97};
98
99// We can't override APIs here, so we first expose functions via window.ferdi,
100// then overwrite the corresponding field of the window object by injected JS.
101contextBridge.exposeInMainWorld('ferdi', {
102 open: window.open,
103 setBadge: (direct, indirect) =>
104 badgeHandler.setBadge(direct || 0, indirect || 0),
105 displayNotification: (title, options) =>
106 notificationsHandler.displayNotification(title, options),
107 getDisplayMediaSelector,
108});
109
110ipcRenderer.sendToHost(
111 'inject-js-unsafe',
112 'window.open = window.ferdi.open;',
113 notificationsClassDefinition,
114 screenShareJs,
115);
116
36class RecipeController { 117class RecipeController {
37 @observable settings = { 118 @observable settings = {
38 overrideSpellcheckerLanguage: false, 119 overrideSpellcheckerLanguage: false,
@@ -66,7 +147,9 @@ class RecipeController {
66 } 147 }
67 148
68 @computed get spellcheckerLanguage() { 149 @computed get spellcheckerLanguage() {
69 const selected = this.settings.service.spellcheckerLanguage || this.settings.app.spellcheckerLanguage; 150 const selected =
151 this.settings.service.spellcheckerLanguage ||
152 this.settings.app.spellcheckerLanguage;
70 return selected; 153 return selected;
71 } 154 }
72 155
@@ -75,7 +158,7 @@ class RecipeController {
75 findInPage = null; 158 findInPage = null;
76 159
77 async initialize() { 160 async initialize() {
78 Object.keys(this.ipcEvents).forEach((channel) => { 161 Object.keys(this.ipcEvents).forEach(channel => {
79 ipcRenderer.on(channel, (...args) => { 162 ipcRenderer.on(channel, (...args) => {
80 debug('Received IPC event for channel', channel, 'with', ...args); 163 debug('Received IPC event for channel', channel, 'with', ...args);
81 this[this.ipcEvents[channel]](...args); 164 this[this.ipcEvents[channel]](...args);
@@ -97,7 +180,7 @@ class RecipeController {
97 autorun(() => this.update()); 180 autorun(() => this.update());
98 181
99 document.addEventListener('DOMContentLoaded', () => { 182 document.addEventListener('DOMContentLoaded', () => {
100 this.findInPage = new FindInPage(getCurrentWebContents(), { 183 this.findInPage = new FindInPage({
101 inputFocusColor: '#CE9FFC', 184 inputFocusColor: '#CE9FFC',
102 textColor: '#212121', 185 textColor: '#212121',
103 }); 186 });
@@ -106,14 +189,14 @@ class RecipeController {
106 189
107 loadRecipeModule(event, config, recipe) { 190 loadRecipeModule(event, config, recipe) {
108 debug('loadRecipeModule'); 191 debug('loadRecipeModule');
109 const modulePath = path.join(recipe.path, 'webview.js'); 192 const modulePath = join(recipe.path, 'webview.js');
110 debug('module path', modulePath); 193 debug('module path', modulePath);
111 // Delete module from cache 194 // Delete module from cache
112 delete require.cache[require.resolve(modulePath)]; 195 delete require.cache[require.resolve(modulePath)];
113 try { 196 try {
114 this.recipe = new RecipeWebview(); 197 this.recipe = new RecipeWebview(badgeHandler, notificationsHandler);
115 // eslint-disable-next-line 198 // eslint-disable-next-line
116 require(modulePath)(this.recipe, {...config, recipe,}); 199 require(modulePath)(this.recipe, { ...config, recipe });
117 debug('Initialize Recipe', config, recipe); 200 debug('Initialize Recipe', config, recipe);
118 201
119 this.settings.service = Object.assign(config, { recipe }); 202 this.settings.service = Object.assign(config, { recipe });
@@ -131,15 +214,15 @@ class RecipeController {
131 const styles = document.createElement('style'); 214 const styles = document.createElement('style');
132 styles.innerHTML = screenShareCss; 215 styles.innerHTML = screenShareCss;
133 216
134 const userCss = path.join(recipe.path, 'user.css'); 217 const userCss = join(recipe.path, 'user.css');
135 if (await fs.exists(userCss)) { 218 if (pathExistsSync(userCss)) {
136 const data = await fs.readFile(userCss); 219 const data = readFileSync(userCss);
137 styles.innerHTML += data.toString(); 220 styles.innerHTML += data.toString();
138 } 221 }
139 document.querySelector('head').appendChild(styles); 222 document.querySelector('head').appendChild(styles);
140 223
141 const userJs = path.join(recipe.path, 'user.js'); 224 const userJs = join(recipe.path, 'user.js');
142 if (await fs.exists(userJs)) { 225 if (pathExistsSync(userJs)) {
143 const loadUserJs = () => { 226 const loadUserJs = () => {
144 // eslint-disable-next-line 227 // eslint-disable-next-line
145 const userJsModule = require(userJs); 228 const userJsModule = require(userJs);
@@ -167,8 +250,14 @@ class RecipeController {
167 update() { 250 update() {
168 debug('enableSpellchecking', this.settings.app.enableSpellchecking); 251 debug('enableSpellchecking', this.settings.app.enableSpellchecking);
169 debug('isDarkModeEnabled', this.settings.service.isDarkModeEnabled); 252 debug('isDarkModeEnabled', this.settings.service.isDarkModeEnabled);
170 debug('System spellcheckerLanguage', this.settings.app.spellcheckerLanguage); 253 debug(
171 debug('Service spellcheckerLanguage', this.settings.service.spellcheckerLanguage); 254 'System spellcheckerLanguage',
255 this.settings.app.spellcheckerLanguage,
256 );
257 debug(
258 'Service spellcheckerLanguage',
259 this.settings.service.spellcheckerLanguage,
260 );
172 debug('darkReaderSettigs', this.settings.service.darkReaderSettings); 261 debug('darkReaderSettigs', this.settings.service.darkReaderSettings);
173 debug('searchEngine', this.settings.app.searchEngine); 262 debug('searchEngine', this.settings.app.searchEngine);
174 263
@@ -181,7 +270,10 @@ class RecipeController {
181 let { spellcheckerLanguage } = this; 270 let { spellcheckerLanguage } = this;
182 if (spellcheckerLanguage.includes('automatic')) { 271 if (spellcheckerLanguage.includes('automatic')) {
183 this.automaticLanguageDetection(); 272 this.automaticLanguageDetection();
184 debug('Found `automatic` locale, falling back to user locale until detected', this.settings.app.locale); 273 debug(
274 'Found `automatic` locale, falling back to user locale until detected',
275 this.settings.app.locale,
276 );
185 spellcheckerLanguage = this.settings.app.locale; 277 spellcheckerLanguage = this.settings.app.locale;
186 } 278 }
187 switchDict(spellcheckerLanguage); 279 switchDict(spellcheckerLanguage);
@@ -193,7 +285,7 @@ class RecipeController {
193 this.hasUpdatedBeforeRecipeLoaded = true; 285 this.hasUpdatedBeforeRecipeLoaded = true;
194 } 286 }
195 287
196 console.log( 288 debug(
197 'Darkmode enabled?', 289 'Darkmode enabled?',
198 this.settings.service.isDarkModeEnabled, 290 this.settings.service.isDarkModeEnabled,
199 'Dark theme active?', 291 'Dark theme active?',
@@ -204,22 +296,29 @@ class RecipeController {
204 removeDarkModeStyle, 296 removeDarkModeStyle,
205 disableDarkMode, 297 disableDarkMode,
206 enableDarkMode, 298 enableDarkMode,
207 injectDarkModeStyle: () => injectDarkModeStyle(this.settings.service.recipe.path), 299 injectDarkModeStyle: () =>
300 injectDarkModeStyle(this.settings.service.recipe.path),
208 isDarkModeStyleInjected, 301 isDarkModeStyleInjected,
209 }; 302 };
210 303
211 if (this.settings.service.isDarkModeEnabled && this.settings.app.isDarkThemeActive !== false) { 304 if (
305 this.settings.service.isDarkModeEnabled &&
306 this.settings.app.isDarkThemeActive !== false
307 ) {
212 debug('Enable dark mode'); 308 debug('Enable dark mode');
213 309
214 // Check if recipe has a darkmode.css 310 // Check if recipe has a darkmode.css
215 const darkModeStyle = path.join(this.settings.service.recipe.path, 'darkmode.css'); 311 const darkModeStyle = join(
216 const darkModeExists = fs.pathExistsSync(darkModeStyle); 312 this.settings.service.recipe.path,
313 'darkmode.css',
314 );
315 const darkModeExists = pathExistsSync(darkModeStyle);
217 316
218 console.log('darkmode.css exists? ', darkModeExists ? 'Yes' : 'No'); 317 debug('darkmode.css exists? ', darkModeExists ? 'Yes' : 'No');
219 318
220 // Check if recipe has a custom dark mode handler 319 // Check if recipe has a custom dark mode handler
221 if (this.recipe && this.recipe.darkModeHandler) { 320 if (this.recipe && this.recipe.darkModeHandler) {
222 console.log('Using custom dark mode handler'); 321 debug('Using custom dark mode handler');
223 322
224 // Remove other dark mode styles if they were already loaded 323 // Remove other dark mode styles if they were already loaded
225 if (this.hasUpdatedBeforeRecipeLoaded) { 324 if (this.hasUpdatedBeforeRecipeLoaded) {
@@ -230,25 +329,32 @@ class RecipeController {
230 329
231 this.recipe.darkModeHandler(true, handlerConfig); 330 this.recipe.darkModeHandler(true, handlerConfig);
232 } else if (darkModeExists) { 331 } else if (darkModeExists) {
233 console.log('Injecting darkmode.css'); 332 debug('Injecting darkmode.css');
234 injectDarkModeStyle(this.settings.service.recipe.path); 333 injectDarkModeStyle(this.settings.service.recipe.path);
235 334
236 // Make sure universal dark mode is disabled 335 // Make sure universal dark mode is disabled
237 disableDarkMode(); 336 disableDarkMode();
238 this.universalDarkModeInjected = false; 337 this.universalDarkModeInjected = false;
239 } else if (this.settings.app.universalDarkMode && !ignoreList.includes(window.location.host)) { 338 } else if (
240 console.log('Injecting Dark Reader'); 339 this.settings.app.universalDarkMode &&
340 !ignoreList.includes(window.location.host)
341 ) {
342 debug('Injecting Dark Reader');
241 343
242 // Use Dark Reader instead 344 // Use Dark Reader instead
243 const { brightness, contrast, sepia } = this.settings.service.darkReaderSettings; 345 const { brightness, contrast, sepia } =
244 enableDarkMode({ brightness, contrast, sepia }, { 346 this.settings.service.darkReaderSettings;
245 css: customDarkModeCss[window.location.host] || '', 347 enableDarkMode(
246 }); 348 { brightness, contrast, sepia },
349 {
350 css: customDarkModeCss[window.location.host] || '',
351 },
352 );
247 this.universalDarkModeInjected = true; 353 this.universalDarkModeInjected = true;
248 } 354 }
249 } else { 355 } else {
250 debug('Remove dark mode'); 356 debug('Remove dark mode');
251 console.log('DarkMode disabled - removing remaining styles'); 357 debug('DarkMode disabled - removing remaining styles');
252 358
253 if (this.recipe && this.recipe.darkModeHandler) { 359 if (this.recipe && this.recipe.darkModeHandler) {
254 // Remove other dark mode styles if they were already loaded 360 // Remove other dark mode styles if they were already loaded
@@ -260,10 +366,10 @@ class RecipeController {
260 366
261 this.recipe.darkModeHandler(false, handlerConfig); 367 this.recipe.darkModeHandler(false, handlerConfig);
262 } else if (isDarkModeStyleInjected()) { 368 } else if (isDarkModeStyleInjected()) {
263 console.log('Removing injected darkmode.css'); 369 debug('Removing injected darkmode.css');
264 removeDarkModeStyle(); 370 removeDarkModeStyle();
265 } else { 371 } else {
266 console.log('Removing Dark Reader'); 372 debug('Removing Dark Reader');
267 373
268 disableDarkMode(); 374 disableDarkMode();
269 this.universalDarkModeInjected = false; 375 this.universalDarkModeInjected = false;
@@ -273,9 +379,9 @@ class RecipeController {
273 // Remove dark reader if (universal) dark mode was just disabled 379 // Remove dark reader if (universal) dark mode was just disabled
274 if (this.universalDarkModeInjected) { 380 if (this.universalDarkModeInjected) {
275 if ( 381 if (
276 !this.settings.app.darkMode 382 !this.settings.app.darkMode ||
277 || !this.settings.service.isDarkModeEnabled 383 !this.settings.service.isDarkModeEnabled ||
278 || !this.settings.app.universalDarkMode 384 !this.settings.app.universalDarkMode
279 ) { 385 ) {
280 disableDarkMode(); 386 disableDarkMode();
281 this.universalDarkModeInjected = false; 387 this.universalDarkModeInjected = false;
@@ -297,82 +403,42 @@ class RecipeController {
297 } 403 }
298 404
299 async automaticLanguageDetection() { 405 async automaticLanguageDetection() {
300 window.addEventListener('keyup', debounce(async (e) => { 406 window.addEventListener(
301 const element = e.target; 407 'keyup',
302 408 debounce(async e => {
303 if (!element) return; 409 const element = e.target;
304 410
305 let value = ''; 411 if (!element) return;
306 if (element.isContentEditable) { 412
307 value = element.textContent; 413 let value = '';
308 } else if (element.value) { 414 if (element.isContentEditable) {
309 value = element.value; 415 value = element.textContent;
310 } 416 } else if (element.value) {
417 value = element.value;
418 }
311 419
312 // Force a minimum length to get better detection results 420 // Force a minimum length to get better detection results
313 if (value.length < 25) return; 421 if (value.length < 25) return;
314 422
315 debug('Detecting language for', value); 423 debug('Detecting language for', value);
316 const locale = await ipcRenderer.invoke('detect-language', { sample: value }); 424 const locale = await ipcRenderer.invoke('detect-language', {
425 sample: value,
426 });
317 427
318 const spellcheckerLocale = getSpellcheckerLocaleByFuzzyIdentifier(locale); 428 const spellcheckerLocale =
319 debug('Language detected reliably, setting spellchecker language to', spellcheckerLocale); 429 getSpellcheckerLocaleByFuzzyIdentifier(locale);
320 if (spellcheckerLocale) { 430 debug(
321 switchDict(spellcheckerLocale); 431 'Language detected reliably, setting spellchecker language to',
322 } 432 spellcheckerLocale,
323 }, 225)); 433 );
434 if (spellcheckerLocale) {
435 switchDict(spellcheckerLocale);
436 }
437 }, 225),
438 );
324 } 439 }
325} 440}
326 441
327/* eslint-disable no-new */ 442/* eslint-disable no-new */
328new RecipeController(); 443new RecipeController();
329/* eslint-enable no-new */ 444/* eslint-enable no-new */
330
331// Patching window.open
332const originalWindowOpen = window.open;
333
334window.open = (url, frameName, features) => {
335 debug('window.open', url, frameName, features);
336 if (!url) {
337 // The service hasn't yet supplied a URL (as used in Skype).
338 // Return a new dummy window object and wait for the service to change the properties
339 const newWindow = {
340 location: {
341 href: '',
342 },
343 };
344
345 const checkInterval = setInterval(() => {
346 // Has the service changed the URL yet?
347 if (newWindow.location.href !== '') {
348 if (features) {
349 originalWindowOpen(newWindow.location.href, frameName, features);
350 } else {
351 // Open the new URL
352 ipcRenderer.sendToHost('new-window', newWindow.location.href);
353 }
354 clearInterval(checkInterval);
355 }
356 }, 0);
357
358 setTimeout(() => {
359 // Stop checking for location changes after 1 second
360 clearInterval(checkInterval);
361 }, 1000);
362
363 return newWindow;
364 }
365
366 // We need to differentiate if the link should be opened in a popup or in the systems default browser
367 if (!frameName && !features && typeof features !== 'string') {
368 return ipcRenderer.sendToHost('new-window', url);
369 }
370
371 if (url) {
372 return originalWindowOpen(url, frameName, features);
373 }
374};
375
376if (isDevMode) {
377 window.log = console.log;
378}
diff --git a/src/webview/screenshare.js b/src/webview/screenshare.js
index 84d2e1e95..e7e43c04e 100644
--- a/src/webview/screenshare.js
+++ b/src/webview/screenshare.js
@@ -2,6 +2,33 @@ import { desktopCapturer } from 'electron';
2 2
3const CANCEL_ID = 'desktop-capturer-selection__cancel'; 3const CANCEL_ID = 'desktop-capturer-selection__cancel';
4 4
5export async function getDisplayMediaSelector() {
6 const sources = await desktopCapturer.getSources({
7 types: ['screen', 'window'],
8 });
9 return `<div class="desktop-capturer-selection__scroller">
10 <ul class="desktop-capturer-selection__list">
11 ${sources
12 .map(
13 ({ id, name, thumbnail }) => `
14 <li class="desktop-capturer-selection__item">
15 <button class="desktop-capturer-selection__btn" data-id="${id}" title="${name}">
16 <img class="desktop-capturer-selection__thumbnail" src="${thumbnail.toDataURL()}" />
17 <span class="desktop-capturer-selection__name">${name}</span>
18 </button>
19 </li>
20 `,
21 )
22 .join('')}
23 <li class="desktop-capturer-selection__item">
24 <button class="desktop-capturer-selection__btn" data-id="${CANCEL_ID}" title="Cancel">
25 <span class="desktop-capturer-selection__name desktop-capturer-selection__name--cancel">Cancel</span>
26 </button>
27 </li>
28 </ul>
29</div>`;
30}
31
5export const screenShareCss = ` 32export const screenShareCss = `
6.desktop-capturer-selection { 33.desktop-capturer-selection {
7 position: fixed; 34 position: fixed;
@@ -46,7 +73,9 @@ export const screenShareCss = `
46 padding: 4px; 73 padding: 4px;
47 background: #252626; 74 background: #252626;
48 text-align: left; 75 text-align: left;
49 transition: background-color .15s, box-shadow .15s, color .15s; 76 @media (prefers-reduced-motion: no-preference) {
77 transition: background-color .15s, box-shadow .15s, color .15s;
78 }
50 color: #dedede; 79 color: #dedede;
51} 80}
52.desktop-capturer-selection__btn:hover, 81.desktop-capturer-selection__btn:hover,
@@ -72,38 +101,12 @@ export const screenShareCss = `
72} 101}
73`; 102`;
74 103
75// Patch getDisplayMedia for screen sharing 104export const screenShareJs = `
76window.navigator.mediaDevices.getDisplayMedia = () => async (resolve, reject) => { 105window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve, reject) => {
77 try { 106 try {
78 const sources = await desktopCapturer.getSources({
79 types: ['screen', 'window'],
80 });
81
82 const selectionElem = document.createElement('div'); 107 const selectionElem = document.createElement('div');
83 selectionElem.classList = 'desktop-capturer-selection'; 108 selectionElem.classList = ['desktop-capturer-selection'];
84 selectionElem.innerHTML = ` 109 selectionElem.innerHTML = await window.ferdi.getDisplayMediaSelector();
85 <div class="desktop-capturer-selection__scroller">
86 <ul class="desktop-capturer-selection__list">
87 ${sources
88 .map(
89 ({ id, name, thumbnail }) => `
90 <li class="desktop-capturer-selection__item">
91 <button class="desktop-capturer-selection__btn" data-id="${id}" title="${name}">
92 <img class="desktop-capturer-selection__thumbnail" src="${thumbnail.toDataURL()}" />
93 <span class="desktop-capturer-selection__name">${name}</span>
94 </button>
95 </li>
96 `,
97 )
98 .join('')}
99 <li class="desktop-capturer-selection__item">
100 <button class="desktop-capturer-selection__btn" data-id="${CANCEL_ID}" title="Cancel">
101 <span class="desktop-capturer-selection__name desktop-capturer-selection__name--cancel">Cancel</span>
102 </button>
103 </li>
104 </ul>
105 </div>
106 `;
107 document.body.appendChild(selectionElem); 110 document.body.appendChild(selectionElem);
108 111
109 document 112 document
@@ -112,25 +115,18 @@ window.navigator.mediaDevices.getDisplayMedia = () => async (resolve, reject) =>
112 button.addEventListener('click', async () => { 115 button.addEventListener('click', async () => {
113 try { 116 try {
114 const id = button.getAttribute('data-id'); 117 const id = button.getAttribute('data-id');
115 if (id === CANCEL_ID) { 118 if (id === '${CANCEL_ID}') {
116 reject(new Error('Cancelled by user')); 119 reject(new Error('Cancelled by user'));
117 } else { 120 } else {
118 const mediaSource = sources.find((source) => source.id === id); 121 const stream = await window.navigator.mediaDevices.getUserMedia({
119 if (!mediaSource) { 122 audio: false,
120 throw new Error(`Source with id ${id} does not exist`); 123 video: {
121 } 124 mandatory: {
122 125 chromeMediaSource: 'desktop',
123 const stream = await window.navigator.mediaDevices.getUserMedia( 126 chromeMediaSourceId: id,
124 {
125 audio: false,
126 video: {
127 mandatory: {
128 chromeMediaSource: 'desktop',
129 chromeMediaSourceId: mediaSource.id,
130 },
131 }, 127 },
132 }, 128 },
133 ); 129 });
134 resolve(stream); 130 resolve(stream);
135 } 131 }
136 } catch (err) { 132 } catch (err) {
@@ -143,4 +139,5 @@ window.navigator.mediaDevices.getDisplayMedia = () => async (resolve, reject) =>
143 } catch (err) { 139 } catch (err) {
144 reject(err); 140 reject(err);
145 } 141 }
146}; 142});
143`;
diff --git a/src/webview/spellchecker.js b/src/webview/spellchecker.js
index 58a04b728..0f4715207 100644
--- a/src/webview/spellchecker.js
+++ b/src/webview/spellchecker.js
@@ -1,6 +1,6 @@
1import { getCurrentWebContents } from '@electron/remote'; 1import { getCurrentWebContents } from '@electron/remote';
2import { SPELLCHECKER_LOCALES } from '../i18n/languages'; 2import { SPELLCHECKER_LOCALES } from '../i18n/languages';
3import { isMac } from '../environment'; 3import { DEFAULT_APP_SETTINGS, isMac } from '../environment';
4 4
5const debug = require('debug')('Ferdi:spellchecker'); 5const debug = require('debug')('Ferdi:spellchecker');
6 6
@@ -9,7 +9,7 @@ const [defaultLocale] = webContents.session.getSpellCheckerLanguages();
9debug('Spellchecker default locale is', defaultLocale); 9debug('Spellchecker default locale is', defaultLocale);
10 10
11export function getSpellcheckerLocaleByFuzzyIdentifier(identifier) { 11export function getSpellcheckerLocaleByFuzzyIdentifier(identifier) {
12 const locales = Object.keys(SPELLCHECKER_LOCALES).filter(key => key.toLocaleLowerCase() === identifier.toLowerCase() || key.split('-')[0] === identifier.toLowerCase()); 12 const locales = Object.keys(SPELLCHECKER_LOCALES).filter((key) => key.toLocaleLowerCase() === identifier.toLowerCase() || key.split('-')[0] === identifier.toLowerCase());
13 13
14 if (locales.length >= 1) { 14 if (locales.length >= 1) {
15 return locales[0]; 15 return locales[0];
@@ -33,7 +33,7 @@ export function switchDict(locale) {
33 locales.push(foundLocale); 33 locales.push(foundLocale);
34 } 34 }
35 35
36 locales.push(defaultLocale, 'de'); 36 locales.push(defaultLocale, DEFAULT_APP_SETTINGS.fallbackLocale);
37 37
38 webContents.session.setSpellCheckerLanguages(locales); 38 webContents.session.setSpellCheckerLanguages(locales);
39} 39}