aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/actions/service.js4
-rw-r--r--src/components/layout/AppLayout.js2
-rw-r--r--src/components/services/content/ServiceView.js136
-rw-r--r--src/components/services/content/ServiceWebview.js145
-rw-r--r--src/components/services/content/Services.js7
-rw-r--r--src/components/services/content/WebviewCrashHandler.js7
-rw-r--r--src/components/settings/account/AccountDashboard.js75
-rw-r--r--src/components/settings/user/EditUserForm.js25
-rw-r--r--src/components/subscription/SubscriptionForm.js60
-rw-r--r--src/components/subscription/SubscriptionPopup.js3
-rw-r--r--src/components/ui/Modal/index.js26
-rw-r--r--src/components/ui/Modal/styles.js1
-rw-r--r--src/config.js17
-rw-r--r--src/containers/auth/AuthLayoutContainer.js38
-rw-r--r--src/containers/auth/ImportScreen.js5
-rw-r--r--src/containers/auth/InviteScreen.js5
-rw-r--r--src/containers/auth/LoginScreen.js5
-rw-r--r--src/containers/auth/PasswordScreen.js5
-rw-r--r--src/containers/auth/PricingScreen.js5
-rw-r--r--src/containers/auth/SignupScreen.js5
-rw-r--r--src/containers/auth/WelcomeScreen.js5
-rw-r--r--src/containers/layout/AppLayoutContainer.js3
-rw-r--r--src/containers/settings/AccountScreen.js5
-rw-r--r--src/containers/settings/EditServiceScreen.js5
-rw-r--r--src/containers/settings/EditSettingsScreen.js5
-rw-r--r--src/containers/settings/EditUserScreen.js49
-rw-r--r--src/containers/settings/InviteScreen.js6
-rw-r--r--src/containers/settings/RecipesScreen.js6
-rw-r--r--src/containers/settings/ServicesScreen.js5
-rw-r--r--src/containers/subscription/SubscriptionFormScreen.js39
-rw-r--r--src/electron/ipc-api/autoUpdate.js2
-rw-r--r--src/features/basicAuth/Component.js1
-rw-r--r--src/features/basicAuth/index.js12
-rw-r--r--src/features/delayApp/index.js9
-rw-r--r--src/features/shareFranz/Component.js166
-rw-r--r--src/features/shareFranz/index.js52
-rw-r--r--src/helpers/url-helpers.js15
-rw-r--r--src/i18n/globalMessages.js4
-rw-r--r--src/i18n/languages.js3
-rw-r--r--src/i18n/locales/ca.json23
-rw-r--r--src/i18n/locales/cs.json31
-rw-r--r--src/i18n/locales/de.json13
-rw-r--r--src/i18n/locales/defaultMessages.json3934
-rw-r--r--src/i18n/locales/el.json15
-rw-r--r--src/i18n/locales/en-US.json450
-rw-r--r--src/i18n/locales/es.json27
-rw-r--r--src/i18n/locales/fr.json19
-rw-r--r--src/i18n/locales/ga.json11
-rw-r--r--src/i18n/locales/hr.json11
-rw-r--r--src/i18n/locales/hu.json97
-rw-r--r--src/i18n/locales/id.json31
-rw-r--r--src/i18n/locales/it.json45
-rw-r--r--src/i18n/locales/ja.json33
-rw-r--r--src/i18n/locales/ka.json11
-rw-r--r--src/i18n/locales/nl-BE.json203
-rw-r--r--src/i18n/locales/nl.json33
-rw-r--r--src/i18n/locales/pl.json41
-rw-r--r--src/i18n/locales/pt-BR.json29
-rw-r--r--src/i18n/locales/pt.json85
-rw-r--r--src/i18n/locales/ru.json61
-rw-r--r--src/i18n/locales/sk.json11
-rw-r--r--src/i18n/locales/sr.json11
-rw-r--r--src/i18n/locales/tr.json73
-rw-r--r--src/i18n/locales/uk.json69
-rw-r--r--src/i18n/locales/whitelist_en-US.json2
-rw-r--r--src/i18n/locales/zh-TW.json101
-rw-r--r--src/i18n/manage-translations.js9
-rw-r--r--src/i18n/messages/src/components/auth/Import.json54
-rw-r--r--src/i18n/messages/src/components/auth/Invite.json93
-rw-r--r--src/i18n/messages/src/components/auth/Login.json119
-rw-r--r--src/i18n/messages/src/components/auth/Password.json93
-rw-r--r--src/i18n/messages/src/components/auth/Pricing.json54
-rw-r--r--src/i18n/messages/src/components/auth/Signup.json158
-rw-r--r--src/i18n/messages/src/components/auth/Welcome.json28
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json80
-rw-r--r--src/i18n/messages/src/components/layout/Sidebar.json54
-rw-r--r--src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json67
-rw-r--r--src/i18n/messages/src/components/services/content/ServiceDisabled.json28
-rw-r--r--src/i18n/messages/src/components/services/content/Services.json28
-rw-r--r--src/i18n/messages/src/components/services/content/WebviewCrashHandler.json54
-rw-r--r--src/i18n/messages/src/components/services/tabs/TabItem.json119
-rw-r--r--src/i18n/messages/src/components/settings/account/AccountDashboard.json197
-rw-r--r--src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json80
-rw-r--r--src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json106
-rw-r--r--src/i18n/messages/src/components/settings/services/EditServiceForm.json288
-rw-r--r--src/i18n/messages/src/components/settings/services/ServiceError.json54
-rw-r--r--src/i18n/messages/src/components/settings/services/ServiceItem.json41
-rw-r--r--src/i18n/messages/src/components/settings/services/ServicesDashboard.json119
-rw-r--r--src/i18n/messages/src/components/settings/settings/EditSettingsForm.json223
-rw-r--r--src/i18n/messages/src/components/settings/user/EditUserForm.json80
-rw-r--r--src/i18n/messages/src/components/subscription/SubscriptionForm.json171
-rw-r--r--src/i18n/messages/src/components/subscription/SubscriptionPopup.json28
-rw-r--r--src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json15
-rw-r--r--src/i18n/messages/src/components/util/ErrorBoundary/index.json28
-rw-r--r--src/i18n/messages/src/containers/settings/EditServiceScreen.json197
-rw-r--r--src/i18n/messages/src/containers/settings/EditSettingsScreen.json158
-rw-r--r--src/i18n/messages/src/containers/settings/EditUserScreen.json119
-rw-r--r--src/i18n/messages/src/features/delayApp/Component.json41
-rw-r--r--src/i18n/messages/src/features/shareFranz/Component.json93
-rw-r--r--src/i18n/messages/src/helpers/validation-helpers.json67
-rw-r--r--src/i18n/messages/src/i18n/globalMessages.json80
-rw-r--r--src/i18n/messages/src/lib/Menu.json613
-rw-r--r--src/index.js63
-rw-r--r--src/lib/Menu.js127
-rw-r--r--src/lib/Tray.js8
-rw-r--r--src/lib/analytics.js4
-rw-r--r--src/stores/AppStore.js72
-rw-r--r--src/stores/FeaturesStore.js2
-rw-r--r--src/stores/RecipePreviewsStore.js3
-rw-r--r--src/stores/RequestStore.js3
-rw-r--r--src/stores/ServicesStore.js11
-rw-r--r--src/stores/UIStore.js7
-rw-r--r--src/styles/layout.scss9
-rw-r--r--src/styles/toggle.scss2
-rw-r--r--src/theme/dark/index.js19
-rw-r--r--src/theme/default/index.js35
116 files changed, 9472 insertions, 1167 deletions
diff --git a/src/actions/service.js b/src/actions/service.js
index 5d483b12a..ceaabc31e 100644
--- a/src/actions/service.js
+++ b/src/actions/service.js
@@ -1,4 +1,5 @@
1import PropTypes from 'prop-types'; 1import PropTypes from 'prop-types';
2import ServiceModel from '../models/Service';
2 3
3export default { 4export default {
4 setActive: { 5 setActive: {
@@ -36,6 +37,9 @@ export default {
36 serviceId: PropTypes.string.isRequired, 37 serviceId: PropTypes.string.isRequired,
37 webview: PropTypes.object.isRequired, 38 webview: PropTypes.object.isRequired,
38 }, 39 },
40 detachService: {
41 service: PropTypes.instanceOf(ServiceModel).isRequired,
42 },
39 focusService: { 43 focusService: {
40 serviceId: PropTypes.string.isRequired, 44 serviceId: PropTypes.string.isRequired,
41 }, 45 },
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index bce792e56..593149e72 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -7,6 +7,7 @@ import { TitleBar } from 'electron-react-titlebar';
7import InfoBar from '../ui/InfoBar'; 7import InfoBar from '../ui/InfoBar';
8import { Component as DelayApp } from '../../features/delayApp'; 8import { Component as DelayApp } from '../../features/delayApp';
9import { Component as BasicAuth } from '../../features/basicAuth'; 9import { Component as BasicAuth } from '../../features/basicAuth';
10import { Component as ShareFranz } from '../../features/shareFranz';
10import ErrorBoundary from '../util/ErrorBoundary'; 11import ErrorBoundary from '../util/ErrorBoundary';
11 12
12// import globalMessages from '../../i18n/globalMessages'; 13// import globalMessages from '../../i18n/globalMessages';
@@ -164,6 +165,7 @@ export default @observer class AppLayout extends Component {
164 )} 165 )}
165 {isDelayAppScreenVisible && (<DelayApp />)} 166 {isDelayAppScreenVisible && (<DelayApp />)}
166 <BasicAuth /> 167 <BasicAuth />
168 <ShareFranz />
167 {services} 169 {services}
168 </div> 170 </div>
169 </div> 171 </div>
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
new file mode 100644
index 000000000..5afc54f9d
--- /dev/null
+++ b/src/components/services/content/ServiceView.js
@@ -0,0 +1,136 @@
1import React, { Component, Fragment } from 'react';
2import PropTypes from 'prop-types';
3import { autorun } from 'mobx';
4import { observer } from 'mobx-react';
5import classnames from 'classnames';
6
7import ServiceModel from '../../../models/Service';
8import StatusBarTargetUrl from '../../ui/StatusBarTargetUrl';
9import WebviewLoader from '../../ui/WebviewLoader';
10import WebviewCrashHandler from './WebviewCrashHandler';
11import WebviewErrorHandler from './ErrorHandlers/WebviewErrorHandler';
12import ServiceDisabled from './ServiceDisabled';
13import ServiceWebview from './ServiceWebview';
14
15export default @observer class ServiceView extends Component {
16 static propTypes = {
17 service: PropTypes.instanceOf(ServiceModel).isRequired,
18 setWebviewReference: PropTypes.func.isRequired,
19 detachService: PropTypes.func.isRequired,
20 reload: PropTypes.func.isRequired,
21 edit: PropTypes.func.isRequired,
22 enable: PropTypes.func.isRequired,
23 isActive: PropTypes.bool,
24 };
25
26 static defaultProps = {
27 isActive: false,
28 };
29
30 state = {
31 forceRepaint: false,
32 targetUrl: '',
33 statusBarVisible: false,
34 };
35
36 autorunDisposer = null;
37
38 componentDidMount() {
39 this.autorunDisposer = autorun(() => {
40 if (this.props.service.isActive) {
41 this.setState({ forceRepaint: true });
42 setTimeout(() => {
43 this.setState({ forceRepaint: false });
44 }, 100);
45 }
46 });
47 }
48
49 componentWillUnmount() {
50 this.autorunDisposer();
51 }
52
53 updateTargetUrl = (event) => {
54 let visible = true;
55 if (event.url === '' || event.url === '#') {
56 visible = false;
57 }
58 this.setState({
59 targetUrl: event.url,
60 statusBarVisible: visible,
61 });
62 };
63
64 render() {
65 const {
66 detachService,
67 service,
68 setWebviewReference,
69 reload,
70 edit,
71 enable,
72 } = this.props;
73
74 const webviewClasses = classnames({
75 services__webview: true,
76 'services__webview-wrapper': true,
77 'is-active': service.isActive,
78 'services__webview--force-repaint': this.state.forceRepaint,
79 });
80
81 let statusBar = null;
82 if (this.state.statusBarVisible) {
83 statusBar = (
84 <StatusBarTargetUrl text={this.state.targetUrl} />
85 );
86 }
87
88 return (
89 <div className={webviewClasses}>
90 {service.isActive && service.isEnabled && (
91 <Fragment>
92 {service.hasCrashed && (
93 <WebviewCrashHandler
94 name={service.recipe.name}
95 webview={service.webview}
96 reload={reload}
97 />
98 )}
99 {service.isEnabled && service.isLoading && service.isFirstLoad && (
100 <WebviewLoader
101 loaded={false}
102 name={service.name}
103 />
104 )}
105 {service.isError && (
106 <WebviewErrorHandler
107 name={service.recipe.name}
108 errorMessage={service.errorMessage}
109 reload={reload}
110 edit={edit}
111 />
112 )}
113 </Fragment>
114 )}
115 {!service.isEnabled ? (
116 <Fragment>
117 {service.isActive && (
118 <ServiceDisabled
119 name={service.recipe.name}
120 webview={service.webview}
121 enable={enable}
122 />
123 )}
124 </Fragment>
125 ) : (
126 <ServiceWebview
127 service={service}
128 setWebviewReference={setWebviewReference}
129 detachService={detachService}
130 />
131 )}
132 {statusBar}
133 </div>
134 );
135 }
136}
diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js
index bb577e4cc..7252c695f 100644
--- a/src/components/services/content/ServiceWebview.js
+++ b/src/components/services/content/ServiceWebview.js
@@ -1,145 +1,50 @@
1import React, { Component, Fragment } from 'react'; 1import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { autorun } from 'mobx';
4import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
5import Webview from 'react-electron-web-view'; 4import ElectronWebView from 'react-electron-web-view';
6import classnames from 'classnames';
7 5
8import ServiceModel from '../../../models/Service'; 6import ServiceModel from '../../../models/Service';
9import StatusBarTargetUrl from '../../ui/StatusBarTargetUrl';
10import WebviewLoader from '../../ui/WebviewLoader';
11import WebviewCrashHandler from './WebviewCrashHandler';
12import WebviewErrorHandler from './ErrorHandlers/WebviewErrorHandler';
13import ServiceDisabled from './ServiceDisabled';
14 7
15export default @observer class ServiceWebview extends Component { 8@observer
9class ServiceWebview extends Component {
16 static propTypes = { 10 static propTypes = {
17 service: PropTypes.instanceOf(ServiceModel).isRequired, 11 service: PropTypes.instanceOf(ServiceModel).isRequired,
18 setWebviewReference: PropTypes.func.isRequired, 12 setWebviewReference: PropTypes.func.isRequired,
19 reload: PropTypes.func.isRequired, 13 detachService: PropTypes.func.isRequired,
20 edit: PropTypes.func.isRequired,
21 enable: PropTypes.func.isRequired,
22 isActive: PropTypes.bool,
23 }; 14 };
24 15
25 static defaultProps = {
26 isActive: false,
27 };
28
29 state = {
30 forceRepaint: false,
31 targetUrl: '',
32 statusBarVisible: false,
33 };
34
35 autorunDisposer = null;
36
37 webview = null; 16 webview = null;
38 17
39 componentDidMount() {
40 this.autorunDisposer = autorun(() => {
41 if (this.props.service.isActive) {
42 this.setState({ forceRepaint: true });
43 setTimeout(() => {
44 this.setState({ forceRepaint: false });
45 }, 100);
46 }
47 });
48 }
49
50 componentWillUnmount() { 18 componentWillUnmount() {
51 this.autorunDisposer(); 19 const { service, detachService } = this.props;
52 } 20 detachService({ service });
53
54 updateTargetUrl = (event) => {
55 let visible = true;
56 if (event.url === '' || event.url === '#') {
57 visible = false;
58 }
59 this.setState({
60 targetUrl: event.url,
61 statusBarVisible: visible,
62 });
63 } 21 }
64 22
65 render() { 23 render() {
66 const { 24 const {
67 service, 25 service,
68 setWebviewReference, 26 setWebviewReference,
69 reload,
70 edit,
71 enable,
72 } = this.props; 27 } = this.props;
73 28
74 const webviewClasses = classnames({
75 services__webview: true,
76 'services__webview-wrapper': true,
77 'is-active': service.isActive,
78 'services__webview--force-repaint': this.state.forceRepaint,
79 });
80
81 let statusBar = null;
82 if (this.state.statusBarVisible) {
83 statusBar = (
84 <StatusBarTargetUrl text={this.state.targetUrl} />
85 );
86 }
87
88 return ( 29 return (
89 <div className={webviewClasses}> 30 <ElectronWebView
90 {service.isActive && service.isEnabled && ( 31 ref={(webview) => { this.webview = webview; }}
91 <Fragment> 32 autosize
92 {service.hasCrashed && ( 33 src={service.url}
93 <WebviewCrashHandler 34 preload="./webview/recipe.js"
94 name={service.recipe.name} 35 partition={`persist:service-${service.id}`}
95 webview={service.webview} 36 onDidAttach={() => {
96 reload={reload} 37 setWebviewReference({
97 /> 38 serviceId: service.id,
98 )} 39 webview: this.webview.view,
99 {service.isEnabled && service.isLoading && service.isFirstLoad && ( 40 });
100 <WebviewLoader 41 }}
101 loaded={false} 42 onUpdateTargetUrl={this.updateTargetUrl}
102 name={service.name} 43 useragent={service.userAgent}
103 /> 44 allowpopups
104 )} 45 />
105 {service.isError && (
106 <WebviewErrorHandler
107 name={service.recipe.name}
108 errorMessage={service.errorMessage}
109 reload={reload}
110 edit={edit}
111 />
112 )}
113 </Fragment>
114 )}
115 {!service.isEnabled ? (
116 <Fragment>
117 {service.isActive && (
118 <ServiceDisabled
119 name={service.recipe.name}
120 webview={service.webview}
121 enable={enable}
122 />
123 )}
124 </Fragment>
125 ) : (
126 <Webview
127 ref={(element) => { this.webview = element; }}
128 autosize
129 src={service.url}
130 preload="./webview/recipe.js"
131 partition={`persist:service-${service.id}`}
132 onDidAttach={() => setWebviewReference({
133 serviceId: service.id,
134 webview: this.webview.view,
135 })}
136 onUpdateTargetUrl={this.updateTargetUrl}
137 useragent={service.userAgent}
138 allowpopups
139 />
140 )}
141 {statusBar}
142 </div>
143 ); 46 );
144 } 47 }
145} 48}
49
50export default ServiceWebview;
diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js
index 54f16ba12..8f8c38a11 100644
--- a/src/components/services/content/Services.js
+++ b/src/components/services/content/Services.js
@@ -4,7 +4,7 @@ import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { Link } from 'react-router'; 4import { Link } from 'react-router';
5import { defineMessages, intlShape } from 'react-intl'; 5import { defineMessages, intlShape } from 'react-intl';
6 6
7import Webview from './ServiceWebview'; 7import ServiceView from './ServiceView';
8import Appear from '../../ui/effects/Appear'; 8import Appear from '../../ui/effects/Appear';
9 9
10const messages = defineMessages({ 10const messages = defineMessages({
@@ -22,6 +22,7 @@ export default @observer class Services extends Component {
22 static propTypes = { 22 static propTypes = {
23 services: MobxPropTypes.arrayOrObservableArray, 23 services: MobxPropTypes.arrayOrObservableArray,
24 setWebviewReference: PropTypes.func.isRequired, 24 setWebviewReference: PropTypes.func.isRequired,
25 detachService: PropTypes.func.isRequired,
25 handleIPCMessage: PropTypes.func.isRequired, 26 handleIPCMessage: PropTypes.func.isRequired,
26 openWindow: PropTypes.func.isRequired, 27 openWindow: PropTypes.func.isRequired,
27 reload: PropTypes.func.isRequired, 28 reload: PropTypes.func.isRequired,
@@ -42,6 +43,7 @@ export default @observer class Services extends Component {
42 services, 43 services,
43 handleIPCMessage, 44 handleIPCMessage,
44 setWebviewReference, 45 setWebviewReference,
46 detachService,
45 openWindow, 47 openWindow,
46 reload, 48 reload,
47 openSettings, 49 openSettings,
@@ -71,11 +73,12 @@ export default @observer class Services extends Component {
71 </Appear> 73 </Appear>
72 )} 74 )}
73 {services.map(service => ( 75 {services.map(service => (
74 <Webview 76 <ServiceView
75 key={service.id} 77 key={service.id}
76 service={service} 78 service={service}
77 handleIPCMessage={handleIPCMessage} 79 handleIPCMessage={handleIPCMessage}
78 setWebviewReference={setWebviewReference} 80 setWebviewReference={setWebviewReference}
81 detachService={detachService}
79 openWindow={openWindow} 82 openWindow={openWindow}
80 reload={() => reload({ serviceId: service.id })} 83 reload={() => reload({ serviceId: service.id })}
81 edit={() => openSettings({ path: `services/edit/${service.id}` })} 84 edit={() => openSettings({ path: `services/edit/${service.id}` })}
diff --git a/src/components/services/content/WebviewCrashHandler.js b/src/components/services/content/WebviewCrashHandler.js
index 42bc3c877..7a69dba87 100644
--- a/src/components/services/content/WebviewCrashHandler.js
+++ b/src/components/services/content/WebviewCrashHandler.js
@@ -2,6 +2,7 @@ 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 { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import ms from 'ms';
5 6
6import Button from '../../ui/Button'; 7import Button from '../../ui/Button';
7 8
@@ -35,12 +36,12 @@ export default @observer class WebviewCrashHandler extends Component {
35 }; 36 };
36 37
37 state = { 38 state = {
38 countdown: 10000, 39 countdown: ms('10s'),
39 } 40 }
40 41
41 countdownInterval = null; 42 countdownInterval = null;
42 43
43 countdownIntervalTimeout = 1000; 44 countdownIntervalTimeout = ms('1s');
44 45
45 46
46 componentDidMount() { 47 componentDidMount() {
@@ -75,7 +76,7 @@ export default @observer class WebviewCrashHandler extends Component {
75 <p className="footnote"> 76 <p className="footnote">
76 {intl.formatMessage(messages.autoReload, { 77 {intl.formatMessage(messages.autoReload, {
77 name, 78 name,
78 seconds: this.state.countdown / 1000, 79 seconds: this.state.countdown / ms('1s'),
79 })} 80 })}
80 </p> 81 </p>
81 </div> 82 </div>
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js
index 9c9543749..181b95c8c 100644
--- a/src/components/settings/account/AccountDashboard.js
+++ b/src/components/settings/account/AccountDashboard.js
@@ -44,10 +44,6 @@ const messages = defineMessages({
44 id: 'settings.account.accountType.premium', 44 id: 'settings.account.accountType.premium',
45 defaultMessage: '!!!Premium Supporter Account', 45 defaultMessage: '!!!Premium Supporter Account',
46 }, 46 },
47 accountTypeEnterprise: {
48 id: 'settings.account.accountType.enterprise',
49 defaultMessage: '!!!Enterprise Account',
50 },
51 accountEditButton: { 47 accountEditButton: {
52 id: 'settings.account.account.editButton', 48 id: 'settings.account.account.editButton',
53 defaultMessage: '!!!Edit Account', 49 defaultMessage: '!!!Edit Account',
@@ -169,15 +165,9 @@ export default @observer class AccountDashboard extends Component {
169 {user.organization && `${user.organization}, `} 165 {user.organization && `${user.organization}, `}
170 {user.email} 166 {user.email}
171 <br /> 167 <br />
172 {!user.isEnterprise && !user.isPremium && (
173 <span className="badge badge">{intl.formatMessage(messages.accountTypeBasic)}</span>
174 )}
175 {user.isPremium && ( 168 {user.isPremium && (
176 <span className="badge badge--premium">{intl.formatMessage(messages.accountTypePremium)}</span> 169 <span className="badge badge--premium">{intl.formatMessage(messages.accountTypePremium)}</span>
177 )} 170 )}
178 {user.isEnterprise && (
179 <span className="badge badge--success">{intl.formatMessage(messages.accountTypeEnterprise)}</span>
180 )}
181 </div> 171 </div>
182 <Link to="/settings/user/edit" className="button"> 172 <Link to="/settings/user/edit" className="button">
183 {intl.formatMessage(messages.accountEditButton)} 173 {intl.formatMessage(messages.accountEditButton)}
@@ -235,34 +225,7 @@ export default @observer class AccountDashboard extends Component {
235 ) 225 )
236 )} 226 )}
237 227
238 {user.isEnterprise && ( 228 {!user.isPremium && (
239 <div className="account">
240 <div className="account__box">
241 <h2>{user.company.name}</h2>
242 <p>
243 Technical contact:&nbsp;
244 <Link
245 className="link"
246 target="_blank"
247 to={`mailto:${user.company.contact.technical}?subject=Franz`}
248 >
249 {user.company.contact.technical}
250 </Link>
251 <br />
252 General contact:&nbsp;
253 <Link
254 className="link"
255 target="_blank"
256 to={`mailto:${user.company.contact.default}?subject=Franz`}
257 >
258 {user.company.contact.default}
259 </Link>
260 </p>
261 </div>
262 </div>
263 )}
264
265 {!user.isEnterprise && !user.isPremium && (
266 isLoadingPlans ? ( 229 isLoadingPlans ? (
267 <Loader /> 230 <Loader />
268 ) : ( 231 ) : (
@@ -277,27 +240,25 @@ export default @observer class AccountDashboard extends Component {
277 ) 240 )
278 )} 241 )}
279 242
280 {!user.isEnterprise && ( 243 <div className="account franz-form">
281 <div className="account franz-form"> 244 <div className="account__box">
282 <div className="account__box"> 245 <h2>{intl.formatMessage(messages.headlineDangerZone)}</h2>
283 <h2>{intl.formatMessage(messages.headlineDangerZone)}</h2> 246 {!isDeleteAccountSuccessful && (
284 {!isDeleteAccountSuccessful && ( 247 <div className="account__subscription">
285 <div className="account__subscription"> 248 <p>{intl.formatMessage(messages.deleteInfo)}</p>
286 <p>{intl.formatMessage(messages.deleteInfo)}</p> 249 <Button
287 <Button 250 label={intl.formatMessage(messages.deleteAccount)}
288 label={intl.formatMessage(messages.deleteAccount)} 251 buttonType="danger"
289 buttonType="danger" 252 onClick={() => deleteAccount()}
290 onClick={() => deleteAccount()} 253 loaded={!isLoadingDeleteAccount}
291 loaded={!isLoadingDeleteAccount} 254 />
292 />
293 </div>
294 )}
295 {isDeleteAccountSuccessful && (
296 <p>{intl.formatMessage(messages.deleteEmailSent)}</p>
297 )}
298 </div> 255 </div>
256 )}
257 {isDeleteAccountSuccessful && (
258 <p>{intl.formatMessage(messages.deleteEmailSent)}</p>
259 )}
299 </div> 260 </div>
300 )} 261 </div>
301 </Fragment> 262 </Fragment>
302 )} 263 )}
303 </div> 264 </div>
diff --git a/src/components/settings/user/EditUserForm.js b/src/components/settings/user/EditUserForm.js
index 0e3ac6b10..a1a353e57 100644
--- a/src/components/settings/user/EditUserForm.js
+++ b/src/components/settings/user/EditUserForm.js
@@ -3,11 +3,10 @@ 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 { Link } from 'react-router'; 5import { Link } from 'react-router';
6 6import { Input } from '@meetfranz/forms';
7// import { Link } from 'react-router';
8 7
9import Form from '../../../lib/Form'; 8import Form from '../../../lib/Form';
10import Input from '../../ui/Input'; 9// import Input from '../../ui/Input';
11import Button from '../../ui/Button'; 10import Button from '../../ui/Button';
12import Radio from '../../ui/Radio'; 11import Radio from '../../ui/Radio';
13import Infobox from '../../ui/Infobox'; 12import Infobox from '../../ui/Infobox';
@@ -39,13 +38,12 @@ const messages = defineMessages({
39 }, 38 },
40}); 39});
41 40
42export default @observer class EditServiceForm extends Component { 41export default @observer class EditUserForm extends Component {
43 static propTypes = { 42 static propTypes = {
44 status: MobxPropTypes.observableArray.isRequired, 43 status: MobxPropTypes.observableArray.isRequired,
45 form: PropTypes.instanceOf(Form).isRequired, 44 form: PropTypes.instanceOf(Form).isRequired,
46 onSubmit: PropTypes.func.isRequired, 45 onSubmit: PropTypes.func.isRequired,
47 isSaving: PropTypes.bool.isRequired, 46 isSaving: PropTypes.bool.isRequired,
48 isEnterprise: PropTypes.bool.isRequired,
49 }; 47 };
50 48
51 static contextTypes = { 49 static contextTypes = {
@@ -68,7 +66,6 @@ export default @observer class EditServiceForm extends Component {
68 // user, 66 // user,
69 status, 67 status,
70 form, 68 form,
71 isEnterprise,
72 isSaving, 69 isSaving,
73 } = this.props; 70 } = this.props;
74 const { intl } = this.context; 71 const { intl } = this.context;
@@ -98,23 +95,21 @@ export default @observer class EditServiceForm extends Component {
98 )} 95 )}
99 <h2>{intl.formatMessage(messages.headlineAccount)}</h2> 96 <h2>{intl.formatMessage(messages.headlineAccount)}</h2>
100 <div className="grid__row"> 97 <div className="grid__row">
101 <Input field={form.$('firstname')} focus /> 98 <Input {...form.$('firstname').bind()} focus />
102 <Input field={form.$('lastname')} /> 99 <Input {...form.$('lastname').bind()} />
103 </div> 100 </div>
104 <Input field={form.$('email')} /> 101 <Input {...form.$('email').bind()} />
105 {!isEnterprise && ( 102 <Radio field={form.$('accountType')} />
106 <Radio field={form.$('accountType')} /> 103 {form.$('accountType').value === 'company' && (
107 )}
108 {!isEnterprise && form.$('accountType').value === 'company' && (
109 <Input field={form.$('organization')} /> 104 <Input field={form.$('organization')} />
110 )} 105 )}
111 <h2>{intl.formatMessage(messages.headlinePassword)}</h2> 106 <h2>{intl.formatMessage(messages.headlinePassword)}</h2>
112 <Input 107 <Input
113 field={form.$('oldPassword')} 108 {...form.$('oldPassword').bind()}
114 showPasswordToggle 109 showPasswordToggle
115 /> 110 />
116 <Input 111 <Input
117 field={form.$('newPassword')} 112 {...form.$('newPassword').bind()}
118 showPasswordToggle 113 showPasswordToggle
119 scorePassword 114 scorePassword
120 /> 115 />
diff --git a/src/components/subscription/SubscriptionForm.js b/src/components/subscription/SubscriptionForm.js
index 90da8ddc3..7a818d100 100644
--- a/src/components/subscription/SubscriptionForm.js
+++ b/src/components/subscription/SubscriptionForm.js
@@ -35,31 +35,29 @@ const messages = defineMessages({
35 id: 'subscription.includedFeatures', 35 id: 'subscription.includedFeatures',
36 defaultMessage: '!!!The Franz Premium Supporter Account includes', 36 defaultMessage: '!!!The Franz Premium Supporter Account includes',
37 }, 37 },
38 features: { 38 onpremise: {
39 onpremise: { 39 id: 'subscription.features.onpremise.mattermost',
40 id: 'subscription.features.onpremise.mattermost', 40 defaultMessage: '!!!Add on-premise/hosted services like Mattermost',
41 defaultMessage: '!!!Add on-premise/hosted services like Mattermost', 41 },
42 }, 42 noInterruptions: {
43 noInterruptions: { 43 id: 'subscription.features.noInterruptions',
44 id: 'subscription.features.noInterruptions', 44 defaultMessage: '!!!No app delays & nagging to upgrade license',
45 defaultMessage: '!!!No app delays & nagging to upgrade license', 45 },
46 }, 46 proxy: {
47 proxy: { 47 id: 'subscription.features.proxy',
48 id: 'subscription.features.proxy', 48 defaultMessage: '!!!Proxy support for services',
49 defaultMessage: '!!!Proxy support for services', 49 },
50 }, 50 spellchecker: {
51 spellchecker: { 51 id: 'subscription.features.spellchecker',
52 id: 'subscription.features.spellchecker', 52 defaultMessage: '!!!Support for Spellchecker',
53 defaultMessage: '!!!Support for Spellchecker', 53 },
54 }, 54 ads: {
55 ads: { 55 id: 'subscription.features.ads',
56 id: 'subscription.features.ads', 56 defaultMessage: '!!!No ads, ever!',
57 defaultMessage: '!!!No ads, ever!', 57 },
58 }, 58 comingSoon: {
59 comingSoon: { 59 id: 'subscription.features.comingSoon',
60 id: 'subscription.features.comingSoon', 60 defaultMessage: '!!!coming soon',
61 defaultMessage: '!!!coming soon',
62 },
63 }, 61 },
64 euTaxInfo: { 62 euTaxInfo: {
65 id: 'subscription.euTaxInfo', 63 id: 'subscription.euTaxInfo',
@@ -85,7 +83,7 @@ export default @observer class SubscriptionForm extends Component {
85 showSkipOption: false, 83 showSkipOption: false,
86 skipAction: () => null, 84 skipAction: () => null,
87 skipButtonLabel: '', 85 skipButtonLabel: '',
88 } 86 };
89 87
90 static contextTypes = { 88 static contextTypes = {
91 intl: intlShape, 89 intl: intlShape,
@@ -162,18 +160,18 @@ export default @observer class SubscriptionForm extends Component {
162 </p> 160 </p>
163 <div className="subscription"> 161 <div className="subscription">
164 <ul className="subscription__premium-features"> 162 <ul className="subscription__premium-features">
165 <li>{intl.formatMessage(messages.features.onpremise)}</li> 163 <li>{intl.formatMessage(messages.onpremise)}</li>
166 <li> 164 <li>
167 {intl.formatMessage(messages.features.noInterruptions)} 165 {intl.formatMessage(messages.noInterruptions)}
168 </li> 166 </li>
169 <li> 167 <li>
170 {intl.formatMessage(messages.features.spellchecker)} 168 {intl.formatMessage(messages.spellchecker)}
171 </li> 169 </li>
172 <li> 170 <li>
173 {intl.formatMessage(messages.features.proxy)} 171 {intl.formatMessage(messages.proxy)}
174 </li> 172 </li>
175 <li> 173 <li>
176 {intl.formatMessage(messages.features.ads)} 174 {intl.formatMessage(messages.ads)}
177 </li> 175 </li>
178 </ul> 176 </ul>
179 </div> 177 </div>
diff --git a/src/components/subscription/SubscriptionPopup.js b/src/components/subscription/SubscriptionPopup.js
index b5d7c4b2d..0f6f0260f 100644
--- a/src/components/subscription/SubscriptionPopup.js
+++ b/src/components/subscription/SubscriptionPopup.js
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl'; 4import { defineMessages, intlShape } from 'react-intl';
5import Webview from 'react-electron-web-view'; 5import Webview from 'react-electron-web-view';
6import ms from 'ms';
6 7
7import Button from '../ui/Button'; 8import Button from '../ui/Button';
8 9
@@ -42,7 +43,7 @@ export default @observer class SubscriptionPopup extends Component {
42 43
43 setTimeout(() => { 44 setTimeout(() => {
44 this.props.closeWindow(); 45 this.props.closeWindow();
45 }, 4000); 46 }, ms('4s'));
46 } 47 }
47 48
48 render() { 49 render() {
diff --git a/src/components/ui/Modal/index.js b/src/components/ui/Modal/index.js
index d84e4c713..0b7154760 100644
--- a/src/components/ui/Modal/index.js
+++ b/src/components/ui/Modal/index.js
@@ -3,9 +3,12 @@ import ReactModal from 'react-modal';
3import PropTypes from 'prop-types'; 3import PropTypes from 'prop-types';
4import classnames from 'classnames'; 4import classnames from 'classnames';
5import injectCSS from 'react-jss'; 5import injectCSS from 'react-jss';
6import { Icon } from '@meetfranz/ui';
6 7
7import styles from './styles'; 8import styles from './styles';
8 9
10// ReactModal.setAppElement('#root');
11
9export default @injectCSS(styles) class Modal extends Component { 12export default @injectCSS(styles) class Modal extends Component {
10 static propTypes = { 13 static propTypes = {
11 children: PropTypes.node.isRequired, 14 children: PropTypes.node.isRequired,
@@ -14,11 +17,15 @@ export default @injectCSS(styles) class Modal extends Component {
14 isOpen: PropTypes.bool.isRequired, 17 isOpen: PropTypes.bool.isRequired,
15 portal: PropTypes.string, 18 portal: PropTypes.string,
16 close: PropTypes.func.isRequired, 19 close: PropTypes.func.isRequired,
20 shouldCloseOnOverlayClick: PropTypes.bool,
21 showClose: PropTypes.bool,
17 } 22 }
18 23
19 static defaultProps = { 24 static defaultProps = {
20 className: null, 25 className: null,
21 portal: 'modal-portal', 26 portal: 'modal-portal',
27 shouldCloseOnOverlayClick: false,
28 showClose: true,
22 } 29 }
23 30
24 render() { 31 render() {
@@ -29,6 +36,8 @@ export default @injectCSS(styles) class Modal extends Component {
29 isOpen, 36 isOpen,
30 portal, 37 portal,
31 close, 38 close,
39 shouldCloseOnOverlayClick,
40 showClose,
32 } = this.props; 41 } = this.props;
33 42
34 return ( 43 return (
@@ -42,14 +51,17 @@ export default @injectCSS(styles) class Modal extends Component {
42 overlayClassName={classes.overlay} 51 overlayClassName={classes.overlay}
43 portal={portal} 52 portal={portal}
44 onRequestClose={close} 53 onRequestClose={close}
54 shouldCloseOnOverlayClick={shouldCloseOnOverlayClick}
45 > 55 >
46 {/* <button 56 {showClose && close && (
47 type="button" 57 <button
48 className={classnames({ 58 type="button"
49 [`${classes.close}`]: true, 59 className={classes.close}
50 'mdi mdi-close': true, 60 onClick={close}
51 })} 61 >
52 /> */} 62 <Icon icon="mdiClose" size={1.5} />
63 </button>
64 )}
53 <div className={classes.content}> 65 <div className={classes.content}>
54 {children} 66 {children}
55 </div> 67 </div>
diff --git a/src/components/ui/Modal/styles.js b/src/components/ui/Modal/styles.js
index 56fecbf55..49b970c97 100644
--- a/src/components/ui/Modal/styles.js
+++ b/src/components/ui/Modal/styles.js
@@ -28,5 +28,6 @@ export default theme => ({
28 position: 'absolute', 28 position: 'absolute',
29 top: 0, 29 top: 0,
30 right: 0, 30 right: 0,
31 padding: 20,
31 }, 32 },
32}); 33});
diff --git a/src/config.js b/src/config.js
index aecba45be..479572edb 100644
--- a/src/config.js
+++ b/src/config.js
@@ -1,15 +1,18 @@
1import electron from 'electron'; 1import electron from 'electron';
2import path from 'path'; 2import path from 'path';
3import isDevMode from 'electron-is-dev';
4import ms from 'ms';
5
3import { asarPath } from './helpers/asar-helpers'; 6import { asarPath } from './helpers/asar-helpers';
4 7
5const app = process.type === 'renderer' ? electron.remote.app : electron.app; 8const app = process.type === 'renderer' ? electron.remote.app : electron.app;
6const systemPreferences = process.type === 'renderer' ? electron.remote.systemPreferences : electron.systemPreferences; 9const systemPreferences = process.type === 'renderer' ? electron.remote.systemPreferences : electron.systemPreferences;
7 10
8export const CHECK_INTERVAL = 1000 * 3600; // How often should we perform checks 11export const CHECK_INTERVAL = ms('1h'); // How often should we perform checks
9export const LOCAL_API = 'http://localhost:3000'; 12export const LOCAL_API = 'http://localhost:3000';
10export const DEV_API = 'https://dev.franzinfra.com'; 13export const DEV_API = 'https://dev.franzinfra.com';
11export const LIVE_API = 'https://api.franzinfra.com'; 14export const LIVE_API = 'https://api.franzinfra.com';
12export const GA_ID = 'UA-74126766-10'; 15export const GA_ID = !isDevMode ? 'UA-74126766-10' : 'UA-74126766-12';
13 16
14export const DEFAULT_APP_SETTINGS = { 17export const DEFAULT_APP_SETTINGS = {
15 autoLaunchInBackground: false, 18 autoLaunchInBackground: false,
@@ -33,8 +36,8 @@ export const DEFAULT_FEATURES_CONFIG = {
33 isSpellcheckerPremiumFeature: false, 36 isSpellcheckerPremiumFeature: false,
34 needToWaitToProceed: false, 37 needToWaitToProceed: false,
35 needToWaitToProceedConfig: { 38 needToWaitToProceedConfig: {
36 delayOffset: 3600000, 39 delayOffset: ms('1h'),
37 wait: 10000, 40 wait: ms('10s'),
38 }, 41 },
39 isServiceProxyEnabled: false, 42 isServiceProxyEnabled: false,
40 isServiceProxyPremiumFeature: true, 43 isServiceProxyPremiumFeature: true,
@@ -59,3 +62,9 @@ export const SETTINGS_PATH = path.join(app.getPath('userData'), 'config');
59 62
60// Replacing app.asar is not beautiful but unforunately necessary 63// Replacing app.asar is not beautiful but unforunately necessary
61export const DICTIONARY_PATH = asarPath(path.join(__dirname, 'dictionaries')); 64export const DICTIONARY_PATH = asarPath(path.join(__dirname, 'dictionaries'));
65
66export const ALLOWED_PROTOCOLS = [
67 'https:',
68 'http:',
69 'ftp:',
70];
diff --git a/src/containers/auth/AuthLayoutContainer.js b/src/containers/auth/AuthLayoutContainer.js
index 762929dc6..e63f40c06 100644
--- a/src/containers/auth/AuthLayoutContainer.js
+++ b/src/containers/auth/AuthLayoutContainer.js
@@ -1,6 +1,8 @@
1import React, { Component } from 'react'; 1import 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';
4import { ThemeProvider } from 'react-jss';
5import { theme } from '@meetfranz/theme';
4 6
5import AuthLayout from '../../components/auth/AuthLayout'; 7import AuthLayout from '../../components/auth/AuthLayout';
6import AppStore from '../../stores/AppStore'; 8import AppStore from '../../stores/AppStore';
@@ -21,30 +23,38 @@ export default @inject('stores', 'actions') @observer class AuthLayoutContainer
21 const { 23 const {
22 stores, actions, children, location, 24 stores, actions, children, location,
23 } = this.props; 25 } = this.props;
24 const { app, features, globalError } = stores; 26 const {
27 app, features, globalError, settings,
28 } = stores;
25 29
26 const isLoadingBaseFeatures = features.defaultFeaturesRequest.isExecuting 30 const isLoadingBaseFeatures = features.defaultFeaturesRequest.isExecuting
27 && !features.defaultFeaturesRequest.wasExecuted; 31 && !features.defaultFeaturesRequest.wasExecuted;
28 32
33 const themeType = theme(settings.app.darkMode ? 'dark' : 'default');
34
29 if (isLoadingBaseFeatures) { 35 if (isLoadingBaseFeatures) {
30 return ( 36 return (
31 <AppLoader /> 37 <ThemeProvider theme={theme(themeType)}>
38 <AppLoader />
39 </ThemeProvider>
32 ); 40 );
33 } 41 }
34 42
35 return ( 43 return (
36 <AuthLayout 44 <ThemeProvider theme={theme(themeType)}>
37 error={globalError.response} 45 <AuthLayout
38 pathname={location.pathname} 46 error={globalError.response}
39 isOnline={app.isOnline} 47 pathname={location.pathname}
40 isAPIHealthy={!app.healthCheckRequest.isError} 48 isOnline={app.isOnline}
41 retryHealthCheck={actions.app.healthCheck} 49 isAPIHealthy={!app.healthCheckRequest.isError}
42 isHealthCheckLoading={app.healthCheckRequest.isExecuting} 50 retryHealthCheck={actions.app.healthCheck}
43 isFullScreen={app.isFullScreen} 51 isHealthCheckLoading={app.healthCheckRequest.isExecuting}
44 darkMode={app.isSystemDarkModeEnabled} 52 isFullScreen={app.isFullScreen}
45 > 53 darkMode={app.isSystemDarkModeEnabled}
46 {children} 54 >
47 </AuthLayout> 55 {children}
56 </AuthLayout>
57 </ThemeProvider>
48 ); 58 );
49 } 59 }
50} 60}
diff --git a/src/containers/auth/ImportScreen.js b/src/containers/auth/ImportScreen.js
index fc46f8b54..4a93891d6 100644
--- a/src/containers/auth/ImportScreen.js
+++ b/src/containers/auth/ImportScreen.js
@@ -3,13 +3,8 @@ import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react'; 3import { inject, observer } from 'mobx-react';
4import Import from '../../components/auth/Import'; 4import Import from '../../components/auth/Import';
5import UserStore from '../../stores/UserStore'; 5import UserStore from '../../stores/UserStore';
6import { gaPage } from '../../lib/analytics';
7 6
8export default @inject('stores', 'actions') @observer class ImportScreen extends Component { 7export default @inject('stores', 'actions') @observer class ImportScreen extends Component {
9 componentDidMount() {
10 gaPage('Auth/Import');
11 }
12
13 render() { 8 render() {
14 const { actions, stores } = this.props; 9 const { actions, stores } = this.props;
15 10
diff --git a/src/containers/auth/InviteScreen.js b/src/containers/auth/InviteScreen.js
index 26bf97038..66afaf7e1 100644
--- a/src/containers/auth/InviteScreen.js
+++ b/src/containers/auth/InviteScreen.js
@@ -2,13 +2,8 @@ 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';
4import Invite from '../../components/auth/Invite'; 4import Invite from '../../components/auth/Invite';
5import { gaPage } from '../../lib/analytics';
6 5
7export default @inject('stores', 'actions') @observer class InviteScreen extends Component { 6export default @inject('stores', 'actions') @observer class InviteScreen extends Component {
8 componentDidMount() {
9 gaPage('Auth/Invite');
10 }
11
12 render() { 7 render() {
13 const { actions } = this.props; 8 const { actions } = this.props;
14 9
diff --git a/src/containers/auth/LoginScreen.js b/src/containers/auth/LoginScreen.js
index 865bd38f8..e5ee10785 100644
--- a/src/containers/auth/LoginScreen.js
+++ b/src/containers/auth/LoginScreen.js
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react'; 3import { inject, observer } from 'mobx-react';
4import Login from '../../components/auth/Login'; 4import Login from '../../components/auth/Login';
5import UserStore from '../../stores/UserStore'; 5import UserStore from '../../stores/UserStore';
6import { gaPage } from '../../lib/analytics';
7 6
8import { globalError as globalErrorPropType } from '../../prop-types'; 7import { globalError as globalErrorPropType } from '../../prop-types';
9 8
@@ -12,10 +11,6 @@ export default @inject('stores', 'actions') @observer class LoginScreen extends
12 error: globalErrorPropType.isRequired, 11 error: globalErrorPropType.isRequired,
13 }; 12 };
14 13
15 componentDidMount() {
16 gaPage('Auth/Login');
17 }
18
19 render() { 14 render() {
20 const { actions, stores, error } = this.props; 15 const { actions, stores, error } = this.props;
21 return ( 16 return (
diff --git a/src/containers/auth/PasswordScreen.js b/src/containers/auth/PasswordScreen.js
index 236fd2031..5b238860e 100644
--- a/src/containers/auth/PasswordScreen.js
+++ b/src/containers/auth/PasswordScreen.js
@@ -3,13 +3,8 @@ import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react'; 3import { inject, observer } from 'mobx-react';
4import Password from '../../components/auth/Password'; 4import Password from '../../components/auth/Password';
5import UserStore from '../../stores/UserStore'; 5import UserStore from '../../stores/UserStore';
6import { gaPage } from '../../lib/analytics';
7 6
8export default @inject('stores', 'actions') @observer class PasswordScreen extends Component { 7export default @inject('stores', 'actions') @observer class PasswordScreen extends Component {
9 componentDidMount() {
10 gaPage('Auth/Password Retrieve');
11 }
12
13 render() { 8 render() {
14 const { actions, stores } = this.props; 9 const { actions, stores } = this.props;
15 10
diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js
index 34b512e15..8d179a170 100644
--- a/src/containers/auth/PricingScreen.js
+++ b/src/containers/auth/PricingScreen.js
@@ -6,7 +6,6 @@ import { RouterStore } from 'mobx-react-router';
6import Pricing from '../../components/auth/Pricing'; 6import Pricing from '../../components/auth/Pricing';
7import UserStore from '../../stores/UserStore'; 7import UserStore from '../../stores/UserStore';
8import PaymentStore from '../../stores/PaymentStore'; 8import PaymentStore from '../../stores/PaymentStore';
9import { gaPage } from '../../lib/analytics';
10 9
11import { globalError as globalErrorPropType } from '../../prop-types'; 10import { globalError as globalErrorPropType } from '../../prop-types';
12 11
@@ -15,10 +14,6 @@ export default @inject('stores', 'actions') @observer class PricingScreen extend
15 error: globalErrorPropType.isRequired, 14 error: globalErrorPropType.isRequired,
16 }; 15 };
17 16
18 componentDidMount() {
19 gaPage('Auth/Pricing');
20 }
21
22 render() { 17 render() {
23 const { actions, stores, error } = this.props; 18 const { actions, stores, error } = this.props;
24 19
diff --git a/src/containers/auth/SignupScreen.js b/src/containers/auth/SignupScreen.js
index caf75de90..efc7ea4c1 100644
--- a/src/containers/auth/SignupScreen.js
+++ b/src/containers/auth/SignupScreen.js
@@ -4,7 +4,6 @@ import { inject, observer } from 'mobx-react';
4 4
5import Signup from '../../components/auth/Signup'; 5import Signup from '../../components/auth/Signup';
6import UserStore from '../../stores/UserStore'; 6import UserStore from '../../stores/UserStore';
7import { gaPage } from '../../lib/analytics';
8 7
9import { globalError as globalErrorPropType } from '../../prop-types'; 8import { globalError as globalErrorPropType } from '../../prop-types';
10 9
@@ -13,10 +12,6 @@ export default @inject('stores', 'actions') @observer class SignupScreen extends
13 error: globalErrorPropType.isRequired, 12 error: globalErrorPropType.isRequired,
14 }; 13 };
15 14
16 componentDidMount() {
17 gaPage('Auth/Signup');
18 }
19
20 render() { 15 render() {
21 const { actions, stores, error } = this.props; 16 const { actions, stores, error } = this.props;
22 return ( 17 return (
diff --git a/src/containers/auth/WelcomeScreen.js b/src/containers/auth/WelcomeScreen.js
index 2c120f81c..75182345a 100644
--- a/src/containers/auth/WelcomeScreen.js
+++ b/src/containers/auth/WelcomeScreen.js
@@ -5,13 +5,8 @@ import { inject, observer } from 'mobx-react';
5import Welcome from '../../components/auth/Welcome'; 5import Welcome from '../../components/auth/Welcome';
6import UserStore from '../../stores/UserStore'; 6import UserStore from '../../stores/UserStore';
7import RecipePreviewsStore from '../../stores/RecipePreviewsStore'; 7import RecipePreviewsStore from '../../stores/RecipePreviewsStore';
8import { gaPage } from '../../lib/analytics';
9 8
10export default @inject('stores', 'actions') @observer class LoginScreen extends Component { 9export default @inject('stores', 'actions') @observer class LoginScreen extends Component {
11 componentDidMount() {
12 gaPage('Auth/Welcome');
13 }
14
15 render() { 10 render() {
16 const { user, recipePreviews } = this.props.stores; 11 const { user, recipePreviews } = this.props.stores;
17 12
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index 749912c59..5a05ce431 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -42,6 +42,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
42 setActive, 42 setActive,
43 handleIPCMessage, 43 handleIPCMessage,
44 setWebviewReference, 44 setWebviewReference,
45 detachService,
45 openWindow, 46 openWindow,
46 reorder, 47 reorder,
47 reload, 48 reload,
@@ -105,6 +106,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
105 services={services.allDisplayedUnordered} 106 services={services.allDisplayedUnordered}
106 handleIPCMessage={handleIPCMessage} 107 handleIPCMessage={handleIPCMessage}
107 setWebviewReference={setWebviewReference} 108 setWebviewReference={setWebviewReference}
109 detachService={detachService}
108 openWindow={openWindow} 110 openWindow={openWindow}
109 reload={reload} 111 reload={reload}
110 openSettings={openSettings} 112 openSettings={openSettings}
@@ -160,6 +162,7 @@ AppLayoutContainer.wrappedComponent.propTypes = {
160 toggleAudio: PropTypes.func.isRequired, 162 toggleAudio: PropTypes.func.isRequired,
161 handleIPCMessage: PropTypes.func.isRequired, 163 handleIPCMessage: PropTypes.func.isRequired,
162 setWebviewReference: PropTypes.func.isRequired, 164 setWebviewReference: PropTypes.func.isRequired,
165 detachService: PropTypes.func.isRequired,
163 openWindow: PropTypes.func.isRequired, 166 openWindow: PropTypes.func.isRequired,
164 reloadUpdatedServices: PropTypes.func.isRequired, 167 reloadUpdatedServices: PropTypes.func.isRequired,
165 updateService: PropTypes.func.isRequired, 168 updateService: PropTypes.func.isRequired,
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index d681d5226..ce1b9c333 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -6,7 +6,6 @@ import { inject, observer } from 'mobx-react';
6import PaymentStore from '../../stores/PaymentStore'; 6import PaymentStore from '../../stores/PaymentStore';
7import UserStore from '../../stores/UserStore'; 7import UserStore from '../../stores/UserStore';
8import AppStore from '../../stores/AppStore'; 8import AppStore from '../../stores/AppStore';
9import { gaPage } from '../../lib/analytics';
10 9
11import AccountDashboard from '../../components/settings/account/AccountDashboard'; 10import AccountDashboard from '../../components/settings/account/AccountDashboard';
12import ErrorBoundary from '../../components/util/ErrorBoundary'; 11import ErrorBoundary from '../../components/util/ErrorBoundary';
@@ -22,10 +21,6 @@ export default @inject('stores', 'actions') @observer class AccountScreen extend
22 user.getUserInfoRequest.invalidate({ immediately: true }); 21 user.getUserInfoRequest.invalidate({ immediately: true });
23 } 22 }
24 23
25 componentDidMount() {
26 gaPage('Settings/Account Dashboard');
27 }
28
29 onCloseWindow() { 24 onCloseWindow() {
30 const { user, payment } = this.props.stores; 25 const { user, payment } = this.props.stores;
31 user.getUserInfoRequest.invalidate({ immediately: true }); 26 user.getUserInfoRequest.invalidate({ immediately: true });
diff --git a/src/containers/settings/EditServiceScreen.js b/src/containers/settings/EditServiceScreen.js
index d08f0a52e..870ca4ecd 100644
--- a/src/containers/settings/EditServiceScreen.js
+++ b/src/containers/settings/EditServiceScreen.js
@@ -9,7 +9,6 @@ import ServicesStore from '../../stores/ServicesStore';
9import SettingsStore from '../../stores/SettingsStore'; 9import SettingsStore from '../../stores/SettingsStore';
10import FeaturesStore from '../../stores/FeaturesStore'; 10import FeaturesStore from '../../stores/FeaturesStore';
11import Form from '../../lib/Form'; 11import Form from '../../lib/Form';
12import { gaPage } from '../../lib/analytics';
13 12
14import ServiceError from '../../components/settings/services/ServiceError'; 13import ServiceError from '../../components/settings/services/ServiceError';
15import EditServiceForm from '../../components/settings/services/EditServiceForm'; 14import EditServiceForm from '../../components/settings/services/EditServiceForm';
@@ -93,10 +92,6 @@ export default @inject('stores', 'actions') @observer class EditServiceScreen ex
93 intl: intlShape, 92 intl: intlShape,
94 }; 93 };
95 94
96 componentDidMount() {
97 gaPage('Settings/Service/Edit');
98 }
99
100 onSubmit(data) { 95 onSubmit(data) {
101 const { action } = this.props.router.params; 96 const { action } = this.props.router.params;
102 const { recipes, services } = this.props.stores; 97 const { recipes, services } = this.props.stores;
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index 992c49b09..97c1fa3b1 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -8,7 +8,6 @@ import SettingsStore from '../../stores/SettingsStore';
8import UserStore from '../../stores/UserStore'; 8import UserStore from '../../stores/UserStore';
9import Form from '../../lib/Form'; 9import Form from '../../lib/Form';
10import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages'; 10import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages';
11import { gaPage } from '../../lib/analytics';
12import { DEFAULT_APP_SETTINGS } from '../../config'; 11import { DEFAULT_APP_SETTINGS } from '../../config';
13import { config as spellcheckerConfig } from '../../features/spellchecker'; 12import { config as spellcheckerConfig } from '../../features/spellchecker';
14 13
@@ -75,10 +74,6 @@ export default @inject('stores', 'actions') @observer class EditSettingsScreen e
75 intl: intlShape, 74 intl: intlShape,
76 }; 75 };
77 76
78 componentDidMount() {
79 gaPage('Settings/App');
80 }
81
82 onSubmit(settingsData) { 77 onSubmit(settingsData) {
83 const { app, settings, user } = this.props.actions; 78 const { app, settings, user } = this.props.actions;
84 79
diff --git a/src/containers/settings/EditUserScreen.js b/src/containers/settings/EditUserScreen.js
index 3d35effc5..81f689400 100644
--- a/src/containers/settings/EditUserScreen.js
+++ b/src/containers/settings/EditUserScreen.js
@@ -9,7 +9,6 @@ import EditUserForm from '../../components/settings/user/EditUserForm';
9import ErrorBoundary from '../../components/util/ErrorBoundary'; 9import ErrorBoundary from '../../components/util/ErrorBoundary';
10 10
11import { required, email, minLength } from '../../helpers/validation-helpers'; 11import { required, email, minLength } from '../../helpers/validation-helpers';
12import { gaPage } from '../../lib/analytics';
13 12
14const messages = defineMessages({ 13const messages = defineMessages({
15 firstname: { 14 firstname: {
@@ -24,23 +23,21 @@ const messages = defineMessages({
24 id: 'settings.user.form.email', 23 id: 'settings.user.form.email',
25 defaultMessage: '!!!Email', 24 defaultMessage: '!!!Email',
26 }, 25 },
27 accountType: { 26 accountTypeLabel: {
28 label: { 27 id: 'settings.user.form.accountType.label',
29 id: 'settings.user.form.accountType.label', 28 defaultMessage: '!!!Account type',
30 defaultMessage: '!!!Account type', 29 },
31 }, 30 accountTypeIndividual: {
32 individual: { 31 id: 'settings.user.form.accountType.individual',
33 id: 'settings.user.form.accountType.individual', 32 defaultMessage: '!!!Individual',
34 defaultMessage: '!!!Individual', 33 },
35 }, 34 accountTypeNonProfit: {
36 nonProfit: { 35 id: 'settings.user.form.accountType.non-profit',
37 id: 'settings.user.form.accountType.non-profit', 36 defaultMessage: '!!!Non-Profit',
38 defaultMessage: '!!!Non-Profit', 37 },
39 }, 38 accountTypeCompany: {
40 company: { 39 id: 'settings.user.form.accountType.company',
41 id: 'settings.user.form.accountType.company', 40 defaultMessage: '!!!Company',
42 defaultMessage: '!!!Company',
43 },
44 }, 41 },
45 currentPassword: { 42 currentPassword: {
46 id: 'settings.user.form.currentPassword', 43 id: 'settings.user.form.currentPassword',
@@ -57,10 +54,6 @@ export default @inject('stores', 'actions') @observer class EditUserScreen exten
57 intl: intlShape, 54 intl: intlShape,
58 }; 55 };
59 56
60 componentDidMount() {
61 gaPage('Settings/Account/Edit');
62 }
63
64 componentWillUnmount() { 57 componentWillUnmount() {
65 this.props.actions.user.resetStatus(); 58 this.props.actions.user.resetStatus();
66 } 59 }
@@ -99,21 +92,21 @@ export default @inject('stores', 'actions') @observer class EditUserScreen exten
99 accountType: { 92 accountType: {
100 value: user.accountType, 93 value: user.accountType,
101 validators: [required], 94 validators: [required],
102 label: intl.formatMessage(messages.accountType.label), 95 label: intl.formatMessage(messages.accountTypeLabel),
103 options: [{ 96 options: [{
104 value: 'individual', 97 value: 'individual',
105 label: intl.formatMessage(messages.accountType.individual), 98 label: intl.formatMessage(messages.accountTypeIndividual),
106 }, { 99 }, {
107 value: 'non-profit', 100 value: 'non-profit',
108 label: intl.formatMessage(messages.accountType.nonProfit), 101 label: intl.formatMessage(messages.accountTypeNonProfit),
109 }, { 102 }, {
110 value: 'company', 103 value: 'company',
111 label: intl.formatMessage(messages.accountType.company), 104 label: intl.formatMessage(messages.accountTypeCompany),
112 }], 105 }],
113 }, 106 },
114 organization: { 107 organization: {
115 label: intl.formatMessage(messages.accountType.company), 108 label: intl.formatMessage(messages.accountTypeCompany),
116 placeholder: intl.formatMessage(messages.accountType.company), 109 placeholder: intl.formatMessage(messages.accountTypeCompany),
117 value: user.organization, 110 value: user.organization,
118 }, 111 },
119 oldPassword: { 112 oldPassword: {
diff --git a/src/containers/settings/InviteScreen.js b/src/containers/settings/InviteScreen.js
index cd36610e4..cc36849e8 100644
--- a/src/containers/settings/InviteScreen.js
+++ b/src/containers/settings/InviteScreen.js
@@ -5,13 +5,7 @@ import { inject, observer } from 'mobx-react';
5import Invite from '../../components/auth/Invite'; 5import Invite from '../../components/auth/Invite';
6import ErrorBoundary from '../../components/util/ErrorBoundary'; 6import ErrorBoundary from '../../components/util/ErrorBoundary';
7 7
8import { gaPage } from '../../lib/analytics';
9
10export default @inject('stores', 'actions') @observer class InviteScreen extends Component { 8export default @inject('stores', 'actions') @observer class InviteScreen extends Component {
11 componentDidMount() {
12 gaPage('Settings/Invite');
13 }
14
15 componentWillUnmount() { 9 componentWillUnmount() {
16 this.props.stores.user.inviteRequest.reset(); 10 this.props.stores.user.inviteRequest.reset();
17 } 11 }
diff --git a/src/containers/settings/RecipesScreen.js b/src/containers/settings/RecipesScreen.js
index b3d758c87..eda5ae54c 100644
--- a/src/containers/settings/RecipesScreen.js
+++ b/src/containers/settings/RecipesScreen.js
@@ -7,7 +7,6 @@ import RecipePreviewsStore from '../../stores/RecipePreviewsStore';
7import RecipeStore from '../../stores/RecipesStore'; 7import RecipeStore from '../../stores/RecipesStore';
8import ServiceStore from '../../stores/ServicesStore'; 8import ServiceStore from '../../stores/ServicesStore';
9import UserStore from '../../stores/UserStore'; 9import UserStore from '../../stores/UserStore';
10import { gaPage } from '../../lib/analytics';
11 10
12import RecipesDashboard from '../../components/settings/recipes/RecipesDashboard'; 11import RecipesDashboard from '../../components/settings/recipes/RecipesDashboard';
13import ErrorBoundary from '../../components/util/ErrorBoundary'; 12import ErrorBoundary from '../../components/util/ErrorBoundary';
@@ -33,20 +32,15 @@ export default @inject('stores', 'actions') @observer class RecipesScreen extend
33 autorunDisposer = null; 32 autorunDisposer = null;
34 33
35 componentDidMount() { 34 componentDidMount() {
36 gaPage('Settings/Recipe Dashboard/Featured');
37
38 this.autorunDisposer = autorun(() => { 35 this.autorunDisposer = autorun(() => {
39 const { filter } = this.props.params; 36 const { filter } = this.props.params;
40 const { currentFilter } = this.state; 37 const { currentFilter } = this.state;
41 38
42 if (filter === 'all' && currentFilter !== 'all') { 39 if (filter === 'all' && currentFilter !== 'all') {
43 gaPage('Settings/Recipe Dashboard/All');
44 this.setState({ currentFilter: 'all' }); 40 this.setState({ currentFilter: 'all' });
45 } else if (filter === 'featured' && currentFilter !== 'featured') { 41 } else if (filter === 'featured' && currentFilter !== 'featured') {
46 gaPage('Settings/Recipe Dashboard/Featured');
47 this.setState({ currentFilter: 'featured' }); 42 this.setState({ currentFilter: 'featured' });
48 } else if (filter === 'dev' && currentFilter !== 'dev') { 43 } else if (filter === 'dev' && currentFilter !== 'dev') {
49 gaPage('Settings/Recipe Dashboard/Dev');
50 this.setState({ currentFilter: 'dev' }); 44 this.setState({ currentFilter: 'dev' });
51 } 45 }
52 }); 46 });
diff --git a/src/containers/settings/ServicesScreen.js b/src/containers/settings/ServicesScreen.js
index b70a5506e..a501bf530 100644
--- a/src/containers/settings/ServicesScreen.js
+++ b/src/containers/settings/ServicesScreen.js
@@ -6,16 +6,11 @@ import { RouterStore } from 'mobx-react-router';
6// import RecipePreviewsStore from '../../stores/RecipePreviewsStore'; 6// import RecipePreviewsStore from '../../stores/RecipePreviewsStore';
7import UserStore from '../../stores/UserStore'; 7import UserStore from '../../stores/UserStore';
8import ServiceStore from '../../stores/ServicesStore'; 8import ServiceStore from '../../stores/ServicesStore';
9import { gaPage } from '../../lib/analytics';
10 9
11import ServicesDashboard from '../../components/settings/services/ServicesDashboard'; 10import ServicesDashboard from '../../components/settings/services/ServicesDashboard';
12import ErrorBoundary from '../../components/util/ErrorBoundary'; 11import ErrorBoundary from '../../components/util/ErrorBoundary';
13 12
14export default @inject('stores', 'actions') @observer class ServicesScreen extends Component { 13export default @inject('stores', 'actions') @observer class ServicesScreen extends Component {
15 componentDidMount() {
16 gaPage('Settings/Service Dashboard');
17 }
18
19 componentWillUnmount() { 14 componentWillUnmount() {
20 this.props.actions.service.resetFilter(); 15 this.props.actions.service.resetFilter();
21 this.props.actions.service.resetStatus(); 16 this.props.actions.service.resetStatus();
diff --git a/src/containers/subscription/SubscriptionFormScreen.js b/src/containers/subscription/SubscriptionFormScreen.js
index 3eb7b6255..cb67ee7f2 100644
--- a/src/containers/subscription/SubscriptionFormScreen.js
+++ b/src/containers/subscription/SubscriptionFormScreen.js
@@ -43,26 +43,31 @@ export default @inject('stores', 'actions') @observer class SubscriptionFormScre
43 }); 43 });
44 44
45 const hostedPage = await stores.payment.createHostedPageRequest; 45 const hostedPage = await stores.payment.createHostedPageRequest;
46 const url = `file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPage.url)}`;
47 46
48 if (hostedPage.url) { 47 if (hostedPage.url) {
49 const paymentWindow = new BrowserWindow({ 48 if (hostedPage.legacyCheckoutFlow) {
50 parent: remote.getCurrentWindow(), 49 const paymentWindow = new BrowserWindow({
51 modal: true, 50 parent: remote.getCurrentWindow(),
52 title: '🔒 Franz Supporter License', 51 modal: true,
53 width: 600, 52 title: '🔒 Franz Supporter License',
54 height: window.innerHeight - 100, 53 width: 600,
55 maxWidth: 600, 54 height: window.innerHeight - 100,
56 minWidth: 600, 55 maxWidth: 600,
57 webPreferences: { 56 minWidth: 600,
58 nodeIntegration: true, 57 webPreferences: {
59 }, 58 nodeIntegration: true,
60 }); 59 },
61 paymentWindow.loadURL(url); 60 });
61 paymentWindow.loadURL(`file://${__dirname}/../../index.html#/payment/${encodeURIComponent(hostedPage.url)}`);
62 62
63 paymentWindow.on('closed', () => { 63 paymentWindow.on('closed', () => {
64 onCloseWindow(); 64 onCloseWindow();
65 }); 65 });
66 } else {
67 actions.app.openExternalUrl({
68 url: hostedPage.url,
69 });
70 }
66 } 71 }
67 } 72 }
68 73
diff --git a/src/electron/ipc-api/autoUpdate.js b/src/electron/ipc-api/autoUpdate.js
index 83dd83712..74b718734 100644
--- a/src/electron/ipc-api/autoUpdate.js
+++ b/src/electron/ipc-api/autoUpdate.js
@@ -4,7 +4,7 @@ import { autoUpdater } from 'electron-updater';
4const debug = require('debug')('Franz:ipcApi:autoUpdate'); 4const debug = require('debug')('Franz:ipcApi:autoUpdate');
5 5
6export default (params) => { 6export default (params) => {
7 if (process.platform === 'darwin' || process.platform === 'win32') { 7 if (process.platform === 'darwin' || process.platform === 'win32' || process.env.APPIMAGE) {
8 ipcMain.on('autoUpdate', (event, args) => { 8 ipcMain.on('autoUpdate', (event, args) => {
9 try { 9 try {
10 autoUpdater.autoInstallOnAppQuit = false; 10 autoUpdater.autoInstallOnAppQuit = false;
diff --git a/src/features/basicAuth/Component.js b/src/features/basicAuth/Component.js
index 13395fb40..a8252acb7 100644
--- a/src/features/basicAuth/Component.js
+++ b/src/features/basicAuth/Component.js
@@ -62,6 +62,7 @@ export default @injectSheet(styles) @observer class BasicAuthModal extends Compo
62 isOpen={isModalVisible} 62 isOpen={isModalVisible}
63 className={classes.modal} 63 className={classes.modal}
64 close={this.cancel.bind(this)} 64 close={this.cancel.bind(this)}
65 showClose={false}
65 > 66 >
66 <h1>Sign in</h1> 67 <h1>Sign in</h1>
67 <p> 68 <p>
diff --git a/src/features/basicAuth/index.js b/src/features/basicAuth/index.js
index 03269582c..89607824b 100644
--- a/src/features/basicAuth/index.js
+++ b/src/features/basicAuth/index.js
@@ -6,7 +6,7 @@ import BasicAuthComponent from './Component';
6const debug = require('debug')('Franz:feature:basicAuth'); 6const debug = require('debug')('Franz:feature:basicAuth');
7 7
8const defaultState = { 8const defaultState = {
9 isModalVisible: false, 9 isModalVisible: true,
10 service: null, 10 service: null,
11 authInfo: null, 11 authInfo: null,
12}; 12};
@@ -15,7 +15,6 @@ export const state = observable(defaultState);
15 15
16export function resetState() { 16export function resetState() {
17 Object.assign(state, defaultState); 17 Object.assign(state, defaultState);
18 console.log('reset state', state);
19} 18}
20 19
21export default function initialize() { 20export default function initialize() {
@@ -31,15 +30,6 @@ export default function initialize() {
31 state.authInfo = data.authInfo; 30 state.authInfo = data.authInfo;
32 state.isModalVisible = true; 31 state.isModalVisible = true;
33 }); 32 });
34
35 // autorun(() => {
36 // // if (state.serviceId) {
37 // // const service = stores.services.one(state.serviceId);
38 // // if (service) {
39 // // state.service = service;
40 // // }
41 // // }
42 // });
43} 33}
44 34
45export function mainIpcHandler(mainWindow, authInfo) { 35export function mainIpcHandler(mainWindow, authInfo) {
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
index 28aa50eb2..abc8274cf 100644
--- a/src/features/delayApp/index.js
+++ b/src/features/delayApp/index.js
@@ -3,7 +3,7 @@ import moment from 'moment';
3import DelayAppComponent from './Component'; 3import DelayAppComponent from './Component';
4 4
5import { DEFAULT_FEATURES_CONFIG } from '../../config'; 5import { DEFAULT_FEATURES_CONFIG } from '../../config';
6import { gaEvent } from '../../lib/analytics'; 6import { gaEvent, gaPage } from '../../lib/analytics';
7 7
8const debug = require('debug')('Franz:feature:delayApp'); 8const debug = require('debug')('Franz:feature:delayApp');
9 9
@@ -28,8 +28,12 @@ export default function init(stores) {
28 let shownAfterLaunch = false; 28 let shownAfterLaunch = false;
29 let timeLastDelay = moment(); 29 let timeLastDelay = moment();
30 30
31 window.franz.features.delayApp = {
32 state,
33 };
34
31 reaction( 35 reaction(
32 () => stores.features.features.needToWaitToProceed && !stores.user.data.isPremium, 36 () => stores.user.isLoggedIn && stores.features.features.needToWaitToProceed && !stores.user.data.isPremium,
33 (isEnabled) => { 37 (isEnabled) => {
34 if (isEnabled) { 38 if (isEnabled) {
35 debug('Enabling `delayApp` feature'); 39 debug('Enabling `delayApp` feature');
@@ -50,6 +54,7 @@ export default function init(stores) {
50 debug(`App will be delayed for ${config.delayDuration / 1000}s`); 54 debug(`App will be delayed for ${config.delayDuration / 1000}s`);
51 55
52 setVisibility(true); 56 setVisibility(true);
57 gaPage('/delayApp');
53 gaEvent('delayApp', 'show', 'Delay App Feature'); 58 gaEvent('delayApp', 'show', 'Delay App Feature');
54 59
55 timeLastDelay = moment(); 60 timeLastDelay = moment();
diff --git a/src/features/shareFranz/Component.js b/src/features/shareFranz/Component.js
new file mode 100644
index 000000000..ef43a54fa
--- /dev/null
+++ b/src/features/shareFranz/Component.js
@@ -0,0 +1,166 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer, inject } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { defineMessages, intlShape } from 'react-intl';
6import { Button } from '@meetfranz/forms';
7import { H1, Icon } from '@meetfranz/ui';
8
9import Modal from '../../components/ui/Modal';
10import { state } from '.';
11import { gaEvent } from '../../lib/analytics';
12import ServicesStore from '../../stores/ServicesStore';
13
14const messages = defineMessages({
15 headline: {
16 id: 'feature.shareFranz.headline',
17 defaultMessage: '!!!Franz is better together!',
18 },
19 text: {
20 id: 'feature.shareFranz.text',
21 defaultMessage: '!!!Tell your friends and colleagues how awesome Franz is and help us to spread the word.',
22 },
23 actionsEmail: {
24 id: 'feature.shareFranz.action.email',
25 defaultMessage: '!!!Share as email',
26 },
27 actionsFacebook: {
28 id: 'feature.shareFranz.action.facebook',
29 defaultMessage: '!!!Share on Facebook',
30 },
31 actionsTwitter: {
32 id: 'feature.shareFranz.action.twitter',
33 defaultMessage: '!!!Share on Twitter',
34 },
35 shareTextEmail: {
36 id: 'feature.shareFranz.shareText.email',
37 defaultMessage: '!!! I\'ve added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com',
38 },
39 shareTextTwitter: {
40 id: 'feature.shareFranz.shareText.twitter',
41 defaultMessage: '!!! I\'ve added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @MeetFranz',
42 },
43});
44
45const styles = theme => ({
46 modal: {
47 width: '80%',
48 maxWidth: 600,
49 background: theme.styleTypes.primary.accent,
50 textAlign: 'center',
51 color: theme.styleTypes.primary.contrast,
52 },
53 heartContainer: {
54 display: 'flex',
55 justifyContent: 'center',
56 borderRadius: '100%',
57 background: theme.brandDanger,
58 padding: 20,
59 width: 100,
60 height: 100,
61 margin: [-70, 'auto', 30],
62 },
63 heart: {
64 fill: theme.styleTypes.primary.contrast,
65 },
66 headline: {
67 textAlign: 'center',
68 fontSize: 40,
69 marginBottom: 20,
70 },
71 actions: {
72 display: 'flex',
73 justifyContent: 'space-between',
74 marginTop: 30,
75 },
76 cta: {
77 background: theme.styleTypes.primary.contrast,
78 color: theme.styleTypes.primary.accent,
79
80 '& svg': {
81 fill: theme.styleTypes.primary.accent,
82 },
83 },
84});
85
86export default @injectSheet(styles) @inject('stores') @observer class ShareFranzModal extends Component {
87 static propTypes = {
88 classes: PropTypes.object.isRequired,
89 };
90
91 static contextTypes = {
92 intl: intlShape,
93 };
94
95 close() {
96 state.isModalVisible = false;
97 }
98
99 render() {
100 const { isModalVisible } = state;
101
102 const {
103 classes,
104 stores,
105 } = this.props;
106
107 const serviceCount = stores.services.all.length;
108
109 const { intl } = this.context;
110
111 return (
112 <Modal
113 isOpen={isModalVisible}
114 className={classes.modal}
115 shouldCloseOnOverlayClick
116 close={this.close.bind(this)}
117 >
118 <div className={classes.heartContainer}>
119 <Icon icon="mdiHeart" className={classes.heart} size={4} />
120 </div>
121 <H1 className={classes.headline}>
122 {intl.formatMessage(messages.headline)}
123 </H1>
124 <p>{intl.formatMessage(messages.text)}</p>
125 <div className={classes.actions}>
126 <Button
127 label={intl.formatMessage(messages.actionsEmail)}
128 className={classes.cta}
129 icon="mdiEmail"
130 href={`mailto:?subject=Meet the cool app Franz&body=${intl.formatMessage(messages.shareTextEmail, { count: serviceCount })}}`}
131 target="_blank"
132 onClick={() => {
133 gaEvent('Share Franz', 'share', 'Share via email');
134 }}
135 />
136 <Button
137 label={intl.formatMessage(messages.actionsFacebook)}
138 className={classes.cta}
139 icon="mdiFacebookBox"
140 href="https://www.facebook.com/sharer/sharer.php?u=https://www.meetfranz.com?utm_source=facebook&utm_medium=referral&utm_campaign=share-button"
141 target="_blank"
142 onClick={() => {
143 gaEvent('Share Franz', 'share', 'Share via Facebook');
144 }}
145 />
146 <Button
147 label={intl.formatMessage(messages.actionsTwitter)}
148 className={classes.cta}
149 icon="mdiTwitter"
150 href={`http://twitter.com/intent/tweet?status=${intl.formatMessage(messages.shareTextTwitter, { count: serviceCount })}`}
151 target="_blank"
152 onClick={() => {
153 gaEvent('Share Franz', 'share', 'Share via Twitter');
154 }}
155 />
156 </div>
157 </Modal>
158 );
159 }
160}
161
162ShareFranzModal.wrappedComponent.propTypes = {
163 stores: PropTypes.shape({
164 services: PropTypes.instanceOf(ServicesStore).isRequired,
165 }).isRequired,
166};
diff --git a/src/features/shareFranz/index.js b/src/features/shareFranz/index.js
new file mode 100644
index 000000000..3a8ec95d3
--- /dev/null
+++ b/src/features/shareFranz/index.js
@@ -0,0 +1,52 @@
1import { observable, reaction } from 'mobx';
2import ms from 'ms';
3
4import { state as delayAppState } from '../delayApp';
5import { gaEvent, gaPage } from '../../lib/analytics';
6
7export { default as Component } from './Component';
8
9const debug = require('debug')('Franz:feature:shareFranz');
10
11const defaultState = {
12 isModalVisible: false,
13 lastShown: null,
14};
15
16export const state = observable(defaultState);
17
18export default function initialize(stores) {
19 debug('Initialize shareFranz feature');
20
21 window.franz.features.shareFranz = {
22 state,
23 };
24
25 function showModal() {
26 debug('Showing share window');
27
28 state.isModalVisible = true;
29
30 gaEvent('Share Franz', 'show');
31 gaPage('/share-modal');
32 }
33
34 reaction(
35 () => stores.user.isLoggedIn,
36 () => {
37 setTimeout(() => {
38 if (stores.settings.stats.appStarts % 30 === 0) {
39 if (delayAppState.isDelayAppScreenVisible) {
40 debug('Delaying share modal by 5 minutes');
41 setTimeout(() => showModal(), ms('5m'));
42 } else {
43 showModal();
44 }
45 }
46 }, ms('2s'));
47 },
48 {
49 fireImmediately: true,
50 },
51 );
52}
diff --git a/src/helpers/url-helpers.js b/src/helpers/url-helpers.js
new file mode 100644
index 000000000..750d1f00c
--- /dev/null
+++ b/src/helpers/url-helpers.js
@@ -0,0 +1,15 @@
1import { URL } from 'url';
2
3import { ALLOWED_PROTOCOLS } from '../config';
4
5const debug = require('debug')('Franz:Helpers:url');
6
7export function isValidExternalURL(url) {
8 const parsedUrl = new URL(url);
9
10 const isAllowed = ALLOWED_PROTOCOLS.includes(parsedUrl.protocol);
11
12 debug('protocol check is', isAllowed, 'for:', url);
13
14 return isAllowed;
15}
diff --git a/src/i18n/globalMessages.js b/src/i18n/globalMessages.js
index 7b1618602..1b5ece223 100644
--- a/src/i18n/globalMessages.js
+++ b/src/i18n/globalMessages.js
@@ -1,10 +1,6 @@
1import { defineMessages } from 'react-intl'; 1import { defineMessages } from 'react-intl';
2 2
3export default defineMessages({ 3export default defineMessages({
4 upgradeAccount: {
5 id: 'global.premium.upgradeAccount',
6 defaultMessage: '!!!Please upgrade your account to add a new service.',
7 },
8 APIUnhealthy: { 4 APIUnhealthy: {
9 id: 'global.api.unhealthy', 5 id: 'global.api.unhealthy',
10 defaultMessage: '!!!Can\'t connect to Franz Online Services', 6 defaultMessage: '!!!Can\'t connect to Franz Online Services',
diff --git a/src/i18n/languages.js b/src/i18n/languages.js
index aa3f2316a..9ddcc3519 100644
--- a/src/i18n/languages.js
+++ b/src/i18n/languages.js
@@ -35,7 +35,8 @@ export const SPELLCHECKER_LOCALES = {
35 'da-dk': 'Dansk', 35 'da-dk': 'Dansk',
36 'de-de': 'Deutsch', 36 'de-de': 'Deutsch',
37 'el-gr': 'ελληνικά (Greek)', 37 'el-gr': 'ελληνικά (Greek)',
38 'en-us': 'English', 38 'en-gb': 'English (GB)',
39 'en-us': 'English (US)',
39 'es-es': 'Español', 40 'es-es': 'Español',
40 'et-ee': 'Estonian', 41 'et-ee': 'Estonian',
41 'fa-ir': 'Ùارسی (Persian)', 42 'fa-ir': 'Ùارسی (Persian)',
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index ed6f7bacd..f374fddd9 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Recarrega", 2 "app.errorHandler.action" : "Recarrega",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Quelcom ha anat malament",
4 "feature.delayApp.action" : "Aconsegueix una llicència de suport per a Franz", 4 "feature.delayApp.action" : "Aconsegueix una llicència de suport per a Franz",
5 "feature.delayApp.headline" : "Si us plau, compra una llicència de suport per a Franz per saltar l'espera", 5 "feature.delayApp.headline" : "Si us plau, compra una llicència de suport per a Franz per saltar l'espera",
6 "feature.delayApp.text" : "Franz continuarà en {seconds} segons", 6 "feature.delayApp.text" : "Franz continuarà en {seconds} segons",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "No es pot connectar amb els serveis en línia de Franz", 14 "global.api.unhealthy" : "No es pot connectar amb els serveis en línia de Franz",
8 "global.notConnectedToTheInternet" : "No esteu connectat a Internet.", 15 "global.notConnectedToTheInternet" : "No esteu connectat a Internet.",
16 "global.spellchecker.useDefault" : "Utilitzar el predeterminat del sistema ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Corrector ortogràfic",
9 "import.headline" : "Importa els teus serveis Franz 4", 20 "import.headline" : "Importa els teus serveis Franz 4",
10 "import.notSupportedHeadline" : "Serveis que encara no s'admeten a Franz 5", 21 "import.notSupportedHeadline" : "Serveis que encara no s'admeten a Franz 5",
11 "import.skip.label" : "Vull afegir serveis manualment", 22 "import.skip.label" : "Vull afegir serveis manualment",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "Edita {name}", 107 "service.errorHandler.editAction" : "Edita {name}",
97 "service.errorHandler.headline" : "Oh no!", 108 "service.errorHandler.headline" : "Oh no!",
98 "service.errorHandler.message" : "Error", 109 "service.errorHandler.message" : "Error",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} ha fallat al carregar",
100 "services.getStarted" : "Introducció", 111 "services.getStarted" : "Introducció",
101 "services.welcome" : "Benvingut a Franz", 112 "services.welcome" : "Benvingut a Franz",
102 "settings.account.account.editButton" : "Editar Compte", 113 "settings.account.account.editButton" : "Editar Compte",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Mostra la insígnia de missatge per a tots els missatges nous", 203 "settings.service.form.indirectMessages" : "Mostra la insígnia de missatge per a tots els missatges nous",
193 "settings.service.form.isMutedInfo" : "Quan es desactiva, tots els sons de notificació i reproducció d'àudio es silenciaran", 204 "settings.service.form.isMutedInfo" : "Quan es desactiva, tots els sons de notificació i reproducció d'àudio es silenciaran",
194 "settings.service.form.name" : "Nom", 205 "settings.service.form.name" : "Nom",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "Ajustaments Proxy HTTP\/HTTPS",
196 "settings.service.form.proxy.host" : "Host Proxy \/ IP", 207 "settings.service.form.proxy.host" : "Host Proxy \/ IP",
197 "settings.service.form.proxy.info" : "Els ajustaments del Proxy no es sincronitzaran amb els servidors de Franz", 208 "settings.service.form.proxy.info" : "Els ajustaments del Proxy no es sincronitzaran amb els servidors de Franz",
198 "settings.service.form.proxy.isEnabled" : "Utilitzar Proxy", 209 "settings.service.form.proxy.isEnabled" : "Utilitzar Proxy",
199 "settings.service.form.proxy.password" : "Contrasenya (opcional)", 210 "settings.service.form.proxy.password" : "Contrasenya (opcional)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Port",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Siusplau, reinicieu el Franz després de canviar els ajustaments de proxy",
202 "settings.service.form.proxy.user" : "Usuari (opcional)", 213 "settings.service.form.proxy.user" : "Usuari (opcional)",
203 "settings.service.form.saveButton" : "Desa el servei", 214 "settings.service.form.saveButton" : "Desa el servei",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Idioma del corrector",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Utilitzar el predeterminat del sistema ({default})",
206 "settings.service.form.tabHosted" : "Allotjat", 217 "settings.service.form.tabHosted" : "Allotjat",
207 "settings.service.form.tabOnPremise" : "Allotjat per si mateix â­ï¸", 218 "settings.service.form.tabOnPremise" : "Allotjat per si mateix â­ï¸",
208 "settings.service.form.team" : "Equip", 219 "settings.service.form.team" : "Equip",
diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json
index b8bfd2526..3fc6318a2 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Obnovit", 2 "app.errorHandler.action" : "Obnovit",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Něco se pokazilo",
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Podpoř Franz a získej Supporter licenci",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Kup si Franz Supporter licenci a nebudeÅ¡ už muset Äekat",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz bude pokraÄovat v {seconds} sekundách.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Nemůžeme připojit Franz k online službám", 14 "global.api.unhealthy" : "Nemůžeme připojit Franz k online službám",
8 "global.notConnectedToTheInternet" : "Připojení k internetu není k dispozici.", 15 "global.notConnectedToTheInternet" : "Připojení k internetu není k dispozici.",
16 "global.spellchecker.useDefault" : "Use System Default ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Oprava překlepů jazyka",
9 "import.headline" : "Importovat služby z Franz 4", 20 "import.headline" : "Importovat služby z Franz 4",
10 "import.notSupportedHeadline" : "Služby nejsou podporovány ve verzi Franz 5", 21 "import.notSupportedHeadline" : "Služby nejsou podporovány ve verzi Franz 5",
11 "import.skip.label" : "Chci pÅ™idat službu ruÄnÄ›", 22 "import.skip.label" : "Chci pÅ™idat službu ruÄnÄ›",
@@ -81,7 +92,7 @@
81 "password.noUser" : "Pro emailovou adresu nebyl nalezený žádný uživatel", 92 "password.noUser" : "Pro emailovou adresu nebyl nalezený žádný uživatel",
82 "password.submit.label" : "Odeslat", 93 "password.submit.label" : "Odeslat",
83 "password.successInfo" : "Prosím, zkontrolujte svůj e-mail", 94 "password.successInfo" : "Prosím, zkontrolujte svůj e-mail",
84 "premiumFeature.button.upgradeAccount" : "Upgrade account", 95 "premiumFeature.button.upgradeAccount" : "VylepÅ¡i si svůj úÄet",
85 "pricing.headline" : "Podpořit Franz", 96 "pricing.headline" : "Podpořit Franz",
86 "pricing.link.skipPayment" : "Nechci podporovat vývoj aplikace Franz.", 97 "pricing.link.skipPayment" : "Nechci podporovat vývoj aplikace Franz.",
87 "pricing.submit.label" : "Chci podpořit vývoj aplikace Franz", 98 "pricing.submit.label" : "Chci podpořit vývoj aplikace Franz",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "Upravit {name}", 107 "service.errorHandler.editAction" : "Upravit {name}",
97 "service.errorHandler.headline" : "Ale ne!", 108 "service.errorHandler.headline" : "Ale ne!",
98 "service.errorHandler.message" : "Chyba", 109 "service.errorHandler.message" : "Chyba",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} se nepodaÅ™ilo naÄíst.",
100 "services.getStarted" : "ZaÄnÄ›me", 111 "services.getStarted" : "ZaÄnÄ›me",
101 "services.welcome" : "Vítejte v programu Franz", 112 "services.welcome" : "Vítejte v programu Franz",
102 "settings.account.account.editButton" : "Upravit úÄet", 113 "settings.account.account.editButton" : "Upravit úÄet",
@@ -127,7 +138,7 @@
127 "settings.app.form.autoLaunchInBackground" : "Spustit na pozadí", 138 "settings.app.form.autoLaunchInBackground" : "Spustit na pozadí",
128 "settings.app.form.autoLaunchOnStart" : "Spustit Franz při startu", 139 "settings.app.form.autoLaunchOnStart" : "Spustit Franz při startu",
129 "settings.app.form.beta" : "Zahrnout beta verze", 140 "settings.app.form.beta" : "Zahrnout beta verze",
130 "settings.app.form.darkMode" : "Join the Dark Side", 141 "settings.app.form.darkMode" : "Připoj se k Temné straně",
131 "settings.app.form.enableGPUAcceleration" : "Aktivovat GPU zrychlení", 142 "settings.app.form.enableGPUAcceleration" : "Aktivovat GPU zrychlení",
132 "settings.app.form.enableMenuBar" : "Zobraz Franz v Menu nabídce", 143 "settings.app.form.enableMenuBar" : "Zobraz Franz v Menu nabídce",
133 "settings.app.form.enableSpellchecking" : "Zapnout kontrolu pravopisu", 144 "settings.app.form.enableSpellchecking" : "Zapnout kontrolu pravopisu",
@@ -138,7 +149,7 @@
138 "settings.app.form.runInBackground" : "Ponechat Franze v pozadí při zavírání okna", 149 "settings.app.form.runInBackground" : "Ponechat Franze v pozadí při zavírání okna",
139 "settings.app.form.showDisabledServices" : "Zobrazit záložky vypnutých služeb", 150 "settings.app.form.showDisabledServices" : "Zobrazit záložky vypnutých služeb",
140 "settings.app.form.showMessagesBadgesWhenMuted" : "Zobrazit odznak pro nepÅ™eÄtené zprávy když jsou upozornÄ›ní vypnutá", 151 "settings.app.form.showMessagesBadgesWhenMuted" : "Zobrazit odznak pro nepÅ™eÄtené zprávy když jsou upozornÄ›ní vypnutá",
141 "settings.app.form.spellcheckerLanguage" : "Spell checking language", 152 "settings.app.form.spellcheckerLanguage" : "Oprava překlepů jazyka",
142 "settings.app.headline" : "Nastavení", 153 "settings.app.headline" : "Nastavení",
143 "settings.app.headlineAdvanced" : "PokroÄilé", 154 "settings.app.headlineAdvanced" : "PokroÄilé",
144 "settings.app.headlineAppearance" : "Vzhled", 155 "settings.app.headlineAppearance" : "Vzhled",
@@ -179,7 +190,7 @@
179 "settings.service.form.editServiceHeadline" : "Upravit {name}", 190 "settings.service.form.editServiceHeadline" : "Upravit {name}",
180 "settings.service.form.enableAudio" : "Zapnout zvuk", 191 "settings.service.form.enableAudio" : "Zapnout zvuk",
181 "settings.service.form.enableBadge" : "Ukázat odznaky nepÅ™eÄtených zpráv", 192 "settings.service.form.enableBadge" : "Ukázat odznaky nepÅ™eÄtených zpráv",
182 "settings.service.form.enableDarkMode" : "Enable Dark Mode", 193 "settings.service.form.enableDarkMode" : "Povolit Tmavý vzhled",
183 "settings.service.form.enableNotification" : "Povolit upozornění", 194 "settings.service.form.enableNotification" : "Povolit upozornění",
184 "settings.service.form.enableService" : "Povolit službu", 195 "settings.service.form.enableService" : "Povolit službu",
185 "settings.service.form.headlineBadges" : "Odznaky nepÅ™eÄtených zpráv", 196 "settings.service.form.headlineBadges" : "Odznaky nepÅ™eÄtených zpráv",
@@ -192,7 +203,7 @@
192 "settings.service.form.indirectMessages" : "Zobrazovat znak zprávy pro všechny nové zprávy", 203 "settings.service.form.indirectMessages" : "Zobrazovat znak zprávy pro všechny nové zprávy",
193 "settings.service.form.isMutedInfo" : "Pokud je vypnuto, všechny zvuky notifikací a jiného audia budou ztišeny", 204 "settings.service.form.isMutedInfo" : "Pokud je vypnuto, všechny zvuky notifikací a jiného audia budou ztišeny",
194 "settings.service.form.name" : "Jméno", 205 "settings.service.form.name" : "Jméno",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "Nastavení HTTP\/HTTPS Proxy",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "Proxy Host\/IP",
197 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.", 208 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
198 "settings.service.form.proxy.isEnabled" : "Use Proxy", 209 "settings.service.form.proxy.isEnabled" : "Use Proxy",
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index b5abb56d4..13b8d12fc 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Neuladen", 2 "app.errorHandler.action" : "Neu laden",
3 "app.errorHandler.headline" : "Es trat ein Fehler auf", 3 "app.errorHandler.headline" : "Es trat ein Fehler auf",
4 "feature.delayApp.action" : "Upgrade deinen Account", 4 "feature.delayApp.action" : "Upgrade deinen Account",
5 "feature.delayApp.headline" : "Erspare dir das Warten mit einer Franz Supporter Lizenz", 5 "feature.delayApp.headline" : "Erspare dir das Warten mit einer Franz Supporter Lizenz",
6 "feature.delayApp.text" : "Es geht in {seconds} Sekunden weiter.", 6 "feature.delayApp.text" : "Es geht in {seconds} Sekunden weiter.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Verbindung mit dem Franz Online Service fehlgeschlagen", 14 "global.api.unhealthy" : "Verbindung mit dem Franz Online Service fehlgeschlagen",
8 "global.notConnectedToTheInternet" : "Du bist nicht mit dem Internet verbunden.", 15 "global.notConnectedToTheInternet" : "Du bist nicht mit dem Internet verbunden.",
16 "global.spellchecker.useDefault" : "Standard benutzen ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Sprache für Rechtschreibprüfung",
9 "import.headline" : "Deine Franz 4 Dienste importieren", 20 "import.headline" : "Deine Franz 4 Dienste importieren",
10 "import.notSupportedHeadline" : "Dienste, die noch nicht von Franz 5 unterstützt werden", 21 "import.notSupportedHeadline" : "Dienste, die noch nicht von Franz 5 unterstützt werden",
11 "import.skip.label" : "Ich möchte Dienste selbst hinzufügen", 22 "import.skip.label" : "Ich möchte Dienste selbst hinzufügen",
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
new file mode 100644
index 000000000..0641c510c
--- /dev/null
+++ b/src/i18n/locales/defaultMessages.json
@@ -0,0 +1,3934 @@
1[
2 {
3 "descriptors": [
4 {
5 "defaultMessage": "!!!Import your Franz 4 services",
6 "end": {
7 "column": 3,
8 "line": 16
9 },
10 "file": "src/components/auth/Import.js",
11 "id": "import.headline",
12 "start": {
13 "column": 12,
14 "line": 13
15 }
16 },
17 {
18 "defaultMessage": "!!!Services not yet supported in Franz 5",
19 "end": {
20 "column": 3,
21 "line": 20
22 },
23 "file": "src/components/auth/Import.js",
24 "id": "import.notSupportedHeadline",
25 "start": {
26 "column": 24,
27 "line": 17
28 }
29 },
30 {
31 "defaultMessage": "!!!Import {count} services",
32 "end": {
33 "column": 3,
34 "line": 24
35 },
36 "file": "src/components/auth/Import.js",
37 "id": "import.submit.label",
38 "start": {
39 "column": 21,
40 "line": 21
41 }
42 },
43 {
44 "defaultMessage": "!!!I want to add services manually",
45 "end": {
46 "column": 3,
47 "line": 28
48 },
49 "file": "src/components/auth/Import.js",
50 "id": "import.skip.label",
51 "start": {
52 "column": 19,
53 "line": 25
54 }
55 }
56 ],
57 "path": "src/components/auth/Import.json"
58 },
59 {
60 "descriptors": [
61 {
62 "defaultMessage": "!!!Invite Friends",
63 "end": {
64 "column": 3,
65 "line": 19
66 },
67 "file": "src/components/auth/Invite.js",
68 "id": "settings.invite.headline",
69 "start": {
70 "column": 20,
71 "line": 16
72 }
73 },
74 {
75 "defaultMessage": "!!!Invite 3 of your friends or colleagues",
76 "end": {
77 "column": 3,
78 "line": 23
79 },
80 "file": "src/components/auth/Invite.js",
81 "id": "invite.headline.friends",
82 "start": {
83 "column": 12,
84 "line": 20
85 }
86 },
87 {
88 "defaultMessage": "!!!Name",
89 "end": {
90 "column": 3,
91 "line": 27
92 },
93 "file": "src/components/auth/Invite.js",
94 "id": "invite.name.label",
95 "start": {
96 "column": 13,
97 "line": 24
98 }
99 },
100 {
101 "defaultMessage": "!!!Email address",
102 "end": {
103 "column": 3,
104 "line": 31
105 },
106 "file": "src/components/auth/Invite.js",
107 "id": "invite.email.label",
108 "start": {
109 "column": 14,
110 "line": 28
111 }
112 },
113 {
114 "defaultMessage": "!!!Send invites",
115 "end": {
116 "column": 3,
117 "line": 35
118 },
119 "file": "src/components/auth/Invite.js",
120 "id": "invite.submit.label",
121 "start": {
122 "column": 21,
123 "line": 32
124 }
125 },
126 {
127 "defaultMessage": "!!!I want to do this later",
128 "end": {
129 "column": 3,
130 "line": 39
131 },
132 "file": "src/components/auth/Invite.js",
133 "id": "invite.skip.label",
134 "start": {
135 "column": 19,
136 "line": 36
137 }
138 },
139 {
140 "defaultMessage": "!!!Invitations sent successfully",
141 "end": {
142 "column": 3,
143 "line": 43
144 },
145 "file": "src/components/auth/Invite.js",
146 "id": "invite.successInfo",
147 "start": {
148 "column": 21,
149 "line": 40
150 }
151 }
152 ],
153 "path": "src/components/auth/Invite.json"
154 },
155 {
156 "descriptors": [
157 {
158 "defaultMessage": "!!!Sign in",
159 "end": {
160 "column": 3,
161 "line": 20
162 },
163 "file": "src/components/auth/Login.js",
164 "id": "login.headline",
165 "start": {
166 "column": 12,
167 "line": 17
168 }
169 },
170 {
171 "defaultMessage": "!!!Email address",
172 "end": {
173 "column": 3,
174 "line": 24
175 },
176 "file": "src/components/auth/Login.js",
177 "id": "login.email.label",
178 "start": {
179 "column": 14,
180 "line": 21
181 }
182 },
183 {
184 "defaultMessage": "!!!Password",
185 "end": {
186 "column": 3,
187 "line": 28
188 },
189 "file": "src/components/auth/Login.js",
190 "id": "login.password.label",
191 "start": {
192 "column": 17,
193 "line": 25
194 }
195 },
196 {
197 "defaultMessage": "!!!Sign in",
198 "end": {
199 "column": 3,
200 "line": 32
201 },
202 "file": "src/components/auth/Login.js",
203 "id": "login.submit.label",
204 "start": {
205 "column": 21,
206 "line": 29
207 }
208 },
209 {
210 "defaultMessage": "!!!Email or password not valid",
211 "end": {
212 "column": 3,
213 "line": 36
214 },
215 "file": "src/components/auth/Login.js",
216 "id": "login.invalidCredentials",
217 "start": {
218 "column": 22,
219 "line": 33
220 }
221 },
222 {
223 "defaultMessage": "!!!Your session expired, please login again.",
224 "end": {
225 "column": 3,
226 "line": 40
227 },
228 "file": "src/components/auth/Login.js",
229 "id": "login.tokenExpired",
230 "start": {
231 "column": 16,
232 "line": 37
233 }
234 },
235 {
236 "defaultMessage": "!!!Your session expired, please login again.",
237 "end": {
238 "column": 3,
239 "line": 44
240 },
241 "file": "src/components/auth/Login.js",
242 "id": "login.serverLogout",
243 "start": {
244 "column": 16,
245 "line": 41
246 }
247 },
248 {
249 "defaultMessage": "!!!Create a free account",
250 "end": {
251 "column": 3,
252 "line": 48
253 },
254 "file": "src/components/auth/Login.js",
255 "id": "login.link.signup",
256 "start": {
257 "column": 14,
258 "line": 45
259 }
260 },
261 {
262 "defaultMessage": "!!!Forgot password",
263 "end": {
264 "column": 3,
265 "line": 52
266 },
267 "file": "src/components/auth/Login.js",
268 "id": "login.link.password",
269 "start": {
270 "column": 16,
271 "line": 49
272 }
273 }
274 ],
275 "path": "src/components/auth/Login.json"
276 },
277 {
278 "descriptors": [
279 {
280 "defaultMessage": "!!!Forgot password",
281 "end": {
282 "column": 3,
283 "line": 17
284 },
285 "file": "src/components/auth/Password.js",
286 "id": "password.headline",
287 "start": {
288 "column": 12,
289 "line": 14
290 }
291 },
292 {
293 "defaultMessage": "!!!Email address",
294 "end": {
295 "column": 3,
296 "line": 21
297 },
298 "file": "src/components/auth/Password.js",
299 "id": "password.email.label",
300 "start": {
301 "column": 14,
302 "line": 18
303 }
304 },
305 {
306 "defaultMessage": "!!!Submit",
307 "end": {
308 "column": 3,
309 "line": 25
310 },
311 "file": "src/components/auth/Password.js",
312 "id": "password.submit.label",
313 "start": {
314 "column": 21,
315 "line": 22
316 }
317 },
318 {
319 "defaultMessage": "!!!Your new password was sent to your email address",
320 "end": {
321 "column": 3,
322 "line": 29
323 },
324 "file": "src/components/auth/Password.js",
325 "id": "password.successInfo",
326 "start": {
327 "column": 15,
328 "line": 26
329 }
330 },
331 {
332 "defaultMessage": "!!!No user affiliated with that email address",
333 "end": {
334 "column": 3,
335 "line": 33
336 },
337 "file": "src/components/auth/Password.js",
338 "id": "password.noUser",
339 "start": {
340 "column": 10,
341 "line": 30
342 }
343 },
344 {
345 "defaultMessage": "!!!Create a free account",
346 "end": {
347 "column": 3,
348 "line": 37
349 },
350 "file": "src/components/auth/Password.js",
351 "id": "password.link.signup",
352 "start": {
353 "column": 14,
354 "line": 34
355 }
356 },
357 {
358 "defaultMessage": "!!!Sign in to your account",
359 "end": {
360 "column": 3,
361 "line": 41
362 },
363 "file": "src/components/auth/Password.js",
364 "id": "password.link.login",
365 "start": {
366 "column": 13,
367 "line": 38
368 }
369 }
370 ],
371 "path": "src/components/auth/Password.json"
372 },
373 {
374 "descriptors": [
375 {
376 "defaultMessage": "!!!Support Franz",
377 "end": {
378 "column": 3,
379 "line": 16
380 },
381 "file": "src/components/auth/Pricing.js",
382 "id": "pricing.headline",
383 "start": {
384 "column": 12,
385 "line": 13
386 }
387 },
388 {
389 "defaultMessage": "!!!Select your support plan",
390 "end": {
391 "column": 3,
392 "line": 20
393 },
394 "file": "src/components/auth/Pricing.js",
395 "id": "pricing.support.label",
396 "start": {
397 "column": 23,
398 "line": 17
399 }
400 },
401 {
402 "defaultMessage": "!!!Support the development of Franz",
403 "end": {
404 "column": 3,
405 "line": 24
406 },
407 "file": "src/components/auth/Pricing.js",
408 "id": "pricing.submit.label",
409 "start": {
410 "column": 21,
411 "line": 21
412 }
413 },
414 {
415 "defaultMessage": "!!!I don't want to support the development of Franz.",
416 "end": {
417 "column": 3,
418 "line": 28
419 },
420 "file": "src/components/auth/Pricing.js",
421 "id": "pricing.link.skipPayment",
422 "start": {
423 "column": 15,
424 "line": 25
425 }
426 }
427 ],
428 "path": "src/components/auth/Pricing.json"
429 },
430 {
431 "descriptors": [
432 {
433 "defaultMessage": "!!!Sign up",
434 "end": {
435 "column": 3,
436 "line": 21
437 },
438 "file": "src/components/auth/Signup.js",
439 "id": "signup.headline",
440 "start": {
441 "column": 12,
442 "line": 18
443 }
444 },
445 {
446 "defaultMessage": "!!!Firstname",
447 "end": {
448 "column": 3,
449 "line": 25
450 },
451 "file": "src/components/auth/Signup.js",
452 "id": "signup.firstname.label",
453 "start": {
454 "column": 18,
455 "line": 22
456 }
457 },
458 {
459 "defaultMessage": "!!!Lastname",
460 "end": {
461 "column": 3,
462 "line": 29
463 },
464 "file": "src/components/auth/Signup.js",
465 "id": "signup.lastname.label",
466 "start": {
467 "column": 17,
468 "line": 26
469 }
470 },
471 {
472 "defaultMessage": "!!!Email address",
473 "end": {
474 "column": 3,
475 "line": 33
476 },
477 "file": "src/components/auth/Signup.js",
478 "id": "signup.email.label",
479 "start": {
480 "column": 14,
481 "line": 30
482 }
483 },
484 {
485 "defaultMessage": "!!!Company",
486 "end": {
487 "column": 3,
488 "line": 37
489 },
490 "file": "src/components/auth/Signup.js",
491 "id": "signup.company.label",
492 "start": {
493 "column": 16,
494 "line": 34
495 }
496 },
497 {
498 "defaultMessage": "!!!Password",
499 "end": {
500 "column": 3,
501 "line": 41
502 },
503 "file": "src/components/auth/Signup.js",
504 "id": "signup.password.label",
505 "start": {
506 "column": 17,
507 "line": 38
508 }
509 },
510 {
511 "defaultMessage": "!!!By creating a Franz account you accept the",
512 "end": {
513 "column": 3,
514 "line": 45
515 },
516 "file": "src/components/auth/Signup.js",
517 "id": "signup.legal.info",
518 "start": {
519 "column": 13,
520 "line": 42
521 }
522 },
523 {
524 "defaultMessage": "!!!Terms of service",
525 "end": {
526 "column": 3,
527 "line": 49
528 },
529 "file": "src/components/auth/Signup.js",
530 "id": "signup.legal.terms",
531 "start": {
532 "column": 9,
533 "line": 46
534 }
535 },
536 {
537 "defaultMessage": "!!!Privacy Statement",
538 "end": {
539 "column": 3,
540 "line": 53
541 },
542 "file": "src/components/auth/Signup.js",
543 "id": "signup.legal.privacy",
544 "start": {
545 "column": 11,
546 "line": 50
547 }
548 },
549 {
550 "defaultMessage": "!!!Create account",
551 "end": {
552 "column": 3,
553 "line": 57
554 },
555 "file": "src/components/auth/Signup.js",
556 "id": "signup.submit.label",
557 "start": {
558 "column": 21,
559 "line": 54
560 }
561 },
562 {
563 "defaultMessage": "!!!Already have an account, sign in?",
564 "end": {
565 "column": 3,
566 "line": 61
567 },
568 "file": "src/components/auth/Signup.js",
569 "id": "signup.link.login",
570 "start": {
571 "column": 13,
572 "line": 58
573 }
574 },
575 {
576 "defaultMessage": "!!!A user with that email address already exists",
577 "end": {
578 "column": 3,
579 "line": 65
580 },
581 "file": "src/components/auth/Signup.js",
582 "id": "signup.emailDuplicate",
583 "start": {
584 "column": 18,
585 "line": 62
586 }
587 }
588 ],
589 "path": "src/components/auth/Signup.json"
590 },
591 {
592 "descriptors": [
593 {
594 "defaultMessage": "!!!Create a free account",
595 "end": {
596 "column": 3,
597 "line": 12
598 },
599 "file": "src/components/auth/Welcome.js",
600 "id": "welcome.signupButton",
601 "start": {
602 "column": 16,
603 "line": 9
604 }
605 },
606 {
607 "defaultMessage": "!!!Login to your account",
608 "end": {
609 "column": 3,
610 "line": 16
611 },
612 "file": "src/components/auth/Welcome.js",
613 "id": "welcome.loginButton",
614 "start": {
615 "column": 15,
616 "line": 13
617 }
618 }
619 ],
620 "path": "src/components/auth/Welcome.json"
621 },
622 {
623 "descriptors": [
624 {
625 "defaultMessage": "!!!Your services have been updated.",
626 "end": {
627 "column": 3,
628 "line": 25
629 },
630 "file": "src/components/layout/AppLayout.js",
631 "id": "infobar.servicesUpdated",
632 "start": {
633 "column": 19,
634 "line": 22
635 }
636 },
637 {
638 "defaultMessage": "!!!A new update for Franz is available.",
639 "end": {
640 "column": 3,
641 "line": 29
642 },
643 "file": "src/components/layout/AppLayout.js",
644 "id": "infobar.updateAvailable",
645 "start": {
646 "column": 19,
647 "line": 26
648 }
649 },
650 {
651 "defaultMessage": "!!!Reload services",
652 "end": {
653 "column": 3,
654 "line": 33
655 },
656 "file": "src/components/layout/AppLayout.js",
657 "id": "infobar.buttonReloadServices",
658 "start": {
659 "column": 24,
660 "line": 30
661 }
662 },
663 {
664 "defaultMessage": "!!!Changelog",
665 "end": {
666 "column": 3,
667 "line": 37
668 },
669 "file": "src/components/layout/AppLayout.js",
670 "id": "infobar.buttonChangelog",
671 "start": {
672 "column": 13,
673 "line": 34
674 }
675 },
676 {
677 "defaultMessage": "!!!Restart & install update",
678 "end": {
679 "column": 3,
680 "line": 41
681 },
682 "file": "src/components/layout/AppLayout.js",
683 "id": "infobar.buttonInstallUpdate",
684 "start": {
685 "column": 23,
686 "line": 38
687 }
688 },
689 {
690 "defaultMessage": "!!!Could not load services and user information",
691 "end": {
692 "column": 3,
693 "line": 45
694 },
695 "file": "src/components/layout/AppLayout.js",
696 "id": "infobar.requiredRequestsFailed",
697 "start": {
698 "column": 26,
699 "line": 42
700 }
701 }
702 ],
703 "path": "src/components/layout/AppLayout.json"
704 },
705 {
706 "descriptors": [
707 {
708 "defaultMessage": "!!!Settings",
709 "end": {
710 "column": 3,
711 "line": 14
712 },
713 "file": "src/components/layout/Sidebar.js",
714 "id": "sidebar.settings",
715 "start": {
716 "column": 12,
717 "line": 11
718 }
719 },
720 {
721 "defaultMessage": "!!!Add new service",
722 "end": {
723 "column": 3,
724 "line": 18
725 },
726 "file": "src/components/layout/Sidebar.js",
727 "id": "sidebar.addNewService",
728 "start": {
729 "column": 17,
730 "line": 15
731 }
732 },
733 {
734 "defaultMessage": "!!!Disable notifications & audio",
735 "end": {
736 "column": 3,
737 "line": 22
738 },
739 "file": "src/components/layout/Sidebar.js",
740 "id": "sidebar.muteApp",
741 "start": {
742 "column": 8,
743 "line": 19
744 }
745 },
746 {
747 "defaultMessage": "!!!Enable notifications & audio",
748 "end": {
749 "column": 3,
750 "line": 26
751 },
752 "file": "src/components/layout/Sidebar.js",
753 "id": "sidebar.unmuteApp",
754 "start": {
755 "column": 10,
756 "line": 23
757 }
758 }
759 ],
760 "path": "src/components/layout/Sidebar.json"
761 },
762 {
763 "descriptors": [
764 {
765 "defaultMessage": "!!!Oh no!",
766 "end": {
767 "column": 3,
768 "line": 15
769 },
770 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
771 "id": "service.errorHandler.headline",
772 "start": {
773 "column": 12,
774 "line": 12
775 }
776 },
777 {
778 "defaultMessage": "!!!{name} has failed to load.",
779 "end": {
780 "column": 3,
781 "line": 19
782 },
783 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
784 "id": "service.errorHandler.text",
785 "start": {
786 "column": 8,
787 "line": 16
788 }
789 },
790 {
791 "defaultMessage": "!!!Reload {name}",
792 "end": {
793 "column": 3,
794 "line": 23
795 },
796 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
797 "id": "service.errorHandler.action",
798 "start": {
799 "column": 10,
800 "line": 20
801 }
802 },
803 {
804 "defaultMessage": "!!!Edit {name}",
805 "end": {
806 "column": 3,
807 "line": 27
808 },
809 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
810 "id": "service.errorHandler.editAction",
811 "start": {
812 "column": 14,
813 "line": 24
814 }
815 },
816 {
817 "defaultMessage": "!!!Error:",
818 "end": {
819 "column": 3,
820 "line": 31
821 },
822 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
823 "id": "service.errorHandler.message",
824 "start": {
825 "column": 16,
826 "line": 28
827 }
828 }
829 ],
830 "path": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.json"
831 },
832 {
833 "descriptors": [
834 {
835 "defaultMessage": "!!!{name} is disabled",
836 "end": {
837 "column": 3,
838 "line": 12
839 },
840 "file": "src/components/services/content/ServiceDisabled.js",
841 "id": "service.disabledHandler.headline",
842 "start": {
843 "column": 12,
844 "line": 9
845 }
846 },
847 {
848 "defaultMessage": "!!!Enable {name}",
849 "end": {
850 "column": 3,
851 "line": 16
852 },
853 "file": "src/components/services/content/ServiceDisabled.js",
854 "id": "service.disabledHandler.action",
855 "start": {
856 "column": 10,
857 "line": 13
858 }
859 }
860 ],
861 "path": "src/components/services/content/ServiceDisabled.json"
862 },
863 {
864 "descriptors": [
865 {
866 "defaultMessage": "!!!Welcome to Franz",
867 "end": {
868 "column": 3,
869 "line": 14
870 },
871 "file": "src/components/services/content/Services.js",
872 "id": "services.welcome",
873 "start": {
874 "column": 11,
875 "line": 11
876 }
877 },
878 {
879 "defaultMessage": "!!!Get started",
880 "end": {
881 "column": 3,
882 "line": 18
883 },
884 "file": "src/components/services/content/Services.js",
885 "id": "services.getStarted",
886 "start": {
887 "column": 14,
888 "line": 15
889 }
890 }
891 ],
892 "path": "src/components/services/content/Services.json"
893 },
894 {
895 "descriptors": [
896 {
897 "defaultMessage": "!!!Oh no!",
898 "end": {
899 "column": 3,
900 "line": 13
901 },
902 "file": "src/components/services/content/WebviewCrashHandler.js",
903 "id": "service.crashHandler.headline",
904 "start": {
905 "column": 12,
906 "line": 10
907 }
908 },
909 {
910 "defaultMessage": "!!!{name} has caused an error.",
911 "end": {
912 "column": 3,
913 "line": 17
914 },
915 "file": "src/components/services/content/WebviewCrashHandler.js",
916 "id": "service.crashHandler.text",
917 "start": {
918 "column": 8,
919 "line": 14
920 }
921 },
922 {
923 "defaultMessage": "!!!Reload {name}",
924 "end": {
925 "column": 3,
926 "line": 21
927 },
928 "file": "src/components/services/content/WebviewCrashHandler.js",
929 "id": "service.crashHandler.action",
930 "start": {
931 "column": 10,
932 "line": 18
933 }
934 },
935 {
936 "defaultMessage": "!!!Trying to automatically restore {name} in {seconds} seconds",
937 "end": {
938 "column": 3,
939 "line": 25
940 },
941 "file": "src/components/services/content/WebviewCrashHandler.js",
942 "id": "service.crashHandler.autoReload",
943 "start": {
944 "column": 14,
945 "line": 22
946 }
947 }
948 ],
949 "path": "src/components/services/content/WebviewCrashHandler.json"
950 },
951 {
952 "descriptors": [
953 {
954 "defaultMessage": "!!!Reload",
955 "end": {
956 "column": 3,
957 "line": 18
958 },
959 "file": "src/components/services/tabs/TabItem.js",
960 "id": "tabs.item.reload",
961 "start": {
962 "column": 10,
963 "line": 15
964 }
965 },
966 {
967 "defaultMessage": "!!!Edit",
968 "end": {
969 "column": 3,
970 "line": 22
971 },
972 "file": "src/components/services/tabs/TabItem.js",
973 "id": "tabs.item.edit",
974 "start": {
975 "column": 8,
976 "line": 19
977 }
978 },
979 {
980 "defaultMessage": "!!!Disable notifications",
981 "end": {
982 "column": 3,
983 "line": 26
984 },
985 "file": "src/components/services/tabs/TabItem.js",
986 "id": "tabs.item.disableNotifications",
987 "start": {
988 "column": 24,
989 "line": 23
990 }
991 },
992 {
993 "defaultMessage": "!!!Enable notifications",
994 "end": {
995 "column": 3,
996 "line": 30
997 },
998 "file": "src/components/services/tabs/TabItem.js",
999 "id": "tabs.item.enableNotification",
1000 "start": {
1001 "column": 23,
1002 "line": 27
1003 }
1004 },
1005 {
1006 "defaultMessage": "!!!Disable audio",
1007 "end": {
1008 "column": 3,
1009 "line": 34
1010 },
1011 "file": "src/components/services/tabs/TabItem.js",
1012 "id": "tabs.item.disableAudio",
1013 "start": {
1014 "column": 16,
1015 "line": 31
1016 }
1017 },
1018 {
1019 "defaultMessage": "!!!Enable audio",
1020 "end": {
1021 "column": 3,
1022 "line": 38
1023 },
1024 "file": "src/components/services/tabs/TabItem.js",
1025 "id": "tabs.item.enableAudio",
1026 "start": {
1027 "column": 15,
1028 "line": 35
1029 }
1030 },
1031 {
1032 "defaultMessage": "!!!Disable Service",
1033 "end": {
1034 "column": 3,
1035 "line": 42
1036 },
1037 "file": "src/components/services/tabs/TabItem.js",
1038 "id": "tabs.item.disableService",
1039 "start": {
1040 "column": 18,
1041 "line": 39
1042 }
1043 },
1044 {
1045 "defaultMessage": "!!!Enable Service",
1046 "end": {
1047 "column": 3,
1048 "line": 46
1049 },
1050 "file": "src/components/services/tabs/TabItem.js",
1051 "id": "tabs.item.enableService",
1052 "start": {
1053 "column": 17,
1054 "line": 43
1055 }
1056 },
1057 {
1058 "defaultMessage": "!!!Delete Service",
1059 "end": {
1060 "column": 3,
1061 "line": 50
1062 },
1063 "file": "src/components/services/tabs/TabItem.js",
1064 "id": "tabs.item.deleteService",
1065 "start": {
1066 "column": 17,
1067 "line": 47
1068 }
1069 }
1070 ],
1071 "path": "src/components/services/tabs/TabItem.json"
1072 },
1073 {
1074 "descriptors": [
1075 {
1076 "defaultMessage": "!!!Account",
1077 "end": {
1078 "column": 3,
1079 "line": 18
1080 },
1081 "file": "src/components/settings/account/AccountDashboard.js",
1082 "id": "settings.account.headline",
1083 "start": {
1084 "column": 12,
1085 "line": 15
1086 }
1087 },
1088 {
1089 "defaultMessage": "!!!Your Subscription",
1090 "end": {
1091 "column": 3,
1092 "line": 22
1093 },
1094 "file": "src/components/settings/account/AccountDashboard.js",
1095 "id": "settings.account.headlineSubscription",
1096 "start": {
1097 "column": 24,
1098 "line": 19
1099 }
1100 },
1101 {
1102 "defaultMessage": "!!!Upgrade your Account",
1103 "end": {
1104 "column": 3,
1105 "line": 26
1106 },
1107 "file": "src/components/settings/account/AccountDashboard.js",
1108 "id": "settings.account.headlineUpgrade",
1109 "start": {
1110 "column": 19,
1111 "line": 23
1112 }
1113 },
1114 {
1115 "defaultMessage": "!!Invoices",
1116 "end": {
1117 "column": 3,
1118 "line": 30
1119 },
1120 "file": "src/components/settings/account/AccountDashboard.js",
1121 "id": "settings.account.headlineInvoices",
1122 "start": {
1123 "column": 20,
1124 "line": 27
1125 }
1126 },
1127 {
1128 "defaultMessage": "!!Danger Zone",
1129 "end": {
1130 "column": 3,
1131 "line": 34
1132 },
1133 "file": "src/components/settings/account/AccountDashboard.js",
1134 "id": "settings.account.headlineDangerZone",
1135 "start": {
1136 "column": 22,
1137 "line": 31
1138 }
1139 },
1140 {
1141 "defaultMessage": "!!!Manage your subscription",
1142 "end": {
1143 "column": 3,
1144 "line": 38
1145 },
1146 "file": "src/components/settings/account/AccountDashboard.js",
1147 "id": "settings.account.manageSubscription.label",
1148 "start": {
1149 "column": 33,
1150 "line": 35
1151 }
1152 },
1153 {
1154 "defaultMessage": "!!!Basic Account",
1155 "end": {
1156 "column": 3,
1157 "line": 42
1158 },
1159 "file": "src/components/settings/account/AccountDashboard.js",
1160 "id": "settings.account.accountType.basic",
1161 "start": {
1162 "column": 20,
1163 "line": 39
1164 }
1165 },
1166 {
1167 "defaultMessage": "!!!Premium Supporter Account",
1168 "end": {
1169 "column": 3,
1170 "line": 46
1171 },
1172 "file": "src/components/settings/account/AccountDashboard.js",
1173 "id": "settings.account.accountType.premium",
1174 "start": {
1175 "column": 22,
1176 "line": 43
1177 }
1178 },
1179 {
1180 "defaultMessage": "!!!Edit Account",
1181 "end": {
1182 "column": 3,
1183 "line": 50
1184 },
1185 "file": "src/components/settings/account/AccountDashboard.js",
1186 "id": "settings.account.account.editButton",
1187 "start": {
1188 "column": 21,
1189 "line": 47
1190 }
1191 },
1192 {
1193 "defaultMessage": "!!!Download",
1194 "end": {
1195 "column": 3,
1196 "line": 54
1197 },
1198 "file": "src/components/settings/account/AccountDashboard.js",
1199 "id": "settings.account.invoiceDownload",
1200 "start": {
1201 "column": 19,
1202 "line": 51
1203 }
1204 },
1205 {
1206 "defaultMessage": "!!!Could not load user information",
1207 "end": {
1208 "column": 3,
1209 "line": 58
1210 },
1211 "file": "src/components/settings/account/AccountDashboard.js",
1212 "id": "settings.account.userInfoRequestFailed",
1213 "start": {
1214 "column": 25,
1215 "line": 55
1216 }
1217 },
1218 {
1219 "defaultMessage": "!!!Try again",
1220 "end": {
1221 "column": 3,
1222 "line": 62
1223 },
1224 "file": "src/components/settings/account/AccountDashboard.js",
1225 "id": "settings.account.tryReloadUserInfoRequest",
1226 "start": {
1227 "column": 28,
1228 "line": 59
1229 }
1230 },
1231 {
1232 "defaultMessage": "!!!Delete account",
1233 "end": {
1234 "column": 3,
1235 "line": 66
1236 },
1237 "file": "src/components/settings/account/AccountDashboard.js",
1238 "id": "settings.account.deleteAccount",
1239 "start": {
1240 "column": 17,
1241 "line": 63
1242 }
1243 },
1244 {
1245 "defaultMessage": "!!!If you don't need your Franz account any longer, you can delete your account and all related data here.",
1246 "end": {
1247 "column": 3,
1248 "line": 70
1249 },
1250 "file": "src/components/settings/account/AccountDashboard.js",
1251 "id": "settings.account.deleteInfo",
1252 "start": {
1253 "column": 14,
1254 "line": 67
1255 }
1256 },
1257 {
1258 "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
1259 "end": {
1260 "column": 3,
1261 "line": 74
1262 },
1263 "file": "src/components/settings/account/AccountDashboard.js",
1264 "id": "settings.account.deleteEmailSent",
1265 "start": {
1266 "column": 19,
1267 "line": 71
1268 }
1269 }
1270 ],
1271 "path": "src/components/settings/account/AccountDashboard.json"
1272 },
1273 {
1274 "descriptors": [
1275 {
1276 "defaultMessage": "!!!Available services",
1277 "end": {
1278 "column": 3,
1279 "line": 12
1280 },
1281 "file": "src/components/settings/navigation/SettingsNavigation.js",
1282 "id": "settings.navigation.availableServices",
1283 "start": {
1284 "column": 21,
1285 "line": 9
1286 }
1287 },
1288 {
1289 "defaultMessage": "!!!Your services",
1290 "end": {
1291 "column": 3,
1292 "line": 16
1293 },
1294 "file": "src/components/settings/navigation/SettingsNavigation.js",
1295 "id": "settings.navigation.yourServices",
1296 "start": {
1297 "column": 16,
1298 "line": 13
1299 }
1300 },
1301 {
1302 "defaultMessage": "!!!Account",
1303 "end": {
1304 "column": 3,
1305 "line": 20
1306 },
1307 "file": "src/components/settings/navigation/SettingsNavigation.js",
1308 "id": "settings.navigation.account",
1309 "start": {
1310 "column": 11,
1311 "line": 17
1312 }
1313 },
1314 {
1315 "defaultMessage": "!!!Settings",
1316 "end": {
1317 "column": 3,
1318 "line": 24
1319 },
1320 "file": "src/components/settings/navigation/SettingsNavigation.js",
1321 "id": "settings.navigation.settings",
1322 "start": {
1323 "column": 12,
1324 "line": 21
1325 }
1326 },
1327 {
1328 "defaultMessage": "!!!Invite Friends",
1329 "end": {
1330 "column": 3,
1331 "line": 28
1332 },
1333 "file": "src/components/settings/navigation/SettingsNavigation.js",
1334 "id": "settings.navigation.inviteFriends",
1335 "start": {
1336 "column": 17,
1337 "line": 25
1338 }
1339 },
1340 {
1341 "defaultMessage": "!!!Logout",
1342 "end": {
1343 "column": 3,
1344 "line": 32
1345 },
1346 "file": "src/components/settings/navigation/SettingsNavigation.js",
1347 "id": "settings.navigation.logout",
1348 "start": {
1349 "column": 10,
1350 "line": 29
1351 }
1352 }
1353 ],
1354 "path": "src/components/settings/navigation/SettingsNavigation.json"
1355 },
1356 {
1357 "descriptors": [
1358 {
1359 "defaultMessage": "!!!Available Services",
1360 "end": {
1361 "column": 3,
1362 "line": 18
1363 },
1364 "file": "src/components/settings/recipes/RecipesDashboard.js",
1365 "id": "settings.recipes.headline",
1366 "start": {
1367 "column": 12,
1368 "line": 15
1369 }
1370 },
1371 {
1372 "defaultMessage": "!!!Search service",
1373 "end": {
1374 "column": 3,
1375 "line": 22
1376 },
1377 "file": "src/components/settings/recipes/RecipesDashboard.js",
1378 "id": "settings.searchService",
1379 "start": {
1380 "column": 17,
1381 "line": 19
1382 }
1383 },
1384 {
1385 "defaultMessage": "!!!Most popular",
1386 "end": {
1387 "column": 3,
1388 "line": 26
1389 },
1390 "file": "src/components/settings/recipes/RecipesDashboard.js",
1391 "id": "settings.recipes.mostPopular",
1392 "start": {
1393 "column": 22,
1394 "line": 23
1395 }
1396 },
1397 {
1398 "defaultMessage": "!!!All services",
1399 "end": {
1400 "column": 3,
1401 "line": 30
1402 },
1403 "file": "src/components/settings/recipes/RecipesDashboard.js",
1404 "id": "settings.recipes.all",
1405 "start": {
1406 "column": 14,
1407 "line": 27
1408 }
1409 },
1410 {
1411 "defaultMessage": "!!!Development",
1412 "end": {
1413 "column": 3,
1414 "line": 34
1415 },
1416 "file": "src/components/settings/recipes/RecipesDashboard.js",
1417 "id": "settings.recipes.dev",
1418 "start": {
1419 "column": 14,
1420 "line": 31
1421 }
1422 },
1423 {
1424 "defaultMessage": "!!!Sorry, but no service matched your search term.",
1425 "end": {
1426 "column": 3,
1427 "line": 38
1428 },
1429 "file": "src/components/settings/recipes/RecipesDashboard.js",
1430 "id": "settings.recipes.nothingFound",
1431 "start": {
1432 "column": 16,
1433 "line": 35
1434 }
1435 },
1436 {
1437 "defaultMessage": "!!!Service successfully added",
1438 "end": {
1439 "column": 3,
1440 "line": 42
1441 },
1442 "file": "src/components/settings/recipes/RecipesDashboard.js",
1443 "id": "settings.recipes.servicesSuccessfulAddedInfo",
1444 "start": {
1445 "column": 31,
1446 "line": 39
1447 }
1448 },
1449 {
1450 "defaultMessage": "!!!Missing a service?",
1451 "end": {
1452 "column": 3,
1453 "line": 46
1454 },
1455 "file": "src/components/settings/recipes/RecipesDashboard.js",
1456 "id": "settings.recipes.missingService",
1457 "start": {
1458 "column": 18,
1459 "line": 43
1460 }
1461 }
1462 ],
1463 "path": "src/components/settings/recipes/RecipesDashboard.json"
1464 },
1465 {
1466 "descriptors": [
1467 {
1468 "defaultMessage": "!!!Save service",
1469 "end": {
1470 "column": 3,
1471 "line": 25
1472 },
1473 "file": "src/components/settings/services/EditServiceForm.js",
1474 "id": "settings.service.form.saveButton",
1475 "start": {
1476 "column": 15,
1477 "line": 22
1478 }
1479 },
1480 {
1481 "defaultMessage": "!!!Delete Service",
1482 "end": {
1483 "column": 3,
1484 "line": 29
1485 },
1486 "file": "src/components/settings/services/EditServiceForm.js",
1487 "id": "settings.service.form.deleteButton",
1488 "start": {
1489 "column": 17,
1490 "line": 26
1491 }
1492 },
1493 {
1494 "defaultMessage": "!!!Available services",
1495 "end": {
1496 "column": 3,
1497 "line": 33
1498 },
1499 "file": "src/components/settings/services/EditServiceForm.js",
1500 "id": "settings.service.form.availableServices",
1501 "start": {
1502 "column": 21,
1503 "line": 30
1504 }
1505 },
1506 {
1507 "defaultMessage": "!!!Your services",
1508 "end": {
1509 "column": 3,
1510 "line": 37
1511 },
1512 "file": "src/components/settings/services/EditServiceForm.js",
1513 "id": "settings.service.form.yourServices",
1514 "start": {
1515 "column": 16,
1516 "line": 34
1517 }
1518 },
1519 {
1520 "defaultMessage": "!!!Add {name}",
1521 "end": {
1522 "column": 3,
1523 "line": 41
1524 },
1525 "file": "src/components/settings/services/EditServiceForm.js",
1526 "id": "settings.service.form.addServiceHeadline",
1527 "start": {
1528 "column": 22,
1529 "line": 38
1530 }
1531 },
1532 {
1533 "defaultMessage": "!!!Edit {name}",
1534 "end": {
1535 "column": 3,
1536 "line": 45
1537 },
1538 "file": "src/components/settings/services/EditServiceForm.js",
1539 "id": "settings.service.form.editServiceHeadline",
1540 "start": {
1541 "column": 23,
1542 "line": 42
1543 }
1544 },
1545 {
1546 "defaultMessage": "!!!Hosted",
1547 "end": {
1548 "column": 3,
1549 "line": 49
1550 },
1551 "file": "src/components/settings/services/EditServiceForm.js",
1552 "id": "settings.service.form.tabHosted",
1553 "start": {
1554 "column": 13,
1555 "line": 46
1556 }
1557 },
1558 {
1559 "defaultMessage": "!!!Self hosted â­ï¸",
1560 "end": {
1561 "column": 3,
1562 "line": 53
1563 },
1564 "file": "src/components/settings/services/EditServiceForm.js",
1565 "id": "settings.service.form.tabOnPremise",
1566 "start": {
1567 "column": 16,
1568 "line": 50
1569 }
1570 },
1571 {
1572 "defaultMessage": "!!!Use the hosted {name} service.",
1573 "end": {
1574 "column": 3,
1575 "line": 57
1576 },
1577 "file": "src/components/settings/services/EditServiceForm.js",
1578 "id": "settings.service.form.useHostedService",
1579 "start": {
1580 "column": 20,
1581 "line": 54
1582 }
1583 },
1584 {
1585 "defaultMessage": "!!!Could not validate custom {name} server.",
1586 "end": {
1587 "column": 3,
1588 "line": 61
1589 },
1590 "file": "src/components/settings/services/EditServiceForm.js",
1591 "id": "settings.service.form.customUrlValidationError",
1592 "start": {
1593 "column": 28,
1594 "line": 58
1595 }
1596 },
1597 {
1598 "defaultMessage": "!!!To add self hosted services, you need a Franz Premium Supporter Account.",
1599 "end": {
1600 "column": 3,
1601 "line": 65
1602 },
1603 "file": "src/components/settings/services/EditServiceForm.js",
1604 "id": "settings.service.form.customUrlPremiumInfo",
1605 "start": {
1606 "column": 24,
1607 "line": 62
1608 }
1609 },
1610 {
1611 "defaultMessage": "!!!Upgrade your account",
1612 "end": {
1613 "column": 3,
1614 "line": 69
1615 },
1616 "file": "src/components/settings/services/EditServiceForm.js",
1617 "id": "settings.service.form.customUrlUpgradeAccount",
1618 "start": {
1619 "column": 27,
1620 "line": 66
1621 }
1622 },
1623 {
1624 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
1625 "end": {
1626 "column": 3,
1627 "line": 73
1628 },
1629 "file": "src/components/settings/services/EditServiceForm.js",
1630 "id": "settings.service.form.indirectMessageInfo",
1631 "start": {
1632 "column": 23,
1633 "line": 70
1634 }
1635 },
1636 {
1637 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
1638 "end": {
1639 "column": 3,
1640 "line": 77
1641 },
1642 "file": "src/components/settings/services/EditServiceForm.js",
1643 "id": "settings.service.form.isMutedInfo",
1644 "start": {
1645 "column": 15,
1646 "line": 74
1647 }
1648 },
1649 {
1650 "defaultMessage": "!!!Notifications",
1651 "end": {
1652 "column": 3,
1653 "line": 81
1654 },
1655 "file": "src/components/settings/services/EditServiceForm.js",
1656 "id": "settings.service.form.headlineNotifications",
1657 "start": {
1658 "column": 25,
1659 "line": 78
1660 }
1661 },
1662 {
1663 "defaultMessage": "!!!Unread message badges",
1664 "end": {
1665 "column": 3,
1666 "line": 85
1667 },
1668 "file": "src/components/settings/services/EditServiceForm.js",
1669 "id": "settings.service.form.headlineBadges",
1670 "start": {
1671 "column": 18,
1672 "line": 82
1673 }
1674 },
1675 {
1676 "defaultMessage": "!!!General",
1677 "end": {
1678 "column": 3,
1679 "line": 89
1680 },
1681 "file": "src/components/settings/services/EditServiceForm.js",
1682 "id": "settings.service.form.headlineGeneral",
1683 "start": {
1684 "column": 19,
1685 "line": 86
1686 }
1687 },
1688 {
1689 "defaultMessage": "!!!Delete",
1690 "end": {
1691 "column": 3,
1692 "line": 93
1693 },
1694 "file": "src/components/settings/services/EditServiceForm.js",
1695 "id": "settings.service.form.iconDelete",
1696 "start": {
1697 "column": 14,
1698 "line": 90
1699 }
1700 },
1701 {
1702 "defaultMessage": "!!!Drop your image, or click here",
1703 "end": {
1704 "column": 3,
1705 "line": 97
1706 },
1707 "file": "src/components/settings/services/EditServiceForm.js",
1708 "id": "settings.service.form.iconUpload",
1709 "start": {
1710 "column": 14,
1711 "line": 94
1712 }
1713 },
1714 {
1715 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
1716 "end": {
1717 "column": 3,
1718 "line": 101
1719 },
1720 "file": "src/components/settings/services/EditServiceForm.js",
1721 "id": "settings.service.form.proxy.headline",
1722 "start": {
1723 "column": 17,
1724 "line": 98
1725 }
1726 },
1727 {
1728 "defaultMessage": "!!!Please restart Franz after changing proxy Settings.",
1729 "end": {
1730 "column": 3,
1731 "line": 105
1732 },
1733 "file": "src/components/settings/services/EditServiceForm.js",
1734 "id": "settings.service.form.proxy.restartInfo",
1735 "start": {
1736 "column": 20,
1737 "line": 102
1738 }
1739 },
1740 {
1741 "defaultMessage": "!!!Proxy settings will not be synchronized with the Franz servers.",
1742 "end": {
1743 "column": 3,
1744 "line": 109
1745 },
1746 "file": "src/components/settings/services/EditServiceForm.js",
1747 "id": "settings.service.form.proxy.info",
1748 "start": {
1749 "column": 13,
1750 "line": 106
1751 }
1752 }
1753 ],
1754 "path": "src/components/settings/services/EditServiceForm.json"
1755 },
1756 {
1757 "descriptors": [
1758 {
1759 "defaultMessage": "!!!Error",
1760 "end": {
1761 "column": 3,
1762 "line": 13
1763 },
1764 "file": "src/components/settings/services/ServiceError.js",
1765 "id": "settings.service.error.headline",
1766 "start": {
1767 "column": 12,
1768 "line": 10
1769 }
1770 },
1771 {
1772 "defaultMessage": "!!!Back to services",
1773 "end": {
1774 "column": 3,
1775 "line": 17
1776 },
1777 "file": "src/components/settings/services/ServiceError.js",
1778 "id": "settings.service.error.goBack",
1779 "start": {
1780 "column": 10,
1781 "line": 14
1782 }
1783 },
1784 {
1785 "defaultMessage": "!!!Available services",
1786 "end": {
1787 "column": 3,
1788 "line": 21
1789 },
1790 "file": "src/components/settings/services/ServiceError.js",
1791 "id": "settings.service.form.availableServices",
1792 "start": {
1793 "column": 21,
1794 "line": 18
1795 }
1796 },
1797 {
1798 "defaultMessage": "!!!Could not load service recipe.",
1799 "end": {
1800 "column": 3,
1801 "line": 25
1802 },
1803 "file": "src/components/settings/services/ServiceError.js",
1804 "id": "settings.service.error.message",
1805 "start": {
1806 "column": 16,
1807 "line": 22
1808 }
1809 }
1810 ],
1811 "path": "src/components/settings/services/ServiceError.json"
1812 },
1813 {
1814 "descriptors": [
1815 {
1816 "defaultMessage": "!!!Service is disabled",
1817 "end": {
1818 "column": 3,
1819 "line": 14
1820 },
1821 "file": "src/components/settings/services/ServiceItem.js",
1822 "id": "settings.services.tooltip.isDisabled",
1823 "start": {
1824 "column": 21,
1825 "line": 11
1826 }
1827 },
1828 {
1829 "defaultMessage": "!!!Notifications are disabled",
1830 "end": {
1831 "column": 3,
1832 "line": 18
1833 },
1834 "file": "src/components/settings/services/ServiceItem.js",
1835 "id": "settings.services.tooltip.notificationsDisabled",
1836 "start": {
1837 "column": 32,
1838 "line": 15
1839 }
1840 },
1841 {
1842 "defaultMessage": "!!!All sounds are muted",
1843 "end": {
1844 "column": 3,
1845 "line": 22
1846 },
1847 "file": "src/components/settings/services/ServiceItem.js",
1848 "id": "settings.services.tooltip.isMuted",
1849 "start": {
1850 "column": 18,
1851 "line": 19
1852 }
1853 }
1854 ],
1855 "path": "src/components/settings/services/ServiceItem.json"
1856 },
1857 {
1858 "descriptors": [
1859 {
1860 "defaultMessage": "!!!Your services",
1861 "end": {
1862 "column": 3,
1863 "line": 17
1864 },
1865 "file": "src/components/settings/services/ServicesDashboard.js",
1866 "id": "settings.services.headline",
1867 "start": {
1868 "column": 12,
1869 "line": 14
1870 }
1871 },
1872 {
1873 "defaultMessage": "!!!Search service",
1874 "end": {
1875 "column": 3,
1876 "line": 21
1877 },
1878 "file": "src/components/settings/services/ServicesDashboard.js",
1879 "id": "settings.searchService",
1880 "start": {
1881 "column": 17,
1882 "line": 18
1883 }
1884 },
1885 {
1886 "defaultMessage": "!!!You haven't added any services yet.",
1887 "end": {
1888 "column": 3,
1889 "line": 25
1890 },
1891 "file": "src/components/settings/services/ServicesDashboard.js",
1892 "id": "settings.services.noServicesAdded",
1893 "start": {
1894 "column": 19,
1895 "line": 22
1896 }
1897 },
1898 {
1899 "defaultMessage": "!!!Sorry, but no service matched your search term.",
1900 "end": {
1901 "column": 3,
1902 "line": 29
1903 },
1904 "file": "src/components/settings/services/ServicesDashboard.js",
1905 "id": "settings.recipes.nothingFound",
1906 "start": {
1907 "column": 18,
1908 "line": 26
1909 }
1910 },
1911 {
1912 "defaultMessage": "!!!Discover services",
1913 "end": {
1914 "column": 3,
1915 "line": 33
1916 },
1917 "file": "src/components/settings/services/ServicesDashboard.js",
1918 "id": "settings.services.discoverServices",
1919 "start": {
1920 "column": 20,
1921 "line": 30
1922 }
1923 },
1924 {
1925 "defaultMessage": "!!!Could not load your services",
1926 "end": {
1927 "column": 3,
1928 "line": 37
1929 },
1930 "file": "src/components/settings/services/ServicesDashboard.js",
1931 "id": "settings.services.servicesRequestFailed",
1932 "start": {
1933 "column": 25,
1934 "line": 34
1935 }
1936 },
1937 {
1938 "defaultMessage": "!!!Try again",
1939 "end": {
1940 "column": 3,
1941 "line": 41
1942 },
1943 "file": "src/components/settings/services/ServicesDashboard.js",
1944 "id": "settings.account.tryReloadServices",
1945 "start": {
1946 "column": 21,
1947 "line": 38
1948 }
1949 },
1950 {
1951 "defaultMessage": "!!!Your changes have been saved",
1952 "end": {
1953 "column": 3,
1954 "line": 45
1955 },
1956 "file": "src/components/settings/services/ServicesDashboard.js",
1957 "id": "settings.services.updatedInfo",
1958 "start": {
1959 "column": 15,
1960 "line": 42
1961 }
1962 },
1963 {
1964 "defaultMessage": "!!!Service has been deleted",
1965 "end": {
1966 "column": 3,
1967 "line": 49
1968 },
1969 "file": "src/components/settings/services/ServicesDashboard.js",
1970 "id": "settings.services.deletedInfo",
1971 "start": {
1972 "column": 15,
1973 "line": 46
1974 }
1975 }
1976 ],
1977 "path": "src/components/settings/services/ServicesDashboard.json"
1978 },
1979 {
1980 "descriptors": [
1981 {
1982 "defaultMessage": "!!!Settings",
1983 "end": {
1984 "column": 3,
1985 "line": 19
1986 },
1987 "file": "src/components/settings/settings/EditSettingsForm.js",
1988 "id": "settings.app.headline",
1989 "start": {
1990 "column": 12,
1991 "line": 16
1992 }
1993 },
1994 {
1995 "defaultMessage": "!!!General",
1996 "end": {
1997 "column": 3,
1998 "line": 23
1999 },
2000 "file": "src/components/settings/settings/EditSettingsForm.js",
2001 "id": "settings.app.headlineGeneral",
2002 "start": {
2003 "column": 19,
2004 "line": 20
2005 }
2006 },
2007 {
2008 "defaultMessage": "!!!Language",
2009 "end": {
2010 "column": 3,
2011 "line": 27
2012 },
2013 "file": "src/components/settings/settings/EditSettingsForm.js",
2014 "id": "settings.app.headlineLanguage",
2015 "start": {
2016 "column": 20,
2017 "line": 24
2018 }
2019 },
2020 {
2021 "defaultMessage": "!!!Updates",
2022 "end": {
2023 "column": 3,
2024 "line": 31
2025 },
2026 "file": "src/components/settings/settings/EditSettingsForm.js",
2027 "id": "settings.app.headlineUpdates",
2028 "start": {
2029 "column": 19,
2030 "line": 28
2031 }
2032 },
2033 {
2034 "defaultMessage": "!!!Appearance",
2035 "end": {
2036 "column": 3,
2037 "line": 35
2038 },
2039 "file": "src/components/settings/settings/EditSettingsForm.js",
2040 "id": "settings.app.headlineAppearance",
2041 "start": {
2042 "column": 22,
2043 "line": 32
2044 }
2045 },
2046 {
2047 "defaultMessage": "!!!Advanced",
2048 "end": {
2049 "column": 3,
2050 "line": 39
2051 },
2052 "file": "src/components/settings/settings/EditSettingsForm.js",
2053 "id": "settings.app.headlineAdvanced",
2054 "start": {
2055 "column": 20,
2056 "line": 36
2057 }
2058 },
2059 {
2060 "defaultMessage": "!!!Help us to translate Franz into your language.",
2061 "end": {
2062 "column": 3,
2063 "line": 43
2064 },
2065 "file": "src/components/settings/settings/EditSettingsForm.js",
2066 "id": "settings.app.translationHelp",
2067 "start": {
2068 "column": 19,
2069 "line": 40
2070 }
2071 },
2072 {
2073 "defaultMessage": "!!!Cache",
2074 "end": {
2075 "column": 3,
2076 "line": 47
2077 },
2078 "file": "src/components/settings/settings/EditSettingsForm.js",
2079 "id": "settings.app.subheadlineCache",
2080 "start": {
2081 "column": 20,
2082 "line": 44
2083 }
2084 },
2085 {
2086 "defaultMessage": "!!!Franz cache is currently using {size} of disk space.",
2087 "end": {
2088 "column": 3,
2089 "line": 51
2090 },
2091 "file": "src/components/settings/settings/EditSettingsForm.js",
2092 "id": "settings.app.cacheInfo",
2093 "start": {
2094 "column": 13,
2095 "line": 48
2096 }
2097 },
2098 {
2099 "defaultMessage": "!!!Clear cache",
2100 "end": {
2101 "column": 3,
2102 "line": 55
2103 },
2104 "file": "src/components/settings/settings/EditSettingsForm.js",
2105 "id": "settings.app.buttonClearAllCache",
2106 "start": {
2107 "column": 23,
2108 "line": 52
2109 }
2110 },
2111 {
2112 "defaultMessage": "!!!Check for updates",
2113 "end": {
2114 "column": 3,
2115 "line": 59
2116 },
2117 "file": "src/components/settings/settings/EditSettingsForm.js",
2118 "id": "settings.app.buttonSearchForUpdate",
2119 "start": {
2120 "column": 25,
2121 "line": 56
2122 }
2123 },
2124 {
2125 "defaultMessage": "!!!Restart & install update",
2126 "end": {
2127 "column": 3,
2128 "line": 63
2129 },
2130 "file": "src/components/settings/settings/EditSettingsForm.js",
2131 "id": "settings.app.buttonInstallUpdate",
2132 "start": {
2133 "column": 23,
2134 "line": 60
2135 }
2136 },
2137 {
2138 "defaultMessage": "!!!Is searching for update",
2139 "end": {
2140 "column": 3,
2141 "line": 67
2142 },
2143 "file": "src/components/settings/settings/EditSettingsForm.js",
2144 "id": "settings.app.updateStatusSearching",
2145 "start": {
2146 "column": 25,
2147 "line": 64
2148 }
2149 },
2150 {
2151 "defaultMessage": "!!!Update available, downloading...",
2152 "end": {
2153 "column": 3,
2154 "line": 71
2155 },
2156 "file": "src/components/settings/settings/EditSettingsForm.js",
2157 "id": "settings.app.updateStatusAvailable",
2158 "start": {
2159 "column": 25,
2160 "line": 68
2161 }
2162 },
2163 {
2164 "defaultMessage": "!!!You are using the latest version of Franz",
2165 "end": {
2166 "column": 3,
2167 "line": 75
2168 },
2169 "file": "src/components/settings/settings/EditSettingsForm.js",
2170 "id": "settings.app.updateStatusUpToDate",
2171 "start": {
2172 "column": 24,
2173 "line": 72
2174 }
2175 },
2176 {
2177 "defaultMessage": "!!!Current version:",
2178 "end": {
2179 "column": 3,
2180 "line": 79
2181 },
2182 "file": "src/components/settings/settings/EditSettingsForm.js",
2183 "id": "settings.app.currentVersion",
2184 "start": {
2185 "column": 18,
2186 "line": 76
2187 }
2188 },
2189 {
2190 "defaultMessage": "!!!Changes require restart",
2191 "end": {
2192 "column": 3,
2193 "line": 83
2194 },
2195 "file": "src/components/settings/settings/EditSettingsForm.js",
2196 "id": "settings.app.restartRequired",
2197 "start": {
2198 "column": 29,
2199 "line": 80
2200 }
2201 }
2202 ],
2203 "path": "src/components/settings/settings/EditSettingsForm.json"
2204 },
2205 {
2206 "descriptors": [
2207 {
2208 "defaultMessage": "!!!Account",
2209 "end": {
2210 "column": 3,
2211 "line": 18
2212 },
2213 "file": "src/components/settings/user/EditUserForm.js",
2214 "id": "settings.account.headline",
2215 "start": {
2216 "column": 12,
2217 "line": 15
2218 }
2219 },
2220 {
2221 "defaultMessage": "!!!Update Profile",
2222 "end": {
2223 "column": 3,
2224 "line": 22
2225 },
2226 "file": "src/components/settings/user/EditUserForm.js",
2227 "id": "settings.account.headlineProfile",
2228 "start": {
2229 "column": 19,
2230 "line": 19
2231 }
2232 },
2233 {
2234 "defaultMessage": "!!!Account Information",
2235 "end": {
2236 "column": 3,
2237 "line": 26
2238 },
2239 "file": "src/components/settings/user/EditUserForm.js",
2240 "id": "settings.account.headlineAccount",
2241 "start": {
2242 "column": 19,
2243 "line": 23
2244 }
2245 },
2246 {
2247 "defaultMessage": "!!!Change Password",
2248 "end": {
2249 "column": 3,
2250 "line": 30
2251 },
2252 "file": "src/components/settings/user/EditUserForm.js",
2253 "id": "settings.account.headlinePassword",
2254 "start": {
2255 "column": 20,
2256 "line": 27
2257 }
2258 },
2259 {
2260 "defaultMessage": "!!!Your changes have been saved",
2261 "end": {
2262 "column": 3,
2263 "line": 34
2264 },
2265 "file": "src/components/settings/user/EditUserForm.js",
2266 "id": "settings.account.successInfo",
2267 "start": {
2268 "column": 15,
2269 "line": 31
2270 }
2271 },
2272 {
2273 "defaultMessage": "!!!Update profile",
2274 "end": {
2275 "column": 3,
2276 "line": 38
2277 },
2278 "file": "src/components/settings/user/EditUserForm.js",
2279 "id": "settings.account.buttonSave",
2280 "start": {
2281 "column": 14,
2282 "line": 35
2283 }
2284 }
2285 ],
2286 "path": "src/components/settings/user/EditUserForm.json"
2287 },
2288 {
2289 "descriptors": [
2290 {
2291 "defaultMessage": "!!!Support the development of Franz",
2292 "end": {
2293 "column": 3,
2294 "line": 17
2295 },
2296 "file": "src/components/subscription/SubscriptionForm.js",
2297 "id": "subscription.submit.label",
2298 "start": {
2299 "column": 21,
2300 "line": 14
2301 }
2302 },
2303 {
2304 "defaultMessage": "!!!Could not initialize payment form",
2305 "end": {
2306 "column": 3,
2307 "line": 21
2308 },
2309 "file": "src/components/subscription/SubscriptionForm.js",
2310 "id": "subscription.paymentSessionError",
2311 "start": {
2312 "column": 23,
2313 "line": 18
2314 }
2315 },
2316 {
2317 "defaultMessage": "!!!free",
2318 "end": {
2319 "column": 3,
2320 "line": 25
2321 },
2322 "file": "src/components/subscription/SubscriptionForm.js",
2323 "id": "subscription.type.free",
2324 "start": {
2325 "column": 12,
2326 "line": 22
2327 }
2328 },
2329 {
2330 "defaultMessage": "!!!month",
2331 "end": {
2332 "column": 3,
2333 "line": 29
2334 },
2335 "file": "src/components/subscription/SubscriptionForm.js",
2336 "id": "subscription.type.month",
2337 "start": {
2338 "column": 15,
2339 "line": 26
2340 }
2341 },
2342 {
2343 "defaultMessage": "!!!year",
2344 "end": {
2345 "column": 3,
2346 "line": 33
2347 },
2348 "file": "src/components/subscription/SubscriptionForm.js",
2349 "id": "subscription.type.year",
2350 "start": {
2351 "column": 14,
2352 "line": 30
2353 }
2354 },
2355 {
2356 "defaultMessage": "!!!The Franz Premium Supporter Account includes",
2357 "end": {
2358 "column": 3,
2359 "line": 37
2360 },
2361 "file": "src/components/subscription/SubscriptionForm.js",
2362 "id": "subscription.includedFeatures",
2363 "start": {
2364 "column": 20,
2365 "line": 34
2366 }
2367 },
2368 {
2369 "defaultMessage": "!!!Add on-premise/hosted services like Mattermost",
2370 "end": {
2371 "column": 3,
2372 "line": 41
2373 },
2374 "file": "src/components/subscription/SubscriptionForm.js",
2375 "id": "subscription.features.onpremise.mattermost",
2376 "start": {
2377 "column": 13,
2378 "line": 38
2379 }
2380 },
2381 {
2382 "defaultMessage": "!!!No app delays & nagging to upgrade license",
2383 "end": {
2384 "column": 3,
2385 "line": 45
2386 },
2387 "file": "src/components/subscription/SubscriptionForm.js",
2388 "id": "subscription.features.noInterruptions",
2389 "start": {
2390 "column": 19,
2391 "line": 42
2392 }
2393 },
2394 {
2395 "defaultMessage": "!!!Proxy support for services",
2396 "end": {
2397 "column": 3,
2398 "line": 49
2399 },
2400 "file": "src/components/subscription/SubscriptionForm.js",
2401 "id": "subscription.features.proxy",
2402 "start": {
2403 "column": 9,
2404 "line": 46
2405 }
2406 },
2407 {
2408 "defaultMessage": "!!!Support for Spellchecker",
2409 "end": {
2410 "column": 3,
2411 "line": 53
2412 },
2413 "file": "src/components/subscription/SubscriptionForm.js",
2414 "id": "subscription.features.spellchecker",
2415 "start": {
2416 "column": 16,
2417 "line": 50
2418 }
2419 },
2420 {
2421 "defaultMessage": "!!!No ads, ever!",
2422 "end": {
2423 "column": 3,
2424 "line": 57
2425 },
2426 "file": "src/components/subscription/SubscriptionForm.js",
2427 "id": "subscription.features.ads",
2428 "start": {
2429 "column": 7,
2430 "line": 54
2431 }
2432 },
2433 {
2434 "defaultMessage": "!!!coming soon",
2435 "end": {
2436 "column": 3,
2437 "line": 61
2438 },
2439 "file": "src/components/subscription/SubscriptionForm.js",
2440 "id": "subscription.features.comingSoon",
2441 "start": {
2442 "column": 14,
2443 "line": 58
2444 }
2445 },
2446 {
2447 "defaultMessage": "!!!EU residents: local sales tax may apply",
2448 "end": {
2449 "column": 3,
2450 "line": 65
2451 },
2452 "file": "src/components/subscription/SubscriptionForm.js",
2453 "id": "subscription.euTaxInfo",
2454 "start": {
2455 "column": 13,
2456 "line": 62
2457 }
2458 }
2459 ],
2460 "path": "src/components/subscription/SubscriptionForm.json"
2461 },
2462 {
2463 "descriptors": [
2464 {
2465 "defaultMessage": "!!!Cancel",
2466 "end": {
2467 "column": 3,
2468 "line": 14
2469 },
2470 "file": "src/components/subscription/SubscriptionPopup.js",
2471 "id": "subscriptionPopup.buttonCancel",
2472 "start": {
2473 "column": 16,
2474 "line": 11
2475 }
2476 },
2477 {
2478 "defaultMessage": "!!!Done",
2479 "end": {
2480 "column": 3,
2481 "line": 18
2482 },
2483 "file": "src/components/subscription/SubscriptionPopup.js",
2484 "id": "subscriptionPopup.buttonDone",
2485 "start": {
2486 "column": 14,
2487 "line": 15
2488 }
2489 }
2490 ],
2491 "path": "src/components/subscription/SubscriptionPopup.json"
2492 },
2493 {
2494 "descriptors": [
2495 {
2496 "defaultMessage": "!!!Upgrade account",
2497 "end": {
2498 "column": 3,
2499 "line": 17
2500 },
2501 "file": "src/components/ui/PremiumFeatureContainer/index.js",
2502 "id": "premiumFeature.button.upgradeAccount",
2503 "start": {
2504 "column": 10,
2505 "line": 14
2506 }
2507 }
2508 ],
2509 "path": "src/components/ui/PremiumFeatureContainer/index.json"
2510 },
2511 {
2512 "descriptors": [
2513 {
2514 "defaultMessage": "!!!Something went wrong.",
2515 "end": {
2516 "column": 3,
2517 "line": 14
2518 },
2519 "file": "src/components/util/ErrorBoundary/index.js",
2520 "id": "app.errorHandler.headline",
2521 "start": {
2522 "column": 12,
2523 "line": 11
2524 }
2525 },
2526 {
2527 "defaultMessage": "!!!Reload",
2528 "end": {
2529 "column": 3,
2530 "line": 18
2531 },
2532 "file": "src/components/util/ErrorBoundary/index.js",
2533 "id": "app.errorHandler.action",
2534 "start": {
2535 "column": 10,
2536 "line": 15
2537 }
2538 }
2539 ],
2540 "path": "src/components/util/ErrorBoundary/index.json"
2541 },
2542 {
2543 "descriptors": [
2544 {
2545 "defaultMessage": "!!!Name",
2546 "end": {
2547 "column": 3,
2548 "line": 31
2549 },
2550 "file": "src/containers/settings/EditServiceScreen.js",
2551 "id": "settings.service.form.name",
2552 "start": {
2553 "column": 8,
2554 "line": 28
2555 }
2556 },
2557 {
2558 "defaultMessage": "!!!Enable service",
2559 "end": {
2560 "column": 3,
2561 "line": 35
2562 },
2563 "file": "src/containers/settings/EditServiceScreen.js",
2564 "id": "settings.service.form.enableService",
2565 "start": {
2566 "column": 17,
2567 "line": 32
2568 }
2569 },
2570 {
2571 "defaultMessage": "!!!Enable Notifications",
2572 "end": {
2573 "column": 3,
2574 "line": 39
2575 },
2576 "file": "src/containers/settings/EditServiceScreen.js",
2577 "id": "settings.service.form.enableNotification",
2578 "start": {
2579 "column": 22,
2580 "line": 36
2581 }
2582 },
2583 {
2584 "defaultMessage": "!!!Show unread message badges",
2585 "end": {
2586 "column": 3,
2587 "line": 43
2588 },
2589 "file": "src/containers/settings/EditServiceScreen.js",
2590 "id": "settings.service.form.enableBadge",
2591 "start": {
2592 "column": 15,
2593 "line": 40
2594 }
2595 },
2596 {
2597 "defaultMessage": "!!!Enable audio",
2598 "end": {
2599 "column": 3,
2600 "line": 47
2601 },
2602 "file": "src/containers/settings/EditServiceScreen.js",
2603 "id": "settings.service.form.enableAudio",
2604 "start": {
2605 "column": 15,
2606 "line": 44
2607 }
2608 },
2609 {
2610 "defaultMessage": "!!!Team",
2611 "end": {
2612 "column": 3,
2613 "line": 51
2614 },
2615 "file": "src/containers/settings/EditServiceScreen.js",
2616 "id": "settings.service.form.team",
2617 "start": {
2618 "column": 8,
2619 "line": 48
2620 }
2621 },
2622 {
2623 "defaultMessage": "!!!Custom server",
2624 "end": {
2625 "column": 3,
2626 "line": 55
2627 },
2628 "file": "src/containers/settings/EditServiceScreen.js",
2629 "id": "settings.service.form.customUrl",
2630 "start": {
2631 "column": 13,
2632 "line": 52
2633 }
2634 },
2635 {
2636 "defaultMessage": "!!!Show message badge for all new messages",
2637 "end": {
2638 "column": 3,
2639 "line": 59
2640 },
2641 "file": "src/containers/settings/EditServiceScreen.js",
2642 "id": "settings.service.form.indirectMessages",
2643 "start": {
2644 "column": 20,
2645 "line": 56
2646 }
2647 },
2648 {
2649 "defaultMessage": "!!!Custom icon",
2650 "end": {
2651 "column": 3,
2652 "line": 63
2653 },
2654 "file": "src/containers/settings/EditServiceScreen.js",
2655 "id": "settings.service.form.icon",
2656 "start": {
2657 "column": 8,
2658 "line": 60
2659 }
2660 },
2661 {
2662 "defaultMessage": "!!!Enable Dark Mode",
2663 "end": {
2664 "column": 3,
2665 "line": 67
2666 },
2667 "file": "src/containers/settings/EditServiceScreen.js",
2668 "id": "settings.service.form.enableDarkMode",
2669 "start": {
2670 "column": 18,
2671 "line": 64
2672 }
2673 },
2674 {
2675 "defaultMessage": "!!!Use Proxy",
2676 "end": {
2677 "column": 3,
2678 "line": 71
2679 },
2680 "file": "src/containers/settings/EditServiceScreen.js",
2681 "id": "settings.service.form.proxy.isEnabled",
2682 "start": {
2683 "column": 15,
2684 "line": 68
2685 }
2686 },
2687 {
2688 "defaultMessage": "!!!Proxy Host/IP",
2689 "end": {
2690 "column": 3,
2691 "line": 75
2692 },
2693 "file": "src/containers/settings/EditServiceScreen.js",
2694 "id": "settings.service.form.proxy.host",
2695 "start": {
2696 "column": 13,
2697 "line": 72
2698 }
2699 },
2700 {
2701 "defaultMessage": "!!!Port",
2702 "end": {
2703 "column": 3,
2704 "line": 79
2705 },
2706 "file": "src/containers/settings/EditServiceScreen.js",
2707 "id": "settings.service.form.proxy.port",
2708 "start": {
2709 "column": 13,
2710 "line": 76
2711 }
2712 },
2713 {
2714 "defaultMessage": "!!!User",
2715 "end": {
2716 "column": 3,
2717 "line": 83
2718 },
2719 "file": "src/containers/settings/EditServiceScreen.js",
2720 "id": "settings.service.form.proxy.user",
2721 "start": {
2722 "column": 13,
2723 "line": 80
2724 }
2725 },
2726 {
2727 "defaultMessage": "!!!Password",
2728 "end": {
2729 "column": 3,
2730 "line": 87
2731 },
2732 "file": "src/containers/settings/EditServiceScreen.js",
2733 "id": "settings.service.form.proxy.password",
2734 "start": {
2735 "column": 17,
2736 "line": 84
2737 }
2738 }
2739 ],
2740 "path": "src/containers/settings/EditServiceScreen.json"
2741 },
2742 {
2743 "descriptors": [
2744 {
2745 "defaultMessage": "!!!Launch Franz on start",
2746 "end": {
2747 "column": 3,
2748 "line": 25
2749 },
2750 "file": "src/containers/settings/EditSettingsScreen.js",
2751 "id": "settings.app.form.autoLaunchOnStart",
2752 "start": {
2753 "column": 21,
2754 "line": 22
2755 }
2756 },
2757 {
2758 "defaultMessage": "!!!Open in background",
2759 "end": {
2760 "column": 3,
2761 "line": 29
2762 },
2763 "file": "src/containers/settings/EditSettingsScreen.js",
2764 "id": "settings.app.form.autoLaunchInBackground",
2765 "start": {
2766 "column": 26,
2767 "line": 26
2768 }
2769 },
2770 {
2771 "defaultMessage": "!!!Keep Franz in background when closing the window",
2772 "end": {
2773 "column": 3,
2774 "line": 33
2775 },
2776 "file": "src/containers/settings/EditSettingsScreen.js",
2777 "id": "settings.app.form.runInBackground",
2778 "start": {
2779 "column": 19,
2780 "line": 30
2781 }
2782 },
2783 {
2784 "defaultMessage": "!!!Show Franz in system tray",
2785 "end": {
2786 "column": 3,
2787 "line": 37
2788 },
2789 "file": "src/containers/settings/EditSettingsScreen.js",
2790 "id": "settings.app.form.enableSystemTray",
2791 "start": {
2792 "column": 20,
2793 "line": 34
2794 }
2795 },
2796 {
2797 "defaultMessage": "!!!Minimize Franz to system tray",
2798 "end": {
2799 "column": 3,
2800 "line": 41
2801 },
2802 "file": "src/containers/settings/EditSettingsScreen.js",
2803 "id": "settings.app.form.minimizeToSystemTray",
2804 "start": {
2805 "column": 24,
2806 "line": 38
2807 }
2808 },
2809 {
2810 "defaultMessage": "!!!Language",
2811 "end": {
2812 "column": 3,
2813 "line": 45
2814 },
2815 "file": "src/containers/settings/EditSettingsScreen.js",
2816 "id": "settings.app.form.language",
2817 "start": {
2818 "column": 12,
2819 "line": 42
2820 }
2821 },
2822 {
2823 "defaultMessage": "!!!Dark Mode",
2824 "end": {
2825 "column": 3,
2826 "line": 49
2827 },
2828 "file": "src/containers/settings/EditSettingsScreen.js",
2829 "id": "settings.app.form.darkMode",
2830 "start": {
2831 "column": 12,
2832 "line": 46
2833 }
2834 },
2835 {
2836 "defaultMessage": "!!!Display disabled services tabs",
2837 "end": {
2838 "column": 3,
2839 "line": 53
2840 },
2841 "file": "src/containers/settings/EditSettingsScreen.js",
2842 "id": "settings.app.form.showDisabledServices",
2843 "start": {
2844 "column": 24,
2845 "line": 50
2846 }
2847 },
2848 {
2849 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
2850 "end": {
2851 "column": 3,
2852 "line": 57
2853 },
2854 "file": "src/containers/settings/EditSettingsScreen.js",
2855 "id": "settings.app.form.showMessagesBadgesWhenMuted",
2856 "start": {
2857 "column": 29,
2858 "line": 54
2859 }
2860 },
2861 {
2862 "defaultMessage": "!!!Enable spell checking",
2863 "end": {
2864 "column": 3,
2865 "line": 61
2866 },
2867 "file": "src/containers/settings/EditSettingsScreen.js",
2868 "id": "settings.app.form.enableSpellchecking",
2869 "start": {
2870 "column": 23,
2871 "line": 58
2872 }
2873 },
2874 {
2875 "defaultMessage": "!!!Enable GPU Acceleration",
2876 "end": {
2877 "column": 3,
2878 "line": 65
2879 },
2880 "file": "src/containers/settings/EditSettingsScreen.js",
2881 "id": "settings.app.form.enableGPUAcceleration",
2882 "start": {
2883 "column": 25,
2884 "line": 62
2885 }
2886 },
2887 {
2888 "defaultMessage": "!!!Include beta versions",
2889 "end": {
2890 "column": 3,
2891 "line": 69
2892 },
2893 "file": "src/containers/settings/EditSettingsScreen.js",
2894 "id": "settings.app.form.beta",
2895 "start": {
2896 "column": 8,
2897 "line": 66
2898 }
2899 }
2900 ],
2901 "path": "src/containers/settings/EditSettingsScreen.json"
2902 },
2903 {
2904 "descriptors": [
2905 {
2906 "defaultMessage": "!!!Firstname",
2907 "end": {
2908 "column": 3,
2909 "line": 17
2910 },
2911 "file": "src/containers/settings/EditUserScreen.js",
2912 "id": "settings.user.form.firstname",
2913 "start": {
2914 "column": 13,
2915 "line": 14
2916 }
2917 },
2918 {
2919 "defaultMessage": "!!!Lastname",
2920 "end": {
2921 "column": 3,
2922 "line": 21
2923 },
2924 "file": "src/containers/settings/EditUserScreen.js",
2925 "id": "settings.user.form.lastname",
2926 "start": {
2927 "column": 12,
2928 "line": 18
2929 }
2930 },
2931 {
2932 "defaultMessage": "!!!Email",
2933 "end": {
2934 "column": 3,
2935 "line": 25
2936 },
2937 "file": "src/containers/settings/EditUserScreen.js",
2938 "id": "settings.user.form.email",
2939 "start": {
2940 "column": 9,
2941 "line": 22
2942 }
2943 },
2944 {
2945 "defaultMessage": "!!!Account type",
2946 "end": {
2947 "column": 3,
2948 "line": 29
2949 },
2950 "file": "src/containers/settings/EditUserScreen.js",
2951 "id": "settings.user.form.accountType.label",
2952 "start": {
2953 "column": 20,
2954 "line": 26
2955 }
2956 },
2957 {
2958 "defaultMessage": "!!!Individual",
2959 "end": {
2960 "column": 3,
2961 "line": 33
2962 },
2963 "file": "src/containers/settings/EditUserScreen.js",
2964 "id": "settings.user.form.accountType.individual",
2965 "start": {
2966 "column": 25,
2967 "line": 30
2968 }
2969 },
2970 {
2971 "defaultMessage": "!!!Non-Profit",
2972 "end": {
2973 "column": 3,
2974 "line": 37
2975 },
2976 "file": "src/containers/settings/EditUserScreen.js",
2977 "id": "settings.user.form.accountType.non-profit",
2978 "start": {
2979 "column": 24,
2980 "line": 34
2981 }
2982 },
2983 {
2984 "defaultMessage": "!!!Company",
2985 "end": {
2986 "column": 3,
2987 "line": 41
2988 },
2989 "file": "src/containers/settings/EditUserScreen.js",
2990 "id": "settings.user.form.accountType.company",
2991 "start": {
2992 "column": 22,
2993 "line": 38
2994 }
2995 },
2996 {
2997 "defaultMessage": "!!!Current password",
2998 "end": {
2999 "column": 3,
3000 "line": 45
3001 },
3002 "file": "src/containers/settings/EditUserScreen.js",
3003 "id": "settings.user.form.currentPassword",
3004 "start": {
3005 "column": 19,
3006 "line": 42
3007 }
3008 },
3009 {
3010 "defaultMessage": "!!!New password",
3011 "end": {
3012 "column": 3,
3013 "line": 49
3014 },
3015 "file": "src/containers/settings/EditUserScreen.js",
3016 "id": "settings.user.form.newPassword",
3017 "start": {
3018 "column": 15,
3019 "line": 46
3020 }
3021 }
3022 ],
3023 "path": "src/containers/settings/EditUserScreen.json"
3024 },
3025 {
3026 "descriptors": [
3027 {
3028 "defaultMessage": "!!!Please purchase license to skip waiting",
3029 "end": {
3030 "column": 3,
3031 "line": 18
3032 },
3033 "file": "src/features/delayApp/Component.js",
3034 "id": "feature.delayApp.headline",
3035 "start": {
3036 "column": 12,
3037 "line": 15
3038 }
3039 },
3040 {
3041 "defaultMessage": "!!!Get a Franz Supporter License",
3042 "end": {
3043 "column": 3,
3044 "line": 22
3045 },
3046 "file": "src/features/delayApp/Component.js",
3047 "id": "feature.delayApp.action",
3048 "start": {
3049 "column": 10,
3050 "line": 19
3051 }
3052 },
3053 {
3054 "defaultMessage": "!!!Franz will continue in {seconds} seconds.",
3055 "end": {
3056 "column": 3,
3057 "line": 26
3058 },
3059 "file": "src/features/delayApp/Component.js",
3060 "id": "feature.delayApp.text",
3061 "start": {
3062 "column": 8,
3063 "line": 23
3064 }
3065 }
3066 ],
3067 "path": "src/features/delayApp/Component.json"
3068 },
3069 {
3070 "descriptors": [
3071 {
3072 "defaultMessage": "!!!Franz is better together!",
3073 "end": {
3074 "column": 3,
3075 "line": 18
3076 },
3077 "file": "src/features/shareFranz/Component.js",
3078 "id": "feature.shareFranz.headline",
3079 "start": {
3080 "column": 12,
3081 "line": 15
3082 }
3083 },
3084 {
3085 "defaultMessage": "!!!Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
3086 "end": {
3087 "column": 3,
3088 "line": 22
3089 },
3090 "file": "src/features/shareFranz/Component.js",
3091 "id": "feature.shareFranz.text",
3092 "start": {
3093 "column": 8,
3094 "line": 19
3095 }
3096 },
3097 {
3098 "defaultMessage": "!!!Share as email",
3099 "end": {
3100 "column": 3,
3101 "line": 26
3102 },
3103 "file": "src/features/shareFranz/Component.js",
3104 "id": "feature.shareFranz.action.email",
3105 "start": {
3106 "column": 16,
3107 "line": 23
3108 }
3109 },
3110 {
3111 "defaultMessage": "!!!Share on Facebook",
3112 "end": {
3113 "column": 3,
3114 "line": 30
3115 },
3116 "file": "src/features/shareFranz/Component.js",
3117 "id": "feature.shareFranz.action.facebook",
3118 "start": {
3119 "column": 19,
3120 "line": 27
3121 }
3122 },
3123 {
3124 "defaultMessage": "!!!Share on Twitter",
3125 "end": {
3126 "column": 3,
3127 "line": 34
3128 },
3129 "file": "src/features/shareFranz/Component.js",
3130 "id": "feature.shareFranz.action.twitter",
3131 "start": {
3132 "column": 18,
3133 "line": 31
3134 }
3135 },
3136 {
3137 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
3138 "end": {
3139 "column": 3,
3140 "line": 38
3141 },
3142 "file": "src/features/shareFranz/Component.js",
3143 "id": "feature.shareFranz.shareText.email",
3144 "start": {
3145 "column": 18,
3146 "line": 35
3147 }
3148 },
3149 {
3150 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @MeetFranz",
3151 "end": {
3152 "column": 3,
3153 "line": 42
3154 },
3155 "file": "src/features/shareFranz/Component.js",
3156 "id": "feature.shareFranz.shareText.twitter",
3157 "start": {
3158 "column": 20,
3159 "line": 39
3160 }
3161 }
3162 ],
3163 "path": "src/features/shareFranz/Component.json"
3164 },
3165 {
3166 "descriptors": [
3167 {
3168 "defaultMessage": "!!!Field is required",
3169 "end": {
3170 "column": 3,
3171 "line": 7
3172 },
3173 "file": "src/helpers/validation-helpers.js",
3174 "id": "validation.required",
3175 "start": {
3176 "column": 12,
3177 "line": 4
3178 }
3179 },
3180 {
3181 "defaultMessage": "!!!Email not valid",
3182 "end": {
3183 "column": 3,
3184 "line": 11
3185 },
3186 "file": "src/helpers/validation-helpers.js",
3187 "id": "validation.email",
3188 "start": {
3189 "column": 9,
3190 "line": 8
3191 }
3192 },
3193 {
3194 "defaultMessage": "!!!Not a valid URL",
3195 "end": {
3196 "column": 3,
3197 "line": 15
3198 },
3199 "file": "src/helpers/validation-helpers.js",
3200 "id": "validation.url",
3201 "start": {
3202 "column": 7,
3203 "line": 12
3204 }
3205 },
3206 {
3207 "defaultMessage": "!!!Too few characters",
3208 "end": {
3209 "column": 3,
3210 "line": 19
3211 },
3212 "file": "src/helpers/validation-helpers.js",
3213 "id": "validation.minLength",
3214 "start": {
3215 "column": 13,
3216 "line": 16
3217 }
3218 },
3219 {
3220 "defaultMessage": "!!!At least one is required",
3221 "end": {
3222 "column": 3,
3223 "line": 23
3224 },
3225 "file": "src/helpers/validation-helpers.js",
3226 "id": "validation.oneRequired",
3227 "start": {
3228 "column": 15,
3229 "line": 20
3230 }
3231 }
3232 ],
3233 "path": "src/helpers/validation-helpers.json"
3234 },
3235 {
3236 "descriptors": [
3237 {
3238 "defaultMessage": "!!!Can't connect to Franz Online Services",
3239 "end": {
3240 "column": 3,
3241 "line": 7
3242 },
3243 "file": "src/i18n/globalMessages.js",
3244 "id": "global.api.unhealthy",
3245 "start": {
3246 "column": 16,
3247 "line": 4
3248 }
3249 },
3250 {
3251 "defaultMessage": "!!!You are not connected to the internet.",
3252 "end": {
3253 "column": 3,
3254 "line": 11
3255 },
3256 "file": "src/i18n/globalMessages.js",
3257 "id": "global.notConnectedToTheInternet",
3258 "start": {
3259 "column": 29,
3260 "line": 8
3261 }
3262 },
3263 {
3264 "defaultMessage": "!!!Spell checking language",
3265 "end": {
3266 "column": 3,
3267 "line": 15
3268 },
3269 "file": "src/i18n/globalMessages.js",
3270 "id": "global.spellchecking.language",
3271 "start": {
3272 "column": 24,
3273 "line": 12
3274 }
3275 },
3276 {
3277 "defaultMessage": "!!!Use System Default ({default})",
3278 "end": {
3279 "column": 3,
3280 "line": 19
3281 },
3282 "file": "src/i18n/globalMessages.js",
3283 "id": "global.spellchecker.useDefault",
3284 "start": {
3285 "column": 29,
3286 "line": 16
3287 }
3288 },
3289 {
3290 "defaultMessage": "!!!Detect language automatically",
3291 "end": {
3292 "column": 3,
3293 "line": 23
3294 },
3295 "file": "src/i18n/globalMessages.js",
3296 "id": "global.spellchecking.autodetect",
3297 "start": {
3298 "column": 34,
3299 "line": 20
3300 }
3301 },
3302 {
3303 "defaultMessage": "!!!Automatic",
3304 "end": {
3305 "column": 3,
3306 "line": 27
3307 },
3308 "file": "src/i18n/globalMessages.js",
3309 "id": "global.spellchecking.autodetect.short",
3310 "start": {
3311 "column": 39,
3312 "line": 24
3313 }
3314 }
3315 ],
3316 "path": "src/i18n/globalMessages.json"
3317 },
3318 {
3319 "descriptors": [
3320 {
3321 "defaultMessage": "!!!Edit",
3322 "end": {
3323 "column": 3,
3324 "line": 13
3325 },
3326 "file": "src/lib/Menu.js",
3327 "id": "menu.edit",
3328 "start": {
3329 "column": 8,
3330 "line": 10
3331 }
3332 },
3333 {
3334 "defaultMessage": "!!!Undo",
3335 "end": {
3336 "column": 3,
3337 "line": 17
3338 },
3339 "file": "src/lib/Menu.js",
3340 "id": "menu.edit.undo",
3341 "start": {
3342 "column": 8,
3343 "line": 14
3344 }
3345 },
3346 {
3347 "defaultMessage": "!!!Redo",
3348 "end": {
3349 "column": 3,
3350 "line": 21
3351 },
3352 "file": "src/lib/Menu.js",
3353 "id": "menu.edit.redo",
3354 "start": {
3355 "column": 8,
3356 "line": 18
3357 }
3358 },
3359 {
3360 "defaultMessage": "!!!Cut",
3361 "end": {
3362 "column": 3,
3363 "line": 25
3364 },
3365 "file": "src/lib/Menu.js",
3366 "id": "menu.edit.cut",
3367 "start": {
3368 "column": 7,
3369 "line": 22
3370 }
3371 },
3372 {
3373 "defaultMessage": "!!!Copy",
3374 "end": {
3375 "column": 3,
3376 "line": 29
3377 },
3378 "file": "src/lib/Menu.js",
3379 "id": "menu.edit.copy",
3380 "start": {
3381 "column": 8,
3382 "line": 26
3383 }
3384 },
3385 {
3386 "defaultMessage": "!!!Paste",
3387 "end": {
3388 "column": 3,
3389 "line": 33
3390 },
3391 "file": "src/lib/Menu.js",
3392 "id": "menu.edit.paste",
3393 "start": {
3394 "column": 9,
3395 "line": 30
3396 }
3397 },
3398 {
3399 "defaultMessage": "!!!Paste And Match Style",
3400 "end": {
3401 "column": 3,
3402 "line": 37
3403 },
3404 "file": "src/lib/Menu.js",
3405 "id": "menu.edit.pasteAndMatchStyle",
3406 "start": {
3407 "column": 22,
3408 "line": 34
3409 }
3410 },
3411 {
3412 "defaultMessage": "!!!Delete",
3413 "end": {
3414 "column": 3,
3415 "line": 41
3416 },
3417 "file": "src/lib/Menu.js",
3418 "id": "menu.edit.delete",
3419 "start": {
3420 "column": 10,
3421 "line": 38
3422 }
3423 },
3424 {
3425 "defaultMessage": "!!!Select All",
3426 "end": {
3427 "column": 3,
3428 "line": 45
3429 },
3430 "file": "src/lib/Menu.js",
3431 "id": "menu.edit.selectAll",
3432 "start": {
3433 "column": 13,
3434 "line": 42
3435 }
3436 },
3437 {
3438 "defaultMessage": "!!!Speech",
3439 "end": {
3440 "column": 3,
3441 "line": 49
3442 },
3443 "file": "src/lib/Menu.js",
3444 "id": "menu.edit.speech",
3445 "start": {
3446 "column": 10,
3447 "line": 46
3448 }
3449 },
3450 {
3451 "defaultMessage": "!!!Start Speaking",
3452 "end": {
3453 "column": 3,
3454 "line": 53
3455 },
3456 "file": "src/lib/Menu.js",
3457 "id": "menu.edit.startSpeaking",
3458 "start": {
3459 "column": 17,
3460 "line": 50
3461 }
3462 },
3463 {
3464 "defaultMessage": "!!!Stop Speaking",
3465 "end": {
3466 "column": 3,
3467 "line": 57
3468 },
3469 "file": "src/lib/Menu.js",
3470 "id": "menu.edit.stopSpeaking",
3471 "start": {
3472 "column": 16,
3473 "line": 54
3474 }
3475 },
3476 {
3477 "defaultMessage": "!!!Start Dictation",
3478 "end": {
3479 "column": 3,
3480 "line": 61
3481 },
3482 "file": "src/lib/Menu.js",
3483 "id": "menu.edit.startDictation",
3484 "start": {
3485 "column": 18,
3486 "line": 58
3487 }
3488 },
3489 {
3490 "defaultMessage": "!!!Emoji & Symbols",
3491 "end": {
3492 "column": 3,
3493 "line": 65
3494 },
3495 "file": "src/lib/Menu.js",
3496 "id": "menu.edit.emojiSymbols",
3497 "start": {
3498 "column": 16,
3499 "line": 62
3500 }
3501 },
3502 {
3503 "defaultMessage": "!!!Actual Size",
3504 "end": {
3505 "column": 3,
3506 "line": 69
3507 },
3508 "file": "src/lib/Menu.js",
3509 "id": "menu.view.resetZoom",
3510 "start": {
3511 "column": 13,
3512 "line": 66
3513 }
3514 },
3515 {
3516 "defaultMessage": "!!!Zoom In",
3517 "end": {
3518 "column": 3,
3519 "line": 73
3520 },
3521 "file": "src/lib/Menu.js",
3522 "id": "menu.view.zoomIn",
3523 "start": {
3524 "column": 10,
3525 "line": 70
3526 }
3527 },
3528 {
3529 "defaultMessage": "!!!Zoom Out",
3530 "end": {
3531 "column": 3,
3532 "line": 77
3533 },
3534 "file": "src/lib/Menu.js",
3535 "id": "menu.view.zoomOut",
3536 "start": {
3537 "column": 11,
3538 "line": 74
3539 }
3540 },
3541 {
3542 "defaultMessage": "!!!Enter Full Screen",
3543 "end": {
3544 "column": 3,
3545 "line": 81
3546 },
3547 "file": "src/lib/Menu.js",
3548 "id": "menu.view.enterFullScreen",
3549 "start": {
3550 "column": 19,
3551 "line": 78
3552 }
3553 },
3554 {
3555 "defaultMessage": "!!!Exit Full Screen",
3556 "end": {
3557 "column": 3,
3558 "line": 85
3559 },
3560 "file": "src/lib/Menu.js",
3561 "id": "menu.view.exitFullScreen",
3562 "start": {
3563 "column": 18,
3564 "line": 82
3565 }
3566 },
3567 {
3568 "defaultMessage": "!!!Toggle Full Screen",
3569 "end": {
3570 "column": 3,
3571 "line": 89
3572 },
3573 "file": "src/lib/Menu.js",
3574 "id": "menu.view.toggleFullScreen",
3575 "start": {
3576 "column": 20,
3577 "line": 86
3578 }
3579 },
3580 {
3581 "defaultMessage": "!!!Toggle Developer Tools",
3582 "end": {
3583 "column": 3,
3584 "line": 93
3585 },
3586 "file": "src/lib/Menu.js",
3587 "id": "menu.view.toggleDevTools",
3588 "start": {
3589 "column": 18,
3590 "line": 90
3591 }
3592 },
3593 {
3594 "defaultMessage": "!!!Toggle Service Developer Tools",
3595 "end": {
3596 "column": 3,
3597 "line": 97
3598 },
3599 "file": "src/lib/Menu.js",
3600 "id": "menu.view.toggleServiceDevTools",
3601 "start": {
3602 "column": 25,
3603 "line": 94
3604 }
3605 },
3606 {
3607 "defaultMessage": "!!!Reload Service",
3608 "end": {
3609 "column": 3,
3610 "line": 101
3611 },
3612 "file": "src/lib/Menu.js",
3613 "id": "menu.view.reloadService",
3614 "start": {
3615 "column": 17,
3616 "line": 98
3617 }
3618 },
3619 {
3620 "defaultMessage": "!!!Reload Franz",
3621 "end": {
3622 "column": 3,
3623 "line": 105
3624 },
3625 "file": "src/lib/Menu.js",
3626 "id": "menu.view.reloadFranz",
3627 "start": {
3628 "column": 15,
3629 "line": 102
3630 }
3631 },
3632 {
3633 "defaultMessage": "!!!Minimize",
3634 "end": {
3635 "column": 3,
3636 "line": 109
3637 },
3638 "file": "src/lib/Menu.js",
3639 "id": "menu.window.minimize",
3640 "start": {
3641 "column": 12,
3642 "line": 106
3643 }
3644 },
3645 {
3646 "defaultMessage": "!!!Close",
3647 "end": {
3648 "column": 3,
3649 "line": 113
3650 },
3651 "file": "src/lib/Menu.js",
3652 "id": "menu.window.close",
3653 "start": {
3654 "column": 9,
3655 "line": 110
3656 }
3657 },
3658 {
3659 "defaultMessage": "!!!Learn More",
3660 "end": {
3661 "column": 3,
3662 "line": 117
3663 },
3664 "file": "src/lib/Menu.js",
3665 "id": "menu.help.learnMore",
3666 "start": {
3667 "column": 13,
3668 "line": 114
3669 }
3670 },
3671 {
3672 "defaultMessage": "!!!Changelog",
3673 "end": {
3674 "column": 3,
3675 "line": 121
3676 },
3677 "file": "src/lib/Menu.js",
3678 "id": "menu.help.changelog",
3679 "start": {
3680 "column": 13,
3681 "line": 118
3682 }
3683 },
3684 {
3685 "defaultMessage": "!!!Support",
3686 "end": {
3687 "column": 3,
3688 "line": 125
3689 },
3690 "file": "src/lib/Menu.js",
3691 "id": "menu.help.support",
3692 "start": {
3693 "column": 11,
3694 "line": 122
3695 }
3696 },
3697 {
3698 "defaultMessage": "!!!Terms of Service",
3699 "end": {
3700 "column": 3,
3701 "line": 129
3702 },
3703 "file": "src/lib/Menu.js",
3704 "id": "menu.help.tos",
3705 "start": {
3706 "column": 7,
3707 "line": 126
3708 }
3709 },
3710 {
3711 "defaultMessage": "!!!Privacy Statement",
3712 "end": {
3713 "column": 3,
3714 "line": 133
3715 },
3716 "file": "src/lib/Menu.js",
3717 "id": "menu.help.privacy",
3718 "start": {
3719 "column": 11,
3720 "line": 130
3721 }
3722 },
3723 {
3724 "defaultMessage": "!!!File",
3725 "end": {
3726 "column": 3,
3727 "line": 137
3728 },
3729 "file": "src/lib/Menu.js",
3730 "id": "menu.file",
3731 "start": {
3732 "column": 8,
3733 "line": 134
3734 }
3735 },
3736 {
3737 "defaultMessage": "!!!View",
3738 "end": {
3739 "column": 3,
3740 "line": 141
3741 },
3742 "file": "src/lib/Menu.js",
3743 "id": "menu.view",
3744 "start": {
3745 "column": 8,
3746 "line": 138
3747 }
3748 },
3749 {
3750 "defaultMessage": "!!!Services",
3751 "end": {
3752 "column": 3,
3753 "line": 145
3754 },
3755 "file": "src/lib/Menu.js",
3756 "id": "menu.services",
3757 "start": {
3758 "column": 12,
3759 "line": 142
3760 }
3761 },
3762 {
3763 "defaultMessage": "!!!Window",
3764 "end": {
3765 "column": 3,
3766 "line": 149
3767 },
3768 "file": "src/lib/Menu.js",
3769 "id": "menu.window",
3770 "start": {
3771 "column": 10,
3772 "line": 146
3773 }
3774 },
3775 {
3776 "defaultMessage": "!!!Help",
3777 "end": {
3778 "column": 3,
3779 "line": 153
3780 },
3781 "file": "src/lib/Menu.js",
3782 "id": "menu.help",
3783 "start": {
3784 "column": 8,
3785 "line": 150
3786 }
3787 },
3788 {
3789 "defaultMessage": "!!!About Franz",
3790 "end": {
3791 "column": 3,
3792 "line": 157
3793 },
3794 "file": "src/lib/Menu.js",
3795 "id": "menu.app.about",
3796 "start": {
3797 "column": 9,
3798 "line": 154
3799 }
3800 },
3801 {
3802 "defaultMessage": "!!!Settings",
3803 "end": {
3804 "column": 3,
3805 "line": 161
3806 },
3807 "file": "src/lib/Menu.js",
3808 "id": "menu.app.settings",
3809 "start": {
3810 "column": 12,
3811 "line": 158
3812 }
3813 },
3814 {
3815 "defaultMessage": "!!!Hide",
3816 "end": {
3817 "column": 3,
3818 "line": 165
3819 },
3820 "file": "src/lib/Menu.js",
3821 "id": "menu.app.hide",
3822 "start": {
3823 "column": 8,
3824 "line": 162
3825 }
3826 },
3827 {
3828 "defaultMessage": "!!!Hide Others",
3829 "end": {
3830 "column": 3,
3831 "line": 169
3832 },
3833 "file": "src/lib/Menu.js",
3834 "id": "menu.app.hideOthers",
3835 "start": {
3836 "column": 14,
3837 "line": 166
3838 }
3839 },
3840 {
3841 "defaultMessage": "!!!Unhide",
3842 "end": {
3843 "column": 3,
3844 "line": 173
3845 },
3846 "file": "src/lib/Menu.js",
3847 "id": "menu.app.unhide",
3848 "start": {
3849 "column": 10,
3850 "line": 170
3851 }
3852 },
3853 {
3854 "defaultMessage": "!!!Quit",
3855 "end": {
3856 "column": 3,
3857 "line": 177
3858 },
3859 "file": "src/lib/Menu.js",
3860 "id": "menu.app.quit",
3861 "start": {
3862 "column": 8,
3863 "line": 174
3864 }
3865 },
3866 {
3867 "defaultMessage": "!!!Add New Service...",
3868 "end": {
3869 "column": 3,
3870 "line": 181
3871 },
3872 "file": "src/lib/Menu.js",
3873 "id": "menu.services.addNewService",
3874 "start": {
3875 "column": 17,
3876 "line": 178
3877 }
3878 },
3879 {
3880 "defaultMessage": "!!!Activate next service...",
3881 "end": {
3882 "column": 3,
3883 "line": 185
3884 },
3885 "file": "src/lib/Menu.js",
3886 "id": "menu.services.setNextServiceActive",
3887 "start": {
3888 "column": 23,
3889 "line": 182
3890 }
3891 },
3892 {
3893 "defaultMessage": "!!!Activate previous service...",
3894 "end": {
3895 "column": 3,
3896 "line": 189
3897 },
3898 "file": "src/lib/Menu.js",
3899 "id": "menu.services.activatePreviousService",
3900 "start": {
3901 "column": 27,
3902 "line": 186
3903 }
3904 },
3905 {
3906 "defaultMessage": "!!!Disable notifications & audio",
3907 "end": {
3908 "column": 3,
3909 "line": 193
3910 },
3911 "file": "src/lib/Menu.js",
3912 "id": "sidebar.muteApp",
3913 "start": {
3914 "column": 11,
3915 "line": 190
3916 }
3917 },
3918 {
3919 "defaultMessage": "!!!Enable notifications & audio",
3920 "end": {
3921 "column": 3,
3922 "line": 197
3923 },
3924 "file": "src/lib/Menu.js",
3925 "id": "sidebar.unmuteApp",
3926 "start": {
3927 "column": 13,
3928 "line": 194
3929 }
3930 }
3931 ],
3932 "path": "src/lib/Menu.json"
3933 }
3934] \ No newline at end of file
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index 671eecd41..9639ec5f7 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "ΕπαναφόÏτωση", 2 "app.errorHandler.action" : "ΕπαναφόÏτωση",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Κάτι δεν λειτουÏγεί",
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Get a Franz Supporter License",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz θα συνεχίσει σε {seconds} δευτεÏόλεπτα.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Δεν είναι δυνατή η σÏνδεση με τις ζωντανές υπηÏεσίες του Franz", 14 "global.api.unhealthy" : "Δεν είναι δυνατή η σÏνδεση με τις ζωντανές υπηÏεσίες του Franz",
8 "global.notConnectedToTheInternet" : "Έχετε αποσυνδεθεί από το Διαδίκτυο", 15 "global.notConnectedToTheInternet" : "Έχετε αποσυνδεθεί από το Διαδίκτυο",
16 "global.spellchecker.useDefault" : "Use System Default ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Spell checking language",
9 "import.headline" : "Εισαγάγετε τις υπηÏεσίες σας Franz 4", 20 "import.headline" : "Εισαγάγετε τις υπηÏεσίες σας Franz 4",
10 "import.notSupportedHeadline" : "ΥπηÏεσίες που δεν υποστηÏίζονται ακόμα στο Franz 5", 21 "import.notSupportedHeadline" : "ΥπηÏεσίες που δεν υποστηÏίζονται ακόμα στο Franz 5",
11 "import.skip.label" : "Θέλω να Ï€Ïοσθέσω υπηÏεσίες χειÏοκίνητα", 22 "import.skip.label" : "Θέλω να Ï€Ïοσθέσω υπηÏεσίες χειÏοκίνητα",
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 4e0c5575d..7543d38bd 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -1,281 +1,285 @@
1{ 1{
2 "app.errorHandler.action": "Reload",
3 "app.errorHandler.headline": "Something went wrong",
4 "feature.delayApp.action": "Get a Franz Supporter License",
5 "feature.delayApp.headline": "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.text": "Franz will continue in {seconds} seconds.",
7 "feature.shareFranz.action.email": "Send as email",
8 "feature.shareFranz.action.facebook": "Share on Facebook",
9 "feature.shareFranz.action.twitter": "Share on Twitter",
10 "feature.shareFranz.headline": "Franz is better together!",
11 "feature.shareFranz.shareText.email": "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter": "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @MeetFranz",
13 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
2 "global.api.unhealthy": "Can't connect to Franz online services", 14 "global.api.unhealthy": "Can't connect to Franz online services",
3 "global.notConnectedToTheInternet": "You are not connected to the internet.", 15 "global.notConnectedToTheInternet": "You are not connected to the internet.",
4 "global.spellchecking.language": "Spell checking language",
5 "global.spellchecker.useDefault": "Use System Default ({default})", 16 "global.spellchecker.useDefault": "Use System Default ({default})",
6 "global.spellchecking.autodetect": "Detect language automatically", 17 "global.spellchecking.autodetect": "Detect language automatically",
7 "global.spellchecking.autodetect.short": "Automatic", 18 "global.spellchecking.autodetect.short": "Automatic",
8 "welcome.signupButton": "Create a free account", 19 "global.spellchecking.language": "Spell checking language",
9 "welcome.loginButton": "Login to your account", 20 "import.headline": "Import your Franz 4 services",
10 "welcome.slogan": "Messaging that works for you", 21 "import.notSupportedHeadline": "Services not yet supported in Franz 5",
11 "login.headline": "Sign in", 22 "import.skip.label": "I want to add services manually",
23 "import.submit.label": "Import services",
24 "infobar.buttonChangelog": "What is new?",
25 "infobar.buttonInstallUpdate": "Restart & install update",
26 "infobar.buttonReloadServices": "Reload services",
27 "infobar.requiredRequestsFailed": "Could not load services and user information",
28 "infobar.servicesUpdated": "Your services have been updated.",
29 "infobar.updateAvailable": "A new update for Franz is available.",
30 "invite.email.label": "Email address",
31 "invite.headline.friends": "Invite 3 of your friends or colleagues",
32 "invite.name.label": "Name",
33 "invite.skip.label": "I want to do this later",
34 "invite.submit.label": "Send invites",
35 "invite.successInfo": "Invitations sent successfully",
12 "login.email.label": "Email address", 36 "login.email.label": "Email address",
37 "login.headline": "Sign in",
38 "login.invalidCredentials": "Email or password not valid",
39 "login.link.password": "Reset password",
40 "login.link.signup": "Create a free account",
13 "login.password.label": "Password", 41 "login.password.label": "Password",
42 "login.serverLogout": "Your session expired, please login again.",
14 "login.submit.label": "Sign in", 43 "login.submit.label": "Sign in",
15 "login.invalidCredentials": "Email or password not valid",
16 "login.tokenExpired": "Your session expired, please login again.", 44 "login.tokenExpired": "Your session expired, please login again.",
17 "login.serverLogout": "Your session expired, please login again.", 45 "menu.app.about": "About Franz",
18 "login.link.signup": "Create a free account", 46 "menu.app.hide": "Hide",
19 "login.link.password": "Reset password", 47 "menu.app.hideOthers": "Hide Others",
20 "password.headline": "Reset password", 48 "menu.app.quit": "Quit",
49 "menu.app.settings": "Settings",
50 "menu.app.unhide": "Unhide",
51 "menu.edit": "Edit",
52 "menu.edit.copy": "Copy",
53 "menu.edit.cut": "Cut",
54 "menu.edit.delete": "Delete",
55 "menu.edit.emojiSymbols": "Emoji & Symbols",
56 "menu.edit.paste": "Paste",
57 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
58 "menu.edit.redo": "Redo",
59 "menu.edit.selectAll": "Select All",
60 "menu.edit.speech": "Speech",
61 "menu.edit.startDictation": "Start Dictation",
62 "menu.edit.startSpeaking": "Start Speaking",
63 "menu.edit.stopSpeaking": "Stop Speaking",
64 "menu.edit.undo": "Undo",
65 "menu.file": "File",
66 "menu.help": "Help",
67 "menu.help.changelog": "Changelog",
68 "menu.help.learnMore": "Learn More",
69 "menu.help.privacy": "Privacy Statement",
70 "menu.help.support": "Support",
71 "menu.help.tos": "Terms of Service",
72 "menu.services": "Services",
73 "menu.services.activatePreviousService": "Activate previous service",
74 "menu.services.addNewService": "Add New Service...",
75 "menu.services.setNextServiceActive": "Activate next service",
76 "menu.view": "View",
77 "menu.view.enterFullScreen": "Enter Full Screen",
78 "menu.view.exitFullScreen": "Exit Full Screen",
79 "menu.view.reloadFranz": "Reload Franz",
80 "menu.view.reloadService": "Reload Service",
81 "menu.view.resetZoom": "Actual Size",
82 "menu.view.toggleDevTools": "Toggle Developer Tools",
83 "menu.view.toggleFullScreen": "Toggle Full Screen",
84 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools",
85 "menu.view.zoomIn": "Zoom In",
86 "menu.view.zoomOut": "Zoom Out",
87 "menu.window": "Window",
88 "menu.window.close": "Close",
89 "menu.window.minimize": "Minimize",
21 "password.email.label": "Email address", 90 "password.email.label": "Email address",
22 "password.submit.label": "Submit", 91 "password.headline": "Reset password",
92 "password.link.login": "Sign in to your account",
93 "password.link.signup": "Create a free account",
23 "password.noUser": "No user with that email address was found", 94 "password.noUser": "No user with that email address was found",
95 "password.submit.label": "Submit",
24 "password.successInfo": "Please check your email", 96 "password.successInfo": "Please check your email",
25 "password.link.signup": "Create a free account", 97 "premiumFeature.button.upgradeAccount": "Upgrade account",
26 "password.link.login": "Sign in to your account",
27 "signup.headline": "Sign up",
28 "signup.firstname.label": "First Name",
29 "signup.lastname.label": "Last Name",
30 "signup.email.label": "Email address",
31 "signup.company.label": "Company",
32 "signup.password.label": "Password",
33 "signup.submit.label": "Create account",
34 "signup.link.login": "Already have an account, sign in?",
35 "signup.emailDuplicate": "A user with that email address already exists",
36 "signup.legal.info": "By creating a Franz account you accept the",
37 "signup.legal.terms": "Terms of service",
38 "signup.legal.privacy": "Privacy Statement",
39 "pricing.headline": "Support Franz", 98 "pricing.headline": "Support Franz",
40 "pricing.support.label": "Select your support plan",
41 "pricing.submit.label": "I want to support the development of Franz",
42 "pricing.link.skipPayment": "I don't want to support the development of Franz.", 99 "pricing.link.skipPayment": "I don't want to support the development of Franz.",
43 "import.headline": "Import your Franz 4 services", 100 "pricing.submit.label": "I want to support the development of Franz",
44 "import.notSupportedHeadline": "Services not yet supported in Franz 5", 101 "pricing.support.label": "Select your support plan",
45 "import.submit.label": "Import services", 102 "service.crashHandler.action": "Reload {name}",
46 "import.skip.label": "I want to add services manually", 103 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
47 "invite.submit.label": "Send invites", 104 "service.crashHandler.headline": "Oh no!",
48 "invite.headline.friends": "Invite 3 of your friends or colleagues", 105 "service.crashHandler.text": "{name} has caused an error.",
49 "invite.name.label": "Name", 106 "service.disabledHandler.action": "Enable {name}",
50 "invite.email.label": "Email address", 107 "service.disabledHandler.headline": "{name} is disabled",
51 "invite.skip.label": "I want to do this later", 108 "service.errorHandler.action": "Reload {name}",
52 "invite.successInfo": "Invitations sent successfully", 109 "service.errorHandler.editAction": "Edit {name}",
53 "subscription.submit.label": "I want to support the development of Franz", 110 "service.errorHandler.headline": "Oh no!",
54 "subscription.paymentSessionError": "Could not initialize payment form", 111 "service.errorHandler.message": "Error",
55 "subscription.includedFeatures": "Paid Franz Premium Supporter Account includes", 112 "service.errorHandler.text": "{name} has failed to load.",
56 "subscription.features.onpremise": "Add on-premise/hosted services like HipChat",
57 "subscription.features.onpremise.mattermost": "Add on-premise/hosted services like Mattermost",
58 "subscription.features.encryptedSync": "Encrypted session synchronization",
59 "subscription.features.proxy": "Proxy support for services",
60 "subscription.features.ads": "No ads, ever!",
61 "subscription.features.spellchecker": "Support for spellchecker",
62 "subscription.features.noInterruptions": "No app delays & nagging to upgrade license",
63 "subscription.features.comingSoon": "coming soon",
64 "infobar.servicesUpdated": "Your services have been updated.",
65 "infobar.updateAvailable": "A new update for Franz is available.",
66 "infobar.buttonReloadServices": "Reload services",
67 "infobar.buttonInstallUpdate": "Restart & install update",
68 "infobar.buttonChangelog": "What is new?",
69 "infobar.requiredRequestsFailed": "Could not load services and user information",
70 "sidebar.settings": "Settings",
71 "sidebar.addNewService": "Add new service",
72 "sidebar.muteApp": "Disable notifications & audio",
73 "sidebar.unmuteApp": "Enable notifications & audio",
74 "services.welcome": "Welcome to Franz",
75 "services.getStarted": "Get started", 113 "services.getStarted": "Get started",
76 "settings.searchService": "Search service", 114 "services.welcome": "Welcome to Franz",
77 "settings.account.headline": "Account", 115 "settings.account.account.editButton": "Edit account",
78 "settings.account.headlineSubscription": "Your subscription",
79 "settings.account.headlineUpgrade": "Upgrade your account & support Franz",
80 "settings.account.headlineInvoices": "Invoices",
81 "settings.account.headlineDangerZone": "Danger Zone",
82 "settings.account.manageSubscription.label": "Manage your subscription",
83 "settings.account.accountType.basic": "Basic Account", 116 "settings.account.accountType.basic": "Basic Account",
84 "settings.account.accountType.premium": "Premium Supporter Account", 117 "settings.account.accountType.premium": "Premium Supporter Account",
85 "settings.account.account.editButton": "Edit account",
86 "settings.account.invoiceDownload": "Download",
87 "settings.account.userInfoRequestFailed": "Could not load user information",
88 "settings.account.tryReloadUserInfoRequest": "Try again",
89 "settings.account.headlineProfile": "Update profile",
90 "settings.account.headlineAccount": "Account information",
91 "settings.account.headlinePassword": "Change password",
92 "settings.account.successInfo": "Your changes have been saved",
93 "settings.account.buttonSave": "Update profile", 118 "settings.account.buttonSave": "Update profile",
94 "settings.account.deleteAccount": "Delete account", 119 "settings.account.deleteAccount": "Delete account",
95 "settings.account.deleteInfo": "If you don't need your Franz account any longer, you can delete your account and all related data here.",
96 "settings.account.deleteEmailSent": "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 120 "settings.account.deleteEmailSent": "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!",
121 "settings.account.deleteInfo": "If you don't need your Franz account any longer, you can delete your account and all related data here.",
122 "settings.account.headline": "Account",
123 "settings.account.headlineAccount": "Account information",
124 "settings.account.headlineDangerZone": "Danger Zone",
125 "settings.account.headlineInvoices": "Invoices",
126 "settings.account.headlinePassword": "Change password",
127 "settings.account.headlineProfile": "Update profile",
128 "settings.account.headlineSubscription": "Your subscription",
129 "settings.account.headlineUpgrade": "Upgrade your account & support Franz",
130 "settings.account.invoiceDownload": "Download",
131 "settings.account.manageSubscription.label": "Manage your subscription",
132 "settings.account.successInfo": "Your changes have been saved",
133 "settings.account.tryReloadServices": "Try again",
134 "settings.account.tryReloadUserInfoRequest": "Try again",
135 "settings.account.userInfoRequestFailed": "Could not load user information",
136 "settings.app.buttonClearAllCache": "Clear cache",
137 "settings.app.buttonInstallUpdate": "Restart & install update",
138 "settings.app.buttonSearchForUpdate": "Check for updates",
139 "settings.app.cacheInfo": "Franz cache is currently using {size} of disk space.",
140 "settings.app.currentVersion": "Current version:",
141 "settings.app.form.autoLaunchInBackground": "Open in background",
142 "settings.app.form.autoLaunchOnStart": "Launch Franz on start",
143 "settings.app.form.beta": "Include beta versions",
144 "settings.app.form.darkMode": "Join the Dark Side",
145 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration",
146 "settings.app.form.enableSpellchecking": "Enable spell checking",
147 "settings.app.form.enableSystemTray": "Show Franz in system tray",
148 "settings.app.form.language": "Language",
149 "settings.app.form.minimizeToSystemTray": "Minimize Franz to system tray",
150 "settings.app.form.runInBackground": "Keep Franz in background when closing the window",
151 "settings.app.form.showDisabledServices": "Display disabled services tabs",
152 "settings.app.form.showMessagesBadgesWhenMuted": "Show unread message badge when notifications are disabled",
153 "settings.app.headline": "Settings",
154 "settings.app.headlineAdvanced": "Advanced",
155 "settings.app.headlineAppearance": "Appearance",
156 "settings.app.headlineGeneral": "General",
157 "settings.app.headlineLanguage": "Language",
158 "settings.app.headlineUpdates": "Updates",
159 "settings.app.restartRequired": "Changes require restart",
160 "settings.app.subheadlineCache": "Cache",
161 "settings.app.translationHelp": "Help us to translate Franz into your language.",
162 "settings.app.updateStatusAvailable": "Update available, downloading...",
163 "settings.app.updateStatusSearching": "Is searching for update",
164 "settings.app.updateStatusUpToDate": "You are using the latest version of Franz",
97 "settings.invite.headline": "Invite Friends", 165 "settings.invite.headline": "Invite Friends",
98 "settings.navigation.availableServices": "Available services",
99 "settings.navigation.yourServices": "Your services",
100 "settings.navigation.account": "Account", 166 "settings.navigation.account": "Account",
101 "settings.navigation.settings": "Settings", 167 "settings.navigation.availableServices": "Available services",
102 "settings.navigation.inviteFriends": "Invite Friends", 168 "settings.navigation.inviteFriends": "Invite Friends",
103 "settings.navigation.logout": "Logout", 169 "settings.navigation.logout": "Logout",
104 "settings.recipes.headline": "Available services", 170 "settings.navigation.settings": "Settings",
105 "settings.recipes.mostPopular": "Most popular", 171 "settings.navigation.yourServices": "Your services",
106 "settings.recipes.all": "All services", 172 "settings.recipes.all": "All services",
107 "settings.recipes.dev": "Development", 173 "settings.recipes.dev": "Development",
174 "settings.recipes.headline": "Available services",
175 "settings.recipes.missingService": "Missing a service?",
176 "settings.recipes.mostPopular": "Most popular",
108 "settings.recipes.nothingFound": "Sorry, but no service matched your search term.", 177 "settings.recipes.nothingFound": "Sorry, but no service matched your search term.",
109 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added", 178 "settings.recipes.servicesSuccessfulAddedInfo": "Service successfully added",
110 "settings.recipes.missingService": "Missing a service?", 179 "settings.searchService": "Search service",
111 "settings.service.form.saveButton": "Save service", 180 "settings.service.error.goBack": "Back to services",
112 "settings.service.form.deleteButton": "Delete service", 181 "settings.service.error.headline": "Error",
113 "settings.service.form.availableServices": "Available services", 182 "settings.service.error.message": "Could not load service recipe.",
114 "settings.service.form.yourServices": "Your services",
115 "settings.service.form.addServiceHeadline": "Add {name}", 183 "settings.service.form.addServiceHeadline": "Add {name}",
116 "settings.service.form.editServiceHeadline": "Edit {name}", 184 "settings.service.form.availableServices": "Available services",
117 "settings.service.form.tabHosted": "Hosted", 185 "settings.service.form.customUrl": "Custom server",
118 "settings.service.form.tabOnPremise": "Self hosted â­ï¸",
119 "settings.service.form.useHostedService": "Use the hosted {name} service.",
120 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
121 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Franz Premium Supporter Account.", 186 "settings.service.form.customUrlPremiumInfo": "To add self hosted services, you need a Franz Premium Supporter Account.",
122 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account", 187 "settings.service.form.customUrlUpgradeAccount": "Upgrade your account",
123 "settings.service.form.indirectMessageInfo": "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", 188 "settings.service.form.customUrlValidationError": "Could not validate custom {name} server.",
124 "settings.service.form.name": "Name", 189 "settings.service.form.deleteButton": "Delete service",
125 "settings.service.form.enableService": "Enable service", 190 "settings.service.form.editServiceHeadline": "Edit {name}",
126 "settings.service.form.enableNotification": "Enable notifications",
127 "settings.service.form.enableBadge": "Show unread message badges",
128 "settings.service.form.team": "Team",
129 "settings.service.form.customUrl": "Custom server",
130 "settings.service.form.indirectMessages": "Show message badge for all new messages",
131 "settings.service.form.enableAudio": "Enable audio", 191 "settings.service.form.enableAudio": "Enable audio",
132 "settings.service.form.isMutedInfo": "When disabled, all notification sounds and audio playback are muted", 192 "settings.service.form.enableBadge": "Show unread message badges",
133 "settings.service.form.headlineNotifications": "Notifications", 193 "settings.service.form.enableDarkMode": "Enable Dark Mode",
194 "settings.service.form.enableNotification": "Enable notifications",
195 "settings.service.form.enableService": "Enable service",
134 "settings.service.form.headlineBadges": "Unread message badges", 196 "settings.service.form.headlineBadges": "Unread message badges",
135 "settings.service.form.headlineGeneral": "General", 197 "settings.service.form.headlineGeneral": "General",
198 "settings.service.form.headlineNotifications": "Notifications",
136 "settings.service.form.icon": "Custom icon", 199 "settings.service.form.icon": "Custom icon",
137 "settings.service.form.iconDelete": "Delete", 200 "settings.service.form.iconDelete": "Delete",
138 "settings.service.form.iconUpload": "Drop your image, or click here", 201 "settings.service.form.iconUpload": "Drop your image, or click here",
139 "settings.service.form.enableDarkMode": "Enable Dark Mode", 202 "settings.service.form.indirectMessageInfo": "You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
203 "settings.service.form.indirectMessages": "Show message badge for all new messages",
204 "settings.service.form.isMutedInfo": "When disabled, all notification sounds and audio playback are muted",
205 "settings.service.form.name": "Name",
140 "settings.service.form.proxy.headline": "HTTP/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline": "HTTP/HTTPS Proxy Settings",
141 "settings.service.form.proxy.isEnabled": "Use Proxy",
142 "settings.service.form.proxy.host": "Proxy Host/IP", 207 "settings.service.form.proxy.host": "Proxy Host/IP",
143 "settings.service.form.proxy.port": "Port",
144 "settings.service.form.proxy.user": "User (optional)",
145 "settings.service.form.proxy.password": "Password (optional)",
146 "settings.service.form.proxy.info": "Proxy settings will not synced with the Franz servers.", 208 "settings.service.form.proxy.info": "Proxy settings will not synced with the Franz servers.",
209 "settings.service.form.proxy.isEnabled": "Use Proxy",
210 "settings.service.form.proxy.password": "Password (optional)",
211 "settings.service.form.proxy.port": "Port",
147 "settings.service.form.proxy.restartInfo": "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo": "Please restart Franz after changing proxy Settings.",
148 "settings.service.form.spellcheckerLanguage": "Spell checking Language", 213 "settings.service.form.proxy.user": "User (optional)",
149 "settings.service.form.spellcheckerLanguage.default": "Use System Default ({default})", 214 "settings.service.form.saveButton": "Save service",
150 "settings.service.error.headline": "Error", 215 "settings.service.form.tabHosted": "Hosted",
151 "settings.service.error.goBack": "Back to services", 216 "settings.service.form.tabOnPremise": "Self hosted â­ï¸",
152 "settings.service.error.message": "Could not load service recipe.", 217 "settings.service.form.team": "Team",
153 "settings.services.tooltip.isDisabled": "Service is disabled", 218 "settings.service.form.useHostedService": "Use the hosted {name} service.",
154 "settings.services.tooltip.notificationsDisabled": "Notifications are disabled", 219 "settings.service.form.yourServices": "Your services",
155 "settings.services.tooltip.isMuted": "All sounds are muted", 220 "settings.services.deletedInfo": "Service has been deleted",
221 "settings.services.discoverServices": "Discover services",
156 "settings.services.headline": "Your services", 222 "settings.services.headline": "Your services",
157 "settings.services.noServicesAdded": "You haven't added any services yet.", 223 "settings.services.noServicesAdded": "You haven't added any services yet.",
158 "settings.services.discoverServices": "Discover services", 224 "settings.services.servicesRequestFailed": "Could not load your services",
225 "settings.services.tooltip.isDisabled": "Service is disabled",
226 "settings.services.tooltip.isMuted": "All sounds are muted",
227 "settings.services.tooltip.notificationsDisabled": "Notifications are disabled",
159 "settings.services.updatedInfo": "Your changes have been saved", 228 "settings.services.updatedInfo": "Your changes have been saved",
160 "settings.services.deletedInfo": "Service has been deleted", 229 "settings.user.form.accountType.company": "Company",
161 "settings.app.headline": "Settings", 230 "settings.user.form.accountType.individual": "Individual",
162 "settings.app.headlineGeneral": "General", 231 "settings.user.form.accountType.label": "Account type",
163 "settings.app.headlineLanguage": "Language", 232 "settings.user.form.accountType.non-profit": "Non-Profit",
164 "settings.app.headlineUpdates": "Updates", 233 "settings.user.form.currentPassword": "Current password",
165 "settings.app.headlineAppearance": "Appearance", 234 "settings.user.form.email": "Email",
166 "settings.app.headlineAdvanced": "Advanced",
167 "settings.app.buttonSearchForUpdate": "Check for updates",
168 "settings.app.buttonInstallUpdate": "Restart & install update",
169 "settings.app.updateStatusSearching": "Is searching for update",
170 "settings.app.updateStatusAvailable": "Update available, downloading...",
171 "settings.app.updateStatusUpToDate": "You are using the latest version of Franz",
172 "settings.app.subheadlineCache": "Cache",
173 "settings.app.cacheInfo": "Franz cache is currently using {size} of disk space.",
174 "settings.app.buttonClearAllCache": "Clear cache",
175 "settings.app.form.autoLaunchOnStart": "Launch Franz on start",
176 "settings.app.form.autoLaunchInBackground": "Open in background",
177 "settings.app.form.enableSystemTray": "Show Franz in system tray",
178 "settings.app.form.darkMode": "Join the Dark Side",
179 "settings.app.form.minimizeToSystemTray": "Minimize Franz to system tray",
180 "settings.app.form.enableMenuBar": "Show Franz in Menu Bar",
181 "settings.app.form.hideDockIcon": "Hide Franz icon in Dock",
182 "settings.app.form.runInBackground": "Keep Franz in background when closing the window",
183 "settings.app.form.language": "Language",
184 "settings.app.form.enableSpellchecking": "Enable spell checking",
185 "settings.app.form.spellcheckerLanguage": "Spell checking language",
186 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration",
187 "settings.app.form.showDisabledServices": "Display disabled services tabs",
188 "settings.app.form.showMessagesBadgesWhenMuted": "Show unread message badge when notifications are disabled",
189 "settings.app.form.beta": "Include beta versions",
190 "settings.app.translationHelp": "Help us to translate Franz into your language.",
191 "settings.app.currentVersion": "Current version:",
192 "settings.app.restartRequired": "Changes require restart",
193 "settings.user.form.firstname": "First Name", 235 "settings.user.form.firstname": "First Name",
194 "settings.user.form.lastname": "Last Name", 236 "settings.user.form.lastname": "Last Name",
195 "settings.user.form.email": "Email",
196 "settings.user.form.currentPassword": "Current password",
197 "settings.user.form.newPassword": "New password", 237 "settings.user.form.newPassword": "New password",
198 "settings.user.form.accountType.label": "Account type", 238 "sidebar.addNewService": "Add new service",
199 "settings.user.form.accountType.individual": "Individual", 239 "sidebar.muteApp": "Disable notifications & audio",
200 "settings.user.form.accountType.non-profit": "Non-Profit", 240 "sidebar.settings": "Settings",
201 "settings.user.form.accountType.company": "Company", 241 "sidebar.unmuteApp": "Enable notifications & audio",
242 "signup.company.label": "Company",
243 "signup.email.label": "Email address",
244 "signup.emailDuplicate": "A user with that email address already exists",
245 "signup.firstname.label": "First Name",
246 "signup.headline": "Sign up",
247 "signup.lastname.label": "Last Name",
248 "signup.legal.info": "By creating a Franz account you accept the",
249 "signup.legal.privacy": "Privacy Statement",
250 "signup.legal.terms": "Terms of service",
251 "signup.link.login": "Already have an account, sign in?",
252 "signup.password.label": "Password",
253 "signup.submit.label": "Create account",
254 "subscription.euTaxInfo": "EU residents: local sales tax may apply",
255 "subscription.features.ads": "No ads, ever!",
256 "subscription.features.comingSoon": "coming soon",
257 "subscription.features.noInterruptions": "No app delays & nagging to upgrade license",
258 "subscription.features.onpremise.mattermost": "Add on-premise/hosted services like Mattermost",
259 "subscription.features.proxy": "Proxy support for services",
260 "subscription.features.spellchecker": "Support for spellchecker",
261 "subscription.includedFeatures": "Paid Franz Premium Supporter Account includes",
262 "subscription.paymentSessionError": "Could not initialize payment form",
263 "subscription.submit.label": "I want to support the development of Franz",
202 "subscription.type.free": "free", 264 "subscription.type.free": "free",
203 "subscription.type.month": "month", 265 "subscription.type.month": "month",
204 "subscription.type.year": "year", 266 "subscription.type.year": "year",
205 "subscription.euTaxInfo": "EU residents: local sales tax may apply",
206 "subscriptionPopup.buttonCancel": "Cancel", 267 "subscriptionPopup.buttonCancel": "Cancel",
207 "subscriptionPopup.buttonDone": "Done", 268 "subscriptionPopup.buttonDone": "Done",
208 "tabs.item.reload": "Reload", 269 "tabs.item.deleteService": "Delete service",
209 "tabs.item.edit": "Edit",
210 "tabs.item.disableNotifications": "Disable notifications",
211 "tabs.item.enableNotification": "Enable notifications",
212 "tabs.item.disableAudio": "Disable audio", 270 "tabs.item.disableAudio": "Disable audio",
213 "tabs.item.enableAudio": "Enable audio", 271 "tabs.item.disableNotifications": "Disable notifications",
214 "tabs.item.disableService": "Disable service", 272 "tabs.item.disableService": "Disable service",
273 "tabs.item.edit": "Edit",
274 "tabs.item.enableAudio": "Enable audio",
275 "tabs.item.enableNotification": "Enable notifications",
215 "tabs.item.enableService": "Enable service", 276 "tabs.item.enableService": "Enable service",
216 "tabs.item.deleteService": "Delete service", 277 "tabs.item.reload": "Reload",
217 "service.crashHandler.headline": "Oh no!",
218 "service.crashHandler.text": "{name} has caused an error.",
219 "service.crashHandler.action": "Reload {name}",
220 "service.crashHandler.autoReload": "Trying to automatically restore {name} in {seconds} seconds",
221 "service.errorHandler.headline": "Oh no!",
222 "service.errorHandler.text": "{name} has failed to load.",
223 "service.errorHandler.message": "Error",
224 "service.errorHandler.action": "Reload {name}",
225 "service.errorHandler.editAction": "Edit {name}",
226 "service.disabledHandler.headline": "{name} is disabled",
227 "service.disabledHandler.action": "Enable {name}",
228 "menu.edit": "Edit",
229 "menu.edit.undo": "Undo",
230 "menu.edit.redo": "Redo",
231 "menu.edit.cut": "Cut",
232 "menu.edit.copy": "Copy",
233 "menu.edit.paste": "Paste",
234 "menu.edit.pasteAndMatchStyle": "Paste And Match Style",
235 "menu.edit.delete": "Delete",
236 "menu.edit.selectAll": "Select All",
237 "menu.edit.speech": "Speech",
238 "menu.edit.startSpeaking": "Start Speaking",
239 "menu.edit.stopSpeaking": "Stop Speaking",
240 "menu.edit.startDictation": "Start Dictation",
241 "menu.edit.emojiSymbols": "Emoji & Symbols",
242 "menu.view.resetZoom": "Actual Size",
243 "menu.view.zoomIn": "Zoom In",
244 "menu.view.zoomOut": "Zoom Out",
245 "menu.view.enterFullScreen": "Enter Full Screen",
246 "menu.view.exitFullScreen": "Exit Full Screen",
247 "menu.view.toggleFullScreen": "Toggle Full Screen",
248 "menu.view.toggleDevTools": "Toggle Developer Tools",
249 "menu.view.toggleServiceDevTools": "Toggle Service Developer Tools",
250 "menu.view.reloadService": "Reload Service",
251 "menu.view.reloadFranz": "Reload Franz",
252 "menu.window.minimize": "Minimize",
253 "menu.window.close": "Close",
254 "menu.help.learnMore": "Learn More",
255 "menu.help.changelog": "Changelog",
256 "menu.help.support": "Support",
257 "menu.help.tos": "Terms of Service",
258 "menu.help.privacy": "Privacy Statement",
259 "menu.file": "File",
260 "menu.view": "View",
261 "menu.services": "Services",
262 "menu.window": "Window",
263 "menu.help": "Help",
264 "menu.app.about": "About Franz",
265 "menu.app.settings": "Settings",
266 "menu.app.hide": "Hide",
267 "menu.app.hideOthers": "Hide Others",
268 "menu.app.unhide": "Unhide",
269 "menu.app.quit": "Quit",
270 "menu.services.addNewService": "Add New Service...",
271 "validation.required": "{field} is required",
272 "validation.email": "{field} is not valid", 278 "validation.email": "{field} is not valid",
273 "validation.url": "{field} is not a valid URL",
274 "validation.minLength": "{field} should be at least {length} characters long", 279 "validation.minLength": "{field} should be at least {length} characters long",
275 "feature.delayApp.headline": "Please purchase a Franz Supporter License to skip waiting", 280 "validation.oneRequired": "At least one is required",
276 "feature.delayApp.action": "Get a Franz Supporter License", 281 "validation.required": "{field} is required",
277 "feature.delayApp.text": "Franz will continue in {seconds} seconds.", 282 "validation.url": "{field} is not a valid URL",
278 "premiumFeature.button.upgradeAccount": "Upgrade account", 283 "welcome.loginButton": "Login to your account",
279 "app.errorHandler.headline": "Something went wrong", 284 "welcome.signupButton": "Create a free account"
280 "app.errorHandler.action": "Reload" 285} \ No newline at end of file
281}
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 669b4d2dd..3ac23d9a5 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Recargar", 2 "app.errorHandler.action" : "Recargar",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Ha surgido un error",
4 "feature.delayApp.action" : "Consigue una Licencia de Soporte de Franz", 4 "feature.delayApp.action" : "Consigue una Licencia de Soporte de Franz",
5 "feature.delayApp.headline" : "Por favor, compra una Licencia de Soporte de Franz para saltar la espera", 5 "feature.delayApp.headline" : "Por favor, compra una Licencia de Soporte de Franz para saltar la espera",
6 "feature.delayApp.text" : "Franz continuará en {seconds} segundos.", 6 "feature.delayApp.text" : "Franz continuará en {seconds} segundos.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "No es posible conectarse a los servicios en línea de Franz.", 14 "global.api.unhealthy" : "No es posible conectarse a los servicios en línea de Franz.",
8 "global.notConnectedToTheInternet" : "No estás conectado a Internet", 15 "global.notConnectedToTheInternet" : "No estás conectado a Internet",
16 "global.spellchecker.useDefault" : "Utilizar estándar del sistema ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Corrector de ortografía",
9 "import.headline" : "Importa tus servicios de Franz 4", 20 "import.headline" : "Importa tus servicios de Franz 4",
10 "import.notSupportedHeadline" : "Servicios no admitidos aún en Franz 5", 21 "import.notSupportedHeadline" : "Servicios no admitidos aún en Franz 5",
11 "import.skip.label" : "Quiero agregar servicios manualmente", 22 "import.skip.label" : "Quiero agregar servicios manualmente",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "Editar {name}", 107 "service.errorHandler.editAction" : "Editar {name}",
97 "service.errorHandler.headline" : "¡Oh, no!", 108 "service.errorHandler.headline" : "¡Oh, no!",
98 "service.errorHandler.message" : "Error", 109 "service.errorHandler.message" : "Error",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} ha fallado la carga",
100 "services.getStarted" : "Primeros pasos", 111 "services.getStarted" : "Primeros pasos",
101 "services.welcome" : "Bienvenido a Franz", 112 "services.welcome" : "Bienvenido a Franz",
102 "settings.account.account.editButton" : "Editar cuenta", 113 "settings.account.account.editButton" : "Editar cuenta",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Mostrar señal de notificación para todos los mensajes nuevos", 203 "settings.service.form.indirectMessages" : "Mostrar señal de notificación para todos los mensajes nuevos",
193 "settings.service.form.isMutedInfo" : "Cuando estén desactivados, todos los sonidos de notificación y la reproducción de audio serán silenciados", 204 "settings.service.form.isMutedInfo" : "Cuando estén desactivados, todos los sonidos de notificación y la reproducción de audio serán silenciados",
194 "settings.service.form.name" : "Nombre", 205 "settings.service.form.name" : "Nombre",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "Ajustes Proxy HTTP\/HTTPS",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "Proxy Host\/IP",
197 "settings.service.form.proxy.info" : "Las configuraciones de Proxy no se sincronizarán con los servidores de Franz.", 208 "settings.service.form.proxy.info" : "Las configuraciones de Proxy no se sincronizarán con los servidores de Franz.",
198 "settings.service.form.proxy.isEnabled" : "Use Proxy", 209 "settings.service.form.proxy.isEnabled" : "Use Proxy",
199 "settings.service.form.proxy.password" : "Contraseña (opcional)", 210 "settings.service.form.proxy.password" : "Contraseña (opcional)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Puerto",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Por favor reinicie Franz despues de modificar los ajustes proxy.",
202 "settings.service.form.proxy.user" : "Usuario (opcional)", 213 "settings.service.form.proxy.user" : "Usuario (opcional)",
203 "settings.service.form.saveButton" : "Guardar servicio", 214 "settings.service.form.saveButton" : "Guardar servicio",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Marcar faltas de ortografía",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Utilizar estándar del sistema ({default})",
206 "settings.service.form.tabHosted" : "Alojado", 217 "settings.service.form.tabHosted" : "Alojado",
207 "settings.service.form.tabOnPremise" : "Auto alojado â­ï¸", 218 "settings.service.form.tabOnPremise" : "Auto alojado â­ï¸",
208 "settings.service.form.team" : "Equipo", 219 "settings.service.form.team" : "Equipo",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index a83767f1e..8af875a3d 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Recharger", 2 "app.errorHandler.action" : "Recharger",
3 "app.errorHandler.headline" : "Une erreur s'est produite.", 3 "app.errorHandler.headline" : "Une erreur s'est produite",
4 "feature.delayApp.action" : "Obtenez une licence de Supporter Franz", 4 "feature.delayApp.action" : "Obtenez une licence de Supporter Franz",
5 "feature.delayApp.headline" : "Veuillez acheter une licence de Supporter Franz pour sauter le temps d'attente", 5 "feature.delayApp.headline" : "Veuillez acheter une licence de Supporter Franz pour sauter le temps d'attente",
6 "feature.delayApp.text" : "Franz continuera dans {seconds} secondes.", 6 "feature.delayApp.text" : "Franz reprendra dans {seconds} secondes.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz", 14 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz",
8 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.", 15 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.",
16 "global.spellchecker.useDefault" : "Par défaut ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Langue de la vérification orthographique",
9 "import.headline" : "Importez vos services depuis la version 4 de Franz.", 20 "import.headline" : "Importez vos services depuis la version 4 de Franz.",
10 "import.notSupportedHeadline" : "Ces services ne sont pas encore supportés par Franz 5", 21 "import.notSupportedHeadline" : "Ces services ne sont pas encore supportés par Franz 5",
11 "import.skip.label" : "Je veux ajouter des services manuellement", 22 "import.skip.label" : "Je veux ajouter des services manuellement",
@@ -198,10 +209,10 @@
198 "settings.service.form.proxy.isEnabled" : "Utiliser un proxy", 209 "settings.service.form.proxy.isEnabled" : "Utiliser un proxy",
199 "settings.service.form.proxy.password" : "Mot de passe (facultatif)", 210 "settings.service.form.proxy.password" : "Mot de passe (facultatif)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Port",
201 "settings.service.form.proxy.restartInfo" : "Veuillez redémarrer Franz après avoir modifier les paramètres proxy.", 212 "settings.service.form.proxy.restartInfo" : "Veuillez redémarrer Franz après avoir modifié les paramètres proxy.",
202 "settings.service.form.proxy.user" : "Utilisateur (facultatif)", 213 "settings.service.form.proxy.user" : "Utilisateur (facultatif)",
203 "settings.service.form.saveButton" : "Enregistrer le service", 214 "settings.service.form.saveButton" : "Enregistrer le service",
204 "settings.service.form.spellcheckerLanguage" : "Veuillez vérifier l'épellation Langage", 215 "settings.service.form.spellcheckerLanguage" : "Langue de vérification d'orthographe",
205 "settings.service.form.spellcheckerLanguage.default" : "Par défaut ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Par défaut ({default})",
206 "settings.service.form.tabHosted" : "Hébergé", 217 "settings.service.form.tabHosted" : "Hébergé",
207 "settings.service.form.tabOnPremise" : "Auto-hébergé â­ï¸", 218 "settings.service.form.tabOnPremise" : "Auto-hébergé â­ï¸",
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index 0d3d8623e..2b3d39b73 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -4,8 +4,19 @@
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Get a Franz Supporter License",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Ní féidir nascadh le seirbhísí Franz ar líne", 14 "global.api.unhealthy" : "Ní féidir nascadh le seirbhísí Franz ar líne",
8 "global.notConnectedToTheInternet" : "Níl tú nasctha leis an Idirlíon.", 15 "global.notConnectedToTheInternet" : "Níl tú nasctha leis an Idirlíon.",
16 "global.spellchecker.useDefault" : "Use System Default ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Spell checking language",
9 "import.headline" : "Iompórtáil do sheirbhísí Franz 4", 20 "import.headline" : "Iompórtáil do sheirbhísí Franz 4",
10 "import.notSupportedHeadline" : "Níl na seirbhísí seo taca ag Franz 5 go fóill", 21 "import.notSupportedHeadline" : "Níl na seirbhísí seo taca ag Franz 5 go fóill",
11 "import.skip.label" : "Ba mhaith liom seirbhísí a chur de láimh", 22 "import.skip.label" : "Ba mhaith liom seirbhísí a chur de láimh",
diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json
index 2ff69755d..dc1d579fa 100644
--- a/src/i18n/locales/hr.json
+++ b/src/i18n/locales/hr.json
@@ -4,8 +4,19 @@
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Get a Franz Supporter License",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Nije se moguće povezati na Francove on-line servise. ", 14 "global.api.unhealthy" : "Nije se moguće povezati na Francove on-line servise. ",
8 "global.notConnectedToTheInternet" : "Sada ste povezani s internetom. ", 15 "global.notConnectedToTheInternet" : "Sada ste povezani s internetom. ",
16 "global.spellchecker.useDefault" : "Use System Default ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Spell checking language",
9 "import.headline" : "Uvezite svoje Franc 4 servise. ", 20 "import.headline" : "Uvezite svoje Franc 4 servise. ",
10 "import.notSupportedHeadline" : "Franc 5 trenutno ne podržava taj servis", 21 "import.notSupportedHeadline" : "Franc 5 trenutno ne podržava taj servis",
11 "import.skip.label" : "Želim ruÄno dodati ove usluge", 22 "import.skip.label" : "Želim ruÄno dodati ove usluge",
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index 0b396cf3b..ddaffeebb 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Újratöltés", 2 "app.errorHandler.action" : "Újratöltés",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Valami nem jött össze",
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Szerezz egy Franz Támogatói Liszencet",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Kérjük vásárolj egy Franc Támogatói Liszencet a várakozás átugrásához",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "A Franz továbblép {seconds} másodperc múlva.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Nem lehet csatlakozni a Franz online szolgáltatáshoz", 14 "global.api.unhealthy" : "Nem lehet csatlakozni a Franz online szolgáltatáshoz",
8 "global.notConnectedToTheInternet" : "Nincs hálózati kapcsolat.", 15 "global.notConnectedToTheInternet" : "Nincs hálózati kapcsolat.",
16 "global.spellchecker.useDefault" : "Rendszer alapbeállítás használata ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Helyesírás-ellenőrző nyelve",
9 "import.headline" : "Importáld szolgáltatásaidat a Franz 4-ből", 20 "import.headline" : "Importáld szolgáltatásaidat a Franz 4-ből",
10 "import.notSupportedHeadline" : "Még nem támogatott szolgáltatások a Franz 5-ben", 21 "import.notSupportedHeadline" : "Még nem támogatott szolgáltatások a Franz 5-ben",
11 "import.skip.label" : "Manuálisan szeretném hozzáadni a szolgáltatásokat", 22 "import.skip.label" : "Manuálisan szeretném hozzáadni a szolgáltatásokat",
@@ -51,7 +62,7 @@
51 "menu.edit.startSpeaking" : "Beszélgetés kezdeményezése", 62 "menu.edit.startSpeaking" : "Beszélgetés kezdeményezése",
52 "menu.edit.stopSpeaking" : "Beszéd vége", 63 "menu.edit.stopSpeaking" : "Beszéd vége",
53 "menu.edit.undo" : "Visszavonás", 64 "menu.edit.undo" : "Visszavonás",
54 "menu.file" : "fájl", 65 "menu.file" : "Fájl",
55 "menu.help" : "Súgó", 66 "menu.help" : "Súgó",
56 "menu.help.changelog" : "Változások listája", 67 "menu.help.changelog" : "Változások listája",
57 "menu.help.learnMore" : "Tudjon meg többet", 68 "menu.help.learnMore" : "Tudjon meg többet",
@@ -59,16 +70,16 @@
59 "menu.help.support" : "Támogatás", 70 "menu.help.support" : "Támogatás",
60 "menu.help.tos" : "Felhasználói feltételek", 71 "menu.help.tos" : "Felhasználói feltételek",
61 "menu.services" : "Szolgáltatások", 72 "menu.services" : "Szolgáltatások",
62 "menu.services.addNewService" : "Új kiszolgáló hozzáadása", 73 "menu.services.addNewService" : "Új szolgáltatás hozzáadása...",
63 "menu.view" : "Nézet", 74 "menu.view" : "Nézet",
64 "menu.view.enterFullScreen" : "Kilépés a teljes képernyős módból", 75 "menu.view.enterFullScreen" : "Kilépés a teljes képernyős módból",
65 "menu.view.exitFullScreen" : "Kilépés a teljes képernyős módból", 76 "menu.view.exitFullScreen" : "Kilépés a teljes képernyős módból",
66 "menu.view.reloadFranz" : "Franz újrainditása", 77 "menu.view.reloadFranz" : "Franz újrainditása",
67 "menu.view.reloadService" : "Kiszolgáló újraindítása", 78 "menu.view.reloadService" : "Szolgáltatás újraindítása",
68 "menu.view.resetZoom" : "Tényleges méret", 79 "menu.view.resetZoom" : "Tényleges méret",
69 "menu.view.toggleDevTools" : "fejlesztői eszközök bekapcsolása", 80 "menu.view.toggleDevTools" : "Fejlesztői eszközök ki\/bekapcsolása",
70 "menu.view.toggleFullScreen" : "Váltás Teljes képernyős módra", 81 "menu.view.toggleFullScreen" : "Teljes képernyős mód ki\/bekapcsolása",
71 "menu.view.toggleServiceDevTools" : "Kiszolgáló Fejlesztői Eszközök Bekapcsolása", 82 "menu.view.toggleServiceDevTools" : "Szolgáltatás Fejlesztői Eszközök ki\/bekapcsolása",
72 "menu.view.zoomIn" : "Nagyítás", 83 "menu.view.zoomIn" : "Nagyítás",
73 "menu.view.zoomOut" : "Kicsinyítés", 84 "menu.view.zoomOut" : "Kicsinyítés",
74 "menu.window" : "Ablak", 85 "menu.window" : "Ablak",
@@ -81,13 +92,13 @@
81 "password.noUser" : "Nem található felhasználó a megadott email címmel", 92 "password.noUser" : "Nem található felhasználó a megadott email címmel",
82 "password.submit.label" : "Küldés", 93 "password.submit.label" : "Küldés",
83 "password.successInfo" : "Ellenőrizd az email fiókodat", 94 "password.successInfo" : "Ellenőrizd az email fiókodat",
84 "premiumFeature.button.upgradeAccount" : "Upgrade account", 95 "premiumFeature.button.upgradeAccount" : "Fiók frissítése",
85 "pricing.headline" : "Támogasd a Franz-ot", 96 "pricing.headline" : "Támogasd a Franz-ot",
86 "pricing.link.skipPayment" : "Nem szeretném támogatni a Franz fejlesztését.", 97 "pricing.link.skipPayment" : "Nem szeretném támogatni a Franz fejlesztését.",
87 "pricing.submit.label" : "Támogatni szeretném a Franz fejlesztését.", 98 "pricing.submit.label" : "Támogatni szeretném a Franz fejlesztését",
88 "pricing.support.label" : "Válaszd ki a támogatás módját", 99 "pricing.support.label" : "Válaszd ki a támogatás módját",
89 "service.crashHandler.action" : "{name} újratöltése", 100 "service.crashHandler.action" : "{name} újratöltése",
90 "service.crashHandler.autoReload" : "Megpróbáljuk automatikusan helyreállítani {name}-t {seconds} mp-en belül", 101 "service.crashHandler.autoReload" : "{name} automatikusan helyreállítása {seconds} másodpercen belül",
91 "service.crashHandler.headline" : "Jajj ne!", 102 "service.crashHandler.headline" : "Jajj ne!",
92 "service.crashHandler.text" : "{name} hibát okozott.", 103 "service.crashHandler.text" : "{name} hibát okozott.",
93 "service.disabledHandler.action" : "{name} engedélyezése", 104 "service.disabledHandler.action" : "{name} engedélyezése",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "{name} szerkesztése", 107 "service.errorHandler.editAction" : "{name} szerkesztése",
97 "service.errorHandler.headline" : "Jajj ne!", 108 "service.errorHandler.headline" : "Jajj ne!",
98 "service.errorHandler.message" : "Hiba", 109 "service.errorHandler.message" : "Hiba",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} nem tudott betöltődni.",
100 "services.getStarted" : "Kezdj hozzá", 111 "services.getStarted" : "Kezdj hozzá",
101 "services.welcome" : "Üdvözöl a Franz", 112 "services.welcome" : "Üdvözöl a Franz",
102 "settings.account.account.editButton" : "Fiók szerkesztése", 113 "settings.account.account.editButton" : "Fiók szerkesztése",
@@ -108,7 +119,7 @@
108 "settings.account.deleteInfo" : "Ha még nem szeretnéd fenntartani a Franz-fiókodat, akkor itt törölheted minden hozzá kapcsolódó adattal együtt.", 119 "settings.account.deleteInfo" : "Ha még nem szeretnéd fenntartani a Franz-fiókodat, akkor itt törölheted minden hozzá kapcsolódó adattal együtt.",
109 "settings.account.headline" : "Fiók", 120 "settings.account.headline" : "Fiók",
110 "settings.account.headlineAccount" : "Fiókinformációk", 121 "settings.account.headlineAccount" : "Fiókinformációk",
111 "settings.account.headlineDangerZone" : "Veszélyes terület, óvatosan!", 122 "settings.account.headlineDangerZone" : "Veszélyes terület",
112 "settings.account.headlineInvoices" : "Számlák", 123 "settings.account.headlineInvoices" : "Számlák",
113 "settings.account.headlinePassword" : "Jelszócsere", 124 "settings.account.headlinePassword" : "Jelszócsere",
114 "settings.account.headlineProfile" : "Profil frissítése", 125 "settings.account.headlineProfile" : "Profil frissítése",
@@ -122,13 +133,13 @@
122 "settings.app.buttonClearAllCache" : "Gyorsítótár törlése", 133 "settings.app.buttonClearAllCache" : "Gyorsítótár törlése",
123 "settings.app.buttonInstallUpdate" : "Újraindítás és frissítések telepítése", 134 "settings.app.buttonInstallUpdate" : "Újraindítás és frissítések telepítése",
124 "settings.app.buttonSearchForUpdate" : "Frissítések keresése", 135 "settings.app.buttonSearchForUpdate" : "Frissítések keresése",
125 "settings.app.cacheInfo" : "A Franz gyorsítótár jelenleg {space} lemezterületet használ.", 136 "settings.app.cacheInfo" : "A Franz gyorsítótár jelenleg {size} lemezterületet használ.",
126 "settings.app.currentVersion" : "Aktuális verzió:", 137 "settings.app.currentVersion" : "Aktuális verzió:",
127 "settings.app.form.autoLaunchInBackground" : "Megnyitás háttérben", 138 "settings.app.form.autoLaunchInBackground" : "Megnyitás háttérben",
128 "settings.app.form.autoLaunchOnStart" : "Franz betöltése indításkor", 139 "settings.app.form.autoLaunchOnStart" : "Franz betöltése indításkor",
129 "settings.app.form.beta" : "Béta verziók keresése", 140 "settings.app.form.beta" : "Béta verziók keresése",
130 "settings.app.form.darkMode" : "Join the Dark Side", 141 "settings.app.form.darkMode" : "Csatlakozz a Sötét Oldalhoz",
131 "settings.app.form.enableGPUAcceleration" : "hardveres gyorsítás engedélyezése", 142 "settings.app.form.enableGPUAcceleration" : "Hardveres gyorsítás engedélyezése",
132 "settings.app.form.enableMenuBar" : "Franz megjelenítése a menüsorban", 143 "settings.app.form.enableMenuBar" : "Franz megjelenítése a menüsorban",
133 "settings.app.form.enableSpellchecking" : "Helyesírás-ellenőrzés engedélyezése", 144 "settings.app.form.enableSpellchecking" : "Helyesírás-ellenőrzés engedélyezése",
134 "settings.app.form.enableSystemTray" : "Franz mutatása a tálcán", 145 "settings.app.form.enableSystemTray" : "Franz mutatása a tálcán",
@@ -137,8 +148,8 @@
137 "settings.app.form.minimizeToSystemTray" : "Franz kicsinyítése a tálcára", 148 "settings.app.form.minimizeToSystemTray" : "Franz kicsinyítése a tálcára",
138 "settings.app.form.runInBackground" : "Franz fusson a háttérben az ablak bezárásakor", 149 "settings.app.form.runInBackground" : "Franz fusson a háttérben az ablak bezárásakor",
139 "settings.app.form.showDisabledServices" : "Letiltott szolgáltatások megjelenítése", 150 "settings.app.form.showDisabledServices" : "Letiltott szolgáltatások megjelenítése",
140 "settings.app.form.showMessagesBadgesWhenMuted" : "Mutass az 'olvasatlan üzenet' jelzést amikor az értesítések le vannak tiltva.", 151 "settings.app.form.showMessagesBadgesWhenMuted" : "Mutassa az 'olvasatlan üzenet' jelzést, amikor az értesítések le vannak tiltva",
141 "settings.app.form.spellcheckerLanguage" : "Spell checking language", 152 "settings.app.form.spellcheckerLanguage" : "Helyesírás-ellenőrző nyelve",
142 "settings.app.headline" : "Beállítások", 153 "settings.app.headline" : "Beállítások",
143 "settings.app.headlineAdvanced" : "Haladó", 154 "settings.app.headlineAdvanced" : "Haladó",
144 "settings.app.headlineAppearance" : "Megjelenés", 155 "settings.app.headlineAppearance" : "Megjelenés",
@@ -151,7 +162,7 @@
151 "settings.app.updateStatusAvailable" : "Frissítés elérhető, letöltés folyamatban...", 162 "settings.app.updateStatusAvailable" : "Frissítés elérhető, letöltés folyamatban...",
152 "settings.app.updateStatusSearching" : "Frissítéseket keres", 163 "settings.app.updateStatusSearching" : "Frissítéseket keres",
153 "settings.app.updateStatusUpToDate" : "A Franz legfrissebb verzióját használod", 164 "settings.app.updateStatusUpToDate" : "A Franz legfrissebb verzióját használod",
154 "settings.invite.headline" : "Barát meghívása", 165 "settings.invite.headline" : "Barátok meghívása",
155 "settings.navigation.account" : "Fiók", 166 "settings.navigation.account" : "Fiók",
156 "settings.navigation.availableServices" : "Elérhető szolgáltatások", 167 "settings.navigation.availableServices" : "Elérhető szolgáltatások",
157 "settings.navigation.inviteFriends" : "Barát meghívása", 168 "settings.navigation.inviteFriends" : "Barát meghívása",
@@ -164,7 +175,7 @@
164 "settings.recipes.missingService" : "Hiányzik egy szolgáltatás?", 175 "settings.recipes.missingService" : "Hiányzik egy szolgáltatás?",
165 "settings.recipes.mostPopular" : "Legnépszerűbb", 176 "settings.recipes.mostPopular" : "Legnépszerűbb",
166 "settings.recipes.nothingFound" : "Sajnáljuk, nincs egyezés a szolgáltatások között a keresett kifejezésre.", 177 "settings.recipes.nothingFound" : "Sajnáljuk, nincs egyezés a szolgáltatások között a keresett kifejezésre.",
167 "settings.recipes.servicesSuccessfulAddedInfo" : "Szolgáltatás sikeresen hozzáadva.", 178 "settings.recipes.servicesSuccessfulAddedInfo" : "Szolgáltatás sikeresen hozzáadva",
168 "settings.searchService" : "Szolgáltatások keresése", 179 "settings.searchService" : "Szolgáltatások keresése",
169 "settings.service.error.goBack" : "Vissza a szolgáltatásokhoz", 180 "settings.service.error.goBack" : "Vissza a szolgáltatásokhoz",
170 "settings.service.error.headline" : "Hiba", 181 "settings.service.error.headline" : "Hiba",
@@ -174,12 +185,12 @@
174 "settings.service.form.customUrl" : "Egyéni szerver", 185 "settings.service.form.customUrl" : "Egyéni szerver",
175 "settings.service.form.customUrlPremiumInfo" : "Egyénileg üzemeltetett szolgáltatások hozzáadásához Franz Prémium Támogató Fiók szükséges.", 186 "settings.service.form.customUrlPremiumInfo" : "Egyénileg üzemeltetett szolgáltatások hozzáadásához Franz Prémium Támogató Fiók szükséges.",
176 "settings.service.form.customUrlUpgradeAccount" : "Frissítsd fiókodat", 187 "settings.service.form.customUrlUpgradeAccount" : "Frissítsd fiókodat",
177 "settings.service.form.customUrlValidationError" : "Nem sikerült hitelesíteni az egyéni {name} szervert.", 188 "settings.service.form.customUrlValidationError" : "Nem sikerült érvényesíteni az egyéni {name} kiszolgálót.",
178 "settings.service.form.deleteButton" : "Szolgáltatás törlése", 189 "settings.service.form.deleteButton" : "Szolgáltatás törlése",
179 "settings.service.form.editServiceHeadline" : "{name} szerkesztése", 190 "settings.service.form.editServiceHeadline" : "{name} szerkesztése",
180 "settings.service.form.enableAudio" : "Hang engedélyezése", 191 "settings.service.form.enableAudio" : "Hang engedélyezése",
181 "settings.service.form.enableBadge" : "Mutasd az olvasatlan jelzéseket", 192 "settings.service.form.enableBadge" : "Mutasd az olvasatlan jelzéseket",
182 "settings.service.form.enableDarkMode" : "Enable Dark Mode", 193 "settings.service.form.enableDarkMode" : "Sötét mód engedélyezése",
183 "settings.service.form.enableNotification" : "Értesítések engedélyezése", 194 "settings.service.form.enableNotification" : "Értesítések engedélyezése",
184 "settings.service.form.enableService" : "Szolgáltatás engedélyezése", 195 "settings.service.form.enableService" : "Szolgáltatás engedélyezése",
185 "settings.service.form.headlineBadges" : "Olvasatlan üzenet jelzések", 196 "settings.service.form.headlineBadges" : "Olvasatlan üzenet jelzések",
@@ -188,31 +199,31 @@
188 "settings.service.form.icon" : "Egyedi ikon", 199 "settings.service.form.icon" : "Egyedi ikon",
189 "settings.service.form.iconDelete" : "Törlés", 200 "settings.service.form.iconDelete" : "Törlés",
190 "settings.service.form.iconUpload" : "Húzd ide a képet, vagy kattints ide", 201 "settings.service.form.iconUpload" : "Húzd ide a képet, vagy kattints ide",
191 "settings.service.form.indirectMessageInfo" : "Értesítést kapsz minden üzenetről a csatornában, nem csak @felhasználónév, @csatorna @here és egyéb említések esetén", 202 "settings.service.form.indirectMessageInfo" : "Értesítést kapsz minden üzenetről a csatornában, nem csak @felhasználónév, @csatorna, @here és egyéb említések esetén",
192 "settings.service.form.indirectMessages" : "Üzenet kitűző megjelenítése minden üzenethez", 203 "settings.service.form.indirectMessages" : "Üzenet kitűző megjelenítése minden üzenethez",
193 "settings.service.form.isMutedInfo" : "Ha kikapcsolod, minden értesítési és lejátszott hang némításra kerül.", 204 "settings.service.form.isMutedInfo" : "Ha kikapcsolod, minden értesítési és lejátszott hang némításra kerül",
194 "settings.service.form.name" : "Név", 205 "settings.service.form.name" : "Név",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy beállítások",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "Proxy Host\/IP",
197 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.", 208 "settings.service.form.proxy.info" : "Proxy beállítások nem szinkronizálódnak a Franz kiszolgálókkal.",
198 "settings.service.form.proxy.isEnabled" : "Use Proxy", 209 "settings.service.form.proxy.isEnabled" : "Proxy használata",
199 "settings.service.form.proxy.password" : "Password (optional)", 210 "settings.service.form.proxy.password" : "Jelszó (opcionális)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Port",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Kérjük indítsd újra a Franz-ot a proxy beállítások megváltoztatása után.",
202 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "Felhasználó (opcionális)",
203 "settings.service.form.saveButton" : "Szolgáltatás mentése", 214 "settings.service.form.saveButton" : "Szolgáltatás mentése",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Helyesírás-ellenőrző nyelve",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Rendszer alapbeállítás használata ({default})",
206 "settings.service.form.tabHosted" : "Ãœzemeltetett", 217 "settings.service.form.tabHosted" : "Ãœzemeltetett",
207 "settings.service.form.tabOnPremise" : "Egyénileg üzemeltetett", 218 "settings.service.form.tabOnPremise" : "Egyénileg üzemeltetett",
208 "settings.service.form.team" : "Csapat", 219 "settings.service.form.team" : "Csapat",
209 "settings.service.form.useHostedService" : "A távoli {name} szolgáltatás használata", 220 "settings.service.form.useHostedService" : "A távoli {name} szolgáltatás használata.",
210 "settings.service.form.yourServices" : "Szolgáltatásaid", 221 "settings.service.form.yourServices" : "Szolgáltatásaid",
211 "settings.services.deletedInfo" : "A szolgáltatás törlésre került", 222 "settings.services.deletedInfo" : "A szolgáltatás törlésre került",
212 "settings.services.discoverServices" : "Szolgáltatások felfedezése", 223 "settings.services.discoverServices" : "Szolgáltatások felfedezése",
213 "settings.services.headline" : "Szolgáltatásaid", 224 "settings.services.headline" : "Szolgáltatásaid",
214 "settings.services.noServicesAdded" : "Még nem adtál hozzá egyetlen szolgáltatást sem eddig.", 225 "settings.services.noServicesAdded" : "Még nem adtál hozzá egyetlen szolgáltatást sem eddig.",
215 "settings.services.tooltip.isDisabled" : "Ez a szolgáltatás le van tiltva.", 226 "settings.services.tooltip.isDisabled" : "A szolgáltatás le van tiltva",
216 "settings.services.tooltip.isMuted" : "Minden hang lenémítva", 227 "settings.services.tooltip.isMuted" : "Minden hang lenémítva",
217 "settings.services.tooltip.notificationsDisabled" : "Értesítések letiltva", 228 "settings.services.tooltip.notificationsDisabled" : "Értesítések letiltva",
218 "settings.services.updatedInfo" : "A módosításokat elmentettük", 229 "settings.services.updatedInfo" : "A módosításokat elmentettük",
@@ -243,13 +254,13 @@
243 "signup.submit.label" : "Fiók létrehozása", 254 "signup.submit.label" : "Fiók létrehozása",
244 "subscription.euTaxInfo" : "EU állampolgárok: helyi vásárlás esetén adók kerülhetnek felszámolásra", 255 "subscription.euTaxInfo" : "EU állampolgárok: helyi vásárlás esetén adók kerülhetnek felszámolásra",
245 "subscription.features.ads" : "Hirdetésmentes, mindig!", 256 "subscription.features.ads" : "Hirdetésmentes, mindig!",
246 "subscription.features.comingSoon" : "Hamarosan!", 257 "subscription.features.comingSoon" : "hamarosan",
247 "subscription.features.encryptedSync" : "Titkosított munkamenet szinkronizálás", 258 "subscription.features.encryptedSync" : "Titkosított munkamenet szinkronizálás",
248 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 259 "subscription.features.noInterruptions" : "Nincs több app késlekedés és liszencfrissítési piszkálás",
249 "subscription.features.onpremise" : "Helyi\/üzemeltetett szolgáltatások használata, pl. HipChat", 260 "subscription.features.onpremise" : "Helyi\/üzemeltetett szolgáltatások használata, pl. HipChat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "Saját kiszolgálós szolgáltatások hozzáadása, pl.: Mattermost",
251 "subscription.features.proxy" : "Proxy support for services", 262 "subscription.features.proxy" : "Proxy támogatás a szolgáltatásokhoz",
252 "subscription.features.spellchecker" : "Support for spellchecker", 263 "subscription.features.spellchecker" : "Támogatás a Helyesírás-ellenőrzőhöz",
253 "subscription.includedFeatures" : "Az előfizetett Franz Prémium Támogató Fiók tartalmazza", 264 "subscription.includedFeatures" : "Az előfizetett Franz Prémium Támogató Fiók tartalmazza",
254 "subscription.paymentSessionError" : "Nem sikerült a fizetési felületet betölteni", 265 "subscription.paymentSessionError" : "Nem sikerült a fizetési felületet betölteni",
255 "subscription.submit.label" : "Szeretném támogatni a Franz fejlesztését", 266 "subscription.submit.label" : "Szeretném támogatni a Franz fejlesztését",
@@ -268,8 +279,8 @@
268 "tabs.item.enableService" : "Szolgáltatás engedélyezése", 279 "tabs.item.enableService" : "Szolgáltatás engedélyezése",
269 "tabs.item.reload" : "Újratöltés", 280 "tabs.item.reload" : "Újratöltés",
270 "validation.email" : "{field} nem érvényes", 281 "validation.email" : "{field} nem érvényes",
271 "validation.minLength" : "{field} legalább {length} karakter hosszúnak kell lennie", 282 "validation.minLength" : "{field} mezőnek legalább {length} karakter hosszúnak kell lennie",
272 "validation.required" : "{field} Kitöltése kötelező", 283 "validation.required" : "{field} kitöltése kötelező",
273 "validation.url" : "{field} nem érvényes URL", 284 "validation.url" : "{field} nem érvényes URL",
274 "welcome.loginButton" : "Jelentkezz be a fiókodba", 285 "welcome.loginButton" : "Jelentkezz be a fiókodba",
275 "welcome.signupButton" : "Új fiók létrehozása", 286 "welcome.signupButton" : "Új fiók létrehozása",
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index 11596d142..6abbf064b 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Muat Ulang", 2 "app.errorHandler.action" : "Muat Ulang",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Terjadi kesalahan",
4 "feature.delayApp.action" : "Dapatkan Franz Supporter License", 4 "feature.delayApp.action" : "Dapatkan Franz Supporter License",
5 "feature.delayApp.headline" : "Beli Franz Supporter License agar tidak perlu menunggu", 5 "feature.delayApp.headline" : "Beli Franz Supporter License agar tidak perlu menunggu",
6 "feature.delayApp.text" : "Franz akan melanjutkan dalam {seconds} detik.", 6 "feature.delayApp.text" : "Franz akan melanjutkan dalam {seconds} detik.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Tidak dapat tersambung ke layanan Franz", 14 "global.api.unhealthy" : "Tidak dapat tersambung ke layanan Franz",
8 "global.notConnectedToTheInternet" : "Anda tidak tersambung ke internet.", 15 "global.notConnectedToTheInternet" : "Anda tidak tersambung ke internet.",
16 "global.spellchecker.useDefault" : "Gunakan Bawaan Sistem ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Periksa ejaan",
9 "import.headline" : "Impor layanan Franz 4 Anda", 20 "import.headline" : "Impor layanan Franz 4 Anda",
10 "import.notSupportedHeadline" : "Layanan belum didukung di Franz 5", 21 "import.notSupportedHeadline" : "Layanan belum didukung di Franz 5",
11 "import.skip.label" : "Saya ingin menambahkan layanan secara manual", 22 "import.skip.label" : "Saya ingin menambahkan layanan secara manual",
@@ -92,11 +103,11 @@
92 "service.crashHandler.text" : "{name} menyebabkan kesalahan.", 103 "service.crashHandler.text" : "{name} menyebabkan kesalahan.",
93 "service.disabledHandler.action" : "Aktifkan {name}", 104 "service.disabledHandler.action" : "Aktifkan {name}",
94 "service.disabledHandler.headline" : "{name} dinonaktifkan", 105 "service.disabledHandler.headline" : "{name} dinonaktifkan",
95 "service.errorHandler.action" : "Muat Ulang {name}", 106 "service.errorHandler.action" : "Muat ulang {name}",
96 "service.errorHandler.editAction" : "Edit {nama}", 107 "service.errorHandler.editAction" : "Edit {nama}",
97 "service.errorHandler.headline" : "Ya Ampun!", 108 "service.errorHandler.headline" : "Oh tidak!",
98 "service.errorHandler.message" : "Kesalahan", 109 "service.errorHandler.message" : "Kesalahan",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} gagal dimuat",
100 "services.getStarted" : "Ayo mulai!", 111 "services.getStarted" : "Ayo mulai!",
101 "services.welcome" : "Selamat datang di Franz", 112 "services.welcome" : "Selamat datang di Franz",
102 "settings.account.account.editButton" : "Edit akun", 113 "settings.account.account.editButton" : "Edit akun",
@@ -167,7 +178,7 @@
167 "settings.recipes.servicesSuccessfulAddedInfo" : "Layanan berhasil ditambahkan", 178 "settings.recipes.servicesSuccessfulAddedInfo" : "Layanan berhasil ditambahkan",
168 "settings.searchService" : "Cari layanan", 179 "settings.searchService" : "Cari layanan",
169 "settings.service.error.goBack" : "Kembali ke layanan", 180 "settings.service.error.goBack" : "Kembali ke layanan",
170 "settings.service.error.headline" : "Kesalahan", 181 "settings.service.error.headline" : "Terjadi kesalahan",
171 "settings.service.error.message" : "Tidak dapat memuat konfigurasi layanan.", 182 "settings.service.error.message" : "Tidak dapat memuat konfigurasi layanan.",
172 "settings.service.form.addServiceHeadline" : "Tambahkan {name}", 183 "settings.service.form.addServiceHeadline" : "Tambahkan {name}",
173 "settings.service.form.availableServices" : "Layanan tersedia", 184 "settings.service.form.availableServices" : "Layanan tersedia",
@@ -176,7 +187,7 @@
176 "settings.service.form.customUrlUpgradeAccount" : "Tingkatkan akun Anda", 187 "settings.service.form.customUrlUpgradeAccount" : "Tingkatkan akun Anda",
177 "settings.service.form.customUrlValidationError" : "Gagal memvalidasi server {nama} khusus.", 188 "settings.service.form.customUrlValidationError" : "Gagal memvalidasi server {nama} khusus.",
178 "settings.service.form.deleteButton" : "Hapus layanan", 189 "settings.service.form.deleteButton" : "Hapus layanan",
179 "settings.service.form.editServiceHeadline" : "Edit {nama}", 190 "settings.service.form.editServiceHeadline" : "Edit {name}",
180 "settings.service.form.enableAudio" : "Aktifkan audio", 191 "settings.service.form.enableAudio" : "Aktifkan audio",
181 "settings.service.form.enableBadge" : "Tampilkan lencana pesan belum dibaca", 192 "settings.service.form.enableBadge" : "Tampilkan lencana pesan belum dibaca",
182 "settings.service.form.enableDarkMode" : "Aktifkan Mode Gelap", 193 "settings.service.form.enableDarkMode" : "Aktifkan Mode Gelap",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Tampilkan lencana pesan untuk semua pesan baru", 203 "settings.service.form.indirectMessages" : "Tampilkan lencana pesan untuk semua pesan baru",
193 "settings.service.form.isMutedInfo" : "Saat dinonaktifkan, semua suara pemberitahuan dan pemutaran audio akan dibisukan", 204 "settings.service.form.isMutedInfo" : "Saat dinonaktifkan, semua suara pemberitahuan dan pemutaran audio akan dibisukan",
194 "settings.service.form.name" : "Nama", 205 "settings.service.form.name" : "Nama",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "Pengaturan Proxy HTTP\/HTTPS",
196 "settings.service.form.proxy.host" : "Host\/IP Proksi", 207 "settings.service.form.proxy.host" : "Host\/IP Proksi",
197 "settings.service.form.proxy.info" : "Pengaturan proksi tidak akan disinkronkan dengan server Franz.", 208 "settings.service.form.proxy.info" : "Pengaturan proksi tidak akan disinkronkan dengan server Franz.",
198 "settings.service.form.proxy.isEnabled" : "Gunakan Proksi", 209 "settings.service.form.proxy.isEnabled" : "Gunakan Proksi",
199 "settings.service.form.proxy.password" : "Sandi (opsional)", 210 "settings.service.form.proxy.password" : "Sandi (opsional)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Port",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Silahkan mulai ulang Franz setelah mengubah Setelan proxy",
202 "settings.service.form.proxy.user" : "Pengguna (opsional)", 213 "settings.service.form.proxy.user" : "Pengguna (opsional)",
203 "settings.service.form.saveButton" : "Simpan layanan", 214 "settings.service.form.saveButton" : "Simpan layanan",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Periksa ejaan Bahasa",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Gunakan Bawaan Sistem ({default})",
206 "settings.service.form.tabHosted" : "Hosted", 217 "settings.service.form.tabHosted" : "Hosted",
207 "settings.service.form.tabOnPremise" : "Hosted mandiri", 218 "settings.service.form.tabOnPremise" : "Hosted mandiri",
208 "settings.service.form.team" : "Tim", 219 "settings.service.form.team" : "Tim",
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index 47cbd8f1e..b63b30a90 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Ricarica", 2 "app.errorHandler.action" : "Ricarica",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Qualcosa è andato storto",
4 "feature.delayApp.action" : "Ricevi una Licenza Supporter di Franz", 4 "feature.delayApp.action" : "Ricevi una Licenza Supporter di Franz",
5 "feature.delayApp.headline" : "Per favore, compra una Licenza Supporter di Franz per saltare l'attesa", 5 "feature.delayApp.headline" : "Per favore, compra una Licenza Supporter di Franz per saltare l'attesa",
6 "feature.delayApp.text" : "Franz continuerà a funzionare tra {seconds} secondi.", 6 "feature.delayApp.text" : "Franz continuerà a funzionare tra {seconds} secondi.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Impossibile connettersi ai servizi online di Franz", 14 "global.api.unhealthy" : "Impossibile connettersi ai servizi online di Franz",
8 "global.notConnectedToTheInternet" : "Non sei connesso a Internet.", 15 "global.notConnectedToTheInternet" : "Non sei connesso a Internet.",
16 "global.spellchecker.useDefault" : "Usa le impostazioni predefinite di sistema ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Lingua per controllo ortografico",
9 "import.headline" : "Importa i servizi di Franz 4", 20 "import.headline" : "Importa i servizi di Franz 4",
10 "import.notSupportedHeadline" : "Servizi non ancora supportati in Franz 5", 21 "import.notSupportedHeadline" : "Servizi non ancora supportati in Franz 5",
11 "import.skip.label" : "Voglio aggiungere i servizi manualmente", 22 "import.skip.label" : "Voglio aggiungere i servizi manualmente",
@@ -81,7 +92,7 @@
81 "password.noUser" : "Non è stato trovato nessun utente con questo indirizzo e-mail", 92 "password.noUser" : "Non è stato trovato nessun utente con questo indirizzo e-mail",
82 "password.submit.label" : "Invia", 93 "password.submit.label" : "Invia",
83 "password.successInfo" : "Per favore controlla la tua email", 94 "password.successInfo" : "Per favore controlla la tua email",
84 "premiumFeature.button.upgradeAccount" : "Upgrade account", 95 "premiumFeature.button.upgradeAccount" : "Effettua l'upgrade del tuo account",
85 "pricing.headline" : "Supporta Franz", 96 "pricing.headline" : "Supporta Franz",
86 "pricing.link.skipPayment" : "Non voglio supportare lo sviluppo di Franz", 97 "pricing.link.skipPayment" : "Non voglio supportare lo sviluppo di Franz",
87 "pricing.submit.label" : "Voglio supportare lo sviluppo di Franz", 98 "pricing.submit.label" : "Voglio supportare lo sviluppo di Franz",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "Modifica {name}", 107 "service.errorHandler.editAction" : "Modifica {name}",
97 "service.errorHandler.headline" : "Oh no!", 108 "service.errorHandler.headline" : "Oh no!",
98 "service.errorHandler.message" : "Errore", 109 "service.errorHandler.message" : "Errore",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} non si è caricato correttamente.",
100 "services.getStarted" : "Iniziamo", 111 "services.getStarted" : "Iniziamo",
101 "services.welcome" : "Benvenuto su Franz", 112 "services.welcome" : "Benvenuto su Franz",
102 "settings.account.account.editButton" : "Modifica account", 113 "settings.account.account.editButton" : "Modifica account",
@@ -138,7 +149,7 @@
138 "settings.app.form.runInBackground" : "Mantieni Franz in esecuzione quando chiudi la finestra", 149 "settings.app.form.runInBackground" : "Mantieni Franz in esecuzione quando chiudi la finestra",
139 "settings.app.form.showDisabledServices" : "Mostra schede servizi disattivati", 150 "settings.app.form.showDisabledServices" : "Mostra schede servizi disattivati",
140 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra l'etichetta dei messaggi non letti quando le notifiche sono disattivate", 151 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra l'etichetta dei messaggi non letti quando le notifiche sono disattivate",
141 "settings.app.form.spellcheckerLanguage" : "Spell checking language", 152 "settings.app.form.spellcheckerLanguage" : "Lingua per controllo ortografico",
142 "settings.app.headline" : "Impostazioni", 153 "settings.app.headline" : "Impostazioni",
143 "settings.app.headlineAdvanced" : "Avanzate", 154 "settings.app.headlineAdvanced" : "Avanzate",
144 "settings.app.headlineAppearance" : "Aspetto", 155 "settings.app.headlineAppearance" : "Aspetto",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Mostra l'etichetta per tutti i nuovi messaggi", 203 "settings.service.form.indirectMessages" : "Mostra l'etichetta per tutti i nuovi messaggi",
193 "settings.service.form.isMutedInfo" : "Se disattivato, tutte le notifiche sonore e le riproduzioni audio saranno mutate", 204 "settings.service.form.isMutedInfo" : "Se disattivato, tutte le notifiche sonore e le riproduzioni audio saranno mutate",
194 "settings.service.form.name" : "Nome", 205 "settings.service.form.name" : "Nome",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "Impostazioni Proxy HTTP\/HTTPS",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "Proxy Host\/IP",
197 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.", 208 "settings.service.form.proxy.info" : "Le impostazioni proxy non verranno sincronizzate con i server Franz",
198 "settings.service.form.proxy.isEnabled" : "Use Proxy", 209 "settings.service.form.proxy.isEnabled" : "Usa un Proxy",
199 "settings.service.form.proxy.password" : "Password (optional)", 210 "settings.service.form.proxy.password" : "Password (opzionale)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Porta",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Riavvia Franz dopo aver cambiato le impostazioni del proxy.",
202 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "Utente (opzionale)",
203 "settings.service.form.saveButton" : "Salva servizio", 214 "settings.service.form.saveButton" : "Salva servizio",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Lingua per controllo ortografico",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Usa le impostazioni predefinite di sistema ({default})",
206 "settings.service.form.tabHosted" : "Hosted", 217 "settings.service.form.tabHosted" : "Hosted",
207 "settings.service.form.tabOnPremise" : "Self hosted â­ï¸", 218 "settings.service.form.tabOnPremise" : "Self hosted â­ï¸",
208 "settings.service.form.team" : "Gruppo", 219 "settings.service.form.team" : "Gruppo",
@@ -245,11 +256,11 @@
245 "subscription.features.ads" : "Nessuna pubblicità, mai!", 256 "subscription.features.ads" : "Nessuna pubblicità, mai!",
246 "subscription.features.comingSoon" : "in arrivo", 257 "subscription.features.comingSoon" : "in arrivo",
247 "subscription.features.encryptedSync" : "Sincronizzazione sessione crittografata", 258 "subscription.features.encryptedSync" : "Sincronizzazione sessione crittografata",
248 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 259 "subscription.features.noInterruptions" : "L'upgrade della licenza avrà impatti sull'utilizzo dell'App",
249 "subscription.features.onpremise" : "Aggiungi servizi on-premise\/hosted come HipChat", 260 "subscription.features.onpremise" : "Aggiungi servizi on-premise\/hosted come HipChat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "Aggiungi servizi on-premise\/hosted come \"Mattermost\"",
251 "subscription.features.proxy" : "Proxy support for services", 262 "subscription.features.proxy" : "Supporto proxy per i servizi",
252 "subscription.features.spellchecker" : "Support for spellchecker", 263 "subscription.features.spellchecker" : "Supporto per il correttore ortografico",
253 "subscription.includedFeatures" : "L'account a pagamento Franz Premium Supporter include", 264 "subscription.includedFeatures" : "L'account a pagamento Franz Premium Supporter include",
254 "subscription.paymentSessionError" : "Impossibile inizializzare il modulo per il pagamento", 265 "subscription.paymentSessionError" : "Impossibile inizializzare il modulo per il pagamento",
255 "subscription.submit.label" : "Voglio supportare lo sviluppo di Franz", 266 "subscription.submit.label" : "Voglio supportare lo sviluppo di Franz",
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index 6eea64c3a..838dc81ea 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -1,16 +1,27 @@
1{ 1{
2 "app.errorHandler.action" : "å†èª­ã¿è¾¼ã¿", 2 "app.errorHandler.action" : "å†èª­ã¿è¾¼ã¿",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "é–“é•ãˆã¦ã„る部分ãŒã‚ã‚Šã¾ã™",
4 "feature.delayApp.action" : "Franz サãƒãƒ¼ã‚¿ãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’購入ã™ã‚‹", 4 "feature.delayApp.action" : "Franzサãƒãƒ¼ã‚¿ãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’購入ã™ã‚‹",
5 "feature.delayApp.headline" : "Franz ã‚’ã™ãã«èµ·å‹•ã™ã‚‹ã«ã¯ã€Franz サãƒãƒ¼ã‚¿ãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’購入ã—ã¦ãã ã•ã„。", 5 "feature.delayApp.headline" : "Franzã‚’ã™ãã«èµ·å‹•ã™ã‚‹ã«ã¯ã€Franz サãƒãƒ¼ã‚¿ãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã‚’購入ã—ã¦ãã ã•ã„。",
6 "feature.delayApp.text" : "Franz ã¯ã‚ã¨{seconds}秒後ã«èµ·å‹•ã—ã¾ã™ã€‚", 6 "feature.delayApp.text" : "Franzã¯ã‚ã¨{seconds}秒後ã«èµ·å‹•ã—ã¾ã™ã€‚",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Franzã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚µãƒ¼ãƒ“スã«æŽ¥ç¶šã§ãã¾ã›ã‚“。", 14 "global.api.unhealthy" : "Franzã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚µãƒ¼ãƒ“スã«æŽ¥ç¶šã§ãã¾ã›ã‚“。",
8 "global.notConnectedToTheInternet" : "インターãƒãƒƒãƒˆã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“。", 15 "global.notConnectedToTheInternet" : "インターãƒãƒƒãƒˆã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“。",
16 "global.spellchecker.useDefault" : " {default}ã‚’åˆæœŸè¨­å®šã§ä½¿ç”¨ã—ã¦ãã ã•ã„",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "スペルãƒã‚§ãƒƒã‚¯ã™ã‚‹è¨€èªž",
9 "import.headline" : "Franz 4ã®ã‚µãƒ¼ãƒ“スをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„", 20 "import.headline" : "Franz 4ã®ã‚µãƒ¼ãƒ“スをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„",
10 "import.notSupportedHeadline" : "Franz 5ã§ã¯ã“ã®ã‚µãƒ¼ãƒ“スã«ã¾ã å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“", 21 "import.notSupportedHeadline" : "Franz 5ã§ã¯ã“ã®ã‚µãƒ¼ãƒ“スã«ã¾ã å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“",
11 "import.skip.label" : "手動ã§ã‚µãƒ¼ãƒ“スを追加ã™ã‚‹", 22 "import.skip.label" : "手動ã§ã‚µãƒ¼ãƒ“スを追加ã™ã‚‹",
12 "import.submit.label" : "サービスをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„", 23 "import.submit.label" : "サービスをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„",
13 "infobar.buttonChangelog" : "最新ã®æƒ…å ±", 24 "infobar.buttonChangelog" : "更新履歴を見る",
14 "infobar.buttonInstallUpdate" : "å†èµ·å‹•ã—ã¦æ›´æ–°ã‚’インストールã™ã‚‹", 25 "infobar.buttonInstallUpdate" : "å†èµ·å‹•ã—ã¦æ›´æ–°ã‚’インストールã™ã‚‹",
15 "infobar.buttonReloadServices" : "サービスã®å†èª­ã¿è¾¼ã¿", 26 "infobar.buttonReloadServices" : "サービスã®å†èª­ã¿è¾¼ã¿",
16 "infobar.requiredRequestsFailed" : "サービスã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼æƒ…報を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ", 27 "infobar.requiredRequestsFailed" : "サービスã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼æƒ…報を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "{name}を編集", 107 "service.errorHandler.editAction" : "{name}を編集",
97 "service.errorHandler.headline" : "ã—ã¾ã£ãŸï¼", 108 "service.errorHandler.headline" : "ã—ã¾ã£ãŸï¼",
98 "service.errorHandler.message" : "エラー", 109 "service.errorHandler.message" : "エラー",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} ã¯ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ",
100 "services.getStarted" : "ã¯ã˜ã‚ã‚‹", 111 "services.getStarted" : "ã¯ã˜ã‚ã‚‹",
101 "services.welcome" : "Franzã«ã‚ˆã†ã“ã", 112 "services.welcome" : "Franzã«ã‚ˆã†ã“ã",
102 "settings.account.account.editButton" : "アカウントã®ç·¨é›†", 113 "settings.account.account.editButton" : "アカウントã®ç·¨é›†",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "ã™ã¹ã¦ã®æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¤ã„ã¦ãƒãƒƒã‚¸ã‚’表示ã™ã‚‹", 203 "settings.service.form.indirectMessages" : "ã™ã¹ã¦ã®æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¤ã„ã¦ãƒãƒƒã‚¸ã‚’表示ã™ã‚‹",
193 "settings.service.form.isMutedInfo" : "無効化ã•ã‚Œã¦ã„ã‚‹å ´åˆã€å…¨ã¦ã®é€šçŸ¥éŸ³ã‚„オーディオå†ç”Ÿã¯ç„¡éŸ³ã«ãªã‚Šã¾ã™", 204 "settings.service.form.isMutedInfo" : "無効化ã•ã‚Œã¦ã„ã‚‹å ´åˆã€å…¨ã¦ã®é€šçŸ¥éŸ³ã‚„オーディオå†ç”Ÿã¯ç„¡éŸ³ã«ãªã‚Šã¾ã™",
194 "settings.service.form.name" : "サービスå", 205 "settings.service.form.name" : "サービスå",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "HTTP\/HTTPSã®ãƒ—ロキシ設定",
196 "settings.service.form.proxy.host" : "プロキシサーãƒãƒ¼\/IP", 207 "settings.service.form.proxy.host" : "プロキシサーãƒãƒ¼\/IP",
197 "settings.service.form.proxy.info" : "プロキシ設定ã¯Franz アカウントã§åŒæœŸã•ã‚Œã¾ã›ã‚“。", 208 "settings.service.form.proxy.info" : "プロキシ設定ã¯Franz アカウントã§åŒæœŸã•ã‚Œã¾ã›ã‚“。",
198 "settings.service.form.proxy.isEnabled" : "プロキシ設定を有効ã«ã™ã‚‹", 209 "settings.service.form.proxy.isEnabled" : "プロキシ設定を有効ã«ã™ã‚‹",
199 "settings.service.form.proxy.password" : "パスワード(任æ„)", 210 "settings.service.form.proxy.password" : "パスワード(任æ„)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "ãƒãƒ¼ãƒˆ",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "プロキシ設定を変更ã—ã¦ã‹ã‚‰ã€Franzã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„",
202 "settings.service.form.proxy.user" : "ユーザーå(任æ„)", 213 "settings.service.form.proxy.user" : "ユーザーå(任æ„)",
203 "settings.service.form.saveButton" : "サービスã®ä¿å­˜", 214 "settings.service.form.saveButton" : "サービスã®ä¿å­˜",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "言語ã®ã‚¹ãƒšãƒ«ãƒã‚§ãƒƒã‚¯",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : " {default}ã‚’åˆæœŸè¨­å®šã§ä½¿ç”¨ã—ã¦ãã ã•ã„",
206 "settings.service.form.tabHosted" : "ホスト", 217 "settings.service.form.tabHosted" : "ホスト",
207 "settings.service.form.tabOnPremise" : "セルフホスト â­ï¸", 218 "settings.service.form.tabOnPremise" : "セルフホスト â­ï¸",
208 "settings.service.form.team" : "ãƒãƒ¼ãƒ ", 219 "settings.service.form.team" : "ãƒãƒ¼ãƒ ",
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index 632ca618e..ec0cdd375 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -4,8 +4,19 @@
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Get a Franz Supporter License",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Franz-ის áƒáƒœáƒšáƒáƒ˜áƒœ სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ", 14 "global.api.unhealthy" : "Franz-ის áƒáƒœáƒšáƒáƒ˜áƒœ სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ",
8 "global.notConnectedToTheInternet" : "თქვენ áƒáƒ  ხáƒáƒ áƒ— ინტერნეტთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული.", 15 "global.notConnectedToTheInternet" : "თქვენ áƒáƒ  ხáƒáƒ áƒ— ინტერნეტთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული.",
16 "global.spellchecker.useDefault" : "Use System Default ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Spell checking language",
9 "import.headline" : "შემáƒáƒ˜áƒ¢áƒáƒœáƒ” Franz 4-ის სერვისები", 20 "import.headline" : "შემáƒáƒ˜áƒ¢áƒáƒœáƒ” Franz 4-ის სერვისები",
10 "import.notSupportedHeadline" : "სერვისები ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი Franz 5-ში", 21 "import.notSupportedHeadline" : "სერვისები ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი Franz 5-ში",
11 "import.skip.label" : "I want to add services manually", 22 "import.skip.label" : "I want to add services manually",
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index c38a7f024..2082edd6d 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -1,74 +1,85 @@
1{ 1{
2 "app.errorHandler.action" : "Herladen", 2 "app.errorHandler.action" : "Herladen",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Er ging iets mis",
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Neem een Franz Supporter Licentie ",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Neem een Franz Supporter Licentie om niet meer te hoeven wachten",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz services", 14 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz services",
8 "global.notConnectedToTheInternet" : "Je hebt geen internet verbinding.", 15 "global.notConnectedToTheInternet" : "Je hebt geen internet verbinding.",
16 "global.spellchecker.useDefault" : "Gebruik Systeemstandaard ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Taal spellingscontrole",
9 "import.headline" : "Importeer je Franz 4 services", 20 "import.headline" : "Importeer je Franz 4 services",
10 "import.notSupportedHeadline" : "De volgende services worden nog niet ondersteund in Franz 5", 21 "import.notSupportedHeadline" : "De volgende services worden nog niet ondersteund in Franz 5",
11 "import.skip.label" : "Ik wens services manueel toe te voegen", 22 "import.skip.label" : "Ik wil services handmatig toevoegen",
12 "import.submit.label" : "Importeer services", 23 "import.submit.label" : "Importeer services",
13 "infobar.buttonChangelog" : "Wat is er nieuw?", 24 "infobar.buttonChangelog" : "Wat is er nieuw?",
14 "infobar.buttonInstallUpdate" : "Start opnieuw op & installeer de update", 25 "infobar.buttonInstallUpdate" : "Opnieuw opstarten & update installeren",
15 "infobar.buttonReloadServices" : "Herlaad de services", 26 "infobar.buttonReloadServices" : "Services opnieuw laden",
16 "infobar.requiredRequestsFailed" : "Kan de services en gebruikers informatie niet laden", 27 "infobar.requiredRequestsFailed" : "Kan de services en gebruikersinformatie niet laden",
17 "infobar.servicesUpdated" : "Je services zijn geüpdatet.", 28 "infobar.servicesUpdated" : "Je services zijn bijgewerkt.",
18 "infobar.updateAvailable" : "Een nieuwe update voor Franz is beschikbaar.", 29 "infobar.updateAvailable" : "Er is een nieuwe update voor Franz beschikbaar.",
19 "invite.email.label" : "E-mailadres", 30 "invite.email.label" : "E-mailadres",
20 "invite.headline.friends" : "Nodig 3 van je vrienden of collega's uit", 31 "invite.headline.friends" : "Nodig 3 van je vrienden of collega's uit",
21 "invite.name.label" : "Naam", 32 "invite.name.label" : "Naam",
22 "invite.skip.label" : "Ik wil dit later doen", 33 "invite.skip.label" : "Ik wil dit later doen",
23 "invite.submit.label" : "Verzend uitnodigingen", 34 "invite.submit.label" : "Uitnodigingen verzenden",
24 "invite.successInfo" : "Uitnodiging met succes verzonden", 35 "invite.successInfo" : "Uitnodiging met succes verzonden",
25 "login.email.label" : "E-mailadres", 36 "login.email.label" : "E-mailadres",
26 "login.headline" : "Inloggen", 37 "login.headline" : "Inloggen",
27 "login.invalidCredentials" : "E-mailadres of wachtwoord ongeldig", 38 "login.invalidCredentials" : "E-mailadres of wachtwoord ongeldig",
28 "login.link.password" : "Wachtwoord resetten", 39 "login.link.password" : "Wachtwoord resetten",
29 "login.link.signup" : "Maak een gratis account", 40 "login.link.signup" : "Maak een gratis account aan",
30 "login.password.label" : "Wachtwoord", 41 "login.password.label" : "Wachtwoord",
31 "login.serverLogout" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 42 "login.serverLogout" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
32 "login.submit.label" : "Log in", 43 "login.submit.label" : "Inloggen",
33 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 44 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
34 "menu.app.about" : "Over Franz", 45 "menu.app.about" : "Over Franz",
35 "menu.app.hide" : "Verbergen", 46 "menu.app.hide" : "Verbergen",
36 "menu.app.hideOthers" : "Andere verbergen", 47 "menu.app.hideOthers" : "Andere Verbergen",
37 "menu.app.quit" : "Afsluiten", 48 "menu.app.quit" : "Afsluiten",
38 "menu.app.settings" : "Instellingen", 49 "menu.app.settings" : "Instellingen",
39 "menu.app.unhide" : "Zichtbaar maken", 50 "menu.app.unhide" : "Tonen",
40 "menu.edit" : "Aanpassen", 51 "menu.edit" : "Bewerken",
41 "menu.edit.copy" : "Kopiëren", 52 "menu.edit.copy" : "Kopiëren",
42 "menu.edit.cut" : "Knippen", 53 "menu.edit.cut" : "Knippen",
43 "menu.edit.delete" : "Verwijderen", 54 "menu.edit.delete" : "Verwijderen",
44 "menu.edit.emojiSymbols" : "Emoji & Symbolen", 55 "menu.edit.emojiSymbols" : "Emoji & Symbolen",
45 "menu.edit.paste" : "Plakken", 56 "menu.edit.paste" : "Plakken",
46 "menu.edit.pasteAndMatchStyle" : "Plakken en stijl overeen laten komen", 57 "menu.edit.pasteAndMatchStyle" : "Plakken en stijl overeen laten komen",
47 "menu.edit.redo" : "Opnieuw uitvoeren", 58 "menu.edit.redo" : "Opnieuw doen",
48 "menu.edit.selectAll" : "Selecteer alles", 59 "menu.edit.selectAll" : "Selecteer Alles",
49 "menu.edit.speech" : "Spraakuitvoer", 60 "menu.edit.speech" : "Spraakuitvoer",
50 "menu.edit.startDictation" : "Beginnen met dicteren", 61 "menu.edit.startDictation" : "Beginnen met dicteren",
51 "menu.edit.startSpeaking" : "Begin met spreken", 62 "menu.edit.startSpeaking" : "Begin met Spreken",
52 "menu.edit.stopSpeaking" : "Stoppen met spreken", 63 "menu.edit.stopSpeaking" : "Stoppen met Spreken",
53 "menu.edit.undo" : "Ongedaan maken", 64 "menu.edit.undo" : "Ongedaan maken",
54 "menu.file" : "Bestand", 65 "menu.file" : "Bestand",
55 "menu.help" : "Help", 66 "menu.help" : "Help",
56 "menu.help.changelog" : "Logboek", 67 "menu.help.changelog" : "Logboek",
57 "menu.help.learnMore" : "Meer weten", 68 "menu.help.learnMore" : "Meer Weten",
58 "menu.help.privacy" : "Privacyverklaring", 69 "menu.help.privacy" : "Privacyverklaring",
59 "menu.help.support" : "Ondersteuning", 70 "menu.help.support" : "Ondersteuning",
60 "menu.help.tos" : "Servicevoorwaarden", 71 "menu.help.tos" : "Servicevoorwaarden",
61 "menu.services" : "Diensten", 72 "menu.services" : "Services",
62 "menu.services.addNewService" : "Nieuwe service toevoegen...", 73 "menu.services.addNewService" : "Nieuwe service toevoegen...",
63 "menu.view" : "Beeld", 74 "menu.view" : "Weergave",
64 "menu.view.enterFullScreen" : "Volledig scherm openen", 75 "menu.view.enterFullScreen" : "Volledig scherm openen",
65 "menu.view.exitFullScreen" : "Volledig scherm verlaten", 76 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
66 "menu.view.reloadFranz" : "Franz Herladen", 77 "menu.view.reloadFranz" : "Franz Herladen",
67 "menu.view.reloadService" : "Service herladen", 78 "menu.view.reloadService" : "Service Herladen",
68 "menu.view.resetZoom" : "Werkelijke grootte", 79 "menu.view.resetZoom" : "Werkelijke Grootte",
69 "menu.view.toggleDevTools" : "Toggle Developer Tools", 80 "menu.view.toggleDevTools" : "Ontwikkelaarstools Aan\/Uit",
70 "menu.view.toggleFullScreen" : "Volledig scherm aan\/uit", 81 "menu.view.toggleFullScreen" : "Volledig Scherm Aan\/Uit",
71 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 82 "menu.view.toggleServiceDevTools" : "Service Ontwikkelaarstools Aan\/Uit",
72 "menu.view.zoomIn" : "Inzoomen", 83 "menu.view.zoomIn" : "Inzoomen",
73 "menu.view.zoomOut" : "Uitzoomen", 84 "menu.view.zoomOut" : "Uitzoomen",
74 "menu.window" : "Venster", 85 "menu.window" : "Venster",
@@ -78,47 +89,47 @@
78 "password.headline" : "Wachtwoord resetten", 89 "password.headline" : "Wachtwoord resetten",
79 "password.link.login" : "Log in op je account", 90 "password.link.login" : "Log in op je account",
80 "password.link.signup" : "Maak een gratis account", 91 "password.link.signup" : "Maak een gratis account",
81 "password.noUser" : "Geen gebruiker bekend met dat e-mailadres", 92 "password.noUser" : "Geen gebruiker gevonden met dat e-mailadres",
82 "password.submit.label" : "Doorgaan", 93 "password.submit.label" : "Verzenden",
83 "password.successInfo" : "Controleer alsjeblieft je e-mail", 94 "password.successInfo" : "Controleer alsjeblieft je e-mail",
84 "premiumFeature.button.upgradeAccount" : "Upgrade account", 95 "premiumFeature.button.upgradeAccount" : "Upgrade account",
85 "pricing.headline" : "Ondersteun Franz", 96 "pricing.headline" : "Steun Franz",
86 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Franz niet ondersteunen.", 97 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Franz niet ondersteunen.",
87 "pricing.submit.label" : "Ik wil de ontwikkeling van Franz ondersteunen", 98 "pricing.submit.label" : "Ik wil de ontwikkeling van Franz ondersteunen",
88 "pricing.support.label" : "Selecteer je ondersteuningsplan", 99 "pricing.support.label" : "Selecteer je ondersteuningsplan",
89 "service.crashHandler.action" : "{naam} herladen", 100 "service.crashHandler.action" : "{naam} herladen",
90 "service.crashHandler.autoReload" : "Automatisch herstellen {name} proberen in {seconds} seconden", 101 "service.crashHandler.autoReload" : "Ga proberen om {name} te herstellen over {seconds} seconden",
91 "service.crashHandler.headline" : "Oh nee!", 102 "service.crashHandler.headline" : "Oh nee!",
92 "service.crashHandler.text" : "{name} heeft een probleem veroorzaakt.", 103 "service.crashHandler.text" : "{name} heeft een probleem veroorzaakt.",
93 "service.disabledHandler.action" : "Activeer {name}", 104 "service.disabledHandler.action" : "Activeer {name}",
94 "service.disabledHandler.headline" : "{name} is uitgeschakeld", 105 "service.disabledHandler.headline" : "{name} is uitgeschakeld",
95 "service.errorHandler.action" : "{naam} herladen", 106 "service.errorHandler.action" : "{naam} herladen",
96 "service.errorHandler.editAction" : "{name} aanpassen", 107 "service.errorHandler.editAction" : "Bewerk {name}",
97 "service.errorHandler.headline" : "Oh nee!", 108 "service.errorHandler.headline" : "Oh nee!",
98 "service.errorHandler.message" : "Fout", 109 "service.errorHandler.message" : "Fout",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} kon niet geladen worden.",
100 "services.getStarted" : "Beginnen", 111 "services.getStarted" : "Beginnen",
101 "services.welcome" : "Welkom bij Franz", 112 "services.welcome" : "Welkom bij Franz",
102 "settings.account.account.editButton" : "Bewerk account", 113 "settings.account.account.editButton" : "Account bewerken",
103 "settings.account.accountType.basic" : "Basis Account", 114 "settings.account.accountType.basic" : "Basis Account",
104 "settings.account.accountType.premium" : "Premium Supporter Account", 115 "settings.account.accountType.premium" : "Premium Supporter Account",
105 "settings.account.buttonSave" : "Profiel aanpassen", 116 "settings.account.buttonSave" : "Profiel bijwerken",
106 "settings.account.deleteAccount" : "Account verwijderen", 117 "settings.account.deleteAccount" : "Account verwijderen",
107 "settings.account.deleteEmailSent" : "U heeft een email ontvangen met een bevestiginslink om uw account te verwijderen. Uw account en de bijhorende gegevens kunnen niet meer worden herstel na deze actie!", 118 "settings.account.deleteEmailSent" : "U heeft een email ontvangen met een bevestiginslink om uw account te verwijderen. Uw account en de bijhorende gegevens kunnen niet meer worden herstel na deze actie!",
108 "settings.account.deleteInfo" : "Indien u uw Franz account nietmeer nodig heeft, kan u hier uw account en de gerelateerde gegegevens verwijderen.", 119 "settings.account.deleteInfo" : "Indien u uw Franz account niet meer nodig heeft, kan u hier uw account en alle gerelateerde gegevens verwijderen.",
109 "settings.account.headline" : "Account", 120 "settings.account.headline" : "Account",
110 "settings.account.headlineAccount" : "Account informatie", 121 "settings.account.headlineAccount" : "Account informatie",
111 "settings.account.headlineDangerZone" : "Gevaren Zone", 122 "settings.account.headlineDangerZone" : "Gevarenzone",
112 "settings.account.headlineInvoices" : "Facturen", 123 "settings.account.headlineInvoices" : "Facturen",
113 "settings.account.headlinePassword" : "Wijzig wachtwoord", 124 "settings.account.headlinePassword" : "Wijzig wachtwoord",
114 "settings.account.headlineProfile" : "Profiel aanpassen", 125 "settings.account.headlineProfile" : "Profiel bijwerken",
115 "settings.account.headlineSubscription" : "Je abonnement", 126 "settings.account.headlineSubscription" : "Je abonnement",
116 "settings.account.headlineUpgrade" : "Upgrade je account & ondersteun Franz", 127 "settings.account.headlineUpgrade" : "Upgrade je account & ondersteun Franz",
117 "settings.account.invoiceDownload" : "Download", 128 "settings.account.invoiceDownload" : "Download",
118 "settings.account.manageSubscription.label" : "Beheer je abonnement", 129 "settings.account.manageSubscription.label" : "Beheer je abonnement",
119 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen", 130 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen",
120 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw", 131 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw",
121 "settings.account.userInfoRequestFailed" : "Kon gebruikerinformatie niet laden", 132 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden",
122 "settings.app.buttonClearAllCache" : "Cache wissen", 133 "settings.app.buttonClearAllCache" : "Cache wissen",
123 "settings.app.buttonInstallUpdate" : "Herstart & installeer update", 134 "settings.app.buttonInstallUpdate" : "Herstart & installeer update",
124 "settings.app.buttonSearchForUpdate" : "Controleer op updates", 135 "settings.app.buttonSearchForUpdate" : "Controleer op updates",
@@ -126,47 +137,47 @@
126 "settings.app.currentVersion" : "Huidige versie:", 137 "settings.app.currentVersion" : "Huidige versie:",
127 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond", 138 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond",
128 "settings.app.form.autoLaunchOnStart" : "Lanceer Franz bij opstarten", 139 "settings.app.form.autoLaunchOnStart" : "Lanceer Franz bij opstarten",
129 "settings.app.form.beta" : "Inclusief bèta versies", 140 "settings.app.form.beta" : "Inclusief beta versies",
130 "settings.app.form.darkMode" : "Join the Dark Side", 141 "settings.app.form.darkMode" : "Word lid van de Dark Side",
131 "settings.app.form.enableGPUAcceleration" : "GPU Acceleratie Activeren", 142 "settings.app.form.enableGPUAcceleration" : "GPU Acceleratie Activeren",
132 "settings.app.form.enableMenuBar" : "Toon Franz in Menu Bar", 143 "settings.app.form.enableMenuBar" : "Toon Franz in Menu Bar",
133 "settings.app.form.enableSpellchecking" : "Spellingcontrole inschakelen", 144 "settings.app.form.enableSpellchecking" : "Spellingcontrole inschakelen",
134 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk", 145 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk",
135 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 146 "settings.app.form.hideDockIcon" : "Verberg Franz in Dock",
136 "settings.app.form.language" : "Taal", 147 "settings.app.form.language" : "Taal",
137 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Franz naar de systeembalk", 148 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Franz naar de systeembalk",
138 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt", 149 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt",
139 "settings.app.form.showDisabledServices" : "Display disabled services tabs", 150 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services",
140 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled", 151 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld",
141 "settings.app.form.spellcheckerLanguage" : "Spell checking language", 152 "settings.app.form.spellcheckerLanguage" : "Taal spellingscontrole",
142 "settings.app.headline" : "Instellingen", 153 "settings.app.headline" : "Instellingen",
143 "settings.app.headlineAdvanced" : "Advanced", 154 "settings.app.headlineAdvanced" : "Geavanceerd",
144 "settings.app.headlineAppearance" : "Appearance", 155 "settings.app.headlineAppearance" : "Weergave",
145 "settings.app.headlineGeneral" : "Algemeen", 156 "settings.app.headlineGeneral" : "Algemeen",
146 "settings.app.headlineLanguage" : "Taal", 157 "settings.app.headlineLanguage" : "Taal",
147 "settings.app.headlineUpdates" : "Updates", 158 "settings.app.headlineUpdates" : "Updates",
148 "settings.app.restartRequired" : "Changes require restart", 159 "settings.app.restartRequired" : "Deze wijziging heeft een herstart nodig",
149 "settings.app.subheadlineCache" : "Cache", 160 "settings.app.subheadlineCache" : "Cache",
150 "settings.app.translationHelp" : "Help us to translate Franz into your language.", 161 "settings.app.translationHelp" : "Help ons om Franz te vertalen naar uw taal.",
151 "settings.app.updateStatusAvailable" : "Update beschikbaar, downloaden...", 162 "settings.app.updateStatusAvailable" : "Update beschikbaar, downloaden...",
152 "settings.app.updateStatusSearching" : "Zoekt naar updates", 163 "settings.app.updateStatusSearching" : "Zoekt naar updates",
153 "settings.app.updateStatusUpToDate" : "Je gebruikt de laatste versie van Franz", 164 "settings.app.updateStatusUpToDate" : "Je gebruikt de laatste versie van Franz",
154 "settings.invite.headline" : "Invite Friends", 165 "settings.invite.headline" : "Nodig vrienden uit",
155 "settings.navigation.account" : "Account", 166 "settings.navigation.account" : "Account",
156 "settings.navigation.availableServices" : "Beschikbare services", 167 "settings.navigation.availableServices" : "Beschikbare services",
157 "settings.navigation.inviteFriends" : "Invite Friends", 168 "settings.navigation.inviteFriends" : "Nodig vrienden uit",
158 "settings.navigation.logout" : "Uitloggen", 169 "settings.navigation.logout" : "Uitloggen",
159 "settings.navigation.settings" : "Instellingen", 170 "settings.navigation.settings" : "Instellingen",
160 "settings.navigation.yourServices" : "Jouw services", 171 "settings.navigation.yourServices" : "Jouw services",
161 "settings.recipes.all" : "Alle services", 172 "settings.recipes.all" : "Alle services",
162 "settings.recipes.dev" : "Ontwikkeling", 173 "settings.recipes.dev" : "Ontwikkeling",
163 "settings.recipes.headline" : "Beschikbare services", 174 "settings.recipes.headline" : "Beschikbare services",
164 "settings.recipes.missingService" : "Missing a service?", 175 "settings.recipes.missingService" : "Mist er een service?",
165 "settings.recipes.mostPopular" : "Meest populair", 176 "settings.recipes.mostPopular" : "Meest populair",
166 "settings.recipes.nothingFound" : "Sorry, maar geen enkele service kwam overeen met je zoekterm.", 177 "settings.recipes.nothingFound" : "Sorry, maar geen enkele service kwam overeen met je zoekterm.",
167 "settings.recipes.servicesSuccessfulAddedInfo" : "Service succesvol toegevoegd", 178 "settings.recipes.servicesSuccessfulAddedInfo" : "Service succesvol toegevoegd",
168 "settings.searchService" : "Search service", 179 "settings.searchService" : "Service zoeken",
169 "settings.service.error.goBack" : "Terug naar de services", 180 "settings.service.error.goBack" : "Terug naar services",
170 "settings.service.error.headline" : "Fout", 181 "settings.service.error.headline" : "Fout",
171 "settings.service.error.message" : "Kon het service-recept niet laden.", 182 "settings.service.error.message" : "Kon het service-recept niet laden.",
172 "settings.service.form.addServiceHeadline" : "{name} toevoegen", 183 "settings.service.form.addServiceHeadline" : "{name} toevoegen",
@@ -177,62 +188,62 @@
177 "settings.service.form.customUrlValidationError" : "Kon de custom {name} server niet valideren.", 188 "settings.service.form.customUrlValidationError" : "Kon de custom {name} server niet valideren.",
178 "settings.service.form.deleteButton" : "Service verwijderen", 189 "settings.service.form.deleteButton" : "Service verwijderen",
179 "settings.service.form.editServiceHeadline" : "{name} aanpassen", 190 "settings.service.form.editServiceHeadline" : "{name} aanpassen",
180 "settings.service.form.enableAudio" : "Enable audio", 191 "settings.service.form.enableAudio" : "Audio inschakelen",
181 "settings.service.form.enableBadge" : "Show unread message badges", 192 "settings.service.form.enableBadge" : "Toon badges met ongelezen berichten",
182 "settings.service.form.enableDarkMode" : "Enable Dark Mode", 193 "settings.service.form.enableDarkMode" : "Dark Mode aanzetten",
183 "settings.service.form.enableNotification" : "Notificaties aanzetten", 194 "settings.service.form.enableNotification" : "Notificaties aanzetten",
184 "settings.service.form.enableService" : "Service aanzetten", 195 "settings.service.form.enableService" : "Service aanzetten",
185 "settings.service.form.headlineBadges" : "Unread message badges", 196 "settings.service.form.headlineBadges" : "Ongelezen berichten badges",
186 "settings.service.form.headlineGeneral" : "Algemeen", 197 "settings.service.form.headlineGeneral" : "Algemeen",
187 "settings.service.form.headlineNotifications" : "Notifications", 198 "settings.service.form.headlineNotifications" : "Meldingen",
188 "settings.service.form.icon" : "Custom icon", 199 "settings.service.form.icon" : "Aangepast icoon",
189 "settings.service.form.iconDelete" : "Verwijderen", 200 "settings.service.form.iconDelete" : "Verwijderen",
190 "settings.service.form.iconUpload" : "Drop your image, or click here", 201 "settings.service.form.iconUpload" : "Sleep en drop je afbeelding, of klik hier",
191 "settings.service.form.indirectMessageInfo" : "Je wordt verwittigd over alle nieuwe berichten in een kanaal, niet alleen @username, @channel, @here, ...", 202 "settings.service.form.indirectMessageInfo" : "Je wordt verwittigd over alle nieuwe berichten in een kanaal, niet alleen @username, @channel, @here, ...",
192 "settings.service.form.indirectMessages" : "Toon berichten-badge voor alle nieuwe berichten", 203 "settings.service.form.indirectMessages" : "Toon berichten-badge voor alle nieuwe berichten",
193 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted", 204 "settings.service.form.isMutedInfo" : "Indien uitgeschakeld zullen alle meldingsgeluiden en afgespeelde audio uitgeschakeld zijn",
194 "settings.service.form.name" : "Naam", 205 "settings.service.form.name" : "Naam",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Instellingen",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "Proxy Host\/IP",
197 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.", 208 "settings.service.form.proxy.info" : "Proxy instellingen worden niet gesynchroniseerd met de Franz servers.",
198 "settings.service.form.proxy.isEnabled" : "Use Proxy", 209 "settings.service.form.proxy.isEnabled" : "Proxy gebruiken",
199 "settings.service.form.proxy.password" : "Password (optional)", 210 "settings.service.form.proxy.password" : "Wachtwoord (optioneel)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Poort",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Start Franz opnieuw op na het aanpassen van proxy Instellingen.",
202 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "Gebruiker (optioneel)",
203 "settings.service.form.saveButton" : "Service bewaren", 214 "settings.service.form.saveButton" : "Service opslaan",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Taal spellingscontrole",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Gebruik Systeemstandaard ({default})",
206 "settings.service.form.tabHosted" : "Gehost", 217 "settings.service.form.tabHosted" : "Gehost",
207 "settings.service.form.tabOnPremise" : "Intern gehost â­ï¸", 218 "settings.service.form.tabOnPremise" : "Intern gehost â­ï¸",
208 "settings.service.form.team" : "Team", 219 "settings.service.form.team" : "Team",
209 "settings.service.form.useHostedService" : "Use the hosted {name} service.", 220 "settings.service.form.useHostedService" : "Gebruik de gehoste {name} service.",
210 "settings.service.form.yourServices" : "Jouw services", 221 "settings.service.form.yourServices" : "Jouw services",
211 "settings.services.deletedInfo" : "Service werd verwijderd", 222 "settings.services.deletedInfo" : "Service werd verwijderd",
212 "settings.services.discoverServices" : "Services ontdekken", 223 "settings.services.discoverServices" : "Services ontdekken",
213 "settings.services.headline" : "Jouw services", 224 "settings.services.headline" : "Jouw services",
214 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.", 225 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.",
215 "settings.services.tooltip.isDisabled" : "Service staat uit", 226 "settings.services.tooltip.isDisabled" : "Service is uitgeschakeld",
216 "settings.services.tooltip.isMuted" : "All sounds are muted", 227 "settings.services.tooltip.isMuted" : "Alle geluiden zijn uitgeschakeld",
217 "settings.services.tooltip.notificationsDisabled" : "Notificaties staan uit", 228 "settings.services.tooltip.notificationsDisabled" : "Notificaties staan uit",
218 "settings.services.updatedInfo" : "Je wijzigingen werden bewaard", 229 "settings.services.updatedInfo" : "Je wijzigingen zijn opgeslagen",
219 "settings.user.form.accountType.company" : "Bedrijf", 230 "settings.user.form.accountType.company" : "Bedrijf",
220 "settings.user.form.accountType.individual" : "Particulier", 231 "settings.user.form.accountType.individual" : "Particulier",
221 "settings.user.form.accountType.label" : "Account type", 232 "settings.user.form.accountType.label" : "Account type",
222 "settings.user.form.accountType.non-profit" : "Non-Profit", 233 "settings.user.form.accountType.non-profit" : "Non-Profit",
223 "settings.user.form.currentPassword" : "Huidig wachtwoord", 234 "settings.user.form.currentPassword" : "Huidig wachtwoord",
224 "settings.user.form.email" : "Email", 235 "settings.user.form.email" : "Email",
225 "settings.user.form.firstname" : "Naam", 236 "settings.user.form.firstname" : "Voornaam",
226 "settings.user.form.lastname" : "Achternaam", 237 "settings.user.form.lastname" : "Achternaam",
227 "settings.user.form.newPassword" : "Nieuw wachtwoord", 238 "settings.user.form.newPassword" : "Nieuw wachtwoord",
228 "sidebar.addNewService" : "!!!Add new service", 239 "sidebar.addNewService" : "Nieuw service toevoegen",
229 "sidebar.muteApp" : "Disable notifications & audio", 240 "sidebar.muteApp" : "Berichten & geluid uitschakelen",
230 "sidebar.settings" : "Instellingen", 241 "sidebar.settings" : "Instellingen",
231 "sidebar.unmuteApp" : "Enable notifications & audio", 242 "sidebar.unmuteApp" : "Berichten & geluid inschakelen",
232 "signup.company.label" : "Bedrijf", 243 "signup.company.label" : "Bedrijf",
233 "signup.email.label" : "E-mailadres", 244 "signup.email.label" : "E-mailadres",
234 "signup.emailDuplicate" : "Er bestaat reeds een gebruiker met dat e-mailadres", 245 "signup.emailDuplicate" : "Er bestaat al een gebruiker met dat e-mailadres",
235 "signup.firstname.label" : "Naam", 246 "signup.firstname.label" : "Voornaam",
236 "signup.headline" : "Registreren", 247 "signup.headline" : "Registreren",
237 "signup.lastname.label" : "Achternaam", 248 "signup.lastname.label" : "Achternaam",
238 "signup.legal.info" : "Door een account aan te maken aanvaard je de", 249 "signup.legal.info" : "Door een account aan te maken aanvaard je de",
@@ -241,15 +252,15 @@
241 "signup.link.login" : "Al een account, inloggen?", 252 "signup.link.login" : "Al een account, inloggen?",
242 "signup.password.label" : "Wachtwoord", 253 "signup.password.label" : "Wachtwoord",
243 "signup.submit.label" : "Account aanmaken", 254 "signup.submit.label" : "Account aanmaken",
244 "subscription.euTaxInfo" : "EU residents: local sales tax may apply", 255 "subscription.euTaxInfo" : "Bewoners binnen EU: lokale belasting kan van toepassing zijn",
245 "subscription.features.ads" : "Geen reclame, nooit!", 256 "subscription.features.ads" : "Geen reclame, nooit!",
246 "subscription.features.comingSoon" : "komt binnenkort", 257 "subscription.features.comingSoon" : "komt binnenkort",
247 "subscription.features.encryptedSync" : "Synchronisatie van geëncrypteerde sessies", 258 "subscription.features.encryptedSync" : "Synchronisatie van geëncrypteerde sessies",
248 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 259 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades",
249 "subscription.features.onpremise" : "Intern gehoste services zoals HipChat", 260 "subscription.features.onpremise" : "Intern gehoste services zoals HipChat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "Voeg op-locatie\/gehoste diensten zoals Mattermost toe",
251 "subscription.features.proxy" : "Proxy support for services", 262 "subscription.features.proxy" : "Proxy ondersteuning voor services",
252 "subscription.features.spellchecker" : "Support for spellchecker", 263 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck",
253 "subscription.includedFeatures" : "Een betalend account voor Franz omvat", 264 "subscription.includedFeatures" : "Een betalend account voor Franz omvat",
254 "subscription.paymentSessionError" : "Betalingsformulier kon niet geladen worden", 265 "subscription.paymentSessionError" : "Betalingsformulier kon niet geladen worden",
255 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz steunen", 266 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz steunen",
@@ -259,19 +270,19 @@
259 "subscriptionPopup.buttonCancel" : "Annuleren", 270 "subscriptionPopup.buttonCancel" : "Annuleren",
260 "subscriptionPopup.buttonDone" : "Klaar", 271 "subscriptionPopup.buttonDone" : "Klaar",
261 "tabs.item.deleteService" : "Service verwijderen", 272 "tabs.item.deleteService" : "Service verwijderen",
262 "tabs.item.disableAudio" : "Disable audio", 273 "tabs.item.disableAudio" : "Audio uitschakelen",
263 "tabs.item.disableNotifications" : "Notificaties uitschakelen", 274 "tabs.item.disableNotifications" : "Notificaties uitschakelen",
264 "tabs.item.disableService" : "Service uitschakelen", 275 "tabs.item.disableService" : "Service uitschakelen",
265 "tabs.item.edit" : "Aanpassen", 276 "tabs.item.edit" : "Aanpassen",
266 "tabs.item.enableAudio" : "Enable audio", 277 "tabs.item.enableAudio" : "Audio inschakelen",
267 "tabs.item.enableNotification" : "Notificaties inschakelen", 278 "tabs.item.enableNotification" : "Notificaties inschakelen",
268 "tabs.item.enableService" : "Service aanzetten", 279 "tabs.item.enableService" : "Service inschakelen",
269 "tabs.item.reload" : "Herladen", 280 "tabs.item.reload" : "Herladen",
270 "validation.email" : "{field} is not valid", 281 "validation.email" : "{field} is niet geldig",
271 "validation.minLength" : "{field} should be at least {length} characters long", 282 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn",
272 "validation.required" : "{field} is required", 283 "validation.required" : "{field} is vereist",
273 "validation.url" : "{field} is not a valid URL", 284 "validation.url" : "{field} is niet een geldige URL",
274 "welcome.loginButton" : "Inloggen op je account", 285 "welcome.loginButton" : "Inloggen op je account",
275 "welcome.signupButton" : "Maak een gratis account aan", 286 "welcome.signupButton" : "Maak een gratis account aan",
276 "welcome.slogan" : "Messaging that works for you" 287 "welcome.slogan" : "Messaging die voor jou werkt"
277} 288}
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index 940f24b0b..df0549a28 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Laad opnieuw", 2 "app.errorHandler.action" : "Herladen",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Er ging iets mis",
4 "feature.delayApp.action" : "Sponsor Franz", 4 "feature.delayApp.action" : "Sponsor Franz",
5 "feature.delayApp.headline" : "Sponsor Franz om wachten over te slaan", 5 "feature.delayApp.headline" : "Sponsor Franz om wachten over te slaan",
6 "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.", 6 "feature.delayApp.text" : "Franz gaat over {seconds} seconden verder.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz-services", 14 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz-services",
8 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.", 15 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.",
16 "global.spellchecker.useDefault" : "Gebruik systeemstandaard ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Spelling checken",
9 "import.headline" : "Importeer uw Franz 4-services", 20 "import.headline" : "Importeer uw Franz 4-services",
10 "import.notSupportedHeadline" : "Services die nog niet ondersteund worden in Franz 5", 21 "import.notSupportedHeadline" : "Services die nog niet ondersteund worden in Franz 5",
11 "import.skip.label" : "Ik wil services handmatig toevoegen", 22 "import.skip.label" : "Ik wil services handmatig toevoegen",
@@ -92,11 +103,11 @@
92 "service.crashHandler.text" : "{name} heeft een fout veroorzaakt.", 103 "service.crashHandler.text" : "{name} heeft een fout veroorzaakt.",
93 "service.disabledHandler.action" : "Activeer {name}", 104 "service.disabledHandler.action" : "Activeer {name}",
94 "service.disabledHandler.headline" : "{name} is uitgeschakeld", 105 "service.disabledHandler.headline" : "{name} is uitgeschakeld",
95 "service.errorHandler.action" : "Laad {name} opnieuw", 106 "service.errorHandler.action" : "{name} herladen",
96 "service.errorHandler.editAction" : "Bewerk {name}", 107 "service.errorHandler.editAction" : "Bewerk {name}",
97 "service.errorHandler.headline" : "Oh nee!", 108 "service.errorHandler.headline" : "Oh nee!",
98 "service.errorHandler.message" : "Fout", 109 "service.errorHandler.message" : "Fout",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} kon niet geladen worden.",
100 "services.getStarted" : "Begin", 111 "services.getStarted" : "Begin",
101 "services.welcome" : "Welkom bij Franz", 112 "services.welcome" : "Welkom bij Franz",
102 "settings.account.account.editButton" : "Bewerk account", 113 "settings.account.account.editButton" : "Bewerk account",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Toon berichtenbadge voor alle nieuwe berichten", 203 "settings.service.form.indirectMessages" : "Toon berichtenbadge voor alle nieuwe berichten",
193 "settings.service.form.isMutedInfo" : "Indien uitgeschakeld zullen alle meldinggeluiden en afgespeelde audio uitgeschakeld zijn", 204 "settings.service.form.isMutedInfo" : "Indien uitgeschakeld zullen alle meldinggeluiden en afgespeelde audio uitgeschakeld zijn",
194 "settings.service.form.name" : "Naam", 205 "settings.service.form.name" : "Naam",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy instellingen",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "Proxy Host\/IP",
197 "settings.service.form.proxy.info" : "Proxy instellingen worden niet gesynchroniseerd met de Franz servers", 208 "settings.service.form.proxy.info" : "Proxy instellingen worden niet gesynchroniseerd met de Franz servers",
198 "settings.service.form.proxy.isEnabled" : "Proxy gebruiken", 209 "settings.service.form.proxy.isEnabled" : "Proxy gebruiken",
199 "settings.service.form.proxy.password" : "Wachtwoord (optioneel)", 210 "settings.service.form.proxy.password" : "Wachtwoord (optioneel)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Poort",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Start Franz opnieuw na het aanpassen van proxy instellingen.",
202 "settings.service.form.proxy.user" : "Gebruiker (optioneel)", 213 "settings.service.form.proxy.user" : "Gebruiker (optioneel)",
203 "settings.service.form.saveButton" : "Service opslaan", 214 "settings.service.form.saveButton" : "Service opslaan",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Spellingcontrole taal",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Gebruik systeemstandaard ({default})",
206 "settings.service.form.tabHosted" : "Gehost", 217 "settings.service.form.tabHosted" : "Gehost",
207 "settings.service.form.tabOnPremise" : "Zelf-gehost â­ï¸", 218 "settings.service.form.tabOnPremise" : "Zelf-gehost â­ï¸",
208 "settings.service.form.team" : "Team", 219 "settings.service.form.team" : "Team",
@@ -247,7 +258,7 @@
247 "subscription.features.encryptedSync" : "Beveiligde sessie synchronisatie", 258 "subscription.features.encryptedSync" : "Beveiligde sessie synchronisatie",
248 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades", 259 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades",
249 "subscription.features.onpremise" : "Add on-geschikt\/gehoste services zoals HipChat", 260 "subscription.features.onpremise" : "Add on-geschikt\/gehoste services zoals HipChat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "Voeg op-locatie\/gehoste diensten zoals Mattermost toe",
251 "subscription.features.proxy" : "Proxy understeuning voor diensten", 262 "subscription.features.proxy" : "Proxy understeuning voor diensten",
252 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck", 263 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck",
253 "subscription.includedFeatures" : "Betaald Franz Premium Supporter Account bevat", 264 "subscription.includedFeatures" : "Betaald Franz Premium Supporter Account bevat",
@@ -266,7 +277,7 @@
266 "tabs.item.enableAudio" : "Audio inschakelen", 277 "tabs.item.enableAudio" : "Audio inschakelen",
267 "tabs.item.enableNotification" : "Meldingen inschakelen", 278 "tabs.item.enableNotification" : "Meldingen inschakelen",
268 "tabs.item.enableService" : "Service inschakelen", 279 "tabs.item.enableService" : "Service inschakelen",
269 "tabs.item.reload" : "Laad opnieuw", 280 "tabs.item.reload" : "Herladen",
270 "validation.email" : "{field} is niet geldig", 281 "validation.email" : "{field} is niet geldig",
271 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn", 282 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn",
272 "validation.required" : "{field} is vereist", 283 "validation.required" : "{field} is vereist",
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index d45e5ce24..e1a1747b3 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Przeładuj", 2 "app.errorHandler.action" : "Przeładuj",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Coś poszło nie tak",
4 "feature.delayApp.action" : "Uzyskaj licencjÄ™ Franz Supporter", 4 "feature.delayApp.action" : "Uzyskaj licencjÄ™ Franz Supporter",
5 "feature.delayApp.headline" : "Kup licencję Franz Supporter , aby nie czekać", 5 "feature.delayApp.headline" : "Aby nie czekać kup licencję Franz Supporter",
6 "feature.delayApp.text" : "Franz będzie kontynuował za {seconds} sekund.", 6 "feature.delayApp.text" : "Franz będzie kontynuował za {seconds} sekund.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Nie można połączyć się z usługami Franz online", 14 "global.api.unhealthy" : "Nie można połączyć się z usługami Franz online",
8 "global.notConnectedToTheInternet" : "Nie masz połączenia z Internetem.", 15 "global.notConnectedToTheInternet" : "Nie masz połączenia z Internetem.",
16 "global.spellchecker.useDefault" : "Użyj domyślnego dla systemu ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Język słownika",
9 "import.headline" : "Importuj usługi Franz 4", 20 "import.headline" : "Importuj usługi Franz 4",
10 "import.notSupportedHeadline" : "Usługi, które nie są jeszcze obsługiwane w Franz 5", 21 "import.notSupportedHeadline" : "Usługi, które nie są jeszcze obsługiwane w Franz 5",
11 "import.skip.label" : "Chcę dodać usługi samodzielnie", 22 "import.skip.label" : "Chcę dodać usługi samodzielnie",
@@ -25,7 +36,7 @@
25 "login.email.label" : "Adres email", 36 "login.email.label" : "Adres email",
26 "login.headline" : "Zaloguj siÄ™", 37 "login.headline" : "Zaloguj siÄ™",
27 "login.invalidCredentials" : "Adres email lub hasło są błędne", 38 "login.invalidCredentials" : "Adres email lub hasło są błędne",
28 "login.link.password" : "Wyzeruj hasło", 39 "login.link.password" : "Przypomnij hasło",
29 "login.link.signup" : "Załóż darmowe konto", 40 "login.link.signup" : "Załóż darmowe konto",
30 "login.password.label" : "Hasło", 41 "login.password.label" : "Hasło",
31 "login.serverLogout" : "Twoja sesja wygasła, zaloguj się ponownie.", 42 "login.serverLogout" : "Twoja sesja wygasła, zaloguj się ponownie.",
@@ -36,7 +47,7 @@
36 "menu.app.hideOthers" : "Ukryj pozostałe", 47 "menu.app.hideOthers" : "Ukryj pozostałe",
37 "menu.app.quit" : "Zakończ", 48 "menu.app.quit" : "Zakończ",
38 "menu.app.settings" : "Ustawienia", 49 "menu.app.settings" : "Ustawienia",
39 "menu.app.unhide" : "Pokaż", 50 "menu.app.unhide" : "Pokaż więcej",
40 "menu.edit" : "Edytuj", 51 "menu.edit" : "Edytuj",
41 "menu.edit.copy" : "Skopiuj", 52 "menu.edit.copy" : "Skopiuj",
42 "menu.edit.cut" : "Wytnij", 53 "menu.edit.cut" : "Wytnij",
@@ -68,20 +79,20 @@
68 "menu.view.resetZoom" : "Domyślny rozmiar", 79 "menu.view.resetZoom" : "Domyślny rozmiar",
69 "menu.view.toggleDevTools" : "Pokaż narzędzia developerskie", 80 "menu.view.toggleDevTools" : "Pokaż narzędzia developerskie",
70 "menu.view.toggleFullScreen" : "Przełącz tryb pełnoekranowy", 81 "menu.view.toggleFullScreen" : "Przełącz tryb pełnoekranowy",
71 "menu.view.toggleServiceDevTools" : "Włącz narzędzia developerskie serwisu", 82 "menu.view.toggleServiceDevTools" : "Włącz narzędzia developerskie usługi",
72 "menu.view.zoomIn" : "Powiększ", 83 "menu.view.zoomIn" : "Powiększ",
73 "menu.view.zoomOut" : "Pomniejsz", 84 "menu.view.zoomOut" : "Pomniejsz",
74 "menu.window" : "Okno", 85 "menu.window" : "Okno",
75 "menu.window.close" : "Zamknij", 86 "menu.window.close" : "Zamknij",
76 "menu.window.minimize" : "Zminimalizuj", 87 "menu.window.minimize" : "Zminimalizuj",
77 "password.email.label" : "Adres email", 88 "password.email.label" : "Adres email",
78 "password.headline" : "Wyzeruj hasło", 89 "password.headline" : "Przypomnij hasło",
79 "password.link.login" : "Zaloguj siÄ™ na swoje konto", 90 "password.link.login" : "Zaloguj siÄ™ na swoje konto",
80 "password.link.signup" : "Stwórz darmowe konto", 91 "password.link.signup" : "Stwórz darmowe konto",
81 "password.noUser" : "Nie znaleziono użytkownika z takim adresem email", 92 "password.noUser" : "Nie znaleziono użytkownika z takim adresem email",
82 "password.submit.label" : "Wyślij", 93 "password.submit.label" : "Wyślij",
83 "password.successInfo" : "Proszę sprawdzić swój email", 94 "password.successInfo" : "Proszę sprawdzić swój email",
84 "premiumFeature.button.upgradeAccount" : "Upgrade account", 95 "premiumFeature.button.upgradeAccount" : "Ulepsz swoje konto",
85 "pricing.headline" : "Wspieraj Franz", 96 "pricing.headline" : "Wspieraj Franz",
86 "pricing.link.skipPayment" : "Nie chcę wspierać rozwoju aplikacji Franz.", 97 "pricing.link.skipPayment" : "Nie chcę wspierać rozwoju aplikacji Franz.",
87 "pricing.submit.label" : "Chcę wspierać rozwój aplikacji Franz", 98 "pricing.submit.label" : "Chcę wspierać rozwój aplikacji Franz",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "Edytuj {name}", 107 "service.errorHandler.editAction" : "Edytuj {name}",
97 "service.errorHandler.headline" : "O nie!", 108 "service.errorHandler.headline" : "O nie!",
98 "service.errorHandler.message" : "BÅ‚Ä…d", 109 "service.errorHandler.message" : "BÅ‚Ä…d",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "Nie udało się załadować {name}.",
100 "services.getStarted" : "Zacznij", 111 "services.getStarted" : "Zacznij",
101 "services.welcome" : "Witaj w programie Franz", 112 "services.welcome" : "Witaj w programie Franz",
102 "settings.account.account.editButton" : "Modyfikuj konta", 113 "settings.account.account.editButton" : "Modyfikuj konta",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Pokaż ikonę wiadomości dla wszystkich nowych wiadomości", 203 "settings.service.form.indirectMessages" : "Pokaż ikonę wiadomości dla wszystkich nowych wiadomości",
193 "settings.service.form.isMutedInfo" : "Kiedy nieaktywne, wszystkie dźwięki powiadomień są wyciszone", 204 "settings.service.form.isMutedInfo" : "Kiedy nieaktywne, wszystkie dźwięki powiadomień są wyciszone",
194 "settings.service.form.name" : "Nazwa", 205 "settings.service.form.name" : "Nazwa",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "Ustawienia Proxy HTTP\/HTTPS",
196 "settings.service.form.proxy.host" : "Host Proxy\/IP", 207 "settings.service.form.proxy.host" : "Host Proxy\/IP",
197 "settings.service.form.proxy.info" : "Ustawienia proxy nie będą zsynchronizowane z serwerami Franza.", 208 "settings.service.form.proxy.info" : "Ustawienia proxy nie będą zsynchronizowane z serwerami Franza.",
198 "settings.service.form.proxy.isEnabled" : "Użyj Proxy", 209 "settings.service.form.proxy.isEnabled" : "Użyj Proxy",
199 "settings.service.form.proxy.password" : "Hasło (opcjonalnie)", 210 "settings.service.form.proxy.password" : "Hasło (opcjonalnie)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Port",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Uruchom ponownie Franz po zmianie ustawień proxy.",
202 "settings.service.form.proxy.user" : "Użytkownik (opcjonalnie)", 213 "settings.service.form.proxy.user" : "Użytkownik (opcjonalnie)",
203 "settings.service.form.saveButton" : "Zapisz usługę", 214 "settings.service.form.saveButton" : "Zapisz usługę",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Język sprawdzania pisowni",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Użyj domyślnego dla systemu ({default})",
206 "settings.service.form.tabHosted" : "Hostowane", 217 "settings.service.form.tabHosted" : "Hostowane",
207 "settings.service.form.tabOnPremise" : "Hostowane lokalnie â­ï¸", 218 "settings.service.form.tabOnPremise" : "Hostowane lokalnie â­ï¸",
208 "settings.service.form.team" : "Zespół", 219 "settings.service.form.team" : "Zespół",
@@ -245,11 +256,11 @@
245 "subscription.features.ads" : "Brak reklam, na zawsze!", 256 "subscription.features.ads" : "Brak reklam, na zawsze!",
246 "subscription.features.comingSoon" : "wkrótce dostępne", 257 "subscription.features.comingSoon" : "wkrótce dostępne",
247 "subscription.features.encryptedSync" : "Szyfrowana synchronizacja sesji", 258 "subscription.features.encryptedSync" : "Szyfrowana synchronizacja sesji",
248 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 259 "subscription.features.noInterruptions" : "Bez opóźnień i przypominania o ulepszeniu licencji",
249 "subscription.features.onpremise" : "Dodawanie lokalnych\/hostowanych usług takich jak HipChat", 260 "subscription.features.onpremise" : "Dodawanie lokalnych\/hostowanych usług takich jak HipChat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "Dodaj prywatnie hostowane usługi takie jak Mattermost",
251 "subscription.features.proxy" : "Obsługa proxy dla usług", 262 "subscription.features.proxy" : "Obsługa proxy dla usług",
252 "subscription.features.spellchecker" : "Support for spellchecker", 263 "subscription.features.spellchecker" : "Wsparcie dla sprawdzania pisowni",
253 "subscription.includedFeatures" : "PÅ‚atne konto Franz Premium obejmuje", 264 "subscription.includedFeatures" : "PÅ‚atne konto Franz Premium obejmuje",
254 "subscription.paymentSessionError" : "Nie można wczytać formularza płatności\"", 265 "subscription.paymentSessionError" : "Nie można wczytać formularza płatności\"",
255 "subscription.submit.label" : "Chcę wspierać rozwój aplikacji Franz", 266 "subscription.submit.label" : "Chcę wspierać rozwój aplikacji Franz",
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index c0cf0039f..0ab5bdd21 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Recarregar", 2 "app.errorHandler.action" : "Recarregar",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Alguma coisa deu errado",
4 "feature.delayApp.action" : "Adquira uma licença Franz Supporter", 4 "feature.delayApp.action" : "Adquira uma licença Franz Supporter",
5 "feature.delayApp.headline" : "Por favor, adquira uma licença Franz Supporter para pular o tempo de espera", 5 "feature.delayApp.headline" : "Por favor, adquira uma licença Franz Supporter para pular o tempo de espera",
6 "feature.delayApp.text" : "Franz continuará em {seconds} segundos.", 6 "feature.delayApp.text" : "Franz continuará em {seconds} segundos.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.", 14 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.",
8 "global.notConnectedToTheInternet" : "Você não está conectado à internet", 15 "global.notConnectedToTheInternet" : "Você não está conectado à internet",
16 "global.spellchecker.useDefault" : "Use o padrão do sistema ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Idioma de verificação ortográfica",
9 "import.headline" : "Importe seus serviços do Franz 4 ", 20 "import.headline" : "Importe seus serviços do Franz 4 ",
10 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5 ", 21 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5 ",
11 "import.skip.label" : "Quero adicionar serviços manualmente", 22 "import.skip.label" : "Quero adicionar serviços manualmente",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "Editar {name}", 107 "service.errorHandler.editAction" : "Editar {name}",
97 "service.errorHandler.headline" : "Ah, não!", 108 "service.errorHandler.headline" : "Ah, não!",
98 "service.errorHandler.message" : "Erro", 109 "service.errorHandler.message" : "Erro",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} não pôde ser carregado.",
100 "services.getStarted" : "Iniciar", 111 "services.getStarted" : "Iniciar",
101 "services.welcome" : "Bem-vindo ao Franz!", 112 "services.welcome" : "Bem-vindo ao Franz!",
102 "settings.account.account.editButton" : "Editar conta", 113 "settings.account.account.editButton" : "Editar conta",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Mostrar avisos para todas as mensagens", 203 "settings.service.form.indirectMessages" : "Mostrar avisos para todas as mensagens",
193 "settings.service.form.isMutedInfo" : "Quando desativado, as notificações sonoras e áudios ficarão em silêncio", 204 "settings.service.form.isMutedInfo" : "Quando desativado, as notificações sonoras e áudios ficarão em silêncio",
194 "settings.service.form.name" : "Nome", 205 "settings.service.form.name" : "Nome",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "Configurações de HTTP\/HTTPS Proxy",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "Proxy Host\/IP",
197 "settings.service.form.proxy.info" : "As configurações de proxy não serão sincronizadas com os servidores do Franz.", 208 "settings.service.form.proxy.info" : "As configurações de proxy não serão sincronizadas com os servidores do Franz.",
198 "settings.service.form.proxy.isEnabled" : "Usar o Proxy", 209 "settings.service.form.proxy.isEnabled" : "Usar o Proxy",
199 "settings.service.form.proxy.password" : "Senha (opcional)", 210 "settings.service.form.proxy.password" : "Senha (opcional)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Porta",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Por favor, reinicie o Franz após alterar as configurações de proxy.",
202 "settings.service.form.proxy.user" : "Usuário (opcional)", 213 "settings.service.form.proxy.user" : "Usuário (opcional)",
203 "settings.service.form.saveButton" : "Salvar serviço", 214 "settings.service.form.saveButton" : "Salvar serviço",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Língua do corretor ortográfico",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Use o padrão do sistema ({default})",
206 "settings.service.form.tabHosted" : "Hospedado", 217 "settings.service.form.tabHosted" : "Hospedado",
207 "settings.service.form.tabOnPremise" : "Auto-hospedado â­ï¸", 218 "settings.service.form.tabOnPremise" : "Auto-hospedado â­ï¸",
208 "settings.service.form.team" : "Equipe", 219 "settings.service.form.team" : "Equipe",
@@ -245,9 +256,9 @@
245 "subscription.features.ads" : "Sem anúncios, pra sempre!", 256 "subscription.features.ads" : "Sem anúncios, pra sempre!",
246 "subscription.features.comingSoon" : "em breve", 257 "subscription.features.comingSoon" : "em breve",
247 "subscription.features.encryptedSync" : "Sincronização encriptada das sessões", 258 "subscription.features.encryptedSync" : "Sincronização encriptada das sessões",
248 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 259 "subscription.features.noInterruptions" : "Sem demora e sem chateação para comprar uma licença. ",
249 "subscription.features.onpremise" : "Adicionar serviços locais\/hospedados como o HipChat", 260 "subscription.features.onpremise" : "Adicionar serviços locais\/hospedados como o HipChat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "Adicionar serviços locais\/hospedados como o Mattermost",
251 "subscription.features.proxy" : "Suporte de proxy para serviços", 262 "subscription.features.proxy" : "Suporte de proxy para serviços",
252 "subscription.features.spellchecker" : "Suporte para corretor ortográfico", 263 "subscription.features.spellchecker" : "Suporte para corretor ortográfico",
253 "subscription.includedFeatures" : "A conta Apoiador Franz Premium inclui", 264 "subscription.includedFeatures" : "A conta Apoiador Franz Premium inclui",
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index 80e8094f5..9e7455bdf 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -1,14 +1,25 @@
1{ 1{
2 "app.errorHandler.action" : "Recarregar", 2 "app.errorHandler.action" : "Recarregar",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Alguma coisa correu mal",
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Faz parte do grupo de apoio do Franz",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Por favor compre uma licença Franz Supporter para saltar a fila de espera",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz irá continuar em {seconds} segundos.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Não foi possível estabelecer ligação aos serviços do Franz", 14 "global.api.unhealthy" : "Não foi possível estabelecer ligação aos serviços do Franz",
8 "global.notConnectedToTheInternet" : "Não existe ligação à Internet", 15 "global.notConnectedToTheInternet" : "Não estás ligado à Internet",
9 "import.headline" : "Importe os seus serviços do Franz 4", 16 "global.spellchecker.useDefault" : "Utilizar o Sistema por Omissão ({default})",
10 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5", 17 "global.spellchecking.autodetect" : "Detect language automatically",
11 "import.skip.label" : "Pretendo adicionar serviços manualmente", 18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Linguagem para correção ortográfica",
20 "import.headline" : "Importa os teus serviços do Franz",
21 "import.notSupportedHeadline" : "Estes serviços ainda não são suportados pelo Franz 5",
22 "import.skip.label" : "Eu quero adicionar serviços manualmente",
12 "import.submit.label" : "Importar serviços", 23 "import.submit.label" : "Importar serviços",
13 "infobar.buttonChangelog" : "O que há de novo?", 24 "infobar.buttonChangelog" : "O que há de novo?",
14 "infobar.buttonInstallUpdate" : "Reiniciar e instalar atualizações", 25 "infobar.buttonInstallUpdate" : "Reiniciar e instalar atualizações",
@@ -66,7 +77,7 @@
66 "menu.view.reloadFranz" : "Recarregar Franz", 77 "menu.view.reloadFranz" : "Recarregar Franz",
67 "menu.view.reloadService" : "Recarregar serviço", 78 "menu.view.reloadService" : "Recarregar serviço",
68 "menu.view.resetZoom" : "Tamanho Real", 79 "menu.view.resetZoom" : "Tamanho Real",
69 "menu.view.toggleDevTools" : "Activar\/Desativar Ferramentas de Desenvolvimento", 80 "menu.view.toggleDevTools" : "Ativar\/Desativar Ferramentas de Desenvolvimento",
70 "menu.view.toggleFullScreen" : "Ativar\/Desativar Ecrã Completo", 81 "menu.view.toggleFullScreen" : "Ativar\/Desativar Ecrã Completo",
71 "menu.view.toggleServiceDevTools" : "Ativar\/Desativar Ferramentas de Desenvolvimento de Serviços", 82 "menu.view.toggleServiceDevTools" : "Ativar\/Desativar Ferramentas de Desenvolvimento de Serviços",
72 "menu.view.zoomIn" : "Aumentar", 83 "menu.view.zoomIn" : "Aumentar",
@@ -81,7 +92,7 @@
81 "password.noUser" : "Não existe nenhuma conta associada a esse endereço de e-mail", 92 "password.noUser" : "Não existe nenhuma conta associada a esse endereço de e-mail",
82 "password.submit.label" : "Submeter", 93 "password.submit.label" : "Submeter",
83 "password.successInfo" : "Por favor verifique o seu endereço de e-mail", 94 "password.successInfo" : "Por favor verifique o seu endereço de e-mail",
84 "premiumFeature.button.upgradeAccount" : "Upgrade account", 95 "premiumFeature.button.upgradeAccount" : "Atualiza a tua conta",
85 "pricing.headline" : "Apoie o Franz", 96 "pricing.headline" : "Apoie o Franz",
86 "pricing.link.skipPayment" : "Não pretendo patrocinar o desenvolvimento do Franz", 97 "pricing.link.skipPayment" : "Não pretendo patrocinar o desenvolvimento do Franz",
87 "pricing.submit.label" : "Pretendo patrocinar o desenvolvimento do Franz", 98 "pricing.submit.label" : "Pretendo patrocinar o desenvolvimento do Franz",
@@ -96,11 +107,11 @@
96 "service.errorHandler.editAction" : "Editar {name}", 107 "service.errorHandler.editAction" : "Editar {name}",
97 "service.errorHandler.headline" : "Oh não!", 108 "service.errorHandler.headline" : "Oh não!",
98 "service.errorHandler.message" : "Erro", 109 "service.errorHandler.message" : "Erro",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} falhou o carregamento",
100 "services.getStarted" : "Vamos começar", 111 "services.getStarted" : "Vamos começar",
101 "services.welcome" : "Bem-vindo ao Franz", 112 "services.welcome" : "Bem-vindo ao Franz",
102 "settings.account.account.editButton" : "Editar conta", 113 "settings.account.account.editButton" : "Editar conta",
103 "settings.account.accountType.basic" : "Conta básica", 114 "settings.account.accountType.basic" : "Conta Básica",
104 "settings.account.accountType.premium" : "Conta Premium", 115 "settings.account.accountType.premium" : "Conta Premium",
105 "settings.account.buttonSave" : "Atualizar o perfil", 116 "settings.account.buttonSave" : "Atualizar o perfil",
106 "settings.account.deleteAccount" : "Apagar conta", 117 "settings.account.deleteAccount" : "Apagar conta",
@@ -127,7 +138,7 @@
127 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano", 138 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano",
128 "settings.app.form.autoLaunchOnStart" : "Iniciar o Franz após iniciar o computador", 139 "settings.app.form.autoLaunchOnStart" : "Iniciar o Franz após iniciar o computador",
129 "settings.app.form.beta" : "Incluir versões instáveis (beta)", 140 "settings.app.form.beta" : "Incluir versões instáveis (beta)",
130 "settings.app.form.darkMode" : "Join the Dark Side", 141 "settings.app.form.darkMode" : "Junta-te ao Lado Negro",
131 "settings.app.form.enableGPUAcceleration" : "Activar Aceleração de GPU", 142 "settings.app.form.enableGPUAcceleration" : "Activar Aceleração de GPU",
132 "settings.app.form.enableMenuBar" : "Mostrar Franz na Barra de Menu", 143 "settings.app.form.enableMenuBar" : "Mostrar Franz na Barra de Menu",
133 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica", 144 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica",
@@ -138,7 +149,7 @@
138 "settings.app.form.runInBackground" : "Manter o Franz em segundo plano ao fechar a janela", 149 "settings.app.form.runInBackground" : "Manter o Franz em segundo plano ao fechar a janela",
139 "settings.app.form.showDisabledServices" : "Apresentar separadores de serviços desativados", 150 "settings.app.form.showDisabledServices" : "Apresentar separadores de serviços desativados",
140 "settings.app.form.showMessagesBadgesWhenMuted" : "Apresentar emblema com o número de mensagens não lidas quando as notificações estão desativadas", 151 "settings.app.form.showMessagesBadgesWhenMuted" : "Apresentar emblema com o número de mensagens não lidas quando as notificações estão desativadas",
141 "settings.app.form.spellcheckerLanguage" : "Spell checking language", 152 "settings.app.form.spellcheckerLanguage" : "Linguagem para correção ortográfica",
142 "settings.app.headline" : "Definições", 153 "settings.app.headline" : "Definições",
143 "settings.app.headlineAdvanced" : "Avançado", 154 "settings.app.headlineAdvanced" : "Avançado",
144 "settings.app.headlineAppearance" : "Aparência", 155 "settings.app.headlineAppearance" : "Aparência",
@@ -151,10 +162,10 @@
151 "settings.app.updateStatusAvailable" : "Atualização disponivel, a transferir...", 162 "settings.app.updateStatusAvailable" : "Atualização disponivel, a transferir...",
152 "settings.app.updateStatusSearching" : "A procurar atualizações", 163 "settings.app.updateStatusSearching" : "A procurar atualizações",
153 "settings.app.updateStatusUpToDate" : "Está a usar a versão mais recente do Franz", 164 "settings.app.updateStatusUpToDate" : "Está a usar a versão mais recente do Franz",
154 "settings.invite.headline" : "Convide amigos", 165 "settings.invite.headline" : "Convide Amigos",
155 "settings.navigation.account" : "Conta", 166 "settings.navigation.account" : "Conta",
156 "settings.navigation.availableServices" : "Serviços disponíveis", 167 "settings.navigation.availableServices" : "Serviços disponíveis",
157 "settings.navigation.inviteFriends" : "Convide amigos", 168 "settings.navigation.inviteFriends" : "Convide Amigos",
158 "settings.navigation.logout" : "Terminar sessão", 169 "settings.navigation.logout" : "Terminar sessão",
159 "settings.navigation.settings" : "Definições", 170 "settings.navigation.settings" : "Definições",
160 "settings.navigation.yourServices" : "Os seus serviços", 171 "settings.navigation.yourServices" : "Os seus serviços",
@@ -163,9 +174,9 @@
163 "settings.recipes.headline" : "Serviços disponíveis", 174 "settings.recipes.headline" : "Serviços disponíveis",
164 "settings.recipes.missingService" : "Falta um serviço?", 175 "settings.recipes.missingService" : "Falta um serviço?",
165 "settings.recipes.mostPopular" : "Os mais populares", 176 "settings.recipes.mostPopular" : "Os mais populares",
166 "settings.recipes.nothingFound" : "Lamentamos, nenhum serviço corresponde ao pesquisado.", 177 "settings.recipes.nothingFound" : "Lamentamos, nenhum serviço corresponde ao termo pesquisado.",
167 "settings.recipes.servicesSuccessfulAddedInfo" : "Serviço adicionado", 178 "settings.recipes.servicesSuccessfulAddedInfo" : "Serviço adicionado com sucesso",
168 "settings.searchService" : "Pesquisa de serviço", 179 "settings.searchService" : "Pesquisar erviço",
169 "settings.service.error.goBack" : "Voltar aos serviços", 180 "settings.service.error.goBack" : "Voltar aos serviços",
170 "settings.service.error.headline" : "Erro", 181 "settings.service.error.headline" : "Erro",
171 "settings.service.error.message" : "Não foi possível carregar a receita do serviço.", 182 "settings.service.error.message" : "Não foi possível carregar a receita do serviço.",
@@ -179,30 +190,30 @@
179 "settings.service.form.editServiceHeadline" : "Editar {name}", 190 "settings.service.form.editServiceHeadline" : "Editar {name}",
180 "settings.service.form.enableAudio" : "Ativar áudio", 191 "settings.service.form.enableAudio" : "Ativar áudio",
181 "settings.service.form.enableBadge" : "Mostrar emblemas de mensagens não lidas", 192 "settings.service.form.enableBadge" : "Mostrar emblemas de mensagens não lidas",
182 "settings.service.form.enableDarkMode" : "Enable Dark Mode", 193 "settings.service.form.enableDarkMode" : "Ativar o Tema Escuro",
183 "settings.service.form.enableNotification" : "Ativar notificações", 194 "settings.service.form.enableNotification" : "Ativar notificações",
184 "settings.service.form.enableService" : "Ativar serviço", 195 "settings.service.form.enableService" : "Ativar serviço",
185 "settings.service.form.headlineBadges" : "Emblema de mensagem não lida", 196 "settings.service.form.headlineBadges" : "Emblema de mensagem não lida",
186 "settings.service.form.headlineGeneral" : "Geral", 197 "settings.service.form.headlineGeneral" : "Geral",
187 "settings.service.form.headlineNotifications" : "Notificações", 198 "settings.service.form.headlineNotifications" : "Notificações",
188 "settings.service.form.icon" : "Personalizar ícone", 199 "settings.service.form.icon" : "Ãcone personalizado",
189 "settings.service.form.iconDelete" : "Apagar", 200 "settings.service.form.iconDelete" : "Apagar",
190 "settings.service.form.iconUpload" : "Arraste a sua imagem, ou clique aqui", 201 "settings.service.form.iconUpload" : "Arraste a sua imagem, ou clique aqui",
191 "settings.service.form.indirectMessageInfo" : "Será notificado sobre todas as novas mensagens num canal, não apenas @username, @channel, @here, ...", 202 "settings.service.form.indirectMessageInfo" : "Será notificado sobre todas as novas mensagens num canal, não apenas @username, @channel, @here, ...",
192 "settings.service.form.indirectMessages" : "Mostrar o emblema da mensagem para todas as novas mensagens", 203 "settings.service.form.indirectMessages" : "Mostrar o emblema da mensagem para todas as novas mensagens",
193 "settings.service.form.isMutedInfo" : "Quando desativado, todos sons e reproduções de áudio serão silenciados", 204 "settings.service.form.isMutedInfo" : "Quando desativado, todos sons e reproduções de áudio serão silenciados",
194 "settings.service.form.name" : "Nome", 205 "settings.service.form.name" : "Nome",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "Definições HTTP\/HTTPS Proxy",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "Host\/IP proxy",
197 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.", 208 "settings.service.form.proxy.info" : "As definições do proxy não serão guardadas nos servidores do Franz.",
198 "settings.service.form.proxy.isEnabled" : "Use Proxy", 209 "settings.service.form.proxy.isEnabled" : "Usar Proxy",
199 "settings.service.form.proxy.password" : "Password (optional)", 210 "settings.service.form.proxy.password" : "Palavra-chave (opcional)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Porta",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Reinicie, por favor, após atualizar as definições do Franz",
202 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "Utilizador (opcional)",
203 "settings.service.form.saveButton" : "Guardar serviço", 214 "settings.service.form.saveButton" : "Guardar serviço",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Linguagem de correção ortográfica",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Utilizar o Sistema por Omissão ({default})",
206 "settings.service.form.tabHosted" : "Com domínio", 217 "settings.service.form.tabHosted" : "Com domínio",
207 "settings.service.form.tabOnPremise" : "Com domínio próprio â­ï¸", 218 "settings.service.form.tabOnPremise" : "Com domínio próprio â­ï¸",
208 "settings.service.form.team" : "Equipa", 219 "settings.service.form.team" : "Equipa",
@@ -211,7 +222,7 @@
211 "settings.services.deletedInfo" : "O serviço foi apagado", 222 "settings.services.deletedInfo" : "O serviço foi apagado",
212 "settings.services.discoverServices" : "Descobrir serviços", 223 "settings.services.discoverServices" : "Descobrir serviços",
213 "settings.services.headline" : "Os seus serviços", 224 "settings.services.headline" : "Os seus serviços",
214 "settings.services.noServicesAdded" : "Ainda não adicionou um serviço.", 225 "settings.services.noServicesAdded" : "Ainda não adicionou nenhum serviço.",
215 "settings.services.tooltip.isDisabled" : "O serviço está desativado", 226 "settings.services.tooltip.isDisabled" : "O serviço está desativado",
216 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados", 227 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados",
217 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desativadas", 228 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desativadas",
@@ -245,11 +256,11 @@
245 "subscription.features.ads" : "Sem anúncios, para sempre!", 256 "subscription.features.ads" : "Sem anúncios, para sempre!",
246 "subscription.features.comingSoon" : "em breve", 257 "subscription.features.comingSoon" : "em breve",
247 "subscription.features.encryptedSync" : "Sincronização encriptada de sessão", 258 "subscription.features.encryptedSync" : "Sincronização encriptada de sessão",
248 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 259 "subscription.features.noInterruptions" : "Sem atrasos na aplicação nem mensagens para comprar uma licença",
249 "subscription.features.onpremise" : "Adicionar serviços 'on-premise'\/hosted como o HipChat", 260 "subscription.features.onpremise" : "Adicionar serviços 'on-premise'\/hosted como o HipChat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "Adicione serviços como Mattermost no local ou online",
251 "subscription.features.proxy" : "Proxy support for services", 262 "subscription.features.proxy" : "Suporte Proxy para os serviços",
252 "subscription.features.spellchecker" : "Support for spellchecker", 263 "subscription.features.spellchecker" : "Suporte para correção ortográfica",
253 "subscription.includedFeatures" : "Ao subscrever uma Conta Premium, tem acesso a", 264 "subscription.includedFeatures" : "Ao subscrever uma Conta Premium, tem acesso a",
254 "subscription.paymentSessionError" : "Erro no serviço de pagamento", 265 "subscription.paymentSessionError" : "Erro no serviço de pagamento",
255 "subscription.submit.label" : "Pretendo ajudar o desenvolvimento do Franz", 266 "subscription.submit.label" : "Pretendo ajudar o desenvolvimento do Franz",
@@ -268,7 +279,7 @@
268 "tabs.item.enableService" : "Ativar serviço", 279 "tabs.item.enableService" : "Ativar serviço",
269 "tabs.item.reload" : "Recarregar", 280 "tabs.item.reload" : "Recarregar",
270 "validation.email" : "{field} não é válido", 281 "validation.email" : "{field} não é válido",
271 "validation.minLength" : "{field} deveria ter pelo menos {comprimento} caracteres", 282 "validation.minLength" : "{field} deveria ter pelo menos {length} caracteres",
272 "validation.required" : "{field} é obrigatório", 283 "validation.required" : "{field} é obrigatório",
273 "validation.url" : "{field} não é uma hiperligação válida", 284 "validation.url" : "{field} não é uma hiperligação válida",
274 "welcome.loginButton" : "Iniciar sessão", 285 "welcome.loginButton" : "Iniciar sessão",
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index b605afc4d..6098c8ad9 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "Перезагрузить", 2 "app.errorHandler.action" : "Перезагрузить",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Что-то пошло не так",
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Получите лицензию Franz Supporter",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "ПожалуйÑта приобретите лицензию Franz Supporter чтобы отменить ожидание",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz продолжит работу через {seconds} Ñекунд.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Ðевозможно подключитьÑÑ Ðº онлайн-ÑервиÑам Franz", 14 "global.api.unhealthy" : "Ðевозможно подключитьÑÑ Ðº онлайн-ÑервиÑам Franz",
8 "global.notConnectedToTheInternet" : "Ð’Ñ‹ не подключены к Ñети Интернет", 15 "global.notConnectedToTheInternet" : "Ð’Ñ‹ не подключены к Ñети Интернет",
16 "global.spellchecker.useDefault" : "ИÑпользовать ÑиÑтемные параметры по умолчанию ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Проверка правопиÑаниÑ",
9 "import.headline" : "Импортировать ваши ÑервиÑÑ‹ из Franz 4", 20 "import.headline" : "Импортировать ваши ÑервиÑÑ‹ из Franz 4",
10 "import.notSupportedHeadline" : "СервиÑÑ‹ пока ещё не поддерживаютÑÑ Ð² Franz 5", 21 "import.notSupportedHeadline" : "СервиÑÑ‹ пока ещё не поддерживаютÑÑ Ð² Franz 5",
11 "import.skip.label" : "Я хочу добавить ÑервиÑÑ‹ вручную", 22 "import.skip.label" : "Я хочу добавить ÑервиÑÑ‹ вручную",
@@ -58,7 +69,7 @@
58 "menu.help.privacy" : "Политика конфиденциальноÑти", 69 "menu.help.privacy" : "Политика конфиденциальноÑти",
59 "menu.help.support" : "Поддержка", 70 "menu.help.support" : "Поддержка",
60 "menu.help.tos" : "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑпользованиÑ", 71 "menu.help.tos" : "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑпользованиÑ",
61 "menu.services" : "СлуÐбы", 72 "menu.services" : "СеÑвиÑÑ‹",
62 "menu.services.addNewService" : "Добавить новый ÑервиÑ...", 73 "menu.services.addNewService" : "Добавить новый ÑервиÑ...",
63 "menu.view" : "Вид", 74 "menu.view" : "Вид",
64 "menu.view.enterFullScreen" : "Ðа веÑÑŒ Ñкран", 75 "menu.view.enterFullScreen" : "Ðа веÑÑŒ Ñкран",
@@ -81,7 +92,7 @@
81 "password.noUser" : "Ðе найдено Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ адреÑом Ñлектронной почты", 92 "password.noUser" : "Ðе найдено Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ адреÑом Ñлектронной почты",
82 "password.submit.label" : "ПринÑÑ‚ÑŒ", 93 "password.submit.label" : "ПринÑÑ‚ÑŒ",
83 "password.successInfo" : "Проверьте вашу Ñлектронную почту", 94 "password.successInfo" : "Проверьте вашу Ñлектронную почту",
84 "premiumFeature.button.upgradeAccount" : "Upgrade account", 95 "premiumFeature.button.upgradeAccount" : "Перейти на платную подпиÑку",
85 "pricing.headline" : "Поддержать Franz", 96 "pricing.headline" : "Поддержать Franz",
86 "pricing.link.skipPayment" : "Я не хочу поддерживать разработку Franz.", 97 "pricing.link.skipPayment" : "Я не хочу поддерживать разработку Franz.",
87 "pricing.submit.label" : "Я хочу поддержать разработку Franz", 98 "pricing.submit.label" : "Я хочу поддержать разработку Franz",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "Редактирование {name}", 107 "service.errorHandler.editAction" : "Редактирование {name}",
97 "service.errorHandler.headline" : "О, нет!", 108 "service.errorHandler.headline" : "О, нет!",
98 "service.errorHandler.message" : "Ошибка", 109 "service.errorHandler.message" : "Ошибка",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} не Ñмог загрузитьÑÑ.",
100 "services.getStarted" : "Ðачать работу", 111 "services.getStarted" : "Ðачать работу",
101 "services.welcome" : "Добро пожаловать во Franz", 112 "services.welcome" : "Добро пожаловать во Franz",
102 "settings.account.account.editButton" : "Редактировать аккаунт", 113 "settings.account.account.editButton" : "Редактировать аккаунт",
@@ -127,7 +138,7 @@
127 "settings.app.form.autoLaunchInBackground" : "Открывать в фоне", 138 "settings.app.form.autoLaunchInBackground" : "Открывать в фоне",
128 "settings.app.form.autoLaunchOnStart" : "ЗапуÑкать Franz при Ñтарте", 139 "settings.app.form.autoLaunchOnStart" : "ЗапуÑкать Franz при Ñтарте",
129 "settings.app.form.beta" : "Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð±ÐµÑ‚Ð° верÑии", 140 "settings.app.form.beta" : "Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð±ÐµÑ‚Ð° верÑии",
130 "settings.app.form.darkMode" : "Join the Dark Side", 141 "settings.app.form.darkMode" : "Перейти на Тёмную Ñторону",
131 "settings.app.form.enableGPUAcceleration" : "Включить уÑкорение GPU", 142 "settings.app.form.enableGPUAcceleration" : "Включить уÑкорение GPU",
132 "settings.app.form.enableMenuBar" : "Показывать Franz на панели меню", 143 "settings.app.form.enableMenuBar" : "Показывать Franz на панели меню",
133 "settings.app.form.enableSpellchecking" : "Включить проверку правопиÑаниÑ", 144 "settings.app.form.enableSpellchecking" : "Включить проверку правопиÑаниÑ",
@@ -138,7 +149,7 @@
138 "settings.app.form.runInBackground" : "ОÑтавлÑÑ‚ÑŒ Franz в фоне при закрытии окна", 149 "settings.app.form.runInBackground" : "ОÑтавлÑÑ‚ÑŒ Franz в фоне при закрытии окна",
139 "settings.app.form.showDisabledServices" : "Показывать вкладки отключённых Ñлужб", 150 "settings.app.form.showDisabledServices" : "Показывать вкладки отключённых Ñлужб",
140 "settings.app.form.showMessagesBadgesWhenMuted" : "Показывать значок непрочитанного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ отключённых уведомлениÑÑ…", 151 "settings.app.form.showMessagesBadgesWhenMuted" : "Показывать значок непрочитанного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ отключённых уведомлениÑÑ…",
141 "settings.app.form.spellcheckerLanguage" : "Spell checking language", 152 "settings.app.form.spellcheckerLanguage" : "Проверка правопиÑаниÑ",
142 "settings.app.headline" : "ÐаÑтройки", 153 "settings.app.headline" : "ÐаÑтройки",
143 "settings.app.headlineAdvanced" : "Дополнительно", 154 "settings.app.headlineAdvanced" : "Дополнительно",
144 "settings.app.headlineAppearance" : "Внешний вид", 155 "settings.app.headlineAppearance" : "Внешний вид",
@@ -176,10 +187,10 @@
176 "settings.service.form.customUrlUpgradeAccount" : "Улучшить ваш аккаунт", 187 "settings.service.form.customUrlUpgradeAccount" : "Улучшить ваш аккаунт",
177 "settings.service.form.customUrlValidationError" : "Ðевозможно проверить Ñервер {name}.", 188 "settings.service.form.customUrlValidationError" : "Ðевозможно проверить Ñервер {name}.",
178 "settings.service.form.deleteButton" : "Удалить ÑервиÑ", 189 "settings.service.form.deleteButton" : "Удалить ÑервиÑ",
179 "settings.service.form.editServiceHeadline" : "Редактирование {name}", 190 "settings.service.form.editServiceHeadline" : "Редактировать {name}",
180 "settings.service.form.enableAudio" : "Включить звук", 191 "settings.service.form.enableAudio" : "Включить звук",
181 "settings.service.form.enableBadge" : "Показывать иконку непрочитанных Ñообщений", 192 "settings.service.form.enableBadge" : "Показывать иконку непрочитанных Ñообщений",
182 "settings.service.form.enableDarkMode" : "Enable Dark Mode", 193 "settings.service.form.enableDarkMode" : "Включить Тёмный режим",
183 "settings.service.form.enableNotification" : "Включить уведомлениÑ", 194 "settings.service.form.enableNotification" : "Включить уведомлениÑ",
184 "settings.service.form.enableService" : "Включить ÑервиÑ", 195 "settings.service.form.enableService" : "Включить ÑервиÑ",
185 "settings.service.form.headlineBadges" : "Значки непрочитанных Ñообщений", 196 "settings.service.form.headlineBadges" : "Значки непрочитанных Ñообщений",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Показывать значок уведомлений Ð´Ð»Ñ Ð²Ñех новых Ñообщений", 203 "settings.service.form.indirectMessages" : "Показывать значок уведомлений Ð´Ð»Ñ Ð²Ñех новых Ñообщений",
193 "settings.service.form.isMutedInfo" : "Когда выключено, вÑе звуковые ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отключены", 204 "settings.service.form.isMutedInfo" : "Когда выключено, вÑе звуковые ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отключены",
194 "settings.service.form.name" : "Ðазвание", 205 "settings.service.form.name" : "Ðазвание",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "ÐаÑтройки ПрокÑи HTTP\/HTTPS",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "ПрокÑи Host\/IP",
197 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.", 208 "settings.service.form.proxy.info" : "ÐаÑтройки прокÑи не будут Ñинхронизированны Ñ Ñерверами Franz",
198 "settings.service.form.proxy.isEnabled" : "Use Proxy", 209 "settings.service.form.proxy.isEnabled" : "ИÑпользовать прокÑи",
199 "settings.service.form.proxy.password" : "Password (optional)", 210 "settings.service.form.proxy.password" : "Пароль (опционально)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Порт",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "ПожалуйÑта перезапуÑтите Franz поÑле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек прокÑи.",
202 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "Пользователь (опционально)",
203 "settings.service.form.saveButton" : "Сохранить ÑервиÑ", 214 "settings.service.form.saveButton" : "Сохранить ÑервиÑ",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Проверка правопиÑаниÑ",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "ИÑпользовать ÑиÑтемные параметры по умолчанию ({default})",
206 "settings.service.form.tabHosted" : "Размещено", 217 "settings.service.form.tabHosted" : "Размещено",
207 "settings.service.form.tabOnPremise" : "Свой хоÑтинг â­ï¸", 218 "settings.service.form.tabOnPremise" : "Свой хоÑтинг â­ï¸",
208 "settings.service.form.team" : "Команда", 219 "settings.service.form.team" : "Команда",
@@ -245,11 +256,11 @@
245 "subscription.features.ads" : "Без рекламы, навÑегда!", 256 "subscription.features.ads" : "Без рекламы, навÑегда!",
246 "subscription.features.comingSoon" : "Ñкоро", 257 "subscription.features.comingSoon" : "Ñкоро",
247 "subscription.features.encryptedSync" : "Зашифрованные ÑеÑÑии Ñинхронизации", 258 "subscription.features.encryptedSync" : "Зашифрованные ÑеÑÑии Ñинхронизации",
248 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 259 "subscription.features.noInterruptions" : "Ðикаких задержек и предложений перейти на платную верÑию",
249 "subscription.features.onpremise" : "Добавление облачных Ñлужб или Ñлужб на Ñвоём хоÑтинге типа HipChat", 260 "subscription.features.onpremise" : "Добавление облачных Ñлужб или Ñлужб на Ñвоём хоÑтинге типа HipChat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "Локальные\/размещенные на хоÑтинге ÑервиÑÑ‹, такие как Mattermost",
251 "subscription.features.proxy" : "Proxy support for services", 262 "subscription.features.proxy" : "Подержка прокÑи Ð´Ð»Ñ ÑервиÑов",
252 "subscription.features.spellchecker" : "Support for spellchecker", 263 "subscription.features.spellchecker" : "Поддержка проверки правопиÑаниÑ",
253 "subscription.includedFeatures" : "Платный премиум аккаунт Franz включает", 264 "subscription.includedFeatures" : "Платный премиум аккаунт Franz включает",
254 "subscription.paymentSessionError" : "Ðевозможно загрузить форму оплаты", 265 "subscription.paymentSessionError" : "Ðевозможно загрузить форму оплаты",
255 "subscription.submit.label" : "Я хочу поддержать разработку Franz", 266 "subscription.submit.label" : "Я хочу поддержать разработку Franz",
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index ca7335fe9..35c699322 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -4,8 +4,19 @@
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Get a Franz Supporter License",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Nedá sa pripojiť k online službám Franz", 14 "global.api.unhealthy" : "Nedá sa pripojiť k online službám Franz",
8 "global.notConnectedToTheInternet" : "Nie ste pripojení k internetu.", 15 "global.notConnectedToTheInternet" : "Nie ste pripojení k internetu.",
16 "global.spellchecker.useDefault" : "Use System Default ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Spell checking language",
9 "import.headline" : "Importovať vaše služby z Franz 4", 20 "import.headline" : "Importovať vaše služby z Franz 4",
10 "import.notSupportedHeadline" : "Služby zatiaľ nie sú podporované vo verzii Franz 5", 21 "import.notSupportedHeadline" : "Služby zatiaľ nie sú podporované vo verzii Franz 5",
11 "import.skip.label" : "Chcem pridaÅ¥ služby ruÄne", 22 "import.skip.label" : "Chcem pridaÅ¥ služby ruÄne",
diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json
index df0b849c4..8ffc0c007 100644
--- a/src/i18n/locales/sr.json
+++ b/src/i18n/locales/sr.json
@@ -4,8 +4,19 @@
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Get a Franz Supporter License",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
7 "global.api.unhealthy" : "Nije moguće pristupiti Franz-ovim on-line servisima. ", 14 "global.api.unhealthy" : "Nije moguće pristupiti Franz-ovim on-line servisima. ",
8 "global.notConnectedToTheInternet" : "Niste povezani sa serverom.", 15 "global.notConnectedToTheInternet" : "Niste povezani sa serverom.",
16 "global.spellchecker.useDefault" : "Use System Default ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Spell checking language",
9 "import.headline" : "Uvezite svoje Franz 4 servise", 20 "import.headline" : "Uvezite svoje Franz 4 servise",
10 "import.notSupportedHeadline" : "Servis trenutno nije podržan u Franz 5", 21 "import.notSupportedHeadline" : "Servis trenutno nije podržan u Franz 5",
11 "import.skip.label" : "Желим да додам уÑлуге ручно", 22 "import.skip.label" : "Желим да додам уÑлуге ручно",
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index 9e7619454..70632b966 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -1,13 +1,24 @@
1{ 1{
2 "app.errorHandler.action" : "Yeniden Yükle", 2 "app.errorHandler.action" : "Tekrar Yükle",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "Bir terslik çıktı",
4 "feature.delayApp.action" : "Franz Destek Lisansı'nı alın.", 4 "feature.delayApp.action" : "Franz Destek Lisansı'nı alın",
5 "feature.delayApp.headline" : "Beklememek için Franz Destek Lisansı'nı satın alın.", 5 "feature.delayApp.headline" : "Beklememek için Franz Destek Lisansı'nı satın alın",
6 "feature.delayApp.text" : "Franz {seconds} saniye sonra devam edecek.", 6 "feature.delayApp.text" : "Franz {seconds} saniye sonra devam edecek.",
7 "global.api.unhealthy" : "Franz hizmetlerine ÅŸu anda eriÅŸilemiyor.", 7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
14 "global.api.unhealthy" : "Franz hizmetlerine ÅŸu anda eriÅŸilemiyor",
8 "global.notConnectedToTheInternet" : "İnternete bağlı değilsiniz.", 15 "global.notConnectedToTheInternet" : "İnternete bağlı değilsiniz.",
9 "import.headline" : "Franz 4 servislerinizi ekleyin.", 16 "global.spellchecker.useDefault" : "Sistem Dilini Kullan ({default})",
10 "import.notSupportedHeadline" : "Servisler henüz Franz 5'te desteklenmiyor.", 17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Ä°mla kontrol dili",
20 "import.headline" : "Franz 4 servislerinizi içeri aktarın",
21 "import.notSupportedHeadline" : "Henüz Franz 5'te desteklenmeyen servisler",
11 "import.skip.label" : "Servisleri kendim eklemek istiyorum", 22 "import.skip.label" : "Servisleri kendim eklemek istiyorum",
12 "import.submit.label" : "Servisleri içe aktar", 23 "import.submit.label" : "Servisleri içe aktar",
13 "infobar.buttonChangelog" : "Yeni ne var?", 24 "infobar.buttonChangelog" : "Yeni ne var?",
@@ -15,7 +26,7 @@
15 "infobar.buttonReloadServices" : "Hizmetleri yeniden yükle", 26 "infobar.buttonReloadServices" : "Hizmetleri yeniden yükle",
16 "infobar.requiredRequestsFailed" : "Hizmetler ve kullanıcı bilgileri yüklenemedi", 27 "infobar.requiredRequestsFailed" : "Hizmetler ve kullanıcı bilgileri yüklenemedi",
17 "infobar.servicesUpdated" : "Hizmetleriniz güncellendi.", 28 "infobar.servicesUpdated" : "Hizmetleriniz güncellendi.",
18 "infobar.updateAvailable" : "Yeni Franz güncellemesi mevcut", 29 "infobar.updateAvailable" : "Yeni Franz güncellemesi mevcut.",
19 "invite.email.label" : "E-posta adresi", 30 "invite.email.label" : "E-posta adresi",
20 "invite.headline.friends" : "3 arkadaşını ya da çalışma arkadaşını davet et", 31 "invite.headline.friends" : "3 arkadaşını ya da çalışma arkadaşını davet et",
21 "invite.name.label" : "Ad", 32 "invite.name.label" : "Ad",
@@ -59,7 +70,7 @@
59 "menu.help.support" : "Destek", 70 "menu.help.support" : "Destek",
60 "menu.help.tos" : "Kullanım Şartları", 71 "menu.help.tos" : "Kullanım Şartları",
61 "menu.services" : "Hizmetler", 72 "menu.services" : "Hizmetler",
62 "menu.services.addNewService" : "Yeni Servis Ekle", 73 "menu.services.addNewService" : "Yeni servis ekle...",
63 "menu.view" : "Görünüm", 74 "menu.view" : "Görünüm",
64 "menu.view.enterFullScreen" : "Tam Ekrana Geç", 75 "menu.view.enterFullScreen" : "Tam Ekrana Geç",
65 "menu.view.exitFullScreen" : "Tam Ekrandan Çık", 76 "menu.view.exitFullScreen" : "Tam Ekrandan Çık",
@@ -81,7 +92,7 @@
81 "password.noUser" : "Bu e-posta adresinde bir kullanıcı bulunamadı", 92 "password.noUser" : "Bu e-posta adresinde bir kullanıcı bulunamadı",
82 "password.submit.label" : "Gönder", 93 "password.submit.label" : "Gönder",
83 "password.successInfo" : "E-postanızı kontrol ediniz", 94 "password.successInfo" : "E-postanızı kontrol ediniz",
84 "premiumFeature.button.upgradeAccount" : "Upgrade account", 95 "premiumFeature.button.upgradeAccount" : "Hesabı Yükselt",
85 "pricing.headline" : "Franz'ı Destekle", 96 "pricing.headline" : "Franz'ı Destekle",
86 "pricing.link.skipPayment" : "Franz'ın gelişimini desteklemek istemiyorum.", 97 "pricing.link.skipPayment" : "Franz'ın gelişimini desteklemek istemiyorum.",
87 "pricing.submit.label" : "Franz'ın gelişimini desteklemek istiyorum", 98 "pricing.submit.label" : "Franz'ın gelişimini desteklemek istiyorum",
@@ -92,11 +103,11 @@
92 "service.crashHandler.text" : "{name} bir hataya neden oldu.", 103 "service.crashHandler.text" : "{name} bir hataya neden oldu.",
93 "service.disabledHandler.action" : "{name} aktif", 104 "service.disabledHandler.action" : "{name} aktif",
94 "service.disabledHandler.headline" : "{name} devredışı", 105 "service.disabledHandler.headline" : "{name} devredışı",
95 "service.errorHandler.action" : "{name} yeniden yükle", 106 "service.errorHandler.action" : "{İsim} Yeniden Yükle",
96 "service.errorHandler.editAction" : "{name} düzenle", 107 "service.errorHandler.editAction" : "{name} düzenle",
97 "service.errorHandler.headline" : "Aman Tanrım hayır!", 108 "service.errorHandler.headline" : "Hayııırrr!",
98 "service.errorHandler.message" : "Hata", 109 "service.errorHandler.message" : "Hata",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} yüklenemedi.",
100 "services.getStarted" : "Haydi başlayalım", 111 "services.getStarted" : "Haydi başlayalım",
101 "services.welcome" : "Franz'a HoÅŸgeldiniz", 112 "services.welcome" : "Franz'a HoÅŸgeldiniz",
102 "settings.account.account.editButton" : "Hesabı düzenle", 113 "settings.account.account.editButton" : "Hesabı düzenle",
@@ -118,7 +129,7 @@
118 "settings.account.manageSubscription.label" : "Aboneliğini yönet", 129 "settings.account.manageSubscription.label" : "Aboneliğini yönet",
119 "settings.account.successInfo" : "DeÄŸiÅŸikliklerin kaydedildi", 130 "settings.account.successInfo" : "DeÄŸiÅŸikliklerin kaydedildi",
120 "settings.account.tryReloadUserInfoRequest" : "Tekrar deneyin", 131 "settings.account.tryReloadUserInfoRequest" : "Tekrar deneyin",
121 "settings.account.userInfoRequestFailed" : "Kullanıcı bilgisi yüklenemedi.", 132 "settings.account.userInfoRequestFailed" : "Kullanıcı bilgisi yüklenemedi",
122 "settings.app.buttonClearAllCache" : "Önbelleği temizle", 133 "settings.app.buttonClearAllCache" : "Önbelleği temizle",
123 "settings.app.buttonInstallUpdate" : "Yeniden Başlat ve Güncelleştirmeleri Kur", 134 "settings.app.buttonInstallUpdate" : "Yeniden Başlat ve Güncelleştirmeleri Kur",
124 "settings.app.buttonSearchForUpdate" : "Güncellemeleri kontrol et", 135 "settings.app.buttonSearchForUpdate" : "Güncellemeleri kontrol et",
@@ -127,7 +138,7 @@
127 "settings.app.form.autoLaunchInBackground" : "Arka planda aç", 138 "settings.app.form.autoLaunchInBackground" : "Arka planda aç",
128 "settings.app.form.autoLaunchOnStart" : "Franz'ı başlangıçta aç", 139 "settings.app.form.autoLaunchOnStart" : "Franz'ı başlangıçta aç",
129 "settings.app.form.beta" : "Beta versiyonları dahil et", 140 "settings.app.form.beta" : "Beta versiyonları dahil et",
130 "settings.app.form.darkMode" : "Join the Dark Side", 141 "settings.app.form.darkMode" : "Karanlık tarafa katıl",
131 "settings.app.form.enableGPUAcceleration" : "Grafik İşlemci Ünitesi (GPU) Hızlandırıcısını Aktif et", 142 "settings.app.form.enableGPUAcceleration" : "Grafik İşlemci Ünitesi (GPU) Hızlandırıcısını Aktif et",
132 "settings.app.form.enableMenuBar" : "Menü çubuğunda Franz'ı göster", 143 "settings.app.form.enableMenuBar" : "Menü çubuğunda Franz'ı göster",
133 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir", 144 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir",
@@ -138,7 +149,7 @@
138 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut", 149 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut",
139 "settings.app.form.showDisabledServices" : "Devre dışı bırakılan servis sekmelerini göster", 150 "settings.app.form.showDisabledServices" : "Devre dışı bırakılan servis sekmelerini göster",
140 "settings.app.form.showMessagesBadgesWhenMuted" : "Bildirimler kapalı iken okunmamış mesaj sayısını göster", 151 "settings.app.form.showMessagesBadgesWhenMuted" : "Bildirimler kapalı iken okunmamış mesaj sayısını göster",
141 "settings.app.form.spellcheckerLanguage" : "Spell checking language", 152 "settings.app.form.spellcheckerLanguage" : "Ä°mla kontrol dili",
142 "settings.app.headline" : "Ayarlar", 153 "settings.app.headline" : "Ayarlar",
143 "settings.app.headlineAdvanced" : "GeliÅŸmiÅŸ", 154 "settings.app.headlineAdvanced" : "GeliÅŸmiÅŸ",
144 "settings.app.headlineAppearance" : "Görünüm", 155 "settings.app.headlineAppearance" : "Görünüm",
@@ -168,7 +179,7 @@
168 "settings.searchService" : "Hizmeti ara", 179 "settings.searchService" : "Hizmeti ara",
169 "settings.service.error.goBack" : "Servislere geri dön", 180 "settings.service.error.goBack" : "Servislere geri dön",
170 "settings.service.error.headline" : "Hata", 181 "settings.service.error.headline" : "Hata",
171 "settings.service.error.message" : "Servis tarifi yüklenemedi", 182 "settings.service.error.message" : "Servis tarifi yüklenemedi.",
172 "settings.service.form.addServiceHeadline" : "{name} Ekle", 183 "settings.service.form.addServiceHeadline" : "{name} Ekle",
173 "settings.service.form.availableServices" : "Mevcut servisler", 184 "settings.service.form.availableServices" : "Mevcut servisler",
174 "settings.service.form.customUrl" : "Özel sunucu", 185 "settings.service.form.customUrl" : "Özel sunucu",
@@ -176,10 +187,10 @@
176 "settings.service.form.customUrlUpgradeAccount" : "Hesabını yükselt", 187 "settings.service.form.customUrlUpgradeAccount" : "Hesabını yükselt",
177 "settings.service.form.customUrlValidationError" : "{name} özel sunucu doğrulanamadı.", 188 "settings.service.form.customUrlValidationError" : "{name} özel sunucu doğrulanamadı.",
178 "settings.service.form.deleteButton" : "Servisi sil", 189 "settings.service.form.deleteButton" : "Servisi sil",
179 "settings.service.form.editServiceHeadline" : "{name} düzenle", 190 "settings.service.form.editServiceHeadline" : "{İsim} Düzenle",
180 "settings.service.form.enableAudio" : "Sesi etkinleÅŸtirin", 191 "settings.service.form.enableAudio" : "Sesi etkinleÅŸtirin",
181 "settings.service.form.enableBadge" : "Okunmamış mesajları göster", 192 "settings.service.form.enableBadge" : "Okunmamış mesajları göster",
182 "settings.service.form.enableDarkMode" : "Enable Dark Mode", 193 "settings.service.form.enableDarkMode" : "Karanlık modu aç",
183 "settings.service.form.enableNotification" : "Bildirimleri etkinleÅŸtir", 194 "settings.service.form.enableNotification" : "Bildirimleri etkinleÅŸtir",
184 "settings.service.form.enableService" : "Servisi etkinleÅŸtir", 195 "settings.service.form.enableService" : "Servisi etkinleÅŸtir",
185 "settings.service.form.headlineBadges" : "Okunmamış mesajlar", 196 "settings.service.form.headlineBadges" : "Okunmamış mesajlar",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Mesaj rozetini tüm yeni mesajlar için göster", 203 "settings.service.form.indirectMessages" : "Mesaj rozetini tüm yeni mesajlar için göster",
193 "settings.service.form.isMutedInfo" : "Devre dışı bırakıldığında, tüm bildirim sesleri sessize alınır", 204 "settings.service.form.isMutedInfo" : "Devre dışı bırakıldığında, tüm bildirim sesleri sessize alınır",
194 "settings.service.form.name" : "Ä°sim", 205 "settings.service.form.name" : "Ä°sim",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Ayarları",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "Proxy Sunucusu\/IP",
197 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.", 208 "settings.service.form.proxy.info" : "Proxy ayarları Franz serverlarına yüklenmeyecektir.",
198 "settings.service.form.proxy.isEnabled" : "Use Proxy", 209 "settings.service.form.proxy.isEnabled" : "Proxy Kullan",
199 "settings.service.form.proxy.password" : "Password (optional)", 210 "settings.service.form.proxy.password" : "Parola (opsiyonel)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Port",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Proxy ayarlarını değiştirdikten sonra Franz'ı yeniden başlatınız.",
202 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "Kullanıcı (opsiyonel)",
203 "settings.service.form.saveButton" : "Servisi kaydet", 214 "settings.service.form.saveButton" : "Servisi kaydet",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Ä°mla kontrol dili",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "Sistem Dilini Kullan ({default})",
206 "settings.service.form.tabHosted" : "Barındırılan", 217 "settings.service.form.tabHosted" : "Barındırılan",
207 "settings.service.form.tabOnPremise" : "Kendi barındırılan", 218 "settings.service.form.tabOnPremise" : "Kendi barındırılan",
208 "settings.service.form.team" : "Takım", 219 "settings.service.form.team" : "Takım",
@@ -238,7 +249,7 @@
238 "signup.legal.info" : "Franz'ı hesabı oluşturark kabul ediyorsun", 249 "signup.legal.info" : "Franz'ı hesabı oluşturark kabul ediyorsun",
239 "signup.legal.privacy" : "Gizlilik Sözleşmesi", 250 "signup.legal.privacy" : "Gizlilik Sözleşmesi",
240 "signup.legal.terms" : "Kullanım Koşulları", 251 "signup.legal.terms" : "Kullanım Koşulları",
241 "signup.link.login" : "Mevcut hesabınla giriş yap.", 252 "signup.link.login" : "Hali hazırda hesabınız varsa giriş yapmak ister misiniz?",
242 "signup.password.label" : "Åžifre", 253 "signup.password.label" : "Åžifre",
243 "signup.submit.label" : "Hesap oluÅŸtur", 254 "signup.submit.label" : "Hesap oluÅŸtur",
244 "subscription.euTaxInfo" : "AB vatandaşları: yerel satış vergileri uygulanabilir", 255 "subscription.euTaxInfo" : "AB vatandaşları: yerel satış vergileri uygulanabilir",
@@ -249,7 +260,7 @@
249 "subscription.features.onpremise" : "HipChat gibi kurum içi\/barındırılan hizmetler ekle", 260 "subscription.features.onpremise" : "HipChat gibi kurum içi\/barındırılan hizmetler ekle",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
251 "subscription.features.proxy" : "Proxy support for services", 262 "subscription.features.proxy" : "Proxy support for services",
252 "subscription.features.spellchecker" : "Support for spellchecker", 263 "subscription.features.spellchecker" : "Yazım denetleyicisi desteği",
253 "subscription.includedFeatures" : "Ücretli Franz Premium Destekçi Hesabına dahil", 264 "subscription.includedFeatures" : "Ücretli Franz Premium Destekçi Hesabına dahil",
254 "subscription.paymentSessionError" : "Ödeme formu başlatılamadı", 265 "subscription.paymentSessionError" : "Ödeme formu başlatılamadı",
255 "subscription.submit.label" : "Franz'ın gelişimini desteklemek istiyorum", 266 "subscription.submit.label" : "Franz'ın gelişimini desteklemek istiyorum",
@@ -266,7 +277,7 @@
266 "tabs.item.enableAudio" : "Sesi etkinleÅŸtir", 277 "tabs.item.enableAudio" : "Sesi etkinleÅŸtir",
267 "tabs.item.enableNotification" : "Bildirimleri etkinleÅŸtir", 278 "tabs.item.enableNotification" : "Bildirimleri etkinleÅŸtir",
268 "tabs.item.enableService" : "Servisi etkinleÅŸtir", 279 "tabs.item.enableService" : "Servisi etkinleÅŸtir",
269 "tabs.item.reload" : "Yeniden Yükle", 280 "tabs.item.reload" : "Tekrar yükle",
270 "validation.email" : "{alan} geçerli değil", 281 "validation.email" : "{alan} geçerli değil",
271 "validation.minLength" : "{field} en az {length} karakter uzunluğunda olmalı", 282 "validation.minLength" : "{field} en az {length} karakter uzunluğunda olmalı",
272 "validation.required" : "{field} gereklidir", 283 "validation.required" : "{field} gereklidir",
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index 7d51b380e..db3145b36 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -1,13 +1,24 @@
1{ 1{
2 "app.errorHandler.action" : "Перезавантажити", 2 "app.errorHandler.action" : "Перезавантажити",
3 "app.errorHandler.headline" : "Something went wrong", 3 "app.errorHandler.headline" : "ЩоÑÑŒ пішло не так",
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "Отримати ліцензію Franz Supporter ",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "Будь лаÑка, придбайте ліцензію Franz Supporter аби пропуÑтити очікуваннÑ",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz відновить роботу за {seconds} Ñекунд",
7 "global.api.unhealthy" : "Ðе можна підключитиÑÑŒ до онлайн ÑервіÑів Franz", 7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
14 "global.api.unhealthy" : "Ðе можливо підключитиÑÑŒ до онлайн ÑервіÑів Franz",
8 "global.notConnectedToTheInternet" : "Ви не підключені до Інтернету.", 15 "global.notConnectedToTheInternet" : "Ви не підключені до Інтернету.",
16 "global.spellchecker.useDefault" : "ВикориÑтовувати ÑиÑтемні параметри за змовчуваннÑм ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "Мова перевірки правопиÑу",
9 "import.headline" : "Імпортувати ваші ÑервіÑи з Franz 4", 20 "import.headline" : "Імпортувати ваші ÑервіÑи з Franz 4",
10 "import.notSupportedHeadline" : "СервіÑи ще не підтримуютьÑÑ Ð² Franz 5", 21 "import.notSupportedHeadline" : "Ðаразі ÑервіÑи не підтримуютьÑÑ Ñƒ Franz 5",
11 "import.skip.label" : "Я бажаю додати ÑÐµÑ€Ð²Ñ–Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ", 22 "import.skip.label" : "Я бажаю додати ÑÐµÑ€Ð²Ñ–Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ",
12 "import.submit.label" : "Імпортувати ÑервіÑи", 23 "import.submit.label" : "Імпортувати ÑервіÑи",
13 "infobar.buttonChangelog" : "Що нового?", 24 "infobar.buttonChangelog" : "Що нового?",
@@ -17,20 +28,20 @@
17 "infobar.servicesUpdated" : "Ваші ÑервіÑи було оновлено.", 28 "infobar.servicesUpdated" : "Ваші ÑервіÑи було оновлено.",
18 "infobar.updateAvailable" : "Ðове Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Franz доÑтупне.", 29 "infobar.updateAvailable" : "Ðове Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Franz доÑтупне.",
19 "invite.email.label" : "Email адреÑа", 30 "invite.email.label" : "Email адреÑа",
20 "invite.headline.friends" : "ЗапроÑÑ–Ñ‚ÑŒ 3 ваших друзів або колег", 31 "invite.headline.friends" : "ЗапроÑÑ–Ñ‚ÑŒ 3-Ñ… ваших друзів або колег",
21 "invite.name.label" : "Ім'Ñ", 32 "invite.name.label" : "Ім'Ñ",
22 "invite.skip.label" : "Я хочу зробити це пізніше", 33 "invite.skip.label" : "Я хочу зробити це пізніше",
23 "invite.submit.label" : "Відправити запрошеннÑ", 34 "invite.submit.label" : "Відправити запрошеннÑ",
24 "invite.successInfo" : "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпішно відоÑлані", 35 "invite.successInfo" : "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ ÑƒÑпішно надіÑлані",
25 "login.email.label" : "Email адреÑа", 36 "login.email.label" : "Email адреÑа",
26 "login.headline" : "Увійти", 37 "login.headline" : "Увійти",
27 "login.invalidCredentials" : "Email або пароль некоректні", 38 "login.invalidCredentials" : "Email або пароль некоректні",
28 "login.link.password" : "Скинути пароль", 39 "login.link.password" : "Скинути пароль",
29 "login.link.signup" : "Створити безплатний акаунт", 40 "login.link.signup" : "Створити безплатний акаунт",
30 "login.password.label" : "Пароль", 41 "login.password.label" : "Пароль",
31 "login.serverLogout" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, зайдіть знову.", 42 "login.serverLogout" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, увійдіть знову.",
32 "login.submit.label" : "Увійти", 43 "login.submit.label" : "Увійти",
33 "login.tokenExpired" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, зайдіть знову.", 44 "login.tokenExpired" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, увійдіть знову.",
34 "menu.app.about" : "Про Franz", 45 "menu.app.about" : "Про Franz",
35 "menu.app.hide" : "Приховати", 46 "menu.app.hide" : "Приховати",
36 "menu.app.hideOthers" : "Приховати інші", 47 "menu.app.hideOthers" : "Приховати інші",
@@ -81,7 +92,7 @@
81 "password.noUser" : "Ðе знайдено жодного кориÑтувача з цією email адреÑою", 92 "password.noUser" : "Ðе знайдено жодного кориÑтувача з цією email адреÑою",
82 "password.submit.label" : "Подати", 93 "password.submit.label" : "Подати",
83 "password.successInfo" : "Будь лаÑка, перевірте ваш email", 94 "password.successInfo" : "Будь лаÑка, перевірте ваш email",
84 "premiumFeature.button.upgradeAccount" : "Upgrade account", 95 "premiumFeature.button.upgradeAccount" : "Преміум акаунт",
85 "pricing.headline" : "Підтримайте Franz", 96 "pricing.headline" : "Підтримайте Franz",
86 "pricing.link.skipPayment" : "Я не хочу підтримувати розробку Franz.", 97 "pricing.link.skipPayment" : "Я не хочу підтримувати розробку Franz.",
87 "pricing.submit.label" : "Я хочу підтримати розробку Franz", 98 "pricing.submit.label" : "Я хочу підтримати розробку Franz",
@@ -96,7 +107,7 @@
96 "service.errorHandler.editAction" : "Редагувати {name}", 107 "service.errorHandler.editAction" : "Редагувати {name}",
97 "service.errorHandler.headline" : "О, ні!", 108 "service.errorHandler.headline" : "О, ні!",
98 "service.errorHandler.message" : "Помилка", 109 "service.errorHandler.message" : "Помилка",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} не завантажено",
100 "services.getStarted" : "Почати", 111 "services.getStarted" : "Почати",
101 "services.welcome" : "ЛаÑкаво проÑимо в Franz", 112 "services.welcome" : "ЛаÑкаво проÑимо в Franz",
102 "settings.account.account.editButton" : "Редагувати акаунт", 113 "settings.account.account.editButton" : "Редагувати акаунт",
@@ -127,7 +138,7 @@
127 "settings.app.form.autoLaunchInBackground" : "Відкрити у фоновому режимі", 138 "settings.app.form.autoLaunchInBackground" : "Відкрити у фоновому режимі",
128 "settings.app.form.autoLaunchOnStart" : "ЗапуÑкати Franz на початку", 139 "settings.app.form.autoLaunchOnStart" : "ЗапуÑкати Franz на початку",
129 "settings.app.form.beta" : "Включити бета-верÑÑ–Ñ—", 140 "settings.app.form.beta" : "Включити бета-верÑÑ–Ñ—",
130 "settings.app.form.darkMode" : "Join the Dark Side", 141 "settings.app.form.darkMode" : "Переходь на Темну Сторону",
131 "settings.app.form.enableGPUAcceleration" : "Ввімкнути приÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ GPU", 142 "settings.app.form.enableGPUAcceleration" : "Ввімкнути приÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ GPU",
132 "settings.app.form.enableMenuBar" : "Відображати Franz в панелі головного меню", 143 "settings.app.form.enableMenuBar" : "Відображати Franz в панелі головного меню",
133 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії", 144 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії",
@@ -138,7 +149,7 @@
138 "settings.app.form.runInBackground" : "Тримати Franz в фоні при закритті вікна", 149 "settings.app.form.runInBackground" : "Тримати Franz в фоні при закритті вікна",
139 "settings.app.form.showDisabledServices" : "Показати вкладку вимкнених ÑервіÑів", 150 "settings.app.form.showDisabledServices" : "Показати вкладку вимкнених ÑервіÑів",
140 "settings.app.form.showMessagesBadgesWhenMuted" : "Показувати значок непрочитаних повідомлень коли ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ñ–", 151 "settings.app.form.showMessagesBadgesWhenMuted" : "Показувати значок непрочитаних повідомлень коли ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ñ–",
141 "settings.app.form.spellcheckerLanguage" : "Spell checking language", 152 "settings.app.form.spellcheckerLanguage" : "Мова перевірки правопиÑу",
142 "settings.app.headline" : "ÐалаштуваннÑ", 153 "settings.app.headline" : "ÐалаштуваннÑ",
143 "settings.app.headlineAdvanced" : "Додаткові налаштуваннÑ", 154 "settings.app.headlineAdvanced" : "Додаткові налаштуваннÑ",
144 "settings.app.headlineAppearance" : "ВиглÑд", 155 "settings.app.headlineAppearance" : "ВиглÑд",
@@ -179,7 +190,7 @@
179 "settings.service.form.editServiceHeadline" : "Редагувати {name}", 190 "settings.service.form.editServiceHeadline" : "Редагувати {name}",
180 "settings.service.form.enableAudio" : "Увімкнути звук", 191 "settings.service.form.enableAudio" : "Увімкнути звук",
181 "settings.service.form.enableBadge" : "Показувати непрочитані повідомленнÑ", 192 "settings.service.form.enableBadge" : "Показувати непрочитані повідомленнÑ",
182 "settings.service.form.enableDarkMode" : "Enable Dark Mode", 193 "settings.service.form.enableDarkMode" : "Переходь на Темну Сторону",
183 "settings.service.form.enableNotification" : "Увімкнути ÑповіщеннÑ", 194 "settings.service.form.enableNotification" : "Увімкнути ÑповіщеннÑ",
184 "settings.service.form.enableService" : "Увімкнути ÑервіÑ", 195 "settings.service.form.enableService" : "Увімкнути ÑервіÑ",
185 "settings.service.form.headlineBadges" : "Значки непрочитаних повідомлень", 196 "settings.service.form.headlineBadges" : "Значки непрочитаних повідомлень",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "Показувати значок Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ–Ñ… нових повідомлень", 203 "settings.service.form.indirectMessages" : "Показувати значок Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ–Ñ… нових повідомлень",
193 "settings.service.form.isMutedInfo" : "Коли вимкнено, вÑÑ– ÑÐ¿Ð¾Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð° Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ–Ð³Ð½Ð¾Ñ€ÑƒÑŽÑ‚ÑŒÑÑ", 204 "settings.service.form.isMutedInfo" : "Коли вимкнено, вÑÑ– ÑÐ¿Ð¾Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð° Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ–Ð³Ð½Ð¾Ñ€ÑƒÑŽÑ‚ÑŒÑÑ",
194 "settings.service.form.name" : "Ім'Ñ", 205 "settings.service.form.name" : "Ім'Ñ",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ HTTP\/HTTPS прокÑÑ– ",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "ПрокÑÑ– Host\/IP",
197 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.", 208 "settings.service.form.proxy.info" : "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ– не будуть Ñинхронізовані із Ñерверами Franz",
198 "settings.service.form.proxy.isEnabled" : "Use Proxy", 209 "settings.service.form.proxy.isEnabled" : "ВикориÑтовувати прокÑÑ–",
199 "settings.service.form.proxy.password" : "Password (optional)", 210 "settings.service.form.proxy.password" : "Пароль (опційно)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "Порт",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "Будь лаÑка, перезапуÑÑ‚Ñ–Ñ‚ÑŒ Franz піÑÐ»Ñ Ð·Ð¼Ñ–Ð½Ð¸ налуштувань прокÑÑ–",
202 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "КориÑтувач (опційно)",
203 "settings.service.form.saveButton" : "Зберегти ÑервіÑ", 214 "settings.service.form.saveButton" : "Зберегти ÑервіÑ",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "Мова перевірки правопиÑу",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "ВикориÑтовувати ÑиÑтемні параметри за змовчуваннÑм ({default})",
206 "settings.service.form.tabHosted" : "Розміщений", 217 "settings.service.form.tabHosted" : "Розміщений",
207 "settings.service.form.tabOnPremise" : "СамоÑтійно розміщений â­ï¸", 218 "settings.service.form.tabOnPremise" : "СамоÑтійно розміщений â­ï¸",
208 "settings.service.form.team" : "Команда", 219 "settings.service.form.team" : "Команда",
@@ -245,11 +256,11 @@
245 "subscription.features.ads" : "Жодної реклами!", 256 "subscription.features.ads" : "Жодної реклами!",
246 "subscription.features.comingSoon" : "очікуйте незабаром", 257 "subscription.features.comingSoon" : "очікуйте незабаром",
247 "subscription.features.encryptedSync" : "Шифрована ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÑеанÑу", 258 "subscription.features.encryptedSync" : "Шифрована ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÑеанÑу",
248 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 259 "subscription.features.noInterruptions" : "ÐÑ–Ñких затримок та набридливих пропозицій з платних підпиÑок",
249 "subscription.features.onpremise" : "Додайте on-premise \/ hosted ÑервіÑи, такі Ñк Hipchat", 260 "subscription.features.onpremise" : "Додайте on-premise \/ hosted ÑервіÑи, такі Ñк Hipchat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "СервіÑи, що виконуютьÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾\/вимагають хоÑтингу, приміром Mattermost",
251 "subscription.features.proxy" : "Proxy support for services", 262 "subscription.features.proxy" : "Підтримка прокÑÑ– ",
252 "subscription.features.spellchecker" : "Support for spellchecker", 263 "subscription.features.spellchecker" : "Підтримка перевірки правопиÑу",
253 "subscription.includedFeatures" : "Платний Преміальний Ðкаунт Прихильника Franz включає", 264 "subscription.includedFeatures" : "Платний Преміальний Ðкаунт Прихильника Franz включає",
254 "subscription.paymentSessionError" : "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ форму платежу", 265 "subscription.paymentSessionError" : "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ форму платежу",
255 "subscription.submit.label" : "Я хочу підтримати розробку Franz", 266 "subscription.submit.label" : "Я хочу підтримати розробку Franz",
diff --git a/src/i18n/locales/whitelist_en-US.json b/src/i18n/locales/whitelist_en-US.json
new file mode 100644
index 000000000..32960f8ce
--- /dev/null
+++ b/src/i18n/locales/whitelist_en-US.json
@@ -0,0 +1,2 @@
1[
2] \ No newline at end of file
diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json
index cfb1d3dce..3ae08c9ef 100644
--- a/src/i18n/locales/zh-TW.json
+++ b/src/i18n/locales/zh-TW.json
@@ -1,11 +1,22 @@
1{ 1{
2 "app.errorHandler.action" : "é‡æ–°è¼‰å…¥", 2 "app.errorHandler.action" : "é‡æ–°è¼‰å…¥",
3 "app.errorHandler.headline" : "有些æ±è¥¿å‡ºéŒ¯äº†", 3 "app.errorHandler.headline" : "有些æ±è¥¿å‡ºéŒ¯äº†",
4 "feature.delayApp.action" : "Get a Franz Supporter License", 4 "feature.delayApp.action" : "å–å¾— Franz 支æ´æŽˆæ¬Š",
5 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting", 5 "feature.delayApp.headline" : "請購買 Franz 支æ´æŽˆæ¬Šä»¥è·³éŽç­‰å€™",
6 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.", 6 "feature.delayApp.text" : "Franz 會在 {seconds} 秒後繼續。",
7 "global.api.unhealthy" : "無法連線至Franz的伺æœå™¨ã€‚", 7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!",
11 "feature.shareFranz.shareText.email" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
12 "feature.shareFranz.shareText.twitter" : "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
14 "global.api.unhealthy" : "無法連線至 Franz 的伺æœå™¨",
8 "global.notConnectedToTheInternet" : "你沒有連上網路。", 15 "global.notConnectedToTheInternet" : "你沒有連上網路。",
16 "global.spellchecker.useDefault" : "使用系統é è¨­ ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically",
18 "global.spellchecking.autodetect.short" : "Automatic",
19 "global.spellchecking.language" : "拼字檢查語言",
9 "import.headline" : "匯入 Franz 4 çš„æœå‹™", 20 "import.headline" : "匯入 Franz 4 çš„æœå‹™",
10 "import.notSupportedHeadline" : "Franz 5 尚未支æ´æ­¤æœå‹™", 21 "import.notSupportedHeadline" : "Franz 5 尚未支æ´æ­¤æœå‹™",
11 "import.skip.label" : "手動添加æœå‹™", 22 "import.skip.label" : "手動添加æœå‹™",
@@ -14,10 +25,10 @@
14 "infobar.buttonInstallUpdate" : "é‡æ–°å•Ÿå‹•ä¸¦å®‰è£æ›´æ–°", 25 "infobar.buttonInstallUpdate" : "é‡æ–°å•Ÿå‹•ä¸¦å®‰è£æ›´æ–°",
15 "infobar.buttonReloadServices" : "é‡æ–°è¼‰å…¥æœå‹™", 26 "infobar.buttonReloadServices" : "é‡æ–°è¼‰å…¥æœå‹™",
16 "infobar.requiredRequestsFailed" : "無法載入æœå‹™å’Œä½¿ç”¨è€…資訊", 27 "infobar.requiredRequestsFailed" : "無法載入æœå‹™å’Œä½¿ç”¨è€…資訊",
17 "infobar.servicesUpdated" : "ä½ çš„æœå‹™å·²ç¶“被更新", 28 "infobar.servicesUpdated" : "已經更新你的æœå‹™",
18 "infobar.updateAvailable" : "Franz有å¯ç”¨çš„æ›´æ–°", 29 "infobar.updateAvailable" : "Franz 有å¯ç”¨çš„æ›´æ–°",
19 "invite.email.label" : "é›»å­éƒµä»¶åœ°å€", 30 "invite.email.label" : "é›»å­éƒµä»¶åœ°å€",
20 "invite.headline.friends" : "邀請3ä½ä½ çš„朋å‹æˆ–åŒäº‹", 31 "invite.headline.friends" : "邀請 3 ä½æœ‹å‹æˆ–åŒäº‹",
21 "invite.name.label" : "å稱", 32 "invite.name.label" : "å稱",
22 "invite.skip.label" : "我想ç¨å¾Œå†åš", 33 "invite.skip.label" : "我想ç¨å¾Œå†åš",
23 "invite.submit.label" : "é€å‡ºé‚€è«‹", 34 "invite.submit.label" : "é€å‡ºé‚€è«‹",
@@ -31,7 +42,7 @@
31 "login.serverLogout" : "您的登入期間已éŽæœŸï¼Œè«‹é‡æ–°ç™»éŒ„", 42 "login.serverLogout" : "您的登入期間已éŽæœŸï¼Œè«‹é‡æ–°ç™»éŒ„",
32 "login.submit.label" : "登入", 43 "login.submit.label" : "登入",
33 "login.tokenExpired" : "您的登入已éŽæœŸï¼Œè«‹é‡æ–°ç™»å…¥ã€‚", 44 "login.tokenExpired" : "您的登入已éŽæœŸï¼Œè«‹é‡æ–°ç™»å…¥ã€‚",
34 "menu.app.about" : "關於Franz", 45 "menu.app.about" : "關於 Franz",
35 "menu.app.hide" : "éš±è—", 46 "menu.app.hide" : "éš±è—",
36 "menu.app.hideOthers" : "éš±è—其他", 47 "menu.app.hideOthers" : "éš±è—其他",
37 "menu.app.quit" : "çµæŸ", 48 "menu.app.quit" : "çµæŸ",
@@ -63,7 +74,7 @@
63 "menu.view" : "檢視", 74 "menu.view" : "檢視",
64 "menu.view.enterFullScreen" : "進入全螢幕模å¼", 75 "menu.view.enterFullScreen" : "進入全螢幕模å¼",
65 "menu.view.exitFullScreen" : "離開全螢幕模å¼", 76 "menu.view.exitFullScreen" : "離開全螢幕模å¼",
66 "menu.view.reloadFranz" : "é‡æ–°è¼‰å…¥Franz", 77 "menu.view.reloadFranz" : "é‡æ–°è¼‰å…¥ Franz",
67 "menu.view.reloadService" : "é‡æ–°è¼‰å…¥æœå‹™", 78 "menu.view.reloadService" : "é‡æ–°è¼‰å…¥æœå‹™",
68 "menu.view.resetZoom" : "實際大å°", 79 "menu.view.resetZoom" : "實際大å°",
69 "menu.view.toggleDevTools" : "切æ›é–‹ç™¼è€…工具", 80 "menu.view.toggleDevTools" : "切æ›é–‹ç™¼è€…工具",
@@ -82,9 +93,9 @@
82 "password.submit.label" : "é€å‡º", 93 "password.submit.label" : "é€å‡º",
83 "password.successInfo" : "請檢查您的電å­éƒµä»¶", 94 "password.successInfo" : "請檢查您的電å­éƒµä»¶",
84 "premiumFeature.button.upgradeAccount" : "å‡ç´šå¸³è™Ÿ", 95 "premiumFeature.button.upgradeAccount" : "å‡ç´šå¸³è™Ÿ",
85 "pricing.headline" : "支æŒFranz", 96 "pricing.headline" : "æ”¯æŒ Franz",
86 "pricing.link.skipPayment" : "我ä¸æƒ³æ”¯æŒFranz的開發。", 97 "pricing.link.skipPayment" : "我ä¸æƒ³æ”¯æŒ Franz 的開發。",
87 "pricing.submit.label" : "我想支æŒFranz的開發。", 98 "pricing.submit.label" : "æˆ‘æƒ³æ”¯æŒ Franz 的開發。",
88 "pricing.support.label" : "é¸æ“‡æ‚¨æ”¯æŒçš„計畫", 99 "pricing.support.label" : "é¸æ“‡æ‚¨æ”¯æŒçš„計畫",
89 "service.crashHandler.action" : "é‡æ–°è¼‰å…¥{name}", 100 "service.crashHandler.action" : "é‡æ–°è¼‰å…¥{name}",
90 "service.crashHandler.autoReload" : "嘗試在{seconds}秒內自動æ¢å¾©{name}", 101 "service.crashHandler.autoReload" : "嘗試在{seconds}秒內自動æ¢å¾©{name}",
@@ -92,20 +103,20 @@
92 "service.crashHandler.text" : "{name}導致了一個錯誤。", 103 "service.crashHandler.text" : "{name}導致了一個錯誤。",
93 "service.disabledHandler.action" : "啟用{name}", 104 "service.disabledHandler.action" : "啟用{name}",
94 "service.disabledHandler.headline" : "{name}å·²åœç”¨", 105 "service.disabledHandler.headline" : "{name}å·²åœç”¨",
95 "service.errorHandler.action" : "é‡æ–°è¼‰å…¥{name}", 106 "service.errorHandler.action" : "é‡æ–°è¼‰å…¥ {name}",
96 "service.errorHandler.editAction" : "編輯{å稱}", 107 "service.errorHandler.editAction" : "編輯{å稱}",
97 "service.errorHandler.headline" : "噢ä¸!", 108 "service.errorHandler.headline" : "噢ä¸ï¼",
98 "service.errorHandler.message" : "錯誤", 109 "service.errorHandler.message" : "錯誤",
99 "service.errorHandler.text" : "{name} has failed to load.", 110 "service.errorHandler.text" : "{name} 載入失敗。",
100 "services.getStarted" : "開始", 111 "services.getStarted" : "開始",
101 "services.welcome" : "歡迎使用Franz", 112 "services.welcome" : "歡迎使用 Franz",
102 "settings.account.account.editButton" : "編輯帳號", 113 "settings.account.account.editButton" : "編輯帳號",
103 "settings.account.accountType.basic" : "基礎帳號", 114 "settings.account.accountType.basic" : "基礎帳號",
104 "settings.account.accountType.premium" : "高級支æŒè€…帳戶", 115 "settings.account.accountType.premium" : "高級支æ´å¸³æˆ¶",
105 "settings.account.buttonSave" : "更新簡介", 116 "settings.account.buttonSave" : "更新簡介",
106 "settings.account.deleteAccount" : "移除帳號", 117 "settings.account.deleteAccount" : "移除帳號",
107 "settings.account.deleteEmailSent" : "移除帳號之確èªé›»éƒµå·²é€å‡ºã€‚你的帳號åŠç›¸é—œè³‡æ–™å°‡ç„¡æ³•æ¢å¾©ï¼", 118 "settings.account.deleteEmailSent" : "移除帳號之確èªé›»éƒµå·²é€å‡ºã€‚你的帳號åŠç›¸é—œè³‡æ–™å°‡ç„¡æ³•æ¢å¾©ï¼",
108 "settings.account.deleteInfo" : "如果ä¸å†éœ€è¦ä½ çš„帳號了,你å¯ä»¥åœ¨é€™è£¡åˆªé™¤å¸³è™Ÿå’Œç›¸é—œè³‡æ–™", 119 "settings.account.deleteInfo" : "如果ä¸å†éœ€è¦ä½ çš„帳號,你å¯ä»¥åœ¨é€™è£¡åˆªé™¤å¸³è™Ÿå’Œæ‰€æœ‰ç›¸é—œè³‡æ–™ã€‚",
109 "settings.account.headline" : "帳號", 120 "settings.account.headline" : "帳號",
110 "settings.account.headlineAccount" : "帳戶資訊", 121 "settings.account.headlineAccount" : "帳戶資訊",
111 "settings.account.headlineDangerZone" : "å±éšªåœ°å¸¶", 122 "settings.account.headlineDangerZone" : "å±éšªåœ°å¸¶",
@@ -113,7 +124,7 @@
113 "settings.account.headlinePassword" : "變更密碼", 124 "settings.account.headlinePassword" : "變更密碼",
114 "settings.account.headlineProfile" : "更新簡介", 125 "settings.account.headlineProfile" : "更新簡介",
115 "settings.account.headlineSubscription" : "您的訂閱", 126 "settings.account.headlineSubscription" : "您的訂閱",
116 "settings.account.headlineUpgrade" : "å‡ç´šæ‚¨çš„帳戶&支æŒFranz", 127 "settings.account.headlineUpgrade" : "å‡ç´šæ‚¨çš„å¸³æˆ¶ä¸¦æ”¯æŒ Franz",
117 "settings.account.invoiceDownload" : "下載", 128 "settings.account.invoiceDownload" : "下載",
118 "settings.account.manageSubscription.label" : "管ç†æ‚¨çš„訂閱", 129 "settings.account.manageSubscription.label" : "管ç†æ‚¨çš„訂閱",
119 "settings.account.successInfo" : "您的更變已經被儲存", 130 "settings.account.successInfo" : "您的更變已經被儲存",
@@ -122,20 +133,20 @@
122 "settings.app.buttonClearAllCache" : "清除快å–", 133 "settings.app.buttonClearAllCache" : "清除快å–",
123 "settings.app.buttonInstallUpdate" : "é‡æ–°å•Ÿå‹•ä¸¦å®‰è£æ›´æ–°", 134 "settings.app.buttonInstallUpdate" : "é‡æ–°å•Ÿå‹•ä¸¦å®‰è£æ›´æ–°",
124 "settings.app.buttonSearchForUpdate" : "檢查更新", 135 "settings.app.buttonSearchForUpdate" : "檢查更新",
125 "settings.app.cacheInfo" : "Franzå¿«å–ç›®å‰å ç”¨ç£ç¢Ÿç©ºé–“{大å°}。", 136 "settings.app.cacheInfo" : "Franz å¿«å–ç›®å‰å ç”¨ {size} çš„ç£ç¢Ÿç©ºé–“。",
126 "settings.app.currentVersion" : "ç›®å‰çš„版本", 137 "settings.app.currentVersion" : "ç›®å‰çš„版本",
127 "settings.app.form.autoLaunchInBackground" : "在背景開啟", 138 "settings.app.form.autoLaunchInBackground" : "在背景開啟",
128 "settings.app.form.autoLaunchOnStart" : "開機時啟動Franz", 139 "settings.app.form.autoLaunchOnStart" : "開機時啟動 Franz",
129 "settings.app.form.beta" : "包å«æ¸¬è©¦ç‰ˆ", 140 "settings.app.form.beta" : "包å«æ¸¬è©¦ç‰ˆ",
130 "settings.app.form.darkMode" : "Join the Dark Side", 141 "settings.app.form.darkMode" : "加入黑暗é¢",
131 "settings.app.form.enableGPUAcceleration" : "啟用GPU加速", 142 "settings.app.form.enableGPUAcceleration" : "啟用 GPU 加速",
132 "settings.app.form.enableMenuBar" : "顯示Franz在é¸å–®åˆ—", 143 "settings.app.form.enableMenuBar" : "在é¸å–®åˆ—顯示 Franz",
133 "settings.app.form.enableSpellchecking" : "啟用拼字檢查", 144 "settings.app.form.enableSpellchecking" : "啟用拼字檢查",
134 "settings.app.form.enableSystemTray" : "顯示Franz在系統列", 145 "settings.app.form.enableSystemTray" : "在系統列顯示 Franz",
135 "settings.app.form.hideDockIcon" : "在工作列中隱è—Franz圖示", 146 "settings.app.form.hideDockIcon" : "éš±è— Dock 中的 Franz 圖示",
136 "settings.app.form.language" : "語言", 147 "settings.app.form.language" : "語言",
137 "settings.app.form.minimizeToSystemTray" : "最å°åŒ–Franz到系統列", 148 "settings.app.form.minimizeToSystemTray" : "最å°åŒ– Franz 到系統列",
138 "settings.app.form.runInBackground" : "當關閉視窗時ä¿æŒFranz在背景é‹ä½œ", 149 "settings.app.form.runInBackground" : "當關閉視窗時,ä¿æŒ Franz 在背景é‹ä½œ",
139 "settings.app.form.showDisabledServices" : "顯示åœç”¨çš„æœå‹™æ¨™ç±¤", 150 "settings.app.form.showDisabledServices" : "顯示åœç”¨çš„æœå‹™æ¨™ç±¤",
140 "settings.app.form.showMessagesBadgesWhenMuted" : "當通知關閉時,標記未讀的訊æ¯", 151 "settings.app.form.showMessagesBadgesWhenMuted" : "當通知關閉時,標記未讀的訊æ¯",
141 "settings.app.form.spellcheckerLanguage" : "拼字檢查語言", 152 "settings.app.form.spellcheckerLanguage" : "拼字檢查語言",
@@ -147,10 +158,10 @@
147 "settings.app.headlineUpdates" : "æ›´æ–°", 158 "settings.app.headlineUpdates" : "æ›´æ–°",
148 "settings.app.restartRequired" : "需è¦é‡å•Ÿä»¥æ›´è®Š", 159 "settings.app.restartRequired" : "需è¦é‡å•Ÿä»¥æ›´è®Š",
149 "settings.app.subheadlineCache" : "å¿«å–", 160 "settings.app.subheadlineCache" : "å¿«å–",
150 "settings.app.translationHelp" : "幫助我們將Franz翻譯æˆæ‚¨çš„語言。", 161 "settings.app.translationHelp" : "幫助我們將 Franz 翻譯æˆæ‚¨çš„語言。",
151 "settings.app.updateStatusAvailable" : "有å¯ç”¨æ›´æ–°ï¼Œä¸‹è¼‰ä¸­...", 162 "settings.app.updateStatusAvailable" : "有å¯ç”¨æ›´æ–°ï¼Œä¸‹è¼‰ä¸­...",
152 "settings.app.updateStatusSearching" : "正在æœå°‹æ›´æ–°", 163 "settings.app.updateStatusSearching" : "正在æœå°‹æ›´æ–°",
153 "settings.app.updateStatusUpToDate" : "您正在使用最新版本的Franz", 164 "settings.app.updateStatusUpToDate" : "您正在使用最新版本的 Franz",
154 "settings.invite.headline" : "邀請朋å‹", 165 "settings.invite.headline" : "邀請朋å‹",
155 "settings.navigation.account" : "帳號", 166 "settings.navigation.account" : "帳號",
156 "settings.navigation.availableServices" : "å¯ä½¿ç”¨çš„æœå‹™", 167 "settings.navigation.availableServices" : "å¯ä½¿ç”¨çš„æœå‹™",
@@ -172,11 +183,11 @@
172 "settings.service.form.addServiceHeadline" : "新增{name}", 183 "settings.service.form.addServiceHeadline" : "新增{name}",
173 "settings.service.form.availableServices" : "å¯ä½¿ç”¨çš„æœå‹™", 184 "settings.service.form.availableServices" : "å¯ä½¿ç”¨çš„æœå‹™",
174 "settings.service.form.customUrl" : "自訂伺æœå™¨", 185 "settings.service.form.customUrl" : "自訂伺æœå™¨",
175 "settings.service.form.customUrlPremiumInfo" : "è¦æ·»åŠ è‡ªå·±è¨—管的æœå‹™ï¼Œæ‚¨éœ€è¦ä¸€å€‹Franz é¡å¤–支æŒè€…帳戶。", 186 "settings.service.form.customUrlPremiumInfo" : "è¦æ·»åŠ è‡ªè¡Œè¨—管的æœå‹™ï¼Œæ‚¨éœ€è¦æ“有 Franz 高級支æ´å¸³æˆ¶ã€‚",
176 "settings.service.form.customUrlUpgradeAccount" : "å‡ç´šæ‚¨çš„帳戶", 187 "settings.service.form.customUrlUpgradeAccount" : "å‡ç´šæ‚¨çš„帳戶",
177 "settings.service.form.customUrlValidationError" : "無法驗證自定義{name}æœå‹™å™¨ã€‚", 188 "settings.service.form.customUrlValidationError" : "無法驗證自定義{name}æœå‹™å™¨ã€‚",
178 "settings.service.form.deleteButton" : "刪除æœå‹™", 189 "settings.service.form.deleteButton" : "刪除æœå‹™",
179 "settings.service.form.editServiceHeadline" : "編輯{å稱}", 190 "settings.service.form.editServiceHeadline" : "編輯 {å稱}",
180 "settings.service.form.enableAudio" : "啟用音訊", 191 "settings.service.form.enableAudio" : "啟用音訊",
181 "settings.service.form.enableBadge" : "顯示未讀訊æ¯åœ–示", 192 "settings.service.form.enableBadge" : "顯示未讀訊æ¯åœ–示",
182 "settings.service.form.enableDarkMode" : "開啟深色模å¼", 193 "settings.service.form.enableDarkMode" : "開啟深色模å¼",
@@ -192,17 +203,17 @@
192 "settings.service.form.indirectMessages" : "顯示所有新消æ¯çš„消æ¯æ¨™èªŒ", 203 "settings.service.form.indirectMessages" : "顯示所有新消æ¯çš„消æ¯æ¨™èªŒ",
193 "settings.service.form.isMutedInfo" : "åœç”¨æ™‚,所有通知è²å’Œè²éŸ³æ’­æ”¾éƒ½å°‡éœéŸ³", 204 "settings.service.form.isMutedInfo" : "åœç”¨æ™‚,所有通知è²å’Œè²éŸ³æ’­æ”¾éƒ½å°‡éœéŸ³",
194 "settings.service.form.name" : "å稱", 205 "settings.service.form.name" : "å稱",
195 "settings.service.form.proxy.headline" : "HTTP\/HTTPS Proxy Settings", 206 "settings.service.form.proxy.headline" : "HTTP\/HTTPS 代ç†ä¼ºæœå™¨è¨­å®š",
196 "settings.service.form.proxy.host" : "Proxy Host\/IP", 207 "settings.service.form.proxy.host" : "代ç†ä¼ºæœå™¨ç¶²åŸŸ \/ IP",
197 "settings.service.form.proxy.info" : "Proxy 設定ä¸æœƒèˆ‡ Franz 伺æœå™¨åŒæ­¥", 208 "settings.service.form.proxy.info" : "Proxy 設定ä¸æœƒèˆ‡ Franz 伺æœå™¨åŒæ­¥",
198 "settings.service.form.proxy.isEnabled" : "使用 Proxy", 209 "settings.service.form.proxy.isEnabled" : "使用 Proxy",
199 "settings.service.form.proxy.password" : "密碼 (é¸å¡«)", 210 "settings.service.form.proxy.password" : "密碼 (é¸å¡«)",
200 "settings.service.form.proxy.port" : "Port", 211 "settings.service.form.proxy.port" : "通訊阜",
201 "settings.service.form.proxy.restartInfo" : "Please restart Franz after changing proxy Settings.", 212 "settings.service.form.proxy.restartInfo" : "在變更 Proxy 設定後,請é‡æ–°å•Ÿå‹• Franz",
202 "settings.service.form.proxy.user" : "使用者 (é¸å¡«)", 213 "settings.service.form.proxy.user" : "使用者 (é¸å¡«)",
203 "settings.service.form.saveButton" : "ä¿å­˜æœå‹™", 214 "settings.service.form.saveButton" : "ä¿å­˜æœå‹™",
204 "settings.service.form.spellcheckerLanguage" : "Spell checking Language", 215 "settings.service.form.spellcheckerLanguage" : "拼字檢查語言",
205 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})", 216 "settings.service.form.spellcheckerLanguage.default" : "使用系統é è¨­ ({default})",
206 "settings.service.form.tabHosted" : "託管", 217 "settings.service.form.tabHosted" : "託管",
207 "settings.service.form.tabOnPremise" : "自我託管â­ï¸", 218 "settings.service.form.tabOnPremise" : "自我託管â­ï¸",
208 "settings.service.form.team" : "團隊", 219 "settings.service.form.team" : "團隊",
@@ -215,7 +226,7 @@
215 "settings.services.tooltip.isDisabled" : "æœå‹™å·²åœç”¨", 226 "settings.services.tooltip.isDisabled" : "æœå‹™å·²åœç”¨",
216 "settings.services.tooltip.isMuted" : "所有的è²éŸ³éƒ½æ˜¯éœéŸ³", 227 "settings.services.tooltip.isMuted" : "所有的è²éŸ³éƒ½æ˜¯éœéŸ³",
217 "settings.services.tooltip.notificationsDisabled" : "通知已åœç”¨", 228 "settings.services.tooltip.notificationsDisabled" : "通知已åœç”¨",
218 "settings.services.updatedInfo" : "你的更變已經儲存", 229 "settings.services.updatedInfo" : "已儲存你的變更",
219 "settings.user.form.accountType.company" : "å…¬å¸", 230 "settings.user.form.accountType.company" : "å…¬å¸",
220 "settings.user.form.accountType.individual" : "個人", 231 "settings.user.form.accountType.individual" : "個人",
221 "settings.user.form.accountType.label" : "帳戶類型", 232 "settings.user.form.accountType.label" : "帳戶類型",
@@ -235,7 +246,7 @@
235 "signup.firstname.label" : "å", 246 "signup.firstname.label" : "å",
236 "signup.headline" : "註冊", 247 "signup.headline" : "註冊",
237 "signup.lastname.label" : "姓", 248 "signup.lastname.label" : "姓",
238 "signup.legal.info" : "你接å—é€éŽå‰µå»ºä¸€å€‹Franz帳戶", 249 "signup.legal.info" : "é€éŽå‰µå»ºä¸€å€‹ Franz 帳戶,你åŒæ„",
239 "signup.legal.privacy" : "éš±ç§è²æ˜Ž", 250 "signup.legal.privacy" : "éš±ç§è²æ˜Ž",
240 "signup.legal.terms" : "æœå‹™æ¢æ¬¾", 251 "signup.legal.terms" : "æœå‹™æ¢æ¬¾",
241 "signup.link.login" : "已經有一個帳戶,登入?", 252 "signup.link.login" : "已經有一個帳戶,登入?",
@@ -245,14 +256,14 @@
245 "subscription.features.ads" : "無廣告,永é !", 256 "subscription.features.ads" : "無廣告,永é !",
246 "subscription.features.comingSoon" : "å³å°‡æŽ¨å‡º", 257 "subscription.features.comingSoon" : "å³å°‡æŽ¨å‡º",
247 "subscription.features.encryptedSync" : "加密的會話åŒæ­¥", 258 "subscription.features.encryptedSync" : "加密的會話åŒæ­¥",
248 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 259 "subscription.features.noInterruptions" : "å‡ç´šæŽˆæ¬Šæ²’有延é²èˆ‡æ‰“盹",
249 "subscription.features.onpremise" : "添加本地\/託管æœå‹™å¦‚HipChat", 260 "subscription.features.onpremise" : "添加本地\/託管æœå‹™å¦‚HipChat",
250 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 261 "subscription.features.onpremise.mattermost" : "加入如 Mattermost 等已é å®š \/ 託管的æœå‹™",
251 "subscription.features.proxy" : "Proxy support for services", 262 "subscription.features.proxy" : "æœå‹™çš„代ç†ä¼ºæœå™¨æ”¯æ´",
252 "subscription.features.spellchecker" : "支æ´æ‹¼å­—檢查", 263 "subscription.features.spellchecker" : "支æ´æ‹¼å­—檢查",
253 "subscription.includedFeatures" : "包å«é«˜ç´šFranz付費帳戶", 264 "subscription.includedFeatures" : "Franz 高級支æ´å¸³æˆ¶åŒ…å«",
254 "subscription.paymentSessionError" : "無法åˆå§‹åŒ–付款表單", 265 "subscription.paymentSessionError" : "無法åˆå§‹åŒ–付款表單",
255 "subscription.submit.label" : "我想支æŒFranz的開發", 266 "subscription.submit.label" : "æˆ‘æƒ³æ”¯æŒ Franz 開發",
256 "subscription.type.free" : "自由", 267 "subscription.type.free" : "自由",
257 "subscription.type.month" : "月", 268 "subscription.type.month" : "月",
258 "subscription.type.year" : "å¹´", 269 "subscription.type.year" : "å¹´",
diff --git a/src/i18n/manage-translations.js b/src/i18n/manage-translations.js
new file mode 100644
index 000000000..ee64c9c09
--- /dev/null
+++ b/src/i18n/manage-translations.js
@@ -0,0 +1,9 @@
1require('@babel/register');
2const manageTranslations = require('react-intl-translations-manager').default;
3
4manageTranslations({
5 messagesDirectory: 'src/i18n/messages',
6 translationsDirectory: 'src/i18n/locales',
7 singleMessagesFile: true,
8 languages: ['en-US'],
9});
diff --git a/src/i18n/messages/src/components/auth/Import.json b/src/i18n/messages/src/components/auth/Import.json
new file mode 100644
index 000000000..264fc729b
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/Import.json
@@ -0,0 +1,54 @@
1[
2 {
3 "id": "import.headline",
4 "defaultMessage": "!!!Import your Franz 4 services",
5 "file": "src/components/auth/Import.js",
6 "start": {
7 "line": 13,
8 "column": 12
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "import.notSupportedHeadline",
17 "defaultMessage": "!!!Services not yet supported in Franz 5",
18 "file": "src/components/auth/Import.js",
19 "start": {
20 "line": 17,
21 "column": 24
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "import.submit.label",
30 "defaultMessage": "!!!Import {count} services",
31 "file": "src/components/auth/Import.js",
32 "start": {
33 "line": 21,
34 "column": 21
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 },
41 {
42 "id": "import.skip.label",
43 "defaultMessage": "!!!I want to add services manually",
44 "file": "src/components/auth/Import.js",
45 "start": {
46 "line": 25,
47 "column": 19
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/auth/Invite.json b/src/i18n/messages/src/components/auth/Invite.json
new file mode 100644
index 000000000..57c9bddcf
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/Invite.json
@@ -0,0 +1,93 @@
1[
2 {
3 "id": "settings.invite.headline",
4 "defaultMessage": "!!!Invite Friends",
5 "file": "src/components/auth/Invite.js",
6 "start": {
7 "line": 16,
8 "column": 20
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "invite.headline.friends",
17 "defaultMessage": "!!!Invite 3 of your friends or colleagues",
18 "file": "src/components/auth/Invite.js",
19 "start": {
20 "line": 20,
21 "column": 12
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 },
28 {
29 "id": "invite.name.label",
30 "defaultMessage": "!!!Name",
31 "file": "src/components/auth/Invite.js",
32 "start": {
33 "line": 24,
34 "column": 13
35 },
36 "end": {
37 "line": 27,
38 "column": 3
39 }
40 },
41 {
42 "id": "invite.email.label",
43 "defaultMessage": "!!!Email address",
44 "file": "src/components/auth/Invite.js",
45 "start": {
46 "line": 28,
47 "column": 14
48 },
49 "end": {
50 "line": 31,
51 "column": 3
52 }
53 },
54 {
55 "id": "invite.submit.label",
56 "defaultMessage": "!!!Send invites",
57 "file": "src/components/auth/Invite.js",
58 "start": {
59 "line": 32,
60 "column": 21
61 },
62 "end": {
63 "line": 35,
64 "column": 3
65 }
66 },
67 {
68 "id": "invite.skip.label",
69 "defaultMessage": "!!!I want to do this later",
70 "file": "src/components/auth/Invite.js",
71 "start": {
72 "line": 36,
73 "column": 19
74 },
75 "end": {
76 "line": 39,
77 "column": 3
78 }
79 },
80 {
81 "id": "invite.successInfo",
82 "defaultMessage": "!!!Invitations sent successfully",
83 "file": "src/components/auth/Invite.js",
84 "start": {
85 "line": 40,
86 "column": 21
87 },
88 "end": {
89 "line": 43,
90 "column": 3
91 }
92 }
93] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/auth/Login.json b/src/i18n/messages/src/components/auth/Login.json
new file mode 100644
index 000000000..177f6000b
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/Login.json
@@ -0,0 +1,119 @@
1[
2 {
3 "id": "login.headline",
4 "defaultMessage": "!!!Sign in",
5 "file": "src/components/auth/Login.js",
6 "start": {
7 "line": 17,
8 "column": 12
9 },
10 "end": {
11 "line": 20,
12 "column": 3
13 }
14 },
15 {
16 "id": "login.email.label",
17 "defaultMessage": "!!!Email address",
18 "file": "src/components/auth/Login.js",
19 "start": {
20 "line": 21,
21 "column": 14
22 },
23 "end": {
24 "line": 24,
25 "column": 3
26 }
27 },
28 {
29 "id": "login.password.label",
30 "defaultMessage": "!!!Password",
31 "file": "src/components/auth/Login.js",
32 "start": {
33 "line": 25,
34 "column": 17
35 },
36 "end": {
37 "line": 28,
38 "column": 3
39 }
40 },
41 {
42 "id": "login.submit.label",
43 "defaultMessage": "!!!Sign in",
44 "file": "src/components/auth/Login.js",
45 "start": {
46 "line": 29,
47 "column": 21
48 },
49 "end": {
50 "line": 32,
51 "column": 3
52 }
53 },
54 {
55 "id": "login.invalidCredentials",
56 "defaultMessage": "!!!Email or password not valid",
57 "file": "src/components/auth/Login.js",
58 "start": {
59 "line": 33,
60 "column": 22
61 },
62 "end": {
63 "line": 36,
64 "column": 3
65 }
66 },
67 {
68 "id": "login.tokenExpired",
69 "defaultMessage": "!!!Your session expired, please login again.",
70 "file": "src/components/auth/Login.js",
71 "start": {
72 "line": 37,
73 "column": 16
74 },
75 "end": {
76 "line": 40,
77 "column": 3
78 }
79 },
80 {
81 "id": "login.serverLogout",
82 "defaultMessage": "!!!Your session expired, please login again.",
83 "file": "src/components/auth/Login.js",
84 "start": {
85 "line": 41,
86 "column": 16
87 },
88 "end": {
89 "line": 44,
90 "column": 3
91 }
92 },
93 {
94 "id": "login.link.signup",
95 "defaultMessage": "!!!Create a free account",
96 "file": "src/components/auth/Login.js",
97 "start": {
98 "line": 45,
99 "column": 14
100 },
101 "end": {
102 "line": 48,
103 "column": 3
104 }
105 },
106 {
107 "id": "login.link.password",
108 "defaultMessage": "!!!Forgot password",
109 "file": "src/components/auth/Login.js",
110 "start": {
111 "line": 49,
112 "column": 16
113 },
114 "end": {
115 "line": 52,
116 "column": 3
117 }
118 }
119] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/auth/Password.json b/src/i18n/messages/src/components/auth/Password.json
new file mode 100644
index 000000000..f335b3acb
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/Password.json
@@ -0,0 +1,93 @@
1[
2 {
3 "id": "password.headline",
4 "defaultMessage": "!!!Forgot password",
5 "file": "src/components/auth/Password.js",
6 "start": {
7 "line": 14,
8 "column": 12
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "password.email.label",
17 "defaultMessage": "!!!Email address",
18 "file": "src/components/auth/Password.js",
19 "start": {
20 "line": 18,
21 "column": 14
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "password.submit.label",
30 "defaultMessage": "!!!Submit",
31 "file": "src/components/auth/Password.js",
32 "start": {
33 "line": 22,
34 "column": 21
35 },
36 "end": {
37 "line": 25,
38 "column": 3
39 }
40 },
41 {
42 "id": "password.successInfo",
43 "defaultMessage": "!!!Your new password was sent to your email address",
44 "file": "src/components/auth/Password.js",
45 "start": {
46 "line": 26,
47 "column": 15
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "password.noUser",
56 "defaultMessage": "!!!No user affiliated with that email address",
57 "file": "src/components/auth/Password.js",
58 "start": {
59 "line": 30,
60 "column": 10
61 },
62 "end": {
63 "line": 33,
64 "column": 3
65 }
66 },
67 {
68 "id": "password.link.signup",
69 "defaultMessage": "!!!Create a free account",
70 "file": "src/components/auth/Password.js",
71 "start": {
72 "line": 34,
73 "column": 14
74 },
75 "end": {
76 "line": 37,
77 "column": 3
78 }
79 },
80 {
81 "id": "password.link.login",
82 "defaultMessage": "!!!Sign in to your account",
83 "file": "src/components/auth/Password.js",
84 "start": {
85 "line": 38,
86 "column": 13
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/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json
new file mode 100644
index 000000000..f711a55b4
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/Pricing.json
@@ -0,0 +1,54 @@
1[
2 {
3 "id": "pricing.headline",
4 "defaultMessage": "!!!Support Franz",
5 "file": "src/components/auth/Pricing.js",
6 "start": {
7 "line": 13,
8 "column": 12
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "pricing.support.label",
17 "defaultMessage": "!!!Select your support plan",
18 "file": "src/components/auth/Pricing.js",
19 "start": {
20 "line": 17,
21 "column": 23
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 },
28 {
29 "id": "pricing.submit.label",
30 "defaultMessage": "!!!Support the development of Franz",
31 "file": "src/components/auth/Pricing.js",
32 "start": {
33 "line": 21,
34 "column": 21
35 },
36 "end": {
37 "line": 24,
38 "column": 3
39 }
40 },
41 {
42 "id": "pricing.link.skipPayment",
43 "defaultMessage": "!!!I don't want to support the development of Franz.",
44 "file": "src/components/auth/Pricing.js",
45 "start": {
46 "line": 25,
47 "column": 15
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/auth/Signup.json b/src/i18n/messages/src/components/auth/Signup.json
new file mode 100644
index 000000000..a09745048
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/Signup.json
@@ -0,0 +1,158 @@
1[
2 {
3 "id": "signup.headline",
4 "defaultMessage": "!!!Sign up",
5 "file": "src/components/auth/Signup.js",
6 "start": {
7 "line": 18,
8 "column": 12
9 },
10 "end": {
11 "line": 21,
12 "column": 3
13 }
14 },
15 {
16 "id": "signup.firstname.label",
17 "defaultMessage": "!!!Firstname",
18 "file": "src/components/auth/Signup.js",
19 "start": {
20 "line": 22,
21 "column": 18
22 },
23 "end": {
24 "line": 25,
25 "column": 3
26 }
27 },
28 {
29 "id": "signup.lastname.label",
30 "defaultMessage": "!!!Lastname",
31 "file": "src/components/auth/Signup.js",
32 "start": {
33 "line": 26,
34 "column": 17
35 },
36 "end": {
37 "line": 29,
38 "column": 3
39 }
40 },
41 {
42 "id": "signup.email.label",
43 "defaultMessage": "!!!Email address",
44 "file": "src/components/auth/Signup.js",
45 "start": {
46 "line": 30,
47 "column": 14
48 },
49 "end": {
50 "line": 33,
51 "column": 3
52 }
53 },
54 {
55 "id": "signup.company.label",
56 "defaultMessage": "!!!Company",
57 "file": "src/components/auth/Signup.js",
58 "start": {
59 "line": 34,
60 "column": 16
61 },
62 "end": {
63 "line": 37,
64 "column": 3
65 }
66 },
67 {
68 "id": "signup.password.label",
69 "defaultMessage": "!!!Password",
70 "file": "src/components/auth/Signup.js",
71 "start": {
72 "line": 38,
73 "column": 17
74 },
75 "end": {
76 "line": 41,
77 "column": 3
78 }
79 },
80 {
81 "id": "signup.legal.info",
82 "defaultMessage": "!!!By creating a Franz account you accept the",
83 "file": "src/components/auth/Signup.js",
84 "start": {
85 "line": 42,
86 "column": 13
87 },
88 "end": {
89 "line": 45,
90 "column": 3
91 }
92 },
93 {
94 "id": "signup.legal.terms",
95 "defaultMessage": "!!!Terms of service",
96 "file": "src/components/auth/Signup.js",
97 "start": {
98 "line": 46,
99 "column": 9
100 },
101 "end": {
102 "line": 49,
103 "column": 3
104 }
105 },
106 {
107 "id": "signup.legal.privacy",
108 "defaultMessage": "!!!Privacy Statement",
109 "file": "src/components/auth/Signup.js",
110 "start": {
111 "line": 50,
112 "column": 11
113 },
114 "end": {
115 "line": 53,
116 "column": 3
117 }
118 },
119 {
120 "id": "signup.submit.label",
121 "defaultMessage": "!!!Create account",
122 "file": "src/components/auth/Signup.js",
123 "start": {
124 "line": 54,
125 "column": 21
126 },
127 "end": {
128 "line": 57,
129 "column": 3
130 }
131 },
132 {
133 "id": "signup.link.login",
134 "defaultMessage": "!!!Already have an account, sign in?",
135 "file": "src/components/auth/Signup.js",
136 "start": {
137 "line": 58,
138 "column": 13
139 },
140 "end": {
141 "line": 61,
142 "column": 3
143 }
144 },
145 {
146 "id": "signup.emailDuplicate",
147 "defaultMessage": "!!!A user with that email address already exists",
148 "file": "src/components/auth/Signup.js",
149 "start": {
150 "line": 62,
151 "column": 18
152 },
153 "end": {
154 "line": 65,
155 "column": 3
156 }
157 }
158] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/auth/Welcome.json b/src/i18n/messages/src/components/auth/Welcome.json
new file mode 100644
index 000000000..b4d2ce689
--- /dev/null
+++ b/src/i18n/messages/src/components/auth/Welcome.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "welcome.signupButton",
4 "defaultMessage": "!!!Create a free account",
5 "file": "src/components/auth/Welcome.js",
6 "start": {
7 "line": 9,
8 "column": 16
9 },
10 "end": {
11 "line": 12,
12 "column": 3
13 }
14 },
15 {
16 "id": "welcome.loginButton",
17 "defaultMessage": "!!!Login to your account",
18 "file": "src/components/auth/Welcome.js",
19 "start": {
20 "line": 13,
21 "column": 15
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/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json
new file mode 100644
index 000000000..07603d062
--- /dev/null
+++ b/src/i18n/messages/src/components/layout/AppLayout.json
@@ -0,0 +1,80 @@
1[
2 {
3 "id": "infobar.servicesUpdated",
4 "defaultMessage": "!!!Your services have been updated.",
5 "file": "src/components/layout/AppLayout.js",
6 "start": {
7 "line": 22,
8 "column": 19
9 },
10 "end": {
11 "line": 25,
12 "column": 3
13 }
14 },
15 {
16 "id": "infobar.updateAvailable",
17 "defaultMessage": "!!!A new update for Franz is available.",
18 "file": "src/components/layout/AppLayout.js",
19 "start": {
20 "line": 26,
21 "column": 19
22 },
23 "end": {
24 "line": 29,
25 "column": 3
26 }
27 },
28 {
29 "id": "infobar.buttonReloadServices",
30 "defaultMessage": "!!!Reload services",
31 "file": "src/components/layout/AppLayout.js",
32 "start": {
33 "line": 30,
34 "column": 24
35 },
36 "end": {
37 "line": 33,
38 "column": 3
39 }
40 },
41 {
42 "id": "infobar.buttonChangelog",
43 "defaultMessage": "!!!Changelog",
44 "file": "src/components/layout/AppLayout.js",
45 "start": {
46 "line": 34,
47 "column": 13
48 },
49 "end": {
50 "line": 37,
51 "column": 3
52 }
53 },
54 {
55 "id": "infobar.buttonInstallUpdate",
56 "defaultMessage": "!!!Restart & install update",
57 "file": "src/components/layout/AppLayout.js",
58 "start": {
59 "line": 38,
60 "column": 23
61 },
62 "end": {
63 "line": 41,
64 "column": 3
65 }
66 },
67 {
68 "id": "infobar.requiredRequestsFailed",
69 "defaultMessage": "!!!Could not load services and user information",
70 "file": "src/components/layout/AppLayout.js",
71 "start": {
72 "line": 42,
73 "column": 26
74 },
75 "end": {
76 "line": 45,
77 "column": 3
78 }
79 }
80] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/layout/Sidebar.json b/src/i18n/messages/src/components/layout/Sidebar.json
new file mode 100644
index 000000000..7aa00a186
--- /dev/null
+++ b/src/i18n/messages/src/components/layout/Sidebar.json
@@ -0,0 +1,54 @@
1[
2 {
3 "id": "sidebar.settings",
4 "defaultMessage": "!!!Settings",
5 "file": "src/components/layout/Sidebar.js",
6 "start": {
7 "line": 11,
8 "column": 12
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "sidebar.addNewService",
17 "defaultMessage": "!!!Add new service",
18 "file": "src/components/layout/Sidebar.js",
19 "start": {
20 "line": 15,
21 "column": 17
22 },
23 "end": {
24 "line": 18,
25 "column": 3
26 }
27 },
28 {
29 "id": "sidebar.muteApp",
30 "defaultMessage": "!!!Disable notifications & audio",
31 "file": "src/components/layout/Sidebar.js",
32 "start": {
33 "line": 19,
34 "column": 8
35 },
36 "end": {
37 "line": 22,
38 "column": 3
39 }
40 },
41 {
42 "id": "sidebar.unmuteApp",
43 "defaultMessage": "!!!Enable notifications & audio",
44 "file": "src/components/layout/Sidebar.js",
45 "start": {
46 "line": 23,
47 "column": 10
48 },
49 "end": {
50 "line": 26,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json b/src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json
new file mode 100644
index 000000000..c8fe802df
--- /dev/null
+++ b/src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json
@@ -0,0 +1,67 @@
1[
2 {
3 "id": "service.errorHandler.headline",
4 "defaultMessage": "!!!Oh no!",
5 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
6 "start": {
7 "line": 12,
8 "column": 12
9 },
10 "end": {
11 "line": 15,
12 "column": 3
13 }
14 },
15 {
16 "id": "service.errorHandler.text",
17 "defaultMessage": "!!!{name} has failed to load.",
18 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
19 "start": {
20 "line": 16,
21 "column": 8
22 },
23 "end": {
24 "line": 19,
25 "column": 3
26 }
27 },
28 {
29 "id": "service.errorHandler.action",
30 "defaultMessage": "!!!Reload {name}",
31 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
32 "start": {
33 "line": 20,
34 "column": 10
35 },
36 "end": {
37 "line": 23,
38 "column": 3
39 }
40 },
41 {
42 "id": "service.errorHandler.editAction",
43 "defaultMessage": "!!!Edit {name}",
44 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
45 "start": {
46 "line": 24,
47 "column": 14
48 },
49 "end": {
50 "line": 27,
51 "column": 3
52 }
53 },
54 {
55 "id": "service.errorHandler.message",
56 "defaultMessage": "!!!Error:",
57 "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js",
58 "start": {
59 "line": 28,
60 "column": 16
61 },
62 "end": {
63 "line": 31,
64 "column": 3
65 }
66 }
67] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/services/content/ServiceDisabled.json b/src/i18n/messages/src/components/services/content/ServiceDisabled.json
new file mode 100644
index 000000000..8bfad28c7
--- /dev/null
+++ b/src/i18n/messages/src/components/services/content/ServiceDisabled.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "service.disabledHandler.headline",
4 "defaultMessage": "!!!{name} is disabled",
5 "file": "src/components/services/content/ServiceDisabled.js",
6 "start": {
7 "line": 9,
8 "column": 12
9 },
10 "end": {
11 "line": 12,
12 "column": 3
13 }
14 },
15 {
16 "id": "service.disabledHandler.action",
17 "defaultMessage": "!!!Enable {name}",
18 "file": "src/components/services/content/ServiceDisabled.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/components/services/content/Services.json b/src/i18n/messages/src/components/services/content/Services.json
new file mode 100644
index 000000000..884ab0c90
--- /dev/null
+++ b/src/i18n/messages/src/components/services/content/Services.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "services.welcome",
4 "defaultMessage": "!!!Welcome to Franz",
5 "file": "src/components/services/content/Services.js",
6 "start": {
7 "line": 11,
8 "column": 11
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "services.getStarted",
17 "defaultMessage": "!!!Get started",
18 "file": "src/components/services/content/Services.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/services/content/WebviewCrashHandler.json b/src/i18n/messages/src/components/services/content/WebviewCrashHandler.json
new file mode 100644
index 000000000..c3d6c41a5
--- /dev/null
+++ b/src/i18n/messages/src/components/services/content/WebviewCrashHandler.json
@@ -0,0 +1,54 @@
1[
2 {
3 "id": "service.crashHandler.headline",
4 "defaultMessage": "!!!Oh no!",
5 "file": "src/components/services/content/WebviewCrashHandler.js",
6 "start": {
7 "line": 10,
8 "column": 12
9 },
10 "end": {
11 "line": 13,
12 "column": 3
13 }
14 },
15 {
16 "id": "service.crashHandler.text",
17 "defaultMessage": "!!!{name} has caused an error.",
18 "file": "src/components/services/content/WebviewCrashHandler.js",
19 "start": {
20 "line": 14,
21 "column": 8
22 },
23 "end": {
24 "line": 17,
25 "column": 3
26 }
27 },
28 {
29 "id": "service.crashHandler.action",
30 "defaultMessage": "!!!Reload {name}",
31 "file": "src/components/services/content/WebviewCrashHandler.js",
32 "start": {
33 "line": 18,
34 "column": 10
35 },
36 "end": {
37 "line": 21,
38 "column": 3
39 }
40 },
41 {
42 "id": "service.crashHandler.autoReload",
43 "defaultMessage": "!!!Trying to automatically restore {name} in {seconds} seconds",
44 "file": "src/components/services/content/WebviewCrashHandler.js",
45 "start": {
46 "line": 22,
47 "column": 14
48 },
49 "end": {
50 "line": 25,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/services/tabs/TabItem.json b/src/i18n/messages/src/components/services/tabs/TabItem.json
new file mode 100644
index 000000000..08a07845c
--- /dev/null
+++ b/src/i18n/messages/src/components/services/tabs/TabItem.json
@@ -0,0 +1,119 @@
1[
2 {
3 "id": "tabs.item.reload",
4 "defaultMessage": "!!!Reload",
5 "file": "src/components/services/tabs/TabItem.js",
6 "start": {
7 "line": 15,
8 "column": 10
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "tabs.item.edit",
17 "defaultMessage": "!!!Edit",
18 "file": "src/components/services/tabs/TabItem.js",
19 "start": {
20 "line": 19,
21 "column": 8
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "tabs.item.disableNotifications",
30 "defaultMessage": "!!!Disable notifications",
31 "file": "src/components/services/tabs/TabItem.js",
32 "start": {
33 "line": 23,
34 "column": 24
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 },
41 {
42 "id": "tabs.item.enableNotification",
43 "defaultMessage": "!!!Enable notifications",
44 "file": "src/components/services/tabs/TabItem.js",
45 "start": {
46 "line": 27,
47 "column": 23
48 },
49 "end": {
50 "line": 30,
51 "column": 3
52 }
53 },
54 {
55 "id": "tabs.item.disableAudio",
56 "defaultMessage": "!!!Disable audio",
57 "file": "src/components/services/tabs/TabItem.js",
58 "start": {
59 "line": 31,
60 "column": 16
61 },
62 "end": {
63 "line": 34,
64 "column": 3
65 }
66 },
67 {
68 "id": "tabs.item.enableAudio",
69 "defaultMessage": "!!!Enable audio",
70 "file": "src/components/services/tabs/TabItem.js",
71 "start": {
72 "line": 35,
73 "column": 15
74 },
75 "end": {
76 "line": 38,
77 "column": 3
78 }
79 },
80 {
81 "id": "tabs.item.disableService",
82 "defaultMessage": "!!!Disable Service",
83 "file": "src/components/services/tabs/TabItem.js",
84 "start": {
85 "line": 39,
86 "column": 18
87 },
88 "end": {
89 "line": 42,
90 "column": 3
91 }
92 },
93 {
94 "id": "tabs.item.enableService",
95 "defaultMessage": "!!!Enable Service",
96 "file": "src/components/services/tabs/TabItem.js",
97 "start": {
98 "line": 43,
99 "column": 17
100 },
101 "end": {
102 "line": 46,
103 "column": 3
104 }
105 },
106 {
107 "id": "tabs.item.deleteService",
108 "defaultMessage": "!!!Delete Service",
109 "file": "src/components/services/tabs/TabItem.js",
110 "start": {
111 "line": 47,
112 "column": 17
113 },
114 "end": {
115 "line": 50,
116 "column": 3
117 }
118 }
119] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/account/AccountDashboard.json b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
new file mode 100644
index 000000000..603950395
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/account/AccountDashboard.json
@@ -0,0 +1,197 @@
1[
2 {
3 "id": "settings.account.headline",
4 "defaultMessage": "!!!Account",
5 "file": "src/components/settings/account/AccountDashboard.js",
6 "start": {
7 "line": 15,
8 "column": 12
9 },
10 "end": {
11 "line": 18,
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": 19,
21 "column": 24
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.account.headlineUpgrade",
30 "defaultMessage": "!!!Upgrade your Account",
31 "file": "src/components/settings/account/AccountDashboard.js",
32 "start": {
33 "line": 23,
34 "column": 19
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.account.headlineInvoices",
43 "defaultMessage": "!!Invoices",
44 "file": "src/components/settings/account/AccountDashboard.js",
45 "start": {
46 "line": 27,
47 "column": 20
48 },
49 "end": {
50 "line": 30,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.account.headlineDangerZone",
56 "defaultMessage": "!!Danger Zone",
57 "file": "src/components/settings/account/AccountDashboard.js",
58 "start": {
59 "line": 31,
60 "column": 22
61 },
62 "end": {
63 "line": 34,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.account.manageSubscription.label",
69 "defaultMessage": "!!!Manage your subscription",
70 "file": "src/components/settings/account/AccountDashboard.js",
71 "start": {
72 "line": 35,
73 "column": 33
74 },
75 "end": {
76 "line": 38,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.account.accountType.basic",
82 "defaultMessage": "!!!Basic Account",
83 "file": "src/components/settings/account/AccountDashboard.js",
84 "start": {
85 "line": 39,
86 "column": 20
87 },
88 "end": {
89 "line": 42,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.account.accountType.premium",
95 "defaultMessage": "!!!Premium Supporter Account",
96 "file": "src/components/settings/account/AccountDashboard.js",
97 "start": {
98 "line": 43,
99 "column": 22
100 },
101 "end": {
102 "line": 46,
103 "column": 3
104 }
105 },
106 {
107 "id": "settings.account.account.editButton",
108 "defaultMessage": "!!!Edit Account",
109 "file": "src/components/settings/account/AccountDashboard.js",
110 "start": {
111 "line": 47,
112 "column": 21
113 },
114 "end": {
115 "line": 50,
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": 51,
125 "column": 19
126 },
127 "end": {
128 "line": 54,
129 "column": 3
130 }
131 },
132 {
133 "id": "settings.account.userInfoRequestFailed",
134 "defaultMessage": "!!!Could not load user information",
135 "file": "src/components/settings/account/AccountDashboard.js",
136 "start": {
137 "line": 55,
138 "column": 25
139 },
140 "end": {
141 "line": 58,
142 "column": 3
143 }
144 },
145 {
146 "id": "settings.account.tryReloadUserInfoRequest",
147 "defaultMessage": "!!!Try again",
148 "file": "src/components/settings/account/AccountDashboard.js",
149 "start": {
150 "line": 59,
151 "column": 28
152 },
153 "end": {
154 "line": 62,
155 "column": 3
156 }
157 },
158 {
159 "id": "settings.account.deleteAccount",
160 "defaultMessage": "!!!Delete account",
161 "file": "src/components/settings/account/AccountDashboard.js",
162 "start": {
163 "line": 63,
164 "column": 17
165 },
166 "end": {
167 "line": 66,
168 "column": 3
169 }
170 },
171 {
172 "id": "settings.account.deleteInfo",
173 "defaultMessage": "!!!If you don't need your Franz account any longer, you can delete your account and all related data here.",
174 "file": "src/components/settings/account/AccountDashboard.js",
175 "start": {
176 "line": 67,
177 "column": 14
178 },
179 "end": {
180 "line": 70,
181 "column": 3
182 }
183 },
184 {
185 "id": "settings.account.deleteEmailSent",
186 "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",
188 "start": {
189 "line": 71,
190 "column": 19
191 },
192 "end": {
193 "line": 74,
194 "column": 3
195 }
196 }
197] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
new file mode 100644
index 000000000..785ce9f29
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
@@ -0,0 +1,80 @@
1[
2 {
3 "id": "settings.navigation.availableServices",
4 "defaultMessage": "!!!Available services",
5 "file": "src/components/settings/navigation/SettingsNavigation.js",
6 "start": {
7 "line": 9,
8 "column": 21
9 },
10 "end": {
11 "line": 12,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.navigation.yourServices",
17 "defaultMessage": "!!!Your services",
18 "file": "src/components/settings/navigation/SettingsNavigation.js",
19 "start": {
20 "line": 13,
21 "column": 16
22 },
23 "end": {
24 "line": 16,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.navigation.account",
30 "defaultMessage": "!!!Account",
31 "file": "src/components/settings/navigation/SettingsNavigation.js",
32 "start": {
33 "line": 17,
34 "column": 11
35 },
36 "end": {
37 "line": 20,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.navigation.settings",
43 "defaultMessage": "!!!Settings",
44 "file": "src/components/settings/navigation/SettingsNavigation.js",
45 "start": {
46 "line": 21,
47 "column": 12
48 },
49 "end": {
50 "line": 24,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.navigation.inviteFriends",
56 "defaultMessage": "!!!Invite Friends",
57 "file": "src/components/settings/navigation/SettingsNavigation.js",
58 "start": {
59 "line": 25,
60 "column": 17
61 },
62 "end": {
63 "line": 28,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.navigation.logout",
69 "defaultMessage": "!!!Logout",
70 "file": "src/components/settings/navigation/SettingsNavigation.js",
71 "start": {
72 "line": 29,
73 "column": 10
74 },
75 "end": {
76 "line": 32,
77 "column": 3
78 }
79 }
80] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
new file mode 100644
index 000000000..7d9ed3283
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json
@@ -0,0 +1,106 @@
1[
2 {
3 "id": "settings.recipes.headline",
4 "defaultMessage": "!!!Available Services",
5 "file": "src/components/settings/recipes/RecipesDashboard.js",
6 "start": {
7 "line": 15,
8 "column": 12
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.searchService",
17 "defaultMessage": "!!!Search service",
18 "file": "src/components/settings/recipes/RecipesDashboard.js",
19 "start": {
20 "line": 19,
21 "column": 17
22 },
23 "end": {
24 "line": 22,
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": 23,
34 "column": 22
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.recipes.all",
43 "defaultMessage": "!!!All services",
44 "file": "src/components/settings/recipes/RecipesDashboard.js",
45 "start": {
46 "line": 27,
47 "column": 14
48 },
49 "end": {
50 "line": 30,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.recipes.dev",
56 "defaultMessage": "!!!Development",
57 "file": "src/components/settings/recipes/RecipesDashboard.js",
58 "start": {
59 "line": 31,
60 "column": 14
61 },
62 "end": {
63 "line": 34,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.recipes.nothingFound",
69 "defaultMessage": "!!!Sorry, but no service matched your search term.",
70 "file": "src/components/settings/recipes/RecipesDashboard.js",
71 "start": {
72 "line": 35,
73 "column": 16
74 },
75 "end": {
76 "line": 38,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.recipes.servicesSuccessfulAddedInfo",
82 "defaultMessage": "!!!Service successfully added",
83 "file": "src/components/settings/recipes/RecipesDashboard.js",
84 "start": {
85 "line": 39,
86 "column": 31
87 },
88 "end": {
89 "line": 42,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.recipes.missingService",
95 "defaultMessage": "!!!Missing a service?",
96 "file": "src/components/settings/recipes/RecipesDashboard.js",
97 "start": {
98 "line": 43,
99 "column": 18
100 },
101 "end": {
102 "line": 46,
103 "column": 3
104 }
105 }
106] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/services/EditServiceForm.json b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
new file mode 100644
index 000000000..42b741b7a
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/services/EditServiceForm.json
@@ -0,0 +1,288 @@
1[
2 {
3 "id": "settings.service.form.saveButton",
4 "defaultMessage": "!!!Save service",
5 "file": "src/components/settings/services/EditServiceForm.js",
6 "start": {
7 "line": 22,
8 "column": 15
9 },
10 "end": {
11 "line": 25,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.service.form.deleteButton",
17 "defaultMessage": "!!!Delete Service",
18 "file": "src/components/settings/services/EditServiceForm.js",
19 "start": {
20 "line": 26,
21 "column": 17
22 },
23 "end": {
24 "line": 29,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.service.form.availableServices",
30 "defaultMessage": "!!!Available services",
31 "file": "src/components/settings/services/EditServiceForm.js",
32 "start": {
33 "line": 30,
34 "column": 21
35 },
36 "end": {
37 "line": 33,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.service.form.yourServices",
43 "defaultMessage": "!!!Your services",
44 "file": "src/components/settings/services/EditServiceForm.js",
45 "start": {
46 "line": 34,
47 "column": 16
48 },
49 "end": {
50 "line": 37,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.service.form.addServiceHeadline",
56 "defaultMessage": "!!!Add {name}",
57 "file": "src/components/settings/services/EditServiceForm.js",
58 "start": {
59 "line": 38,
60 "column": 22
61 },
62 "end": {
63 "line": 41,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.service.form.editServiceHeadline",
69 "defaultMessage": "!!!Edit {name}",
70 "file": "src/components/settings/services/EditServiceForm.js",
71 "start": {
72 "line": 42,
73 "column": 23
74 },
75 "end": {
76 "line": 45,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.service.form.tabHosted",
82 "defaultMessage": "!!!Hosted",
83 "file": "src/components/settings/services/EditServiceForm.js",
84 "start": {
85 "line": 46,
86 "column": 13
87 },
88 "end": {
89 "line": 49,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.service.form.tabOnPremise",
95 "defaultMessage": "!!!Self hosted â­ï¸",
96 "file": "src/components/settings/services/EditServiceForm.js",
97 "start": {
98 "line": 50,
99 "column": 16
100 },
101 "end": {
102 "line": 53,
103 "column": 3
104 }
105 },
106 {
107 "id": "settings.service.form.useHostedService",
108 "defaultMessage": "!!!Use the hosted {name} service.",
109 "file": "src/components/settings/services/EditServiceForm.js",
110 "start": {
111 "line": 54,
112 "column": 20
113 },
114 "end": {
115 "line": 57,
116 "column": 3
117 }
118 },
119 {
120 "id": "settings.service.form.customUrlValidationError",
121 "defaultMessage": "!!!Could not validate custom {name} server.",
122 "file": "src/components/settings/services/EditServiceForm.js",
123 "start": {
124 "line": 58,
125 "column": 28
126 },
127 "end": {
128 "line": 61,
129 "column": 3
130 }
131 },
132 {
133 "id": "settings.service.form.customUrlPremiumInfo",
134 "defaultMessage": "!!!To add self hosted services, you need a Franz Premium Supporter Account.",
135 "file": "src/components/settings/services/EditServiceForm.js",
136 "start": {
137 "line": 62,
138 "column": 24
139 },
140 "end": {
141 "line": 65,
142 "column": 3
143 }
144 },
145 {
146 "id": "settings.service.form.customUrlUpgradeAccount",
147 "defaultMessage": "!!!Upgrade your account",
148 "file": "src/components/settings/services/EditServiceForm.js",
149 "start": {
150 "line": 66,
151 "column": 27
152 },
153 "end": {
154 "line": 69,
155 "column": 3
156 }
157 },
158 {
159 "id": "settings.service.form.indirectMessageInfo",
160 "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...",
161 "file": "src/components/settings/services/EditServiceForm.js",
162 "start": {
163 "line": 70,
164 "column": 23
165 },
166 "end": {
167 "line": 73,
168 "column": 3
169 }
170 },
171 {
172 "id": "settings.service.form.isMutedInfo",
173 "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted",
174 "file": "src/components/settings/services/EditServiceForm.js",
175 "start": {
176 "line": 74,
177 "column": 15
178 },
179 "end": {
180 "line": 77,
181 "column": 3
182 }
183 },
184 {
185 "id": "settings.service.form.headlineNotifications",
186 "defaultMessage": "!!!Notifications",
187 "file": "src/components/settings/services/EditServiceForm.js",
188 "start": {
189 "line": 78,
190 "column": 25
191 },
192 "end": {
193 "line": 81,
194 "column": 3
195 }
196 },
197 {
198 "id": "settings.service.form.headlineBadges",
199 "defaultMessage": "!!!Unread message badges",
200 "file": "src/components/settings/services/EditServiceForm.js",
201 "start": {
202 "line": 82,
203 "column": 18
204 },
205 "end": {
206 "line": 85,
207 "column": 3
208 }
209 },
210 {
211 "id": "settings.service.form.headlineGeneral",
212 "defaultMessage": "!!!General",
213 "file": "src/components/settings/services/EditServiceForm.js",
214 "start": {
215 "line": 86,
216 "column": 19
217 },
218 "end": {
219 "line": 89,
220 "column": 3
221 }
222 },
223 {
224 "id": "settings.service.form.iconDelete",
225 "defaultMessage": "!!!Delete",
226 "file": "src/components/settings/services/EditServiceForm.js",
227 "start": {
228 "line": 90,
229 "column": 14
230 },
231 "end": {
232 "line": 93,
233 "column": 3
234 }
235 },
236 {
237 "id": "settings.service.form.iconUpload",
238 "defaultMessage": "!!!Drop your image, or click here",
239 "file": "src/components/settings/services/EditServiceForm.js",
240 "start": {
241 "line": 94,
242 "column": 14
243 },
244 "end": {
245 "line": 97,
246 "column": 3
247 }
248 },
249 {
250 "id": "settings.service.form.proxy.headline",
251 "defaultMessage": "!!!HTTP/HTTPS Proxy Settings",
252 "file": "src/components/settings/services/EditServiceForm.js",
253 "start": {
254 "line": 98,
255 "column": 17
256 },
257 "end": {
258 "line": 101,
259 "column": 3
260 }
261 },
262 {
263 "id": "settings.service.form.proxy.restartInfo",
264 "defaultMessage": "!!!Please restart Franz after changing proxy Settings.",
265 "file": "src/components/settings/services/EditServiceForm.js",
266 "start": {
267 "line": 102,
268 "column": 20
269 },
270 "end": {
271 "line": 105,
272 "column": 3
273 }
274 },
275 {
276 "id": "settings.service.form.proxy.info",
277 "defaultMessage": "!!!Proxy settings will not be synchronized with the Franz servers.",
278 "file": "src/components/settings/services/EditServiceForm.js",
279 "start": {
280 "line": 106,
281 "column": 13
282 },
283 "end": {
284 "line": 109,
285 "column": 3
286 }
287 }
288] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/services/ServiceError.json b/src/i18n/messages/src/components/settings/services/ServiceError.json
new file mode 100644
index 000000000..648fc5b3e
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/services/ServiceError.json
@@ -0,0 +1,54 @@
1[
2 {
3 "id": "settings.service.error.headline",
4 "defaultMessage": "!!!Error",
5 "file": "src/components/settings/services/ServiceError.js",
6 "start": {
7 "line": 10,
8 "column": 12
9 },
10 "end": {
11 "line": 13,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.service.error.goBack",
17 "defaultMessage": "!!!Back to services",
18 "file": "src/components/settings/services/ServiceError.js",
19 "start": {
20 "line": 14,
21 "column": 10
22 },
23 "end": {
24 "line": 17,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.service.form.availableServices",
30 "defaultMessage": "!!!Available services",
31 "file": "src/components/settings/services/ServiceError.js",
32 "start": {
33 "line": 18,
34 "column": 21
35 },
36 "end": {
37 "line": 21,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.service.error.message",
43 "defaultMessage": "!!!Could not load service recipe.",
44 "file": "src/components/settings/services/ServiceError.js",
45 "start": {
46 "line": 22,
47 "column": 16
48 },
49 "end": {
50 "line": 25,
51 "column": 3
52 }
53 }
54] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/services/ServiceItem.json b/src/i18n/messages/src/components/settings/services/ServiceItem.json
new file mode 100644
index 000000000..ffea8b9e1
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/services/ServiceItem.json
@@ -0,0 +1,41 @@
1[
2 {
3 "id": "settings.services.tooltip.isDisabled",
4 "defaultMessage": "!!!Service is disabled",
5 "file": "src/components/settings/services/ServiceItem.js",
6 "start": {
7 "line": 11,
8 "column": 21
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.services.tooltip.notificationsDisabled",
17 "defaultMessage": "!!!Notifications are disabled",
18 "file": "src/components/settings/services/ServiceItem.js",
19 "start": {
20 "line": 15,
21 "column": 32
22 },
23 "end": {
24 "line": 18,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.services.tooltip.isMuted",
30 "defaultMessage": "!!!All sounds are muted",
31 "file": "src/components/settings/services/ServiceItem.js",
32 "start": {
33 "line": 19,
34 "column": 18
35 },
36 "end": {
37 "line": 22,
38 "column": 3
39 }
40 }
41] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
new file mode 100644
index 000000000..3803c6512
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json
@@ -0,0 +1,119 @@
1[
2 {
3 "id": "settings.services.headline",
4 "defaultMessage": "!!!Your services",
5 "file": "src/components/settings/services/ServicesDashboard.js",
6 "start": {
7 "line": 14,
8 "column": 12
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.searchService",
17 "defaultMessage": "!!!Search service",
18 "file": "src/components/settings/services/ServicesDashboard.js",
19 "start": {
20 "line": 18,
21 "column": 17
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.services.noServicesAdded",
30 "defaultMessage": "!!!You haven't added any services yet.",
31 "file": "src/components/settings/services/ServicesDashboard.js",
32 "start": {
33 "line": 22,
34 "column": 19
35 },
36 "end": {
37 "line": 25,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.recipes.nothingFound",
43 "defaultMessage": "!!!Sorry, but no service matched your search term.",
44 "file": "src/components/settings/services/ServicesDashboard.js",
45 "start": {
46 "line": 26,
47 "column": 18
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.services.discoverServices",
56 "defaultMessage": "!!!Discover services",
57 "file": "src/components/settings/services/ServicesDashboard.js",
58 "start": {
59 "line": 30,
60 "column": 20
61 },
62 "end": {
63 "line": 33,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.services.servicesRequestFailed",
69 "defaultMessage": "!!!Could not load your services",
70 "file": "src/components/settings/services/ServicesDashboard.js",
71 "start": {
72 "line": 34,
73 "column": 25
74 },
75 "end": {
76 "line": 37,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.account.tryReloadServices",
82 "defaultMessage": "!!!Try again",
83 "file": "src/components/settings/services/ServicesDashboard.js",
84 "start": {
85 "line": 38,
86 "column": 21
87 },
88 "end": {
89 "line": 41,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.services.updatedInfo",
95 "defaultMessage": "!!!Your changes have been saved",
96 "file": "src/components/settings/services/ServicesDashboard.js",
97 "start": {
98 "line": 42,
99 "column": 15
100 },
101 "end": {
102 "line": 45,
103 "column": 3
104 }
105 },
106 {
107 "id": "settings.services.deletedInfo",
108 "defaultMessage": "!!!Service has been deleted",
109 "file": "src/components/settings/services/ServicesDashboard.js",
110 "start": {
111 "line": 46,
112 "column": 15
113 },
114 "end": {
115 "line": 49,
116 "column": 3
117 }
118 }
119] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
new file mode 100644
index 000000000..c64f477be
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json
@@ -0,0 +1,223 @@
1[
2 {
3 "id": "settings.app.headline",
4 "defaultMessage": "!!!Settings",
5 "file": "src/components/settings/settings/EditSettingsForm.js",
6 "start": {
7 "line": 16,
8 "column": 12
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.app.headlineGeneral",
17 "defaultMessage": "!!!General",
18 "file": "src/components/settings/settings/EditSettingsForm.js",
19 "start": {
20 "line": 20,
21 "column": 19
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.app.headlineLanguage",
30 "defaultMessage": "!!!Language",
31 "file": "src/components/settings/settings/EditSettingsForm.js",
32 "start": {
33 "line": 24,
34 "column": 20
35 },
36 "end": {
37 "line": 27,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.app.headlineUpdates",
43 "defaultMessage": "!!!Updates",
44 "file": "src/components/settings/settings/EditSettingsForm.js",
45 "start": {
46 "line": 28,
47 "column": 19
48 },
49 "end": {
50 "line": 31,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.app.headlineAppearance",
56 "defaultMessage": "!!!Appearance",
57 "file": "src/components/settings/settings/EditSettingsForm.js",
58 "start": {
59 "line": 32,
60 "column": 22
61 },
62 "end": {
63 "line": 35,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.app.headlineAdvanced",
69 "defaultMessage": "!!!Advanced",
70 "file": "src/components/settings/settings/EditSettingsForm.js",
71 "start": {
72 "line": 36,
73 "column": 20
74 },
75 "end": {
76 "line": 39,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.app.translationHelp",
82 "defaultMessage": "!!!Help us to translate Franz into your language.",
83 "file": "src/components/settings/settings/EditSettingsForm.js",
84 "start": {
85 "line": 40,
86 "column": 19
87 },
88 "end": {
89 "line": 43,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.app.subheadlineCache",
95 "defaultMessage": "!!!Cache",
96 "file": "src/components/settings/settings/EditSettingsForm.js",
97 "start": {
98 "line": 44,
99 "column": 20
100 },
101 "end": {
102 "line": 47,
103 "column": 3
104 }
105 },
106 {
107 "id": "settings.app.cacheInfo",
108 "defaultMessage": "!!!Franz cache is currently using {size} of disk space.",
109 "file": "src/components/settings/settings/EditSettingsForm.js",
110 "start": {
111 "line": 48,
112 "column": 13
113 },
114 "end": {
115 "line": 51,
116 "column": 3
117 }
118 },
119 {
120 "id": "settings.app.buttonClearAllCache",
121 "defaultMessage": "!!!Clear cache",
122 "file": "src/components/settings/settings/EditSettingsForm.js",
123 "start": {
124 "line": 52,
125 "column": 23
126 },
127 "end": {
128 "line": 55,
129 "column": 3
130 }
131 },
132 {
133 "id": "settings.app.buttonSearchForUpdate",
134 "defaultMessage": "!!!Check for updates",
135 "file": "src/components/settings/settings/EditSettingsForm.js",
136 "start": {
137 "line": 56,
138 "column": 25
139 },
140 "end": {
141 "line": 59,
142 "column": 3
143 }
144 },
145 {
146 "id": "settings.app.buttonInstallUpdate",
147 "defaultMessage": "!!!Restart & install update",
148 "file": "src/components/settings/settings/EditSettingsForm.js",
149 "start": {
150 "line": 60,
151 "column": 23
152 },
153 "end": {
154 "line": 63,
155 "column": 3
156 }
157 },
158 {
159 "id": "settings.app.updateStatusSearching",
160 "defaultMessage": "!!!Is searching for update",
161 "file": "src/components/settings/settings/EditSettingsForm.js",
162 "start": {
163 "line": 64,
164 "column": 25
165 },
166 "end": {
167 "line": 67,
168 "column": 3
169 }
170 },
171 {
172 "id": "settings.app.updateStatusAvailable",
173 "defaultMessage": "!!!Update available, downloading...",
174 "file": "src/components/settings/settings/EditSettingsForm.js",
175 "start": {
176 "line": 68,
177 "column": 25
178 },
179 "end": {
180 "line": 71,
181 "column": 3
182 }
183 },
184 {
185 "id": "settings.app.updateStatusUpToDate",
186 "defaultMessage": "!!!You are using the latest version of Franz",
187 "file": "src/components/settings/settings/EditSettingsForm.js",
188 "start": {
189 "line": 72,
190 "column": 24
191 },
192 "end": {
193 "line": 75,
194 "column": 3
195 }
196 },
197 {
198 "id": "settings.app.currentVersion",
199 "defaultMessage": "!!!Current version:",
200 "file": "src/components/settings/settings/EditSettingsForm.js",
201 "start": {
202 "line": 76,
203 "column": 18
204 },
205 "end": {
206 "line": 79,
207 "column": 3
208 }
209 },
210 {
211 "id": "settings.app.restartRequired",
212 "defaultMessage": "!!!Changes require restart",
213 "file": "src/components/settings/settings/EditSettingsForm.js",
214 "start": {
215 "line": 80,
216 "column": 29
217 },
218 "end": {
219 "line": 83,
220 "column": 3
221 }
222 }
223] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/settings/user/EditUserForm.json b/src/i18n/messages/src/components/settings/user/EditUserForm.json
new file mode 100644
index 000000000..3a59f8681
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/user/EditUserForm.json
@@ -0,0 +1,80 @@
1[
2 {
3 "id": "settings.account.headline",
4 "defaultMessage": "!!!Account",
5 "file": "src/components/settings/user/EditUserForm.js",
6 "start": {
7 "line": 15,
8 "column": 12
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.account.headlineProfile",
17 "defaultMessage": "!!!Update Profile",
18 "file": "src/components/settings/user/EditUserForm.js",
19 "start": {
20 "line": 19,
21 "column": 19
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.account.headlineAccount",
30 "defaultMessage": "!!!Account Information",
31 "file": "src/components/settings/user/EditUserForm.js",
32 "start": {
33 "line": 23,
34 "column": 19
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.account.headlinePassword",
43 "defaultMessage": "!!!Change Password",
44 "file": "src/components/settings/user/EditUserForm.js",
45 "start": {
46 "line": 27,
47 "column": 20
48 },
49 "end": {
50 "line": 30,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.account.successInfo",
56 "defaultMessage": "!!!Your changes have been saved",
57 "file": "src/components/settings/user/EditUserForm.js",
58 "start": {
59 "line": 31,
60 "column": 15
61 },
62 "end": {
63 "line": 34,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.account.buttonSave",
69 "defaultMessage": "!!!Update profile",
70 "file": "src/components/settings/user/EditUserForm.js",
71 "start": {
72 "line": 35,
73 "column": 14
74 },
75 "end": {
76 "line": 38,
77 "column": 3
78 }
79 }
80] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/subscription/SubscriptionForm.json b/src/i18n/messages/src/components/subscription/SubscriptionForm.json
new file mode 100644
index 000000000..cc7470358
--- /dev/null
+++ b/src/i18n/messages/src/components/subscription/SubscriptionForm.json
@@ -0,0 +1,171 @@
1[
2 {
3 "id": "subscription.submit.label",
4 "defaultMessage": "!!!Support the development of Franz",
5 "file": "src/components/subscription/SubscriptionForm.js",
6 "start": {
7 "line": 14,
8 "column": 21
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "subscription.paymentSessionError",
17 "defaultMessage": "!!!Could not initialize payment form",
18 "file": "src/components/subscription/SubscriptionForm.js",
19 "start": {
20 "line": 18,
21 "column": 23
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "subscription.type.free",
30 "defaultMessage": "!!!free",
31 "file": "src/components/subscription/SubscriptionForm.js",
32 "start": {
33 "line": 22,
34 "column": 12
35 },
36 "end": {
37 "line": 25,
38 "column": 3
39 }
40 },
41 {
42 "id": "subscription.type.month",
43 "defaultMessage": "!!!month",
44 "file": "src/components/subscription/SubscriptionForm.js",
45 "start": {
46 "line": 26,
47 "column": 15
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "subscription.type.year",
56 "defaultMessage": "!!!year",
57 "file": "src/components/subscription/SubscriptionForm.js",
58 "start": {
59 "line": 30,
60 "column": 14
61 },
62 "end": {
63 "line": 33,
64 "column": 3
65 }
66 },
67 {
68 "id": "subscription.includedFeatures",
69 "defaultMessage": "!!!The Franz Premium Supporter Account includes",
70 "file": "src/components/subscription/SubscriptionForm.js",
71 "start": {
72 "line": 34,
73 "column": 20
74 },
75 "end": {
76 "line": 37,
77 "column": 3
78 }
79 },
80 {
81 "id": "subscription.features.onpremise.mattermost",
82 "defaultMessage": "!!!Add on-premise/hosted services like Mattermost",
83 "file": "src/components/subscription/SubscriptionForm.js",
84 "start": {
85 "line": 38,
86 "column": 13
87 },
88 "end": {
89 "line": 41,
90 "column": 3
91 }
92 },
93 {
94 "id": "subscription.features.noInterruptions",
95 "defaultMessage": "!!!No app delays & nagging to upgrade license",
96 "file": "src/components/subscription/SubscriptionForm.js",
97 "start": {
98 "line": 42,
99 "column": 19
100 },
101 "end": {
102 "line": 45,
103 "column": 3
104 }
105 },
106 {
107 "id": "subscription.features.proxy",
108 "defaultMessage": "!!!Proxy support for services",
109 "file": "src/components/subscription/SubscriptionForm.js",
110 "start": {
111 "line": 46,
112 "column": 9
113 },
114 "end": {
115 "line": 49,
116 "column": 3
117 }
118 },
119 {
120 "id": "subscription.features.spellchecker",
121 "defaultMessage": "!!!Support for Spellchecker",
122 "file": "src/components/subscription/SubscriptionForm.js",
123 "start": {
124 "line": 50,
125 "column": 16
126 },
127 "end": {
128 "line": 53,
129 "column": 3
130 }
131 },
132 {
133 "id": "subscription.features.ads",
134 "defaultMessage": "!!!No ads, ever!",
135 "file": "src/components/subscription/SubscriptionForm.js",
136 "start": {
137 "line": 54,
138 "column": 7
139 },
140 "end": {
141 "line": 57,
142 "column": 3
143 }
144 },
145 {
146 "id": "subscription.features.comingSoon",
147 "defaultMessage": "!!!coming soon",
148 "file": "src/components/subscription/SubscriptionForm.js",
149 "start": {
150 "line": 58,
151 "column": 14
152 },
153 "end": {
154 "line": 61,
155 "column": 3
156 }
157 },
158 {
159 "id": "subscription.euTaxInfo",
160 "defaultMessage": "!!!EU residents: local sales tax may apply",
161 "file": "src/components/subscription/SubscriptionForm.js",
162 "start": {
163 "line": 62,
164 "column": 13
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/subscription/SubscriptionPopup.json b/src/i18n/messages/src/components/subscription/SubscriptionPopup.json
new file mode 100644
index 000000000..c06da7531
--- /dev/null
+++ b/src/i18n/messages/src/components/subscription/SubscriptionPopup.json
@@ -0,0 +1,28 @@
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/ui/PremiumFeatureContainer/index.json b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json
new file mode 100644
index 000000000..582d546fa
--- /dev/null
+++ b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "premiumFeature.button.upgradeAccount",
4 "defaultMessage": "!!!Upgrade account",
5 "file": "src/components/ui/PremiumFeatureContainer/index.js",
6 "start": {
7 "line": 14,
8 "column": 10
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/util/ErrorBoundary/index.json b/src/i18n/messages/src/components/util/ErrorBoundary/index.json
new file mode 100644
index 000000000..43c323031
--- /dev/null
+++ b/src/i18n/messages/src/components/util/ErrorBoundary/index.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "app.errorHandler.headline",
4 "defaultMessage": "!!!Something went wrong.",
5 "file": "src/components/util/ErrorBoundary/index.js",
6 "start": {
7 "line": 11,
8 "column": 12
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "app.errorHandler.action",
17 "defaultMessage": "!!!Reload",
18 "file": "src/components/util/ErrorBoundary/index.js",
19 "start": {
20 "line": 15,
21 "column": 10
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/containers/settings/EditServiceScreen.json b/src/i18n/messages/src/containers/settings/EditServiceScreen.json
new file mode 100644
index 000000000..42ca42125
--- /dev/null
+++ b/src/i18n/messages/src/containers/settings/EditServiceScreen.json
@@ -0,0 +1,197 @@
1[
2 {
3 "id": "settings.service.form.name",
4 "defaultMessage": "!!!Name",
5 "file": "src/containers/settings/EditServiceScreen.js",
6 "start": {
7 "line": 28,
8 "column": 8
9 },
10 "end": {
11 "line": 31,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.service.form.enableService",
17 "defaultMessage": "!!!Enable service",
18 "file": "src/containers/settings/EditServiceScreen.js",
19 "start": {
20 "line": 32,
21 "column": 17
22 },
23 "end": {
24 "line": 35,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.service.form.enableNotification",
30 "defaultMessage": "!!!Enable Notifications",
31 "file": "src/containers/settings/EditServiceScreen.js",
32 "start": {
33 "line": 36,
34 "column": 22
35 },
36 "end": {
37 "line": 39,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.service.form.enableBadge",
43 "defaultMessage": "!!!Show unread message badges",
44 "file": "src/containers/settings/EditServiceScreen.js",
45 "start": {
46 "line": 40,
47 "column": 15
48 },
49 "end": {
50 "line": 43,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.service.form.enableAudio",
56 "defaultMessage": "!!!Enable audio",
57 "file": "src/containers/settings/EditServiceScreen.js",
58 "start": {
59 "line": 44,
60 "column": 15
61 },
62 "end": {
63 "line": 47,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.service.form.team",
69 "defaultMessage": "!!!Team",
70 "file": "src/containers/settings/EditServiceScreen.js",
71 "start": {
72 "line": 48,
73 "column": 8
74 },
75 "end": {
76 "line": 51,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.service.form.customUrl",
82 "defaultMessage": "!!!Custom server",
83 "file": "src/containers/settings/EditServiceScreen.js",
84 "start": {
85 "line": 52,
86 "column": 13
87 },
88 "end": {
89 "line": 55,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.service.form.indirectMessages",
95 "defaultMessage": "!!!Show message badge for all new messages",
96 "file": "src/containers/settings/EditServiceScreen.js",
97 "start": {
98 "line": 56,
99 "column": 20
100 },
101 "end": {
102 "line": 59,
103 "column": 3
104 }
105 },
106 {
107 "id": "settings.service.form.icon",
108 "defaultMessage": "!!!Custom icon",
109 "file": "src/containers/settings/EditServiceScreen.js",
110 "start": {
111 "line": 60,
112 "column": 8
113 },
114 "end": {
115 "line": 63,
116 "column": 3
117 }
118 },
119 {
120 "id": "settings.service.form.enableDarkMode",
121 "defaultMessage": "!!!Enable Dark Mode",
122 "file": "src/containers/settings/EditServiceScreen.js",
123 "start": {
124 "line": 64,
125 "column": 18
126 },
127 "end": {
128 "line": 67,
129 "column": 3
130 }
131 },
132 {
133 "id": "settings.service.form.proxy.isEnabled",
134 "defaultMessage": "!!!Use Proxy",
135 "file": "src/containers/settings/EditServiceScreen.js",
136 "start": {
137 "line": 68,
138 "column": 15
139 },
140 "end": {
141 "line": 71,
142 "column": 3
143 }
144 },
145 {
146 "id": "settings.service.form.proxy.host",
147 "defaultMessage": "!!!Proxy Host/IP",
148 "file": "src/containers/settings/EditServiceScreen.js",
149 "start": {
150 "line": 72,
151 "column": 13
152 },
153 "end": {
154 "line": 75,
155 "column": 3
156 }
157 },
158 {
159 "id": "settings.service.form.proxy.port",
160 "defaultMessage": "!!!Port",
161 "file": "src/containers/settings/EditServiceScreen.js",
162 "start": {
163 "line": 76,
164 "column": 13
165 },
166 "end": {
167 "line": 79,
168 "column": 3
169 }
170 },
171 {
172 "id": "settings.service.form.proxy.user",
173 "defaultMessage": "!!!User",
174 "file": "src/containers/settings/EditServiceScreen.js",
175 "start": {
176 "line": 80,
177 "column": 13
178 },
179 "end": {
180 "line": 83,
181 "column": 3
182 }
183 },
184 {
185 "id": "settings.service.form.proxy.password",
186 "defaultMessage": "!!!Password",
187 "file": "src/containers/settings/EditServiceScreen.js",
188 "start": {
189 "line": 84,
190 "column": 17
191 },
192 "end": {
193 "line": 87,
194 "column": 3
195 }
196 }
197] \ No newline at end of file
diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
new file mode 100644
index 000000000..d3b413540
--- /dev/null
+++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json
@@ -0,0 +1,158 @@
1[
2 {
3 "id": "settings.app.form.autoLaunchOnStart",
4 "defaultMessage": "!!!Launch Franz on start",
5 "file": "src/containers/settings/EditSettingsScreen.js",
6 "start": {
7 "line": 22,
8 "column": 21
9 },
10 "end": {
11 "line": 25,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.app.form.autoLaunchInBackground",
17 "defaultMessage": "!!!Open in background",
18 "file": "src/containers/settings/EditSettingsScreen.js",
19 "start": {
20 "line": 26,
21 "column": 26
22 },
23 "end": {
24 "line": 29,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.app.form.runInBackground",
30 "defaultMessage": "!!!Keep Franz in background when closing the window",
31 "file": "src/containers/settings/EditSettingsScreen.js",
32 "start": {
33 "line": 30,
34 "column": 19
35 },
36 "end": {
37 "line": 33,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.app.form.enableSystemTray",
43 "defaultMessage": "!!!Show Franz in system tray",
44 "file": "src/containers/settings/EditSettingsScreen.js",
45 "start": {
46 "line": 34,
47 "column": 20
48 },
49 "end": {
50 "line": 37,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.app.form.minimizeToSystemTray",
56 "defaultMessage": "!!!Minimize Franz to system tray",
57 "file": "src/containers/settings/EditSettingsScreen.js",
58 "start": {
59 "line": 38,
60 "column": 24
61 },
62 "end": {
63 "line": 41,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.app.form.language",
69 "defaultMessage": "!!!Language",
70 "file": "src/containers/settings/EditSettingsScreen.js",
71 "start": {
72 "line": 42,
73 "column": 12
74 },
75 "end": {
76 "line": 45,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.app.form.darkMode",
82 "defaultMessage": "!!!Dark Mode",
83 "file": "src/containers/settings/EditSettingsScreen.js",
84 "start": {
85 "line": 46,
86 "column": 12
87 },
88 "end": {
89 "line": 49,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.app.form.showDisabledServices",
95 "defaultMessage": "!!!Display disabled services tabs",
96 "file": "src/containers/settings/EditSettingsScreen.js",
97 "start": {
98 "line": 50,
99 "column": 24
100 },
101 "end": {
102 "line": 53,
103 "column": 3
104 }
105 },
106 {
107 "id": "settings.app.form.showMessagesBadgesWhenMuted",
108 "defaultMessage": "!!!Show unread message badge when notifications are disabled",
109 "file": "src/containers/settings/EditSettingsScreen.js",
110 "start": {
111 "line": 54,
112 "column": 29
113 },
114 "end": {
115 "line": 57,
116 "column": 3
117 }
118 },
119 {
120 "id": "settings.app.form.enableSpellchecking",
121 "defaultMessage": "!!!Enable spell checking",
122 "file": "src/containers/settings/EditSettingsScreen.js",
123 "start": {
124 "line": 58,
125 "column": 23
126 },
127 "end": {
128 "line": 61,
129 "column": 3
130 }
131 },
132 {
133 "id": "settings.app.form.enableGPUAcceleration",
134 "defaultMessage": "!!!Enable GPU Acceleration",
135 "file": "src/containers/settings/EditSettingsScreen.js",
136 "start": {
137 "line": 62,
138 "column": 25
139 },
140 "end": {
141 "line": 65,
142 "column": 3
143 }
144 },
145 {
146 "id": "settings.app.form.beta",
147 "defaultMessage": "!!!Include beta versions",
148 "file": "src/containers/settings/EditSettingsScreen.js",
149 "start": {
150 "line": 66,
151 "column": 8
152 },
153 "end": {
154 "line": 69,
155 "column": 3
156 }
157 }
158] \ No newline at end of file
diff --git a/src/i18n/messages/src/containers/settings/EditUserScreen.json b/src/i18n/messages/src/containers/settings/EditUserScreen.json
new file mode 100644
index 000000000..70ff29945
--- /dev/null
+++ b/src/i18n/messages/src/containers/settings/EditUserScreen.json
@@ -0,0 +1,119 @@
1[
2 {
3 "id": "settings.user.form.firstname",
4 "defaultMessage": "!!!Firstname",
5 "file": "src/containers/settings/EditUserScreen.js",
6 "start": {
7 "line": 14,
8 "column": 13
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.user.form.lastname",
17 "defaultMessage": "!!!Lastname",
18 "file": "src/containers/settings/EditUserScreen.js",
19 "start": {
20 "line": 18,
21 "column": 12
22 },
23 "end": {
24 "line": 21,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.user.form.email",
30 "defaultMessage": "!!!Email",
31 "file": "src/containers/settings/EditUserScreen.js",
32 "start": {
33 "line": 22,
34 "column": 9
35 },
36 "end": {
37 "line": 25,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.user.form.accountType.label",
43 "defaultMessage": "!!!Account type",
44 "file": "src/containers/settings/EditUserScreen.js",
45 "start": {
46 "line": 26,
47 "column": 20
48 },
49 "end": {
50 "line": 29,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.user.form.accountType.individual",
56 "defaultMessage": "!!!Individual",
57 "file": "src/containers/settings/EditUserScreen.js",
58 "start": {
59 "line": 30,
60 "column": 25
61 },
62 "end": {
63 "line": 33,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.user.form.accountType.non-profit",
69 "defaultMessage": "!!!Non-Profit",
70 "file": "src/containers/settings/EditUserScreen.js",
71 "start": {
72 "line": 34,
73 "column": 24
74 },
75 "end": {
76 "line": 37,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.user.form.accountType.company",
82 "defaultMessage": "!!!Company",
83 "file": "src/containers/settings/EditUserScreen.js",
84 "start": {
85 "line": 38,
86 "column": 22
87 },
88 "end": {
89 "line": 41,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.user.form.currentPassword",
95 "defaultMessage": "!!!Current password",
96 "file": "src/containers/settings/EditUserScreen.js",
97 "start": {
98 "line": 42,
99 "column": 19
100 },
101 "end": {
102 "line": 45,
103 "column": 3
104 }
105 },
106 {
107 "id": "settings.user.form.newPassword",
108 "defaultMessage": "!!!New password",
109 "file": "src/containers/settings/EditUserScreen.js",
110 "start": {
111 "line": 46,
112 "column": 15
113 },
114 "end": {
115 "line": 49,
116 "column": 3
117 }
118 }
119] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/delayApp/Component.json b/src/i18n/messages/src/features/delayApp/Component.json
new file mode 100644
index 000000000..bacd9444a
--- /dev/null
+++ b/src/i18n/messages/src/features/delayApp/Component.json
@@ -0,0 +1,41 @@
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": 15,
8 "column": 12
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.delayApp.action",
17 "defaultMessage": "!!!Get a Franz Supporter License",
18 "file": "src/features/delayApp/Component.js",
19 "start": {
20 "line": 19,
21 "column": 10
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.delayApp.text",
30 "defaultMessage": "!!!Franz will continue in {seconds} seconds.",
31 "file": "src/features/delayApp/Component.js",
32 "start": {
33 "line": 23,
34 "column": 8
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/shareFranz/Component.json b/src/i18n/messages/src/features/shareFranz/Component.json
new file mode 100644
index 000000000..0fec9db64
--- /dev/null
+++ b/src/i18n/messages/src/features/shareFranz/Component.json
@@ -0,0 +1,93 @@
1[
2 {
3 "id": "feature.shareFranz.headline",
4 "defaultMessage": "!!!Franz is better together!",
5 "file": "src/features/shareFranz/Component.js",
6 "start": {
7 "line": 15,
8 "column": 12
9 },
10 "end": {
11 "line": 18,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.shareFranz.text",
17 "defaultMessage": "!!!Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
18 "file": "src/features/shareFranz/Component.js",
19 "start": {
20 "line": 19,
21 "column": 8
22 },
23 "end": {
24 "line": 22,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.shareFranz.action.email",
30 "defaultMessage": "!!!Share as email",
31 "file": "src/features/shareFranz/Component.js",
32 "start": {
33 "line": 23,
34 "column": 16
35 },
36 "end": {
37 "line": 26,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.shareFranz.action.facebook",
43 "defaultMessage": "!!!Share on Facebook",
44 "file": "src/features/shareFranz/Component.js",
45 "start": {
46 "line": 27,
47 "column": 19
48 },
49 "end": {
50 "line": 30,
51 "column": 3
52 }
53 },
54 {
55 "id": "feature.shareFranz.action.twitter",
56 "defaultMessage": "!!!Share on Twitter",
57 "file": "src/features/shareFranz/Component.js",
58 "start": {
59 "line": 31,
60 "column": 18
61 },
62 "end": {
63 "line": 34,
64 "column": 3
65 }
66 },
67 {
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",
70 "file": "src/features/shareFranz/Component.js",
71 "start": {
72 "line": 35,
73 "column": 18
74 },
75 "end": {
76 "line": 38,
77 "column": 3
78 }
79 },
80 {
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 @MeetFranz",
83 "file": "src/features/shareFranz/Component.js",
84 "start": {
85 "line": 39,
86 "column": 20
87 },
88 "end": {
89 "line": 42,
90 "column": 3
91 }
92 }
93] \ No newline at end of file
diff --git a/src/i18n/messages/src/helpers/validation-helpers.json b/src/i18n/messages/src/helpers/validation-helpers.json
new file mode 100644
index 000000000..86bfe1500
--- /dev/null
+++ b/src/i18n/messages/src/helpers/validation-helpers.json
@@ -0,0 +1,67 @@
1[
2 {
3 "id": "validation.required",
4 "defaultMessage": "!!!Field is required",
5 "file": "src/helpers/validation-helpers.js",
6 "start": {
7 "line": 4,
8 "column": 12
9 },
10 "end": {
11 "line": 7,
12 "column": 3
13 }
14 },
15 {
16 "id": "validation.email",
17 "defaultMessage": "!!!Email not valid",
18 "file": "src/helpers/validation-helpers.js",
19 "start": {
20 "line": 8,
21 "column": 9
22 },
23 "end": {
24 "line": 11,
25 "column": 3
26 }
27 },
28 {
29 "id": "validation.url",
30 "defaultMessage": "!!!Not a valid URL",
31 "file": "src/helpers/validation-helpers.js",
32 "start": {
33 "line": 12,
34 "column": 7
35 },
36 "end": {
37 "line": 15,
38 "column": 3
39 }
40 },
41 {
42 "id": "validation.minLength",
43 "defaultMessage": "!!!Too few characters",
44 "file": "src/helpers/validation-helpers.js",
45 "start": {
46 "line": 16,
47 "column": 13
48 },
49 "end": {
50 "line": 19,
51 "column": 3
52 }
53 },
54 {
55 "id": "validation.oneRequired",
56 "defaultMessage": "!!!At least one is required",
57 "file": "src/helpers/validation-helpers.js",
58 "start": {
59 "line": 20,
60 "column": 15
61 },
62 "end": {
63 "line": 23,
64 "column": 3
65 }
66 }
67] \ No newline at end of file
diff --git a/src/i18n/messages/src/i18n/globalMessages.json b/src/i18n/messages/src/i18n/globalMessages.json
new file mode 100644
index 000000000..28001614f
--- /dev/null
+++ b/src/i18n/messages/src/i18n/globalMessages.json
@@ -0,0 +1,80 @@
1[
2 {
3 "id": "global.api.unhealthy",
4 "defaultMessage": "!!!Can't connect to Franz Online Services",
5 "file": "src/i18n/globalMessages.js",
6 "start": {
7 "line": 4,
8 "column": 16
9 },
10 "end": {
11 "line": 7,
12 "column": 3
13 }
14 },
15 {
16 "id": "global.notConnectedToTheInternet",
17 "defaultMessage": "!!!You are not connected to the internet.",
18 "file": "src/i18n/globalMessages.js",
19 "start": {
20 "line": 8,
21 "column": 29
22 },
23 "end": {
24 "line": 11,
25 "column": 3
26 }
27 },
28 {
29 "id": "global.spellchecking.language",
30 "defaultMessage": "!!!Spell checking language",
31 "file": "src/i18n/globalMessages.js",
32 "start": {
33 "line": 12,
34 "column": 24
35 },
36 "end": {
37 "line": 15,
38 "column": 3
39 }
40 },
41 {
42 "id": "global.spellchecker.useDefault",
43 "defaultMessage": "!!!Use System Default ({default})",
44 "file": "src/i18n/globalMessages.js",
45 "start": {
46 "line": 16,
47 "column": 29
48 },
49 "end": {
50 "line": 19,
51 "column": 3
52 }
53 },
54 {
55 "id": "global.spellchecking.autodetect",
56 "defaultMessage": "!!!Detect language automatically",
57 "file": "src/i18n/globalMessages.js",
58 "start": {
59 "line": 20,
60 "column": 34
61 },
62 "end": {
63 "line": 23,
64 "column": 3
65 }
66 },
67 {
68 "id": "global.spellchecking.autodetect.short",
69 "defaultMessage": "!!!Automatic",
70 "file": "src/i18n/globalMessages.js",
71 "start": {
72 "line": 24,
73 "column": 39
74 },
75 "end": {
76 "line": 27,
77 "column": 3
78 }
79 }
80] \ No newline at end of file
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
new file mode 100644
index 000000000..9314f5cce
--- /dev/null
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -0,0 +1,613 @@
1[
2 {
3 "id": "menu.edit",
4 "defaultMessage": "!!!Edit",
5 "file": "src/lib/Menu.js",
6 "start": {
7 "line": 10,
8 "column": 8
9 },
10 "end": {
11 "line": 13,
12 "column": 3
13 }
14 },
15 {
16 "id": "menu.edit.undo",
17 "defaultMessage": "!!!Undo",
18 "file": "src/lib/Menu.js",
19 "start": {
20 "line": 14,
21 "column": 8
22 },
23 "end": {
24 "line": 17,
25 "column": 3
26 }
27 },
28 {
29 "id": "menu.edit.redo",
30 "defaultMessage": "!!!Redo",
31 "file": "src/lib/Menu.js",
32 "start": {
33 "line": 18,
34 "column": 8
35 },
36 "end": {
37 "line": 21,
38 "column": 3
39 }
40 },
41 {
42 "id": "menu.edit.cut",
43 "defaultMessage": "!!!Cut",
44 "file": "src/lib/Menu.js",
45 "start": {
46 "line": 22,
47 "column": 7
48 },
49 "end": {
50 "line": 25,
51 "column": 3
52 }
53 },
54 {
55 "id": "menu.edit.copy",
56 "defaultMessage": "!!!Copy",
57 "file": "src/lib/Menu.js",
58 "start": {
59 "line": 26,
60 "column": 8
61 },
62 "end": {
63 "line": 29,
64 "column": 3
65 }
66 },
67 {
68 "id": "menu.edit.paste",
69 "defaultMessage": "!!!Paste",
70 "file": "src/lib/Menu.js",
71 "start": {
72 "line": 30,
73 "column": 9
74 },
75 "end": {
76 "line": 33,
77 "column": 3
78 }
79 },
80 {
81 "id": "menu.edit.pasteAndMatchStyle",
82 "defaultMessage": "!!!Paste And Match Style",
83 "file": "src/lib/Menu.js",
84 "start": {
85 "line": 34,
86 "column": 22
87 },
88 "end": {
89 "line": 37,
90 "column": 3
91 }
92 },
93 {
94 "id": "menu.edit.delete",
95 "defaultMessage": "!!!Delete",
96 "file": "src/lib/Menu.js",
97 "start": {
98 "line": 38,
99 "column": 10
100 },
101 "end": {
102 "line": 41,
103 "column": 3
104 }
105 },
106 {
107 "id": "menu.edit.selectAll",
108 "defaultMessage": "!!!Select All",
109 "file": "src/lib/Menu.js",
110 "start": {
111 "line": 42,
112 "column": 13
113 },
114 "end": {
115 "line": 45,
116 "column": 3
117 }
118 },
119 {
120 "id": "menu.edit.speech",
121 "defaultMessage": "!!!Speech",
122 "file": "src/lib/Menu.js",
123 "start": {
124 "line": 46,
125 "column": 10
126 },
127 "end": {
128 "line": 49,
129 "column": 3
130 }
131 },
132 {
133 "id": "menu.edit.startSpeaking",
134 "defaultMessage": "!!!Start Speaking",
135 "file": "src/lib/Menu.js",
136 "start": {
137 "line": 50,
138 "column": 17
139 },
140 "end": {
141 "line": 53,
142 "column": 3
143 }
144 },
145 {
146 "id": "menu.edit.stopSpeaking",
147 "defaultMessage": "!!!Stop Speaking",
148 "file": "src/lib/Menu.js",
149 "start": {
150 "line": 54,
151 "column": 16
152 },
153 "end": {
154 "line": 57,
155 "column": 3
156 }
157 },
158 {
159 "id": "menu.edit.startDictation",
160 "defaultMessage": "!!!Start Dictation",
161 "file": "src/lib/Menu.js",
162 "start": {
163 "line": 58,
164 "column": 18
165 },
166 "end": {
167 "line": 61,
168 "column": 3
169 }
170 },
171 {
172 "id": "menu.edit.emojiSymbols",
173 "defaultMessage": "!!!Emoji & Symbols",
174 "file": "src/lib/Menu.js",
175 "start": {
176 "line": 62,
177 "column": 16
178 },
179 "end": {
180 "line": 65,
181 "column": 3
182 }
183 },
184 {
185 "id": "menu.view.resetZoom",
186 "defaultMessage": "!!!Actual Size",
187 "file": "src/lib/Menu.js",
188 "start": {
189 "line": 66,
190 "column": 13
191 },
192 "end": {
193 "line": 69,
194 "column": 3
195 }
196 },
197 {
198 "id": "menu.view.zoomIn",
199 "defaultMessage": "!!!Zoom In",
200 "file": "src/lib/Menu.js",
201 "start": {
202 "line": 70,
203 "column": 10
204 },
205 "end": {
206 "line": 73,
207 "column": 3
208 }
209 },
210 {
211 "id": "menu.view.zoomOut",
212 "defaultMessage": "!!!Zoom Out",
213 "file": "src/lib/Menu.js",
214 "start": {
215 "line": 74,
216 "column": 11
217 },
218 "end": {
219 "line": 77,
220 "column": 3
221 }
222 },
223 {
224 "id": "menu.view.enterFullScreen",
225 "defaultMessage": "!!!Enter Full Screen",
226 "file": "src/lib/Menu.js",
227 "start": {
228 "line": 78,
229 "column": 19
230 },
231 "end": {
232 "line": 81,
233 "column": 3
234 }
235 },
236 {
237 "id": "menu.view.exitFullScreen",
238 "defaultMessage": "!!!Exit Full Screen",
239 "file": "src/lib/Menu.js",
240 "start": {
241 "line": 82,
242 "column": 18
243 },
244 "end": {
245 "line": 85,
246 "column": 3
247 }
248 },
249 {
250 "id": "menu.view.toggleFullScreen",
251 "defaultMessage": "!!!Toggle Full Screen",
252 "file": "src/lib/Menu.js",
253 "start": {
254 "line": 86,
255 "column": 20
256 },
257 "end": {
258 "line": 89,
259 "column": 3
260 }
261 },
262 {
263 "id": "menu.view.toggleDevTools",
264 "defaultMessage": "!!!Toggle Developer Tools",
265 "file": "src/lib/Menu.js",
266 "start": {
267 "line": 90,
268 "column": 18
269 },
270 "end": {
271 "line": 93,
272 "column": 3
273 }
274 },
275 {
276 "id": "menu.view.toggleServiceDevTools",
277 "defaultMessage": "!!!Toggle Service Developer Tools",
278 "file": "src/lib/Menu.js",
279 "start": {
280 "line": 94,
281 "column": 25
282 },
283 "end": {
284 "line": 97,
285 "column": 3
286 }
287 },
288 {
289 "id": "menu.view.reloadService",
290 "defaultMessage": "!!!Reload Service",
291 "file": "src/lib/Menu.js",
292 "start": {
293 "line": 98,
294 "column": 17
295 },
296 "end": {
297 "line": 101,
298 "column": 3
299 }
300 },
301 {
302 "id": "menu.view.reloadFranz",
303 "defaultMessage": "!!!Reload Franz",
304 "file": "src/lib/Menu.js",
305 "start": {
306 "line": 102,
307 "column": 15
308 },
309 "end": {
310 "line": 105,
311 "column": 3
312 }
313 },
314 {
315 "id": "menu.window.minimize",
316 "defaultMessage": "!!!Minimize",
317 "file": "src/lib/Menu.js",
318 "start": {
319 "line": 106,
320 "column": 12
321 },
322 "end": {
323 "line": 109,
324 "column": 3
325 }
326 },
327 {
328 "id": "menu.window.close",
329 "defaultMessage": "!!!Close",
330 "file": "src/lib/Menu.js",
331 "start": {
332 "line": 110,
333 "column": 9
334 },
335 "end": {
336 "line": 113,
337 "column": 3
338 }
339 },
340 {
341 "id": "menu.help.learnMore",
342 "defaultMessage": "!!!Learn More",
343 "file": "src/lib/Menu.js",
344 "start": {
345 "line": 114,
346 "column": 13
347 },
348 "end": {
349 "line": 117,
350 "column": 3
351 }
352 },
353 {
354 "id": "menu.help.changelog",
355 "defaultMessage": "!!!Changelog",
356 "file": "src/lib/Menu.js",
357 "start": {
358 "line": 118,
359 "column": 13
360 },
361 "end": {
362 "line": 121,
363 "column": 3
364 }
365 },
366 {
367 "id": "menu.help.support",
368 "defaultMessage": "!!!Support",
369 "file": "src/lib/Menu.js",
370 "start": {
371 "line": 122,
372 "column": 11
373 },
374 "end": {
375 "line": 125,
376 "column": 3
377 }
378 },
379 {
380 "id": "menu.help.tos",
381 "defaultMessage": "!!!Terms of Service",
382 "file": "src/lib/Menu.js",
383 "start": {
384 "line": 126,
385 "column": 7
386 },
387 "end": {
388 "line": 129,
389 "column": 3
390 }
391 },
392 {
393 "id": "menu.help.privacy",
394 "defaultMessage": "!!!Privacy Statement",
395 "file": "src/lib/Menu.js",
396 "start": {
397 "line": 130,
398 "column": 11
399 },
400 "end": {
401 "line": 133,
402 "column": 3
403 }
404 },
405 {
406 "id": "menu.file",
407 "defaultMessage": "!!!File",
408 "file": "src/lib/Menu.js",
409 "start": {
410 "line": 134,
411 "column": 8
412 },
413 "end": {
414 "line": 137,
415 "column": 3
416 }
417 },
418 {
419 "id": "menu.view",
420 "defaultMessage": "!!!View",
421 "file": "src/lib/Menu.js",
422 "start": {
423 "line": 138,
424 "column": 8
425 },
426 "end": {
427 "line": 141,
428 "column": 3
429 }
430 },
431 {
432 "id": "menu.services",
433 "defaultMessage": "!!!Services",
434 "file": "src/lib/Menu.js",
435 "start": {
436 "line": 142,
437 "column": 12
438 },
439 "end": {
440 "line": 145,
441 "column": 3
442 }
443 },
444 {
445 "id": "menu.window",
446 "defaultMessage": "!!!Window",
447 "file": "src/lib/Menu.js",
448 "start": {
449 "line": 146,
450 "column": 10
451 },
452 "end": {
453 "line": 149,
454 "column": 3
455 }
456 },
457 {
458 "id": "menu.help",
459 "defaultMessage": "!!!Help",
460 "file": "src/lib/Menu.js",
461 "start": {
462 "line": 150,
463 "column": 8
464 },
465 "end": {
466 "line": 153,
467 "column": 3
468 }
469 },
470 {
471 "id": "menu.app.about",
472 "defaultMessage": "!!!About Franz",
473 "file": "src/lib/Menu.js",
474 "start": {
475 "line": 154,
476 "column": 9
477 },
478 "end": {
479 "line": 157,
480 "column": 3
481 }
482 },
483 {
484 "id": "menu.app.settings",
485 "defaultMessage": "!!!Settings",
486 "file": "src/lib/Menu.js",
487 "start": {
488 "line": 158,
489 "column": 12
490 },
491 "end": {
492 "line": 161,
493 "column": 3
494 }
495 },
496 {
497 "id": "menu.app.hide",
498 "defaultMessage": "!!!Hide",
499 "file": "src/lib/Menu.js",
500 "start": {
501 "line": 162,
502 "column": 8
503 },
504 "end": {
505 "line": 165,
506 "column": 3
507 }
508 },
509 {
510 "id": "menu.app.hideOthers",
511 "defaultMessage": "!!!Hide Others",
512 "file": "src/lib/Menu.js",
513 "start": {
514 "line": 166,
515 "column": 14
516 },
517 "end": {
518 "line": 169,
519 "column": 3
520 }
521 },
522 {
523 "id": "menu.app.unhide",
524 "defaultMessage": "!!!Unhide",
525 "file": "src/lib/Menu.js",
526 "start": {
527 "line": 170,
528 "column": 10
529 },
530 "end": {
531 "line": 173,
532 "column": 3
533 }
534 },
535 {
536 "id": "menu.app.quit",
537 "defaultMessage": "!!!Quit",
538 "file": "src/lib/Menu.js",
539 "start": {
540 "line": 174,
541 "column": 8
542 },
543 "end": {
544 "line": 177,
545 "column": 3
546 }
547 },
548 {
549 "id": "menu.services.addNewService",
550 "defaultMessage": "!!!Add New Service...",
551 "file": "src/lib/Menu.js",
552 "start": {
553 "line": 178,
554 "column": 17
555 },
556 "end": {
557 "line": 181,
558 "column": 3
559 }
560 },
561 {
562 "id": "menu.services.setNextServiceActive",
563 "defaultMessage": "!!!Activate next service...",
564 "file": "src/lib/Menu.js",
565 "start": {
566 "line": 182,
567 "column": 23
568 },
569 "end": {
570 "line": 185,
571 "column": 3
572 }
573 },
574 {
575 "id": "menu.services.activatePreviousService",
576 "defaultMessage": "!!!Activate previous service...",
577 "file": "src/lib/Menu.js",
578 "start": {
579 "line": 186,
580 "column": 27
581 },
582 "end": {
583 "line": 189,
584 "column": 3
585 }
586 },
587 {
588 "id": "sidebar.muteApp",
589 "defaultMessage": "!!!Disable notifications & audio",
590 "file": "src/lib/Menu.js",
591 "start": {
592 "line": 190,
593 "column": 11
594 },
595 "end": {
596 "line": 193,
597 "column": 3
598 }
599 },
600 {
601 "id": "sidebar.unmuteApp",
602 "defaultMessage": "!!!Enable notifications & audio",
603 "file": "src/lib/Menu.js",
604 "start": {
605 "line": 194,
606 "column": 13
607 },
608 "end": {
609 "line": 197,
610 "column": 3
611 }
612 }
613] \ No newline at end of file
diff --git a/src/index.js b/src/index.js
index 6a0ee600f..05c793d98 100644
--- a/src/index.js
+++ b/src/index.js
@@ -34,6 +34,7 @@ import {
34 DEFAULT_WINDOW_OPTIONS, 34 DEFAULT_WINDOW_OPTIONS,
35} from './config'; 35} from './config';
36import { asarPath } from './helpers/asar-helpers'; 36import { asarPath } from './helpers/asar-helpers';
37import { isValidExternalURL } from './helpers/url-helpers';
37/* eslint-enable import/first */ 38/* eslint-enable import/first */
38 39
39const debug = require('debug')('Franz:App'); 40const debug = require('debug')('Franz:App');
@@ -71,7 +72,10 @@ if (!gotTheLock) {
71 app.on('second-instance', (event, argv) => { 72 app.on('second-instance', (event, argv) => {
72 // Someone tried to run a second instance, we should focus our window. 73 // Someone tried to run a second instance, we should focus our window.
73 if (mainWindow) { 74 if (mainWindow) {
74 if (mainWindow.isMinimized()) mainWindow.restore(); 75 mainWindow.show();
76 if (mainWindow.isMinimized()) {
77 mainWindow.restore();
78 }
75 mainWindow.focus(); 79 mainWindow.focus();
76 80
77 if (isWindows) { 81 if (isWindows) {
@@ -101,6 +105,35 @@ if (!gotTheLock) {
101 } 105 }
102 }); 106 });
103} 107}
108// const isSecondInstance = app.makeSingleInstance((argv) => {
109// if (mainWindow) {
110// if (mainWindow.isMinimized()) mainWindow.restore();
111// mainWindow.focus();
112
113// if (process.platform === 'win32') {
114// // Keep only command line / deep linked arguments
115// const url = argv.slice(1);
116
117// if (url) {
118// handleDeepLink(mainWindow, url.toString());
119// }
120// }
121// }
122
123// if (argv.includes('--reset-window')) {
124// // Needs to be delayed to not interfere with mainWindow.restore();
125// setTimeout(() => {
126// debug('Resetting windows via Task');
127// mainWindow.setPosition(DEFAULT_WINDOW_OPTIONS.x + 100, DEFAULT_WINDOW_OPTIONS.y + 100);
128// mainWindow.setSize(DEFAULT_WINDOW_OPTIONS.width, DEFAULT_WINDOW_OPTIONS.height);
129// }, 1);
130// }
131// });
132
133// if (isSecondInstance) {
134// console.log('An instance of Franz is already running. Exiting...');
135// app.exit();
136// }
104 137
105// Fix Unity indicator issue 138// Fix Unity indicator issue
106// https://github.com/electron/electron/issues/9046 139// https://github.com/electron/electron/issues/9046
@@ -194,20 +227,24 @@ const createWindow = () => {
194 227
195 // Emitted when the window is closed. 228 // Emitted when the window is closed.
196 mainWindow.on('close', (e) => { 229 mainWindow.on('close', (e) => {
230 debug('Window: close window');
197 // Dereference the window object, usually you would store windows 231 // Dereference the window object, usually you would store windows
198 // in an array if your app supports multi windows, this is the time 232 // in an array if your app supports multi windows, this is the time
199 // when you should delete the corresponding element. 233 // when you should delete the corresponding element.
200 if (!willQuitApp && (settings.get('runInBackground') === undefined || settings.get('runInBackground'))) { 234 if (!willQuitApp && (settings.get('runInBackground') === undefined || settings.get('runInBackground'))) {
201 e.preventDefault(); 235 e.preventDefault();
202 if (isWindows) { 236 if (isWindows) {
237 debug('Window: minimize');
203 mainWindow.minimize(); 238 mainWindow.minimize();
239
240 if (settings.get('minimizeToSystemTray')) {
241 debug('Skip taskbar: true');
242 mainWindow.setSkipTaskbar(true);
243 }
204 } else { 244 } else {
245 debug('Window: hide');
205 mainWindow.hide(); 246 mainWindow.hide();
206 } 247 }
207
208 if (isWindows) {
209 mainWindow.setSkipTaskbar(true);
210 }
211 } else { 248 } else {
212 app.quit(); 249 app.quit();
213 } 250 }
@@ -219,32 +256,39 @@ const createWindow = () => {
219 app.wasMaximized = app.isMaximized; 256 app.wasMaximized = app.isMaximized;
220 257
221 if (settings.get('minimizeToSystemTray')) { 258 if (settings.get('minimizeToSystemTray')) {
259 debug('Skip taskbar: true');
222 mainWindow.setSkipTaskbar(true); 260 mainWindow.setSkipTaskbar(true);
223 trayIcon.show(); 261 trayIcon.show();
224 } 262 }
225 }); 263 });
226 264
227 mainWindow.on('maximize', () => { 265 mainWindow.on('maximize', () => {
266 debug('Window: maximize');
228 app.isMaximized = true; 267 app.isMaximized = true;
229 }); 268 });
230 269
231 mainWindow.on('unmaximize', () => { 270 mainWindow.on('unmaximize', () => {
271 debug('Window: unmaximize');
232 app.isMaximized = false; 272 app.isMaximized = false;
233 }); 273 });
234 274
235 mainWindow.on('restore', () => { 275 mainWindow.on('restore', () => {
276 debug('Window: restore');
236 mainWindow.setSkipTaskbar(false); 277 mainWindow.setSkipTaskbar(false);
237 278
238 if (app.wasMaximized) { 279 if (app.wasMaximized) {
280 debug('Window: was maximized before, maximize window');
239 mainWindow.maximize(); 281 mainWindow.maximize();
240 } 282 }
241 283
242 if (!settings.get('enableSystemTray')) { 284 if (!settings.get('enableSystemTray')) {
285 debug('Tray: hiding tray icon');
243 trayIcon.hide(); 286 trayIcon.hide();
244 } 287 }
245 }); 288 });
246 289
247 mainWindow.on('show', () => { 290 mainWindow.on('show', () => {
291 debug('Skip taskbar: false');
248 mainWindow.setSkipTaskbar(false); 292 mainWindow.setSkipTaskbar(false);
249 }); 293 });
250 294
@@ -252,8 +296,12 @@ const createWindow = () => {
252 app.isMaximized = mainWindow.isMaximized(); 296 app.isMaximized = mainWindow.isMaximized();
253 297
254 mainWindow.webContents.on('new-window', (e, url) => { 298 mainWindow.webContents.on('new-window', (e, url) => {
299 debug('Open url', url);
255 e.preventDefault(); 300 e.preventDefault();
256 shell.openExternal(url); 301
302 if (isValidExternalURL(url)) {
303 shell.openExternal(url);
304 }
257 }); 305 });
258}; 306};
259 307
@@ -331,7 +379,10 @@ app.on('window-all-closed', () => {
331 // to stay active until the user quits explicitly with Cmd + Q 379 // to stay active until the user quits explicitly with Cmd + Q
332 if (settings.get('runInBackground') === undefined 380 if (settings.get('runInBackground') === undefined
333 || settings.get('runInBackground')) { 381 || settings.get('runInBackground')) {
382 debug('Window: all windows closed, quit app');
334 app.quit(); 383 app.quit();
384 } else {
385 debug('Window: don\'t quit app');
335 } 386 }
336}); 387});
337 388
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index c378619ad..7a60c448f 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -1,5 +1,5 @@
1import { remote, shell } from 'electron'; 1import { remote, shell } from 'electron';
2import { observable, autorun, computed } from 'mobx'; 2import { observable, autorun } from 'mobx';
3import { defineMessages } from 'react-intl'; 3import { defineMessages } from 'react-intl';
4 4
5import { isMac, ctrlKey, cmdKey } from '../environment'; 5import { isMac, ctrlKey, cmdKey } from '../environment';
@@ -179,6 +179,22 @@ const menuItems = defineMessages({
179 id: 'menu.services.addNewService', 179 id: 'menu.services.addNewService',
180 defaultMessage: '!!!Add New Service...', 180 defaultMessage: '!!!Add New Service...',
181 }, 181 },
182 activateNextService: {
183 id: 'menu.services.setNextServiceActive',
184 defaultMessage: '!!!Activate next service...',
185 },
186 activatePreviousService: {
187 id: 'menu.services.activatePreviousService',
188 defaultMessage: '!!!Activate previous service...',
189 },
190 muteApp: {
191 id: 'sidebar.muteApp',
192 defaultMessage: '!!!Disable notifications & audio',
193 },
194 unmuteApp: {
195 id: 'sidebar.unmuteApp',
196 defaultMessage: '!!!Enable notifications & audio',
197 },
182}); 198});
183 199
184function getActiveWebview() { 200function getActiveWebview() {
@@ -239,16 +255,32 @@ const _templateFactory = intl => [
239 }, 255 },
240 { 256 {
241 label: intl.formatMessage(menuItems.resetZoom), 257 label: intl.formatMessage(menuItems.resetZoom),
242 role: 'resetzoom', 258 accelerator: 'Cmd+0',
259 click() {
260 getActiveWebview().setZoomLevel(0);
261 },
243 }, 262 },
244 { 263 {
245 label: intl.formatMessage(menuItems.zoomIn), 264 label: intl.formatMessage(menuItems.zoomIn),
246 // accelerator: 'Cmd+=', 265 accelerator: 'Cmd+plus',
247 role: 'zoomin', 266 click() {
267 const activeService = getActiveWebview();
268 activeService.getZoomLevel((level) => {
269 // level 9 =~ +300% and setZoomLevel wouldnt zoom in further
270 if (level < 9) activeService.setZoomLevel(level + 1);
271 });
272 },
248 }, 273 },
249 { 274 {
250 label: intl.formatMessage(menuItems.zoomOut), 275 label: intl.formatMessage(menuItems.zoomOut),
251 role: 'zoomout', 276 accelerator: 'Cmd+-',
277 click() {
278 const activeService = getActiveWebview();
279 activeService.getZoomLevel((level) => {
280 // level -9 =~ -50% and setZoomLevel wouldnt zoom out further
281 if (level > -9) activeService.setZoomLevel(level - 1);
282 });
283 },
252 }, 284 },
253 { 285 {
254 type: 'separator', 286 type: 'separator',
@@ -392,10 +424,12 @@ const _titleBarTemplateFactory = intl => [
392 }, 424 },
393 { 425 {
394 label: intl.formatMessage(menuItems.zoomIn), 426 label: intl.formatMessage(menuItems.zoomIn),
395 accelerator: `${ctrlKey}+Plus`, 427 accelerator: `${ctrlKey}+=`,
396 click() { 428 click() {
397 getActiveWebview().getZoomLevel((zoomLevel) => { 429 const activeService = getActiveWebview();
398 getActiveWebview().setZoomLevel(zoomLevel === 5 ? zoomLevel : zoomLevel + 1); 430 activeService.getZoomLevel((level) => {
431 // level 9 =~ +300% and setZoomLevel wouldnt zoom in further
432 if (level < 9) activeService.setZoomLevel(level + 1);
399 }); 433 });
400 }, 434 },
401 }, 435 },
@@ -403,8 +437,10 @@ const _titleBarTemplateFactory = intl => [
403 label: intl.formatMessage(menuItems.zoomOut), 437 label: intl.formatMessage(menuItems.zoomOut),
404 accelerator: `${ctrlKey}+-`, 438 accelerator: `${ctrlKey}+-`,
405 click() { 439 click() {
406 getActiveWebview().getZoomLevel((zoomLevel) => { 440 const activeService = getActiveWebview();
407 getActiveWebview().setZoomLevel(zoomLevel === -5 ? zoomLevel : zoomLevel - 1); 441 activeService.getZoomLevel((level) => {
442 // level -9 =~ -50% and setZoomLevel wouldnt zoom out further
443 if (level > -9) activeService.setZoomLevel(level - 1);
408 }); 444 });
409 }, 445 },
410 }, 446 },
@@ -499,13 +535,14 @@ export default class FranzMenu {
499 } 535 }
500 536
501 _build() { 537 _build() {
502 const serviceTpl = Object.assign([], this.serviceTpl); // need to clone object so we don't modify computed (cached) object 538 // need to clone object so we don't modify computed (cached) object
539 const serviceTpl = Object.assign([], this.serviceTpl());
503 540
504 if (window.franz === undefined) { 541 if (window.franz === undefined) {
505 return; 542 return;
506 } 543 }
507 544
508 const intl = window.franz.intl; 545 const { intl } = window.franz;
509 const tpl = isMac ? _templateFactory(intl) : _titleBarTemplateFactory(intl); 546 const tpl = isMac ? _templateFactory(intl) : _titleBarTemplateFactory(intl);
510 547
511 tpl[1].submenu.push({ 548 tpl[1].submenu.push({
@@ -663,17 +700,6 @@ export default class FranzMenu {
663 }, about); 700 }, about);
664 } 701 }
665 702
666 serviceTpl.unshift({
667 label: intl.formatMessage(menuItems.addNewService),
668 accelerator: `${cmdKey}+N`,
669 click: () => {
670 this.actions.ui.openSettings({ path: 'recipes' });
671 },
672 enabled: this.stores.user.isLoggedIn,
673 }, {
674 type: 'separator',
675 });
676
677 if (serviceTpl.length > 0) { 703 if (serviceTpl.length > 0) {
678 tpl[3].submenu = serviceTpl; 704 tpl[3].submenu = serviceTpl;
679 } 705 }
@@ -683,22 +709,49 @@ export default class FranzMenu {
683 Menu.setApplicationMenu(menu); 709 Menu.setApplicationMenu(menu);
684 } 710 }
685 711
686 @computed get serviceTpl() { 712 serviceTpl() {
687 const services = this.stores.services.allDisplayed; 713 const { intl } = window.franz;
714 const { user, services, settings } = this.stores;
715 if (!user.isLoggedIn) return [];
716 const menu = [];
688 717
689 if (this.stores.user.isLoggedIn) { 718 menu.push({
690 return services.map((service, i) => ({ 719 label: intl.formatMessage(menuItems.addNewService),
691 label: this._getServiceName(service), 720 accelerator: `${cmdKey}+N`,
692 accelerator: i < 9 ? `${cmdKey}+${i + 1}` : null, 721 click: () => {
693 type: 'radio', 722 this.actions.ui.openSettings({ path: 'recipes' });
694 checked: service.isActive, 723 },
695 click: () => { 724 }, {
696 this.actions.service.setActive({ serviceId: service.id }); 725 type: 'separator',
697 }, 726 }, {
698 })); 727 label: intl.formatMessage(menuItems.activateNextService),
699 } 728 accelerator: `${cmdKey}+alt+right`,
729 click: () => this.actions.service.setActiveNext(),
730 }, {
731 label: intl.formatMessage(menuItems.activatePreviousService),
732 accelerator: `${cmdKey}+alt+left`,
733 click: () => this.actions.service.setActivePrev(),
734 }, {
735 label: intl.formatMessage(
736 settings.all.app.isAppMuted ? menuItems.unmuteApp : menuItems.muteApp,
737 ).replace('&', '&&'),
738 accelerator: `${cmdKey}+shift+m`,
739 click: () => this.actions.app.toggleMuteApp(),
740 }, {
741 type: 'separator',
742 });
743
744 services.allDisplayed.forEach((service, i) => (menu.push({
745 label: this._getServiceName(service),
746 accelerator: i < 9 ? `${cmdKey}+${i + 1}` : null,
747 type: 'radio',
748 checked: service.isActive,
749 click: () => {
750 this.actions.service.setActive({ serviceId: service.id });
751 },
752 })));
700 753
701 return []; 754 return menu;
702 } 755 }
703 756
704 _getServiceName(service) { 757 _getServiceName(service) {
diff --git a/src/lib/Tray.js b/src/lib/Tray.js
index 669b02709..192e24796 100644
--- a/src/lib/Tray.js
+++ b/src/lib/Tray.js
@@ -22,7 +22,11 @@ export default class TrayIcon {
22 { 22 {
23 label: 'Show Franz', 23 label: 'Show Franz',
24 click() { 24 click() {
25 if (app.mainWindow.isMinimized()) {
26 app.mainWindow.restore();
27 }
25 app.mainWindow.show(); 28 app.mainWindow.show();
29 app.mainWindow.focus();
26 }, 30 },
27 }, { 31 }, {
28 label: 'Quit Franz', 32 label: 'Quit Franz',
@@ -36,7 +40,11 @@ export default class TrayIcon {
36 this.trayIcon.setContextMenu(trayMenu); 40 this.trayIcon.setContextMenu(trayMenu);
37 41
38 this.trayIcon.on('click', () => { 42 this.trayIcon.on('click', () => {
43 if (app.mainWindow.isMinimized()) {
44 app.mainWindow.restore();
45 }
39 app.mainWindow.show(); 46 app.mainWindow.show();
47 app.mainWindow.focus();
40 }); 48 });
41 49
42 if (process.platform === 'darwin') { 50 if (process.platform === 'darwin') {
diff --git a/src/lib/analytics.js b/src/lib/analytics.js
index 7044e5bb7..0519192d1 100644
--- a/src/lib/analytics.js
+++ b/src/lib/analytics.js
@@ -37,7 +37,3 @@ export function gaEvent(category, action, label) {
37 37
38 debug('GA track event', category, action); 38 debug('GA track event', category, action);
39} 39}
40
41setTimeout(() => {
42 ga('send', 'Ping');
43}, 1000 * 60 * 10); // Ping GA every 10 Minutes
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index b21d48a11..351ad6422 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -1,21 +1,25 @@
1import { remote, ipcRenderer, shell } from 'electron'; 1import { remote, ipcRenderer, shell } from 'electron';
2import { action, computed, observable } from 'mobx'; 2import {
3 action, computed, observable, reaction,
4} from 'mobx';
3import moment from 'moment'; 5import moment from 'moment';
4import key from 'keymaster';
5import { getDoNotDisturb } from '@meetfranz/electron-notification-state'; 6import { getDoNotDisturb } from '@meetfranz/electron-notification-state';
6import AutoLaunch from 'auto-launch'; 7import AutoLaunch from 'auto-launch';
7import prettyBytes from 'pretty-bytes'; 8import prettyBytes from 'pretty-bytes';
9import ms from 'ms';
10import { URL } from 'url';
8 11
9import Store from './lib/Store'; 12import Store from './lib/Store';
10import Request from './lib/Request'; 13import Request from './lib/Request';
11import { CHECK_INTERVAL, DEFAULT_APP_SETTINGS } from '../config'; 14import { CHECK_INTERVAL, DEFAULT_APP_SETTINGS } from '../config';
12import { isMac, isLinux, isWindows } from '../environment'; 15import { isMac } from '../environment';
13import locales from '../i18n/translations'; 16import locales from '../i18n/translations';
14import { gaEvent } from '../lib/analytics'; 17import { gaEvent, gaPage } from '../lib/analytics';
15import { onVisibilityChange } from '../helpers/visibility-helper'; 18import { onVisibilityChange } from '../helpers/visibility-helper';
16import { getLocale } from '../helpers/i18n-helpers'; 19import { getLocale } from '../helpers/i18n-helpers';
17 20
18import { getServiceIdsFromPartitions, removeServicePartitionDirectory } from '../helpers/service-helpers.js'; 21import { getServiceIdsFromPartitions, removeServicePartitionDirectory } from '../helpers/service-helpers.js';
22import { isValidExternalURL } from '../helpers/url-helpers';
19 23
20const debug = require('debug')('Franz:AppStore'); 24const debug = require('debug')('Franz:AppStore');
21 25
@@ -110,12 +114,12 @@ export default class AppStore extends Store {
110 // Check if system is muted 114 // Check if system is muted
111 // There are no events to subscribe so we need to poll everey 5s 115 // There are no events to subscribe so we need to poll everey 5s
112 this._systemDND(); 116 this._systemDND();
113 setInterval(() => this._systemDND(), 5000); 117 setInterval(() => this._systemDND(), ms('5s'));
114 118
115 // Check for updates once every 4 hours 119 // Check for updates once every 4 hours
116 setInterval(() => this._checkForUpdates(), CHECK_INTERVAL); 120 setInterval(() => this._checkForUpdates(), CHECK_INTERVAL);
117 // Check for an update in 30s (need a delay to prevent Squirrel Installer lock file issues) 121 // Check for an update in 30s (need a delay to prevent Squirrel Installer lock file issues)
118 setTimeout(() => this._checkForUpdates(), 30000); 122 setTimeout(() => this._checkForUpdates(), ms('30s'));
119 ipcRenderer.on('autoUpdate', (event, data) => { 123 ipcRenderer.on('autoUpdate', (event, data) => {
120 if (data.available) { 124 if (data.available) {
121 this.updateStatus = this.updateStatusTypes.AVAILABLE; 125 this.updateStatus = this.updateStatusTypes.AVAILABLE;
@@ -152,27 +156,6 @@ export default class AppStore extends Store {
152 this.stores.router.push(url); 156 this.stores.router.push(url);
153 }); 157 });
154 158
155 // Set active the next service
156 key(
157 '⌘+pagedown, ctrl+pagedown, ⌘+alt+right, ctrl+tab', () => {
158 this.actions.service.setActiveNext();
159 },
160 );
161
162 // Set active the prev service
163 key(
164 '⌘+pageup, ctrl+pageup, ⌘+alt+left, ctrl+shift+tab', () => {
165 this.actions.service.setActivePrev();
166 },
167 );
168
169 // Global Mute
170 key(
171 '⌘+shift+m ctrl+shift+m', () => {
172 this.actions.app.toggleMuteApp();
173 },
174 );
175
176 this.locale = this._getDefaultLocale(); 159 this.locale = this._getDefaultLocale();
177 160
178 this._healthCheck(); 161 this._healthCheck();
@@ -184,6 +167,12 @@ export default class AppStore extends Store {
184 167
185 debug('Window is visible/focused', isVisible); 168 debug('Window is visible/focused', isVisible);
186 }); 169 });
170
171 // analytics autorun
172 reaction(() => this.stores.router.location.pathname, (pathname) => {
173 gaPage(pathname);
174 });
175 console.log('router location', this.stores.router.location);
187 } 176 }
188 177
189 @computed get cacheSize() { 178 @computed get cacheSize() {
@@ -196,7 +185,15 @@ export default class AppStore extends Store {
196 }) { 185 }) {
197 if (this.stores.settings.all.app.isAppMuted) return; 186 if (this.stores.settings.all.app.isAppMuted) return;
198 187
188 // TODO: is there a simple way to use blobs for notifications without storing them on disk?
189 if (options.icon.startsWith('blob:')) {
190 delete options.icon;
191 }
192
199 const notification = new window.Notification(title, options); 193 const notification = new window.Notification(title, options);
194
195 debug('New notification', title, options);
196
200 notification.onclick = (e) => { 197 notification.onclick = (e) => {
201 if (serviceId) { 198 if (serviceId) {
202 this.actions.service.sendIPCMessage({ 199 this.actions.service.sendIPCMessage({
@@ -206,12 +203,13 @@ export default class AppStore extends Store {
206 }); 203 });
207 204
208 this.actions.service.setActive({ serviceId }); 205 this.actions.service.setActive({ serviceId });
209 206 mainWindow.show();
210 if (isWindows) { 207 if (app.mainWindow.isMinimized()) {
211 mainWindow.restore(); 208 mainWindow.restore();
212 } else if (isLinux) {
213 mainWindow.show();
214 } 209 }
210 mainWindow.focus();
211
212 debug('Notification click handler');
215 } 213 }
216 }; 214 };
217 } 215 }
@@ -247,7 +245,14 @@ export default class AppStore extends Store {
247 } 245 }
248 246
249 @action _openExternalUrl({ url }) { 247 @action _openExternalUrl({ url }) {
250 shell.openExternal(url); 248 const parsedUrl = new URL(url);
249 debug('open external url', parsedUrl);
250
251 if (isValidExternalURL(url)) {
252 shell.openExternal(url);
253 }
254
255 gaEvent('External URL', 'open', parsedUrl.host);
251 } 256 }
252 257
253 @action _checkForUpdates() { 258 @action _checkForUpdates() {
@@ -271,7 +276,6 @@ export default class AppStore extends Store {
271 276
272 @action _muteApp({ isMuted, overrideSystemMute = true }) { 277 @action _muteApp({ isMuted, overrideSystemMute = true }) {
273 this.isSystemMuteOverridden = overrideSystemMute; 278 this.isSystemMuteOverridden = overrideSystemMute;
274
275 this.actions.settings.update({ 279 this.actions.settings.update({
276 type: 'app', 280 type: 'app',
277 data: { 281 data: {
@@ -308,7 +312,7 @@ export default class AppStore extends Store {
308 } else { 312 } else {
309 const deltaTime = moment().diff(this.timeOfflineStart); 313 const deltaTime = moment().diff(this.timeOfflineStart);
310 314
311 if (deltaTime > 30 * 60 * 1000) { 315 if (deltaTime > ms('30m')) {
312 this.actions.service.reloadAll(); 316 this.actions.service.reloadAll();
313 } 317 }
314 } 318 }
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index 0adee6adf..d2842083c 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -7,6 +7,7 @@ import delayApp from '../features/delayApp';
7import spellchecker from '../features/spellchecker'; 7import spellchecker from '../features/spellchecker';
8import serviceProxy from '../features/serviceProxy'; 8import serviceProxy from '../features/serviceProxy';
9import basicAuth from '../features/basicAuth'; 9import basicAuth from '../features/basicAuth';
10import shareFranz from '../features/shareFranz';
10 11
11import { DEFAULT_FEATURES_CONFIG } from '../config'; 12import { DEFAULT_FEATURES_CONFIG } from '../config';
12 13
@@ -56,5 +57,6 @@ export default class FeaturesStore extends Store {
56 spellchecker(this.stores, this.actions); 57 spellchecker(this.stores, this.actions);
57 serviceProxy(this.stores, this.actions); 58 serviceProxy(this.stores, this.actions);
58 basicAuth(this.stores, this.actions); 59 basicAuth(this.stores, this.actions);
60 shareFranz(this.stores, this.actions);
59 } 61 }
60} 62}
diff --git a/src/stores/RecipePreviewsStore.js b/src/stores/RecipePreviewsStore.js
index 10b2928e3..382820d58 100644
--- a/src/stores/RecipePreviewsStore.js
+++ b/src/stores/RecipePreviewsStore.js
@@ -1,5 +1,6 @@
1import { action, computed, observable } from 'mobx'; 1import { action, computed, observable } from 'mobx';
2import { debounce } from 'lodash'; 2import { debounce } from 'lodash';
3import ms from 'ms';
3 4
4import Store from './lib/Store'; 5import Store from './lib/Store';
5import CachedRequest from './lib/CachedRequest'; 6import CachedRequest from './lib/CachedRequest';
@@ -48,5 +49,5 @@ export default class RecipePreviewsStore extends Store {
48 // Helper 49 // Helper
49 _analyticsSearch = debounce((needle) => { 50 _analyticsSearch = debounce((needle) => {
50 gaEvent('Recipe', 'search', needle); 51 gaEvent('Recipe', 'search', needle);
51 }, 3000); 52 }, ms('3s'));
52} 53}
diff --git a/src/stores/RequestStore.js b/src/stores/RequestStore.js
index 2629e0a38..9254e3223 100644
--- a/src/stores/RequestStore.js
+++ b/src/stores/RequestStore.js
@@ -1,4 +1,5 @@
1import { action, computed, observable } from 'mobx'; 1import { action, computed, observable } from 'mobx';
2import ms from 'ms';
2 3
3import Store from './lib/Store'; 4import Store from './lib/Store';
4 5
@@ -13,7 +14,7 @@ export default class RequestStore extends Store {
13 14
14 retries = 0; 15 retries = 0;
15 16
16 retryDelay = 2000; 17 retryDelay = ms('2s');
17 18
18 constructor(...args) { 19 constructor(...args) {
19 super(...args); 20 super(...args);
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index efd57a09d..69e616f0c 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -5,6 +5,7 @@ import {
5 observable, 5 observable,
6} from 'mobx'; 6} from 'mobx';
7import { debounce, remove } from 'lodash'; 7import { debounce, remove } from 'lodash';
8import ms from 'ms';
8 9
9import Store from './lib/Store'; 10import Store from './lib/Store';
10import Request from './lib/Request'; 11import Request from './lib/Request';
@@ -43,6 +44,7 @@ export default class ServicesStore extends Store {
43 this.actions.service.deleteService.listen(this._deleteService.bind(this)); 44 this.actions.service.deleteService.listen(this._deleteService.bind(this));
44 this.actions.service.clearCache.listen(this._clearCache.bind(this)); 45 this.actions.service.clearCache.listen(this._clearCache.bind(this));
45 this.actions.service.setWebviewReference.listen(this._setWebviewReference.bind(this)); 46 this.actions.service.setWebviewReference.listen(this._setWebviewReference.bind(this));
47 this.actions.service.detachService.listen(this._detachService.bind(this));
46 this.actions.service.focusService.listen(this._focusService.bind(this)); 48 this.actions.service.focusService.listen(this._focusService.bind(this));
47 this.actions.service.focusActiveService.listen(this._focusActiveService.bind(this)); 49 this.actions.service.focusActiveService.listen(this._focusActiveService.bind(this));
48 this.actions.service.toggleService.listen(this._toggleService.bind(this)); 50 this.actions.service.toggleService.listen(this._toggleService.bind(this));
@@ -340,6 +342,11 @@ export default class ServicesStore extends Store {
340 service.isAttached = true; 342 service.isAttached = true;
341 } 343 }
342 344
345 @action _detachService({ service }) {
346 service.webview = null;
347 service.isAttached = false;
348 }
349
343 @action _focusService({ serviceId }) { 350 @action _focusService({ serviceId }) {
344 const service = this.one(serviceId); 351 const service = this.one(serviceId);
345 352
@@ -679,7 +686,7 @@ export default class ServicesStore extends Store {
679 _initRecipePolling(serviceId) { 686 _initRecipePolling(serviceId) {
680 const service = this.one(serviceId); 687 const service = this.one(serviceId);
681 688
682 const delay = 2000; 689 const delay = ms('2s');
683 690
684 if (service) { 691 if (service) {
685 if (service.timer !== null) { 692 if (service.timer !== null) {
@@ -700,7 +707,7 @@ export default class ServicesStore extends Store {
700 707
701 _reorderAnalytics = debounce(() => { 708 _reorderAnalytics = debounce(() => {
702 gaEvent('Service', 'order'); 709 gaEvent('Service', 'order');
703 }, 5000); 710 }, ms('5s'));
704 711
705 _wrapIndex(index, delta, size) { 712 _wrapIndex(index, delta, size) {
706 return (((index + delta) % size) + size) % size; 713 return (((index + delta) % size) + size) % size;
diff --git a/src/stores/UIStore.js b/src/stores/UIStore.js
index d37ebe4c7..bb7965a4a 100644
--- a/src/stores/UIStore.js
+++ b/src/stores/UIStore.js
@@ -1,8 +1,7 @@
1import { action, observable, computed } from 'mobx'; 1import { action, observable, computed } from 'mobx';
2import { theme } from '@meetfranz/theme';
2 3
3import Store from './lib/Store'; 4import Store from './lib/Store';
4import * as themeDefault from '../theme/default';
5import * as themeDark from '../theme/dark';
6 5
7export default class UIStore extends Store { 6export default class UIStore extends Store {
8 @observable showServicesUpdatedInfoBar = false; 7 @observable showServicesUpdatedInfoBar = false;
@@ -24,10 +23,10 @@ export default class UIStore extends Store {
24 23
25 @computed get theme() { 24 @computed get theme() {
26 if (this.stores.settings.all.app.darkMode) { 25 if (this.stores.settings.all.app.darkMode) {
27 return Object.assign({}, themeDefault, themeDark); 26 return theme('dark');
28 } 27 }
29 28
30 return themeDefault; 29 return theme('default');
31 } 30 }
32 31
33 // Actions 32 // Actions
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index 8b7cc512a..9a003a922 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -124,15 +124,14 @@ html { overflow: hidden; }
124 background: $theme-brand-warning; 124 background: $theme-brand-warning;
125 color: #FFF; 125 color: #FFF;
126 display: block; 126 display: block;
127 font-size: 10px; 127 font-size: 8px;
128 height: auto; 128 height: auto;
129 padding: 4px; 129 padding: 4px;
130 position: fixed; 130 position: fixed;
131 right: 5px; 131 left: 9px;
132 top: 5px; 132 bottom: 0px;
133 transition: opacity .5s ease; 133 transition: opacity .5s ease;
134 width: auto; 134 width: auto;
135 z-index: 999999999; 135 z-index: 999999999;
136 136 pointer-events: none;
137 &:hover { opacity: 0; }
138} 137}
diff --git a/src/styles/toggle.scss b/src/styles/toggle.scss
index 0ce0c3379..52675ceed 100644
--- a/src/styles/toggle.scss
+++ b/src/styles/toggle.scss
@@ -41,7 +41,7 @@ $toggle-button-size: 22px;
41 41
42 &.is-active .franz-form__toggle-button { 42 &.is-active .franz-form__toggle-button {
43 background: $theme-brand-primary; 43 background: $theme-brand-primary;
44 left: $toggle-width - $toggle-size - 3;; 44 left: $toggle-width - $toggle-size - 3;
45 } 45 }
46 46
47 input { display: none; } 47 input { display: none; }
diff --git a/src/theme/dark/index.js b/src/theme/dark/index.js
deleted file mode 100644
index 8fdb321f3..000000000
--- a/src/theme/dark/index.js
+++ /dev/null
@@ -1,19 +0,0 @@
1import hexToRgba from 'hex-to-rgba';
2
3import * as legacyStyles from '../default/legacy';
4
5export const colorBackground = legacyStyles.darkThemeGrayDarkest;
6export const colorBackgroundSubscriptionContainer = legacyStyles.themeBrandInfo;
7
8export const colorHeadline = legacyStyles.darkThemeTextColor;
9export const colorText = legacyStyles.darkThemeTextColor;
10
11// Error Handler
12export const colorWebviewErrorHandlerBackground = legacyStyles.darkThemeGrayDarkest;
13
14// Loader
15export const colorFullscreenLoaderSpinner = '#FFF';
16export const colorWebviewLoaderBackground = hexToRgba(legacyStyles.darkThemeGrayDarkest, 0.5);
17
18// Modal
19export const colorModalOverlayBackground = hexToRgba(legacyStyles.darkThemeGrayDarkest, 0.8);
diff --git a/src/theme/default/index.js b/src/theme/default/index.js
deleted file mode 100644
index 61410073d..000000000
--- a/src/theme/default/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
1import hexToRgba from 'hex-to-rgba';
2
3import * as legacyStyles from './legacy';
4
5export const brandPrimary = '#3498db';
6export const brandSuccess = '#5cb85c';
7export const brandInfo = '#5bc0de';
8export const brandWarning = '#FF9F00';
9export const brandDanger = '#d9534f';
10
11export const borderRadius = legacyStyles.themeBorderRadius;
12export const borderRadiusSmall = legacyStyles.themeBorderRadiusSmall;
13
14export const colorBackground = legacyStyles.themeGrayLighter;
15export const colorHeadline = legacyStyles.themeGrayDark;
16
17export const colorText = legacyStyles.themeTextColor;
18
19// Subscription Container Component
20export const colorSubscriptionContainerBackground = 'none';
21export const colorSubscriptionContainerBorder = [1, 'solid', brandPrimary];
22export const colorSubscriptionContainerTitle = brandPrimary;
23export const colorSubscriptionContainerActionButtonBackground = brandPrimary;
24export const colorSubscriptionContainerActionButtonColor = '#FFF';
25
26// Error Handler
27export const colorWebviewErrorHandlerBackground = legacyStyles.themeGrayLighter;
28
29// Loader
30export const colorAppLoaderSpinner = '#FFF';
31export const colorFullscreenLoaderSpinner = legacyStyles.themeGrayDark;
32export const colorWebviewLoaderBackground = hexToRgba(legacyStyles.themeGrayLighter, 0.8);
33
34// Modal
35export const colorModalOverlayBackground = hexToRgba(legacyStyles.themeGrayLighter, 0.8);