aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar Dominik Guzei <dominik.guzei@gmail.com>2019-04-11 12:00:07 +0200
committerLibravatar Dominik Guzei <dominik.guzei@gmail.com>2019-04-11 12:00:07 +0200
commite43d6bd80b3d76aae627fa8174eea98c14016549 (patch)
treede1d0a3ba10100ce68d0cb1ed618095e362fe573 /src
parentimplements basic release announcement feature (diff)
parenthandle deleted services that are attached to workspaces (diff)
downloadferdium-app-e43d6bd80b3d76aae627fa8174eea98c14016549.tar.gz
ferdium-app-e43d6bd80b3d76aae627fa8174eea98c14016549.tar.zst
ferdium-app-e43d6bd80b3d76aae627fa8174eea98c14016549.zip
merge-in workspace feature
Diffstat (limited to 'src')
-rw-r--r--src/actions/index.js2
-rw-r--r--src/actions/lib/actions.js4
-rw-r--r--src/app.js5
-rw-r--r--src/components/layout/AppLayout.js26
-rw-r--r--src/components/layout/Sidebar.js49
-rw-r--r--src/components/services/content/ServiceView.js5
-rw-r--r--src/components/services/tabs/Tabbar.js4
-rw-r--r--src/components/settings/navigation/SettingsNavigation.js29
-rw-r--r--src/components/settings/services/EditServiceForm.js10
-rw-r--r--src/components/settings/services/ServicesDashboard.js2
-rw-r--r--src/components/settings/settings/EditSettingsForm.js1
-rw-r--r--src/components/ui/AppLoader/index.js4
-rw-r--r--src/components/ui/FullscreenLoader/index.js4
-rw-r--r--src/components/ui/Infobox.js17
-rw-r--r--src/components/ui/PremiumFeatureContainer/index.js21
-rw-r--r--src/components/ui/PremiumFeatureContainer/styles.js5
-rw-r--r--src/components/ui/ServiceIcon.js67
-rw-r--r--src/components/ui/WebviewLoader/index.js18
-rw-r--r--src/config.js2
-rw-r--r--src/containers/layout/AppLayoutContainer.js15
-rw-r--r--src/containers/settings/SettingsWindow.js2
-rw-r--r--src/environment.js1
-rw-r--r--src/features/delayApp/Component.js2
-rw-r--r--src/features/delayApp/index.js2
-rw-r--r--src/features/shareFranz/Component.js2
-rw-r--r--src/features/spellchecker/index.js2
-rw-r--r--src/features/utils/FeatureStore.js21
-rw-r--r--src/features/workspaces/actions.js26
-rw-r--r--src/features/workspaces/api.js66
-rw-r--r--src/features/workspaces/components/CreateWorkspaceForm.js100
-rw-r--r--src/features/workspaces/components/EditWorkspaceForm.js189
-rw-r--r--src/features/workspaces/components/WorkspaceDrawer.js246
-rw-r--r--src/features/workspaces/components/WorkspaceDrawerItem.js137
-rw-r--r--src/features/workspaces/components/WorkspaceItem.js45
-rw-r--r--src/features/workspaces/components/WorkspaceServiceListItem.js75
-rw-r--r--src/features/workspaces/components/WorkspaceSwitchingIndicator.js91
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.js195
-rw-r--r--src/features/workspaces/containers/EditWorkspaceScreen.js60
-rw-r--r--src/features/workspaces/containers/WorkspacesScreen.js42
-rw-r--r--src/features/workspaces/index.js37
-rw-r--r--src/features/workspaces/models/Workspace.js25
-rw-r--r--src/features/workspaces/store.js276
-rw-r--r--src/i18n/locales/ca.json15
-rw-r--r--src/i18n/locales/cs.json15
-rw-r--r--src/i18n/locales/de.json45
-rw-r--r--src/i18n/locales/defaultMessages.json752
-rw-r--r--src/i18n/locales/el.json15
-rw-r--r--src/i18n/locales/en-US.json39
-rw-r--r--src/i18n/locales/es.json19
-rw-r--r--src/i18n/locales/fr.json33
-rw-r--r--src/i18n/locales/ga.json15
-rw-r--r--src/i18n/locales/hr.json15
-rw-r--r--src/i18n/locales/hu.json15
-rw-r--r--src/i18n/locales/id.json15
-rw-r--r--src/i18n/locales/it.json15
-rw-r--r--src/i18n/locales/ja.json15
-rw-r--r--src/i18n/locales/ka.json15
-rw-r--r--src/i18n/locales/nl-BE.json15
-rw-r--r--src/i18n/locales/nl.json15
-rw-r--r--src/i18n/locales/pl.json15
-rw-r--r--src/i18n/locales/pt-BR.json33
-rw-r--r--src/i18n/locales/pt.json15
-rw-r--r--src/i18n/locales/ru.json17
-rw-r--r--src/i18n/locales/sk.json15
-rw-r--r--src/i18n/locales/sr.json15
-rw-r--r--src/i18n/locales/tr.json39
-rw-r--r--src/i18n/locales/uk.json15
-rw-r--r--src/i18n/locales/zh-TW.json15
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json24
-rw-r--r--src/i18n/messages/src/components/layout/Sidebar.json42
-rw-r--r--src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json37
-rw-r--r--src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json4
-rw-r--r--src/i18n/messages/src/components/ui/WebviewLoader/index.json15
-rw-r--r--src/i18n/messages/src/features/shareFranz/Component.json2
-rw-r--r--src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json28
-rw-r--r--src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json67
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json106
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json28
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json15
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json106
-rw-r--r--src/i18n/messages/src/lib/Menu.json257
-rw-r--r--src/lib/Menu.js94
-rw-r--r--src/lib/analytics.js4
-rw-r--r--src/stores/FeaturesStore.js29
-rw-r--r--src/stores/ServicesStore.js9
-rw-r--r--src/stores/UIStore.js9
-rw-r--r--src/stores/UserStore.js4
-rw-r--r--src/stores/lib/Request.js6
-rw-r--r--src/styles/auth.scss2
-rw-r--r--src/styles/layout.scss13
-rw-r--r--src/styles/settings.scss9
91 files changed, 3508 insertions, 581 deletions
diff --git a/src/actions/index.js b/src/actions/index.js
index dc1d3b6b2..fc525afeb 100644
--- a/src/actions/index.js
+++ b/src/actions/index.js
@@ -12,6 +12,7 @@ import news from './news';
12import settings from './settings'; 12import settings from './settings';
13import requests from './requests'; 13import requests from './requests';
14import announcements from '../features/announcements/actions'; 14import announcements from '../features/announcements/actions';
15import workspaces from '../features/workspaces/actions';
15 16
16const actions = Object.assign({}, { 17const actions = Object.assign({}, {
17 service, 18 service,
@@ -29,4 +30,5 @@ const actions = Object.assign({}, {
29export default Object.assign( 30export default Object.assign(
30 defineActions(actions, PropTypes.checkPropTypes), 31 defineActions(actions, PropTypes.checkPropTypes),
31 { announcements }, 32 { announcements },
33 { workspaces },
32); 34);
diff --git a/src/actions/lib/actions.js b/src/actions/lib/actions.js
index 6571e9441..2bc7d2711 100644
--- a/src/actions/lib/actions.js
+++ b/src/actions/lib/actions.js
@@ -9,6 +9,10 @@ export const createActionsFromDefinitions = (actionDefinitions, validate) => {
9 actions[actionName] = action; 9 actions[actionName] = action;
10 action.listeners = []; 10 action.listeners = [];
11 action.listen = listener => action.listeners.push(listener); 11 action.listen = listener => action.listeners.push(listener);
12 action.off = (listener) => {
13 const { listeners } = action;
14 listeners.splice(listeners.indexOf(listener), 1);
15 };
12 action.notify = params => action.listeners.forEach(listener => listener(params)); 16 action.notify = params => action.listeners.forEach(listener => listener(params));
13 }); 17 });
14 return actions; 18 return actions;
diff --git a/src/app.js b/src/app.js
index 6660feb46..fb9f1c6ab 100644
--- a/src/app.js
+++ b/src/app.js
@@ -39,6 +39,9 @@ import PricingScreen from './containers/auth/PricingScreen';
39import InviteScreen from './containers/auth/InviteScreen'; 39import InviteScreen from './containers/auth/InviteScreen';
40import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; 40import AuthLayoutContainer from './containers/auth/AuthLayoutContainer';
41import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; 41import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen';
42import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen';
43import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen';
44import { WORKSPACES_ROUTES } from './features/workspaces';
42 45
43// Add Polyfills 46// Add Polyfills
44smoothScroll.polyfill(); 47smoothScroll.polyfill();
@@ -75,6 +78,8 @@ window.addEventListener('load', () => {
75 <Route path="/settings/recipes/:filter" component={RecipesScreen} /> 78 <Route path="/settings/recipes/:filter" component={RecipesScreen} />
76 <Route path="/settings/services" component={ServicesScreen} /> 79 <Route path="/settings/services" component={ServicesScreen} />
77 <Route path="/settings/services/:action/:id" component={EditServiceScreen} /> 80 <Route path="/settings/services/:action/:id" component={EditServiceScreen} />
81 <Route path={WORKSPACES_ROUTES.ROOT} component={WorkspacesScreen} />
82 <Route path={WORKSPACES_ROUTES.EDIT} component={EditWorkspaceScreen} />
78 <Route path="/settings/user" component={AccountScreen} /> 83 <Route path="/settings/user" component={AccountScreen} />
79 <Route path="/settings/user/edit" component={EditUserScreen} /> 84 <Route path="/settings/user/edit" component={EditUserScreen} />
80 <Route path="/settings/app" component={EditSettingsScreen} /> 85 <Route path="/settings/app" component={EditSettingsScreen} />
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index 2bda91f73..985475c8d 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -3,6 +3,7 @@ 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 { TitleBar } from 'electron-react-titlebar'; 5import { TitleBar } from 'electron-react-titlebar';
6import injectSheet from 'react-jss';
6 7
7import InfoBar from '../ui/InfoBar'; 8import InfoBar from '../ui/InfoBar';
8import { Component as DelayApp } from '../../features/delayApp'; 9import { Component as DelayApp } from '../../features/delayApp';
@@ -14,6 +15,8 @@ import ErrorBoundary from '../util/ErrorBoundary';
14 15
15import { isWindows } from '../../environment'; 16import { isWindows } from '../../environment';
16import AnnouncementScreen from '../../features/announcements/Component'; 17import AnnouncementScreen from '../../features/announcements/Component';
18import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator';
19import { workspaceStore } from '../../features/workspaces';
17 20
18function createMarkup(HTMLString) { 21function createMarkup(HTMLString) {
19 return { __html: HTMLString }; 22 return { __html: HTMLString };
@@ -46,10 +49,23 @@ const messages = defineMessages({
46 }, 49 },
47}); 50});
48 51
49export default @observer class AppLayout extends Component { 52const styles = theme => ({
53 appContent: {
54 width: `calc(100% + ${theme.workspaces.drawer.width}px)`,
55 transition: 'transform 0.5s ease',
56 transform() {
57 return workspaceStore.isWorkspaceDrawerOpen ? 'translateX(0)' : `translateX(-${theme.workspaces.drawer.width}px)`;
58 },
59 },
60});
61
62@injectSheet(styles) @observer
63class AppLayout extends Component {
50 static propTypes = { 64 static propTypes = {
65 classes: PropTypes.object.isRequired,
51 isFullScreen: PropTypes.bool.isRequired, 66 isFullScreen: PropTypes.bool.isRequired,
52 sidebar: PropTypes.element.isRequired, 67 sidebar: PropTypes.element.isRequired,
68 workspacesDrawer: PropTypes.element.isRequired,
53 services: PropTypes.element.isRequired, 69 services: PropTypes.element.isRequired,
54 children: PropTypes.element, 70 children: PropTypes.element,
55 news: MobxPropTypes.arrayOrObservableArray.isRequired, 71 news: MobxPropTypes.arrayOrObservableArray.isRequired,
@@ -78,7 +94,9 @@ export default @observer class AppLayout extends Component {
78 94
79 render() { 95 render() {
80 const { 96 const {
97 classes,
81 isFullScreen, 98 isFullScreen,
99 workspacesDrawer,
82 sidebar, 100 sidebar,
83 services, 101 services,
84 children, 102 children,
@@ -105,9 +123,11 @@ export default @observer class AppLayout extends Component {
105 <div className={(darkMode ? 'theme__dark' : '')}> 123 <div className={(darkMode ? 'theme__dark' : '')}>
106 <div className="app"> 124 <div className="app">
107 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon="assets/images/logo.svg" />} 125 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon="assets/images/logo.svg" />}
108 <div className="app__content"> 126 <div className={`app__content ${classes.appContent}`}>
127 {workspacesDrawer}
109 {sidebar} 128 {sidebar}
110 <div className="app__service"> 129 <div className="app__service">
130 <WorkspaceSwitchingIndicator />
111 {news.length > 0 && news.map(item => ( 131 {news.length > 0 && news.map(item => (
112 <InfoBar 132 <InfoBar
113 key={item.id} 133 key={item.id}
@@ -180,3 +200,5 @@ export default @observer class AppLayout extends Component {
180 ); 200 );
181 } 201 }
182} 202}
203
204export default AppLayout;
diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js
index 609a3b604..36c1f2e39 100644
--- a/src/components/layout/Sidebar.js
+++ b/src/components/layout/Sidebar.js
@@ -6,6 +6,8 @@ import { observer } from 'mobx-react';
6 6
7import Tabbar from '../services/tabs/Tabbar'; 7import Tabbar from '../services/tabs/Tabbar';
8import { ctrlKey } from '../../environment'; 8import { ctrlKey } from '../../environment';
9import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../../features/workspaces';
10import { gaEvent } from '../../lib/analytics';
9 11
10const messages = defineMessages({ 12const messages = defineMessages({
11 settings: { 13 settings: {
@@ -24,6 +26,14 @@ const messages = defineMessages({
24 id: 'sidebar.unmuteApp', 26 id: 'sidebar.unmuteApp',
25 defaultMessage: '!!!Enable notifications & audio', 27 defaultMessage: '!!!Enable notifications & audio',
26 }, 28 },
29 openWorkspaceDrawer: {
30 id: 'sidebar.openWorkspaceDrawer',
31 defaultMessage: '!!!Open workspace drawer',
32 },
33 closeWorkspaceDrawer: {
34 id: 'sidebar.closeWorkspaceDrawer',
35 defaultMessage: '!!!Close workspace drawer',
36 },
27}); 37});
28 38
29export default @observer class Sidebar extends Component { 39export default @observer class Sidebar extends Component {
@@ -31,7 +41,9 @@ export default @observer class Sidebar extends Component {
31 openSettings: PropTypes.func.isRequired, 41 openSettings: PropTypes.func.isRequired,
32 toggleMuteApp: PropTypes.func.isRequired, 42 toggleMuteApp: PropTypes.func.isRequired,
33 isAppMuted: PropTypes.bool.isRequired, 43 isAppMuted: PropTypes.bool.isRequired,
34 } 44 isWorkspaceDrawerOpen: PropTypes.bool.isRequired,
45 toggleWorkspaceDrawer: PropTypes.func.isRequired,
46 };
35 47
36 static contextTypes = { 48 static contextTypes = {
37 intl: intlShape, 49 intl: intlShape,
@@ -53,9 +65,23 @@ export default @observer class Sidebar extends Component {
53 this.setState({ tooltipEnabled: false }); 65 this.setState({ tooltipEnabled: false });
54 } 66 }
55 67
68 updateToolTip() {
69 this.disableToolTip();
70 setTimeout(this.enableToolTip.bind(this));
71 }
72
56 render() { 73 render() {
57 const { openSettings, toggleMuteApp, isAppMuted } = this.props; 74 const {
75 openSettings,
76 toggleMuteApp,
77 isAppMuted,
78 isWorkspaceDrawerOpen,
79 toggleWorkspaceDrawer,
80 } = this.props;
58 const { intl } = this.context; 81 const { intl } = this.context;
82 const workspaceToggleMessage = (
83 isWorkspaceDrawerOpen ? messages.closeWorkspaceDrawer : messages.openWorkspaceDrawer
84 );
59 85
60 return ( 86 return (
61 <div className="sidebar"> 87 <div className="sidebar">
@@ -64,9 +90,26 @@ export default @observer class Sidebar extends Component {
64 enableToolTip={() => this.enableToolTip()} 90 enableToolTip={() => this.enableToolTip()}
65 disableToolTip={() => this.disableToolTip()} 91 disableToolTip={() => this.disableToolTip()}
66 /> 92 />
93 {workspaceStore.isFeatureEnabled ? (
94 <button
95 type="button"
96 onClick={() => {
97 toggleWorkspaceDrawer();
98 this.updateToolTip();
99 gaEvent(GA_CATEGORY_WORKSPACES, 'toggleDrawer', 'sidebar');
100 }}
101 className={`sidebar__button sidebar__button--workspaces ${isWorkspaceDrawerOpen ? 'is-active' : ''}`}
102 data-tip={`${intl.formatMessage(workspaceToggleMessage)} (${ctrlKey}+D)`}
103 >
104 <i className="mdi mdi-view-grid" />
105 </button>
106 ) : null}
67 <button 107 <button
68 type="button" 108 type="button"
69 onClick={toggleMuteApp} 109 onClick={() => {
110 toggleMuteApp();
111 this.updateToolTip();
112 }}
70 className={`sidebar__button sidebar__button--audio ${isAppMuted ? 'is-muted' : ''}`} 113 className={`sidebar__button sidebar__button--audio ${isAppMuted ? 'is-muted' : ''}`}
71 data-tip={`${intl.formatMessage(isAppMuted ? messages.unmute : messages.mute)} (${ctrlKey}+Shift+M)`} 114 data-tip={`${intl.formatMessage(isAppMuted ? messages.unmute : messages.mute)} (${ctrlKey}+Shift+M)`}
72 > 115 >
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
index 5afc54f9d..13148b9b3 100644
--- a/src/components/services/content/ServiceView.js
+++ b/src/components/services/content/ServiceView.js
@@ -35,11 +35,13 @@ export default @observer class ServiceView extends Component {
35 35
36 autorunDisposer = null; 36 autorunDisposer = null;
37 37
38 forceRepaintTimeout = null;
39
38 componentDidMount() { 40 componentDidMount() {
39 this.autorunDisposer = autorun(() => { 41 this.autorunDisposer = autorun(() => {
40 if (this.props.service.isActive) { 42 if (this.props.service.isActive) {
41 this.setState({ forceRepaint: true }); 43 this.setState({ forceRepaint: true });
42 setTimeout(() => { 44 this.forceRepaintTimeout = setTimeout(() => {
43 this.setState({ forceRepaint: false }); 45 this.setState({ forceRepaint: false });
44 }, 100); 46 }, 100);
45 } 47 }
@@ -48,6 +50,7 @@ export default @observer class ServiceView extends Component {
48 50
49 componentWillUnmount() { 51 componentWillUnmount() {
50 this.autorunDisposer(); 52 this.autorunDisposer();
53 clearTimeout(this.forceRepaintTimeout);
51 } 54 }
52 55
53 updateTargetUrl = (event) => { 56 updateTargetUrl = (event) => {
diff --git a/src/components/services/tabs/Tabbar.js b/src/components/services/tabs/Tabbar.js
index dd5c2140f..5e8260ad0 100644
--- a/src/components/services/tabs/Tabbar.js
+++ b/src/components/services/tabs/Tabbar.js
@@ -19,7 +19,7 @@ export default @observer class TabBar extends Component {
19 updateService: PropTypes.func.isRequired, 19 updateService: PropTypes.func.isRequired,
20 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, 20 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
21 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, 21 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
22 } 22 };
23 23
24 onSortEnd = ({ oldIndex, newIndex }) => { 24 onSortEnd = ({ oldIndex, newIndex }) => {
25 const { 25 const {
@@ -45,7 +45,7 @@ export default @observer class TabBar extends Component {
45 redirect: false, 45 redirect: false,
46 }); 46 });
47 } 47 }
48 } 48 };
49 49
50 disableService({ serviceId }) { 50 disableService({ serviceId }) {
51 this.toggleService({ serviceId, isEnabled: false }); 51 this.toggleService({ serviceId, isEnabled: false });
diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js
index 953f702f8..993b0a44a 100644
--- a/src/components/settings/navigation/SettingsNavigation.js
+++ b/src/components/settings/navigation/SettingsNavigation.js
@@ -2,8 +2,11 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { defineMessages, intlShape } from 'react-intl'; 3import { defineMessages, intlShape } from 'react-intl';
4import { inject, observer } from 'mobx-react'; 4import { inject, observer } from 'mobx-react';
5import { ProBadge } from '@meetfranz/ui';
5 6
6import Link from '../../ui/Link'; 7import Link from '../../ui/Link';
8import { workspaceStore } from '../../../features/workspaces';
9import UIStore from '../../../stores/UIStore';
7 10
8const messages = defineMessages({ 11const messages = defineMessages({
9 availableServices: { 12 availableServices: {
@@ -14,6 +17,10 @@ const messages = defineMessages({
14 id: 'settings.navigation.yourServices', 17 id: 'settings.navigation.yourServices',
15 defaultMessage: '!!!Your services', 18 defaultMessage: '!!!Your services',
16 }, 19 },
20 yourWorkspaces: {
21 id: 'settings.navigation.yourWorkspaces',
22 defaultMessage: '!!!Your workspaces',
23 },
17 account: { 24 account: {
18 id: 'settings.navigation.account', 25 id: 'settings.navigation.account',
19 defaultMessage: '!!!Account', 26 defaultMessage: '!!!Account',
@@ -34,7 +41,11 @@ const messages = defineMessages({
34 41
35export default @inject('stores') @observer class SettingsNavigation extends Component { 42export default @inject('stores') @observer class SettingsNavigation extends Component {
36 static propTypes = { 43 static propTypes = {
44 stores: PropTypes.shape({
45 ui: PropTypes.instanceOf(UIStore).isRequired,
46 }).isRequired,
37 serviceCount: PropTypes.number.isRequired, 47 serviceCount: PropTypes.number.isRequired,
48 workspaceCount: PropTypes.number.isRequired,
38 }; 49 };
39 50
40 static contextTypes = { 51 static contextTypes = {
@@ -42,7 +53,8 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp
42 }; 53 };
43 54
44 render() { 55 render() {
45 const { serviceCount } = this.props; 56 const { serviceCount, workspaceCount, stores } = this.props;
57 const { isDarkThemeActive } = stores.ui;
46 const { intl } = this.context; 58 const { intl } = this.context;
47 59
48 return ( 60 return (
@@ -63,6 +75,21 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp
63 {' '} 75 {' '}
64 <span className="badge">{serviceCount}</span> 76 <span className="badge">{serviceCount}</span>
65 </Link> 77 </Link>
78 {workspaceStore.isFeatureEnabled ? (
79 <Link
80 to="/settings/workspaces"
81 className="settings-navigation__link"
82 activeClassName="is-active"
83 >
84 {intl.formatMessage(messages.yourWorkspaces)}
85 {' '}
86 {workspaceStore.isPremiumUpgradeRequired ? (
87 <ProBadge inverted={!isDarkThemeActive && workspaceStore.isSettingsRouteActive} />
88 ) : (
89 <span className="badge">{workspaceCount}</span>
90 )}
91 </Link>
92 ) : null}
66 <Link 93 <Link
67 to="/settings/user" 94 to="/settings/user"
68 className="settings-navigation__link" 95 className="settings-navigation__link"
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js
index 21616b5de..4ba2eb844 100644
--- a/src/components/settings/services/EditServiceForm.js
+++ b/src/components/settings/services/EditServiceForm.js
@@ -341,14 +341,20 @@ export default @observer class EditServiceForm extends Component {
341 </div> 341 </div>
342 </div> 342 </div>
343 343
344 <PremiumFeatureContainer condition={isSpellcheckerPremiumFeature}> 344 <PremiumFeatureContainer
345 condition={isSpellcheckerPremiumFeature}
346 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }}
347 >
345 <div className="settings__settings-group"> 348 <div className="settings__settings-group">
346 <Select field={form.$('spellcheckerLanguage')} /> 349 <Select field={form.$('spellcheckerLanguage')} />
347 </div> 350 </div>
348 </PremiumFeatureContainer> 351 </PremiumFeatureContainer>
349 352
350 {isProxyFeatureEnabled && ( 353 {isProxyFeatureEnabled && (
351 <PremiumFeatureContainer condition={isProxyPremiumFeature}> 354 <PremiumFeatureContainer
355 condition={isProxyPremiumFeature}
356 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'proxy' }}
357 >
352 <div className="settings__settings-group"> 358 <div className="settings__settings-group">
353 <h3> 359 <h3>
354 {intl.formatMessage(messages.headlineProxy)} 360 {intl.formatMessage(messages.headlineProxy)}
diff --git a/src/components/settings/services/ServicesDashboard.js b/src/components/settings/services/ServicesDashboard.js
index a12df7372..53bae12df 100644
--- a/src/components/settings/services/ServicesDashboard.js
+++ b/src/components/settings/services/ServicesDashboard.js
@@ -65,7 +65,7 @@ export default @observer class ServicesDashboard extends Component {
65 65
66 static defaultProps = { 66 static defaultProps = {
67 searchNeedle: '', 67 searchNeedle: '',
68 } 68 };
69 69
70 static contextTypes = { 70 static contextTypes = {
71 intl: intlShape, 71 intl: intlShape,
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index a92e559f3..8429d0ecb 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -170,6 +170,7 @@ export default @observer class EditSettingsForm extends Component {
170 <Select field={form.$('locale')} showLabel={false} /> 170 <Select field={form.$('locale')} showLabel={false} />
171 <PremiumFeatureContainer 171 <PremiumFeatureContainer
172 condition={isSpellcheckerPremiumFeature} 172 condition={isSpellcheckerPremiumFeature}
173 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }}
173 > 174 >
174 <Fragment> 175 <Fragment>
175 <Toggle 176 <Toggle
diff --git a/src/components/ui/AppLoader/index.js b/src/components/ui/AppLoader/index.js
index 61053f6d1..b0c7fed7b 100644
--- a/src/components/ui/AppLoader/index.js
+++ b/src/components/ui/AppLoader/index.js
@@ -23,11 +23,11 @@ export default @injectSheet(styles) @withTheme class AppLoader extends Component
23 static propTypes = { 23 static propTypes = {
24 classes: PropTypes.object.isRequired, 24 classes: PropTypes.object.isRequired,
25 theme: PropTypes.object.isRequired, 25 theme: PropTypes.object.isRequired,
26 } 26 };
27 27
28 state = { 28 state = {
29 step: 0, 29 step: 0,
30 } 30 };
31 31
32 interval = null; 32 interval = null;
33 33
diff --git a/src/components/ui/FullscreenLoader/index.js b/src/components/ui/FullscreenLoader/index.js
index 6ecf4d395..06dab1eb6 100644
--- a/src/components/ui/FullscreenLoader/index.js
+++ b/src/components/ui/FullscreenLoader/index.js
@@ -16,13 +16,13 @@ export default @observer @withTheme @injectSheet(styles) class FullscreenLoader
16 theme: PropTypes.object.isRequired, 16 theme: PropTypes.object.isRequired,
17 spinnerColor: PropTypes.string, 17 spinnerColor: PropTypes.string,
18 children: PropTypes.node, 18 children: PropTypes.node,
19 } 19 };
20 20
21 static defaultProps = { 21 static defaultProps = {
22 className: null, 22 className: null,
23 spinnerColor: null, 23 spinnerColor: null,
24 children: null, 24 children: null,
25 } 25 };
26 26
27 render() { 27 render() {
28 const { 28 const {
diff --git a/src/components/ui/Infobox.js b/src/components/ui/Infobox.js
index a33c6474a..0917ee9f0 100644
--- a/src/components/ui/Infobox.js
+++ b/src/components/ui/Infobox.js
@@ -13,6 +13,8 @@ export default @observer class Infobox extends Component {
13 ctaLabel: PropTypes.string, 13 ctaLabel: PropTypes.string,
14 ctaLoading: PropTypes.bool, 14 ctaLoading: PropTypes.bool,
15 dismissable: PropTypes.bool, 15 dismissable: PropTypes.bool,
16 onDismiss: PropTypes.func,
17 onSeen: PropTypes.func,
16 }; 18 };
17 19
18 static defaultProps = { 20 static defaultProps = {
@@ -22,12 +24,19 @@ export default @observer class Infobox extends Component {
22 ctaOnClick: () => null, 24 ctaOnClick: () => null,
23 ctaLabel: '', 25 ctaLabel: '',
24 ctaLoading: false, 26 ctaLoading: false,
27 onDismiss: () => null,
28 onSeen: () => null,
25 }; 29 };
26 30
27 state = { 31 state = {
28 dismissed: false, 32 dismissed: false,
29 }; 33 };
30 34
35 componentDidMount() {
36 const { onSeen } = this.props;
37 if (onSeen) onSeen();
38 }
39
31 render() { 40 render() {
32 const { 41 const {
33 children, 42 children,
@@ -37,6 +46,7 @@ export default @observer class Infobox extends Component {
37 ctaLoading, 46 ctaLoading,
38 ctaOnClick, 47 ctaOnClick,
39 dismissable, 48 dismissable,
49 onDismiss,
40 } = this.props; 50 } = this.props;
41 51
42 if (this.state.dismissed) { 52 if (this.state.dismissed) {
@@ -76,9 +86,10 @@ export default @observer class Infobox extends Component {
76 {dismissable && ( 86 {dismissable && (
77 <button 87 <button
78 type="button" 88 type="button"
79 onClick={() => this.setState({ 89 onClick={() => {
80 dismissed: true, 90 this.setState({ dismissed: true });
81 })} 91 if (onDismiss) onDismiss();
92 }}
82 className="infobox__delete mdi mdi-close" 93 className="infobox__delete mdi mdi-close"
83 /> 94 />
84 )} 95 )}
diff --git a/src/components/ui/PremiumFeatureContainer/index.js b/src/components/ui/PremiumFeatureContainer/index.js
index 67cd6af0b..3c1e0fac3 100644
--- a/src/components/ui/PremiumFeatureContainer/index.js
+++ b/src/components/ui/PremiumFeatureContainer/index.js
@@ -9,6 +9,7 @@ import { oneOrManyChildElements } from '../../../prop-types';
9import UserStore from '../../../stores/UserStore'; 9import UserStore from '../../../stores/UserStore';
10 10
11import styles from './styles'; 11import styles from './styles';
12import { gaEvent } from '../../../lib/analytics';
12 13
13const messages = defineMessages({ 14const messages = defineMessages({
14 action: { 15 action: {
@@ -17,14 +18,21 @@ const messages = defineMessages({
17 }, 18 },
18}); 19});
19 20
20export default @inject('stores', 'actions') @injectSheet(styles) @observer class PremiumFeatureContainer extends Component { 21@inject('stores', 'actions') @injectSheet(styles) @observer
22class PremiumFeatureContainer extends Component {
21 static propTypes = { 23 static propTypes = {
22 classes: PropTypes.object.isRequired, 24 classes: PropTypes.object.isRequired,
23 condition: PropTypes.bool, 25 condition: PropTypes.bool,
26 gaEventInfo: PropTypes.shape({
27 category: PropTypes.string.isRequired,
28 event: PropTypes.string.isRequired,
29 label: PropTypes.string,
30 }),
24 }; 31 };
25 32
26 static defaultProps = { 33 static defaultProps = {
27 condition: true, 34 condition: true,
35 gaEventInfo: null,
28 }; 36 };
29 37
30 static contextTypes = { 38 static contextTypes = {
@@ -38,6 +46,7 @@ export default @inject('stores', 'actions') @injectSheet(styles) @observer class
38 actions, 46 actions,
39 condition, 47 condition,
40 stores, 48 stores,
49 gaEventInfo,
41 } = this.props; 50 } = this.props;
42 51
43 const { intl } = this.context; 52 const { intl } = this.context;
@@ -49,7 +58,13 @@ export default @inject('stores', 'actions') @injectSheet(styles) @observer class
49 <button 58 <button
50 className={classes.actionButton} 59 className={classes.actionButton}
51 type="button" 60 type="button"
52 onClick={() => actions.ui.openSettings({ path: 'user' })} 61 onClick={() => {
62 actions.ui.openSettings({ path: 'user' });
63 if (gaEventInfo) {
64 const { category, event, label } = gaEventInfo;
65 gaEvent(category, event, label);
66 }
67 }}
53 > 68 >
54 {intl.formatMessage(messages.action)} 69 {intl.formatMessage(messages.action)}
55 </button> 70 </button>
@@ -73,3 +88,5 @@ PremiumFeatureContainer.wrappedComponent.propTypes = {
73 }).isRequired, 88 }).isRequired,
74 }).isRequired, 89 }).isRequired,
75}; 90};
91
92export default PremiumFeatureContainer;
diff --git a/src/components/ui/PremiumFeatureContainer/styles.js b/src/components/ui/PremiumFeatureContainer/styles.js
index 81d6666c6..41881e044 100644
--- a/src/components/ui/PremiumFeatureContainer/styles.js
+++ b/src/components/ui/PremiumFeatureContainer/styles.js
@@ -6,6 +6,7 @@ export default theme => ({
6 padding: 20, 6 padding: 20,
7 'border-radius': theme.borderRadius, 7 'border-radius': theme.borderRadius,
8 pointerEvents: 'none', 8 pointerEvents: 'none',
9 height: 'auto',
9 }, 10 },
10 titleContainer: { 11 titleContainer: {
11 display: 'flex', 12 display: 'flex',
@@ -19,14 +20,14 @@ export default theme => ({
19 color: theme.colorSubscriptionContainerActionButtonColor, 20 color: theme.colorSubscriptionContainerActionButtonColor,
20 'margin-left': 'auto', 21 'margin-left': 'auto',
21 'border-radius': theme.borderRadiusSmall, 22 'border-radius': theme.borderRadiusSmall,
22 padding: [2, 4], 23 padding: [4, 8],
23 'font-size': 12, 24 'font-size': 12,
24 pointerEvents: 'initial', 25 pointerEvents: 'initial',
25 }, 26 },
26 content: { 27 content: {
27 opacity: 0.5, 28 opacity: 0.5,
28 'margin-top': 20, 29 'margin-top': 20,
29 '& :last-child': { 30 '& > :last-child': {
30 'margin-bottom': 0, 31 'margin-bottom': 0,
31 }, 32 },
32 }, 33 },
diff --git a/src/components/ui/ServiceIcon.js b/src/components/ui/ServiceIcon.js
new file mode 100644
index 000000000..0b9155a4e
--- /dev/null
+++ b/src/components/ui/ServiceIcon.js
@@ -0,0 +1,67 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import classnames from 'classnames';
6
7import ServiceModel from '../../models/Service';
8
9const styles = theme => ({
10 root: {
11 height: 'auto',
12 },
13 icon: {
14 width: theme.serviceIcon.width,
15 },
16 isCustomIcon: {
17 width: theme.serviceIcon.isCustom.width,
18 border: theme.serviceIcon.isCustom.border,
19 borderRadius: theme.serviceIcon.isCustom.borderRadius,
20 },
21 isDisabled: {
22 filter: 'grayscale(100%)',
23 opacity: '.5',
24 },
25});
26
27@injectSheet(styles) @observer
28class ServiceIcon extends Component {
29 static propTypes = {
30 classes: PropTypes.object.isRequired,
31 service: PropTypes.instanceOf(ServiceModel).isRequired,
32 className: PropTypes.string,
33 };
34
35 static defaultProps = {
36 className: '',
37 };
38
39 render() {
40 const {
41 classes,
42 className,
43 service,
44 } = this.props;
45
46 return (
47 <div
48 className={classnames([
49 classes.root,
50 className,
51 ])}
52 >
53 <img
54 src={service.icon}
55 className={classnames([
56 classes.icon,
57 service.isEnabled ? null : classes.isDisabled,
58 service.hasCustomIcon ? classes.isCustomIcon : null,
59 ])}
60 alt=""
61 />
62 </div>
63 );
64 }
65}
66
67export default ServiceIcon;
diff --git a/src/components/ui/WebviewLoader/index.js b/src/components/ui/WebviewLoader/index.js
index 3a3dbbe49..58b6b6f1b 100644
--- a/src/components/ui/WebviewLoader/index.js
+++ b/src/components/ui/WebviewLoader/index.js
@@ -2,23 +2,35 @@ import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss'; 4import injectSheet from 'react-jss';
5import { defineMessages, intlShape } from 'react-intl';
5 6
6import FullscreenLoader from '../FullscreenLoader'; 7import FullscreenLoader from '../FullscreenLoader';
7
8import styles from './styles'; 8import styles from './styles';
9 9
10const messages = defineMessages({
11 loading: {
12 id: 'service.webviewLoader.loading',
13 defaultMessage: '!!!Loading',
14 },
15});
16
10export default @observer @injectSheet(styles) class WebviewLoader extends Component { 17export default @observer @injectSheet(styles) class WebviewLoader extends Component {
11 static propTypes = { 18 static propTypes = {
12 name: PropTypes.string.isRequired, 19 name: PropTypes.string.isRequired,
13 classes: PropTypes.object.isRequired, 20 classes: PropTypes.object.isRequired,
14 } 21 };
22
23 static contextTypes = {
24 intl: intlShape,
25 };
15 26
16 render() { 27 render() {
17 const { classes, name } = this.props; 28 const { classes, name } = this.props;
29 const { intl } = this.context;
18 return ( 30 return (
19 <FullscreenLoader 31 <FullscreenLoader
20 className={classes.component} 32 className={classes.component}
21 title={`Loading ${name}`} 33 title={`${intl.formatMessage(messages.loading)} ${name}`}
22 /> 34 />
23 ); 35 );
24 } 36 }
diff --git a/src/config.js b/src/config.js
index 47d22ca7d..e7745b61d 100644
--- a/src/config.js
+++ b/src/config.js
@@ -42,6 +42,8 @@ export const DEFAULT_FEATURES_CONFIG = {
42 isServiceProxyEnabled: false, 42 isServiceProxyEnabled: false,
43 isServiceProxyPremiumFeature: true, 43 isServiceProxyPremiumFeature: true,
44 isAnnouncementsEnabled: true, 44 isAnnouncementsEnabled: true,
45 isWorkspacePremiumFeature: true,
46 isWorkspaceEnabled: false,
45}; 47};
46 48
47export const DEFAULT_WINDOW_OPTIONS = { 49export const DEFAULT_WINDOW_OPTIONS = {
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index f26e51517..0357f63bd 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -21,6 +21,9 @@ import AppLoader from '../../components/ui/AppLoader';
21 21
22import { state as delayAppState } from '../../features/delayApp'; 22import { state as delayAppState } from '../../features/delayApp';
23import { announcementsState } from '../../features/announcements/state'; 23import { announcementsState } from '../../features/announcements/state';
24import { workspaceActions } from '../../features/workspaces/actions';
25import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer';
26import { workspaceStore } from '../../features/workspaces';
24 27
25export default @inject('stores', 'actions') @observer class AppLayoutContainer extends Component { 28export default @inject('stores', 'actions') @observer class AppLayoutContainer extends Component {
26 static defaultProps = { 29 static defaultProps = {
@@ -83,6 +86,15 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
83 ); 86 );
84 } 87 }
85 88
89 const workspacesDrawer = (
90 <WorkspaceDrawer
91 getServicesForWorkspace={workspace => (
92 workspace ? workspaceStore.getWorkspaceServices(workspace).map(s => s.name) : services.all.map(s => s.name)
93 )}
94 onUpgradeAccountClick={() => openSettings({ path: 'user' })}
95 />
96 );
97
86 const sidebar = ( 98 const sidebar = (
87 <Sidebar 99 <Sidebar
88 services={services.allDisplayed} 100 services={services.allDisplayed}
@@ -97,6 +109,8 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
97 deleteService={deleteService} 109 deleteService={deleteService}
98 updateService={updateService} 110 updateService={updateService}
99 toggleMuteApp={toggleMuteApp} 111 toggleMuteApp={toggleMuteApp}
112 toggleWorkspaceDrawer={workspaceActions.toggleWorkspaceDrawer}
113 isWorkspaceDrawerOpen={workspaceStore.isWorkspaceDrawerOpen}
100 showMessageBadgeWhenMutedSetting={settings.all.app.showMessageBadgeWhenMuted} 114 showMessageBadgeWhenMutedSetting={settings.all.app.showMessageBadgeWhenMuted}
101 showMessageBadgesEvenWhenMuted={ui.showMessageBadgesEvenWhenMuted} 115 showMessageBadgesEvenWhenMuted={ui.showMessageBadgesEvenWhenMuted}
102 /> 116 />
@@ -123,6 +137,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e
123 showServicesUpdatedInfoBar={ui.showServicesUpdatedInfoBar} 137 showServicesUpdatedInfoBar={ui.showServicesUpdatedInfoBar}
124 appUpdateIsDownloaded={app.updateStatus === app.updateStatusTypes.DOWNLOADED} 138 appUpdateIsDownloaded={app.updateStatus === app.updateStatusTypes.DOWNLOADED}
125 sidebar={sidebar} 139 sidebar={sidebar}
140 workspacesDrawer={workspacesDrawer}
126 services={servicesContainer} 141 services={servicesContainer}
127 news={news.latest} 142 news={news.latest}
128 removeNewsItem={hide} 143 removeNewsItem={hide}
diff --git a/src/containers/settings/SettingsWindow.js b/src/containers/settings/SettingsWindow.js
index 6d9e0ee77..663b9e2e4 100644
--- a/src/containers/settings/SettingsWindow.js
+++ b/src/containers/settings/SettingsWindow.js
@@ -7,6 +7,7 @@ import ServicesStore from '../../stores/ServicesStore';
7import Layout from '../../components/settings/SettingsLayout'; 7import Layout from '../../components/settings/SettingsLayout';
8import Navigation from '../../components/settings/navigation/SettingsNavigation'; 8import Navigation from '../../components/settings/navigation/SettingsNavigation';
9import ErrorBoundary from '../../components/util/ErrorBoundary'; 9import ErrorBoundary from '../../components/util/ErrorBoundary';
10import { workspaceStore } from '../../features/workspaces';
10 11
11export default @inject('stores', 'actions') @observer class SettingsContainer extends Component { 12export default @inject('stores', 'actions') @observer class SettingsContainer extends Component {
12 render() { 13 render() {
@@ -16,6 +17,7 @@ export default @inject('stores', 'actions') @observer class SettingsContainer ex
16 const navigation = ( 17 const navigation = (
17 <Navigation 18 <Navigation
18 serviceCount={stores.services.all.length} 19 serviceCount={stores.services.all.length}
20 workspaceCount={workspaceStore.workspaces.length}
19 /> 21 />
20 ); 22 );
21 23
diff --git a/src/environment.js b/src/environment.js
index 73b1c7ab2..d67fd6adb 100644
--- a/src/environment.js
+++ b/src/environment.js
@@ -28,3 +28,4 @@ if (!isDevMode || (isDevMode && useLiveAPI)) {
28} 28}
29 29
30export const API = api; 30export const API = api;
31export const API_VERSION = 'v1';
diff --git a/src/features/delayApp/Component.js b/src/features/delayApp/Component.js
index ff84510e8..ff0f1f2f8 100644
--- a/src/features/delayApp/Component.js
+++ b/src/features/delayApp/Component.js
@@ -38,7 +38,7 @@ export default @inject('actions') @injectSheet(styles) @observer class DelayApp
38 38
39 state = { 39 state = {
40 countdown: config.delayDuration, 40 countdown: config.delayDuration,
41 } 41 };
42 42
43 countdownInterval = null; 43 countdownInterval = null;
44 44
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
index abc8274cf..67f0fc5e6 100644
--- a/src/features/delayApp/index.js
+++ b/src/features/delayApp/index.js
@@ -55,7 +55,7 @@ export default function init(stores) {
55 55
56 setVisibility(true); 56 setVisibility(true);
57 gaPage('/delayApp'); 57 gaPage('/delayApp');
58 gaEvent('delayApp', 'show', 'Delay App Feature'); 58 gaEvent('DelayApp', 'show', 'Delay App Feature');
59 59
60 timeLastDelay = moment(); 60 timeLastDelay = moment();
61 shownAfterLaunch = true; 61 shownAfterLaunch = true;
diff --git a/src/features/shareFranz/Component.js b/src/features/shareFranz/Component.js
index ef43a54fa..8d1d595c5 100644
--- a/src/features/shareFranz/Component.js
+++ b/src/features/shareFranz/Component.js
@@ -38,7 +38,7 @@ const messages = defineMessages({
38 }, 38 },
39 shareTextTwitter: { 39 shareTextTwitter: {
40 id: 'feature.shareFranz.shareText.twitter', 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', 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 @FranzMessenger',
42 }, 42 },
43}); 43});
44 44
diff --git a/src/features/spellchecker/index.js b/src/features/spellchecker/index.js
index 94883ad17..79a2172b4 100644
--- a/src/features/spellchecker/index.js
+++ b/src/features/spellchecker/index.js
@@ -14,8 +14,6 @@ export default function init(stores) {
14 autorun(() => { 14 autorun(() => {
15 const { isSpellcheckerPremiumFeature } = stores.features.features; 15 const { isSpellcheckerPremiumFeature } = stores.features.features;
16 16
17 console.log('isSpellcheckerPremiumFeature', isSpellcheckerPremiumFeature);
18
19 config.isPremium = isSpellcheckerPremiumFeature !== undefined ? isSpellcheckerPremiumFeature : DEFAULT_FEATURES_CONFIG.isSpellcheckerPremiumFeature; 17 config.isPremium = isSpellcheckerPremiumFeature !== undefined ? isSpellcheckerPremiumFeature : DEFAULT_FEATURES_CONFIG.isSpellcheckerPremiumFeature;
20 18
21 if (!stores.user.data.isPremium && config.isPremium && stores.settings.app.enableSpellchecking) { 19 if (!stores.user.data.isPremium && config.isPremium && stores.settings.app.enableSpellchecking) {
diff --git a/src/features/utils/FeatureStore.js b/src/features/utils/FeatureStore.js
new file mode 100644
index 000000000..66b66a104
--- /dev/null
+++ b/src/features/utils/FeatureStore.js
@@ -0,0 +1,21 @@
1import Reaction from '../../stores/lib/Reaction';
2
3export class FeatureStore {
4 _actions = null;
5
6 _reactions = null;
7
8 _listenToActions(actions) {
9 if (this._actions) this._actions.forEach(a => a[0].off(a[1]));
10 this._actions = [];
11 actions.forEach(a => this._actions.push(a));
12 this._actions.forEach(a => a[0].listen(a[1]));
13 }
14
15 _startReactions(reactions) {
16 if (this._reactions) this._reactions.forEach(r => r.stop());
17 this._reactions = [];
18 reactions.forEach(r => this._reactions.push(new Reaction(r)));
19 this._reactions.forEach(r => r.start());
20 }
21}
diff --git a/src/features/workspaces/actions.js b/src/features/workspaces/actions.js
new file mode 100644
index 000000000..a85f8f57f
--- /dev/null
+++ b/src/features/workspaces/actions.js
@@ -0,0 +1,26 @@
1import PropTypes from 'prop-types';
2import Workspace from './models/Workspace';
3import { createActionsFromDefinitions } from '../../actions/lib/actions';
4
5export const workspaceActions = createActionsFromDefinitions({
6 edit: {
7 workspace: PropTypes.instanceOf(Workspace).isRequired,
8 },
9 create: {
10 name: PropTypes.string.isRequired,
11 },
12 delete: {
13 workspace: PropTypes.instanceOf(Workspace).isRequired,
14 },
15 update: {
16 workspace: PropTypes.instanceOf(Workspace).isRequired,
17 },
18 activate: {
19 workspace: PropTypes.instanceOf(Workspace).isRequired,
20 },
21 deactivate: {},
22 toggleWorkspaceDrawer: {},
23 openWorkspaceSettings: {},
24}, PropTypes.checkPropTypes);
25
26export default workspaceActions;
diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js
new file mode 100644
index 000000000..0ec20c9ea
--- /dev/null
+++ b/src/features/workspaces/api.js
@@ -0,0 +1,66 @@
1import { pick } from 'lodash';
2import { sendAuthRequest } from '../../api/utils/auth';
3import { API, API_VERSION } from '../../environment';
4import Request from '../../stores/lib/Request';
5import Workspace from './models/Workspace';
6
7const debug = require('debug')('Franz:feature:workspaces:api');
8
9export const workspaceApi = {
10 getUserWorkspaces: async () => {
11 const url = `${API}/${API_VERSION}/workspace`;
12 debug('getUserWorkspaces GET', url);
13 const result = await sendAuthRequest(url, { method: 'GET' });
14 debug('getUserWorkspaces RESULT', result);
15 if (!result.ok) throw result;
16 const workspaces = await result.json();
17 return workspaces.map(data => new Workspace(data));
18 },
19
20 createWorkspace: async (name) => {
21 const url = `${API}/${API_VERSION}/workspace`;
22 const options = {
23 method: 'POST',
24 body: JSON.stringify({ name }),
25 };
26 debug('createWorkspace POST', url, options);
27 const result = await sendAuthRequest(url, options);
28 debug('createWorkspace RESULT', result);
29 if (!result.ok) throw result;
30 return new Workspace(await result.json());
31 },
32
33 deleteWorkspace: async (workspace) => {
34 const url = `${API}/${API_VERSION}/workspace/${workspace.id}`;
35 debug('deleteWorkspace DELETE', url);
36 const result = await sendAuthRequest(url, { method: 'DELETE' });
37 debug('deleteWorkspace RESULT', result);
38 if (!result.ok) throw result;
39 return true;
40 },
41
42 updateWorkspace: async (workspace) => {
43 const url = `${API}/${API_VERSION}/workspace/${workspace.id}`;
44 const options = {
45 method: 'PUT',
46 body: JSON.stringify(pick(workspace, ['name', 'services'])),
47 };
48 debug('updateWorkspace UPDATE', url, options);
49 const result = await sendAuthRequest(url, options);
50 debug('updateWorkspace RESULT', result);
51 if (!result.ok) throw result;
52 return new Workspace(await result.json());
53 },
54};
55
56export const getUserWorkspacesRequest = new Request(workspaceApi, 'getUserWorkspaces');
57export const createWorkspaceRequest = new Request(workspaceApi, 'createWorkspace');
58export const deleteWorkspaceRequest = new Request(workspaceApi, 'deleteWorkspace');
59export const updateWorkspaceRequest = new Request(workspaceApi, 'updateWorkspace');
60
61export const resetApiRequests = () => {
62 getUserWorkspacesRequest.reset();
63 createWorkspaceRequest.reset();
64 deleteWorkspaceRequest.reset();
65 updateWorkspaceRequest.reset();
66};
diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js
new file mode 100644
index 000000000..2c00ea63c
--- /dev/null
+++ b/src/features/workspaces/components/CreateWorkspaceForm.js
@@ -0,0 +1,100 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import { Input, Button } from '@meetfranz/forms';
6import injectSheet from 'react-jss';
7import Form from '../../../lib/Form';
8import { required } from '../../../helpers/validation-helpers';
9import { gaEvent } from '../../../lib/analytics';
10import { GA_CATEGORY_WORKSPACES } from '../index';
11
12const messages = defineMessages({
13 submitButton: {
14 id: 'settings.workspace.add.form.submitButton',
15 defaultMessage: '!!!Create workspace',
16 },
17 name: {
18 id: 'settings.workspace.add.form.name',
19 defaultMessage: '!!!Name',
20 },
21});
22
23const styles = () => ({
24 form: {
25 display: 'flex',
26 },
27 input: {
28 flexGrow: 1,
29 marginRight: '10px',
30 },
31 submitButton: {
32 height: 'inherit',
33 },
34});
35
36@injectSheet(styles) @observer
37class CreateWorkspaceForm extends Component {
38 static contextTypes = {
39 intl: intlShape,
40 };
41
42 static propTypes = {
43 classes: PropTypes.object.isRequired,
44 isSubmitting: PropTypes.bool.isRequired,
45 onSubmit: PropTypes.func.isRequired,
46 };
47
48 form = (() => {
49 const { intl } = this.context;
50 return new Form({
51 fields: {
52 name: {
53 label: intl.formatMessage(messages.name),
54 placeholder: intl.formatMessage(messages.name),
55 value: '',
56 validators: [required],
57 },
58 },
59 });
60 })();
61
62 submitForm() {
63 const { form } = this;
64 form.submit({
65 onSuccess: async (f) => {
66 const { onSubmit } = this.props;
67 const values = f.values();
68 onSubmit(values);
69 gaEvent(GA_CATEGORY_WORKSPACES, 'create', values.name);
70 },
71 });
72 }
73
74 render() {
75 const { intl } = this.context;
76 const { classes, isSubmitting } = this.props;
77 const { form } = this;
78 return (
79 <div className={classes.form}>
80 <Input
81 className={classes.input}
82 {...form.$('name').bind()}
83 showLabel={false}
84 onEnterKey={this.submitForm.bind(this, form)}
85 focus
86 />
87 <Button
88 className={classes.submitButton}
89 type="submit"
90 label={intl.formatMessage(messages.submitButton)}
91 onClick={this.submitForm.bind(this, form)}
92 busy={isSubmitting}
93 buttonType={isSubmitting ? 'secondary' : 'primary'}
94 />
95 </div>
96 );
97 }
98}
99
100export default CreateWorkspaceForm;
diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js
new file mode 100644
index 000000000..bba4485ff
--- /dev/null
+++ b/src/features/workspaces/components/EditWorkspaceForm.js
@@ -0,0 +1,189 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import { Link } from 'react-router';
6import { Input, Button } from '@meetfranz/forms';
7import injectSheet from 'react-jss';
8
9import Workspace from '../models/Workspace';
10import Service from '../../../models/Service';
11import Form from '../../../lib/Form';
12import { required } from '../../../helpers/validation-helpers';
13import WorkspaceServiceListItem from './WorkspaceServiceListItem';
14import Request from '../../../stores/lib/Request';
15import { gaEvent } from '../../../lib/analytics';
16import { GA_CATEGORY_WORKSPACES } from '../index';
17
18const messages = defineMessages({
19 buttonDelete: {
20 id: 'settings.workspace.form.buttonDelete',
21 defaultMessage: '!!!Delete workspace',
22 },
23 buttonSave: {
24 id: 'settings.workspace.form.buttonSave',
25 defaultMessage: '!!!Save workspace',
26 },
27 name: {
28 id: 'settings.workspace.form.name',
29 defaultMessage: '!!!Name',
30 },
31 yourWorkspaces: {
32 id: 'settings.workspace.form.yourWorkspaces',
33 defaultMessage: '!!!Your workspaces',
34 },
35 servicesInWorkspaceHeadline: {
36 id: 'settings.workspace.form.servicesInWorkspaceHeadline',
37 defaultMessage: '!!!Services in this Workspace',
38 },
39});
40
41const styles = () => ({
42 nameInput: {
43 height: 'auto',
44 },
45 serviceList: {
46 height: 'auto',
47 },
48});
49
50@injectSheet(styles) @observer
51class EditWorkspaceForm extends Component {
52 static contextTypes = {
53 intl: intlShape,
54 };
55
56 static propTypes = {
57 classes: PropTypes.object.isRequired,
58 onDelete: PropTypes.func.isRequired,
59 onSave: PropTypes.func.isRequired,
60 services: PropTypes.arrayOf(PropTypes.instanceOf(Service)).isRequired,
61 workspace: PropTypes.instanceOf(Workspace).isRequired,
62 updateWorkspaceRequest: PropTypes.instanceOf(Request).isRequired,
63 deleteWorkspaceRequest: PropTypes.instanceOf(Request).isRequired,
64 };
65
66 form = this.prepareWorkspaceForm(this.props.workspace);
67
68 componentWillReceiveProps(nextProps) {
69 const { workspace } = this.props;
70 if (workspace.id !== nextProps.workspace.id) {
71 this.form = this.prepareWorkspaceForm(nextProps.workspace);
72 }
73 }
74
75 prepareWorkspaceForm(workspace) {
76 const { intl } = this.context;
77 return new Form({
78 fields: {
79 name: {
80 label: intl.formatMessage(messages.name),
81 placeholder: intl.formatMessage(messages.name),
82 value: workspace.name,
83 validators: [required],
84 },
85 services: {
86 value: workspace.services.slice(),
87 },
88 },
89 });
90 }
91
92 save(form) {
93 form.submit({
94 onSuccess: async (f) => {
95 const { onSave } = this.props;
96 const values = f.values();
97 onSave(values);
98 gaEvent(GA_CATEGORY_WORKSPACES, 'save');
99 },
100 onError: async () => {},
101 });
102 }
103
104 delete() {
105 const { onDelete } = this.props;
106 onDelete();
107 gaEvent(GA_CATEGORY_WORKSPACES, 'delete');
108 }
109
110 toggleService(service) {
111 const servicesField = this.form.$('services');
112 const serviceIds = servicesField.value;
113 if (serviceIds.includes(service.id)) {
114 serviceIds.splice(serviceIds.indexOf(service.id), 1);
115 } else {
116 serviceIds.push(service.id);
117 }
118 servicesField.set(serviceIds);
119 }
120
121 render() {
122 const { intl } = this.context;
123 const {
124 classes,
125 workspace,
126 services,
127 deleteWorkspaceRequest,
128 updateWorkspaceRequest,
129 } = this.props;
130 const { form } = this;
131 const workspaceServices = form.$('services').value;
132 const isDeleting = deleteWorkspaceRequest.isExecuting;
133 const isSaving = updateWorkspaceRequest.isExecuting;
134 return (
135 <div className="settings__main">
136 <div className="settings__header">
137 <span className="settings__header-item">
138 <Link to="/settings/workspaces">
139 {intl.formatMessage(messages.yourWorkspaces)}
140 </Link>
141 </span>
142 <span className="separator" />
143 <span className="settings__header-item">
144 {workspace.name}
145 </span>
146 </div>
147 <div className="settings__body">
148 <div className={classes.nameInput}>
149 <Input {...form.$('name').bind()} />
150 </div>
151 <h2>{intl.formatMessage(messages.servicesInWorkspaceHeadline)}</h2>
152 <div className={classes.serviceList}>
153 {services.map(s => (
154 <WorkspaceServiceListItem
155 key={s.id}
156 service={s}
157 isInWorkspace={workspaceServices.includes(s.id)}
158 onToggle={() => this.toggleService(s)}
159 />
160 ))}
161 </div>
162 </div>
163 <div className="settings__controls">
164 {/* ===== Delete Button ===== */}
165 <Button
166 label={intl.formatMessage(messages.buttonDelete)}
167 loaded={false}
168 busy={isDeleting}
169 buttonType={isDeleting ? 'secondary' : 'danger'}
170 className="settings__delete-button"
171 disabled={isDeleting}
172 onClick={this.delete.bind(this)}
173 />
174 {/* ===== Save Button ===== */}
175 <Button
176 type="submit"
177 label={intl.formatMessage(messages.buttonSave)}
178 busy={isSaving}
179 buttonType={isSaving ? 'secondary' : 'primary'}
180 onClick={this.save.bind(this, form)}
181 disabled={isSaving}
182 />
183 </div>
184 </div>
185 );
186 }
187}
188
189export default EditWorkspaceForm;
diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js
new file mode 100644
index 000000000..684e50dd0
--- /dev/null
+++ b/src/features/workspaces/components/WorkspaceDrawer.js
@@ -0,0 +1,246 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { defineMessages, FormattedHTMLMessage, intlShape } from 'react-intl';
6import { H1, Icon, ProBadge } from '@meetfranz/ui';
7import { Button } from '@meetfranz/forms/lib';
8import ReactTooltip from 'react-tooltip';
9
10import WorkspaceDrawerItem from './WorkspaceDrawerItem';
11import { workspaceActions } from '../actions';
12import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../index';
13import { gaEvent } from '../../../lib/analytics';
14
15const messages = defineMessages({
16 headline: {
17 id: 'workspaceDrawer.headline',
18 defaultMessage: '!!!Workspaces',
19 },
20 allServices: {
21 id: 'workspaceDrawer.allServices',
22 defaultMessage: '!!!All services',
23 },
24 workspacesSettingsTooltip: {
25 id: 'workspaceDrawer.workspacesSettingsTooltip',
26 defaultMessage: '!!!Workspaces settings',
27 },
28 workspaceFeatureInfo: {
29 id: 'workspaceDrawer.workspaceFeatureInfo',
30 defaultMessage: '!!!Info about workspace feature',
31 },
32 premiumCtaButtonLabel: {
33 id: 'workspaceDrawer.premiumCtaButtonLabel',
34 defaultMessage: '!!!Create your first workspace',
35 },
36 reactivatePremiumAccount: {
37 id: 'workspaceDrawer.reactivatePremiumAccountLabel',
38 defaultMessage: '!!!Reactivate premium account',
39 },
40 addNewWorkspaceLabel: {
41 id: 'workspaceDrawer.addNewWorkspaceLabel',
42 defaultMessage: '!!!add new workspace',
43 },
44 premiumFeatureBadge: {
45 id: 'workspaceDrawer.proFeatureBadge',
46 defaultMessage: '!!!Premium feature',
47 },
48});
49
50const styles = theme => ({
51 drawer: {
52 background: theme.workspaces.drawer.background,
53 width: `${theme.workspaces.drawer.width}px`,
54 },
55 headline: {
56 fontSize: '24px',
57 marginTop: '38px',
58 marginBottom: '25px',
59 marginLeft: theme.workspaces.drawer.padding,
60 },
61 headlineProBadge: {
62 marginRight: 15,
63 },
64 workspacesSettingsButton: {
65 float: 'right',
66 marginRight: theme.workspaces.drawer.padding,
67 marginTop: '2px',
68 },
69 workspacesSettingsButtonIcon: {
70 fill: theme.workspaces.drawer.buttons.color,
71 '&:hover': {
72 fill: theme.workspaces.drawer.buttons.hoverColor,
73 },
74 },
75 workspaces: {
76 height: 'auto',
77 },
78 premiumAnnouncement: {
79 padding: '20px',
80 paddingTop: '0',
81 height: 'auto',
82 },
83 premiumCtaButton: {
84 marginTop: '20px',
85 width: '100%',
86 color: 'white !important',
87 },
88 addNewWorkspaceLabel: {
89 height: 'auto',
90 color: theme.workspaces.drawer.buttons.color,
91 marginTop: 40,
92 textAlign: 'center',
93 '& > svg': {
94 fill: theme.workspaces.drawer.buttons.color,
95 },
96 '& > span': {
97 fontSize: '13px',
98 marginLeft: 10,
99 position: 'relative',
100 top: -3,
101 },
102 '&:hover': {
103 color: theme.workspaces.drawer.buttons.hoverColor,
104 '& > svg': {
105 fill: theme.workspaces.drawer.buttons.hoverColor,
106 },
107 },
108 },
109});
110
111@injectSheet(styles) @observer
112class WorkspaceDrawer extends Component {
113 static propTypes = {
114 classes: PropTypes.object.isRequired,
115 getServicesForWorkspace: PropTypes.func.isRequired,
116 onUpgradeAccountClick: PropTypes.func.isRequired,
117 };
118
119 static contextTypes = {
120 intl: intlShape,
121 };
122
123 componentDidMount() {
124 ReactTooltip.rebuild();
125 }
126
127 render() {
128 const {
129 classes,
130 getServicesForWorkspace,
131 onUpgradeAccountClick,
132 } = this.props;
133 const { intl } = this.context;
134 const {
135 activeWorkspace,
136 isSwitchingWorkspace,
137 nextWorkspace,
138 workspaces,
139 } = workspaceStore;
140 const actualWorkspace = isSwitchingWorkspace ? nextWorkspace : activeWorkspace;
141 return (
142 <div className={classes.drawer}>
143 <H1 className={classes.headline}>
144 {workspaceStore.isPremiumUpgradeRequired && (
145 <span
146 className={classes.headlineProBadge}
147 data-tip={`${intl.formatMessage(messages.premiumFeatureBadge)}`}
148 >
149 <ProBadge />
150 </span>
151 )}
152 {intl.formatMessage(messages.headline)}
153 <span
154 className={classes.workspacesSettingsButton}
155 onClick={() => {
156 workspaceActions.openWorkspaceSettings();
157 gaEvent(GA_CATEGORY_WORKSPACES, 'settings', 'drawerHeadline');
158 }}
159 data-tip={`${intl.formatMessage(messages.workspacesSettingsTooltip)}`}
160 >
161 <Icon
162 icon="mdiSettings"
163 size={1.5}
164 className={classes.workspacesSettingsButtonIcon}
165 />
166 </span>
167 </H1>
168 {workspaceStore.isPremiumUpgradeRequired ? (
169 <div className={classes.premiumAnnouncement}>
170 <FormattedHTMLMessage {...messages.workspaceFeatureInfo} />
171 {workspaceStore.userHasWorkspaces ? (
172 <Button
173 className={classes.premiumCtaButton}
174 buttonType="primary"
175 label={intl.formatMessage(messages.reactivatePremiumAccount)}
176 icon="mdiStar"
177 onClick={() => {
178 onUpgradeAccountClick();
179 gaEvent('User', 'upgrade', 'workspaceDrawer');
180 }}
181 />
182 ) : (
183 <Button
184 className={classes.premiumCtaButton}
185 buttonType="primary"
186 label={intl.formatMessage(messages.premiumCtaButtonLabel)}
187 icon="mdiPlusBox"
188 onClick={() => {
189 workspaceActions.openWorkspaceSettings();
190 gaEvent(GA_CATEGORY_WORKSPACES, 'add', 'drawerPremiumCta');
191 }}
192 />
193 )}
194 </div>
195 ) : (
196 <div className={classes.workspaces}>
197 <WorkspaceDrawerItem
198 name={intl.formatMessage(messages.allServices)}
199 onClick={() => {
200 workspaceActions.deactivate();
201 workspaceActions.toggleWorkspaceDrawer();
202 gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'drawer');
203 }}
204 services={getServicesForWorkspace(null)}
205 isActive={actualWorkspace == null}
206 />
207 {workspaces.map(workspace => (
208 <WorkspaceDrawerItem
209 key={workspace.id}
210 name={workspace.name}
211 isActive={actualWorkspace === workspace}
212 onClick={() => {
213 if (actualWorkspace === workspace) return;
214 workspaceActions.activate({ workspace });
215 workspaceActions.toggleWorkspaceDrawer();
216 gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'drawer');
217 }}
218 onContextMenuEditClick={() => workspaceActions.edit({ workspace })}
219 services={getServicesForWorkspace(workspace)}
220 />
221 ))}
222 <div
223 className={classes.addNewWorkspaceLabel}
224 onClick={() => {
225 workspaceActions.openWorkspaceSettings();
226 gaEvent(GA_CATEGORY_WORKSPACES, 'add', 'drawerAddLabel');
227 }}
228 >
229 <Icon
230 icon="mdiPlusBox"
231 size={1}
232 className={classes.workspacesSettingsButtonIcon}
233 />
234 <span>
235 {intl.formatMessage(messages.addNewWorkspaceLabel)}
236 </span>
237 </div>
238 </div>
239 )}
240 <ReactTooltip place="right" type="dark" effect="solid" />
241 </div>
242 );
243 }
244}
245
246export default WorkspaceDrawer;
diff --git a/src/features/workspaces/components/WorkspaceDrawerItem.js b/src/features/workspaces/components/WorkspaceDrawerItem.js
new file mode 100644
index 000000000..59a2144d3
--- /dev/null
+++ b/src/features/workspaces/components/WorkspaceDrawerItem.js
@@ -0,0 +1,137 @@
1import { remote } from 'electron';
2import React, { Component } from 'react';
3import PropTypes from 'prop-types';
4import { observer } from 'mobx-react';
5import injectSheet from 'react-jss';
6import classnames from 'classnames';
7import { defineMessages, intlShape } from 'react-intl';
8
9const { Menu } = remote;
10
11const messages = defineMessages({
12 noServicesAddedYet: {
13 id: 'workspaceDrawer.item.noServicesAddedYet',
14 defaultMessage: '!!!No services added yet',
15 },
16 contextMenuEdit: {
17 id: 'workspaceDrawer.item.contextMenuEdit',
18 defaultMessage: '!!!edit',
19 },
20});
21
22const styles = theme => ({
23 item: {
24 height: '67px',
25 padding: `15px ${theme.workspaces.drawer.padding}px`,
26 borderBottom: `1px solid ${theme.workspaces.drawer.listItem.border}`,
27 transition: 'background-color 300ms ease-out',
28 '&:first-child': {
29 borderTop: `1px solid ${theme.workspaces.drawer.listItem.border}`,
30 },
31 '&:hover': {
32 backgroundColor: theme.workspaces.drawer.listItem.hoverBackground,
33 },
34 },
35 isActiveItem: {
36 backgroundColor: theme.workspaces.drawer.listItem.activeBackground,
37 '&:hover': {
38 backgroundColor: theme.workspaces.drawer.listItem.activeBackground,
39 },
40 },
41 name: {
42 marginTop: '4px',
43 color: theme.workspaces.drawer.listItem.name.color,
44 },
45 activeName: {
46 color: theme.workspaces.drawer.listItem.name.activeColor,
47 },
48 services: {
49 display: 'block',
50 fontSize: '11px',
51 marginTop: '5px',
52 color: theme.workspaces.drawer.listItem.services.color,
53 whiteSpace: 'nowrap',
54 textOverflow: 'ellipsis',
55 overflow: 'hidden',
56 lineHeight: '15px',
57 },
58 activeServices: {
59 color: theme.workspaces.drawer.listItem.services.active,
60 },
61});
62
63@injectSheet(styles) @observer
64class WorkspaceDrawerItem extends Component {
65 static propTypes = {
66 classes: PropTypes.object.isRequired,
67 isActive: PropTypes.bool.isRequired,
68 name: PropTypes.string.isRequired,
69 onClick: PropTypes.func.isRequired,
70 services: PropTypes.arrayOf(PropTypes.string).isRequired,
71 onContextMenuEditClick: PropTypes.func,
72 };
73
74 static defaultProps = {
75 onContextMenuEditClick: null,
76 };
77
78 static contextTypes = {
79 intl: intlShape,
80 };
81
82 render() {
83 const {
84 classes,
85 isActive,
86 name,
87 onClick,
88 onContextMenuEditClick,
89 services,
90 } = this.props;
91 const { intl } = this.context;
92
93 const contextMenuTemplate = [{
94 label: name,
95 enabled: false,
96 }, {
97 type: 'separator',
98 }, {
99 label: intl.formatMessage(messages.contextMenuEdit),
100 click: onContextMenuEditClick,
101 }];
102
103 const contextMenu = Menu.buildFromTemplate(contextMenuTemplate);
104
105 return (
106 <div
107 className={classnames([
108 classes.item,
109 isActive ? classes.isActiveItem : null,
110 ])}
111 onClick={onClick}
112 onContextMenu={() => (
113 onContextMenuEditClick && contextMenu.popup(remote.getCurrentWindow())
114 )}
115 >
116 <span
117 className={classnames([
118 classes.name,
119 isActive ? classes.activeName : null,
120 ])}
121 >
122 {name}
123 </span>
124 <span
125 className={classnames([
126 classes.services,
127 isActive ? classes.activeServices : null,
128 ])}
129 >
130 {services.length ? services.join(', ') : intl.formatMessage(messages.noServicesAddedYet)}
131 </span>
132 </div>
133 );
134 }
135}
136
137export default WorkspaceDrawerItem;
diff --git a/src/features/workspaces/components/WorkspaceItem.js b/src/features/workspaces/components/WorkspaceItem.js
new file mode 100644
index 000000000..cc4b1a3ba
--- /dev/null
+++ b/src/features/workspaces/components/WorkspaceItem.js
@@ -0,0 +1,45 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { intlShape } from 'react-intl';
4import { observer } from 'mobx-react';
5import injectSheet from 'react-jss';
6
7import Workspace from '../models/Workspace';
8
9const styles = theme => ({
10 row: {
11 height: theme.workspaces.settings.listItems.height,
12 borderBottom: `1px solid ${theme.workspaces.settings.listItems.borderColor}`,
13 '&:hover': {
14 background: theme.workspaces.settings.listItems.hoverBgColor,
15 },
16 },
17 columnName: {},
18});
19
20@injectSheet(styles) @observer
21class WorkspaceItem extends Component {
22 static propTypes = {
23 classes: PropTypes.object.isRequired,
24 workspace: PropTypes.instanceOf(Workspace).isRequired,
25 onItemClick: PropTypes.func.isRequired,
26 };
27
28 static contextTypes = {
29 intl: intlShape,
30 };
31
32 render() {
33 const { classes, workspace, onItemClick } = this.props;
34
35 return (
36 <tr className={classes.row}>
37 <td onClick={() => onItemClick(workspace)}>
38 {workspace.name}
39 </td>
40 </tr>
41 );
42 }
43}
44
45export default WorkspaceItem;
diff --git a/src/features/workspaces/components/WorkspaceServiceListItem.js b/src/features/workspaces/components/WorkspaceServiceListItem.js
new file mode 100644
index 000000000..e05b21440
--- /dev/null
+++ b/src/features/workspaces/components/WorkspaceServiceListItem.js
@@ -0,0 +1,75 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import classnames from 'classnames';
6import { Toggle } from '@meetfranz/forms';
7
8import Service from '../../../models/Service';
9import ServiceIcon from '../../../components/ui/ServiceIcon';
10
11const styles = theme => ({
12 listItem: {
13 height: theme.workspaces.settings.listItems.height,
14 borderBottom: `1px solid ${theme.workspaces.settings.listItems.borderColor}`,
15 display: 'flex',
16 alignItems: 'center',
17 },
18 serviceIcon: {
19 padding: theme.workspaces.settings.listItems.padding,
20 },
21 toggle: {
22 height: 'auto',
23 margin: 0,
24 },
25 label: {
26 padding: theme.workspaces.settings.listItems.padding,
27 flexGrow: 1,
28 },
29 disabledLabel: {
30 color: theme.workspaces.settings.listItems.disabled.color,
31 },
32});
33
34@injectSheet(styles) @observer
35class WorkspaceServiceListItem extends Component {
36 static propTypes = {
37 classes: PropTypes.object.isRequired,
38 isInWorkspace: PropTypes.bool.isRequired,
39 onToggle: PropTypes.func.isRequired,
40 service: PropTypes.instanceOf(Service).isRequired,
41 };
42
43 render() {
44 const {
45 classes,
46 isInWorkspace,
47 onToggle,
48 service,
49 } = this.props;
50
51 return (
52 <div className={classes.listItem}>
53 <ServiceIcon
54 className={classes.serviceIcon}
55 service={service}
56 />
57 <span
58 className={classnames([
59 classes.label,
60 service.isEnabled ? null : classes.disabledLabel,
61 ])}
62 >
63 {service.name}
64 </span>
65 <Toggle
66 className={classes.toggle}
67 checked={isInWorkspace}
68 onChange={onToggle}
69 />
70 </div>
71 );
72 }
73}
74
75export default WorkspaceServiceListItem;
diff --git a/src/features/workspaces/components/WorkspaceSwitchingIndicator.js b/src/features/workspaces/components/WorkspaceSwitchingIndicator.js
new file mode 100644
index 000000000..c4a800a7b
--- /dev/null
+++ b/src/features/workspaces/components/WorkspaceSwitchingIndicator.js
@@ -0,0 +1,91 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import classnames from 'classnames';
6import { Loader } from '@meetfranz/ui';
7import { defineMessages, intlShape } from 'react-intl';
8
9import { workspaceStore } from '../index';
10
11const messages = defineMessages({
12 switchingTo: {
13 id: 'workspaces.switchingIndicator.switchingTo',
14 defaultMessage: '!!!Switching to',
15 },
16});
17
18const styles = theme => ({
19 wrapper: {
20 display: 'flex',
21 alignItems: 'flex-start',
22 position: 'absolute',
23 transition: 'width 0.5s ease',
24 width: '100%',
25 marginTop: '20px',
26 },
27 wrapperWhenDrawerIsOpen: {
28 width: `calc(100% - ${theme.workspaces.drawer.width}px)`,
29 },
30 component: {
31 background: 'rgba(20, 20, 20, 0.4)',
32 padding: '10px 20px',
33 display: 'flex',
34 width: 'auto',
35 height: 'auto',
36 margin: [0, 'auto'],
37 borderRadius: 6,
38 alignItems: 'center',
39 zIndex: 200,
40 },
41 spinner: {
42 width: 40,
43 height: 40,
44 marginRight: 10,
45 },
46 message: {
47 fontSize: 16,
48 whiteSpace: 'nowrap',
49 color: theme.colorAppLoaderSpinner,
50 },
51});
52
53@injectSheet(styles) @observer
54class WorkspaceSwitchingIndicator extends Component {
55 static propTypes = {
56 classes: PropTypes.object.isRequired,
57 theme: PropTypes.object.isRequired,
58 };
59
60 static contextTypes = {
61 intl: intlShape,
62 };
63
64 render() {
65 const { classes, theme } = this.props;
66 const { intl } = this.context;
67 const { isSwitchingWorkspace, isWorkspaceDrawerOpen, nextWorkspace } = workspaceStore;
68 if (!isSwitchingWorkspace) return null;
69 const nextWorkspaceName = nextWorkspace ? nextWorkspace.name : 'All services';
70 return (
71 <div
72 className={classnames([
73 classes.wrapper,
74 isWorkspaceDrawerOpen ? classes.wrapperWhenDrawerIsOpen : null,
75 ])}
76 >
77 <div className={classes.component}>
78 <Loader
79 className={classes.spinner}
80 color={theme.workspaces.switchingIndicator.spinnerColor}
81 />
82 <p className={classes.message}>
83 {`${intl.formatMessage(messages.switchingTo)} ${nextWorkspaceName}`}
84 </p>
85 </div>
86 </div>
87 );
88 }
89}
90
91export default WorkspaceSwitchingIndicator;
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js
new file mode 100644
index 000000000..dd4381a15
--- /dev/null
+++ b/src/features/workspaces/components/WorkspacesDashboard.js
@@ -0,0 +1,195 @@
1import React, { Component, Fragment } from 'react';
2import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6import { Infobox } from '@meetfranz/ui';
7
8import Loader from '../../../components/ui/Loader';
9import WorkspaceItem from './WorkspaceItem';
10import CreateWorkspaceForm from './CreateWorkspaceForm';
11import Request from '../../../stores/lib/Request';
12import Appear from '../../../components/ui/effects/Appear';
13import { workspaceStore } from '../index';
14import PremiumFeatureContainer from '../../../components/ui/PremiumFeatureContainer';
15
16const messages = defineMessages({
17 headline: {
18 id: 'settings.workspaces.headline',
19 defaultMessage: '!!!Your workspaces',
20 },
21 noServicesAdded: {
22 id: 'settings.workspaces.noWorkspacesAdded',
23 defaultMessage: '!!!You haven\'t added any workspaces yet.',
24 },
25 workspacesRequestFailed: {
26 id: 'settings.workspaces.workspacesRequestFailed',
27 defaultMessage: '!!!Could not load your workspaces',
28 },
29 tryReloadWorkspaces: {
30 id: 'settings.workspaces.tryReloadWorkspaces',
31 defaultMessage: '!!!Try again',
32 },
33 updatedInfo: {
34 id: 'settings.workspaces.updatedInfo',
35 defaultMessage: '!!!Your changes have been saved',
36 },
37 deletedInfo: {
38 id: 'settings.workspaces.deletedInfo',
39 defaultMessage: '!!!Workspace has been deleted',
40 },
41 workspaceFeatureInfo: {
42 id: 'settings.workspaces.workspaceFeatureInfo',
43 defaultMessage: '!!!Info about workspace feature',
44 },
45 workspaceFeatureHeadline: {
46 id: 'settings.workspaces.workspaceFeatureHeadline',
47 defaultMessage: '!!!Less is More: Introducing Franz Workspaces',
48 },
49});
50
51const styles = theme => ({
52 table: {
53 width: '100%',
54 '& td': {
55 padding: '10px',
56 },
57 },
58 createForm: {
59 height: 'auto',
60 },
61 appear: {
62 height: 'auto',
63 },
64 premiumAnnouncement: {
65 padding: '20px',
66 backgroundColor: '#3498db',
67 marginLeft: '-20px',
68 marginBottom: '20px',
69 height: 'auto',
70 color: 'white',
71 borderRadius: theme.borderRadius,
72 },
73});
74
75@injectSheet(styles) @observer
76class WorkspacesDashboard extends Component {
77 static propTypes = {
78 classes: PropTypes.object.isRequired,
79 getUserWorkspacesRequest: PropTypes.instanceOf(Request).isRequired,
80 createWorkspaceRequest: PropTypes.instanceOf(Request).isRequired,
81 deleteWorkspaceRequest: PropTypes.instanceOf(Request).isRequired,
82 updateWorkspaceRequest: PropTypes.instanceOf(Request).isRequired,
83 onCreateWorkspaceSubmit: PropTypes.func.isRequired,
84 onWorkspaceClick: PropTypes.func.isRequired,
85 workspaces: MobxPropTypes.arrayOrObservableArray.isRequired,
86 };
87
88 static contextTypes = {
89 intl: intlShape,
90 };
91
92 render() {
93 const {
94 classes,
95 getUserWorkspacesRequest,
96 createWorkspaceRequest,
97 deleteWorkspaceRequest,
98 updateWorkspaceRequest,
99 onCreateWorkspaceSubmit,
100 onWorkspaceClick,
101 workspaces,
102 } = this.props;
103 const { intl } = this.context;
104 return (
105 <div className="settings__main">
106 <div className="settings__header">
107 <h1>{intl.formatMessage(messages.headline)}</h1>
108 </div>
109 <div className="settings__body">
110
111 {/* ===== Workspace updated info ===== */}
112 {updateWorkspaceRequest.wasExecuted && updateWorkspaceRequest.result && (
113 <Appear className={classes.appear}>
114 <Infobox
115 type="success"
116 icon="mdiCheckboxMarkedCircleOutline"
117 dismissable
118 onUnmount={updateWorkspaceRequest.reset}
119 >
120 {intl.formatMessage(messages.updatedInfo)}
121 </Infobox>
122 </Appear>
123 )}
124
125 {/* ===== Workspace deleted info ===== */}
126 {deleteWorkspaceRequest.wasExecuted && deleteWorkspaceRequest.result && (
127 <Appear className={classes.appear}>
128 <Infobox
129 type="success"
130 icon="mdiCheckboxMarkedCircleOutline"
131 dismissable
132 onUnmount={deleteWorkspaceRequest.reset}
133 >
134 {intl.formatMessage(messages.deletedInfo)}
135 </Infobox>
136 </Appear>
137 )}
138
139 {workspaceStore.isPremiumUpgradeRequired && (
140 <div className={classes.premiumAnnouncement}>
141 <h2>{intl.formatMessage(messages.workspaceFeatureHeadline)}</h2>
142 <p>{intl.formatMessage(messages.workspaceFeatureInfo)}</p>
143 </div>
144 )}
145
146 <PremiumFeatureContainer
147 condition={workspaceStore.isPremiumFeature}
148 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'workspaces' }}
149 >
150 {/* ===== Create workspace form ===== */}
151 <div className={classes.createForm}>
152 <CreateWorkspaceForm
153 isSubmitting={createWorkspaceRequest.isExecuting}
154 onSubmit={onCreateWorkspaceSubmit}
155 />
156 </div>
157 {getUserWorkspacesRequest.isExecuting ? (
158 <Loader />
159 ) : (
160 <Fragment>
161 {/* ===== Workspace could not be loaded error ===== */}
162 {getUserWorkspacesRequest.error ? (
163 <Infobox
164 icon="alert"
165 type="danger"
166 ctaLabel={intl.formatMessage(messages.tryReloadWorkspaces)}
167 ctaLoading={getUserWorkspacesRequest.isExecuting}
168 ctaOnClick={getUserWorkspacesRequest.retry}
169 >
170 {intl.formatMessage(messages.workspacesRequestFailed)}
171 </Infobox>
172 ) : (
173 <table className={classes.table}>
174 {/* ===== Workspaces list ===== */}
175 <tbody>
176 {workspaces.map(workspace => (
177 <WorkspaceItem
178 key={workspace.id}
179 workspace={workspace}
180 onItemClick={w => onWorkspaceClick(w)}
181 />
182 ))}
183 </tbody>
184 </table>
185 )}
186 </Fragment>
187 )}
188 </PremiumFeatureContainer>
189 </div>
190 </div>
191 );
192 }
193}
194
195export default WorkspacesDashboard;
diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js
new file mode 100644
index 000000000..248b40131
--- /dev/null
+++ b/src/features/workspaces/containers/EditWorkspaceScreen.js
@@ -0,0 +1,60 @@
1import React, { Component } from 'react';
2import { inject, observer } from 'mobx-react';
3import PropTypes from 'prop-types';
4
5import ErrorBoundary from '../../../components/util/ErrorBoundary';
6import EditWorkspaceForm from '../components/EditWorkspaceForm';
7import ServicesStore from '../../../stores/ServicesStore';
8import Workspace from '../models/Workspace';
9import { workspaceStore } from '../index';
10import { deleteWorkspaceRequest, updateWorkspaceRequest } from '../api';
11
12@inject('stores', 'actions') @observer
13class EditWorkspaceScreen extends Component {
14 static propTypes = {
15 actions: PropTypes.shape({
16 workspace: PropTypes.shape({
17 delete: PropTypes.func.isRequired,
18 }),
19 }).isRequired,
20 stores: PropTypes.shape({
21 services: PropTypes.instanceOf(ServicesStore).isRequired,
22 }).isRequired,
23 };
24
25 onDelete = () => {
26 const { workspaceBeingEdited } = workspaceStore;
27 const { actions } = this.props;
28 if (!workspaceBeingEdited) return null;
29 actions.workspaces.delete({ workspace: workspaceBeingEdited });
30 };
31
32 onSave = (values) => {
33 const { workspaceBeingEdited } = workspaceStore;
34 const { actions } = this.props;
35 const workspace = new Workspace(
36 Object.assign({}, workspaceBeingEdited, values),
37 );
38 actions.workspaces.update({ workspace });
39 };
40
41 render() {
42 const { workspaceBeingEdited } = workspaceStore;
43 const { stores } = this.props;
44 if (!workspaceBeingEdited) return null;
45 return (
46 <ErrorBoundary>
47 <EditWorkspaceForm
48 workspace={workspaceBeingEdited}
49 services={stores.services.all}
50 onDelete={this.onDelete}
51 onSave={this.onSave}
52 updateWorkspaceRequest={updateWorkspaceRequest}
53 deleteWorkspaceRequest={deleteWorkspaceRequest}
54 />
55 </ErrorBoundary>
56 );
57 }
58}
59
60export default EditWorkspaceScreen;
diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js
new file mode 100644
index 000000000..2ab565fa1
--- /dev/null
+++ b/src/features/workspaces/containers/WorkspacesScreen.js
@@ -0,0 +1,42 @@
1import React, { Component } from 'react';
2import { inject, observer } from 'mobx-react';
3import PropTypes from 'prop-types';
4import WorkspacesDashboard from '../components/WorkspacesDashboard';
5import ErrorBoundary from '../../../components/util/ErrorBoundary';
6import { workspaceStore } from '../index';
7import {
8 createWorkspaceRequest,
9 deleteWorkspaceRequest,
10 getUserWorkspacesRequest,
11 updateWorkspaceRequest,
12} from '../api';
13
14@inject('actions') @observer
15class WorkspacesScreen extends Component {
16 static propTypes = {
17 actions: PropTypes.shape({
18 workspace: PropTypes.shape({
19 edit: PropTypes.func.isRequired,
20 }),
21 }).isRequired,
22 };
23
24 render() {
25 const { actions } = this.props;
26 return (
27 <ErrorBoundary>
28 <WorkspacesDashboard
29 workspaces={workspaceStore.workspaces}
30 getUserWorkspacesRequest={getUserWorkspacesRequest}
31 createWorkspaceRequest={createWorkspaceRequest}
32 deleteWorkspaceRequest={deleteWorkspaceRequest}
33 updateWorkspaceRequest={updateWorkspaceRequest}
34 onCreateWorkspaceSubmit={data => actions.workspaces.create(data)}
35 onWorkspaceClick={w => actions.workspaces.edit({ workspace: w })}
36 />
37 </ErrorBoundary>
38 );
39 }
40}
41
42export default WorkspacesScreen;
diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js
new file mode 100644
index 000000000..ad9023b8b
--- /dev/null
+++ b/src/features/workspaces/index.js
@@ -0,0 +1,37 @@
1import { reaction } from 'mobx';
2import WorkspacesStore from './store';
3import { resetApiRequests } from './api';
4
5const debug = require('debug')('Franz:feature:workspaces');
6
7export const GA_CATEGORY_WORKSPACES = 'Workspaces';
8
9export const workspaceStore = new WorkspacesStore();
10
11export default function initWorkspaces(stores, actions) {
12 stores.workspaces = workspaceStore;
13 const { features } = stores;
14
15 // Toggle workspace feature
16 reaction(
17 () => features.features.isWorkspaceEnabled,
18 (isEnabled) => {
19 if (isEnabled && !workspaceStore.isFeatureActive) {
20 debug('Initializing `workspaces` feature');
21 workspaceStore.start(stores, actions);
22 } else if (workspaceStore.isFeatureActive) {
23 debug('Disabling `workspaces` feature');
24 workspaceStore.stop();
25 resetApiRequests();
26 }
27 },
28 {
29 fireImmediately: true,
30 },
31 );
32}
33
34export const WORKSPACES_ROUTES = {
35 ROOT: '/settings/workspaces',
36 EDIT: '/settings/workspaces/:action/:id',
37};
diff --git a/src/features/workspaces/models/Workspace.js b/src/features/workspaces/models/Workspace.js
new file mode 100644
index 000000000..6c73d7095
--- /dev/null
+++ b/src/features/workspaces/models/Workspace.js
@@ -0,0 +1,25 @@
1import { observable } from 'mobx';
2
3export default class Workspace {
4 id = null;
5
6 @observable name = null;
7
8 @observable order = null;
9
10 @observable services = [];
11
12 @observable userId = null;
13
14 constructor(data) {
15 if (!data.id) {
16 throw Error('Workspace requires Id');
17 }
18
19 this.id = data.id;
20 this.name = data.name;
21 this.order = data.order;
22 this.services.replace(data.services);
23 this.userId = data.userId;
24 }
25}
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js
new file mode 100644
index 000000000..ea601700e
--- /dev/null
+++ b/src/features/workspaces/store.js
@@ -0,0 +1,276 @@
1import {
2 computed,
3 observable,
4 action,
5} from 'mobx';
6import localStorage from 'mobx-localstorage';
7import { matchRoute } from '../../helpers/routing-helpers';
8import { workspaceActions } from './actions';
9import { FeatureStore } from '../utils/FeatureStore';
10import {
11 createWorkspaceRequest,
12 deleteWorkspaceRequest,
13 getUserWorkspacesRequest,
14 updateWorkspaceRequest,
15} from './api';
16import { WORKSPACES_ROUTES } from './index';
17
18const debug = require('debug')('Franz:feature:workspaces:store');
19
20export default class WorkspacesStore extends FeatureStore {
21 @observable isFeatureEnabled = false;
22
23 @observable isFeatureActive = false;
24
25 @observable isPremiumFeature = true;
26
27 @observable isPremiumUpgradeRequired = true;
28
29 @observable activeWorkspace = null;
30
31 @observable nextWorkspace = null;
32
33 @observable workspaceBeingEdited = null;
34
35 @observable isSwitchingWorkspace = false;
36
37 @observable isWorkspaceDrawerOpen = false;
38
39 @observable isSettingsRouteActive = null;
40
41 @computed get workspaces() {
42 if (!this.isFeatureActive) return [];
43 return getUserWorkspacesRequest.result || [];
44 }
45
46 @computed get settings() {
47 return localStorage.getItem('workspaces') || {};
48 }
49
50 @computed get userHasWorkspaces() {
51 return getUserWorkspacesRequest.wasExecuted && this.workspaces.length > 0;
52 }
53
54 start(stores, actions) {
55 debug('WorkspacesStore::start');
56 this.stores = stores;
57 this.actions = actions;
58
59 this._listenToActions([
60 [workspaceActions.edit, this._edit],
61 [workspaceActions.create, this._create],
62 [workspaceActions.delete, this._delete],
63 [workspaceActions.update, this._update],
64 [workspaceActions.activate, this._setActiveWorkspace],
65 [workspaceActions.deactivate, this._deactivateActiveWorkspace],
66 [workspaceActions.toggleWorkspaceDrawer, this._toggleWorkspaceDrawer],
67 [workspaceActions.openWorkspaceSettings, this._openWorkspaceSettings],
68 ]);
69
70 this._startReactions([
71 this._setWorkspaceBeingEditedReaction,
72 this._setActiveServiceOnWorkspaceSwitchReaction,
73 this._setFeatureEnabledReaction,
74 this._setIsPremiumFeatureReaction,
75 this._activateLastUsedWorkspaceReaction,
76 this._openDrawerWithSettingsReaction,
77 this._cleanupInvalidServiceReferences,
78 ]);
79
80 getUserWorkspacesRequest.execute();
81 this.isFeatureActive = true;
82 }
83
84 stop() {
85 debug('WorkspacesStore::stop');
86 this.isFeatureActive = false;
87 this.activeWorkspace = null;
88 this.nextWorkspace = null;
89 this.workspaceBeingEdited = null;
90 this.isSwitchingWorkspace = false;
91 this.isWorkspaceDrawerOpen = false;
92 }
93
94 filterServicesByActiveWorkspace = (services) => {
95 const { activeWorkspace, isFeatureActive } = this;
96 if (isFeatureActive && activeWorkspace) {
97 return this.getWorkspaceServices(activeWorkspace);
98 }
99 return services;
100 };
101
102 getWorkspaceServices(workspace) {
103 const { services } = this.stores;
104 return workspace.services.map(id => services.one(id)).filter(s => !!s);
105 }
106
107 // ========== PRIVATE ========= //
108
109 _wasDrawerOpenBeforeSettingsRoute = null;
110
111 _getWorkspaceById = id => this.workspaces.find(w => w.id === id);
112
113 _updateSettings = (changes) => {
114 localStorage.setItem('workspaces', {
115 ...this.settings,
116 ...changes,
117 });
118 };
119
120 // Actions
121
122 @action _edit = ({ workspace }) => {
123 this.stores.router.push(`/settings/workspaces/edit/${workspace.id}`);
124 };
125
126 @action _create = async ({ name }) => {
127 try {
128 const workspace = await createWorkspaceRequest.execute(name);
129 await getUserWorkspacesRequest.result.push(workspace);
130 this._edit({ workspace });
131 } catch (error) {
132 throw error;
133 }
134 };
135
136 @action _delete = async ({ workspace }) => {
137 try {
138 await deleteWorkspaceRequest.execute(workspace);
139 await getUserWorkspacesRequest.result.remove(workspace);
140 this.stores.router.push('/settings/workspaces');
141 } catch (error) {
142 throw error;
143 }
144 };
145
146 @action _update = async ({ workspace }) => {
147 try {
148 await updateWorkspaceRequest.execute(workspace);
149 // Path local result optimistically
150 const localWorkspace = this._getWorkspaceById(workspace.id);
151 Object.assign(localWorkspace, workspace);
152 this.stores.router.push('/settings/workspaces');
153 } catch (error) {
154 throw error;
155 }
156 };
157
158 @action _setActiveWorkspace = ({ workspace }) => {
159 // Indicate that we are switching to another workspace
160 this.isSwitchingWorkspace = true;
161 this.nextWorkspace = workspace;
162 // Delay switching to next workspace so that the services loading does not drag down UI
163 setTimeout(() => {
164 this.activeWorkspace = workspace;
165 this._updateSettings({ lastActiveWorkspace: workspace.id });
166 }, 100);
167 // Indicate that we are done switching to the next workspace
168 setTimeout(() => {
169 this.isSwitchingWorkspace = false;
170 this.nextWorkspace = null;
171 }, 1000);
172 };
173
174 @action _deactivateActiveWorkspace = () => {
175 // Indicate that we are switching to default workspace
176 this.isSwitchingWorkspace = true;
177 this.nextWorkspace = null;
178 this._updateSettings({ lastActiveWorkspace: null });
179 // Delay switching to next workspace so that the services loading does not drag down UI
180 setTimeout(() => {
181 this.activeWorkspace = null;
182 }, 100);
183 // Indicate that we are done switching to the default workspace
184 setTimeout(() => { this.isSwitchingWorkspace = false; }, 1000);
185 };
186
187 @action _toggleWorkspaceDrawer = () => {
188 this.isWorkspaceDrawerOpen = !this.isWorkspaceDrawerOpen;
189 };
190
191 @action _openWorkspaceSettings = () => {
192 this.actions.ui.openSettings({ path: 'workspaces' });
193 };
194
195 // Reactions
196
197 _setFeatureEnabledReaction = () => {
198 const { isWorkspaceEnabled } = this.stores.features.features;
199 this.isFeatureEnabled = isWorkspaceEnabled;
200 };
201
202 _setIsPremiumFeatureReaction = () => {
203 const { features, user } = this.stores;
204 const { isPremium } = user.data;
205 const { isWorkspacePremiumFeature } = features.features;
206 this.isPremiumFeature = isWorkspacePremiumFeature;
207 this.isPremiumUpgradeRequired = isWorkspacePremiumFeature && !isPremium;
208 };
209
210 _setWorkspaceBeingEditedReaction = () => {
211 const { pathname } = this.stores.router.location;
212 const match = matchRoute('/settings/workspaces/edit/:id', pathname);
213 if (match) {
214 this.workspaceBeingEdited = this._getWorkspaceById(match.id);
215 }
216 };
217
218 _setActiveServiceOnWorkspaceSwitchReaction = () => {
219 if (!this.isFeatureActive) return;
220 if (this.activeWorkspace) {
221 const services = this.stores.services.allDisplayed;
222 const activeService = services.find(s => s.isActive);
223 const workspaceServices = this.getWorkspaceServices(this.activeWorkspace);
224 if (workspaceServices.length <= 0) return;
225 const isActiveServiceInWorkspace = workspaceServices.includes(activeService);
226 if (!isActiveServiceInWorkspace) {
227 this.actions.service.setActive({ serviceId: workspaceServices[0].id });
228 }
229 }
230 };
231
232 _activateLastUsedWorkspaceReaction = () => {
233 if (!this.activeWorkspace && this.userHasWorkspaces) {
234 const { lastActiveWorkspace } = this.settings;
235 if (lastActiveWorkspace) {
236 const workspace = this._getWorkspaceById(lastActiveWorkspace);
237 if (workspace) this._setActiveWorkspace({ workspace });
238 }
239 }
240 };
241
242 _openDrawerWithSettingsReaction = () => {
243 const { router } = this.stores;
244 const isWorkspaceSettingsRoute = router.location.pathname.includes(WORKSPACES_ROUTES.ROOT);
245 const isSwitchingToSettingsRoute = !this.isSettingsRouteActive && isWorkspaceSettingsRoute;
246 const isLeavingSettingsRoute = !isWorkspaceSettingsRoute && this.isSettingsRouteActive;
247
248 if (isSwitchingToSettingsRoute) {
249 this.isSettingsRouteActive = true;
250 this._wasDrawerOpenBeforeSettingsRoute = this.isWorkspaceDrawerOpen;
251 if (!this._wasDrawerOpenBeforeSettingsRoute) {
252 workspaceActions.toggleWorkspaceDrawer();
253 }
254 } else if (isLeavingSettingsRoute) {
255 this.isSettingsRouteActive = false;
256 if (!this._wasDrawerOpenBeforeSettingsRoute && this.isWorkspaceDrawerOpen) {
257 workspaceActions.toggleWorkspaceDrawer();
258 }
259 }
260 };
261
262 _cleanupInvalidServiceReferences = () => {
263 const { services } = this.stores;
264 let invalidServiceReferencesExist = false;
265 this.workspaces.forEach((workspace) => {
266 workspace.services.forEach((serviceId) => {
267 if (!services.one(serviceId)) {
268 invalidServiceReferencesExist = true;
269 }
270 });
271 });
272 if (invalidServiceReferencesExist) {
273 getUserWorkspacesRequest.execute();
274 }
275 };
276}
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index f374fddd9..dabe4ba16 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Suport", 70 "menu.help.support" : "Suport",
71 "menu.help.tos" : "Condicions del Servei", 71 "menu.help.tos" : "Condicions del Servei",
72 "menu.services" : "Serveis", 72 "menu.services" : "Serveis",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Afegeix un servei...", 74 "menu.services.addNewService" : "Afegeix un servei...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Visualitza", 76 "menu.view" : "Visualitza",
75 "menu.view.enterFullScreen" : "Inicia la pantalla completa", 77 "menu.view.enterFullScreen" : "Inicia la pantalla completa",
76 "menu.view.exitFullScreen" : "Surt de pantalla completa", 78 "menu.view.exitFullScreen" : "Surt de pantalla completa",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Descarregar", 130 "settings.account.invoiceDownload" : "Descarregar",
129 "settings.account.manageSubscription.label" : "Gestioneu la vostra subscripció", 131 "settings.account.manageSubscription.label" : "Gestioneu la vostra subscripció",
130 "settings.account.successInfo" : "S'han desat els canvis", 132 "settings.account.successInfo" : "S'han desat els canvis",
133 "settings.account.tryReloadServices" : "Torna a provar-ho",
131 "settings.account.tryReloadUserInfoRequest" : "Torna a provar-ho", 134 "settings.account.tryReloadUserInfoRequest" : "Torna a provar-ho",
132 "settings.account.userInfoRequestFailed" : "No s'ha pogut carregar la informació de l'usuari", 135 "settings.account.userInfoRequestFailed" : "No s'ha pogut carregar la informació de l'usuari",
133 "settings.app.buttonClearAllCache" : "Buida la memòria cau", 136 "settings.app.buttonClearAllCache" : "Buida la memòria cau",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Inclou versions beta", 143 "settings.app.form.beta" : "Inclou versions beta",
141 "settings.app.form.darkMode" : "Uneix-te al Cantó Fosc", 144 "settings.app.form.darkMode" : "Uneix-te al Cantó Fosc",
142 "settings.app.form.enableGPUAcceleration" : "Activar acceleració GPU", 145 "settings.app.form.enableGPUAcceleration" : "Activar acceleració GPU",
143 "settings.app.form.enableMenuBar" : "Mostra Franz a la barra de menú",
144 "settings.app.form.enableSpellchecking" : "Habilita la comprobació ortogràfica", 146 "settings.app.form.enableSpellchecking" : "Habilita la comprobació ortogràfica",
145 "settings.app.form.enableSystemTray" : "Mostra Franz a la safata del sistema", 147 "settings.app.form.enableSystemTray" : "Mostra Franz a la safata del sistema",
146 "settings.app.form.hideDockIcon" : "Oculta la icona de Franz al Dock",
147 "settings.app.form.language" : "Idioma", 148 "settings.app.form.language" : "Idioma",
148 "settings.app.form.minimizeToSystemTray" : "Minimitza Franz a la safata del sistema", 149 "settings.app.form.minimizeToSystemTray" : "Minimitza Franz a la safata del sistema",
149 "settings.app.form.runInBackground" : "Mantén a Franz en segon pla en tancar la finestra", 150 "settings.app.form.runInBackground" : "Mantén a Franz en segon pla en tancar la finestra",
150 "settings.app.form.showDisabledServices" : "Mostra les pestanyes dels serveis desactivats", 151 "settings.app.form.showDisabledServices" : "Mostra les pestanyes dels serveis desactivats",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra la insígnia de missatges no llegits quan les notificacions estiguin desactivades", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra la insígnia de missatges no llegits quan les notificacions estiguin desactivades",
152 "settings.app.form.spellcheckerLanguage" : "Corrector ortogràfic",
153 "settings.app.headline" : "Configuració", 153 "settings.app.headline" : "Configuració",
154 "settings.app.headlineAdvanced" : "Avançat", 154 "settings.app.headlineAdvanced" : "Avançat",
155 "settings.app.headlineAppearance" : "Aparença", 155 "settings.app.headlineAppearance" : "Aparença",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Siusplau, reinicieu el Franz després de canviar els ajustaments de proxy", 212 "settings.service.form.proxy.restartInfo" : "Siusplau, reinicieu el Franz després de canviar els ajustaments de proxy",
213 "settings.service.form.proxy.user" : "Usuari (opcional)", 213 "settings.service.form.proxy.user" : "Usuari (opcional)",
214 "settings.service.form.saveButton" : "Desa el servei", 214 "settings.service.form.saveButton" : "Desa el servei",
215 "settings.service.form.spellcheckerLanguage" : "Idioma del corrector",
216 "settings.service.form.spellcheckerLanguage.default" : "Utilitzar el predeterminat del sistema ({default})",
217 "settings.service.form.tabHosted" : "Allotjat", 215 "settings.service.form.tabHosted" : "Allotjat",
218 "settings.service.form.tabOnPremise" : "Allotjat per si mateix ⭐️", 216 "settings.service.form.tabOnPremise" : "Allotjat per si mateix ⭐️",
219 "settings.service.form.team" : "Equip", 217 "settings.service.form.team" : "Equip",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Descobrir serveis", 221 "settings.services.discoverServices" : "Descobrir serveis",
224 "settings.services.headline" : "Els vostres serveis", 222 "settings.services.headline" : "Els vostres serveis",
225 "settings.services.noServicesAdded" : "Encara no heu afegit cap servei.", 223 "settings.services.noServicesAdded" : "Encara no heu afegit cap servei.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "El servei està desactivat", 225 "settings.services.tooltip.isDisabled" : "El servei està desactivat",
227 "settings.services.tooltip.isMuted" : "Tots els sons estan desactivats", 226 "settings.services.tooltip.isMuted" : "Tots els sons estan desactivats",
228 "settings.services.tooltip.notificationsDisabled" : "Les notificacions estan desactivades", 227 "settings.services.tooltip.notificationsDisabled" : "Les notificacions estan desactivades",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Residents d'EU: es poden aplicar impostos locals", 254 "subscription.euTaxInfo" : "Residents d'EU: es poden aplicar impostos locals",
256 "subscription.features.ads" : "Sense anuncis, mai!", 255 "subscription.features.ads" : "Sense anuncis, mai!",
257 "subscription.features.comingSoon" : "properament", 256 "subscription.features.comingSoon" : "properament",
258 "subscription.features.encryptedSync" : "Sincronització de sessió xifrada",
259 "subscription.features.noInterruptions" : "Sense retards ni molestes actualitzacions de llicències ", 257 "subscription.features.noInterruptions" : "Sense retards ni molestes actualitzacions de llicències ",
260 "subscription.features.onpremise" : "Afegiu serveis en premissa\/allotjats com HipChat",
261 "subscription.features.onpremise.mattermost" : "Afegir serveis allotjats com Mattermost", 258 "subscription.features.onpremise.mattermost" : "Afegir serveis allotjats com Mattermost",
262 "subscription.features.proxy" : "Suport de Proxy per a serveis", 259 "subscription.features.proxy" : "Suport de Proxy per a serveis",
263 "subscription.features.spellchecker" : "Suport per corrector ortogràfic", 260 "subscription.features.spellchecker" : "Suport per corrector ortogràfic",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Recarrega", 277 "tabs.item.reload" : "Recarrega",
281 "validation.email" : "{field} no es vàlid", 278 "validation.email" : "{field} no es vàlid",
282 "validation.minLength" : "{field} ha de ser al menys {length} caràcters de llargada", 279 "validation.minLength" : "{field} ha de ser al menys {length} caràcters de llargada",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} es requerit", 281 "validation.required" : "{field} es requerit",
284 "validation.url" : "{field} es una URL no vàlida", 282 "validation.url" : "{field} es una URL no vàlida",
285 "welcome.loginButton" : "Inicia sessió al teu compte", 283 "welcome.loginButton" : "Inicia sessió al teu compte",
286 "welcome.signupButton" : "Crea un compte gratuït", 284 "welcome.signupButton" : "Crea un compte gratuït"
287 "welcome.slogan" : "Crea un compte gratuït"
288} 285}
diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json
index 3fc6318a2..f0b0b7c81 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Podpora", 70 "menu.help.support" : "Podpora",
71 "menu.help.tos" : "Podmínky použití", 71 "menu.help.tos" : "Podmínky použití",
72 "menu.services" : "Služby", 72 "menu.services" : "Služby",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Přidat novou službu...", 74 "menu.services.addNewService" : "Přidat novou službu...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Zobrazení", 76 "menu.view" : "Zobrazení",
75 "menu.view.enterFullScreen" : "Spustit režim celé obrazovky", 77 "menu.view.enterFullScreen" : "Spustit režim celé obrazovky",
76 "menu.view.exitFullScreen" : "Ukončit celoobrazovkový režim", 78 "menu.view.exitFullScreen" : "Ukončit celoobrazovkový režim",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Stáhnout", 130 "settings.account.invoiceDownload" : "Stáhnout",
129 "settings.account.manageSubscription.label" : "Spravovat vaše předplatné", 131 "settings.account.manageSubscription.label" : "Spravovat vaše předplatné",
130 "settings.account.successInfo" : "Vaše změny byly uloženy", 132 "settings.account.successInfo" : "Vaše změny byly uloženy",
133 "settings.account.tryReloadServices" : "Zkusit opět",
131 "settings.account.tryReloadUserInfoRequest" : "Zkusit opět", 134 "settings.account.tryReloadUserInfoRequest" : "Zkusit opět",
132 "settings.account.userInfoRequestFailed" : "Nelze načíst informace o uživateli.", 135 "settings.account.userInfoRequestFailed" : "Nelze načíst informace o uživateli.",
133 "settings.app.buttonClearAllCache" : "Vyprázdnit mezipaměti", 136 "settings.app.buttonClearAllCache" : "Vyprázdnit mezipaměti",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Zahrnout beta verze", 143 "settings.app.form.beta" : "Zahrnout beta verze",
141 "settings.app.form.darkMode" : "Připoj se k Temné straně", 144 "settings.app.form.darkMode" : "Připoj se k Temné straně",
142 "settings.app.form.enableGPUAcceleration" : "Aktivovat GPU zrychlení", 145 "settings.app.form.enableGPUAcceleration" : "Aktivovat GPU zrychlení",
143 "settings.app.form.enableMenuBar" : "Zobraz Franz v Menu nabídce",
144 "settings.app.form.enableSpellchecking" : "Zapnout kontrolu pravopisu", 146 "settings.app.form.enableSpellchecking" : "Zapnout kontrolu pravopisu",
145 "settings.app.form.enableSystemTray" : "Zobrazit Franz v systémové liště", 147 "settings.app.form.enableSystemTray" : "Zobrazit Franz v systémové liště",
146 "settings.app.form.hideDockIcon" : "Schovej ikonu Franz v Docku",
147 "settings.app.form.language" : "Jazyk", 148 "settings.app.form.language" : "Jazyk",
148 "settings.app.form.minimizeToSystemTray" : "Minimalizovat Franz do systémové lišty", 149 "settings.app.form.minimizeToSystemTray" : "Minimalizovat Franz do systémové lišty",
149 "settings.app.form.runInBackground" : "Ponechat Franze v pozadí při zavírání okna", 150 "settings.app.form.runInBackground" : "Ponechat Franze v pozadí při zavírání okna",
150 "settings.app.form.showDisabledServices" : "Zobrazit záložky vypnutých služeb", 151 "settings.app.form.showDisabledServices" : "Zobrazit záložky vypnutých služeb",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Zobrazit odznak pro nepřečtené zprávy když jsou upozornění vypnutá", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Zobrazit odznak pro nepřečtené zprávy když jsou upozornění vypnutá",
152 "settings.app.form.spellcheckerLanguage" : "Oprava překlepů jazyka",
153 "settings.app.headline" : "Nastavení", 153 "settings.app.headline" : "Nastavení",
154 "settings.app.headlineAdvanced" : "Pokročilé", 154 "settings.app.headlineAdvanced" : "Pokročilé",
155 "settings.app.headlineAppearance" : "Vzhled", 155 "settings.app.headlineAppearance" : "Vzhled",
@@ -212,8 +212,6 @@
212 "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.",
213 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "User (optional)",
214 "settings.service.form.saveButton" : "Uložit službu", 214 "settings.service.form.saveButton" : "Uložit službu",
215 "settings.service.form.spellcheckerLanguage" : "Spell checking Language",
216 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})",
217 "settings.service.form.tabHosted" : "Hostováno", 215 "settings.service.form.tabHosted" : "Hostováno",
218 "settings.service.form.tabOnPremise" : "Samostatně hostované ⭐️", 216 "settings.service.form.tabOnPremise" : "Samostatně hostované ⭐️",
219 "settings.service.form.team" : "Tým", 217 "settings.service.form.team" : "Tým",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Objevte služby", 221 "settings.services.discoverServices" : "Objevte služby",
224 "settings.services.headline" : "Vaše služby", 222 "settings.services.headline" : "Vaše služby",
225 "settings.services.noServicesAdded" : "Doposud jste nepřidali žádné služby.", 223 "settings.services.noServicesAdded" : "Doposud jste nepřidali žádné služby.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Služba je zakázána", 225 "settings.services.tooltip.isDisabled" : "Služba je zakázána",
227 "settings.services.tooltip.isMuted" : "Všechny zvuky jsou ztišeny", 226 "settings.services.tooltip.isMuted" : "Všechny zvuky jsou ztišeny",
228 "settings.services.tooltip.notificationsDisabled" : "Oznámení jsou zakázána", 227 "settings.services.tooltip.notificationsDisabled" : "Oznámení jsou zakázána",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Pro obyvatelé EU: mohou být aplikovány lokální daně", 254 "subscription.euTaxInfo" : "Pro obyvatelé EU: mohou být aplikovány lokální daně",
256 "subscription.features.ads" : "Žádné reklamy, nikdy!", 255 "subscription.features.ads" : "Žádné reklamy, nikdy!",
257 "subscription.features.comingSoon" : "již brzy", 256 "subscription.features.comingSoon" : "již brzy",
258 "subscription.features.encryptedSync" : "Šifrovaná synchronizace relací",
259 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 257 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
260 "subscription.features.onpremise" : "Přidat hostované služby jako HipChat",
261 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 258 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
262 "subscription.features.proxy" : "Proxy support for services", 259 "subscription.features.proxy" : "Proxy support for services",
263 "subscription.features.spellchecker" : "Support for spellchecker", 260 "subscription.features.spellchecker" : "Support for spellchecker",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Obnovit", 277 "tabs.item.reload" : "Obnovit",
281 "validation.email" : "{field} není validní", 278 "validation.email" : "{field} není validní",
282 "validation.minLength" : "{field} musí být alespoň {length} znaků dlouhé", 279 "validation.minLength" : "{field} musí být alespoň {length} znaků dlouhé",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} je povinné", 281 "validation.required" : "{field} je povinné",
284 "validation.url" : "{field} není validní URL", 282 "validation.url" : "{field} není validní URL",
285 "welcome.loginButton" : "Přihlášení do vašeho účtu", 283 "welcome.loginButton" : "Přihlášení do vašeho účtu",
286 "welcome.signupButton" : "Vytvořit účet zdarma", 284 "welcome.signupButton" : "Vytvořit účet zdarma"
287 "welcome.slogan" : "Zprávy, které pracují pro vás"
288} 285}
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index 13b8d12fc..06a03db65 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -4,18 +4,18 @@
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", 7 "feature.shareFranz.action.email" : "Als E-Mail senden",
8 "feature.shareFranz.action.facebook" : "Share on Facebook", 8 "feature.shareFranz.action.facebook" : "Auf Facebook teilen",
9 "feature.shareFranz.action.twitter" : "Share on Twitter", 9 "feature.shareFranz.action.twitter" : "Auf Twitter teilen",
10 "feature.shareFranz.headline" : "Franz is better together!", 10 "feature.shareFranz.headline" : "Gemeinsam ist Franz noch besser!",
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", 11 "feature.shareFranz.shareText.email" : "Ich verwende Franz! Hol dir jetzt die kostenlose App für WhatsApp, Messenger, Slack, Skype und viele mehr auf 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", 12 "feature.shareFranz.shareText.twitter" : "Ich verwende Franz mit {count} Diensten! Hol dir jetzt die kostenlose App für WhatsApp, Messenger, Slack, Skype und mehr auf 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.", 13 "feature.shareFranz.text" : "Bitte erzähle deinen Freunden und Kollegen wie toll du Franz findest.",
14 "global.api.unhealthy" : "Verbindung mit dem Franz Online Service fehlgeschlagen", 14 "global.api.unhealthy" : "Verbindung mit dem Franz Online Service fehlgeschlagen",
15 "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})", 16 "global.spellchecker.useDefault" : "Standard benutzen ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically", 17 "global.spellchecking.autodetect" : "Sprache automatisch erkennen",
18 "global.spellchecking.autodetect.short" : "Automatic", 18 "global.spellchecking.autodetect.short" : "Automatisch",
19 "global.spellchecking.language" : "Sprache für Rechtschreibprüfung", 19 "global.spellchecking.language" : "Sprache für Rechtschreibprüfung",
20 "import.headline" : "Deine Franz 4 Dienste importieren", 20 "import.headline" : "Deine Franz 4 Dienste importieren",
21 "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",
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Hilfe", 70 "menu.help.support" : "Hilfe",
71 "menu.help.tos" : "Nutzungsbedingungen", 71 "menu.help.tos" : "Nutzungsbedingungen",
72 "menu.services" : "Dienste", 72 "menu.services" : "Dienste",
73 "menu.services.activatePreviousService" : "Vorheriger Dienst",
73 "menu.services.addNewService" : "Dienst hinzufügen", 74 "menu.services.addNewService" : "Dienst hinzufügen",
75 "menu.services.setNextServiceActive" : "Nächster Dienst",
74 "menu.view" : "Darstellung", 76 "menu.view" : "Darstellung",
75 "menu.view.enterFullScreen" : "Vollbildmodus", 77 "menu.view.enterFullScreen" : "Vollbildmodus",
76 "menu.view.exitFullScreen" : "Vollbildmodus aus", 78 "menu.view.exitFullScreen" : "Vollbildmodus aus",
@@ -85,6 +87,9 @@
85 "menu.window" : "Fenster", 87 "menu.window" : "Fenster",
86 "menu.window.close" : "Schließen", 88 "menu.window.close" : "Schließen",
87 "menu.window.minimize" : "Minimieren", 89 "menu.window.minimize" : "Minimieren",
90 "menu.workspaces": "Workspaces",
91 "menu.workspaces.defaultWorkspace": "All services",
92 "menu.workspaces.addNewWorkspace": "Add New Workspace",
88 "password.email.label" : "E-Mail Adresse", 93 "password.email.label" : "E-Mail Adresse",
89 "password.headline" : "Passwort zurücksetzen", 94 "password.headline" : "Passwort zurücksetzen",
90 "password.link.login" : "An Deinem Konto anmelden", 95 "password.link.login" : "An Deinem Konto anmelden",
@@ -128,6 +133,7 @@
128 "settings.account.invoiceDownload" : "Herunterladen", 133 "settings.account.invoiceDownload" : "Herunterladen",
129 "settings.account.manageSubscription.label" : "Dein Abonnement verwalten", 134 "settings.account.manageSubscription.label" : "Dein Abonnement verwalten",
130 "settings.account.successInfo" : "Deine Änderungen wurden gespeichert", 135 "settings.account.successInfo" : "Deine Änderungen wurden gespeichert",
136 "settings.account.tryReloadServices" : "Erneut versuchen",
131 "settings.account.tryReloadUserInfoRequest" : "Erneut versuchen", 137 "settings.account.tryReloadUserInfoRequest" : "Erneut versuchen",
132 "settings.account.userInfoRequestFailed" : "Benutzerinformationen konnten nicht geladen werden", 138 "settings.account.userInfoRequestFailed" : "Benutzerinformationen konnten nicht geladen werden",
133 "settings.app.buttonClearAllCache" : "Cache leeren", 139 "settings.app.buttonClearAllCache" : "Cache leeren",
@@ -140,16 +146,13 @@
140 "settings.app.form.beta" : "Beta-Versionen einbeziehen", 146 "settings.app.form.beta" : "Beta-Versionen einbeziehen",
141 "settings.app.form.darkMode" : "Die dunkle Seite erwartet dich (Dark Mode)", 147 "settings.app.form.darkMode" : "Die dunkle Seite erwartet dich (Dark Mode)",
142 "settings.app.form.enableGPUAcceleration" : "Hardwarebeschleunigung aktivieren", 148 "settings.app.form.enableGPUAcceleration" : "Hardwarebeschleunigung aktivieren",
143 "settings.app.form.enableMenuBar" : "Franz in Menüleiste anzeigen",
144 "settings.app.form.enableSpellchecking" : "Rechtschreibprüfung aktivieren", 149 "settings.app.form.enableSpellchecking" : "Rechtschreibprüfung aktivieren",
145 "settings.app.form.enableSystemTray" : "Franz im Infobereich anzeigen", 150 "settings.app.form.enableSystemTray" : "Franz im Infobereich anzeigen",
146 "settings.app.form.hideDockIcon" : "Franz Icon im Dock ausblenden",
147 "settings.app.form.language" : "Sprache", 151 "settings.app.form.language" : "Sprache",
148 "settings.app.form.minimizeToSystemTray" : "Franz in den Infobereich minimieren", 152 "settings.app.form.minimizeToSystemTray" : "Franz in den Infobereich minimieren",
149 "settings.app.form.runInBackground" : "Franz im Hintergrund behalten, wenn das Fenster geschlossen wird", 153 "settings.app.form.runInBackground" : "Franz im Hintergrund behalten, wenn das Fenster geschlossen wird",
150 "settings.app.form.showDisabledServices" : "Deaktivierte Services-Tabs anzeigen", 154 "settings.app.form.showDisabledServices" : "Deaktivierte Services-Tabs anzeigen",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Ungelesene Nachrichten zeigen, wenn die Benachrichtigungen deaktiviert sind", 155 "settings.app.form.showMessagesBadgesWhenMuted" : "Ungelesene Nachrichten zeigen, wenn die Benachrichtigungen deaktiviert sind",
152 "settings.app.form.spellcheckerLanguage" : "Sprache für Rechtschreibprüfung",
153 "settings.app.headline" : "Einstellungen", 156 "settings.app.headline" : "Einstellungen",
154 "settings.app.headlineAdvanced" : "Erweitert", 157 "settings.app.headlineAdvanced" : "Erweitert",
155 "settings.app.headlineAppearance" : "Darstellung", 158 "settings.app.headlineAppearance" : "Darstellung",
@@ -169,6 +172,7 @@
169 "settings.navigation.logout" : "Abmelden", 172 "settings.navigation.logout" : "Abmelden",
170 "settings.navigation.settings" : "Einstellungen", 173 "settings.navigation.settings" : "Einstellungen",
171 "settings.navigation.yourServices" : "Deine Dienste", 174 "settings.navigation.yourServices" : "Deine Dienste",
175 "settings.navigation.yourWorkspaces": "Deine Workspaces",
172 "settings.recipes.all" : "Alle Dienste", 176 "settings.recipes.all" : "Alle Dienste",
173 "settings.recipes.dev" : "Entwicklung", 177 "settings.recipes.dev" : "Entwicklung",
174 "settings.recipes.headline" : "Verfügbare Dienste", 178 "settings.recipes.headline" : "Verfügbare Dienste",
@@ -212,8 +216,6 @@
212 "settings.service.form.proxy.restartInfo" : "Bitte starte Franz nach dem Ändern der Proxy Einstellungen neu.", 216 "settings.service.form.proxy.restartInfo" : "Bitte starte Franz nach dem Ändern der Proxy Einstellungen neu.",
213 "settings.service.form.proxy.user" : "Benutzer (optional)", 217 "settings.service.form.proxy.user" : "Benutzer (optional)",
214 "settings.service.form.saveButton" : "Dienst speichern", 218 "settings.service.form.saveButton" : "Dienst speichern",
215 "settings.service.form.spellcheckerLanguage" : "Sprache für Rechtschreibprüfung",
216 "settings.service.form.spellcheckerLanguage.default" : "Standard benutzen ({default})",
217 "settings.service.form.tabHosted" : "Gehostet", 219 "settings.service.form.tabHosted" : "Gehostet",
218 "settings.service.form.tabOnPremise" : "Selbst gehostet ⭐️", 220 "settings.service.form.tabOnPremise" : "Selbst gehostet ⭐️",
219 "settings.service.form.team" : "Team", 221 "settings.service.form.team" : "Team",
@@ -223,10 +225,19 @@
223 "settings.services.discoverServices" : "Dienste entdecken", 225 "settings.services.discoverServices" : "Dienste entdecken",
224 "settings.services.headline" : "Deine Dienste", 226 "settings.services.headline" : "Deine Dienste",
225 "settings.services.noServicesAdded" : "Du hast noch keine Dienste hinzugefügt.", 227 "settings.services.noServicesAdded" : "Du hast noch keine Dienste hinzugefügt.",
228 "settings.services.servicesRequestFailed" : "Dienste konnten nicht geladen werden",
226 "settings.services.tooltip.isDisabled" : "Dienst ist deaktiviert", 229 "settings.services.tooltip.isDisabled" : "Dienst ist deaktiviert",
227 "settings.services.tooltip.isMuted" : "Alle Töne sind deaktiviert", 230 "settings.services.tooltip.isMuted" : "Alle Töne sind deaktiviert",
228 "settings.services.tooltip.notificationsDisabled" : "Benachrichtigungen deaktiviert", 231 "settings.services.tooltip.notificationsDisabled" : "Benachrichtigungen deaktiviert",
229 "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert", 232 "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert",
233 "settings.workspaces.headline": "Deine Workspaces",
234 "settings.workspace.add.form.submitButton": "Workspace erstellen",
235 "settings.workspace.add.form.name": "Name",
236 "settings.workspace.form.yourWorkspaces": "Deine Workspaces",
237 "settings.workspace.form.name": "Name",
238 "settings.workspace.form.buttonDelete": "Workspace löschen",
239 "settings.workspace.form.buttonSave": "Workspace speichern",
240 "settings.workspace.form.servicesInWorkspaceHeadline": "Services in diesem Workspace",
230 "settings.user.form.accountType.company" : "Firma", 241 "settings.user.form.accountType.company" : "Firma",
231 "settings.user.form.accountType.individual" : "Einzelperson", 242 "settings.user.form.accountType.individual" : "Einzelperson",
232 "settings.user.form.accountType.label" : "Konto-Typ", 243 "settings.user.form.accountType.label" : "Konto-Typ",
@@ -255,9 +266,7 @@
255 "subscription.euTaxInfo" : "Preise sind exklusive Steuern.", 266 "subscription.euTaxInfo" : "Preise sind exklusive Steuern.",
256 "subscription.features.ads" : "Werbefrei auf Lebenszeit!", 267 "subscription.features.ads" : "Werbefrei auf Lebenszeit!",
257 "subscription.features.comingSoon" : "folgt bald", 268 "subscription.features.comingSoon" : "folgt bald",
258 "subscription.features.encryptedSync" : "Verschlüsselte Sitzungs-Synchronisation",
259 "subscription.features.noInterruptions" : "Keine Wartezeiten um Franz zu verwenden", 269 "subscription.features.noInterruptions" : "Keine Wartezeiten um Franz zu verwenden",
260 "subscription.features.onpremise" : "Integration von gehosteten Diensten, wie HipChat",
261 "subscription.features.onpremise.mattermost" : "Integration von gehosteten Diensten, wie Mattermost", 270 "subscription.features.onpremise.mattermost" : "Integration von gehosteten Diensten, wie Mattermost",
262 "subscription.features.proxy" : "Proxy Support für Dienste", 271 "subscription.features.proxy" : "Proxy Support für Dienste",
263 "subscription.features.spellchecker" : "Unterstützung für Rechtschreibprüfung", 272 "subscription.features.spellchecker" : "Unterstützung für Rechtschreibprüfung",
@@ -280,9 +289,9 @@
280 "tabs.item.reload" : "Neuladen", 289 "tabs.item.reload" : "Neuladen",
281 "validation.email" : "{field} ist ungültig", 290 "validation.email" : "{field} ist ungültig",
282 "validation.minLength" : "{field} muss mindestens {length} Zeichen enthalten", 291 "validation.minLength" : "{field} muss mindestens {length} Zeichen enthalten",
292 "validation.oneRequired" : "Mindestens ein Wert wird benötigt",
283 "validation.required" : "{field} wird benötigt", 293 "validation.required" : "{field} wird benötigt",
284 "validation.url" : "{field} ist keine gültige URL", 294 "validation.url" : "{field} ist keine gültige URL",
285 "welcome.loginButton" : "Bei Franz einloggen", 295 "welcome.loginButton" : "Bei Franz einloggen",
286 "welcome.signupButton" : "Kostenloses Konto erstellen", 296 "welcome.signupButton" : "Kostenloses Konto erstellen"
287 "welcome.slogan" : "Kommunikation, die für Dich funktioniert"
288} 297}
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index fcd24c7ef..698698515 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -625,78 +625,78 @@
625 "defaultMessage": "!!!Your services have been updated.", 625 "defaultMessage": "!!!Your services have been updated.",
626 "end": { 626 "end": {
627 "column": 3, 627 "column": 3,
628 "line": 26 628 "line": 29
629 }, 629 },
630 "file": "src/components/layout/AppLayout.js", 630 "file": "src/components/layout/AppLayout.js",
631 "id": "infobar.servicesUpdated", 631 "id": "infobar.servicesUpdated",
632 "start": { 632 "start": {
633 "column": 19, 633 "column": 19,
634 "line": 23 634 "line": 26
635 } 635 }
636 }, 636 },
637 { 637 {
638 "defaultMessage": "!!!A new update for Franz is available.", 638 "defaultMessage": "!!!A new update for Franz is available.",
639 "end": { 639 "end": {
640 "column": 3, 640 "column": 3,
641 "line": 30 641 "line": 33
642 }, 642 },
643 "file": "src/components/layout/AppLayout.js", 643 "file": "src/components/layout/AppLayout.js",
644 "id": "infobar.updateAvailable", 644 "id": "infobar.updateAvailable",
645 "start": { 645 "start": {
646 "column": 19, 646 "column": 19,
647 "line": 27 647 "line": 30
648 } 648 }
649 }, 649 },
650 { 650 {
651 "defaultMessage": "!!!Reload services", 651 "defaultMessage": "!!!Reload services",
652 "end": { 652 "end": {
653 "column": 3, 653 "column": 3,
654 "line": 34 654 "line": 37
655 }, 655 },
656 "file": "src/components/layout/AppLayout.js", 656 "file": "src/components/layout/AppLayout.js",
657 "id": "infobar.buttonReloadServices", 657 "id": "infobar.buttonReloadServices",
658 "start": { 658 "start": {
659 "column": 24, 659 "column": 24,
660 "line": 31 660 "line": 34
661 } 661 }
662 }, 662 },
663 { 663 {
664 "defaultMessage": "!!!Changelog", 664 "defaultMessage": "!!!Changelog",
665 "end": { 665 "end": {
666 "column": 3, 666 "column": 3,
667 "line": 38 667 "line": 41
668 }, 668 },
669 "file": "src/components/layout/AppLayout.js", 669 "file": "src/components/layout/AppLayout.js",
670 "id": "infobar.buttonChangelog", 670 "id": "infobar.buttonChangelog",
671 "start": { 671 "start": {
672 "column": 13, 672 "column": 13,
673 "line": 35 673 "line": 38
674 } 674 }
675 }, 675 },
676 { 676 {
677 "defaultMessage": "!!!Restart & install update", 677 "defaultMessage": "!!!Restart & install update",
678 "end": { 678 "end": {
679 "column": 3, 679 "column": 3,
680 "line": 42 680 "line": 45
681 }, 681 },
682 "file": "src/components/layout/AppLayout.js", 682 "file": "src/components/layout/AppLayout.js",
683 "id": "infobar.buttonInstallUpdate", 683 "id": "infobar.buttonInstallUpdate",
684 "start": { 684 "start": {
685 "column": 23, 685 "column": 23,
686 "line": 39 686 "line": 42
687 } 687 }
688 }, 688 },
689 { 689 {
690 "defaultMessage": "!!!Could not load services and user information", 690 "defaultMessage": "!!!Could not load services and user information",
691 "end": { 691 "end": {
692 "column": 3, 692 "column": 3,
693 "line": 46 693 "line": 49
694 }, 694 },
695 "file": "src/components/layout/AppLayout.js", 695 "file": "src/components/layout/AppLayout.js",
696 "id": "infobar.requiredRequestsFailed", 696 "id": "infobar.requiredRequestsFailed",
697 "start": { 697 "start": {
698 "column": 26, 698 "column": 26,
699 "line": 43 699 "line": 46
700 } 700 }
701 } 701 }
702 ], 702 ],
@@ -708,52 +708,78 @@
708 "defaultMessage": "!!!Settings", 708 "defaultMessage": "!!!Settings",
709 "end": { 709 "end": {
710 "column": 3, 710 "column": 3,
711 "line": 14 711 "line": 16
712 }, 712 },
713 "file": "src/components/layout/Sidebar.js", 713 "file": "src/components/layout/Sidebar.js",
714 "id": "sidebar.settings", 714 "id": "sidebar.settings",
715 "start": { 715 "start": {
716 "column": 12, 716 "column": 12,
717 "line": 11 717 "line": 13
718 } 718 }
719 }, 719 },
720 { 720 {
721 "defaultMessage": "!!!Add new service", 721 "defaultMessage": "!!!Add new service",
722 "end": { 722 "end": {
723 "column": 3, 723 "column": 3,
724 "line": 18 724 "line": 20
725 }, 725 },
726 "file": "src/components/layout/Sidebar.js", 726 "file": "src/components/layout/Sidebar.js",
727 "id": "sidebar.addNewService", 727 "id": "sidebar.addNewService",
728 "start": { 728 "start": {
729 "column": 17, 729 "column": 17,
730 "line": 15 730 "line": 17
731 } 731 }
732 }, 732 },
733 { 733 {
734 "defaultMessage": "!!!Disable notifications & audio", 734 "defaultMessage": "!!!Disable notifications & audio",
735 "end": { 735 "end": {
736 "column": 3, 736 "column": 3,
737 "line": 22 737 "line": 24
738 }, 738 },
739 "file": "src/components/layout/Sidebar.js", 739 "file": "src/components/layout/Sidebar.js",
740 "id": "sidebar.muteApp", 740 "id": "sidebar.muteApp",
741 "start": { 741 "start": {
742 "column": 8, 742 "column": 8,
743 "line": 19 743 "line": 21
744 } 744 }
745 }, 745 },
746 { 746 {
747 "defaultMessage": "!!!Enable notifications & audio", 747 "defaultMessage": "!!!Enable notifications & audio",
748 "end": { 748 "end": {
749 "column": 3, 749 "column": 3,
750 "line": 26 750 "line": 28
751 }, 751 },
752 "file": "src/components/layout/Sidebar.js", 752 "file": "src/components/layout/Sidebar.js",
753 "id": "sidebar.unmuteApp", 753 "id": "sidebar.unmuteApp",
754 "start": { 754 "start": {
755 "column": 10, 755 "column": 10,
756 "line": 23 756 "line": 25
757 }
758 },
759 {
760 "defaultMessage": "!!!Open workspace drawer",
761 "end": {
762 "column": 3,
763 "line": 32
764 },
765 "file": "src/components/layout/Sidebar.js",
766 "id": "sidebar.openWorkspaceDrawer",
767 "start": {
768 "column": 23,
769 "line": 29
770 }
771 },
772 {
773 "defaultMessage": "!!!Close workspace drawer",
774 "end": {
775 "column": 3,
776 "line": 36
777 },
778 "file": "src/components/layout/Sidebar.js",
779 "id": "sidebar.closeWorkspaceDrawer",
780 "start": {
781 "column": 24,
782 "line": 33
757 } 783 }
758 } 784 }
759 ], 785 ],
@@ -1276,78 +1302,91 @@
1276 "defaultMessage": "!!!Available services", 1302 "defaultMessage": "!!!Available services",
1277 "end": { 1303 "end": {
1278 "column": 3, 1304 "column": 3,
1279 "line": 12 1305 "line": 15
1280 }, 1306 },
1281 "file": "src/components/settings/navigation/SettingsNavigation.js", 1307 "file": "src/components/settings/navigation/SettingsNavigation.js",
1282 "id": "settings.navigation.availableServices", 1308 "id": "settings.navigation.availableServices",
1283 "start": { 1309 "start": {
1284 "column": 21, 1310 "column": 21,
1285 "line": 9 1311 "line": 12
1286 } 1312 }
1287 }, 1313 },
1288 { 1314 {
1289 "defaultMessage": "!!!Your services", 1315 "defaultMessage": "!!!Your services",
1290 "end": { 1316 "end": {
1291 "column": 3, 1317 "column": 3,
1292 "line": 16 1318 "line": 19
1293 }, 1319 },
1294 "file": "src/components/settings/navigation/SettingsNavigation.js", 1320 "file": "src/components/settings/navigation/SettingsNavigation.js",
1295 "id": "settings.navigation.yourServices", 1321 "id": "settings.navigation.yourServices",
1296 "start": { 1322 "start": {
1297 "column": 16, 1323 "column": 16,
1298 "line": 13 1324 "line": 16
1299 } 1325 }
1300 }, 1326 },
1301 { 1327 {
1302 "defaultMessage": "!!!Account", 1328 "defaultMessage": "!!!Your workspaces",
1303 "end": { 1329 "end": {
1304 "column": 3, 1330 "column": 3,
1331 "line": 23
1332 },
1333 "file": "src/components/settings/navigation/SettingsNavigation.js",
1334 "id": "settings.navigation.yourWorkspaces",
1335 "start": {
1336 "column": 18,
1305 "line": 20 1337 "line": 20
1338 }
1339 },
1340 {
1341 "defaultMessage": "!!!Account",
1342 "end": {
1343 "column": 3,
1344 "line": 27
1306 }, 1345 },
1307 "file": "src/components/settings/navigation/SettingsNavigation.js", 1346 "file": "src/components/settings/navigation/SettingsNavigation.js",
1308 "id": "settings.navigation.account", 1347 "id": "settings.navigation.account",
1309 "start": { 1348 "start": {
1310 "column": 11, 1349 "column": 11,
1311 "line": 17 1350 "line": 24
1312 } 1351 }
1313 }, 1352 },
1314 { 1353 {
1315 "defaultMessage": "!!!Settings", 1354 "defaultMessage": "!!!Settings",
1316 "end": { 1355 "end": {
1317 "column": 3, 1356 "column": 3,
1318 "line": 24 1357 "line": 31
1319 }, 1358 },
1320 "file": "src/components/settings/navigation/SettingsNavigation.js", 1359 "file": "src/components/settings/navigation/SettingsNavigation.js",
1321 "id": "settings.navigation.settings", 1360 "id": "settings.navigation.settings",
1322 "start": { 1361 "start": {
1323 "column": 12, 1362 "column": 12,
1324 "line": 21 1363 "line": 28
1325 } 1364 }
1326 }, 1365 },
1327 { 1366 {
1328 "defaultMessage": "!!!Invite Friends", 1367 "defaultMessage": "!!!Invite Friends",
1329 "end": { 1368 "end": {
1330 "column": 3, 1369 "column": 3,
1331 "line": 28 1370 "line": 35
1332 }, 1371 },
1333 "file": "src/components/settings/navigation/SettingsNavigation.js", 1372 "file": "src/components/settings/navigation/SettingsNavigation.js",
1334 "id": "settings.navigation.inviteFriends", 1373 "id": "settings.navigation.inviteFriends",
1335 "start": { 1374 "start": {
1336 "column": 17, 1375 "column": 17,
1337 "line": 25 1376 "line": 32
1338 } 1377 }
1339 }, 1378 },
1340 { 1379 {
1341 "defaultMessage": "!!!Logout", 1380 "defaultMessage": "!!!Logout",
1342 "end": { 1381 "end": {
1343 "column": 3, 1382 "column": 3,
1344 "line": 32 1383 "line": 39
1345 }, 1384 },
1346 "file": "src/components/settings/navigation/SettingsNavigation.js", 1385 "file": "src/components/settings/navigation/SettingsNavigation.js",
1347 "id": "settings.navigation.logout", 1386 "id": "settings.navigation.logout",
1348 "start": { 1387 "start": {
1349 "column": 10, 1388 "column": 10,
1350 "line": 29 1389 "line": 36
1351 } 1390 }
1352 } 1391 }
1353 ], 1392 ],
@@ -2496,13 +2535,13 @@
2496 "defaultMessage": "!!!Upgrade account", 2535 "defaultMessage": "!!!Upgrade account",
2497 "end": { 2536 "end": {
2498 "column": 3, 2537 "column": 3,
2499 "line": 17 2538 "line": 18
2500 }, 2539 },
2501 "file": "src/components/ui/PremiumFeatureContainer/index.js", 2540 "file": "src/components/ui/PremiumFeatureContainer/index.js",
2502 "id": "premiumFeature.button.upgradeAccount", 2541 "id": "premiumFeature.button.upgradeAccount",
2503 "start": { 2542 "start": {
2504 "column": 10, 2543 "column": 10,
2505 "line": 14 2544 "line": 15
2506 } 2545 }
2507 } 2546 }
2508 ], 2547 ],
@@ -2511,6 +2550,24 @@
2511 { 2550 {
2512 "descriptors": [ 2551 "descriptors": [
2513 { 2552 {
2553 "defaultMessage": "!!!Loading",
2554 "end": {
2555 "column": 3,
2556 "line": 14
2557 },
2558 "file": "src/components/ui/WebviewLoader/index.js",
2559 "id": "service.webviewLoader.loading",
2560 "start": {
2561 "column": 11,
2562 "line": 11
2563 }
2564 }
2565 ],
2566 "path": "src/components/ui/WebviewLoader/index.json"
2567 },
2568 {
2569 "descriptors": [
2570 {
2514 "defaultMessage": "!!!Something went wrong.", 2571 "defaultMessage": "!!!Something went wrong.",
2515 "end": { 2572 "end": {
2516 "column": 3, 2573 "column": 3,
@@ -3165,7 +3222,7 @@
3165 } 3222 }
3166 }, 3223 },
3167 { 3224 {
3168 "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", 3225 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger",
3169 "end": { 3226 "end": {
3170 "column": 3, 3227 "column": 3,
3171 "line": 42 3228 "line": 42
@@ -3183,6 +3240,374 @@
3183 { 3240 {
3184 "descriptors": [ 3241 "descriptors": [
3185 { 3242 {
3243 "defaultMessage": "!!!Create workspace",
3244 "end": {
3245 "column": 3,
3246 "line": 16
3247 },
3248 "file": "src/features/workspaces/components/CreateWorkspaceForm.js",
3249 "id": "settings.workspace.add.form.submitButton",
3250 "start": {
3251 "column": 16,
3252 "line": 13
3253 }
3254 },
3255 {
3256 "defaultMessage": "!!!Name",
3257 "end": {
3258 "column": 3,
3259 "line": 20
3260 },
3261 "file": "src/features/workspaces/components/CreateWorkspaceForm.js",
3262 "id": "settings.workspace.add.form.name",
3263 "start": {
3264 "column": 8,
3265 "line": 17
3266 }
3267 }
3268 ],
3269 "path": "src/features/workspaces/components/CreateWorkspaceForm.json"
3270 },
3271 {
3272 "descriptors": [
3273 {
3274 "defaultMessage": "!!!Delete workspace",
3275 "end": {
3276 "column": 3,
3277 "line": 22
3278 },
3279 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3280 "id": "settings.workspace.form.buttonDelete",
3281 "start": {
3282 "column": 16,
3283 "line": 19
3284 }
3285 },
3286 {
3287 "defaultMessage": "!!!Save workspace",
3288 "end": {
3289 "column": 3,
3290 "line": 26
3291 },
3292 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3293 "id": "settings.workspace.form.buttonSave",
3294 "start": {
3295 "column": 14,
3296 "line": 23
3297 }
3298 },
3299 {
3300 "defaultMessage": "!!!Name",
3301 "end": {
3302 "column": 3,
3303 "line": 30
3304 },
3305 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3306 "id": "settings.workspace.form.name",
3307 "start": {
3308 "column": 8,
3309 "line": 27
3310 }
3311 },
3312 {
3313 "defaultMessage": "!!!Your workspaces",
3314 "end": {
3315 "column": 3,
3316 "line": 34
3317 },
3318 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3319 "id": "settings.workspace.form.yourWorkspaces",
3320 "start": {
3321 "column": 18,
3322 "line": 31
3323 }
3324 },
3325 {
3326 "defaultMessage": "!!!Services in this Workspace",
3327 "end": {
3328 "column": 3,
3329 "line": 38
3330 },
3331 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3332 "id": "settings.workspace.form.servicesInWorkspaceHeadline",
3333 "start": {
3334 "column": 31,
3335 "line": 35
3336 }
3337 }
3338 ],
3339 "path": "src/features/workspaces/components/EditWorkspaceForm.json"
3340 },
3341 {
3342 "descriptors": [
3343 {
3344 "defaultMessage": "!!!Workspaces",
3345 "end": {
3346 "column": 3,
3347 "line": 19
3348 },
3349 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3350 "id": "workspaceDrawer.headline",
3351 "start": {
3352 "column": 12,
3353 "line": 16
3354 }
3355 },
3356 {
3357 "defaultMessage": "!!!All services",
3358 "end": {
3359 "column": 3,
3360 "line": 23
3361 },
3362 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3363 "id": "workspaceDrawer.allServices",
3364 "start": {
3365 "column": 15,
3366 "line": 20
3367 }
3368 },
3369 {
3370 "defaultMessage": "!!!Workspaces settings",
3371 "end": {
3372 "column": 3,
3373 "line": 27
3374 },
3375 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3376 "id": "workspaceDrawer.workspacesSettingsTooltip",
3377 "start": {
3378 "column": 29,
3379 "line": 24
3380 }
3381 },
3382 {
3383 "defaultMessage": "!!!Info about workspace feature",
3384 "end": {
3385 "column": 3,
3386 "line": 31
3387 },
3388 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3389 "id": "workspaceDrawer.workspaceFeatureInfo",
3390 "start": {
3391 "column": 24,
3392 "line": 28
3393 }
3394 },
3395 {
3396 "defaultMessage": "!!!Create your first workspace",
3397 "end": {
3398 "column": 3,
3399 "line": 35
3400 },
3401 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3402 "id": "workspaceDrawer.premiumCtaButtonLabel",
3403 "start": {
3404 "column": 25,
3405 "line": 32
3406 }
3407 },
3408 {
3409 "defaultMessage": "!!!Reactivate premium account",
3410 "end": {
3411 "column": 3,
3412 "line": 39
3413 },
3414 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3415 "id": "workspaceDrawer.reactivatePremiumAccountLabel",
3416 "start": {
3417 "column": 28,
3418 "line": 36
3419 }
3420 },
3421 {
3422 "defaultMessage": "!!!add new workspace",
3423 "end": {
3424 "column": 3,
3425 "line": 43
3426 },
3427 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3428 "id": "workspaceDrawer.addNewWorkspaceLabel",
3429 "start": {
3430 "column": 24,
3431 "line": 40
3432 }
3433 },
3434 {
3435 "defaultMessage": "!!!Premium feature",
3436 "end": {
3437 "column": 3,
3438 "line": 47
3439 },
3440 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
3441 "id": "workspaceDrawer.proFeatureBadge",
3442 "start": {
3443 "column": 23,
3444 "line": 44
3445 }
3446 }
3447 ],
3448 "path": "src/features/workspaces/components/WorkspaceDrawer.json"
3449 },
3450 {
3451 "descriptors": [
3452 {
3453 "defaultMessage": "!!!No services added yet",
3454 "end": {
3455 "column": 3,
3456 "line": 15
3457 },
3458 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js",
3459 "id": "workspaceDrawer.item.noServicesAddedYet",
3460 "start": {
3461 "column": 22,
3462 "line": 12
3463 }
3464 },
3465 {
3466 "defaultMessage": "!!!edit",
3467 "end": {
3468 "column": 3,
3469 "line": 19
3470 },
3471 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js",
3472 "id": "workspaceDrawer.item.contextMenuEdit",
3473 "start": {
3474 "column": 19,
3475 "line": 16
3476 }
3477 }
3478 ],
3479 "path": "src/features/workspaces/components/WorkspaceDrawerItem.json"
3480 },
3481 {
3482 "descriptors": [
3483 {
3484 "defaultMessage": "!!!Your workspaces",
3485 "end": {
3486 "column": 3,
3487 "line": 20
3488 },
3489 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3490 "id": "settings.workspaces.headline",
3491 "start": {
3492 "column": 12,
3493 "line": 17
3494 }
3495 },
3496 {
3497 "defaultMessage": "!!!You haven't added any workspaces yet.",
3498 "end": {
3499 "column": 3,
3500 "line": 24
3501 },
3502 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3503 "id": "settings.workspaces.noWorkspacesAdded",
3504 "start": {
3505 "column": 19,
3506 "line": 21
3507 }
3508 },
3509 {
3510 "defaultMessage": "!!!Could not load your workspaces",
3511 "end": {
3512 "column": 3,
3513 "line": 28
3514 },
3515 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3516 "id": "settings.workspaces.workspacesRequestFailed",
3517 "start": {
3518 "column": 27,
3519 "line": 25
3520 }
3521 },
3522 {
3523 "defaultMessage": "!!!Try again",
3524 "end": {
3525 "column": 3,
3526 "line": 32
3527 },
3528 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3529 "id": "settings.workspaces.tryReloadWorkspaces",
3530 "start": {
3531 "column": 23,
3532 "line": 29
3533 }
3534 },
3535 {
3536 "defaultMessage": "!!!Your changes have been saved",
3537 "end": {
3538 "column": 3,
3539 "line": 36
3540 },
3541 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3542 "id": "settings.workspaces.updatedInfo",
3543 "start": {
3544 "column": 15,
3545 "line": 33
3546 }
3547 },
3548 {
3549 "defaultMessage": "!!!Workspace has been deleted",
3550 "end": {
3551 "column": 3,
3552 "line": 40
3553 },
3554 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3555 "id": "settings.workspaces.deletedInfo",
3556 "start": {
3557 "column": 15,
3558 "line": 37
3559 }
3560 },
3561 {
3562 "defaultMessage": "!!!Info about workspace feature",
3563 "end": {
3564 "column": 3,
3565 "line": 44
3566 },
3567 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3568 "id": "settings.workspaces.workspaceFeatureInfo",
3569 "start": {
3570 "column": 24,
3571 "line": 41
3572 }
3573 },
3574 {
3575 "defaultMessage": "!!!Less is More: Introducing Franz Workspaces",
3576 "end": {
3577 "column": 3,
3578 "line": 48
3579 },
3580 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3581 "id": "settings.workspaces.workspaceFeatureHeadline",
3582 "start": {
3583 "column": 28,
3584 "line": 45
3585 }
3586 }
3587 ],
3588 "path": "src/features/workspaces/components/WorkspacesDashboard.json"
3589 },
3590 {
3591 "descriptors": [
3592 {
3593 "defaultMessage": "!!!Switching to",
3594 "end": {
3595 "column": 3,
3596 "line": 15
3597 },
3598 "file": "src/features/workspaces/components/WorkspaceSwitchingIndicator.js",
3599 "id": "workspaces.switchingIndicator.switchingTo",
3600 "start": {
3601 "column": 15,
3602 "line": 12
3603 }
3604 }
3605 ],
3606 "path": "src/features/workspaces/components/WorkspaceSwitchingIndicator.json"
3607 },
3608 {
3609 "descriptors": [
3610 {
3186 "defaultMessage": "!!!Field is required", 3611 "defaultMessage": "!!!Field is required",
3187 "end": { 3612 "end": {
3188 "column": 3, 3613 "column": 3,
@@ -3339,624 +3764,689 @@
3339 "defaultMessage": "!!!Edit", 3764 "defaultMessage": "!!!Edit",
3340 "end": { 3765 "end": {
3341 "column": 3, 3766 "column": 3,
3342 "line": 13 3767 "line": 16
3343 }, 3768 },
3344 "file": "src/lib/Menu.js", 3769 "file": "src/lib/Menu.js",
3345 "id": "menu.edit", 3770 "id": "menu.edit",
3346 "start": { 3771 "start": {
3347 "column": 8, 3772 "column": 8,
3348 "line": 10 3773 "line": 13
3349 } 3774 }
3350 }, 3775 },
3351 { 3776 {
3352 "defaultMessage": "!!!Undo", 3777 "defaultMessage": "!!!Undo",
3353 "end": { 3778 "end": {
3354 "column": 3, 3779 "column": 3,
3355 "line": 17 3780 "line": 20
3356 }, 3781 },
3357 "file": "src/lib/Menu.js", 3782 "file": "src/lib/Menu.js",
3358 "id": "menu.edit.undo", 3783 "id": "menu.edit.undo",
3359 "start": { 3784 "start": {
3360 "column": 8, 3785 "column": 8,
3361 "line": 14 3786 "line": 17
3362 } 3787 }
3363 }, 3788 },
3364 { 3789 {
3365 "defaultMessage": "!!!Redo", 3790 "defaultMessage": "!!!Redo",
3366 "end": { 3791 "end": {
3367 "column": 3, 3792 "column": 3,
3368 "line": 21 3793 "line": 24
3369 }, 3794 },
3370 "file": "src/lib/Menu.js", 3795 "file": "src/lib/Menu.js",
3371 "id": "menu.edit.redo", 3796 "id": "menu.edit.redo",
3372 "start": { 3797 "start": {
3373 "column": 8, 3798 "column": 8,
3374 "line": 18 3799 "line": 21
3375 } 3800 }
3376 }, 3801 },
3377 { 3802 {
3378 "defaultMessage": "!!!Cut", 3803 "defaultMessage": "!!!Cut",
3379 "end": { 3804 "end": {
3380 "column": 3, 3805 "column": 3,
3381 "line": 25 3806 "line": 28
3382 }, 3807 },
3383 "file": "src/lib/Menu.js", 3808 "file": "src/lib/Menu.js",
3384 "id": "menu.edit.cut", 3809 "id": "menu.edit.cut",
3385 "start": { 3810 "start": {
3386 "column": 7, 3811 "column": 7,
3387 "line": 22 3812 "line": 25
3388 } 3813 }
3389 }, 3814 },
3390 { 3815 {
3391 "defaultMessage": "!!!Copy", 3816 "defaultMessage": "!!!Copy",
3392 "end": { 3817 "end": {
3393 "column": 3, 3818 "column": 3,
3394 "line": 29 3819 "line": 32
3395 }, 3820 },
3396 "file": "src/lib/Menu.js", 3821 "file": "src/lib/Menu.js",
3397 "id": "menu.edit.copy", 3822 "id": "menu.edit.copy",
3398 "start": { 3823 "start": {
3399 "column": 8, 3824 "column": 8,
3400 "line": 26 3825 "line": 29
3401 } 3826 }
3402 }, 3827 },
3403 { 3828 {
3404 "defaultMessage": "!!!Paste", 3829 "defaultMessage": "!!!Paste",
3405 "end": { 3830 "end": {
3406 "column": 3, 3831 "column": 3,
3407 "line": 33 3832 "line": 36
3408 }, 3833 },
3409 "file": "src/lib/Menu.js", 3834 "file": "src/lib/Menu.js",
3410 "id": "menu.edit.paste", 3835 "id": "menu.edit.paste",
3411 "start": { 3836 "start": {
3412 "column": 9, 3837 "column": 9,
3413 "line": 30 3838 "line": 33
3414 } 3839 }
3415 }, 3840 },
3416 { 3841 {
3417 "defaultMessage": "!!!Paste And Match Style", 3842 "defaultMessage": "!!!Paste And Match Style",
3418 "end": { 3843 "end": {
3419 "column": 3, 3844 "column": 3,
3420 "line": 37 3845 "line": 40
3421 }, 3846 },
3422 "file": "src/lib/Menu.js", 3847 "file": "src/lib/Menu.js",
3423 "id": "menu.edit.pasteAndMatchStyle", 3848 "id": "menu.edit.pasteAndMatchStyle",
3424 "start": { 3849 "start": {
3425 "column": 22, 3850 "column": 22,
3426 "line": 34 3851 "line": 37
3427 } 3852 }
3428 }, 3853 },
3429 { 3854 {
3430 "defaultMessage": "!!!Delete", 3855 "defaultMessage": "!!!Delete",
3431 "end": { 3856 "end": {
3432 "column": 3, 3857 "column": 3,
3433 "line": 41 3858 "line": 44
3434 }, 3859 },
3435 "file": "src/lib/Menu.js", 3860 "file": "src/lib/Menu.js",
3436 "id": "menu.edit.delete", 3861 "id": "menu.edit.delete",
3437 "start": { 3862 "start": {
3438 "column": 10, 3863 "column": 10,
3439 "line": 38 3864 "line": 41
3440 } 3865 }
3441 }, 3866 },
3442 { 3867 {
3443 "defaultMessage": "!!!Select All", 3868 "defaultMessage": "!!!Select All",
3444 "end": { 3869 "end": {
3445 "column": 3, 3870 "column": 3,
3446 "line": 45 3871 "line": 48
3447 }, 3872 },
3448 "file": "src/lib/Menu.js", 3873 "file": "src/lib/Menu.js",
3449 "id": "menu.edit.selectAll", 3874 "id": "menu.edit.selectAll",
3450 "start": { 3875 "start": {
3451 "column": 13, 3876 "column": 13,
3452 "line": 42 3877 "line": 45
3453 } 3878 }
3454 }, 3879 },
3455 { 3880 {
3456 "defaultMessage": "!!!Speech", 3881 "defaultMessage": "!!!Speech",
3457 "end": { 3882 "end": {
3458 "column": 3, 3883 "column": 3,
3459 "line": 49 3884 "line": 52
3460 }, 3885 },
3461 "file": "src/lib/Menu.js", 3886 "file": "src/lib/Menu.js",
3462 "id": "menu.edit.speech", 3887 "id": "menu.edit.speech",
3463 "start": { 3888 "start": {
3464 "column": 10, 3889 "column": 10,
3465 "line": 46 3890 "line": 49
3466 } 3891 }
3467 }, 3892 },
3468 { 3893 {
3469 "defaultMessage": "!!!Start Speaking", 3894 "defaultMessage": "!!!Start Speaking",
3470 "end": { 3895 "end": {
3471 "column": 3, 3896 "column": 3,
3472 "line": 53 3897 "line": 56
3473 }, 3898 },
3474 "file": "src/lib/Menu.js", 3899 "file": "src/lib/Menu.js",
3475 "id": "menu.edit.startSpeaking", 3900 "id": "menu.edit.startSpeaking",
3476 "start": { 3901 "start": {
3477 "column": 17, 3902 "column": 17,
3478 "line": 50 3903 "line": 53
3479 } 3904 }
3480 }, 3905 },
3481 { 3906 {
3482 "defaultMessage": "!!!Stop Speaking", 3907 "defaultMessage": "!!!Stop Speaking",
3483 "end": { 3908 "end": {
3484 "column": 3, 3909 "column": 3,
3485 "line": 57 3910 "line": 60
3486 }, 3911 },
3487 "file": "src/lib/Menu.js", 3912 "file": "src/lib/Menu.js",
3488 "id": "menu.edit.stopSpeaking", 3913 "id": "menu.edit.stopSpeaking",
3489 "start": { 3914 "start": {
3490 "column": 16, 3915 "column": 16,
3491 "line": 54 3916 "line": 57
3492 } 3917 }
3493 }, 3918 },
3494 { 3919 {
3495 "defaultMessage": "!!!Start Dictation", 3920 "defaultMessage": "!!!Start Dictation",
3496 "end": { 3921 "end": {
3497 "column": 3, 3922 "column": 3,
3498 "line": 61 3923 "line": 64
3499 }, 3924 },
3500 "file": "src/lib/Menu.js", 3925 "file": "src/lib/Menu.js",
3501 "id": "menu.edit.startDictation", 3926 "id": "menu.edit.startDictation",
3502 "start": { 3927 "start": {
3503 "column": 18, 3928 "column": 18,
3504 "line": 58 3929 "line": 61
3505 } 3930 }
3506 }, 3931 },
3507 { 3932 {
3508 "defaultMessage": "!!!Emoji & Symbols", 3933 "defaultMessage": "!!!Emoji & Symbols",
3509 "end": { 3934 "end": {
3510 "column": 3, 3935 "column": 3,
3511 "line": 65 3936 "line": 68
3512 }, 3937 },
3513 "file": "src/lib/Menu.js", 3938 "file": "src/lib/Menu.js",
3514 "id": "menu.edit.emojiSymbols", 3939 "id": "menu.edit.emojiSymbols",
3515 "start": { 3940 "start": {
3516 "column": 16, 3941 "column": 16,
3517 "line": 62 3942 "line": 65
3518 } 3943 }
3519 }, 3944 },
3520 { 3945 {
3521 "defaultMessage": "!!!Actual Size", 3946 "defaultMessage": "!!!Actual Size",
3522 "end": { 3947 "end": {
3523 "column": 3, 3948 "column": 3,
3524 "line": 69 3949 "line": 72
3525 }, 3950 },
3526 "file": "src/lib/Menu.js", 3951 "file": "src/lib/Menu.js",
3527 "id": "menu.view.resetZoom", 3952 "id": "menu.view.resetZoom",
3528 "start": { 3953 "start": {
3529 "column": 13, 3954 "column": 13,
3530 "line": 66 3955 "line": 69
3531 } 3956 }
3532 }, 3957 },
3533 { 3958 {
3534 "defaultMessage": "!!!Zoom In", 3959 "defaultMessage": "!!!Zoom In",
3535 "end": { 3960 "end": {
3536 "column": 3, 3961 "column": 3,
3537 "line": 73 3962 "line": 76
3538 }, 3963 },
3539 "file": "src/lib/Menu.js", 3964 "file": "src/lib/Menu.js",
3540 "id": "menu.view.zoomIn", 3965 "id": "menu.view.zoomIn",
3541 "start": { 3966 "start": {
3542 "column": 10, 3967 "column": 10,
3543 "line": 70 3968 "line": 73
3544 } 3969 }
3545 }, 3970 },
3546 { 3971 {
3547 "defaultMessage": "!!!Zoom Out", 3972 "defaultMessage": "!!!Zoom Out",
3548 "end": { 3973 "end": {
3549 "column": 3, 3974 "column": 3,
3550 "line": 77 3975 "line": 80
3551 }, 3976 },
3552 "file": "src/lib/Menu.js", 3977 "file": "src/lib/Menu.js",
3553 "id": "menu.view.zoomOut", 3978 "id": "menu.view.zoomOut",
3554 "start": { 3979 "start": {
3555 "column": 11, 3980 "column": 11,
3556 "line": 74 3981 "line": 77
3557 } 3982 }
3558 }, 3983 },
3559 { 3984 {
3560 "defaultMessage": "!!!Enter Full Screen", 3985 "defaultMessage": "!!!Enter Full Screen",
3561 "end": { 3986 "end": {
3562 "column": 3, 3987 "column": 3,
3563 "line": 81 3988 "line": 84
3564 }, 3989 },
3565 "file": "src/lib/Menu.js", 3990 "file": "src/lib/Menu.js",
3566 "id": "menu.view.enterFullScreen", 3991 "id": "menu.view.enterFullScreen",
3567 "start": { 3992 "start": {
3568 "column": 19, 3993 "column": 19,
3569 "line": 78 3994 "line": 81
3570 } 3995 }
3571 }, 3996 },
3572 { 3997 {
3573 "defaultMessage": "!!!Exit Full Screen", 3998 "defaultMessage": "!!!Exit Full Screen",
3574 "end": { 3999 "end": {
3575 "column": 3, 4000 "column": 3,
3576 "line": 85 4001 "line": 88
3577 }, 4002 },
3578 "file": "src/lib/Menu.js", 4003 "file": "src/lib/Menu.js",
3579 "id": "menu.view.exitFullScreen", 4004 "id": "menu.view.exitFullScreen",
3580 "start": { 4005 "start": {
3581 "column": 18, 4006 "column": 18,
3582 "line": 82 4007 "line": 85
3583 } 4008 }
3584 }, 4009 },
3585 { 4010 {
3586 "defaultMessage": "!!!Toggle Full Screen", 4011 "defaultMessage": "!!!Toggle Full Screen",
3587 "end": { 4012 "end": {
3588 "column": 3, 4013 "column": 3,
3589 "line": 89 4014 "line": 92
3590 }, 4015 },
3591 "file": "src/lib/Menu.js", 4016 "file": "src/lib/Menu.js",
3592 "id": "menu.view.toggleFullScreen", 4017 "id": "menu.view.toggleFullScreen",
3593 "start": { 4018 "start": {
3594 "column": 20, 4019 "column": 20,
3595 "line": 86 4020 "line": 89
3596 } 4021 }
3597 }, 4022 },
3598 { 4023 {
3599 "defaultMessage": "!!!Toggle Developer Tools", 4024 "defaultMessage": "!!!Toggle Developer Tools",
3600 "end": { 4025 "end": {
3601 "column": 3, 4026 "column": 3,
3602 "line": 93 4027 "line": 96
3603 }, 4028 },
3604 "file": "src/lib/Menu.js", 4029 "file": "src/lib/Menu.js",
3605 "id": "menu.view.toggleDevTools", 4030 "id": "menu.view.toggleDevTools",
3606 "start": { 4031 "start": {
3607 "column": 18, 4032 "column": 18,
3608 "line": 90 4033 "line": 93
3609 } 4034 }
3610 }, 4035 },
3611 { 4036 {
3612 "defaultMessage": "!!!Toggle Service Developer Tools", 4037 "defaultMessage": "!!!Toggle Service Developer Tools",
3613 "end": { 4038 "end": {
3614 "column": 3, 4039 "column": 3,
3615 "line": 97 4040 "line": 100
3616 }, 4041 },
3617 "file": "src/lib/Menu.js", 4042 "file": "src/lib/Menu.js",
3618 "id": "menu.view.toggleServiceDevTools", 4043 "id": "menu.view.toggleServiceDevTools",
3619 "start": { 4044 "start": {
3620 "column": 25, 4045 "column": 25,
3621 "line": 94 4046 "line": 97
3622 } 4047 }
3623 }, 4048 },
3624 { 4049 {
3625 "defaultMessage": "!!!Reload Service", 4050 "defaultMessage": "!!!Reload Service",
3626 "end": { 4051 "end": {
3627 "column": 3, 4052 "column": 3,
3628 "line": 101 4053 "line": 104
3629 }, 4054 },
3630 "file": "src/lib/Menu.js", 4055 "file": "src/lib/Menu.js",
3631 "id": "menu.view.reloadService", 4056 "id": "menu.view.reloadService",
3632 "start": { 4057 "start": {
3633 "column": 17, 4058 "column": 17,
3634 "line": 98 4059 "line": 101
3635 } 4060 }
3636 }, 4061 },
3637 { 4062 {
3638 "defaultMessage": "!!!Reload Franz", 4063 "defaultMessage": "!!!Reload Franz",
3639 "end": { 4064 "end": {
3640 "column": 3, 4065 "column": 3,
3641 "line": 105 4066 "line": 108
3642 }, 4067 },
3643 "file": "src/lib/Menu.js", 4068 "file": "src/lib/Menu.js",
3644 "id": "menu.view.reloadFranz", 4069 "id": "menu.view.reloadFranz",
3645 "start": { 4070 "start": {
3646 "column": 15, 4071 "column": 15,
3647 "line": 102 4072 "line": 105
3648 } 4073 }
3649 }, 4074 },
3650 { 4075 {
3651 "defaultMessage": "!!!Minimize", 4076 "defaultMessage": "!!!Minimize",
3652 "end": { 4077 "end": {
3653 "column": 3, 4078 "column": 3,
3654 "line": 109 4079 "line": 112
3655 }, 4080 },
3656 "file": "src/lib/Menu.js", 4081 "file": "src/lib/Menu.js",
3657 "id": "menu.window.minimize", 4082 "id": "menu.window.minimize",
3658 "start": { 4083 "start": {
3659 "column": 12, 4084 "column": 12,
3660 "line": 106 4085 "line": 109
3661 } 4086 }
3662 }, 4087 },
3663 { 4088 {
3664 "defaultMessage": "!!!Close", 4089 "defaultMessage": "!!!Close",
3665 "end": { 4090 "end": {
3666 "column": 3, 4091 "column": 3,
3667 "line": 113 4092 "line": 116
3668 }, 4093 },
3669 "file": "src/lib/Menu.js", 4094 "file": "src/lib/Menu.js",
3670 "id": "menu.window.close", 4095 "id": "menu.window.close",
3671 "start": { 4096 "start": {
3672 "column": 9, 4097 "column": 9,
3673 "line": 110 4098 "line": 113
3674 } 4099 }
3675 }, 4100 },
3676 { 4101 {
3677 "defaultMessage": "!!!Learn More", 4102 "defaultMessage": "!!!Learn More",
3678 "end": { 4103 "end": {
3679 "column": 3, 4104 "column": 3,
3680 "line": 117 4105 "line": 120
3681 }, 4106 },
3682 "file": "src/lib/Menu.js", 4107 "file": "src/lib/Menu.js",
3683 "id": "menu.help.learnMore", 4108 "id": "menu.help.learnMore",
3684 "start": { 4109 "start": {
3685 "column": 13, 4110 "column": 13,
3686 "line": 114 4111 "line": 117
3687 } 4112 }
3688 }, 4113 },
3689 { 4114 {
3690 "defaultMessage": "!!!Changelog", 4115 "defaultMessage": "!!!Changelog",
3691 "end": { 4116 "end": {
3692 "column": 3, 4117 "column": 3,
3693 "line": 121 4118 "line": 124
3694 }, 4119 },
3695 "file": "src/lib/Menu.js", 4120 "file": "src/lib/Menu.js",
3696 "id": "menu.help.changelog", 4121 "id": "menu.help.changelog",
3697 "start": { 4122 "start": {
3698 "column": 13, 4123 "column": 13,
3699 "line": 118 4124 "line": 121
3700 } 4125 }
3701 }, 4126 },
3702 { 4127 {
3703 "defaultMessage": "!!!Support", 4128 "defaultMessage": "!!!Support",
3704 "end": { 4129 "end": {
3705 "column": 3, 4130 "column": 3,
3706 "line": 125 4131 "line": 128
3707 }, 4132 },
3708 "file": "src/lib/Menu.js", 4133 "file": "src/lib/Menu.js",
3709 "id": "menu.help.support", 4134 "id": "menu.help.support",
3710 "start": { 4135 "start": {
3711 "column": 11, 4136 "column": 11,
3712 "line": 122 4137 "line": 125
3713 } 4138 }
3714 }, 4139 },
3715 { 4140 {
3716 "defaultMessage": "!!!Terms of Service", 4141 "defaultMessage": "!!!Terms of Service",
3717 "end": { 4142 "end": {
3718 "column": 3, 4143 "column": 3,
3719 "line": 129 4144 "line": 132
3720 }, 4145 },
3721 "file": "src/lib/Menu.js", 4146 "file": "src/lib/Menu.js",
3722 "id": "menu.help.tos", 4147 "id": "menu.help.tos",
3723 "start": { 4148 "start": {
3724 "column": 7, 4149 "column": 7,
3725 "line": 126 4150 "line": 129
3726 } 4151 }
3727 }, 4152 },
3728 { 4153 {
3729 "defaultMessage": "!!!Privacy Statement", 4154 "defaultMessage": "!!!Privacy Statement",
3730 "end": { 4155 "end": {
3731 "column": 3, 4156 "column": 3,
3732 "line": 133 4157 "line": 136
3733 }, 4158 },
3734 "file": "src/lib/Menu.js", 4159 "file": "src/lib/Menu.js",
3735 "id": "menu.help.privacy", 4160 "id": "menu.help.privacy",
3736 "start": { 4161 "start": {
3737 "column": 11, 4162 "column": 11,
3738 "line": 130 4163 "line": 133
3739 } 4164 }
3740 }, 4165 },
3741 { 4166 {
3742 "defaultMessage": "!!!File", 4167 "defaultMessage": "!!!File",
3743 "end": { 4168 "end": {
3744 "column": 3, 4169 "column": 3,
3745 "line": 137 4170 "line": 140
3746 }, 4171 },
3747 "file": "src/lib/Menu.js", 4172 "file": "src/lib/Menu.js",
3748 "id": "menu.file", 4173 "id": "menu.file",
3749 "start": { 4174 "start": {
3750 "column": 8, 4175 "column": 8,
3751 "line": 134 4176 "line": 137
3752 } 4177 }
3753 }, 4178 },
3754 { 4179 {
3755 "defaultMessage": "!!!View", 4180 "defaultMessage": "!!!View",
3756 "end": { 4181 "end": {
3757 "column": 3, 4182 "column": 3,
3758 "line": 141 4183 "line": 144
3759 }, 4184 },
3760 "file": "src/lib/Menu.js", 4185 "file": "src/lib/Menu.js",
3761 "id": "menu.view", 4186 "id": "menu.view",
3762 "start": { 4187 "start": {
3763 "column": 8, 4188 "column": 8,
3764 "line": 138 4189 "line": 141
3765 } 4190 }
3766 }, 4191 },
3767 { 4192 {
3768 "defaultMessage": "!!!Services", 4193 "defaultMessage": "!!!Services",
3769 "end": { 4194 "end": {
3770 "column": 3, 4195 "column": 3,
3771 "line": 145 4196 "line": 148
3772 }, 4197 },
3773 "file": "src/lib/Menu.js", 4198 "file": "src/lib/Menu.js",
3774 "id": "menu.services", 4199 "id": "menu.services",
3775 "start": { 4200 "start": {
3776 "column": 12, 4201 "column": 12,
3777 "line": 142 4202 "line": 145
3778 } 4203 }
3779 }, 4204 },
3780 { 4205 {
3781 "defaultMessage": "!!!Window", 4206 "defaultMessage": "!!!Window",
3782 "end": { 4207 "end": {
3783 "column": 3, 4208 "column": 3,
3784 "line": 149 4209 "line": 152
3785 }, 4210 },
3786 "file": "src/lib/Menu.js", 4211 "file": "src/lib/Menu.js",
3787 "id": "menu.window", 4212 "id": "menu.window",
3788 "start": { 4213 "start": {
3789 "column": 10, 4214 "column": 10,
3790 "line": 146 4215 "line": 149
3791 } 4216 }
3792 }, 4217 },
3793 { 4218 {
3794 "defaultMessage": "!!!Help", 4219 "defaultMessage": "!!!Help",
3795 "end": { 4220 "end": {
3796 "column": 3, 4221 "column": 3,
3797 "line": 153 4222 "line": 156
3798 }, 4223 },
3799 "file": "src/lib/Menu.js", 4224 "file": "src/lib/Menu.js",
3800 "id": "menu.help", 4225 "id": "menu.help",
3801 "start": { 4226 "start": {
3802 "column": 8, 4227 "column": 8,
3803 "line": 150 4228 "line": 153
3804 } 4229 }
3805 }, 4230 },
3806 { 4231 {
3807 "defaultMessage": "!!!About Franz", 4232 "defaultMessage": "!!!About Franz",
3808 "end": { 4233 "end": {
3809 "column": 3, 4234 "column": 3,
3810 "line": 157 4235 "line": 160
3811 }, 4236 },
3812 "file": "src/lib/Menu.js", 4237 "file": "src/lib/Menu.js",
3813 "id": "menu.app.about", 4238 "id": "menu.app.about",
3814 "start": { 4239 "start": {
3815 "column": 9, 4240 "column": 9,
3816 "line": 154 4241 "line": 157
3817 } 4242 }
3818 }, 4243 },
3819 { 4244 {
3820 "defaultMessage": "!!!What's new in Franz?", 4245 "defaultMessage": "!!!What's new in Franz?",
3821 "end": { 4246 "end": {
3822 "column": 3, 4247 "column": 3,
3823 "line": 161 4248 "line": 164
3824 }, 4249 },
3825 "file": "src/lib/Menu.js", 4250 "file": "src/lib/Menu.js",
3826 "id": "menu.app.announcement", 4251 "id": "menu.app.announcement",
3827 "start": { 4252 "start": {
3828 "column": 16, 4253 "column": 16,
3829 "line": 158 4254 "line": 161
3830 } 4255 }
3831 }, 4256 },
3832 { 4257 {
3833 "defaultMessage": "!!!Settings", 4258 "defaultMessage": "!!!Settings",
3834 "end": { 4259 "end": {
3835 "column": 3, 4260 "column": 3,
3836 "line": 165 4261 "line": 168
3837 }, 4262 },
3838 "file": "src/lib/Menu.js", 4263 "file": "src/lib/Menu.js",
3839 "id": "menu.app.settings", 4264 "id": "menu.app.settings",
3840 "start": { 4265 "start": {
3841 "column": 12, 4266 "column": 12,
3842 "line": 162 4267 "line": 165
3843 } 4268 }
3844 }, 4269 },
3845 { 4270 {
3846 "defaultMessage": "!!!Hide", 4271 "defaultMessage": "!!!Hide",
3847 "end": { 4272 "end": {
3848 "column": 3, 4273 "column": 3,
3849 "line": 169 4274 "line": 172
3850 }, 4275 },
3851 "file": "src/lib/Menu.js", 4276 "file": "src/lib/Menu.js",
3852 "id": "menu.app.hide", 4277 "id": "menu.app.hide",
3853 "start": { 4278 "start": {
3854 "column": 8, 4279 "column": 8,
3855 "line": 166 4280 "line": 169
3856 } 4281 }
3857 }, 4282 },
3858 { 4283 {
3859 "defaultMessage": "!!!Hide Others", 4284 "defaultMessage": "!!!Hide Others",
3860 "end": { 4285 "end": {
3861 "column": 3, 4286 "column": 3,
3862 "line": 173 4287 "line": 176
3863 }, 4288 },
3864 "file": "src/lib/Menu.js", 4289 "file": "src/lib/Menu.js",
3865 "id": "menu.app.hideOthers", 4290 "id": "menu.app.hideOthers",
3866 "start": { 4291 "start": {
3867 "column": 14, 4292 "column": 14,
3868 "line": 170 4293 "line": 173
3869 } 4294 }
3870 }, 4295 },
3871 { 4296 {
3872 "defaultMessage": "!!!Unhide", 4297 "defaultMessage": "!!!Unhide",
3873 "end": { 4298 "end": {
3874 "column": 3, 4299 "column": 3,
3875 "line": 177 4300 "line": 180
3876 }, 4301 },
3877 "file": "src/lib/Menu.js", 4302 "file": "src/lib/Menu.js",
3878 "id": "menu.app.unhide", 4303 "id": "menu.app.unhide",
3879 "start": { 4304 "start": {
3880 "column": 10, 4305 "column": 10,
3881 "line": 174 4306 "line": 177
3882 } 4307 }
3883 }, 4308 },
3884 { 4309 {
3885 "defaultMessage": "!!!Quit", 4310 "defaultMessage": "!!!Quit",
3886 "end": { 4311 "end": {
3887 "column": 3, 4312 "column": 3,
3888 "line": 181 4313 "line": 184
3889 }, 4314 },
3890 "file": "src/lib/Menu.js", 4315 "file": "src/lib/Menu.js",
3891 "id": "menu.app.quit", 4316 "id": "menu.app.quit",
3892 "start": { 4317 "start": {
3893 "column": 8, 4318 "column": 8,
3894 "line": 178 4319 "line": 181
3895 } 4320 }
3896 }, 4321 },
3897 { 4322 {
3898 "defaultMessage": "!!!Add New Service...", 4323 "defaultMessage": "!!!Add New Service...",
3899 "end": { 4324 "end": {
3900 "column": 3, 4325 "column": 3,
3901 "line": 185 4326 "line": 188
3902 }, 4327 },
3903 "file": "src/lib/Menu.js", 4328 "file": "src/lib/Menu.js",
3904 "id": "menu.services.addNewService", 4329 "id": "menu.services.addNewService",
3905 "start": { 4330 "start": {
3906 "column": 17, 4331 "column": 17,
3907 "line": 182 4332 "line": 185
3908 } 4333 }
3909 }, 4334 },
3910 { 4335 {
3911 "defaultMessage": "!!!Activate next service...", 4336 "defaultMessage": "!!!Add New Workspace...",
3912 "end": { 4337 "end": {
3913 "column": 3, 4338 "column": 3,
4339 "line": 192
4340 },
4341 "file": "src/lib/Menu.js",
4342 "id": "menu.workspaces.addNewWorkspace",
4343 "start": {
4344 "column": 19,
3914 "line": 189 4345 "line": 189
4346 }
4347 },
4348 {
4349 "defaultMessage": "!!!Open workspace drawer",
4350 "end": {
4351 "column": 3,
4352 "line": 196
4353 },
4354 "file": "src/lib/Menu.js",
4355 "id": "menu.workspaces.openWorkspaceDrawer",
4356 "start": {
4357 "column": 23,
4358 "line": 193
4359 }
4360 },
4361 {
4362 "defaultMessage": "!!!Close workspace drawer",
4363 "end": {
4364 "column": 3,
4365 "line": 200
4366 },
4367 "file": "src/lib/Menu.js",
4368 "id": "menu.workspaces.closeWorkspaceDrawer",
4369 "start": {
4370 "column": 24,
4371 "line": 197
4372 }
4373 },
4374 {
4375 "defaultMessage": "!!!Activate next service...",
4376 "end": {
4377 "column": 3,
4378 "line": 204
3915 }, 4379 },
3916 "file": "src/lib/Menu.js", 4380 "file": "src/lib/Menu.js",
3917 "id": "menu.services.setNextServiceActive", 4381 "id": "menu.services.setNextServiceActive",
3918 "start": { 4382 "start": {
3919 "column": 23, 4383 "column": 23,
3920 "line": 186 4384 "line": 201
3921 } 4385 }
3922 }, 4386 },
3923 { 4387 {
3924 "defaultMessage": "!!!Activate previous service...", 4388 "defaultMessage": "!!!Activate previous service...",
3925 "end": { 4389 "end": {
3926 "column": 3, 4390 "column": 3,
3927 "line": 193 4391 "line": 208
3928 }, 4392 },
3929 "file": "src/lib/Menu.js", 4393 "file": "src/lib/Menu.js",
3930 "id": "menu.services.activatePreviousService", 4394 "id": "menu.services.activatePreviousService",
3931 "start": { 4395 "start": {
3932 "column": 27, 4396 "column": 27,
3933 "line": 190 4397 "line": 205
3934 } 4398 }
3935 }, 4399 },
3936 { 4400 {
3937 "defaultMessage": "!!!Disable notifications & audio", 4401 "defaultMessage": "!!!Disable notifications & audio",
3938 "end": { 4402 "end": {
3939 "column": 3, 4403 "column": 3,
3940 "line": 197 4404 "line": 212
3941 }, 4405 },
3942 "file": "src/lib/Menu.js", 4406 "file": "src/lib/Menu.js",
3943 "id": "sidebar.muteApp", 4407 "id": "sidebar.muteApp",
3944 "start": { 4408 "start": {
3945 "column": 11, 4409 "column": 11,
3946 "line": 194 4410 "line": 209
3947 } 4411 }
3948 }, 4412 },
3949 { 4413 {
3950 "defaultMessage": "!!!Enable notifications & audio", 4414 "defaultMessage": "!!!Enable notifications & audio",
3951 "end": { 4415 "end": {
3952 "column": 3, 4416 "column": 3,
3953 "line": 201 4417 "line": 216
3954 }, 4418 },
3955 "file": "src/lib/Menu.js", 4419 "file": "src/lib/Menu.js",
3956 "id": "sidebar.unmuteApp", 4420 "id": "sidebar.unmuteApp",
3957 "start": { 4421 "start": {
3958 "column": 13, 4422 "column": 13,
3959 "line": 198 4423 "line": 213
4424 }
4425 },
4426 {
4427 "defaultMessage": "!!!Workspaces",
4428 "end": {
4429 "column": 3,
4430 "line": 220
4431 },
4432 "file": "src/lib/Menu.js",
4433 "id": "menu.workspaces",
4434 "start": {
4435 "column": 14,
4436 "line": 217
4437 }
4438 },
4439 {
4440 "defaultMessage": "!!!Default",
4441 "end": {
4442 "column": 3,
4443 "line": 224
4444 },
4445 "file": "src/lib/Menu.js",
4446 "id": "menu.workspaces.defaultWorkspace",
4447 "start": {
4448 "column": 20,
4449 "line": 221
3960 } 4450 }
3961 } 4451 }
3962 ], 4452 ],
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index 9639ec5f7..626abfddd 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Υποστήριξη", 70 "menu.help.support" : "Υποστήριξη",
71 "menu.help.tos" : "Όροι Χρήσης", 71 "menu.help.tos" : "Όροι Χρήσης",
72 "menu.services" : "Υπηρεσίες", 72 "menu.services" : "Υπηρεσίες",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Νέα Υπηρεσία", 74 "menu.services.addNewService" : "Νέα Υπηρεσία",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Προβολή", 76 "menu.view" : "Προβολή",
75 "menu.view.enterFullScreen" : "Πλήρης Οθόνη", 77 "menu.view.enterFullScreen" : "Πλήρης Οθόνη",
76 "menu.view.exitFullScreen" : "Έξοδος από πλήρη οθόνη", 78 "menu.view.exitFullScreen" : "Έξοδος από πλήρη οθόνη",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Λήψη", 130 "settings.account.invoiceDownload" : "Λήψη",
129 "settings.account.manageSubscription.label" : "Διαχείριση της συνδρομής σας", 131 "settings.account.manageSubscription.label" : "Διαχείριση της συνδρομής σας",
130 "settings.account.successInfo" : "Οι αλλαγές σας έχουν αποθηκευτεί", 132 "settings.account.successInfo" : "Οι αλλαγές σας έχουν αποθηκευτεί",
133 "settings.account.tryReloadServices" : "Δοκιμάστε ξανά",
131 "settings.account.tryReloadUserInfoRequest" : "Δοκιμάστε ξανά", 134 "settings.account.tryReloadUserInfoRequest" : "Δοκιμάστε ξανά",
132 "settings.account.userInfoRequestFailed" : "Δεν ήταν δυνατή η φόρτωση πληροφοριών χρήστη", 135 "settings.account.userInfoRequestFailed" : "Δεν ήταν δυνατή η φόρτωση πληροφοριών χρήστη",
133 "settings.app.buttonClearAllCache" : "Καθαρισμός λανθάνουσας μνήμης", 136 "settings.app.buttonClearAllCache" : "Καθαρισμός λανθάνουσας μνήμης",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Συμπεριλάβετε εκδόσεις beta", 143 "settings.app.form.beta" : "Συμπεριλάβετε εκδόσεις beta",
141 "settings.app.form.darkMode" : "Join the Dark Side", 144 "settings.app.form.darkMode" : "Join the Dark Side",
142 "settings.app.form.enableGPUAcceleration" : "Ενεργοποιήση Ενίσχυσης GPU ", 145 "settings.app.form.enableGPUAcceleration" : "Ενεργοποιήση Ενίσχυσης GPU ",
143 "settings.app.form.enableMenuBar" : "Εμφάνιση Γραμμής Μενού Franz",
144 "settings.app.form.enableSpellchecking" : "Ενεργοποίηση ορθογραφικού ελέγχου", 146 "settings.app.form.enableSpellchecking" : "Ενεργοποίηση ορθογραφικού ελέγχου",
145 "settings.app.form.enableSystemTray" : "Εμφάνιση του Franz στη γραμμή ειδοποιήσεων", 147 "settings.app.form.enableSystemTray" : "Εμφάνιση του Franz στη γραμμή ειδοποιήσεων",
146 "settings.app.form.hideDockIcon" : "Απόκρυψη εικονιδίου Franz",
147 "settings.app.form.language" : "Γλώσσα", 148 "settings.app.form.language" : "Γλώσσα",
148 "settings.app.form.minimizeToSystemTray" : "Ελαχιστοποίηση του Franz στη γραμμή ειδοποιήσεων", 149 "settings.app.form.minimizeToSystemTray" : "Ελαχιστοποίηση του Franz στη γραμμή ειδοποιήσεων",
149 "settings.app.form.runInBackground" : "Κρατήστε το Franz στο παρασκήνιο κατά το κλείσιμο του παραθύρου", 150 "settings.app.form.runInBackground" : "Κρατήστε το Franz στο παρασκήνιο κατά το κλείσιμο του παραθύρου",
150 "settings.app.form.showDisabledServices" : "Προβολή καρτελών των απενεργοποιημένων υπηρεσιών", 151 "settings.app.form.showDisabledServices" : "Προβολή καρτελών των απενεργοποιημένων υπηρεσιών",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Προβολή του εικονιδίου μη αναγνωσμένου μηνύματος όταν οι ειδοποιήσεις είναι απενεργοποιημένες", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Προβολή του εικονιδίου μη αναγνωσμένου μηνύματος όταν οι ειδοποιήσεις είναι απενεργοποιημένες",
152 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
153 "settings.app.headline" : "Ρυθμίσεις", 153 "settings.app.headline" : "Ρυθμίσεις",
154 "settings.app.headlineAdvanced" : "Για προχωρημένους", 154 "settings.app.headlineAdvanced" : "Για προχωρημένους",
155 "settings.app.headlineAppearance" : "Εμφάνιση", 155 "settings.app.headlineAppearance" : "Εμφάνιση",
@@ -212,8 +212,6 @@
212 "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.",
213 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "User (optional)",
214 "settings.service.form.saveButton" : "Αποθήκευση υπηρεσίας", 214 "settings.service.form.saveButton" : "Αποθήκευση υπηρεσίας",
215 "settings.service.form.spellcheckerLanguage" : "Spell checking Language",
216 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})",
217 "settings.service.form.tabHosted" : "Φιλοξενείται", 215 "settings.service.form.tabHosted" : "Φιλοξενείται",
218 "settings.service.form.tabOnPremise" : "Αυτο-φιλοξενείται ⭐️", 216 "settings.service.form.tabOnPremise" : "Αυτο-φιλοξενείται ⭐️",
219 "settings.service.form.team" : "Ομάδα", 217 "settings.service.form.team" : "Ομάδα",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Ανακαλύψτε υπηρεσίες", 221 "settings.services.discoverServices" : "Ανακαλύψτε υπηρεσίες",
224 "settings.services.headline" : "Οι υπηρεσίες σας", 222 "settings.services.headline" : "Οι υπηρεσίες σας",
225 "settings.services.noServicesAdded" : "Δεν έχετε προσθέσει ακόμα υπηρεσίες.", 223 "settings.services.noServicesAdded" : "Δεν έχετε προσθέσει ακόμα υπηρεσίες.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Η υπηρεσία είναι απενεργοποιημένη", 225 "settings.services.tooltip.isDisabled" : "Η υπηρεσία είναι απενεργοποιημένη",
227 "settings.services.tooltip.isMuted" : "Όλοι οι ήχοι είναι απενεργοποιημένοι", 226 "settings.services.tooltip.isMuted" : "Όλοι οι ήχοι είναι απενεργοποιημένοι",
228 "settings.services.tooltip.notificationsDisabled" : "Οι ειδοποιήσεις είναι απενεργοποιημένες", 227 "settings.services.tooltip.notificationsDisabled" : "Οι ειδοποιήσεις είναι απενεργοποιημένες",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Πολίτες Ε.Ε.: Στις τιμές δεν περιλαμβάνονται τυχόν φόροι και άλλες τοπικές επιβαρύνσεις", 254 "subscription.euTaxInfo" : "Πολίτες Ε.Ε.: Στις τιμές δεν περιλαμβάνονται τυχόν φόροι και άλλες τοπικές επιβαρύνσεις",
256 "subscription.features.ads" : "Τέλος στις διαφημίσεις", 255 "subscription.features.ads" : "Τέλος στις διαφημίσεις",
257 "subscription.features.comingSoon" : "σύντομα", 256 "subscription.features.comingSoon" : "σύντομα",
258 "subscription.features.encryptedSync" : "Κρυπτογραφημένος συγχρονισμός περιόδου σύνδεσης",
259 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 257 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
260 "subscription.features.onpremise" : "Add on-premise \/ hosted services όπως το HipChat",
261 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 258 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
262 "subscription.features.proxy" : "Proxy support for services", 259 "subscription.features.proxy" : "Proxy support for services",
263 "subscription.features.spellchecker" : "Support for spellchecker", 260 "subscription.features.spellchecker" : "Support for spellchecker",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Επαναφόρτωση", 277 "tabs.item.reload" : "Επαναφόρτωση",
281 "validation.email" : "{field} δεν είναι έγκυρο", 278 "validation.email" : "{field} δεν είναι έγκυρο",
282 "validation.minLength" : "{field} πρέπει να είναι τουλάχιστον {length} χαρακτήρες", 279 "validation.minLength" : "{field} πρέπει να είναι τουλάχιστον {length} χαρακτήρες",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} είναι υποχρεωτικό", 281 "validation.required" : "{field} είναι υποχρεωτικό",
284 "validation.url" : "{field} δεν είναι έγκυρος σύνδεσμος URL", 282 "validation.url" : "{field} δεν είναι έγκυρος σύνδεσμος URL",
285 "welcome.loginButton" : "Σύνδεση στο λογαριασμό σας", 283 "welcome.loginButton" : "Σύνδεση στο λογαριασμό σας",
286 "welcome.signupButton" : "Δημιουργία δωρεάν λογαριασμού", 284 "welcome.signupButton" : "Δημιουργία δωρεάν λογαριασμού"
287 "welcome.slogan" : "Επικοινωνία που λειτουργεί για εσάς"
288} 285}
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 573231c45..13775d758 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -10,7 +10,7 @@
10 "feature.shareFranz.action.twitter": "Share on Twitter", 10 "feature.shareFranz.action.twitter": "Share on Twitter",
11 "feature.shareFranz.headline": "Franz is better together!", 11 "feature.shareFranz.headline": "Franz is better together!",
12 "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.email": "I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com",
13 "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.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 @FranzMessenger",
14 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 14 "feature.shareFranz.text": "Tell your friends and colleagues how awesome Franz is and help us to spread the word.",
15 "global.api.unhealthy": "Can't connect to Franz online services", 15 "global.api.unhealthy": "Can't connect to Franz online services",
16 "global.notConnectedToTheInternet": "You are not connected to the internet.", 16 "global.notConnectedToTheInternet": "You are not connected to the internet.",
@@ -89,6 +89,11 @@
89 "menu.window": "Window", 89 "menu.window": "Window",
90 "menu.window.close": "Close", 90 "menu.window.close": "Close",
91 "menu.window.minimize": "Minimize", 91 "menu.window.minimize": "Minimize",
92 "menu.workspaces": "Workspaces",
93 "menu.workspaces.addNewWorkspace": "Add New Workspace...",
94 "menu.workspaces.closeWorkspaceDrawer": "Close workspace drawer",
95 "menu.workspaces.defaultWorkspace": "All services",
96 "menu.workspaces.openWorkspaceDrawer": "Open workspace drawer",
92 "password.email.label": "Email address", 97 "password.email.label": "Email address",
93 "password.headline": "Reset password", 98 "password.headline": "Reset password",
94 "password.link.login": "Sign in to your account", 99 "password.link.login": "Sign in to your account",
@@ -112,6 +117,7 @@
112 "service.errorHandler.headline": "Oh no!", 117 "service.errorHandler.headline": "Oh no!",
113 "service.errorHandler.message": "Error", 118 "service.errorHandler.message": "Error",
114 "service.errorHandler.text": "{name} has failed to load.", 119 "service.errorHandler.text": "{name} has failed to load.",
120 "service.webviewLoader.loading": "Loading",
115 "services.getStarted": "Get started", 121 "services.getStarted": "Get started",
116 "services.welcome": "Welcome to Franz", 122 "services.welcome": "Welcome to Franz",
117 "settings.account.account.editButton": "Edit account", 123 "settings.account.account.editButton": "Edit account",
@@ -171,6 +177,7 @@
171 "settings.navigation.logout": "Logout", 177 "settings.navigation.logout": "Logout",
172 "settings.navigation.settings": "Settings", 178 "settings.navigation.settings": "Settings",
173 "settings.navigation.yourServices": "Your services", 179 "settings.navigation.yourServices": "Your services",
180 "settings.navigation.yourWorkspaces": "Your workspaces",
174 "settings.recipes.all": "All services", 181 "settings.recipes.all": "All services",
175 "settings.recipes.dev": "Development", 182 "settings.recipes.dev": "Development",
176 "settings.recipes.headline": "Available services", 183 "settings.recipes.headline": "Available services",
@@ -237,8 +244,25 @@
237 "settings.user.form.firstname": "First Name", 244 "settings.user.form.firstname": "First Name",
238 "settings.user.form.lastname": "Last Name", 245 "settings.user.form.lastname": "Last Name",
239 "settings.user.form.newPassword": "New password", 246 "settings.user.form.newPassword": "New password",
247 "settings.workspace.add.form.name": "Name",
248 "settings.workspace.add.form.submitButton": "Create workspace",
249 "settings.workspace.form.buttonDelete": "Delete workspace",
250 "settings.workspace.form.buttonSave": "Save workspace",
251 "settings.workspace.form.name": "Name",
252 "settings.workspace.form.servicesInWorkspaceHeadline": "Services in this Workspace",
253 "settings.workspace.form.yourWorkspaces": "Your workspaces",
254 "settings.workspaces.deletedInfo": "Workspace has been deleted",
255 "settings.workspaces.headline": "Your workspaces",
256 "settings.workspaces.noWorkspacesAdded": "You haven't added any workspaces yet.",
257 "settings.workspaces.tryReloadWorkspaces": "Try again",
258 "settings.workspaces.updatedInfo": "Your changes have been saved",
259 "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Franz Workspaces",
260 "settings.workspaces.workspaceFeatureInfo": "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.",
261 "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces",
240 "sidebar.addNewService": "Add new service", 262 "sidebar.addNewService": "Add new service",
263 "sidebar.closeWorkspaceDrawer": "Close workspace drawer",
241 "sidebar.muteApp": "Disable notifications & audio", 264 "sidebar.muteApp": "Disable notifications & audio",
265 "sidebar.openWorkspaceDrawer": "Open workspace drawer",
242 "sidebar.settings": "Settings", 266 "sidebar.settings": "Settings",
243 "sidebar.unmuteApp": "Enable notifications & audio", 267 "sidebar.unmuteApp": "Enable notifications & audio",
244 "signup.company.label": "Company", 268 "signup.company.label": "Company",
@@ -283,5 +307,16 @@
283 "validation.required": "{field} is required", 307 "validation.required": "{field} is required",
284 "validation.url": "{field} is not a valid URL", 308 "validation.url": "{field} is not a valid URL",
285 "welcome.loginButton": "Login to your account", 309 "welcome.loginButton": "Login to your account",
286 "welcome.signupButton": "Create a free account" 310 "welcome.signupButton": "Create a free account",
311 "workspaceDrawer.addNewWorkspaceLabel": "Add new workspace",
312 "workspaceDrawer.allServices": "All services",
313 "workspaceDrawer.headline": "Workspaces",
314 "workspaceDrawer.item.contextMenuEdit": "edit",
315 "workspaceDrawer.item.noServicesAddedYet": "No services added yet",
316 "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace",
317 "workspaceDrawer.proFeatureBadge": "Premium feature",
318 "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account",
319 "workspaceDrawer.workspaceFeatureInfo": "<p>Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>",
320 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
321 "workspaces.switchingIndicator.switchingTo": "Switching to"
287} \ No newline at end of file 322} \ No newline at end of file
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 3ac23d9a5..5c26b456c 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -5,8 +5,8 @@
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", 7 "feature.shareFranz.action.email" : "Send as email",
8 "feature.shareFranz.action.facebook" : "Share on Facebook", 8 "feature.shareFranz.action.facebook" : "Compartir en Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter", 9 "feature.shareFranz.action.twitter" : "Compartir en Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!", 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", 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", 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",
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Ayuda técnica", 70 "menu.help.support" : "Ayuda técnica",
71 "menu.help.tos" : "Términos del Servicio", 71 "menu.help.tos" : "Términos del Servicio",
72 "menu.services" : "Servicios", 72 "menu.services" : "Servicios",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Añadir Nuevo Servicio...", 74 "menu.services.addNewService" : "Añadir Nuevo Servicio...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Mostrar", 76 "menu.view" : "Mostrar",
75 "menu.view.enterFullScreen" : "Pasar a pantalla completa", 77 "menu.view.enterFullScreen" : "Pasar a pantalla completa",
76 "menu.view.exitFullScreen" : "Salir de Pantalla Completa", 78 "menu.view.exitFullScreen" : "Salir de Pantalla Completa",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Descargar", 130 "settings.account.invoiceDownload" : "Descargar",
129 "settings.account.manageSubscription.label" : "Administra tu suscripción", 131 "settings.account.manageSubscription.label" : "Administra tu suscripción",
130 "settings.account.successInfo" : "Tus cambios han sido guardados", 132 "settings.account.successInfo" : "Tus cambios han sido guardados",
133 "settings.account.tryReloadServices" : "Intentar de nuevo",
131 "settings.account.tryReloadUserInfoRequest" : "Intentar de nuevo", 134 "settings.account.tryReloadUserInfoRequest" : "Intentar de nuevo",
132 "settings.account.userInfoRequestFailed" : "No se pudo cargar la información de usuario", 135 "settings.account.userInfoRequestFailed" : "No se pudo cargar la información de usuario",
133 "settings.app.buttonClearAllCache" : "Limpiar caché", 136 "settings.app.buttonClearAllCache" : "Limpiar caché",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Incluir versiones beta", 143 "settings.app.form.beta" : "Incluir versiones beta",
141 "settings.app.form.darkMode" : "Únete al Lado Oscuro", 144 "settings.app.form.darkMode" : "Únete al Lado Oscuro",
142 "settings.app.form.enableGPUAcceleration" : "Habilitar aceleración de GPU", 145 "settings.app.form.enableGPUAcceleration" : "Habilitar aceleración de GPU",
143 "settings.app.form.enableMenuBar" : "Mostrar a Franz en la barra de menús",
144 "settings.app.form.enableSpellchecking" : "Activar corrección ortográfica", 146 "settings.app.form.enableSpellchecking" : "Activar corrección ortográfica",
145 "settings.app.form.enableSystemTray" : "Mostrar Franz en la bandeja del sistema", 147 "settings.app.form.enableSystemTray" : "Mostrar Franz en la bandeja del sistema",
146 "settings.app.form.hideDockIcon" : "Ocultar Icono de Franz en barra de herramientas",
147 "settings.app.form.language" : "Idioma", 148 "settings.app.form.language" : "Idioma",
148 "settings.app.form.minimizeToSystemTray" : "Minimizar Franz a la bandeja del sistema", 149 "settings.app.form.minimizeToSystemTray" : "Minimizar Franz a la bandeja del sistema",
149 "settings.app.form.runInBackground" : "Mantener Franz en segundo plano al cerrar la ventana", 150 "settings.app.form.runInBackground" : "Mantener Franz en segundo plano al cerrar la ventana",
150 "settings.app.form.showDisabledServices" : "Mostrar pestañas de servicios desactivados", 151 "settings.app.form.showDisabledServices" : "Mostrar pestañas de servicios desactivados",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostrar la insignia de mensajes sin leer cuando las notificaciones están desactivadas", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostrar la insignia de mensajes sin leer cuando las notificaciones están desactivadas",
152 "settings.app.form.spellcheckerLanguage" : "Corrector de ortografía",
153 "settings.app.headline" : "Configuración", 153 "settings.app.headline" : "Configuración",
154 "settings.app.headlineAdvanced" : "Avanzado", 154 "settings.app.headlineAdvanced" : "Avanzado",
155 "settings.app.headlineAppearance" : "Apariencia", 155 "settings.app.headlineAppearance" : "Apariencia",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Por favor reinicie Franz despues de modificar los ajustes proxy.", 212 "settings.service.form.proxy.restartInfo" : "Por favor reinicie Franz despues de modificar los ajustes proxy.",
213 "settings.service.form.proxy.user" : "Usuario (opcional)", 213 "settings.service.form.proxy.user" : "Usuario (opcional)",
214 "settings.service.form.saveButton" : "Guardar servicio", 214 "settings.service.form.saveButton" : "Guardar servicio",
215 "settings.service.form.spellcheckerLanguage" : "Marcar faltas de ortografía",
216 "settings.service.form.spellcheckerLanguage.default" : "Utilizar estándar del sistema ({default})",
217 "settings.service.form.tabHosted" : "Alojado", 215 "settings.service.form.tabHosted" : "Alojado",
218 "settings.service.form.tabOnPremise" : "Auto alojado ⭐️", 216 "settings.service.form.tabOnPremise" : "Auto alojado ⭐️",
219 "settings.service.form.team" : "Equipo", 217 "settings.service.form.team" : "Equipo",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Descubrir servicios", 221 "settings.services.discoverServices" : "Descubrir servicios",
224 "settings.services.headline" : "Tus servicios", 222 "settings.services.headline" : "Tus servicios",
225 "settings.services.noServicesAdded" : "No has añadido ningún servicio aún.", 223 "settings.services.noServicesAdded" : "No has añadido ningún servicio aún.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "El servicio está desactivado", 225 "settings.services.tooltip.isDisabled" : "El servicio está desactivado",
227 "settings.services.tooltip.isMuted" : "Todos los sonidos están silenciados", 226 "settings.services.tooltip.isMuted" : "Todos los sonidos están silenciados",
228 "settings.services.tooltip.notificationsDisabled" : "Las notificaciones están desactivadas", 227 "settings.services.tooltip.notificationsDisabled" : "Las notificaciones están desactivadas",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Residentes de la UE: pueden aplicarse impuestos locales", 254 "subscription.euTaxInfo" : "Residentes de la UE: pueden aplicarse impuestos locales",
256 "subscription.features.ads" : "¡Sin publicidad, para siempre!", 255 "subscription.features.ads" : "¡Sin publicidad, para siempre!",
257 "subscription.features.comingSoon" : "próximamente", 256 "subscription.features.comingSoon" : "próximamente",
258 "subscription.features.encryptedSync" : "Sincronización de sesión encriptada",
259 "subscription.features.noInterruptions" : "Sin retrasos en la app ni molestas actualizaciones de licencias", 257 "subscription.features.noInterruptions" : "Sin retrasos en la app ni molestas actualizaciones de licencias",
260 "subscription.features.onpremise" : "Añade servicios locales\/autoalojados como HipChat",
261 "subscription.features.onpremise.mattermost" : "Agregar servicios de almacenamiento como Mattermost", 258 "subscription.features.onpremise.mattermost" : "Agregar servicios de almacenamiento como Mattermost",
262 "subscription.features.proxy" : "Soporte Proxy para servicios", 259 "subscription.features.proxy" : "Soporte Proxy para servicios",
263 "subscription.features.spellchecker" : "Soporte para corrector de ortografía", 260 "subscription.features.spellchecker" : "Soporte para corrector de ortografía",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Recargar", 277 "tabs.item.reload" : "Recargar",
281 "validation.email" : "{field} no es válido", 278 "validation.email" : "{field} no es válido",
282 "validation.minLength" : "{field} debería tener al menos {length} caracteres", 279 "validation.minLength" : "{field} debería tener al menos {length} caracteres",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} es obligatorio", 281 "validation.required" : "{field} es obligatorio",
284 "validation.url" : "{field} no es una URL válida", 282 "validation.url" : "{field} no es una URL válida",
285 "welcome.loginButton" : "Accede a tu cuenta", 283 "welcome.loginButton" : "Accede a tu cuenta",
286 "welcome.signupButton" : "Crear una cuenta gratuita", 284 "welcome.signupButton" : "Crear una cuenta gratuita"
287 "welcome.slogan" : "Mensajería que funciona para ti"
288} 285}
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index 8af875a3d..6f9d81713 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -4,18 +4,18 @@
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 reprendra dans {seconds} secondes.", 6 "feature.delayApp.text" : "Franz reprendra dans {seconds} secondes.",
7 "feature.shareFranz.action.email" : "Send as email", 7 "feature.shareFranz.action.email" : "Envoyer par mail",
8 "feature.shareFranz.action.facebook" : "Share on Facebook", 8 "feature.shareFranz.action.facebook" : "Partager sur Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter", 9 "feature.shareFranz.action.twitter" : "Partager sur Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!", 10 "feature.shareFranz.headline" : "Franz est meilleur quand on est tous ensemble !",
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", 11 "feature.shareFranz.shareText.email" : "J'ai ajouté {count} services à Franz ! Télécharger l'appli gratuite pour WhatsApp, Messenger, Skype et cie sur 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", 12 "feature.shareFranz.shareText.twitter" : "J'ai ajouté {count} services à Franz ! Télécharger l'appli gratuite pour WhatsApp, Messenger, Skype et cie sur www.meetfranz.com \/cc @NeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 13 "feature.shareFranz.text" : "Dites à vos amis et collègues combien Franz est super et aidez nous à faire passer le mot.",
14 "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",
15 "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})", 16 "global.spellchecker.useDefault" : "Par défaut ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically", 17 "global.spellchecking.autodetect" : "Detecter automatiquement la langue",
18 "global.spellchecking.autodetect.short" : "Automatic", 18 "global.spellchecking.autodetect.short" : "Automatiquement",
19 "global.spellchecking.language" : "Langue de la vérification orthographique", 19 "global.spellchecking.language" : "Langue de la vérification orthographique",
20 "import.headline" : "Importez vos services depuis la version 4 de Franz.", 20 "import.headline" : "Importez vos services depuis la version 4 de Franz.",
21 "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",
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Support", 70 "menu.help.support" : "Support",
71 "menu.help.tos" : "Conditions d'utilisation", 71 "menu.help.tos" : "Conditions d'utilisation",
72 "menu.services" : "Services", 72 "menu.services" : "Services",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Ajouter un nouveau service...", 74 "menu.services.addNewService" : "Ajouter un nouveau service...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Aperçu", 76 "menu.view" : "Aperçu",
75 "menu.view.enterFullScreen" : "Entrer en mode plein écran", 77 "menu.view.enterFullScreen" : "Entrer en mode plein écran",
76 "menu.view.exitFullScreen" : "Sortir du mode plein écran", 78 "menu.view.exitFullScreen" : "Sortir du mode plein écran",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Télécharger", 130 "settings.account.invoiceDownload" : "Télécharger",
129 "settings.account.manageSubscription.label" : "Gérer votre abonnement", 131 "settings.account.manageSubscription.label" : "Gérer votre abonnement",
130 "settings.account.successInfo" : "Vos modifications ont été enregistrées", 132 "settings.account.successInfo" : "Vos modifications ont été enregistrées",
133 "settings.account.tryReloadServices" : "Réessayer",
131 "settings.account.tryReloadUserInfoRequest" : "Réessayer", 134 "settings.account.tryReloadUserInfoRequest" : "Réessayer",
132 "settings.account.userInfoRequestFailed" : "Impossible de charger les informations de l'utilisateur", 135 "settings.account.userInfoRequestFailed" : "Impossible de charger les informations de l'utilisateur",
133 "settings.app.buttonClearAllCache" : "Vider le cache", 136 "settings.app.buttonClearAllCache" : "Vider le cache",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Accepter les versions bêta", 143 "settings.app.form.beta" : "Accepter les versions bêta",
141 "settings.app.form.darkMode" : "Rejoins le côté obscur", 144 "settings.app.form.darkMode" : "Rejoins le côté obscur",
142 "settings.app.form.enableGPUAcceleration" : "Activer l'accélération GPU", 145 "settings.app.form.enableGPUAcceleration" : "Activer l'accélération GPU",
143 "settings.app.form.enableMenuBar" : "Afficher Franz dans la barre des menus",
144 "settings.app.form.enableSpellchecking" : "Activer la vérification orthographique", 146 "settings.app.form.enableSpellchecking" : "Activer la vérification orthographique",
145 "settings.app.form.enableSystemTray" : "Afficher Franz dans la barre d'état système", 147 "settings.app.form.enableSystemTray" : "Afficher Franz dans la barre d'état système",
146 "settings.app.form.hideDockIcon" : "Masquer Franz dans le Dock",
147 "settings.app.form.language" : "Langue", 148 "settings.app.form.language" : "Langue",
148 "settings.app.form.minimizeToSystemTray" : "Minimiser Franz dans la zone de notification", 149 "settings.app.form.minimizeToSystemTray" : "Minimiser Franz dans la zone de notification",
149 "settings.app.form.runInBackground" : "Garder Franz ouvert en arrière-plan à la fermeture de la fenêtre", 150 "settings.app.form.runInBackground" : "Garder Franz ouvert en arrière-plan à la fermeture de la fenêtre",
150 "settings.app.form.showDisabledServices" : "Afficher les onglets des services désactivés", 151 "settings.app.form.showDisabledServices" : "Afficher les onglets des services désactivés",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Afficher les badges de messages non lus quand les notifications sont désactivées.", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Afficher les badges de messages non lus quand les notifications sont désactivées.",
152 "settings.app.form.spellcheckerLanguage" : "Langue de la vérification orthographique",
153 "settings.app.headline" : "Paramètres", 153 "settings.app.headline" : "Paramètres",
154 "settings.app.headlineAdvanced" : "Paramètres avancés", 154 "settings.app.headlineAdvanced" : "Paramètres avancés",
155 "settings.app.headlineAppearance" : "Apparence", 155 "settings.app.headlineAppearance" : "Apparence",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Veuillez redémarrer Franz après avoir modifié les paramètres proxy.", 212 "settings.service.form.proxy.restartInfo" : "Veuillez redémarrer Franz après avoir modifié les paramètres proxy.",
213 "settings.service.form.proxy.user" : "Utilisateur (facultatif)", 213 "settings.service.form.proxy.user" : "Utilisateur (facultatif)",
214 "settings.service.form.saveButton" : "Enregistrer le service", 214 "settings.service.form.saveButton" : "Enregistrer le service",
215 "settings.service.form.spellcheckerLanguage" : "Langue de vérification d'orthographe",
216 "settings.service.form.spellcheckerLanguage.default" : "Par défaut ({default})",
217 "settings.service.form.tabHosted" : "Hébergé", 215 "settings.service.form.tabHosted" : "Hébergé",
218 "settings.service.form.tabOnPremise" : "Auto-hébergé ⭐️", 216 "settings.service.form.tabOnPremise" : "Auto-hébergé ⭐️",
219 "settings.service.form.team" : "Équipe", 217 "settings.service.form.team" : "Équipe",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Découvrir les services", 221 "settings.services.discoverServices" : "Découvrir les services",
224 "settings.services.headline" : "Vos services", 222 "settings.services.headline" : "Vos services",
225 "settings.services.noServicesAdded" : "Vous n'avez pas encore ajouté de services.", 223 "settings.services.noServicesAdded" : "Vous n'avez pas encore ajouté de services.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Ce service est désactivé", 225 "settings.services.tooltip.isDisabled" : "Ce service est désactivé",
227 "settings.services.tooltip.isMuted" : "Tous les sons sont coupés", 226 "settings.services.tooltip.isMuted" : "Tous les sons sont coupés",
228 "settings.services.tooltip.notificationsDisabled" : "Notifications désactivées.", 227 "settings.services.tooltip.notificationsDisabled" : "Notifications désactivées.",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Résidents de l'UE : une taxe locale peut s'appliquer", 254 "subscription.euTaxInfo" : "Résidents de l'UE : une taxe locale peut s'appliquer",
256 "subscription.features.ads" : "Plus de pubs !", 255 "subscription.features.ads" : "Plus de pubs !",
257 "subscription.features.comingSoon" : "Bientôt disponible", 256 "subscription.features.comingSoon" : "Bientôt disponible",
258 "subscription.features.encryptedSync" : "Synchronisation de session cryptée",
259 "subscription.features.noInterruptions" : "Aucun délai dans l'application ni de harcèlement pour mettre à niveau la licence", 257 "subscription.features.noInterruptions" : "Aucun délai dans l'application ni de harcèlement pour mettre à niveau la licence",
260 "subscription.features.onpremise" : "Ajouter des services locaux\/hébergés comme HipChat",
261 "subscription.features.onpremise.mattermost" : "Ajouter des services auto-hébergés comme Mattermost", 258 "subscription.features.onpremise.mattermost" : "Ajouter des services auto-hébergés comme Mattermost",
262 "subscription.features.proxy" : "Support proxy pour les services", 259 "subscription.features.proxy" : "Support proxy pour les services",
263 "subscription.features.spellchecker" : "Prise en charge du correcteur orthographique", 260 "subscription.features.spellchecker" : "Prise en charge du correcteur orthographique",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Recharger", 277 "tabs.item.reload" : "Recharger",
281 "validation.email" : "{field} n'est pas valide", 278 "validation.email" : "{field} n'est pas valide",
282 "validation.minLength" : "{field} doit contenir au moins {length} caractère(s)", 279 "validation.minLength" : "{field} doit contenir au moins {length} caractère(s)",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} est requis", 281 "validation.required" : "{field} est requis",
284 "validation.url" : "{field} n'est pas une URL valide", 282 "validation.url" : "{field} n'est pas une URL valide",
285 "welcome.loginButton" : "Se connecter sur son compte", 283 "welcome.loginButton" : "Se connecter sur son compte",
286 "welcome.signupButton" : "Créer un compte gratuit", 284 "welcome.signupButton" : "Créer un compte gratuit"
287 "welcome.slogan" : "Une messagerie qui fonctionne pour vous"
288} 285}
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index 2b3d39b73..eb7c04491 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Tacaíocht", 70 "menu.help.support" : "Tacaíocht",
71 "menu.help.tos" : "Téarmaí tagartha", 71 "menu.help.tos" : "Téarmaí tagartha",
72 "menu.services" : "Seirbhísí", 72 "menu.services" : "Seirbhísí",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Cuir seirbhís nua leis", 74 "menu.services.addNewService" : "Cuir seirbhís nua leis",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Amharc", 76 "menu.view" : "Amharc",
75 "menu.view.enterFullScreen" : "Cuir isteach mód lánscáileáin", 77 "menu.view.enterFullScreen" : "Cuir isteach mód lánscáileáin",
76 "menu.view.exitFullScreen" : "Scoir mód lánscáileáin", 78 "menu.view.exitFullScreen" : "Scoir mód lánscáileáin",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Íoslódáil", 130 "settings.account.invoiceDownload" : "Íoslódáil",
129 "settings.account.manageSubscription.label" : "Bainistigh do shíntiús", 131 "settings.account.manageSubscription.label" : "Bainistigh do shíntiús",
130 "settings.account.successInfo" : "Sábháladh do chuid athruithe", 132 "settings.account.successInfo" : "Sábháladh do chuid athruithe",
133 "settings.account.tryReloadServices" : "Atriail",
131 "settings.account.tryReloadUserInfoRequest" : "Atriail", 134 "settings.account.tryReloadUserInfoRequest" : "Atriail",
132 "settings.account.userInfoRequestFailed" : "Ní féidir eolas úsáideora a lódáil", 135 "settings.account.userInfoRequestFailed" : "Ní féidir eolas úsáideora a lódáil",
133 "settings.app.buttonClearAllCache" : "Glan taisce", 136 "settings.app.buttonClearAllCache" : "Glan taisce",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Cuir leagain béite san áireamh", 143 "settings.app.form.beta" : "Cuir leagain béite san áireamh",
141 "settings.app.form.darkMode" : "Join the Dark Side", 144 "settings.app.form.darkMode" : "Join the Dark Side",
142 "settings.app.form.enableGPUAcceleration" : "Cumasaigh luasghéarú APG", 145 "settings.app.form.enableGPUAcceleration" : "Cumasaigh luasghéarú APG",
143 "settings.app.form.enableMenuBar" : "Taispeáin Franz sa bharra roghchláir",
144 "settings.app.form.enableSpellchecking" : "Cumasaigh seiceáil litrithe", 146 "settings.app.form.enableSpellchecking" : "Cumasaigh seiceáil litrithe",
145 "settings.app.form.enableSystemTray" : "Taispeáin Franz i dtráidire an chórais", 147 "settings.app.form.enableSystemTray" : "Taispeáin Franz i dtráidire an chórais",
146 "settings.app.form.hideDockIcon" : "Cuir íocóin Franz i bhfolach ón leaba nasctha",
147 "settings.app.form.language" : "Teanga", 148 "settings.app.form.language" : "Teanga",
148 "settings.app.form.minimizeToSystemTray" : "Íoslaghdaigh Franz chuig tráidire an chórais", 149 "settings.app.form.minimizeToSystemTray" : "Íoslaghdaigh Franz chuig tráidire an chórais",
149 "settings.app.form.runInBackground" : "Coimeád Franz sa chúlra nuair a dhúntar an fhuinneog", 150 "settings.app.form.runInBackground" : "Coimeád Franz sa chúlra nuair a dhúntar an fhuinneog",
150 "settings.app.form.showDisabledServices" : "Taispeáin tabanna do sheirbhísí dhíchumasaithe", 151 "settings.app.form.showDisabledServices" : "Taispeáin tabanna do sheirbhísí dhíchumasaithe",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Taispeáin teachtaireachtaí neamhléite, nuair a dhíchumasaítear fógraí", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Taispeáin teachtaireachtaí neamhléite, nuair a dhíchumasaítear fógraí",
152 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
153 "settings.app.headline" : "Socruithe", 153 "settings.app.headline" : "Socruithe",
154 "settings.app.headlineAdvanced" : "Casta", 154 "settings.app.headlineAdvanced" : "Casta",
155 "settings.app.headlineAppearance" : "Dealramh", 155 "settings.app.headlineAppearance" : "Dealramh",
@@ -212,8 +212,6 @@
212 "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.",
213 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "User (optional)",
214 "settings.service.form.saveButton" : "Sábháil seirbhís", 214 "settings.service.form.saveButton" : "Sábháil seirbhís",
215 "settings.service.form.spellcheckerLanguage" : "Spell checking Language",
216 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})",
217 "settings.service.form.tabHosted" : "Óstáilte", 215 "settings.service.form.tabHosted" : "Óstáilte",
218 "settings.service.form.tabOnPremise" : "Féinóstáilte ⭐️", 216 "settings.service.form.tabOnPremise" : "Féinóstáilte ⭐️",
219 "settings.service.form.team" : "Foireann", 217 "settings.service.form.team" : "Foireann",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Aimsigh seirbhísí", 221 "settings.services.discoverServices" : "Aimsigh seirbhísí",
224 "settings.services.headline" : "Do sheirbhísí", 222 "settings.services.headline" : "Do sheirbhísí",
225 "settings.services.noServicesAdded" : "Níl aon seirbhís curtha agat go fóill.", 223 "settings.services.noServicesAdded" : "Níl aon seirbhís curtha agat go fóill.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Seirbhís díchumasaithe", 225 "settings.services.tooltip.isDisabled" : "Seirbhís díchumasaithe",
227 "settings.services.tooltip.isMuted" : "Tachtar gach fuaim", 226 "settings.services.tooltip.isMuted" : "Tachtar gach fuaim",
228 "settings.services.tooltip.notificationsDisabled" : "Fógraí dhíchumasaithe", 227 "settings.services.tooltip.notificationsDisabled" : "Fógraí dhíchumasaithe",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Áithritheoirí an tAÉ: is féidir cáin díolacháin áitiúla a chur i bhfeidhm", 254 "subscription.euTaxInfo" : "Áithritheoirí an tAÉ: is féidir cáin díolacháin áitiúla a chur i bhfeidhm",
256 "subscription.features.ads" : "Fógraí ar bith, choíche!", 255 "subscription.features.ads" : "Fógraí ar bith, choíche!",
257 "subscription.features.comingSoon" : "ag teacht go luath", 256 "subscription.features.comingSoon" : "ag teacht go luath",
258 "subscription.features.encryptedSync" : "Sionchronú seisiúin chriptithe",
259 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 257 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
260 "subscription.features.onpremise" : "Cuir seirbhísí óstáilte ar nós HipChat leis",
261 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 258 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
262 "subscription.features.proxy" : "Proxy support for services", 259 "subscription.features.proxy" : "Proxy support for services",
263 "subscription.features.spellchecker" : "Support for spellchecker", 260 "subscription.features.spellchecker" : "Support for spellchecker",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Athlódáil", 277 "tabs.item.reload" : "Athlódáil",
281 "validation.email" : "Níl {field} neamhbhailí", 278 "validation.email" : "Níl {field} neamhbhailí",
282 "validation.minLength" : "Ba cheart go mbeadh {field} ar a laghad {length} charactar fada", 279 "validation.minLength" : "Ba cheart go mbeadh {field} ar a laghad {length} charactar fada",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "Tá {field} de dhíth", 281 "validation.required" : "Tá {field} de dhíth",
284 "validation.url" : "Ní AAA bhailí é {field}", 282 "validation.url" : "Ní AAA bhailí é {field}",
285 "welcome.loginButton" : "Logáil isteach i do chuntas", 283 "welcome.loginButton" : "Logáil isteach i do chuntas",
286 "welcome.signupButton" : "Cruthaigh cuntas nua", 284 "welcome.signupButton" : "Cruthaigh cuntas nua"
287 "welcome.slogan" : "Teachtaireachtaí a oibríonn duitse"
288} 285}
diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json
index dc1d579fa..95920c4ce 100644
--- a/src/i18n/locales/hr.json
+++ b/src/i18n/locales/hr.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Support", 70 "menu.help.support" : "Support",
71 "menu.help.tos" : "Terms of Service", 71 "menu.help.tos" : "Terms of Service",
72 "menu.services" : "Services", 72 "menu.services" : "Services",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Add New Service...", 74 "menu.services.addNewService" : "Add New Service...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "View", 76 "menu.view" : "View",
75 "menu.view.enterFullScreen" : "Enter Full Screen", 77 "menu.view.enterFullScreen" : "Enter Full Screen",
76 "menu.view.exitFullScreen" : "Exit Full Screen", 78 "menu.view.exitFullScreen" : "Exit Full Screen",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Preuzmite", 130 "settings.account.invoiceDownload" : "Preuzmite",
129 "settings.account.manageSubscription.label" : "Upravljajte pretplatama", 131 "settings.account.manageSubscription.label" : "Upravljajte pretplatama",
130 "settings.account.successInfo" : "Vaše promjene su spremljene", 132 "settings.account.successInfo" : "Vaše promjene su spremljene",
133 "settings.account.tryReloadServices" : "Pokušajte ponovno",
131 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno", 134 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno",
132 "settings.account.userInfoRequestFailed" : "Nije moguće učitati informacije o korisniku", 135 "settings.account.userInfoRequestFailed" : "Nije moguće učitati informacije o korisniku",
133 "settings.app.buttonClearAllCache" : "Očisti memoriju", 136 "settings.app.buttonClearAllCache" : "Očisti memoriju",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Obuhvati i beta verzije", 143 "settings.app.form.beta" : "Obuhvati i beta verzije",
141 "settings.app.form.darkMode" : "Join the Dark Side", 144 "settings.app.form.darkMode" : "Join the Dark Side",
142 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 145 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
143 "settings.app.form.enableMenuBar" : "Prikaži Franz u traci izbornika",
144 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa", 146 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa",
145 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci", 147 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci",
146 "settings.app.form.hideDockIcon" : "Sakrij ikonu Franz u prostoru za obavijesti",
147 "settings.app.form.language" : "Jezik", 148 "settings.app.form.language" : "Jezik",
148 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku", 149 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku",
149 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren", 150 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren",
150 "settings.app.form.showDisabledServices" : "Prikaži ploče s onemogućenim servisima", 151 "settings.app.form.showDisabledServices" : "Prikaži ploče s onemogućenim servisima",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Pokaži nepročitane značke poruka kad se obavještenja onemoguće", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Pokaži nepročitane značke poruka kad se obavještenja onemoguće",
152 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
153 "settings.app.headline" : "Postavke", 153 "settings.app.headline" : "Postavke",
154 "settings.app.headlineAdvanced" : "Napredne alatke", 154 "settings.app.headlineAdvanced" : "Napredne alatke",
155 "settings.app.headlineAppearance" : "Izgled", 155 "settings.app.headlineAppearance" : "Izgled",
@@ -212,8 +212,6 @@
212 "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.",
213 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "User (optional)",
214 "settings.service.form.saveButton" : "Sačuvaj uslugu\/e", 214 "settings.service.form.saveButton" : "Sačuvaj uslugu\/e",
215 "settings.service.form.spellcheckerLanguage" : "Spell checking Language",
216 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})",
217 "settings.service.form.tabHosted" : "Hostovano", 215 "settings.service.form.tabHosted" : "Hostovano",
218 "settings.service.form.tabOnPremise" : "Samo-hostovano ⭐️", 216 "settings.service.form.tabOnPremise" : "Samo-hostovano ⭐️",
219 "settings.service.form.team" : "Tim", 217 "settings.service.form.team" : "Tim",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Pronađite usluge", 221 "settings.services.discoverServices" : "Pronađite usluge",
224 "settings.services.headline" : "Vaše usluge", 222 "settings.services.headline" : "Vaše usluge",
225 "settings.services.noServicesAdded" : "Još uvijek niste unijeli niti jednu uslugu.", 223 "settings.services.noServicesAdded" : "Još uvijek niste unijeli niti jednu uslugu.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Usluga je onemogućena. ", 225 "settings.services.tooltip.isDisabled" : "Usluga je onemogućena. ",
227 "settings.services.tooltip.isMuted" : "Svi zvukovi su onemogućeni. ", 226 "settings.services.tooltip.isMuted" : "Svi zvukovi su onemogućeni. ",
228 "settings.services.tooltip.notificationsDisabled" : "Obavijesti su onemogućene.", 227 "settings.services.tooltip.notificationsDisabled" : "Obavijesti su onemogućene.",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje ", 254 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje ",
256 "subscription.features.ads" : "Bez reklama, doživotno!", 255 "subscription.features.ads" : "Bez reklama, doživotno!",
257 "subscription.features.comingSoon" : "Dolazi uskoro", 256 "subscription.features.comingSoon" : "Dolazi uskoro",
258 "subscription.features.encryptedSync" : "Kodirano usklađivanje sesija.",
259 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 257 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
260 "subscription.features.onpremise" : "Dodajte pretpostavljeni\/hostirani servis kao što ima usluga HipChat ",
261 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 258 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
262 "subscription.features.proxy" : "Proxy support for services", 259 "subscription.features.proxy" : "Proxy support for services",
263 "subscription.features.spellchecker" : "Support for spellchecker", 260 "subscription.features.spellchecker" : "Support for spellchecker",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Ponovno učitavanje", 277 "tabs.item.reload" : "Ponovno učitavanje",
281 "validation.email" : "{field} is not valid", 278 "validation.email" : "{field} is not valid",
282 "validation.minLength" : "{field} should be at least {length} characters long", 279 "validation.minLength" : "{field} should be at least {length} characters long",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} is required", 281 "validation.required" : "{field} is required",
284 "validation.url" : "{field} is not a valid URL", 282 "validation.url" : "{field} is not a valid URL",
285 "welcome.loginButton" : "Prijavite se na račun", 283 "welcome.loginButton" : "Prijavite se na račun",
286 "welcome.signupButton" : "Stvorite novi korisnički račun", 284 "welcome.signupButton" : "Stvorite novi korisnički račun"
287 "welcome.slogan" : "Poruke koje su stvorene za tebe"
288} 285}
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index ddaffeebb..bce9a368e 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Támogatás", 70 "menu.help.support" : "Támogatás",
71 "menu.help.tos" : "Felhasználói feltételek", 71 "menu.help.tos" : "Felhasználói feltételek",
72 "menu.services" : "Szolgáltatások", 72 "menu.services" : "Szolgáltatások",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Új szolgáltatás hozzáadása...", 74 "menu.services.addNewService" : "Új szolgáltatás hozzáadása...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Nézet", 76 "menu.view" : "Nézet",
75 "menu.view.enterFullScreen" : "Kilépés a teljes képernyős módból", 77 "menu.view.enterFullScreen" : "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", 78 "menu.view.exitFullScreen" : "Kilépés a teljes képernyős módból",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Letöltés", 130 "settings.account.invoiceDownload" : "Letöltés",
129 "settings.account.manageSubscription.label" : "Előfizetés kezelése", 131 "settings.account.manageSubscription.label" : "Előfizetés kezelése",
130 "settings.account.successInfo" : "A módosításokat elmentettük", 132 "settings.account.successInfo" : "A módosításokat elmentettük",
133 "settings.account.tryReloadServices" : "Próbáld újra",
131 "settings.account.tryReloadUserInfoRequest" : "Próbáld újra", 134 "settings.account.tryReloadUserInfoRequest" : "Próbáld újra",
132 "settings.account.userInfoRequestFailed" : "A felhasználói adatok betöltése sikertelen", 135 "settings.account.userInfoRequestFailed" : "A felhasználói adatok betöltése sikertelen",
133 "settings.app.buttonClearAllCache" : "Gyorsítótár törlése", 136 "settings.app.buttonClearAllCache" : "Gyorsítótár törlése",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Béta verziók keresése", 143 "settings.app.form.beta" : "Béta verziók keresése",
141 "settings.app.form.darkMode" : "Csatlakozz a Sötét Oldalhoz", 144 "settings.app.form.darkMode" : "Csatlakozz a Sötét Oldalhoz",
142 "settings.app.form.enableGPUAcceleration" : "Hardveres gyorsítás engedélyezése", 145 "settings.app.form.enableGPUAcceleration" : "Hardveres gyorsítás engedélyezése",
143 "settings.app.form.enableMenuBar" : "Franz megjelenítése a menüsorban",
144 "settings.app.form.enableSpellchecking" : "Helyesírás-ellenőrzés engedélyezése", 146 "settings.app.form.enableSpellchecking" : "Helyesírás-ellenőrzés engedélyezése",
145 "settings.app.form.enableSystemTray" : "Franz mutatása a tálcán", 147 "settings.app.form.enableSystemTray" : "Franz mutatása a tálcán",
146 "settings.app.form.hideDockIcon" : "Franz ikon elrejtése a Dock mögött",
147 "settings.app.form.language" : "Nyelv", 148 "settings.app.form.language" : "Nyelv",
148 "settings.app.form.minimizeToSystemTray" : "Franz kicsinyítése a tálcára", 149 "settings.app.form.minimizeToSystemTray" : "Franz kicsinyítése a tálcára",
149 "settings.app.form.runInBackground" : "Franz fusson a háttérben az ablak bezárásakor", 150 "settings.app.form.runInBackground" : "Franz fusson a háttérben az ablak bezárásakor",
150 "settings.app.form.showDisabledServices" : "Letiltott szolgáltatások megjelenítése", 151 "settings.app.form.showDisabledServices" : "Letiltott szolgáltatások megjelenítése",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Mutassa az 'olvasatlan üzenet' jelzést, amikor az értesítések le vannak tiltva", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Mutassa az 'olvasatlan üzenet' jelzést, amikor az értesítések le vannak tiltva",
152 "settings.app.form.spellcheckerLanguage" : "Helyesírás-ellenőrző nyelve",
153 "settings.app.headline" : "Beállítások", 153 "settings.app.headline" : "Beállítások",
154 "settings.app.headlineAdvanced" : "Haladó", 154 "settings.app.headlineAdvanced" : "Haladó",
155 "settings.app.headlineAppearance" : "Megjelenés", 155 "settings.app.headlineAppearance" : "Megjelenés",
@@ -212,8 +212,6 @@
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.", 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.",
213 "settings.service.form.proxy.user" : "Felhasználó (opcionális)", 213 "settings.service.form.proxy.user" : "Felhasználó (opcionális)",
214 "settings.service.form.saveButton" : "Szolgáltatás mentése", 214 "settings.service.form.saveButton" : "Szolgáltatás mentése",
215 "settings.service.form.spellcheckerLanguage" : "Helyesírás-ellenőrző nyelve",
216 "settings.service.form.spellcheckerLanguage.default" : "Rendszer alapbeállítás használata ({default})",
217 "settings.service.form.tabHosted" : "Üzemeltetett", 215 "settings.service.form.tabHosted" : "Üzemeltetett",
218 "settings.service.form.tabOnPremise" : "Egyénileg üzemeltetett", 216 "settings.service.form.tabOnPremise" : "Egyénileg üzemeltetett",
219 "settings.service.form.team" : "Csapat", 217 "settings.service.form.team" : "Csapat",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Szolgáltatások felfedezése", 221 "settings.services.discoverServices" : "Szolgáltatások felfedezése",
224 "settings.services.headline" : "Szolgáltatásaid", 222 "settings.services.headline" : "Szolgáltatásaid",
225 "settings.services.noServicesAdded" : "Még nem adtál hozzá egyetlen szolgáltatást sem eddig.", 223 "settings.services.noServicesAdded" : "Még nem adtál hozzá egyetlen szolgáltatást sem eddig.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "A szolgáltatás le van tiltva", 225 "settings.services.tooltip.isDisabled" : "A szolgáltatás le van tiltva",
227 "settings.services.tooltip.isMuted" : "Minden hang lenémítva", 226 "settings.services.tooltip.isMuted" : "Minden hang lenémítva",
228 "settings.services.tooltip.notificationsDisabled" : "Értesítések letiltva", 227 "settings.services.tooltip.notificationsDisabled" : "Értesítések letiltva",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "EU állampolgárok: helyi vásárlás esetén adók kerülhetnek felszámolásra", 254 "subscription.euTaxInfo" : "EU állampolgárok: helyi vásárlás esetén adók kerülhetnek felszámolásra",
256 "subscription.features.ads" : "Hirdetésmentes, mindig!", 255 "subscription.features.ads" : "Hirdetésmentes, mindig!",
257 "subscription.features.comingSoon" : "hamarosan", 256 "subscription.features.comingSoon" : "hamarosan",
258 "subscription.features.encryptedSync" : "Titkosított munkamenet szinkronizálás",
259 "subscription.features.noInterruptions" : "Nincs több app késlekedés és liszencfrissítési piszkálás", 257 "subscription.features.noInterruptions" : "Nincs több app késlekedés és liszencfrissítési piszkálás",
260 "subscription.features.onpremise" : "Helyi\/üzemeltetett szolgáltatások használata, pl. HipChat",
261 "subscription.features.onpremise.mattermost" : "Saját kiszolgálós szolgáltatások hozzáadása, pl.: Mattermost", 258 "subscription.features.onpremise.mattermost" : "Saját kiszolgálós szolgáltatások hozzáadása, pl.: Mattermost",
262 "subscription.features.proxy" : "Proxy támogatás a szolgáltatásokhoz", 259 "subscription.features.proxy" : "Proxy támogatás a szolgáltatásokhoz",
263 "subscription.features.spellchecker" : "Támogatás a Helyesírás-ellenőrzőhöz", 260 "subscription.features.spellchecker" : "Támogatás a Helyesírás-ellenőrzőhöz",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Újratöltés", 277 "tabs.item.reload" : "Újratöltés",
281 "validation.email" : "{field} nem érvényes", 278 "validation.email" : "{field} nem érvényes",
282 "validation.minLength" : "{field} mezőnek legalább {length} karakter hosszúnak kell lennie", 279 "validation.minLength" : "{field} mezőnek legalább {length} karakter hosszúnak kell lennie",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} kitöltése kötelező", 281 "validation.required" : "{field} kitöltése kötelező",
284 "validation.url" : "{field} nem érvényes URL", 282 "validation.url" : "{field} nem érvényes URL",
285 "welcome.loginButton" : "Jelentkezz be a fiókodba", 283 "welcome.loginButton" : "Jelentkezz be a fiókodba",
286 "welcome.signupButton" : "Új fiók létrehozása", 284 "welcome.signupButton" : "Új fiók létrehozása"
287 "welcome.slogan" : "Üzenetküldés okosan"
288} 285}
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index 6abbf064b..73271dceb 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Dukungan", 70 "menu.help.support" : "Dukungan",
71 "menu.help.tos" : "Ketentuan Layanan", 71 "menu.help.tos" : "Ketentuan Layanan",
72 "menu.services" : "Layanan", 72 "menu.services" : "Layanan",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Tambahkan Layanan Baru...", 74 "menu.services.addNewService" : "Tambahkan Layanan Baru...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Tampilan", 76 "menu.view" : "Tampilan",
75 "menu.view.enterFullScreen" : "Masuk ke Mode Layar Penuh", 77 "menu.view.enterFullScreen" : "Masuk ke Mode Layar Penuh",
76 "menu.view.exitFullScreen" : "Keluar dari Layar Penuh", 78 "menu.view.exitFullScreen" : "Keluar dari Layar Penuh",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Unduh", 130 "settings.account.invoiceDownload" : "Unduh",
129 "settings.account.manageSubscription.label" : "Kelola langganan Anda", 131 "settings.account.manageSubscription.label" : "Kelola langganan Anda",
130 "settings.account.successInfo" : "Perubahan Anda telah disimpan", 132 "settings.account.successInfo" : "Perubahan Anda telah disimpan",
133 "settings.account.tryReloadServices" : "Coba lagi",
131 "settings.account.tryReloadUserInfoRequest" : "Coba lagi", 134 "settings.account.tryReloadUserInfoRequest" : "Coba lagi",
132 "settings.account.userInfoRequestFailed" : "Gagal memuat informasi pengguna", 135 "settings.account.userInfoRequestFailed" : "Gagal memuat informasi pengguna",
133 "settings.app.buttonClearAllCache" : "Bersihkan singgahan", 136 "settings.app.buttonClearAllCache" : "Bersihkan singgahan",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Sertakan versi beta", 143 "settings.app.form.beta" : "Sertakan versi beta",
141 "settings.app.form.darkMode" : "Sisi Kelam menunggu Anda (Mode Gelap)", 144 "settings.app.form.darkMode" : "Sisi Kelam menunggu Anda (Mode Gelap)",
142 "settings.app.form.enableGPUAcceleration" : "Aktifkan Akselerasi GPU", 145 "settings.app.form.enableGPUAcceleration" : "Aktifkan Akselerasi GPU",
143 "settings.app.form.enableMenuBar" : "Tampilkan Franz di Bilah Menu",
144 "settings.app.form.enableSpellchecking" : "Aktifkan pemeriksaan ejaan", 146 "settings.app.form.enableSpellchecking" : "Aktifkan pemeriksaan ejaan",
145 "settings.app.form.enableSystemTray" : "Tampilkan Franz di baki sistem", 147 "settings.app.form.enableSystemTray" : "Tampilkan Franz di baki sistem",
146 "settings.app.form.hideDockIcon" : "Sembunyikan ikon Franz di Dock",
147 "settings.app.form.language" : "Bahasa", 148 "settings.app.form.language" : "Bahasa",
148 "settings.app.form.minimizeToSystemTray" : "Perkecil Franz ke baki sistem", 149 "settings.app.form.minimizeToSystemTray" : "Perkecil Franz ke baki sistem",
149 "settings.app.form.runInBackground" : "Tetap jalankan Franz di latar belakang saat menutup jendela", 150 "settings.app.form.runInBackground" : "Tetap jalankan Franz di latar belakang saat menutup jendela",
150 "settings.app.form.showDisabledServices" : "Tampilkan tab layanan yang dinonaktifkan", 151 "settings.app.form.showDisabledServices" : "Tampilkan tab layanan yang dinonaktifkan",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Tampilkan lencana pesan belum dibaca saat pemberitahuan dinonaktifkan", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Tampilkan lencana pesan belum dibaca saat pemberitahuan dinonaktifkan",
152 "settings.app.form.spellcheckerLanguage" : "Periksa ejaan",
153 "settings.app.headline" : "Pengaturan", 153 "settings.app.headline" : "Pengaturan",
154 "settings.app.headlineAdvanced" : "Tingkat Lanjut", 154 "settings.app.headlineAdvanced" : "Tingkat Lanjut",
155 "settings.app.headlineAppearance" : "Tampilan", 155 "settings.app.headlineAppearance" : "Tampilan",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Silahkan mulai ulang Franz setelah mengubah Setelan proxy", 212 "settings.service.form.proxy.restartInfo" : "Silahkan mulai ulang Franz setelah mengubah Setelan proxy",
213 "settings.service.form.proxy.user" : "Pengguna (opsional)", 213 "settings.service.form.proxy.user" : "Pengguna (opsional)",
214 "settings.service.form.saveButton" : "Simpan layanan", 214 "settings.service.form.saveButton" : "Simpan layanan",
215 "settings.service.form.spellcheckerLanguage" : "Periksa ejaan Bahasa",
216 "settings.service.form.spellcheckerLanguage.default" : "Gunakan Bawaan Sistem ({default})",
217 "settings.service.form.tabHosted" : "Hosted", 215 "settings.service.form.tabHosted" : "Hosted",
218 "settings.service.form.tabOnPremise" : "Hosted mandiri", 216 "settings.service.form.tabOnPremise" : "Hosted mandiri",
219 "settings.service.form.team" : "Tim", 217 "settings.service.form.team" : "Tim",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Temukan layanan", 221 "settings.services.discoverServices" : "Temukan layanan",
224 "settings.services.headline" : "Layanan Anda", 222 "settings.services.headline" : "Layanan Anda",
225 "settings.services.noServicesAdded" : "Anda belum menambahkan layanan apa pun.", 223 "settings.services.noServicesAdded" : "Anda belum menambahkan layanan apa pun.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Layanan dinonaktifkan", 225 "settings.services.tooltip.isDisabled" : "Layanan dinonaktifkan",
227 "settings.services.tooltip.isMuted" : "Semua suara dibisukan", 226 "settings.services.tooltip.isMuted" : "Semua suara dibisukan",
228 "settings.services.tooltip.notificationsDisabled" : "Pemberitahuan dinonaktifkan", 227 "settings.services.tooltip.notificationsDisabled" : "Pemberitahuan dinonaktifkan",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Warga UE: pajak penjualan lokal mungkin berlaku", 254 "subscription.euTaxInfo" : "Warga UE: pajak penjualan lokal mungkin berlaku",
256 "subscription.features.ads" : "Tanpa iklan, selamanya!", 255 "subscription.features.ads" : "Tanpa iklan, selamanya!",
257 "subscription.features.comingSoon" : "segera hadir", 256 "subscription.features.comingSoon" : "segera hadir",
258 "subscription.features.encryptedSync" : "Sinkronisasi sesi terenkripsi",
259 "subscription.features.noInterruptions" : "Tanpa menunggu dan ditanya untuk meningkatkan lisensi", 257 "subscription.features.noInterruptions" : "Tanpa menunggu dan ditanya untuk meningkatkan lisensi",
260 "subscription.features.onpremise" : "Integrasi layanan hosted, misalnya HipChat",
261 "subscription.features.onpremise.mattermost" : "Integrasi layanan hosted, misalnya Mattermost", 258 "subscription.features.onpremise.mattermost" : "Integrasi layanan hosted, misalnya Mattermost",
262 "subscription.features.proxy" : "Dukungan proksi untuk layanan", 259 "subscription.features.proxy" : "Dukungan proksi untuk layanan",
263 "subscription.features.spellchecker" : "Dukungan pengecek ejaan", 260 "subscription.features.spellchecker" : "Dukungan pengecek ejaan",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Muat Ulang", 277 "tabs.item.reload" : "Muat Ulang",
281 "validation.email" : "{field} tidak benar", 278 "validation.email" : "{field} tidak benar",
282 "validation.minLength" : "{field} setidaknya harus {length} karakter", 279 "validation.minLength" : "{field} setidaknya harus {length} karakter",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} wajib diisi", 281 "validation.required" : "{field} wajib diisi",
284 "validation.url" : "{field} bukan URL yang benar", 282 "validation.url" : "{field} bukan URL yang benar",
285 "welcome.loginButton" : "Masuk ke akun Anda", 283 "welcome.loginButton" : "Masuk ke akun Anda",
286 "welcome.signupButton" : "Buat akun gratis", 284 "welcome.signupButton" : "Buat akun gratis"
287 "welcome.slogan" : "Perpesanan yang bekerja untuk Anda"
288} 285}
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index b63b30a90..71150483c 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Supporto", 70 "menu.help.support" : "Supporto",
71 "menu.help.tos" : "Termini di Servizio", 71 "menu.help.tos" : "Termini di Servizio",
72 "menu.services" : "Servizi", 72 "menu.services" : "Servizi",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Aggiungi Nuovo Servizio...", 74 "menu.services.addNewService" : "Aggiungi Nuovo Servizio...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Visualizza", 76 "menu.view" : "Visualizza",
75 "menu.view.enterFullScreen" : "Visualizza a Schermo Intero", 77 "menu.view.enterFullScreen" : "Visualizza a Schermo Intero",
76 "menu.view.exitFullScreen" : "Esci da Schermo Intero", 78 "menu.view.exitFullScreen" : "Esci da Schermo Intero",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Scarica", 130 "settings.account.invoiceDownload" : "Scarica",
129 "settings.account.manageSubscription.label" : "Gestisci il tuo abbonamento", 131 "settings.account.manageSubscription.label" : "Gestisci il tuo abbonamento",
130 "settings.account.successInfo" : "Le tue modifiche sono state salvate", 132 "settings.account.successInfo" : "Le tue modifiche sono state salvate",
133 "settings.account.tryReloadServices" : "Prova di nuovo",
131 "settings.account.tryReloadUserInfoRequest" : "Prova di nuovo", 134 "settings.account.tryReloadUserInfoRequest" : "Prova di nuovo",
132 "settings.account.userInfoRequestFailed" : "Impossibile caricare le informazioni dell'utente.", 135 "settings.account.userInfoRequestFailed" : "Impossibile caricare le informazioni dell'utente.",
133 "settings.app.buttonClearAllCache" : "Svuota la cache", 136 "settings.app.buttonClearAllCache" : "Svuota la cache",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Includi versioni beta", 143 "settings.app.form.beta" : "Includi versioni beta",
141 "settings.app.form.darkMode" : "Unisciti al Lato Oscuro.", 144 "settings.app.form.darkMode" : "Unisciti al Lato Oscuro.",
142 "settings.app.form.enableGPUAcceleration" : "Attiva Accelerazione GPU", 145 "settings.app.form.enableGPUAcceleration" : "Attiva Accelerazione GPU",
143 "settings.app.form.enableMenuBar" : "Mostra Franz nella Barra del Menu",
144 "settings.app.form.enableSpellchecking" : "Attiva controllo ortografico", 146 "settings.app.form.enableSpellchecking" : "Attiva controllo ortografico",
145 "settings.app.form.enableSystemTray" : "Mostra Franz nell'area di notifica", 147 "settings.app.form.enableSystemTray" : "Mostra Franz nell'area di notifica",
146 "settings.app.form.hideDockIcon" : "Nascondi l'icona Franz nel Dock",
147 "settings.app.form.language" : "Lingua", 148 "settings.app.form.language" : "Lingua",
148 "settings.app.form.minimizeToSystemTray" : "Minimizza Franz nell'area di notifica", 149 "settings.app.form.minimizeToSystemTray" : "Minimizza Franz nell'area di notifica",
149 "settings.app.form.runInBackground" : "Mantieni Franz in esecuzione quando chiudi la finestra", 150 "settings.app.form.runInBackground" : "Mantieni Franz in esecuzione quando chiudi la finestra",
150 "settings.app.form.showDisabledServices" : "Mostra schede servizi disattivati", 151 "settings.app.form.showDisabledServices" : "Mostra schede servizi disattivati",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra l'etichetta dei messaggi non letti quando le notifiche sono disattivate", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra l'etichetta dei messaggi non letti quando le notifiche sono disattivate",
152 "settings.app.form.spellcheckerLanguage" : "Lingua per controllo ortografico",
153 "settings.app.headline" : "Impostazioni", 153 "settings.app.headline" : "Impostazioni",
154 "settings.app.headlineAdvanced" : "Avanzate", 154 "settings.app.headlineAdvanced" : "Avanzate",
155 "settings.app.headlineAppearance" : "Aspetto", 155 "settings.app.headlineAppearance" : "Aspetto",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Riavvia Franz dopo aver cambiato le impostazioni del proxy.", 212 "settings.service.form.proxy.restartInfo" : "Riavvia Franz dopo aver cambiato le impostazioni del proxy.",
213 "settings.service.form.proxy.user" : "Utente (opzionale)", 213 "settings.service.form.proxy.user" : "Utente (opzionale)",
214 "settings.service.form.saveButton" : "Salva servizio", 214 "settings.service.form.saveButton" : "Salva servizio",
215 "settings.service.form.spellcheckerLanguage" : "Lingua per controllo ortografico",
216 "settings.service.form.spellcheckerLanguage.default" : "Usa le impostazioni predefinite di sistema ({default})",
217 "settings.service.form.tabHosted" : "Hosted", 215 "settings.service.form.tabHosted" : "Hosted",
218 "settings.service.form.tabOnPremise" : "Self hosted ⭐️", 216 "settings.service.form.tabOnPremise" : "Self hosted ⭐️",
219 "settings.service.form.team" : "Gruppo", 217 "settings.service.form.team" : "Gruppo",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Scopri servizi", 221 "settings.services.discoverServices" : "Scopri servizi",
224 "settings.services.headline" : "I tuoi servizi", 222 "settings.services.headline" : "I tuoi servizi",
225 "settings.services.noServicesAdded" : "Non hai aggiunto ancora nessun servizio.", 223 "settings.services.noServicesAdded" : "Non hai aggiunto ancora nessun servizio.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Il servizio è disattivato", 225 "settings.services.tooltip.isDisabled" : "Il servizio è disattivato",
227 "settings.services.tooltip.isMuted" : "Tutti i suoni sono disattivati", 226 "settings.services.tooltip.isMuted" : "Tutti i suoni sono disattivati",
228 "settings.services.tooltip.notificationsDisabled" : "Le notifiche sono disattivate", 227 "settings.services.tooltip.notificationsDisabled" : "Le notifiche sono disattivate",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Per i residenti UE: possono essere applicate tasse locali", 254 "subscription.euTaxInfo" : "Per i residenti UE: possono essere applicate tasse locali",
256 "subscription.features.ads" : "Nessuna pubblicità, mai!", 255 "subscription.features.ads" : "Nessuna pubblicità, mai!",
257 "subscription.features.comingSoon" : "in arrivo", 256 "subscription.features.comingSoon" : "in arrivo",
258 "subscription.features.encryptedSync" : "Sincronizzazione sessione crittografata",
259 "subscription.features.noInterruptions" : "L'upgrade della licenza avrà impatti sull'utilizzo dell'App", 257 "subscription.features.noInterruptions" : "L'upgrade della licenza avrà impatti sull'utilizzo dell'App",
260 "subscription.features.onpremise" : "Aggiungi servizi on-premise\/hosted come HipChat",
261 "subscription.features.onpremise.mattermost" : "Aggiungi servizi on-premise\/hosted come \"Mattermost\"", 258 "subscription.features.onpremise.mattermost" : "Aggiungi servizi on-premise\/hosted come \"Mattermost\"",
262 "subscription.features.proxy" : "Supporto proxy per i servizi", 259 "subscription.features.proxy" : "Supporto proxy per i servizi",
263 "subscription.features.spellchecker" : "Supporto per il correttore ortografico", 260 "subscription.features.spellchecker" : "Supporto per il correttore ortografico",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Ricarica", 277 "tabs.item.reload" : "Ricarica",
281 "validation.email" : "{field} non valido", 278 "validation.email" : "{field} non valido",
282 "validation.minLength" : "{field} dovrebbe contenere almeno {length} caratteri", 279 "validation.minLength" : "{field} dovrebbe contenere almeno {length} caratteri",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} è necessario", 281 "validation.required" : "{field} è necessario",
284 "validation.url" : "{field} non è un URL valido", 282 "validation.url" : "{field} non è un URL valido",
285 "welcome.loginButton" : "Accedi al tuo account", 283 "welcome.loginButton" : "Accedi al tuo account",
286 "welcome.signupButton" : "Crea un account gratuito", 284 "welcome.signupButton" : "Crea un account gratuito"
287 "welcome.slogan" : "Un sistema di messaggistica che va bene per te"
288} 285}
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index 838dc81ea..bd1024a34 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "サポート", 70 "menu.help.support" : "サポート",
71 "menu.help.tos" : "サービス利用規約", 71 "menu.help.tos" : "サービス利用規約",
72 "menu.services" : "サービス", 72 "menu.services" : "サービス",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "サービスを追加", 74 "menu.services.addNewService" : "サービスを追加",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "表示", 76 "menu.view" : "表示",
75 "menu.view.enterFullScreen" : "全画面表示", 77 "menu.view.enterFullScreen" : "全画面表示",
76 "menu.view.exitFullScreen" : "全画面表示を終了する", 78 "menu.view.exitFullScreen" : "全画面表示を終了する",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "ダウンロード", 130 "settings.account.invoiceDownload" : "ダウンロード",
129 "settings.account.manageSubscription.label" : "サブスクリプションの管理", 131 "settings.account.manageSubscription.label" : "サブスクリプションの管理",
130 "settings.account.successInfo" : "変更内容が保存されました", 132 "settings.account.successInfo" : "変更内容が保存されました",
133 "settings.account.tryReloadServices" : "もう一度試す",
131 "settings.account.tryReloadUserInfoRequest" : "もう一度試す", 134 "settings.account.tryReloadUserInfoRequest" : "もう一度試す",
132 "settings.account.userInfoRequestFailed" : "ユーザ情報を読み込めませんでした", 135 "settings.account.userInfoRequestFailed" : "ユーザ情報を読み込めませんでした",
133 "settings.app.buttonClearAllCache" : "キャッシュを消去する", 136 "settings.app.buttonClearAllCache" : "キャッシュを消去する",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Betaバージョンを含める", 143 "settings.app.form.beta" : "Betaバージョンを含める",
141 "settings.app.form.darkMode" : "ダークモードを有効にする", 144 "settings.app.form.darkMode" : "ダークモードを有効にする",
142 "settings.app.form.enableGPUAcceleration" : "GPUアクセラレーションを有効にする", 145 "settings.app.form.enableGPUAcceleration" : "GPUアクセラレーションを有効にする",
143 "settings.app.form.enableMenuBar" : "メニューバーにFranzを表示する",
144 "settings.app.form.enableSpellchecking" : "スペルチェックを有効にする", 146 "settings.app.form.enableSpellchecking" : "スペルチェックを有効にする",
145 "settings.app.form.enableSystemTray" : "Franzをシステムトレイに表示する", 147 "settings.app.form.enableSystemTray" : "Franzをシステムトレイに表示する",
146 "settings.app.form.hideDockIcon" : "DockからFranzを隠す",
147 "settings.app.form.language" : "言語", 148 "settings.app.form.language" : "言語",
148 "settings.app.form.minimizeToSystemTray" : "Franzをシステムトレイに最小化する", 149 "settings.app.form.minimizeToSystemTray" : "Franzをシステムトレイに最小化する",
149 "settings.app.form.runInBackground" : "ウインドウを閉じた際にFranzをバックグラウンドで実行させておく", 150 "settings.app.form.runInBackground" : "ウインドウを閉じた際にFranzをバックグラウンドで実行させておく",
150 "settings.app.form.showDisabledServices" : "無効化されたサービスのタブを表示する", 151 "settings.app.form.showDisabledServices" : "無効化されたサービスのタブを表示する",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "通知の無効時に未読メッセージ件数を表示する", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "通知の無効時に未読メッセージ件数を表示する",
152 "settings.app.form.spellcheckerLanguage" : "スペルチェックする言語",
153 "settings.app.headline" : "設定", 153 "settings.app.headline" : "設定",
154 "settings.app.headlineAdvanced" : "詳細", 154 "settings.app.headlineAdvanced" : "詳細",
155 "settings.app.headlineAppearance" : "表示スタイル", 155 "settings.app.headlineAppearance" : "表示スタイル",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "プロキシ設定を変更してから、Franzを再起動してください", 212 "settings.service.form.proxy.restartInfo" : "プロキシ設定を変更してから、Franzを再起動してください",
213 "settings.service.form.proxy.user" : "ユーザー名(任意)", 213 "settings.service.form.proxy.user" : "ユーザー名(任意)",
214 "settings.service.form.saveButton" : "サービスの保存", 214 "settings.service.form.saveButton" : "サービスの保存",
215 "settings.service.form.spellcheckerLanguage" : "言語のスペルチェック",
216 "settings.service.form.spellcheckerLanguage.default" : " {default}を初期設定で使用してください",
217 "settings.service.form.tabHosted" : "ホスト", 215 "settings.service.form.tabHosted" : "ホスト",
218 "settings.service.form.tabOnPremise" : "セルフホスト ⭐️", 216 "settings.service.form.tabOnPremise" : "セルフホスト ⭐️",
219 "settings.service.form.team" : "チーム", 217 "settings.service.form.team" : "チーム",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "サービスを探す", 221 "settings.services.discoverServices" : "サービスを探す",
224 "settings.services.headline" : "利用中のサービス", 222 "settings.services.headline" : "利用中のサービス",
225 "settings.services.noServicesAdded" : "まだ、どのサービスも追加されていません。", 223 "settings.services.noServicesAdded" : "まだ、どのサービスも追加されていません。",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "サービスが無効です", 225 "settings.services.tooltip.isDisabled" : "サービスが無効です",
227 "settings.services.tooltip.isMuted" : "無音となっています", 226 "settings.services.tooltip.isMuted" : "無音となっています",
228 "settings.services.tooltip.notificationsDisabled" : "通知は無効です", 227 "settings.services.tooltip.notificationsDisabled" : "通知は無効です",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "EU在住者 : 地域の消費税が適用される可能性があります", 254 "subscription.euTaxInfo" : "EU在住者 : 地域の消費税が適用される可能性があります",
256 "subscription.features.ads" : "広告は一切ありません!", 255 "subscription.features.ads" : "広告は一切ありません!",
257 "subscription.features.comingSoon" : "まもなく登場", 256 "subscription.features.comingSoon" : "まもなく登場",
258 "subscription.features.encryptedSync" : "暗号化されたセッションの同期",
259 "subscription.features.noInterruptions" : "待ち時間なしでFranz をお使いいただけます", 257 "subscription.features.noInterruptions" : "待ち時間なしでFranz をお使いいただけます",
260 "subscription.features.onpremise" : "HipChatのようなオンプレミス\/ホスト型サービスの追加",
261 "subscription.features.onpremise.mattermost" : "Mattermost のようなオンプレミス(自社運用)型のサービスを追加できるようになります", 258 "subscription.features.onpremise.mattermost" : "Mattermost のようなオンプレミス(自社運用)型のサービスを追加できるようになります",
262 "subscription.features.proxy" : "プロキシ設定が利用可能", 259 "subscription.features.proxy" : "プロキシ設定が利用可能",
263 "subscription.features.spellchecker" : "スペルチェック機能をお使いいただけます", 260 "subscription.features.spellchecker" : "スペルチェック機能をお使いいただけます",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "再読み込み", 277 "tabs.item.reload" : "再読み込み",
281 "validation.email" : "{field}は正しくありません", 278 "validation.email" : "{field}は正しくありません",
282 "validation.minLength" : "{field}は少なくとも{length}文字以上でなければなりません", 279 "validation.minLength" : "{field}は少なくとも{length}文字以上でなければなりません",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field}は必須です", 281 "validation.required" : "{field}は必須です",
284 "validation.url" : "{field}は正しいURLではありません", 282 "validation.url" : "{field}は正しいURLではありません",
285 "welcome.loginButton" : "アカウントにログイン", 283 "welcome.loginButton" : "アカウントにログイン",
286 "welcome.signupButton" : "無料アカウントを作成", 284 "welcome.signupButton" : "無料アカウントを作成"
287 "welcome.slogan" : "Messaging that works for you"
288} 285}
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index ec0cdd375..4796cbe9f 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Support", 70 "menu.help.support" : "Support",
71 "menu.help.tos" : "Terms of Service", 71 "menu.help.tos" : "Terms of Service",
72 "menu.services" : "Services", 72 "menu.services" : "Services",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Add New Service...", 74 "menu.services.addNewService" : "Add New Service...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "View", 76 "menu.view" : "View",
75 "menu.view.enterFullScreen" : "Enter Full Screen", 77 "menu.view.enterFullScreen" : "Enter Full Screen",
76 "menu.view.exitFullScreen" : "Exit Full Screen", 78 "menu.view.exitFullScreen" : "Exit Full Screen",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "გადმოწერა", 130 "settings.account.invoiceDownload" : "გადმოწერა",
129 "settings.account.manageSubscription.label" : "თქვენი გამოწერის მართვა", 131 "settings.account.manageSubscription.label" : "თქვენი გამოწერის მართვა",
130 "settings.account.successInfo" : "თქვენი ცვლილებები შენახულია", 132 "settings.account.successInfo" : "თქვენი ცვლილებები შენახულია",
133 "settings.account.tryReloadServices" : "სცადეთ ხელახლა",
131 "settings.account.tryReloadUserInfoRequest" : "სცადეთ ხელახლა", 134 "settings.account.tryReloadUserInfoRequest" : "სცადეთ ხელახლა",
132 "settings.account.userInfoRequestFailed" : "მომხმარებლის ინფორმაციის ჩატვირთვა ვერ მოხერხდა", 135 "settings.account.userInfoRequestFailed" : "მომხმარებლის ინფორმაციის ჩატვირთვა ვერ მოხერხდა",
133 "settings.app.buttonClearAllCache" : "Clear cache", 136 "settings.app.buttonClearAllCache" : "Clear cache",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "ჩართეთ ბეტა ვერსიები", 143 "settings.app.form.beta" : "ჩართეთ ბეტა ვერსიები",
141 "settings.app.form.darkMode" : "Join the Dark Side", 144 "settings.app.form.darkMode" : "Join the Dark Side",
142 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 145 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
143 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar",
144 "settings.app.form.enableSpellchecking" : "Enable spell checking", 146 "settings.app.form.enableSpellchecking" : "Enable spell checking",
145 "settings.app.form.enableSystemTray" : "აჩვენეთ Franz სისტემის უჯრაში", 147 "settings.app.form.enableSystemTray" : "აჩვენეთ Franz სისტემის უჯრაში",
146 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock",
147 "settings.app.form.language" : "ენა", 148 "settings.app.form.language" : "ენა",
148 "settings.app.form.minimizeToSystemTray" : "ჩაკეცეთ Franz სისტემის უჯრაში", 149 "settings.app.form.minimizeToSystemTray" : "ჩაკეცეთ Franz სისტემის უჯრაში",
149 "settings.app.form.runInBackground" : "დატოვეთ Franz გაშვებული როდესაც ფანჯარა დაიხურება", 150 "settings.app.form.runInBackground" : "დატოვეთ Franz გაშვებული როდესაც ფანჯარა დაიხურება",
150 "settings.app.form.showDisabledServices" : "Display disabled services tabs", 151 "settings.app.form.showDisabledServices" : "Display disabled services tabs",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled",
152 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
153 "settings.app.headline" : "პარამეტრები", 153 "settings.app.headline" : "პარამეტრები",
154 "settings.app.headlineAdvanced" : "Advanced", 154 "settings.app.headlineAdvanced" : "Advanced",
155 "settings.app.headlineAppearance" : "Appearance", 155 "settings.app.headlineAppearance" : "Appearance",
@@ -212,8 +212,6 @@
212 "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.",
213 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "User (optional)",
214 "settings.service.form.saveButton" : "სერვისის შენახვა", 214 "settings.service.form.saveButton" : "სერვისის შენახვა",
215 "settings.service.form.spellcheckerLanguage" : "Spell checking Language",
216 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})",
217 "settings.service.form.tabHosted" : "დაჰოსტილი", 215 "settings.service.form.tabHosted" : "დაჰოსტილი",
218 "settings.service.form.tabOnPremise" : "თვით დაჰოსტილი ⭐️", 216 "settings.service.form.tabOnPremise" : "თვით დაჰოსტილი ⭐️",
219 "settings.service.form.team" : "გუნდი", 217 "settings.service.form.team" : "გუნდი",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "აღმოაჩინეთ სერვისები", 221 "settings.services.discoverServices" : "აღმოაჩინეთ სერვისები",
224 "settings.services.headline" : "თქვენი სერვისები", 222 "settings.services.headline" : "თქვენი სერვისები",
225 "settings.services.noServicesAdded" : "თქვენ ჯერ არ გაქვთ სერვისები დამატებული.", 223 "settings.services.noServicesAdded" : "თქვენ ჯერ არ გაქვთ სერვისები დამატებული.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "სერვისი გათიშულია", 225 "settings.services.tooltip.isDisabled" : "სერვისი გათიშულია",
227 "settings.services.tooltip.isMuted" : "All sounds are muted", 226 "settings.services.tooltip.isMuted" : "All sounds are muted",
228 "settings.services.tooltip.notificationsDisabled" : "შეტყობინებები გათიშულია", 227 "settings.services.tooltip.notificationsDisabled" : "შეტყობინებები გათიშულია",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "EU residents: local sales tax may apply", 254 "subscription.euTaxInfo" : "EU residents: local sales tax may apply",
256 "subscription.features.ads" : "არანაირი რეკლამები, არასდროს!", 255 "subscription.features.ads" : "არანაირი რეკლამები, არასდროს!",
257 "subscription.features.comingSoon" : "მალე", 256 "subscription.features.comingSoon" : "მალე",
258 "subscription.features.encryptedSync" : "დაშიფრული სესიის სინქრონიზაცია",
259 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 257 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
260 "subscription.features.onpremise" : "on-premise\/hosted სერვისების დამატება, როგორიცაა HipChat",
261 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 258 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
262 "subscription.features.proxy" : "Proxy support for services", 259 "subscription.features.proxy" : "Proxy support for services",
263 "subscription.features.spellchecker" : "Support for spellchecker", 260 "subscription.features.spellchecker" : "Support for spellchecker",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "ჩატვირთვა", 277 "tabs.item.reload" : "ჩატვირთვა",
281 "validation.email" : "{field} is not valid", 278 "validation.email" : "{field} is not valid",
282 "validation.minLength" : "{field} should be at least {length} characters long", 279 "validation.minLength" : "{field} should be at least {length} characters long",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} is required", 281 "validation.required" : "{field} is required",
284 "validation.url" : "{field} is not a valid URL", 282 "validation.url" : "{field} is not a valid URL",
285 "welcome.loginButton" : "შედით თქვენს ანგარიშში", 283 "welcome.loginButton" : "შედით თქვენს ანგარიშში",
286 "welcome.signupButton" : "შექმენი ანგარიში, ეს უფასოა", 284 "welcome.signupButton" : "შექმენი ანგარიში, ეს უფასოა"
287 "welcome.slogan" : "შეტყობინების აპლიკაცია, რომელიც მუშაობს შენთვის"
288} 285}
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index 2082edd6d..00d7ddd06 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Ondersteuning", 70 "menu.help.support" : "Ondersteuning",
71 "menu.help.tos" : "Servicevoorwaarden", 71 "menu.help.tos" : "Servicevoorwaarden",
72 "menu.services" : "Services", 72 "menu.services" : "Services",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Nieuwe service toevoegen...", 74 "menu.services.addNewService" : "Nieuwe service toevoegen...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Weergave", 76 "menu.view" : "Weergave",
75 "menu.view.enterFullScreen" : "Volledig scherm openen", 77 "menu.view.enterFullScreen" : "Volledig scherm openen",
76 "menu.view.exitFullScreen" : "Volledig scherm verlaten", 78 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Download", 130 "settings.account.invoiceDownload" : "Download",
129 "settings.account.manageSubscription.label" : "Beheer je abonnement", 131 "settings.account.manageSubscription.label" : "Beheer je abonnement",
130 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen", 132 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen",
133 "settings.account.tryReloadServices" : "Probeer opnieuw",
131 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw", 134 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw",
132 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden", 135 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden",
133 "settings.app.buttonClearAllCache" : "Cache wissen", 136 "settings.app.buttonClearAllCache" : "Cache wissen",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Inclusief beta versies", 143 "settings.app.form.beta" : "Inclusief beta versies",
141 "settings.app.form.darkMode" : "Word lid van de Dark Side", 144 "settings.app.form.darkMode" : "Word lid van de Dark Side",
142 "settings.app.form.enableGPUAcceleration" : "GPU Acceleratie Activeren", 145 "settings.app.form.enableGPUAcceleration" : "GPU Acceleratie Activeren",
143 "settings.app.form.enableMenuBar" : "Toon Franz in Menu Bar",
144 "settings.app.form.enableSpellchecking" : "Spellingcontrole inschakelen", 146 "settings.app.form.enableSpellchecking" : "Spellingcontrole inschakelen",
145 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk", 147 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk",
146 "settings.app.form.hideDockIcon" : "Verberg Franz in Dock",
147 "settings.app.form.language" : "Taal", 148 "settings.app.form.language" : "Taal",
148 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Franz naar de systeembalk", 149 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Franz naar de systeembalk",
149 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt", 150 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt",
150 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services", 151 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld",
152 "settings.app.form.spellcheckerLanguage" : "Taal spellingscontrole",
153 "settings.app.headline" : "Instellingen", 153 "settings.app.headline" : "Instellingen",
154 "settings.app.headlineAdvanced" : "Geavanceerd", 154 "settings.app.headlineAdvanced" : "Geavanceerd",
155 "settings.app.headlineAppearance" : "Weergave", 155 "settings.app.headlineAppearance" : "Weergave",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Start Franz opnieuw op na het aanpassen van proxy Instellingen.", 212 "settings.service.form.proxy.restartInfo" : "Start Franz opnieuw op na het aanpassen van proxy Instellingen.",
213 "settings.service.form.proxy.user" : "Gebruiker (optioneel)", 213 "settings.service.form.proxy.user" : "Gebruiker (optioneel)",
214 "settings.service.form.saveButton" : "Service opslaan", 214 "settings.service.form.saveButton" : "Service opslaan",
215 "settings.service.form.spellcheckerLanguage" : "Taal spellingscontrole",
216 "settings.service.form.spellcheckerLanguage.default" : "Gebruik Systeemstandaard ({default})",
217 "settings.service.form.tabHosted" : "Gehost", 215 "settings.service.form.tabHosted" : "Gehost",
218 "settings.service.form.tabOnPremise" : "Intern gehost ⭐️", 216 "settings.service.form.tabOnPremise" : "Intern gehost ⭐️",
219 "settings.service.form.team" : "Team", 217 "settings.service.form.team" : "Team",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Services ontdekken", 221 "settings.services.discoverServices" : "Services ontdekken",
224 "settings.services.headline" : "Jouw services", 222 "settings.services.headline" : "Jouw services",
225 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.", 223 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Service is uitgeschakeld", 225 "settings.services.tooltip.isDisabled" : "Service is uitgeschakeld",
227 "settings.services.tooltip.isMuted" : "Alle geluiden zijn uitgeschakeld", 226 "settings.services.tooltip.isMuted" : "Alle geluiden zijn uitgeschakeld",
228 "settings.services.tooltip.notificationsDisabled" : "Notificaties staan uit", 227 "settings.services.tooltip.notificationsDisabled" : "Notificaties staan uit",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Bewoners binnen EU: lokale belasting kan van toepassing zijn", 254 "subscription.euTaxInfo" : "Bewoners binnen EU: lokale belasting kan van toepassing zijn",
256 "subscription.features.ads" : "Geen reclame, nooit!", 255 "subscription.features.ads" : "Geen reclame, nooit!",
257 "subscription.features.comingSoon" : "komt binnenkort", 256 "subscription.features.comingSoon" : "komt binnenkort",
258 "subscription.features.encryptedSync" : "Synchronisatie van geëncrypteerde sessies",
259 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades", 257 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades",
260 "subscription.features.onpremise" : "Intern gehoste services zoals HipChat",
261 "subscription.features.onpremise.mattermost" : "Voeg op-locatie\/gehoste diensten zoals Mattermost toe", 258 "subscription.features.onpremise.mattermost" : "Voeg op-locatie\/gehoste diensten zoals Mattermost toe",
262 "subscription.features.proxy" : "Proxy ondersteuning voor services", 259 "subscription.features.proxy" : "Proxy ondersteuning voor services",
263 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck", 260 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Herladen", 277 "tabs.item.reload" : "Herladen",
281 "validation.email" : "{field} is niet geldig", 278 "validation.email" : "{field} is niet geldig",
282 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn", 279 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} is vereist", 281 "validation.required" : "{field} is vereist",
284 "validation.url" : "{field} is niet een geldige URL", 282 "validation.url" : "{field} is niet een geldige URL",
285 "welcome.loginButton" : "Inloggen op je account", 283 "welcome.loginButton" : "Inloggen op je account",
286 "welcome.signupButton" : "Maak een gratis account aan", 284 "welcome.signupButton" : "Maak een gratis account aan"
287 "welcome.slogan" : "Messaging die voor jou werkt"
288} 285}
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index df0549a28..782c29a6c 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Ondersteuning", 70 "menu.help.support" : "Ondersteuning",
71 "menu.help.tos" : "Servicevoorwaarden", 71 "menu.help.tos" : "Servicevoorwaarden",
72 "menu.services" : "Diensten", 72 "menu.services" : "Diensten",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Nieuwe dienst toevoegen", 74 "menu.services.addNewService" : "Nieuwe dienst toevoegen",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Weergave", 76 "menu.view" : "Weergave",
75 "menu.view.enterFullScreen" : "Gebruik volledig scherm", 77 "menu.view.enterFullScreen" : "Gebruik volledig scherm",
76 "menu.view.exitFullScreen" : "Volledig scherm verlaten", 78 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Download", 130 "settings.account.invoiceDownload" : "Download",
129 "settings.account.manageSubscription.label" : "Beheer je abonnement", 131 "settings.account.manageSubscription.label" : "Beheer je abonnement",
130 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen", 132 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen",
133 "settings.account.tryReloadServices" : "Probeer opnieuw",
131 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw", 134 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw",
132 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden", 135 "settings.account.userInfoRequestFailed" : "Kon gebruikersinformatie niet laden",
133 "settings.app.buttonClearAllCache" : "Cache legen", 136 "settings.app.buttonClearAllCache" : "Cache legen",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Inclusief bètaversies", 143 "settings.app.form.beta" : "Inclusief bètaversies",
141 "settings.app.form.darkMode" : "Stap over naar de donkere kant", 144 "settings.app.form.darkMode" : "Stap over naar de donkere kant",
142 "settings.app.form.enableGPUAcceleration" : "Schakel videokaart acceleratie in ", 145 "settings.app.form.enableGPUAcceleration" : "Schakel videokaart acceleratie in ",
143 "settings.app.form.enableMenuBar" : "Toon Franz in menubalk",
144 "settings.app.form.enableSpellchecking" : "Zet spellingcontrole aan", 146 "settings.app.form.enableSpellchecking" : "Zet spellingcontrole aan",
145 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk", 147 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk",
146 "settings.app.form.hideDockIcon" : "Verberg Franz in Dock",
147 "settings.app.form.language" : "Taal", 148 "settings.app.form.language" : "Taal",
148 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Franz naar de systeembalk", 149 "settings.app.form.minimizeToSystemTray" : "Minimaliseer Franz naar de systeembalk",
149 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt", 150 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt",
150 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services", 151 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld",
152 "settings.app.form.spellcheckerLanguage" : "Spelling checken",
153 "settings.app.headline" : "Instellingen", 153 "settings.app.headline" : "Instellingen",
154 "settings.app.headlineAdvanced" : "Geavanceerd", 154 "settings.app.headlineAdvanced" : "Geavanceerd",
155 "settings.app.headlineAppearance" : "Weergave", 155 "settings.app.headlineAppearance" : "Weergave",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Start Franz opnieuw na het aanpassen van proxy instellingen.", 212 "settings.service.form.proxy.restartInfo" : "Start Franz opnieuw na het aanpassen van proxy instellingen.",
213 "settings.service.form.proxy.user" : "Gebruiker (optioneel)", 213 "settings.service.form.proxy.user" : "Gebruiker (optioneel)",
214 "settings.service.form.saveButton" : "Service opslaan", 214 "settings.service.form.saveButton" : "Service opslaan",
215 "settings.service.form.spellcheckerLanguage" : "Spellingcontrole taal",
216 "settings.service.form.spellcheckerLanguage.default" : "Gebruik systeemstandaard ({default})",
217 "settings.service.form.tabHosted" : "Gehost", 215 "settings.service.form.tabHosted" : "Gehost",
218 "settings.service.form.tabOnPremise" : "Zelf-gehost ⭐️", 216 "settings.service.form.tabOnPremise" : "Zelf-gehost ⭐️",
219 "settings.service.form.team" : "Team", 217 "settings.service.form.team" : "Team",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Ontdek services", 221 "settings.services.discoverServices" : "Ontdek services",
224 "settings.services.headline" : "Jouw services", 222 "settings.services.headline" : "Jouw services",
225 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.", 223 "settings.services.noServicesAdded" : "Je hebt nog geen services toegevoegd.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Service is uitgeschakeld", 225 "settings.services.tooltip.isDisabled" : "Service is uitgeschakeld",
227 "settings.services.tooltip.isMuted" : "Alle geluiden zijn uitgeschakeld", 226 "settings.services.tooltip.isMuted" : "Alle geluiden zijn uitgeschakeld",
228 "settings.services.tooltip.notificationsDisabled" : "Meldingen zijn uitgeschakeld", 227 "settings.services.tooltip.notificationsDisabled" : "Meldingen zijn uitgeschakeld",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Bewoners binnen EU: lokale belasting kan van toepassing zijn", 254 "subscription.euTaxInfo" : "Bewoners binnen EU: lokale belasting kan van toepassing zijn",
256 "subscription.features.ads" : "Geen advertenties, nooit!", 255 "subscription.features.ads" : "Geen advertenties, nooit!",
257 "subscription.features.comingSoon" : "komt binnenkort", 256 "subscription.features.comingSoon" : "komt binnenkort",
258 "subscription.features.encryptedSync" : "Beveiligde sessie synchronisatie",
259 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades", 257 "subscription.features.noInterruptions" : "Geen haperingen & pop ups over upgrades",
260 "subscription.features.onpremise" : "Add on-geschikt\/gehoste services zoals HipChat",
261 "subscription.features.onpremise.mattermost" : "Voeg op-locatie\/gehoste diensten zoals Mattermost toe", 258 "subscription.features.onpremise.mattermost" : "Voeg op-locatie\/gehoste diensten zoals Mattermost toe",
262 "subscription.features.proxy" : "Proxy understeuning voor diensten", 259 "subscription.features.proxy" : "Proxy understeuning voor diensten",
263 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck", 260 "subscription.features.spellchecker" : "Ondersteuning voor spellingscheck",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Herladen", 277 "tabs.item.reload" : "Herladen",
281 "validation.email" : "{field} is niet geldig", 278 "validation.email" : "{field} is niet geldig",
282 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn", 279 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} is vereist", 281 "validation.required" : "{field} is vereist",
284 "validation.url" : "{field} is niet een geldige URL", 282 "validation.url" : "{field} is niet een geldige URL",
285 "welcome.loginButton" : "Log in op je account", 283 "welcome.loginButton" : "Log in op je account",
286 "welcome.signupButton" : "Maak een gratis account", 284 "welcome.signupButton" : "Maak een gratis account"
287 "welcome.slogan" : "Messaging die voor jou werkt"
288} 285}
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index e1a1747b3..dd70f25f7 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Wsparcie", 70 "menu.help.support" : "Wsparcie",
71 "menu.help.tos" : "Warunki świadczenia usług", 71 "menu.help.tos" : "Warunki świadczenia usług",
72 "menu.services" : "Usługi", 72 "menu.services" : "Usługi",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Dodaj nową usługę...", 74 "menu.services.addNewService" : "Dodaj nową usługę...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Widok", 76 "menu.view" : "Widok",
75 "menu.view.enterFullScreen" : "Włącz tryb pełnoekranowy", 77 "menu.view.enterFullScreen" : "Włącz tryb pełnoekranowy",
76 "menu.view.exitFullScreen" : "Zakończ tryb pełnoekranowy", 78 "menu.view.exitFullScreen" : "Zakończ tryb pełnoekranowy",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Pobierz", 130 "settings.account.invoiceDownload" : "Pobierz",
129 "settings.account.manageSubscription.label" : "Zarządzaj swoimi subskrypcjami", 131 "settings.account.manageSubscription.label" : "Zarządzaj swoimi subskrypcjami",
130 "settings.account.successInfo" : "Twoje zmiany zostały zapisane", 132 "settings.account.successInfo" : "Twoje zmiany zostały zapisane",
133 "settings.account.tryReloadServices" : "Spróbuj ponownie",
131 "settings.account.tryReloadUserInfoRequest" : "Spróbuj ponownie", 134 "settings.account.tryReloadUserInfoRequest" : "Spróbuj ponownie",
132 "settings.account.userInfoRequestFailed" : "Nie można wczytać informacji o użytkowniku", 135 "settings.account.userInfoRequestFailed" : "Nie można wczytać informacji o użytkowniku",
133 "settings.app.buttonClearAllCache" : "Wyczyść pamięć podręczną (cache)", 136 "settings.app.buttonClearAllCache" : "Wyczyść pamięć podręczną (cache)",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Uwzględnij wersje beta", 143 "settings.app.form.beta" : "Uwzględnij wersje beta",
141 "settings.app.form.darkMode" : "Przejdź na Ciemną Stronę", 144 "settings.app.form.darkMode" : "Przejdź na Ciemną Stronę",
142 "settings.app.form.enableGPUAcceleration" : "Włącz akcelerację GPU", 145 "settings.app.form.enableGPUAcceleration" : "Włącz akcelerację GPU",
143 "settings.app.form.enableMenuBar" : "Pokaż Franz na pasku menu",
144 "settings.app.form.enableSpellchecking" : "Włącz sprawdzanie pisowni", 146 "settings.app.form.enableSpellchecking" : "Włącz sprawdzanie pisowni",
145 "settings.app.form.enableSystemTray" : "Pokaż Franza w obszarze powiadomień", 147 "settings.app.form.enableSystemTray" : "Pokaż Franza w obszarze powiadomień",
146 "settings.app.form.hideDockIcon" : "Ukrywaj ikonę Franz w zasobniku systemowym",
147 "settings.app.form.language" : "Język", 148 "settings.app.form.language" : "Język",
148 "settings.app.form.minimizeToSystemTray" : "Zminimalizuj aplikację Franz", 149 "settings.app.form.minimizeToSystemTray" : "Zminimalizuj aplikację Franz",
149 "settings.app.form.runInBackground" : "Zachowaj aplikację Franz w tle po zamknięciu okna", 150 "settings.app.form.runInBackground" : "Zachowaj aplikację Franz w tle po zamknięciu okna",
150 "settings.app.form.showDisabledServices" : "Wyłącz wyświetlanie zakładek z usługami", 151 "settings.app.form.showDisabledServices" : "Wyłącz wyświetlanie zakładek z usługami",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Pokaż licznik nieprzeczytanych wiadomości gdy powiadomienia są wyłączone", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Pokaż licznik nieprzeczytanych wiadomości gdy powiadomienia są wyłączone",
152 "settings.app.form.spellcheckerLanguage" : "Język słownika",
153 "settings.app.headline" : "Ustawienia", 153 "settings.app.headline" : "Ustawienia",
154 "settings.app.headlineAdvanced" : "Zaawansowane", 154 "settings.app.headlineAdvanced" : "Zaawansowane",
155 "settings.app.headlineAppearance" : "Wygląd", 155 "settings.app.headlineAppearance" : "Wygląd",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Uruchom ponownie Franz po zmianie ustawień proxy.", 212 "settings.service.form.proxy.restartInfo" : "Uruchom ponownie Franz po zmianie ustawień proxy.",
213 "settings.service.form.proxy.user" : "Użytkownik (opcjonalnie)", 213 "settings.service.form.proxy.user" : "Użytkownik (opcjonalnie)",
214 "settings.service.form.saveButton" : "Zapisz usługę", 214 "settings.service.form.saveButton" : "Zapisz usługę",
215 "settings.service.form.spellcheckerLanguage" : "Język sprawdzania pisowni",
216 "settings.service.form.spellcheckerLanguage.default" : "Użyj domyślnego dla systemu ({default})",
217 "settings.service.form.tabHosted" : "Hostowane", 215 "settings.service.form.tabHosted" : "Hostowane",
218 "settings.service.form.tabOnPremise" : "Hostowane lokalnie ⭐️", 216 "settings.service.form.tabOnPremise" : "Hostowane lokalnie ⭐️",
219 "settings.service.form.team" : "Zespół", 217 "settings.service.form.team" : "Zespół",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Przeglądaj usługi", 221 "settings.services.discoverServices" : "Przeglądaj usługi",
224 "settings.services.headline" : "Twoje usługi", 222 "settings.services.headline" : "Twoje usługi",
225 "settings.services.noServicesAdded" : "Nie dodałeś jeszcze żadnych usług.", 223 "settings.services.noServicesAdded" : "Nie dodałeś jeszcze żadnych usług.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Usługa jest nieaktywna", 225 "settings.services.tooltip.isDisabled" : "Usługa jest nieaktywna",
227 "settings.services.tooltip.isMuted" : "Wszystkie dźwięki są wyciszone", 226 "settings.services.tooltip.isMuted" : "Wszystkie dźwięki są wyciszone",
228 "settings.services.tooltip.notificationsDisabled" : "Powiadomienia są nieaktywne", 227 "settings.services.tooltip.notificationsDisabled" : "Powiadomienia są nieaktywne",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Rezydenci UE: lokalne stawki VAT mogą zostać zaaplikowane", 254 "subscription.euTaxInfo" : "Rezydenci UE: lokalne stawki VAT mogą zostać zaaplikowane",
256 "subscription.features.ads" : "Brak reklam, na zawsze!", 255 "subscription.features.ads" : "Brak reklam, na zawsze!",
257 "subscription.features.comingSoon" : "wkrótce dostępne", 256 "subscription.features.comingSoon" : "wkrótce dostępne",
258 "subscription.features.encryptedSync" : "Szyfrowana synchronizacja sesji",
259 "subscription.features.noInterruptions" : "Bez opóźnień i przypominania o ulepszeniu licencji", 257 "subscription.features.noInterruptions" : "Bez opóźnień i przypominania o ulepszeniu licencji",
260 "subscription.features.onpremise" : "Dodawanie lokalnych\/hostowanych usług takich jak HipChat",
261 "subscription.features.onpremise.mattermost" : "Dodaj prywatnie hostowane usługi takie jak Mattermost", 258 "subscription.features.onpremise.mattermost" : "Dodaj prywatnie hostowane usługi takie jak Mattermost",
262 "subscription.features.proxy" : "Obsługa proxy dla usług", 259 "subscription.features.proxy" : "Obsługa proxy dla usług",
263 "subscription.features.spellchecker" : "Wsparcie dla sprawdzania pisowni", 260 "subscription.features.spellchecker" : "Wsparcie dla sprawdzania pisowni",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Przeładuj", 277 "tabs.item.reload" : "Przeładuj",
281 "validation.email" : "Pole {field} nie jest poprawne", 278 "validation.email" : "Pole {field} nie jest poprawne",
282 "validation.minLength" : "Pole {field} powinno składać się z co najmniej {length} znaków", 279 "validation.minLength" : "Pole {field} powinno składać się z co najmniej {length} znaków",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "Pole {field} jest wymagane", 281 "validation.required" : "Pole {field} jest wymagane",
284 "validation.url" : "Pole {field} nie jest poprawnym ciągiem URL.", 282 "validation.url" : "Pole {field} nie jest poprawnym ciągiem URL.",
285 "welcome.loginButton" : "Zaloguj się na swoje konto", 283 "welcome.loginButton" : "Zaloguj się na swoje konto",
286 "welcome.signupButton" : "Stwórz darmowe konto", 284 "welcome.signupButton" : "Stwórz darmowe konto"
287 "welcome.slogan" : "Komunikator który działa"
288} 285}
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index 0ab5bdd21..490771c39 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -4,18 +4,18 @@
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", 7 "feature.shareFranz.action.email" : "Enviar como e-mail",
8 "feature.shareFranz.action.facebook" : "Share on Facebook", 8 "feature.shareFranz.action.facebook" : "Compartilhar no Facebook",
9 "feature.shareFranz.action.twitter" : "Share on Twitter", 9 "feature.shareFranz.action.twitter" : "Compartilhar no Twitter",
10 "feature.shareFranz.headline" : "Franz is better together!", 10 "feature.shareFranz.headline" : "Franz é melhor em grupo!",
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", 11 "feature.shareFranz.shareText.email" : "Eu adicionei {count} serviços ao Franz! Adquira o aplicativo gratuito para WhatsApp, Messenger, Slack, Skype e mais em 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", 12 "feature.shareFranz.shareText.twitter" : "Adicionei o serviço de {count} ao Franz! Adquira o app grátis para usar WhatsApp, Messenger, Slack, Skype e mais em 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.", 13 "feature.shareFranz.text" : "Conte aos seus amigos e colegas o quão incrível Franz é e nos ajude a espalhar a mensagem. ",
14 "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.",
15 "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})", 16 "global.spellchecker.useDefault" : "Use o padrão do sistema ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically", 17 "global.spellchecking.autodetect" : "Detectar linguagem automaticamente.",
18 "global.spellchecking.autodetect.short" : "Automatic", 18 "global.spellchecking.autodetect.short" : "Automático",
19 "global.spellchecking.language" : "Idioma de verificação ortográfica", 19 "global.spellchecking.language" : "Idioma de verificação ortográfica",
20 "import.headline" : "Importe seus serviços do Franz 4 ", 20 "import.headline" : "Importe seus serviços do Franz 4 ",
21 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5 ", 21 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5 ",
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Suporte", 70 "menu.help.support" : "Suporte",
71 "menu.help.tos" : "Termos de Serviço", 71 "menu.help.tos" : "Termos de Serviço",
72 "menu.services" : "Serviços", 72 "menu.services" : "Serviços",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Adicionar Novo Serviço", 74 "menu.services.addNewService" : "Adicionar Novo Serviço",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Visualizar ", 76 "menu.view" : "Visualizar ",
75 "menu.view.enterFullScreen" : "Modo Tela Cheia", 77 "menu.view.enterFullScreen" : "Modo Tela Cheia",
76 "menu.view.exitFullScreen" : "Sair da Tela Cheia", 78 "menu.view.exitFullScreen" : "Sair da Tela Cheia",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Baixar", 130 "settings.account.invoiceDownload" : "Baixar",
129 "settings.account.manageSubscription.label" : "Gerencie a sua assinatura", 131 "settings.account.manageSubscription.label" : "Gerencie a sua assinatura",
130 "settings.account.successInfo" : "Suas alterações foram gravadas", 132 "settings.account.successInfo" : "Suas alterações foram gravadas",
133 "settings.account.tryReloadServices" : "Tente novamente",
131 "settings.account.tryReloadUserInfoRequest" : "Tente novamente", 134 "settings.account.tryReloadUserInfoRequest" : "Tente novamente",
132 "settings.account.userInfoRequestFailed" : "Não foi possível carregar as informações do usuário", 135 "settings.account.userInfoRequestFailed" : "Não foi possível carregar as informações do usuário",
133 "settings.app.buttonClearAllCache" : "Limpar cache", 136 "settings.app.buttonClearAllCache" : "Limpar cache",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Incluir versões beta", 143 "settings.app.form.beta" : "Incluir versões beta",
141 "settings.app.form.darkMode" : "Venha para o Lado Negro da força", 144 "settings.app.form.darkMode" : "Venha para o Lado Negro da força",
142 "settings.app.form.enableGPUAcceleration" : "Ativar Aceleração de GPU", 145 "settings.app.form.enableGPUAcceleration" : "Ativar Aceleração de GPU",
143 "settings.app.form.enableMenuBar" : "Mostrar Franz na Barra de Menu",
144 "settings.app.form.enableSpellchecking" : "Ativar correção ortográfica", 146 "settings.app.form.enableSpellchecking" : "Ativar correção ortográfica",
145 "settings.app.form.enableSystemTray" : "Exibir o Franz na barra de sistema", 147 "settings.app.form.enableSystemTray" : "Exibir o Franz na barra de sistema",
146 "settings.app.form.hideDockIcon" : "Ocultar ícone do Franz no Dock",
147 "settings.app.form.language" : "Idioma", 148 "settings.app.form.language" : "Idioma",
148 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a área de sistema", 149 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a área de sistema",
149 "settings.app.form.runInBackground" : "Manter o Franz no fundo quando fechar a janela", 150 "settings.app.form.runInBackground" : "Manter o Franz no fundo quando fechar a janela",
150 "settings.app.form.showDisabledServices" : "Mostrar abas de serviços desativados", 151 "settings.app.form.showDisabledServices" : "Mostrar abas de serviços desativados",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostrar ícone de mensagem não lida quando as notificações estiverem desativadas", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostrar ícone de mensagem não lida quando as notificações estiverem desativadas",
152 "settings.app.form.spellcheckerLanguage" : "Idioma de verificação ortográfica",
153 "settings.app.headline" : "Configurações", 153 "settings.app.headline" : "Configurações",
154 "settings.app.headlineAdvanced" : "Avançado", 154 "settings.app.headlineAdvanced" : "Avançado",
155 "settings.app.headlineAppearance" : "Aparência", 155 "settings.app.headlineAppearance" : "Aparência",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Por favor, reinicie o Franz após alterar as configurações de proxy.", 212 "settings.service.form.proxy.restartInfo" : "Por favor, reinicie o Franz após alterar as configurações de proxy.",
213 "settings.service.form.proxy.user" : "Usuário (opcional)", 213 "settings.service.form.proxy.user" : "Usuário (opcional)",
214 "settings.service.form.saveButton" : "Salvar serviço", 214 "settings.service.form.saveButton" : "Salvar serviço",
215 "settings.service.form.spellcheckerLanguage" : "Língua do corretor ortográfico",
216 "settings.service.form.spellcheckerLanguage.default" : "Use o padrão do sistema ({default})",
217 "settings.service.form.tabHosted" : "Hospedado", 215 "settings.service.form.tabHosted" : "Hospedado",
218 "settings.service.form.tabOnPremise" : "Auto-hospedado ⭐️", 216 "settings.service.form.tabOnPremise" : "Auto-hospedado ⭐️",
219 "settings.service.form.team" : "Equipe", 217 "settings.service.form.team" : "Equipe",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Descobrir serviços", 221 "settings.services.discoverServices" : "Descobrir serviços",
224 "settings.services.headline" : "Seus serviços", 222 "settings.services.headline" : "Seus serviços",
225 "settings.services.noServicesAdded" : "Você ainda não adicionou nenhum serviço.", 223 "settings.services.noServicesAdded" : "Você ainda não adicionou nenhum serviço.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "O serviço está desativado", 225 "settings.services.tooltip.isDisabled" : "O serviço está desativado",
227 "settings.services.tooltip.isMuted" : "Sem som", 226 "settings.services.tooltip.isMuted" : "Sem som",
228 "settings.services.tooltip.notificationsDisabled" : "Notificações desativadas", 227 "settings.services.tooltip.notificationsDisabled" : "Notificações desativadas",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Residentes na União Europeia: taxas locais serão aplicadas", 254 "subscription.euTaxInfo" : "Residentes na União Europeia: taxas locais serão aplicadas",
256 "subscription.features.ads" : "Sem anúncios, pra sempre!", 255 "subscription.features.ads" : "Sem anúncios, pra sempre!",
257 "subscription.features.comingSoon" : "em breve", 256 "subscription.features.comingSoon" : "em breve",
258 "subscription.features.encryptedSync" : "Sincronização encriptada das sessões",
259 "subscription.features.noInterruptions" : "Sem demora e sem chateação para comprar uma licença. ", 257 "subscription.features.noInterruptions" : "Sem demora e sem chateação para comprar uma licença. ",
260 "subscription.features.onpremise" : "Adicionar serviços locais\/hospedados como o HipChat",
261 "subscription.features.onpremise.mattermost" : "Adicionar serviços locais\/hospedados como o Mattermost", 258 "subscription.features.onpremise.mattermost" : "Adicionar serviços locais\/hospedados como o Mattermost",
262 "subscription.features.proxy" : "Suporte de proxy para serviços", 259 "subscription.features.proxy" : "Suporte de proxy para serviços",
263 "subscription.features.spellchecker" : "Suporte para corretor ortográfico", 260 "subscription.features.spellchecker" : "Suporte para corretor ortográfico",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Recarregar", 277 "tabs.item.reload" : "Recarregar",
281 "validation.email" : "inválido", 278 "validation.email" : "inválido",
282 "validation.minLength" : "{campo} deve ter pelo menos {comprimento} mais caracteres ", 279 "validation.minLength" : "{campo} deve ter pelo menos {comprimento} mais caracteres ",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{campo} obrigatório", 281 "validation.required" : "{campo} obrigatório",
284 "validation.url" : "{campo} essa URL não é válida", 282 "validation.url" : "{campo} essa URL não é válida",
285 "welcome.loginButton" : "Entrar na sua conta", 283 "welcome.loginButton" : "Entrar na sua conta",
286 "welcome.signupButton" : "Criar uma conta grátis", 284 "welcome.signupButton" : "Criar uma conta grátis"
287 "welcome.slogan" : "Mensagens que funcionam para você"
288} 285}
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index 9e7455bdf..7e23aa0ba 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Suporte", 70 "menu.help.support" : "Suporte",
71 "menu.help.tos" : "Termos do Serviço", 71 "menu.help.tos" : "Termos do Serviço",
72 "menu.services" : "Serviços", 72 "menu.services" : "Serviços",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Adicionar Novo Serviço...", 74 "menu.services.addNewService" : "Adicionar Novo Serviço...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Ver", 76 "menu.view" : "Ver",
75 "menu.view.enterFullScreen" : "Ativar Modo de Ecrã Completo", 77 "menu.view.enterFullScreen" : "Ativar Modo de Ecrã Completo",
76 "menu.view.exitFullScreen" : "Sair do Modo de Ecrã Completo", 78 "menu.view.exitFullScreen" : "Sair do Modo de Ecrã Completo",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Transferir", 130 "settings.account.invoiceDownload" : "Transferir",
129 "settings.account.manageSubscription.label" : "Gerir as minhas subscrições", 131 "settings.account.manageSubscription.label" : "Gerir as minhas subscrições",
130 "settings.account.successInfo" : "As suas alterações foram efetuadas com sucesso", 132 "settings.account.successInfo" : "As suas alterações foram efetuadas com sucesso",
133 "settings.account.tryReloadServices" : "Tentar novamente",
131 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente", 134 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente",
132 "settings.account.userInfoRequestFailed" : "Não é possível carregar a informação do utilizador", 135 "settings.account.userInfoRequestFailed" : "Não é possível carregar a informação do utilizador",
133 "settings.app.buttonClearAllCache" : "Limpar cache", 136 "settings.app.buttonClearAllCache" : "Limpar cache",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Incluir versões instáveis (beta)", 143 "settings.app.form.beta" : "Incluir versões instáveis (beta)",
141 "settings.app.form.darkMode" : "Junta-te ao Lado Negro", 144 "settings.app.form.darkMode" : "Junta-te ao Lado Negro",
142 "settings.app.form.enableGPUAcceleration" : "Activar Aceleração de GPU", 145 "settings.app.form.enableGPUAcceleration" : "Activar Aceleração de GPU",
143 "settings.app.form.enableMenuBar" : "Mostrar Franz na Barra de Menu",
144 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica", 146 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica",
145 "settings.app.form.enableSystemTray" : "Mostrar o Franz na barra do sistema", 147 "settings.app.form.enableSystemTray" : "Mostrar o Franz na barra do sistema",
146 "settings.app.form.hideDockIcon" : "Esconder ícone na Dock",
147 "settings.app.form.language" : "Idioma", 148 "settings.app.form.language" : "Idioma",
148 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a barra do sistema", 149 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a barra do sistema",
149 "settings.app.form.runInBackground" : "Manter o Franz em segundo plano ao fechar a janela", 150 "settings.app.form.runInBackground" : "Manter o Franz em segundo plano ao fechar a janela",
150 "settings.app.form.showDisabledServices" : "Apresentar separadores de serviços desativados", 151 "settings.app.form.showDisabledServices" : "Apresentar separadores de serviços desativados",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Apresentar emblema com o número de mensagens não lidas quando as notificações estão desativadas", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Apresentar emblema com o número de mensagens não lidas quando as notificações estão desativadas",
152 "settings.app.form.spellcheckerLanguage" : "Linguagem para correção ortográfica",
153 "settings.app.headline" : "Definições", 153 "settings.app.headline" : "Definições",
154 "settings.app.headlineAdvanced" : "Avançado", 154 "settings.app.headlineAdvanced" : "Avançado",
155 "settings.app.headlineAppearance" : "Aparência", 155 "settings.app.headlineAppearance" : "Aparência",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Reinicie, por favor, após atualizar as definições do Franz", 212 "settings.service.form.proxy.restartInfo" : "Reinicie, por favor, após atualizar as definições do Franz",
213 "settings.service.form.proxy.user" : "Utilizador (opcional)", 213 "settings.service.form.proxy.user" : "Utilizador (opcional)",
214 "settings.service.form.saveButton" : "Guardar serviço", 214 "settings.service.form.saveButton" : "Guardar serviço",
215 "settings.service.form.spellcheckerLanguage" : "Linguagem de correção ortográfica",
216 "settings.service.form.spellcheckerLanguage.default" : "Utilizar o Sistema por Omissão ({default})",
217 "settings.service.form.tabHosted" : "Com domínio", 215 "settings.service.form.tabHosted" : "Com domínio",
218 "settings.service.form.tabOnPremise" : "Com domínio próprio ⭐️", 216 "settings.service.form.tabOnPremise" : "Com domínio próprio ⭐️",
219 "settings.service.form.team" : "Equipa", 217 "settings.service.form.team" : "Equipa",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Descobrir serviços", 221 "settings.services.discoverServices" : "Descobrir serviços",
224 "settings.services.headline" : "Os seus serviços", 222 "settings.services.headline" : "Os seus serviços",
225 "settings.services.noServicesAdded" : "Ainda não adicionou nenhum serviço.", 223 "settings.services.noServicesAdded" : "Ainda não adicionou nenhum serviço.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "O serviço está desativado", 225 "settings.services.tooltip.isDisabled" : "O serviço está desativado",
227 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados", 226 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados",
228 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desativadas", 227 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desativadas",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Residentes EU: Taxas locais podem ser aplicadas", 254 "subscription.euTaxInfo" : "Residentes EU: Taxas locais podem ser aplicadas",
256 "subscription.features.ads" : "Sem anúncios, para sempre!", 255 "subscription.features.ads" : "Sem anúncios, para sempre!",
257 "subscription.features.comingSoon" : "em breve", 256 "subscription.features.comingSoon" : "em breve",
258 "subscription.features.encryptedSync" : "Sincronização encriptada de sessão",
259 "subscription.features.noInterruptions" : "Sem atrasos na aplicação nem mensagens para comprar uma licença", 257 "subscription.features.noInterruptions" : "Sem atrasos na aplicação nem mensagens para comprar uma licença",
260 "subscription.features.onpremise" : "Adicionar serviços 'on-premise'\/hosted como o HipChat",
261 "subscription.features.onpremise.mattermost" : "Adicione serviços como Mattermost no local ou online", 258 "subscription.features.onpremise.mattermost" : "Adicione serviços como Mattermost no local ou online",
262 "subscription.features.proxy" : "Suporte Proxy para os serviços", 259 "subscription.features.proxy" : "Suporte Proxy para os serviços",
263 "subscription.features.spellchecker" : "Suporte para correção ortográfica", 260 "subscription.features.spellchecker" : "Suporte para correção ortográfica",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Recarregar", 277 "tabs.item.reload" : "Recarregar",
281 "validation.email" : "{field} não é válido", 278 "validation.email" : "{field} não é válido",
282 "validation.minLength" : "{field} deveria ter pelo menos {length} caracteres", 279 "validation.minLength" : "{field} deveria ter pelo menos {length} caracteres",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} é obrigatório", 281 "validation.required" : "{field} é obrigatório",
284 "validation.url" : "{field} não é uma hiperligação válida", 282 "validation.url" : "{field} não é uma hiperligação válida",
285 "welcome.loginButton" : "Iniciar sessão", 283 "welcome.loginButton" : "Iniciar sessão",
286 "welcome.signupButton" : "Criar uma conta gratuita", 284 "welcome.signupButton" : "Criar uma conta gratuita"
287 "welcome.slogan" : "Sistema de mensagens feito para si"
288} 285}
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index 6098c8ad9..d8e02b7f3 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -69,8 +69,10 @@
69 "menu.help.privacy" : "Политика конфиденциальности", 69 "menu.help.privacy" : "Политика конфиденциальности",
70 "menu.help.support" : "Поддержка", 70 "menu.help.support" : "Поддержка",
71 "menu.help.tos" : "Условия использования", 71 "menu.help.tos" : "Условия использования",
72 "menu.services" : "Сервисы", 72 "menu.services" : "Сервис",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Добавить новый сервис...", 74 "menu.services.addNewService" : "Добавить новый сервис...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Вид", 76 "menu.view" : "Вид",
75 "menu.view.enterFullScreen" : "На весь экран", 77 "menu.view.enterFullScreen" : "На весь экран",
76 "menu.view.exitFullScreen" : "В окне", 78 "menu.view.exitFullScreen" : "В окне",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Скачать", 130 "settings.account.invoiceDownload" : "Скачать",
129 "settings.account.manageSubscription.label" : "Управление вашей подпиской", 131 "settings.account.manageSubscription.label" : "Управление вашей подпиской",
130 "settings.account.successInfo" : "Ваши изменения были сохранены", 132 "settings.account.successInfo" : "Ваши изменения были сохранены",
133 "settings.account.tryReloadServices" : "Попробовать снова",
131 "settings.account.tryReloadUserInfoRequest" : "Попробовать снова", 134 "settings.account.tryReloadUserInfoRequest" : "Попробовать снова",
132 "settings.account.userInfoRequestFailed" : "Невозможно загрузить информацию пользователя", 135 "settings.account.userInfoRequestFailed" : "Невозможно загрузить информацию пользователя",
133 "settings.app.buttonClearAllCache" : "Очистить кэш", 136 "settings.app.buttonClearAllCache" : "Очистить кэш",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Включая бета версии", 143 "settings.app.form.beta" : "Включая бета версии",
141 "settings.app.form.darkMode" : "Перейти на Тёмную сторону", 144 "settings.app.form.darkMode" : "Перейти на Тёмную сторону",
142 "settings.app.form.enableGPUAcceleration" : "Включить ускорение GPU", 145 "settings.app.form.enableGPUAcceleration" : "Включить ускорение GPU",
143 "settings.app.form.enableMenuBar" : "Показывать Franz на панели меню",
144 "settings.app.form.enableSpellchecking" : "Включить проверку правописания", 146 "settings.app.form.enableSpellchecking" : "Включить проверку правописания",
145 "settings.app.form.enableSystemTray" : "Показывать Franz в системном трее", 147 "settings.app.form.enableSystemTray" : "Показывать Franz в системном трее",
146 "settings.app.form.hideDockIcon" : "Спрятать иконку Franz на панели",
147 "settings.app.form.language" : "Язык", 148 "settings.app.form.language" : "Язык",
148 "settings.app.form.minimizeToSystemTray" : "Сворачивать Franz в системный трей", 149 "settings.app.form.minimizeToSystemTray" : "Сворачивать Franz в системный трей",
149 "settings.app.form.runInBackground" : "Оставлять Franz в фоне при закрытии окна", 150 "settings.app.form.runInBackground" : "Оставлять Franz в фоне при закрытии окна",
150 "settings.app.form.showDisabledServices" : "Показывать вкладки отключённых служб", 151 "settings.app.form.showDisabledServices" : "Показывать вкладки отключённых служб",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Показывать значок непрочитанного сообщения при отключённых уведомлениях", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Показывать значок непрочитанного сообщения при отключённых уведомлениях",
152 "settings.app.form.spellcheckerLanguage" : "Проверка правописания",
153 "settings.app.headline" : "Настройки", 153 "settings.app.headline" : "Настройки",
154 "settings.app.headlineAdvanced" : "Дополнительно", 154 "settings.app.headlineAdvanced" : "Дополнительно",
155 "settings.app.headlineAppearance" : "Внешний вид", 155 "settings.app.headlineAppearance" : "Внешний вид",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Пожалуйста перезапустите Franz после изменения настроек прокси.", 212 "settings.service.form.proxy.restartInfo" : "Пожалуйста перезапустите Franz после изменения настроек прокси.",
213 "settings.service.form.proxy.user" : "Пользователь (опционально)", 213 "settings.service.form.proxy.user" : "Пользователь (опционально)",
214 "settings.service.form.saveButton" : "Сохранить сервис", 214 "settings.service.form.saveButton" : "Сохранить сервис",
215 "settings.service.form.spellcheckerLanguage" : "Проверка правописания",
216 "settings.service.form.spellcheckerLanguage.default" : "Использовать системные параметры по умолчанию ({default})",
217 "settings.service.form.tabHosted" : "Размещено", 215 "settings.service.form.tabHosted" : "Размещено",
218 "settings.service.form.tabOnPremise" : "Свой хостинг ⭐️", 216 "settings.service.form.tabOnPremise" : "Свой хостинг ⭐️",
219 "settings.service.form.team" : "Команда", 217 "settings.service.form.team" : "Команда",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Найти сервисы", 221 "settings.services.discoverServices" : "Найти сервисы",
224 "settings.services.headline" : "Ваши сервисы", 222 "settings.services.headline" : "Ваши сервисы",
225 "settings.services.noServicesAdded" : "Вы пока не добавили никаких сервисов.", 223 "settings.services.noServicesAdded" : "Вы пока не добавили никаких сервисов.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Сервис отключен", 225 "settings.services.tooltip.isDisabled" : "Сервис отключен",
227 "settings.services.tooltip.isMuted" : "Все звуки отключены", 226 "settings.services.tooltip.isMuted" : "Все звуки отключены",
228 "settings.services.tooltip.notificationsDisabled" : "Уведомления отключены", 227 "settings.services.tooltip.notificationsDisabled" : "Уведомления отключены",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Резидентам ЕвроСоюза: могут применяться местные налоги", 254 "subscription.euTaxInfo" : "Резидентам ЕвроСоюза: могут применяться местные налоги",
256 "subscription.features.ads" : "Без рекламы, навсегда!", 255 "subscription.features.ads" : "Без рекламы, навсегда!",
257 "subscription.features.comingSoon" : "скоро", 256 "subscription.features.comingSoon" : "скоро",
258 "subscription.features.encryptedSync" : "Зашифрованные сессии синхронизации",
259 "subscription.features.noInterruptions" : "Никаких задержек и предложений перейти на платную версию", 257 "subscription.features.noInterruptions" : "Никаких задержек и предложений перейти на платную версию",
260 "subscription.features.onpremise" : "Добавление облачных служб или служб на своём хостинге типа HipChat",
261 "subscription.features.onpremise.mattermost" : "Локальные\/размещенные на хостинге сервисы, такие как Mattermost", 258 "subscription.features.onpremise.mattermost" : "Локальные\/размещенные на хостинге сервисы, такие как Mattermost",
262 "subscription.features.proxy" : "Подержка прокси для сервисов", 259 "subscription.features.proxy" : "Подержка прокси для сервисов",
263 "subscription.features.spellchecker" : "Поддержка проверки правописания", 260 "subscription.features.spellchecker" : "Поддержка проверки правописания",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Перезагрузить", 277 "tabs.item.reload" : "Перезагрузить",
281 "validation.email" : "{field} недействительно", 278 "validation.email" : "{field} недействительно",
282 "validation.minLength" : "{field} должно быть не менее {length} символов", 279 "validation.minLength" : "{field} должно быть не менее {length} символов",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} обязательно", 281 "validation.required" : "{field} обязательно",
284 "validation.url" : "{field} является недействительной ссылкой", 282 "validation.url" : "{field} является недействительной ссылкой",
285 "welcome.loginButton" : "Вход", 283 "welcome.loginButton" : "Вход",
286 "welcome.signupButton" : "Создать бесплатный аккаунт", 284 "welcome.signupButton" : "Создать бесплатный аккаунт"
287 "welcome.slogan" : "Общение, которое работает для вас"
288} 285}
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index 35c699322..688490b58 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Podpora", 70 "menu.help.support" : "Podpora",
71 "menu.help.tos" : "Podmienky použitia", 71 "menu.help.tos" : "Podmienky použitia",
72 "menu.services" : "Služby", 72 "menu.services" : "Služby",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Pridať novú službu...", 74 "menu.services.addNewService" : "Pridať novú službu...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Zobraziť", 76 "menu.view" : "Zobraziť",
75 "menu.view.enterFullScreen" : "Na celú obrazovku", 77 "menu.view.enterFullScreen" : "Na celú obrazovku",
76 "menu.view.exitFullScreen" : "Ukončiť režim na celú obrazovku", 78 "menu.view.exitFullScreen" : "Ukončiť režim na celú obrazovku",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Prevziať", 130 "settings.account.invoiceDownload" : "Prevziať",
129 "settings.account.manageSubscription.label" : "Spravovať vaše odoberanie", 131 "settings.account.manageSubscription.label" : "Spravovať vaše odoberanie",
130 "settings.account.successInfo" : "Vaše zmeny boli uložené", 132 "settings.account.successInfo" : "Vaše zmeny boli uložené",
133 "settings.account.tryReloadServices" : "Skúsiť znova",
131 "settings.account.tryReloadUserInfoRequest" : "Skúsiť znova", 134 "settings.account.tryReloadUserInfoRequest" : "Skúsiť znova",
132 "settings.account.userInfoRequestFailed" : "Nebolo možné načítať informácie o používateľovi", 135 "settings.account.userInfoRequestFailed" : "Nebolo možné načítať informácie o používateľovi",
133 "settings.app.buttonClearAllCache" : "Vyčistiť vyrovnávaciu pamäť", 136 "settings.app.buttonClearAllCache" : "Vyčistiť vyrovnávaciu pamäť",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Vrátane beta verzií", 143 "settings.app.form.beta" : "Vrátane beta verzií",
141 "settings.app.form.darkMode" : "Join the Dark Side", 144 "settings.app.form.darkMode" : "Join the Dark Side",
142 "settings.app.form.enableGPUAcceleration" : "Zapnúť GPU zrýchlenie", 145 "settings.app.form.enableGPUAcceleration" : "Zapnúť GPU zrýchlenie",
143 "settings.app.form.enableMenuBar" : "Zobraziť Franz v ponuke menu",
144 "settings.app.form.enableSpellchecking" : "Zapnúť kontrolu pravopisu", 146 "settings.app.form.enableSpellchecking" : "Zapnúť kontrolu pravopisu",
145 "settings.app.form.enableSystemTray" : "Zobrazovať Franz v systémovej lište", 147 "settings.app.form.enableSystemTray" : "Zobrazovať Franz v systémovej lište",
146 "settings.app.form.hideDockIcon" : "Skryť ikonu Franz v doku",
147 "settings.app.form.language" : "Jazyk", 148 "settings.app.form.language" : "Jazyk",
148 "settings.app.form.minimizeToSystemTray" : "Minimalizovať Franz do systémovej lišty", 149 "settings.app.form.minimizeToSystemTray" : "Minimalizovať Franz do systémovej lišty",
149 "settings.app.form.runInBackground" : "Po zatvorení okna ponechať Franz spustený na pozadí", 150 "settings.app.form.runInBackground" : "Po zatvorení okna ponechať Franz spustený na pozadí",
150 "settings.app.form.showDisabledServices" : "Zobraziť záložky vypnutých služieb", 151 "settings.app.form.showDisabledServices" : "Zobraziť záložky vypnutých služieb",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Zobraziť symbol pre neprečítané správy, keď sú vypnuté upozornenia", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Zobraziť symbol pre neprečítané správy, keď sú vypnuté upozornenia",
152 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
153 "settings.app.headline" : "Nastavenia", 153 "settings.app.headline" : "Nastavenia",
154 "settings.app.headlineAdvanced" : "Pokročilé", 154 "settings.app.headlineAdvanced" : "Pokročilé",
155 "settings.app.headlineAppearance" : "Vzhľad", 155 "settings.app.headlineAppearance" : "Vzhľad",
@@ -212,8 +212,6 @@
212 "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.",
213 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "User (optional)",
214 "settings.service.form.saveButton" : "Uložiť službu", 214 "settings.service.form.saveButton" : "Uložiť službu",
215 "settings.service.form.spellcheckerLanguage" : "Spell checking Language",
216 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})",
217 "settings.service.form.tabHosted" : "Hostované", 215 "settings.service.form.tabHosted" : "Hostované",
218 "settings.service.form.tabOnPremise" : "Vlastné hostovanie ⭐️", 216 "settings.service.form.tabOnPremise" : "Vlastné hostovanie ⭐️",
219 "settings.service.form.team" : "Tím", 217 "settings.service.form.team" : "Tím",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Preskúmať služby", 221 "settings.services.discoverServices" : "Preskúmať služby",
224 "settings.services.headline" : "Vaše služby", 222 "settings.services.headline" : "Vaše služby",
225 "settings.services.noServicesAdded" : "Doposiaľ ste nepridali žiadne služby.", 223 "settings.services.noServicesAdded" : "Doposiaľ ste nepridali žiadne služby.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Služba je vypnutá", 225 "settings.services.tooltip.isDisabled" : "Služba je vypnutá",
227 "settings.services.tooltip.isMuted" : "Všetky zvuky sú stíšené", 226 "settings.services.tooltip.isMuted" : "Všetky zvuky sú stíšené",
228 "settings.services.tooltip.notificationsDisabled" : "Oznámenia sú vypnuté", 227 "settings.services.tooltip.notificationsDisabled" : "Oznámenia sú vypnuté",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Pre obyvateľov EÚ: môže byť aplikovaná miestna daň", 254 "subscription.euTaxInfo" : "Pre obyvateľov EÚ: môže byť aplikovaná miestna daň",
256 "subscription.features.ads" : "Žiadne reklamy, nikdy!", 255 "subscription.features.ads" : "Žiadne reklamy, nikdy!",
257 "subscription.features.comingSoon" : "už čoskoro", 256 "subscription.features.comingSoon" : "už čoskoro",
258 "subscription.features.encryptedSync" : "Šifrovaná synchronizácia relácie",
259 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 257 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
260 "subscription.features.onpremise" : "Pridať lokálne hostované služby, ako napr. HipChat",
261 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 258 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
262 "subscription.features.proxy" : "Proxy support for services", 259 "subscription.features.proxy" : "Proxy support for services",
263 "subscription.features.spellchecker" : "Support for spellchecker", 260 "subscription.features.spellchecker" : "Support for spellchecker",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Obnoviť", 277 "tabs.item.reload" : "Obnoviť",
281 "validation.email" : "{field} je neplatný", 278 "validation.email" : "{field} je neplatný",
282 "validation.minLength" : "{field} by malo byť dlhé aspoň {length} znakov", 279 "validation.minLength" : "{field} by malo byť dlhé aspoň {length} znakov",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} je povinné", 281 "validation.required" : "{field} je povinné",
284 "validation.url" : "{field} nie je platné URL", 282 "validation.url" : "{field} nie je platné URL",
285 "welcome.loginButton" : "Prihlásiť sa do vášho účtu", 283 "welcome.loginButton" : "Prihlásiť sa do vášho účtu",
286 "welcome.signupButton" : "Vytvoriť účet zdarma", 284 "welcome.signupButton" : "Vytvoriť účet zdarma"
287 "welcome.slogan" : "Správy, ktoré pracujú pre vás"
288} 285}
diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json
index 8ffc0c007..a3a80925d 100644
--- a/src/i18n/locales/sr.json
+++ b/src/i18n/locales/sr.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Подршка", 70 "menu.help.support" : "Подршка",
71 "menu.help.tos" : "Услови коришћења услуге", 71 "menu.help.tos" : "Услови коришћења услуге",
72 "menu.services" : "Usluge", 72 "menu.services" : "Usluge",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Додај нову услугу", 74 "menu.services.addNewService" : "Додај нову услугу",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Преглед", 76 "menu.view" : "Преглед",
75 "menu.view.enterFullScreen" : "Отвори у целом екрану", 77 "menu.view.enterFullScreen" : "Отвори у целом екрану",
76 "menu.view.exitFullScreen" : "Напусти цео екран", 78 "menu.view.exitFullScreen" : "Напусти цео екран",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Preuzmite", 130 "settings.account.invoiceDownload" : "Preuzmite",
129 "settings.account.manageSubscription.label" : "Upravljajte pretplatama", 131 "settings.account.manageSubscription.label" : "Upravljajte pretplatama",
130 "settings.account.successInfo" : "Vaše promjene su spremljene", 132 "settings.account.successInfo" : "Vaše promjene su spremljene",
133 "settings.account.tryReloadServices" : "Pokušajte ponovno",
131 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno", 134 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno",
132 "settings.account.userInfoRequestFailed" : "Nije moguće učitati informacije o korisniku", 135 "settings.account.userInfoRequestFailed" : "Nije moguće učitati informacije o korisniku",
133 "settings.app.buttonClearAllCache" : "Очисти кеш", 136 "settings.app.buttonClearAllCache" : "Очисти кеш",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Obuhvati i beta verzije", 143 "settings.app.form.beta" : "Obuhvati i beta verzije",
141 "settings.app.form.darkMode" : "Join the Dark Side", 144 "settings.app.form.darkMode" : "Join the Dark Side",
142 "settings.app.form.enableGPUAcceleration" : "Омогући убрзање графичке јединице", 145 "settings.app.form.enableGPUAcceleration" : "Омогући убрзање графичке јединице",
143 "settings.app.form.enableMenuBar" : "Покажи Франз у менију",
144 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa", 146 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa",
145 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci", 147 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci",
146 "settings.app.form.hideDockIcon" : "Сакриј Франз иконицу у доку",
147 "settings.app.form.language" : "Jezik", 148 "settings.app.form.language" : "Jezik",
148 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku", 149 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku",
149 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren", 150 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren",
150 "settings.app.form.showDisabledServices" : "Prikaži ploče s onemogućenim servisima", 151 "settings.app.form.showDisabledServices" : "Prikaži ploče s onemogućenim servisima",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Покажи беџ за непрочитане поруке када су обавештења онемогућена", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Покажи беџ за непрочитане поруке када су обавештења онемогућена",
152 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
153 "settings.app.headline" : "Подешавања", 153 "settings.app.headline" : "Подешавања",
154 "settings.app.headlineAdvanced" : "Napredne alatke", 154 "settings.app.headlineAdvanced" : "Napredne alatke",
155 "settings.app.headlineAppearance" : "Izgled", 155 "settings.app.headlineAppearance" : "Izgled",
@@ -212,8 +212,6 @@
212 "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.",
213 "settings.service.form.proxy.user" : "User (optional)", 213 "settings.service.form.proxy.user" : "User (optional)",
214 "settings.service.form.saveButton" : "Sačuvaj uslugu\/e", 214 "settings.service.form.saveButton" : "Sačuvaj uslugu\/e",
215 "settings.service.form.spellcheckerLanguage" : "Spell checking Language",
216 "settings.service.form.spellcheckerLanguage.default" : "Use System Default ({default})",
217 "settings.service.form.tabHosted" : "Hostovano", 215 "settings.service.form.tabHosted" : "Hostovano",
218 "settings.service.form.tabOnPremise" : "Samo-hostovano ⭐️", 216 "settings.service.form.tabOnPremise" : "Samo-hostovano ⭐️",
219 "settings.service.form.team" : "Tim", 217 "settings.service.form.team" : "Tim",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Pronađite usluge", 221 "settings.services.discoverServices" : "Pronađite usluge",
224 "settings.services.headline" : "Vaše usluge", 222 "settings.services.headline" : "Vaše usluge",
225 "settings.services.noServicesAdded" : "Još uvijek niste unijeli niti jednu uslugu.", 223 "settings.services.noServicesAdded" : "Još uvijek niste unijeli niti jednu uslugu.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Usluga je onemogućena.", 225 "settings.services.tooltip.isDisabled" : "Usluga je onemogućena.",
227 "settings.services.tooltip.isMuted" : "Svi zvukovi su onemogućeni.", 226 "settings.services.tooltip.isMuted" : "Svi zvukovi su onemogućeni.",
228 "settings.services.tooltip.notificationsDisabled" : "Obavijesti su onemogućene.", 227 "settings.services.tooltip.notificationsDisabled" : "Obavijesti su onemogućene.",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje", 254 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje",
256 "subscription.features.ads" : "Bez reklama, doživotno!", 255 "subscription.features.ads" : "Bez reklama, doživotno!",
257 "subscription.features.comingSoon" : "Dolazi uskoro", 256 "subscription.features.comingSoon" : "Dolazi uskoro",
258 "subscription.features.encryptedSync" : "Kodirano usklađivanje sesija.",
259 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 257 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
260 "subscription.features.onpremise" : "Dodajte pretpostavljeni\/hostirani servis kao što ima usluga HipChat",
261 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost", 258 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
262 "subscription.features.proxy" : "Proxy support for services", 259 "subscription.features.proxy" : "Proxy support for services",
263 "subscription.features.spellchecker" : "Support for spellchecker", 260 "subscription.features.spellchecker" : "Support for spellchecker",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Ponovno učitavanje", 277 "tabs.item.reload" : "Ponovno učitavanje",
281 "validation.email" : "{поље} није валидно", 278 "validation.email" : "{поље} није валидно",
282 "validation.minLength" : "{поље} треба да буде најмање {дужина} карактера дугачко", 279 "validation.minLength" : "{поље} треба да буде најмање {дужина} карактера дугачко",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{поље} је неопходно", 281 "validation.required" : "{поље} је неопходно",
284 "validation.url" : "{field} није валидан УРЛ", 282 "validation.url" : "{field} није валидан УРЛ",
285 "welcome.loginButton" : "Prijavite se na račun", 283 "welcome.loginButton" : "Prijavite se na račun",
286 "welcome.signupButton" : "Stvorite novi korisnički račun", 284 "welcome.signupButton" : "Stvorite novi korisnički račun"
287 "welcome.slogan" : "Poruke koje su stvorene za tebe"
288} 285}
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index 70632b966..9f8313c2e 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -4,18 +4,18 @@
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 "feature.shareFranz.action.email" : "Send as email", 7 "feature.shareFranz.action.email" : "Mail olarak gönder",
8 "feature.shareFranz.action.facebook" : "Share on Facebook", 8 "feature.shareFranz.action.facebook" : "Facebook'ta Paylaş",
9 "feature.shareFranz.action.twitter" : "Share on Twitter", 9 "feature.shareFranz.action.twitter" : "Twitter'da Paylaş",
10 "feature.shareFranz.headline" : "Franz is better together!", 10 "feature.shareFranz.headline" : "Franz birlikte daha iyi!",
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", 11 "feature.shareFranz.shareText.email" : "Franz'a {count} tane servis ekledim! WhatsApp, Messenger, Slack ve fazlasını içeren ücretsiz uygulamayı www.meetfranz.com adresinden edinin.",
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", 12 "feature.shareFranz.shareText.twitter" : "Franz'a {count} tane servis ekledim! WhatsApp, Messenger, Slack ve fazlasını içeren ücretsiz uygulamayı www.meetfranz.com adresinden edinin. \/cc @MeetFranz",
13 "feature.shareFranz.text" : "Tell your friends and colleagues how awesome Franz is and help us to spread the word.", 13 "feature.shareFranz.text" : "Arkadaşlarına ve meslektaşlarına Franz'ın ne kadar harika olduğunu söyle ve bize bu kelimeyi yaymamızda yardım et.",
14 "global.api.unhealthy" : "Franz hizmetlerine şu anda erişilemiyor", 14 "global.api.unhealthy" : "Franz hizmetlerine şu anda erişilemiyor",
15 "global.notConnectedToTheInternet" : "İnternete bağlı değilsiniz.", 15 "global.notConnectedToTheInternet" : "İnternete bağlı değilsiniz.",
16 "global.spellchecker.useDefault" : "Sistem Dilini Kullan ({default})", 16 "global.spellchecker.useDefault" : "Sistem Dilini Kullan ({default})",
17 "global.spellchecking.autodetect" : "Detect language automatically", 17 "global.spellchecking.autodetect" : "Dili otomatik tespit et",
18 "global.spellchecking.autodetect.short" : "Automatic", 18 "global.spellchecking.autodetect.short" : "Otomatik",
19 "global.spellchecking.language" : "İmla kontrol dili", 19 "global.spellchecking.language" : "İmla kontrol dili",
20 "import.headline" : "Franz 4 servislerinizi içeri aktarın", 20 "import.headline" : "Franz 4 servislerinizi içeri aktarın",
21 "import.notSupportedHeadline" : "Henüz Franz 5'te desteklenmeyen servisler", 21 "import.notSupportedHeadline" : "Henüz Franz 5'te desteklenmeyen servisler",
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Destek", 70 "menu.help.support" : "Destek",
71 "menu.help.tos" : "Kullanım Şartları", 71 "menu.help.tos" : "Kullanım Şartları",
72 "menu.services" : "Hizmetler", 72 "menu.services" : "Hizmetler",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Yeni servis ekle...", 74 "menu.services.addNewService" : "Yeni servis ekle...",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Görünüm", 76 "menu.view" : "Görünüm",
75 "menu.view.enterFullScreen" : "Tam Ekrana Geç", 77 "menu.view.enterFullScreen" : "Tam Ekrana Geç",
76 "menu.view.exitFullScreen" : "Tam Ekrandan Çık", 78 "menu.view.exitFullScreen" : "Tam Ekrandan Çık",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "İndir", 130 "settings.account.invoiceDownload" : "İndir",
129 "settings.account.manageSubscription.label" : "Aboneliğini yönet", 131 "settings.account.manageSubscription.label" : "Aboneliğini yönet",
130 "settings.account.successInfo" : "Değişikliklerin kaydedildi", 132 "settings.account.successInfo" : "Değişikliklerin kaydedildi",
133 "settings.account.tryReloadServices" : "Tekrar deneyin",
131 "settings.account.tryReloadUserInfoRequest" : "Tekrar deneyin", 134 "settings.account.tryReloadUserInfoRequest" : "Tekrar deneyin",
132 "settings.account.userInfoRequestFailed" : "Kullanıcı bilgisi yüklenemedi", 135 "settings.account.userInfoRequestFailed" : "Kullanıcı bilgisi yüklenemedi",
133 "settings.app.buttonClearAllCache" : "Önbelleği temizle", 136 "settings.app.buttonClearAllCache" : "Önbelleği temizle",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Beta versiyonları dahil et", 143 "settings.app.form.beta" : "Beta versiyonları dahil et",
141 "settings.app.form.darkMode" : "Karanlık tarafa katıl", 144 "settings.app.form.darkMode" : "Karanlık tarafa katıl",
142 "settings.app.form.enableGPUAcceleration" : "Grafik İşlemci Ünitesi (GPU) Hızlandırıcısını Aktif et", 145 "settings.app.form.enableGPUAcceleration" : "Grafik İşlemci Ünitesi (GPU) Hızlandırıcısını Aktif et",
143 "settings.app.form.enableMenuBar" : "Menü çubuğunda Franz'ı göster",
144 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir", 146 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir",
145 "settings.app.form.enableSystemTray" : "Franz'ı sistem tepsisinde göster", 147 "settings.app.form.enableSystemTray" : "Franz'ı sistem tepsisinde göster",
146 "settings.app.form.hideDockIcon" : "Franz Simgesini Gösterme",
147 "settings.app.form.language" : "Dil", 148 "settings.app.form.language" : "Dil",
148 "settings.app.form.minimizeToSystemTray" : "Franz'ı sistem tepsisine küçült", 149 "settings.app.form.minimizeToSystemTray" : "Franz'ı sistem tepsisine küçült",
149 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut", 150 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut",
150 "settings.app.form.showDisabledServices" : "Devre dışı bırakılan servis sekmelerini göster", 151 "settings.app.form.showDisabledServices" : "Devre dışı bırakılan servis sekmelerini göster",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Bildirimler kapalı iken okunmamış mesaj sayısını göster", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Bildirimler kapalı iken okunmamış mesaj sayısını göster",
152 "settings.app.form.spellcheckerLanguage" : "İmla kontrol dili",
153 "settings.app.headline" : "Ayarlar", 153 "settings.app.headline" : "Ayarlar",
154 "settings.app.headlineAdvanced" : "Gelişmiş", 154 "settings.app.headlineAdvanced" : "Gelişmiş",
155 "settings.app.headlineAppearance" : "Görünüm", 155 "settings.app.headlineAppearance" : "Görünüm",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Proxy ayarlarını değiştirdikten sonra Franz'ı yeniden başlatınız.", 212 "settings.service.form.proxy.restartInfo" : "Proxy ayarlarını değiştirdikten sonra Franz'ı yeniden başlatınız.",
213 "settings.service.form.proxy.user" : "Kullanıcı (opsiyonel)", 213 "settings.service.form.proxy.user" : "Kullanıcı (opsiyonel)",
214 "settings.service.form.saveButton" : "Servisi kaydet", 214 "settings.service.form.saveButton" : "Servisi kaydet",
215 "settings.service.form.spellcheckerLanguage" : "İmla kontrol dili",
216 "settings.service.form.spellcheckerLanguage.default" : "Sistem Dilini Kullan ({default})",
217 "settings.service.form.tabHosted" : "Barındırılan", 215 "settings.service.form.tabHosted" : "Barındırılan",
218 "settings.service.form.tabOnPremise" : "Kendi barındırılan", 216 "settings.service.form.tabOnPremise" : "Kendi barındırılan",
219 "settings.service.form.team" : "Takım", 217 "settings.service.form.team" : "Takım",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Servisleri keşfet", 221 "settings.services.discoverServices" : "Servisleri keşfet",
224 "settings.services.headline" : "Servislerin", 222 "settings.services.headline" : "Servislerin",
225 "settings.services.noServicesAdded" : "Henüz hiç servis eklemedin.", 223 "settings.services.noServicesAdded" : "Henüz hiç servis eklemedin.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Servis devre dışı", 225 "settings.services.tooltip.isDisabled" : "Servis devre dışı",
227 "settings.services.tooltip.isMuted" : "Tüm sesler kapalı", 226 "settings.services.tooltip.isMuted" : "Tüm sesler kapalı",
228 "settings.services.tooltip.notificationsDisabled" : "Bildirimler devre dışı", 227 "settings.services.tooltip.notificationsDisabled" : "Bildirimler devre dışı",
@@ -255,11 +254,9 @@
255 "subscription.euTaxInfo" : "AB vatandaşları: yerel satış vergileri uygulanabilir", 254 "subscription.euTaxInfo" : "AB vatandaşları: yerel satış vergileri uygulanabilir",
256 "subscription.features.ads" : "Reklam yok, asla!", 255 "subscription.features.ads" : "Reklam yok, asla!",
257 "subscription.features.comingSoon" : "yakında geliyor", 256 "subscription.features.comingSoon" : "yakında geliyor",
258 "subscription.features.encryptedSync" : "Şifreli oturum senkronizasyonu", 257 "subscription.features.noInterruptions" : "Uygulama gecikmeleri & yükseltme lisanları için dırdır yok",
259 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license", 258 "subscription.features.onpremise.mattermost" : "Mattermost gibi şirket-içi\/barındırılan servisler ekleyin",
260 "subscription.features.onpremise" : "HipChat gibi kurum içi\/barındırılan hizmetler ekle", 259 "subscription.features.proxy" : "Servisler için proxy desteği",
261 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
262 "subscription.features.proxy" : "Proxy support for services",
263 "subscription.features.spellchecker" : "Yazım denetleyicisi desteği", 260 "subscription.features.spellchecker" : "Yazım denetleyicisi desteği",
264 "subscription.includedFeatures" : "Ücretli Franz Premium Destekçi Hesabına dahil", 261 "subscription.includedFeatures" : "Ücretli Franz Premium Destekçi Hesabına dahil",
265 "subscription.paymentSessionError" : "Ödeme formu başlatılamadı", 262 "subscription.paymentSessionError" : "Ödeme formu başlatılamadı",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Tekrar yükle", 277 "tabs.item.reload" : "Tekrar yükle",
281 "validation.email" : "{alan} geçerli değil", 278 "validation.email" : "{alan} geçerli değil",
282 "validation.minLength" : "{field} en az {length} karakter uzunluğunda olmalı", 279 "validation.minLength" : "{field} en az {length} karakter uzunluğunda olmalı",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} gereklidir", 281 "validation.required" : "{field} gereklidir",
284 "validation.url" : "{field} geçerli bir URL değil", 282 "validation.url" : "{field} geçerli bir URL değil",
285 "welcome.loginButton" : "Hesabına giriş yap", 283 "welcome.loginButton" : "Hesabına giriş yap",
286 "welcome.signupButton" : "Ücretsiz hesap oluştur", 284 "welcome.signupButton" : "Ücretsiz hesap oluştur"
287 "welcome.slogan" : "Sizin için çalışan mesajlaşma"
288} 285}
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index db3145b36..56dda09d5 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "Підтримка", 70 "menu.help.support" : "Підтримка",
71 "menu.help.tos" : "Умови використання", 71 "menu.help.tos" : "Умови використання",
72 "menu.services" : "Служби", 72 "menu.services" : "Служби",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "Додати сервіс", 74 "menu.services.addNewService" : "Додати сервіс",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "Вигляд", 76 "menu.view" : "Вигляд",
75 "menu.view.enterFullScreen" : "Вікно на повний екран", 77 "menu.view.enterFullScreen" : "Вікно на повний екран",
76 "menu.view.exitFullScreen" : "Вийти з повного екрану", 78 "menu.view.exitFullScreen" : "Вийти з повного екрану",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "Завантажити", 130 "settings.account.invoiceDownload" : "Завантажити",
129 "settings.account.manageSubscription.label" : "Керування вашою підпискою", 131 "settings.account.manageSubscription.label" : "Керування вашою підпискою",
130 "settings.account.successInfo" : "Ваші зміни були збережені", 132 "settings.account.successInfo" : "Ваші зміни були збережені",
133 "settings.account.tryReloadServices" : "Спробуйте ще раз",
131 "settings.account.tryReloadUserInfoRequest" : "Спробуйте ще раз", 134 "settings.account.tryReloadUserInfoRequest" : "Спробуйте ще раз",
132 "settings.account.userInfoRequestFailed" : "Не вдалося завантажити інформацію користувача", 135 "settings.account.userInfoRequestFailed" : "Не вдалося завантажити інформацію користувача",
133 "settings.app.buttonClearAllCache" : "Очистити кеш", 136 "settings.app.buttonClearAllCache" : "Очистити кеш",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "Включити бета-версії", 143 "settings.app.form.beta" : "Включити бета-версії",
141 "settings.app.form.darkMode" : "Переходь на Темну Сторону", 144 "settings.app.form.darkMode" : "Переходь на Темну Сторону",
142 "settings.app.form.enableGPUAcceleration" : "Ввімкнути прискорення GPU", 145 "settings.app.form.enableGPUAcceleration" : "Ввімкнути прискорення GPU",
143 "settings.app.form.enableMenuBar" : "Відображати Franz в панелі головного меню",
144 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії", 146 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії",
145 "settings.app.form.enableSystemTray" : "Показувати Franz у системному лотку", 147 "settings.app.form.enableSystemTray" : "Показувати Franz у системному лотку",
146 "settings.app.form.hideDockIcon" : "Сховати значок Franz в Dock",
147 "settings.app.form.language" : "Мова", 148 "settings.app.form.language" : "Мова",
148 "settings.app.form.minimizeToSystemTray" : "Мінімізувати Franz до системного лотка", 149 "settings.app.form.minimizeToSystemTray" : "Мінімізувати Franz до системного лотка",
149 "settings.app.form.runInBackground" : "Тримати Franz в фоні при закритті вікна", 150 "settings.app.form.runInBackground" : "Тримати Franz в фоні при закритті вікна",
150 "settings.app.form.showDisabledServices" : "Показати вкладку вимкнених сервісів", 151 "settings.app.form.showDisabledServices" : "Показати вкладку вимкнених сервісів",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "Показувати значок непрочитаних повідомлень коли сповіщення вимкнені", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "Показувати значок непрочитаних повідомлень коли сповіщення вимкнені",
152 "settings.app.form.spellcheckerLanguage" : "Мова перевірки правопису",
153 "settings.app.headline" : "Налаштування", 153 "settings.app.headline" : "Налаштування",
154 "settings.app.headlineAdvanced" : "Додаткові налаштування", 154 "settings.app.headlineAdvanced" : "Додаткові налаштування",
155 "settings.app.headlineAppearance" : "Вигляд", 155 "settings.app.headlineAppearance" : "Вигляд",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "Будь ласка, перезапустіть Franz після зміни налуштувань проксі", 212 "settings.service.form.proxy.restartInfo" : "Будь ласка, перезапустіть Franz після зміни налуштувань проксі",
213 "settings.service.form.proxy.user" : "Користувач (опційно)", 213 "settings.service.form.proxy.user" : "Користувач (опційно)",
214 "settings.service.form.saveButton" : "Зберегти сервіс", 214 "settings.service.form.saveButton" : "Зберегти сервіс",
215 "settings.service.form.spellcheckerLanguage" : "Мова перевірки правопису",
216 "settings.service.form.spellcheckerLanguage.default" : "Використовувати системні параметри за змовчуванням ({default})",
217 "settings.service.form.tabHosted" : "Розміщений", 215 "settings.service.form.tabHosted" : "Розміщений",
218 "settings.service.form.tabOnPremise" : "Самостійно розміщений ⭐️", 216 "settings.service.form.tabOnPremise" : "Самостійно розміщений ⭐️",
219 "settings.service.form.team" : "Команда", 217 "settings.service.form.team" : "Команда",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "Відкрийте для себе сервіси", 221 "settings.services.discoverServices" : "Відкрийте для себе сервіси",
224 "settings.services.headline" : "Ваші сервіси", 222 "settings.services.headline" : "Ваші сервіси",
225 "settings.services.noServicesAdded" : "Ви ще не додавали жодних сервісів.", 223 "settings.services.noServicesAdded" : "Ви ще не додавали жодних сервісів.",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "Сервіс відключений", 225 "settings.services.tooltip.isDisabled" : "Сервіс відключений",
227 "settings.services.tooltip.isMuted" : "Всі звуки вимкнено", 226 "settings.services.tooltip.isMuted" : "Всі звуки вимкнено",
228 "settings.services.tooltip.notificationsDisabled" : "Сповіщення відключені", 227 "settings.services.tooltip.notificationsDisabled" : "Сповіщення відключені",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "Для жителів ЄС: можуть застосовуватися податки", 254 "subscription.euTaxInfo" : "Для жителів ЄС: можуть застосовуватися податки",
256 "subscription.features.ads" : "Жодної реклами!", 255 "subscription.features.ads" : "Жодної реклами!",
257 "subscription.features.comingSoon" : "очікуйте незабаром", 256 "subscription.features.comingSoon" : "очікуйте незабаром",
258 "subscription.features.encryptedSync" : "Шифрована синхронізація сеансу",
259 "subscription.features.noInterruptions" : "Ніяких затримок та набридливих пропозицій з платних підписок", 257 "subscription.features.noInterruptions" : "Ніяких затримок та набридливих пропозицій з платних підписок",
260 "subscription.features.onpremise" : "Додайте on-premise \/ hosted сервіси, такі як Hipchat",
261 "subscription.features.onpremise.mattermost" : "Сервіси, що виконуються локально\/вимагають хостингу, приміром Mattermost", 258 "subscription.features.onpremise.mattermost" : "Сервіси, що виконуються локально\/вимагають хостингу, приміром Mattermost",
262 "subscription.features.proxy" : "Підтримка проксі ", 259 "subscription.features.proxy" : "Підтримка проксі ",
263 "subscription.features.spellchecker" : "Підтримка перевірки правопису", 260 "subscription.features.spellchecker" : "Підтримка перевірки правопису",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "Перезавантажити", 277 "tabs.item.reload" : "Перезавантажити",
281 "validation.email" : "{field} не валідне", 278 "validation.email" : "{field} не валідне",
282 "validation.minLength" : "Кількість символів в {field} повина бути не меньше {length} ", 279 "validation.minLength" : "Кількість символів в {field} повина бути не меньше {length} ",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field} обов'язвоке", 281 "validation.required" : "{field} обов'язвоке",
284 "validation.url" : "{field} не валідний URL", 282 "validation.url" : "{field} не валідний URL",
285 "welcome.loginButton" : "Увійдіть до свого акаунту", 283 "welcome.loginButton" : "Увійдіть до свого акаунту",
286 "welcome.signupButton" : "Створити безплатний акаунт", 284 "welcome.signupButton" : "Створити безплатний акаунт"
287 "welcome.slogan" : "Обмін повідомленнями, який працює для вас"
288} 285}
diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json
index 3ae08c9ef..54245ba57 100644
--- a/src/i18n/locales/zh-TW.json
+++ b/src/i18n/locales/zh-TW.json
@@ -70,7 +70,9 @@
70 "menu.help.support" : "支援", 70 "menu.help.support" : "支援",
71 "menu.help.tos" : "服務條款", 71 "menu.help.tos" : "服務條款",
72 "menu.services" : "服務", 72 "menu.services" : "服務",
73 "menu.services.activatePreviousService" : "Activate previous service",
73 "menu.services.addNewService" : "新增服務", 74 "menu.services.addNewService" : "新增服務",
75 "menu.services.setNextServiceActive" : "Activate next service",
74 "menu.view" : "檢視", 76 "menu.view" : "檢視",
75 "menu.view.enterFullScreen" : "進入全螢幕模式", 77 "menu.view.enterFullScreen" : "進入全螢幕模式",
76 "menu.view.exitFullScreen" : "離開全螢幕模式", 78 "menu.view.exitFullScreen" : "離開全螢幕模式",
@@ -128,6 +130,7 @@
128 "settings.account.invoiceDownload" : "下載", 130 "settings.account.invoiceDownload" : "下載",
129 "settings.account.manageSubscription.label" : "管理您的訂閱", 131 "settings.account.manageSubscription.label" : "管理您的訂閱",
130 "settings.account.successInfo" : "您的更變已經被儲存", 132 "settings.account.successInfo" : "您的更變已經被儲存",
133 "settings.account.tryReloadServices" : "再試一次",
131 "settings.account.tryReloadUserInfoRequest" : "再試一次", 134 "settings.account.tryReloadUserInfoRequest" : "再試一次",
132 "settings.account.userInfoRequestFailed" : "無法載入使用者資訊。", 135 "settings.account.userInfoRequestFailed" : "無法載入使用者資訊。",
133 "settings.app.buttonClearAllCache" : "清除快取", 136 "settings.app.buttonClearAllCache" : "清除快取",
@@ -140,16 +143,13 @@
140 "settings.app.form.beta" : "包含測試版", 143 "settings.app.form.beta" : "包含測試版",
141 "settings.app.form.darkMode" : "加入黑暗面", 144 "settings.app.form.darkMode" : "加入黑暗面",
142 "settings.app.form.enableGPUAcceleration" : "啟用 GPU 加速", 145 "settings.app.form.enableGPUAcceleration" : "啟用 GPU 加速",
143 "settings.app.form.enableMenuBar" : "在選單列顯示 Franz",
144 "settings.app.form.enableSpellchecking" : "啟用拼字檢查", 146 "settings.app.form.enableSpellchecking" : "啟用拼字檢查",
145 "settings.app.form.enableSystemTray" : "在系統列顯示 Franz", 147 "settings.app.form.enableSystemTray" : "在系統列顯示 Franz",
146 "settings.app.form.hideDockIcon" : "隱藏 Dock 中的 Franz 圖示",
147 "settings.app.form.language" : "語言", 148 "settings.app.form.language" : "語言",
148 "settings.app.form.minimizeToSystemTray" : "最小化 Franz 到系統列", 149 "settings.app.form.minimizeToSystemTray" : "最小化 Franz 到系統列",
149 "settings.app.form.runInBackground" : "當關閉視窗時,保持 Franz 在背景運作", 150 "settings.app.form.runInBackground" : "當關閉視窗時,保持 Franz 在背景運作",
150 "settings.app.form.showDisabledServices" : "顯示停用的服務標籤", 151 "settings.app.form.showDisabledServices" : "顯示停用的服務標籤",
151 "settings.app.form.showMessagesBadgesWhenMuted" : "當通知關閉時,標記未讀的訊息", 152 "settings.app.form.showMessagesBadgesWhenMuted" : "當通知關閉時,標記未讀的訊息",
152 "settings.app.form.spellcheckerLanguage" : "拼字檢查語言",
153 "settings.app.headline" : "設定", 153 "settings.app.headline" : "設定",
154 "settings.app.headlineAdvanced" : "進階", 154 "settings.app.headlineAdvanced" : "進階",
155 "settings.app.headlineAppearance" : "外觀", 155 "settings.app.headlineAppearance" : "外觀",
@@ -212,8 +212,6 @@
212 "settings.service.form.proxy.restartInfo" : "在變更 Proxy 設定後,請重新啟動 Franz", 212 "settings.service.form.proxy.restartInfo" : "在變更 Proxy 設定後,請重新啟動 Franz",
213 "settings.service.form.proxy.user" : "使用者 (選填)", 213 "settings.service.form.proxy.user" : "使用者 (選填)",
214 "settings.service.form.saveButton" : "保存服務", 214 "settings.service.form.saveButton" : "保存服務",
215 "settings.service.form.spellcheckerLanguage" : "拼字檢查語言",
216 "settings.service.form.spellcheckerLanguage.default" : "使用系統預設 ({default})",
217 "settings.service.form.tabHosted" : "託管", 215 "settings.service.form.tabHosted" : "託管",
218 "settings.service.form.tabOnPremise" : "自我託管⭐️", 216 "settings.service.form.tabOnPremise" : "自我託管⭐️",
219 "settings.service.form.team" : "團隊", 217 "settings.service.form.team" : "團隊",
@@ -223,6 +221,7 @@
223 "settings.services.discoverServices" : "發現服務", 221 "settings.services.discoverServices" : "發現服務",
224 "settings.services.headline" : "您的服務", 222 "settings.services.headline" : "您的服務",
225 "settings.services.noServicesAdded" : "你尚未新增任何服務", 223 "settings.services.noServicesAdded" : "你尚未新增任何服務",
224 "settings.services.servicesRequestFailed" : "Could not load your services",
226 "settings.services.tooltip.isDisabled" : "服務已停用", 225 "settings.services.tooltip.isDisabled" : "服務已停用",
227 "settings.services.tooltip.isMuted" : "所有的聲音都是靜音", 226 "settings.services.tooltip.isMuted" : "所有的聲音都是靜音",
228 "settings.services.tooltip.notificationsDisabled" : "通知已停用", 227 "settings.services.tooltip.notificationsDisabled" : "通知已停用",
@@ -255,9 +254,7 @@
255 "subscription.euTaxInfo" : "歐盟居民:可能採用當地銷售稅", 254 "subscription.euTaxInfo" : "歐盟居民:可能採用當地銷售稅",
256 "subscription.features.ads" : "無廣告,永遠!", 255 "subscription.features.ads" : "無廣告,永遠!",
257 "subscription.features.comingSoon" : "即將推出", 256 "subscription.features.comingSoon" : "即將推出",
258 "subscription.features.encryptedSync" : "加密的會話同步",
259 "subscription.features.noInterruptions" : "升級授權沒有延遲與打盹", 257 "subscription.features.noInterruptions" : "升級授權沒有延遲與打盹",
260 "subscription.features.onpremise" : "添加本地\/託管服務如HipChat",
261 "subscription.features.onpremise.mattermost" : "加入如 Mattermost 等已預定 \/ 託管的服務", 258 "subscription.features.onpremise.mattermost" : "加入如 Mattermost 等已預定 \/ 託管的服務",
262 "subscription.features.proxy" : "服務的代理伺服器支援", 259 "subscription.features.proxy" : "服務的代理伺服器支援",
263 "subscription.features.spellchecker" : "支援拼字檢查", 260 "subscription.features.spellchecker" : "支援拼字檢查",
@@ -280,9 +277,9 @@
280 "tabs.item.reload" : "重新載入", 277 "tabs.item.reload" : "重新載入",
281 "validation.email" : "{field}無效", 278 "validation.email" : "{field}無效",
282 "validation.minLength" : "{field}長度至少應為{length}個字", 279 "validation.minLength" : "{field}長度至少應為{length}個字",
280 "validation.oneRequired" : "At least one is required",
283 "validation.required" : "{field}為必填", 281 "validation.required" : "{field}為必填",
284 "validation.url" : "{field}不是個有效的網址", 282 "validation.url" : "{field}不是個有效的網址",
285 "welcome.loginButton" : "登入您的帳戶", 283 "welcome.loginButton" : "登入您的帳戶",
286 "welcome.signupButton" : "建立免費帳號", 284 "welcome.signupButton" : "建立免費帳號"
287 "welcome.slogan" : "為你通信"
288} 285}
diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json
index 384d4b441..4dd354afc 100644
--- a/src/i18n/messages/src/components/layout/AppLayout.json
+++ b/src/i18n/messages/src/components/layout/AppLayout.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your services have been updated.", 4 "defaultMessage": "!!!Your services have been updated.",
5 "file": "src/components/layout/AppLayout.js", 5 "file": "src/components/layout/AppLayout.js",
6 "start": { 6 "start": {
7 "line": 23, 7 "line": 26,
8 "column": 19 8 "column": 19
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 26, 11 "line": 29,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!A new update for Franz is available.", 17 "defaultMessage": "!!!A new update for Franz is available.",
18 "file": "src/components/layout/AppLayout.js", 18 "file": "src/components/layout/AppLayout.js",
19 "start": { 19 "start": {
20 "line": 27, 20 "line": 30,
21 "column": 19 21 "column": 19
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 30, 24 "line": 33,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Reload services", 30 "defaultMessage": "!!!Reload services",
31 "file": "src/components/layout/AppLayout.js", 31 "file": "src/components/layout/AppLayout.js",
32 "start": { 32 "start": {
33 "line": 31, 33 "line": 34,
34 "column": 24 34 "column": 24
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 34, 37 "line": 37,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Changelog", 43 "defaultMessage": "!!!Changelog",
44 "file": "src/components/layout/AppLayout.js", 44 "file": "src/components/layout/AppLayout.js",
45 "start": { 45 "start": {
46 "line": 35, 46 "line": 38,
47 "column": 13 47 "column": 13
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 38, 50 "line": 41,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Restart & install update", 56 "defaultMessage": "!!!Restart & install update",
57 "file": "src/components/layout/AppLayout.js", 57 "file": "src/components/layout/AppLayout.js",
58 "start": { 58 "start": {
59 "line": 39, 59 "line": 42,
60 "column": 23 60 "column": 23
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 42, 63 "line": 45,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Could not load services and user information", 69 "defaultMessage": "!!!Could not load services and user information",
70 "file": "src/components/layout/AppLayout.js", 70 "file": "src/components/layout/AppLayout.js",
71 "start": { 71 "start": {
72 "line": 43, 72 "line": 46,
73 "column": 26 73 "column": 26
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 46, 76 "line": 49,
77 "column": 3 77 "column": 3
78 } 78 }
79 } 79 }
diff --git a/src/i18n/messages/src/components/layout/Sidebar.json b/src/i18n/messages/src/components/layout/Sidebar.json
index 7aa00a186..d67adc96e 100644
--- a/src/i18n/messages/src/components/layout/Sidebar.json
+++ b/src/i18n/messages/src/components/layout/Sidebar.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Settings", 4 "defaultMessage": "!!!Settings",
5 "file": "src/components/layout/Sidebar.js", 5 "file": "src/components/layout/Sidebar.js",
6 "start": { 6 "start": {
7 "line": 11, 7 "line": 13,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 14, 11 "line": 16,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Add new service", 17 "defaultMessage": "!!!Add new service",
18 "file": "src/components/layout/Sidebar.js", 18 "file": "src/components/layout/Sidebar.js",
19 "start": { 19 "start": {
20 "line": 15, 20 "line": 17,
21 "column": 17 21 "column": 17
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 18, 24 "line": 20,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Disable notifications & audio", 30 "defaultMessage": "!!!Disable notifications & audio",
31 "file": "src/components/layout/Sidebar.js", 31 "file": "src/components/layout/Sidebar.js",
32 "start": { 32 "start": {
33 "line": 19, 33 "line": 21,
34 "column": 8 34 "column": 8
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 22, 37 "line": 24,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,37 @@
43 "defaultMessage": "!!!Enable notifications & audio", 43 "defaultMessage": "!!!Enable notifications & audio",
44 "file": "src/components/layout/Sidebar.js", 44 "file": "src/components/layout/Sidebar.js",
45 "start": { 45 "start": {
46 "line": 23, 46 "line": 25,
47 "column": 10 47 "column": 10
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 26, 50 "line": 28,
51 "column": 3
52 }
53 },
54 {
55 "id": "sidebar.openWorkspaceDrawer",
56 "defaultMessage": "!!!Open workspace drawer",
57 "file": "src/components/layout/Sidebar.js",
58 "start": {
59 "line": 29,
60 "column": 23
61 },
62 "end": {
63 "line": 32,
64 "column": 3
65 }
66 },
67 {
68 "id": "sidebar.closeWorkspaceDrawer",
69 "defaultMessage": "!!!Close workspace drawer",
70 "file": "src/components/layout/Sidebar.js",
71 "start": {
72 "line": 33,
73 "column": 24
74 },
75 "end": {
76 "line": 36,
51 "column": 3 77 "column": 3
52 } 78 }
53 } 79 }
diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
index 785ce9f29..77b0ed8a4 100644
--- a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
+++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Available services", 4 "defaultMessage": "!!!Available services",
5 "file": "src/components/settings/navigation/SettingsNavigation.js", 5 "file": "src/components/settings/navigation/SettingsNavigation.js",
6 "start": { 6 "start": {
7 "line": 9, 7 "line": 12,
8 "column": 21 8 "column": 21
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 12, 11 "line": 15,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,24 @@
17 "defaultMessage": "!!!Your services", 17 "defaultMessage": "!!!Your services",
18 "file": "src/components/settings/navigation/SettingsNavigation.js", 18 "file": "src/components/settings/navigation/SettingsNavigation.js",
19 "start": { 19 "start": {
20 "line": 13, 20 "line": 16,
21 "column": 16 21 "column": 16
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 16, 24 "line": 19,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.navigation.yourWorkspaces",
30 "defaultMessage": "!!!Your workspaces",
31 "file": "src/components/settings/navigation/SettingsNavigation.js",
32 "start": {
33 "line": 20,
34 "column": 18
35 },
36 "end": {
37 "line": 23,
25 "column": 3 38 "column": 3
26 } 39 }
27 }, 40 },
@@ -30,11 +43,11 @@
30 "defaultMessage": "!!!Account", 43 "defaultMessage": "!!!Account",
31 "file": "src/components/settings/navigation/SettingsNavigation.js", 44 "file": "src/components/settings/navigation/SettingsNavigation.js",
32 "start": { 45 "start": {
33 "line": 17, 46 "line": 24,
34 "column": 11 47 "column": 11
35 }, 48 },
36 "end": { 49 "end": {
37 "line": 20, 50 "line": 27,
38 "column": 3 51 "column": 3
39 } 52 }
40 }, 53 },
@@ -43,11 +56,11 @@
43 "defaultMessage": "!!!Settings", 56 "defaultMessage": "!!!Settings",
44 "file": "src/components/settings/navigation/SettingsNavigation.js", 57 "file": "src/components/settings/navigation/SettingsNavigation.js",
45 "start": { 58 "start": {
46 "line": 21, 59 "line": 28,
47 "column": 12 60 "column": 12
48 }, 61 },
49 "end": { 62 "end": {
50 "line": 24, 63 "line": 31,
51 "column": 3 64 "column": 3
52 } 65 }
53 }, 66 },
@@ -56,11 +69,11 @@
56 "defaultMessage": "!!!Invite Friends", 69 "defaultMessage": "!!!Invite Friends",
57 "file": "src/components/settings/navigation/SettingsNavigation.js", 70 "file": "src/components/settings/navigation/SettingsNavigation.js",
58 "start": { 71 "start": {
59 "line": 25, 72 "line": 32,
60 "column": 17 73 "column": 17
61 }, 74 },
62 "end": { 75 "end": {
63 "line": 28, 76 "line": 35,
64 "column": 3 77 "column": 3
65 } 78 }
66 }, 79 },
@@ -69,11 +82,11 @@
69 "defaultMessage": "!!!Logout", 82 "defaultMessage": "!!!Logout",
70 "file": "src/components/settings/navigation/SettingsNavigation.js", 83 "file": "src/components/settings/navigation/SettingsNavigation.js",
71 "start": { 84 "start": {
72 "line": 29, 85 "line": 36,
73 "column": 10 86 "column": 10
74 }, 87 },
75 "end": { 88 "end": {
76 "line": 32, 89 "line": 39,
77 "column": 3 90 "column": 3
78 } 91 }
79 } 92 }
diff --git a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json
index 582d546fa..320d3ca3e 100644
--- a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json
+++ b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Upgrade account", 4 "defaultMessage": "!!!Upgrade account",
5 "file": "src/components/ui/PremiumFeatureContainer/index.js", 5 "file": "src/components/ui/PremiumFeatureContainer/index.js",
6 "start": { 6 "start": {
7 "line": 14, 7 "line": 15,
8 "column": 10 8 "column": 10
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 17, 11 "line": 18,
12 "column": 3 12 "column": 3
13 } 13 }
14 } 14 }
diff --git a/src/i18n/messages/src/components/ui/WebviewLoader/index.json b/src/i18n/messages/src/components/ui/WebviewLoader/index.json
new file mode 100644
index 000000000..ef3e4b593
--- /dev/null
+++ b/src/i18n/messages/src/components/ui/WebviewLoader/index.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "service.webviewLoader.loading",
4 "defaultMessage": "!!!Loading",
5 "file": "src/components/ui/WebviewLoader/index.js",
6 "start": {
7 "line": 11,
8 "column": 11
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/shareFranz/Component.json b/src/i18n/messages/src/features/shareFranz/Component.json
index 0fec9db64..34a43d5a0 100644
--- a/src/i18n/messages/src/features/shareFranz/Component.json
+++ b/src/i18n/messages/src/features/shareFranz/Component.json
@@ -79,7 +79,7 @@
79 }, 79 },
80 { 80 {
81 "id": "feature.shareFranz.shareText.twitter", 81 "id": "feature.shareFranz.shareText.twitter",
82 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @MeetFranz", 82 "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger",
83 "file": "src/features/shareFranz/Component.js", 83 "file": "src/features/shareFranz/Component.js",
84 "start": { 84 "start": {
85 "line": 39, 85 "line": 39,
diff --git a/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json
new file mode 100644
index 000000000..f62bac42c
--- /dev/null
+++ b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "settings.workspace.add.form.submitButton",
4 "defaultMessage": "!!!Create workspace",
5 "file": "src/features/workspaces/components/CreateWorkspaceForm.js",
6 "start": {
7 "line": 13,
8 "column": 16
9 },
10 "end": {
11 "line": 16,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.workspace.add.form.name",
17 "defaultMessage": "!!!Name",
18 "file": "src/features/workspaces/components/CreateWorkspaceForm.js",
19 "start": {
20 "line": 17,
21 "column": 8
22 },
23 "end": {
24 "line": 20,
25 "column": 3
26 }
27 }
28] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json
new file mode 100644
index 000000000..7b0c3e1ce
--- /dev/null
+++ b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json
@@ -0,0 +1,67 @@
1[
2 {
3 "id": "settings.workspace.form.buttonDelete",
4 "defaultMessage": "!!!Delete workspace",
5 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
6 "start": {
7 "line": 19,
8 "column": 16
9 },
10 "end": {
11 "line": 22,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.workspace.form.buttonSave",
17 "defaultMessage": "!!!Save workspace",
18 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
19 "start": {
20 "line": 23,
21 "column": 14
22 },
23 "end": {
24 "line": 26,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.workspace.form.name",
30 "defaultMessage": "!!!Name",
31 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
32 "start": {
33 "line": 27,
34 "column": 8
35 },
36 "end": {
37 "line": 30,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.workspace.form.yourWorkspaces",
43 "defaultMessage": "!!!Your workspaces",
44 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
45 "start": {
46 "line": 31,
47 "column": 18
48 },
49 "end": {
50 "line": 34,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.workspace.form.servicesInWorkspaceHeadline",
56 "defaultMessage": "!!!Services in this Workspace",
57 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
58 "start": {
59 "line": 35,
60 "column": 31
61 },
62 "end": {
63 "line": 38,
64 "column": 3
65 }
66 }
67] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
new file mode 100644
index 000000000..9f0935620
--- /dev/null
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json
@@ -0,0 +1,106 @@
1[
2 {
3 "id": "workspaceDrawer.headline",
4 "defaultMessage": "!!!Workspaces",
5 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
6 "start": {
7 "line": 16,
8 "column": 12
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "workspaceDrawer.allServices",
17 "defaultMessage": "!!!All services",
18 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
19 "start": {
20 "line": 20,
21 "column": 15
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 },
28 {
29 "id": "workspaceDrawer.workspacesSettingsTooltip",
30 "defaultMessage": "!!!Workspaces settings",
31 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
32 "start": {
33 "line": 24,
34 "column": 29
35 },
36 "end": {
37 "line": 27,
38 "column": 3
39 }
40 },
41 {
42 "id": "workspaceDrawer.workspaceFeatureInfo",
43 "defaultMessage": "!!!Info about workspace feature",
44 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
45 "start": {
46 "line": 28,
47 "column": 24
48 },
49 "end": {
50 "line": 31,
51 "column": 3
52 }
53 },
54 {
55 "id": "workspaceDrawer.premiumCtaButtonLabel",
56 "defaultMessage": "!!!Create your first workspace",
57 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
58 "start": {
59 "line": 32,
60 "column": 25
61 },
62 "end": {
63 "line": 35,
64 "column": 3
65 }
66 },
67 {
68 "id": "workspaceDrawer.reactivatePremiumAccountLabel",
69 "defaultMessage": "!!!Reactivate premium account",
70 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
71 "start": {
72 "line": 36,
73 "column": 28
74 },
75 "end": {
76 "line": 39,
77 "column": 3
78 }
79 },
80 {
81 "id": "workspaceDrawer.addNewWorkspaceLabel",
82 "defaultMessage": "!!!add new workspace",
83 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
84 "start": {
85 "line": 40,
86 "column": 24
87 },
88 "end": {
89 "line": 43,
90 "column": 3
91 }
92 },
93 {
94 "id": "workspaceDrawer.proFeatureBadge",
95 "defaultMessage": "!!!Premium feature",
96 "file": "src/features/workspaces/components/WorkspaceDrawer.js",
97 "start": {
98 "line": 44,
99 "column": 23
100 },
101 "end": {
102 "line": 47,
103 "column": 3
104 }
105 }
106] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json
new file mode 100644
index 000000000..4ff190606
--- /dev/null
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "workspaceDrawer.item.noServicesAddedYet",
4 "defaultMessage": "!!!No services added yet",
5 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js",
6 "start": {
7 "line": 12,
8 "column": 22
9 },
10 "end": {
11 "line": 15,
12 "column": 3
13 }
14 },
15 {
16 "id": "workspaceDrawer.item.contextMenuEdit",
17 "defaultMessage": "!!!edit",
18 "file": "src/features/workspaces/components/WorkspaceDrawerItem.js",
19 "start": {
20 "line": 16,
21 "column": 19
22 },
23 "end": {
24 "line": 19,
25 "column": 3
26 }
27 }
28] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json
new file mode 100644
index 000000000..4f3e6d55c
--- /dev/null
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "workspaces.switchingIndicator.switchingTo",
4 "defaultMessage": "!!!Switching to",
5 "file": "src/features/workspaces/components/WorkspaceSwitchingIndicator.js",
6 "start": {
7 "line": 12,
8 "column": 15
9 },
10 "end": {
11 "line": 15,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
new file mode 100644
index 000000000..ef8f1bebc
--- /dev/null
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
@@ -0,0 +1,106 @@
1[
2 {
3 "id": "settings.workspaces.headline",
4 "defaultMessage": "!!!Your workspaces",
5 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
6 "start": {
7 "line": 17,
8 "column": 12
9 },
10 "end": {
11 "line": 20,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.workspaces.noWorkspacesAdded",
17 "defaultMessage": "!!!You haven't added any workspaces yet.",
18 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
19 "start": {
20 "line": 21,
21 "column": 19
22 },
23 "end": {
24 "line": 24,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.workspaces.workspacesRequestFailed",
30 "defaultMessage": "!!!Could not load your workspaces",
31 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
32 "start": {
33 "line": 25,
34 "column": 27
35 },
36 "end": {
37 "line": 28,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.workspaces.tryReloadWorkspaces",
43 "defaultMessage": "!!!Try again",
44 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
45 "start": {
46 "line": 29,
47 "column": 23
48 },
49 "end": {
50 "line": 32,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.workspaces.updatedInfo",
56 "defaultMessage": "!!!Your changes have been saved",
57 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
58 "start": {
59 "line": 33,
60 "column": 15
61 },
62 "end": {
63 "line": 36,
64 "column": 3
65 }
66 },
67 {
68 "id": "settings.workspaces.deletedInfo",
69 "defaultMessage": "!!!Workspace has been deleted",
70 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
71 "start": {
72 "line": 37,
73 "column": 15
74 },
75 "end": {
76 "line": 40,
77 "column": 3
78 }
79 },
80 {
81 "id": "settings.workspaces.workspaceFeatureInfo",
82 "defaultMessage": "!!!Info about workspace feature",
83 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
84 "start": {
85 "line": 41,
86 "column": 24
87 },
88 "end": {
89 "line": 44,
90 "column": 3
91 }
92 },
93 {
94 "id": "settings.workspaces.workspaceFeatureHeadline",
95 "defaultMessage": "!!!Less is More: Introducing Franz Workspaces",
96 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
97 "start": {
98 "line": 45,
99 "column": 28
100 },
101 "end": {
102 "line": 48,
103 "column": 3
104 }
105 }
106] \ No newline at end of file
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index 0db994871..f4cd35582 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Edit", 4 "defaultMessage": "!!!Edit",
5 "file": "src/lib/Menu.js", 5 "file": "src/lib/Menu.js",
6 "start": { 6 "start": {
7 "line": 10, 7 "line": 13,
8 "column": 8 8 "column": 8
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 13, 11 "line": 16,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Undo", 17 "defaultMessage": "!!!Undo",
18 "file": "src/lib/Menu.js", 18 "file": "src/lib/Menu.js",
19 "start": { 19 "start": {
20 "line": 14, 20 "line": 17,
21 "column": 8 21 "column": 8
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 17, 24 "line": 20,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Redo", 30 "defaultMessage": "!!!Redo",
31 "file": "src/lib/Menu.js", 31 "file": "src/lib/Menu.js",
32 "start": { 32 "start": {
33 "line": 18, 33 "line": 21,
34 "column": 8 34 "column": 8
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 21, 37 "line": 24,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Cut", 43 "defaultMessage": "!!!Cut",
44 "file": "src/lib/Menu.js", 44 "file": "src/lib/Menu.js",
45 "start": { 45 "start": {
46 "line": 22, 46 "line": 25,
47 "column": 7 47 "column": 7
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 25, 50 "line": 28,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Copy", 56 "defaultMessage": "!!!Copy",
57 "file": "src/lib/Menu.js", 57 "file": "src/lib/Menu.js",
58 "start": { 58 "start": {
59 "line": 26, 59 "line": 29,
60 "column": 8 60 "column": 8
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 29, 63 "line": 32,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Paste", 69 "defaultMessage": "!!!Paste",
70 "file": "src/lib/Menu.js", 70 "file": "src/lib/Menu.js",
71 "start": { 71 "start": {
72 "line": 30, 72 "line": 33,
73 "column": 9 73 "column": 9
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 33, 76 "line": 36,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Paste And Match Style", 82 "defaultMessage": "!!!Paste And Match Style",
83 "file": "src/lib/Menu.js", 83 "file": "src/lib/Menu.js",
84 "start": { 84 "start": {
85 "line": 34, 85 "line": 37,
86 "column": 22 86 "column": 22
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 37, 89 "line": 40,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Delete", 95 "defaultMessage": "!!!Delete",
96 "file": "src/lib/Menu.js", 96 "file": "src/lib/Menu.js",
97 "start": { 97 "start": {
98 "line": 38, 98 "line": 41,
99 "column": 10 99 "column": 10
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 41, 102 "line": 44,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Select All", 108 "defaultMessage": "!!!Select All",
109 "file": "src/lib/Menu.js", 109 "file": "src/lib/Menu.js",
110 "start": { 110 "start": {
111 "line": 42, 111 "line": 45,
112 "column": 13 112 "column": 13
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 45, 115 "line": 48,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Speech", 121 "defaultMessage": "!!!Speech",
122 "file": "src/lib/Menu.js", 122 "file": "src/lib/Menu.js",
123 "start": { 123 "start": {
124 "line": 46, 124 "line": 49,
125 "column": 10 125 "column": 10
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 49, 128 "line": 52,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Start Speaking", 134 "defaultMessage": "!!!Start Speaking",
135 "file": "src/lib/Menu.js", 135 "file": "src/lib/Menu.js",
136 "start": { 136 "start": {
137 "line": 50, 137 "line": 53,
138 "column": 17 138 "column": 17
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 53, 141 "line": 56,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Stop Speaking", 147 "defaultMessage": "!!!Stop Speaking",
148 "file": "src/lib/Menu.js", 148 "file": "src/lib/Menu.js",
149 "start": { 149 "start": {
150 "line": 54, 150 "line": 57,
151 "column": 16 151 "column": 16
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 57, 154 "line": 60,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Start Dictation", 160 "defaultMessage": "!!!Start Dictation",
161 "file": "src/lib/Menu.js", 161 "file": "src/lib/Menu.js",
162 "start": { 162 "start": {
163 "line": 58, 163 "line": 61,
164 "column": 18 164 "column": 18
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 61, 167 "line": 64,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Emoji & Symbols", 173 "defaultMessage": "!!!Emoji & Symbols",
174 "file": "src/lib/Menu.js", 174 "file": "src/lib/Menu.js",
175 "start": { 175 "start": {
176 "line": 62, 176 "line": 65,
177 "column": 16 177 "column": 16
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 65, 180 "line": 68,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Actual Size", 186 "defaultMessage": "!!!Actual Size",
187 "file": "src/lib/Menu.js", 187 "file": "src/lib/Menu.js",
188 "start": { 188 "start": {
189 "line": 66, 189 "line": 69,
190 "column": 13 190 "column": 13
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 69, 193 "line": 72,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Zoom In", 199 "defaultMessage": "!!!Zoom In",
200 "file": "src/lib/Menu.js", 200 "file": "src/lib/Menu.js",
201 "start": { 201 "start": {
202 "line": 70, 202 "line": 73,
203 "column": 10 203 "column": 10
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 73, 206 "line": 76,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Zoom Out", 212 "defaultMessage": "!!!Zoom Out",
213 "file": "src/lib/Menu.js", 213 "file": "src/lib/Menu.js",
214 "start": { 214 "start": {
215 "line": 74, 215 "line": 77,
216 "column": 11 216 "column": 11
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 77, 219 "line": 80,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Enter Full Screen", 225 "defaultMessage": "!!!Enter Full Screen",
226 "file": "src/lib/Menu.js", 226 "file": "src/lib/Menu.js",
227 "start": { 227 "start": {
228 "line": 78, 228 "line": 81,
229 "column": 19 229 "column": 19
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 81, 232 "line": 84,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Exit Full Screen", 238 "defaultMessage": "!!!Exit Full Screen",
239 "file": "src/lib/Menu.js", 239 "file": "src/lib/Menu.js",
240 "start": { 240 "start": {
241 "line": 82, 241 "line": 85,
242 "column": 18 242 "column": 18
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 85, 245 "line": 88,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Toggle Full Screen", 251 "defaultMessage": "!!!Toggle Full Screen",
252 "file": "src/lib/Menu.js", 252 "file": "src/lib/Menu.js",
253 "start": { 253 "start": {
254 "line": 86, 254 "line": 89,
255 "column": 20 255 "column": 20
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 89, 258 "line": 92,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Toggle Developer Tools", 264 "defaultMessage": "!!!Toggle Developer Tools",
265 "file": "src/lib/Menu.js", 265 "file": "src/lib/Menu.js",
266 "start": { 266 "start": {
267 "line": 90, 267 "line": 93,
268 "column": 18 268 "column": 18
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 93, 271 "line": 96,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Toggle Service Developer Tools", 277 "defaultMessage": "!!!Toggle Service Developer Tools",
278 "file": "src/lib/Menu.js", 278 "file": "src/lib/Menu.js",
279 "start": { 279 "start": {
280 "line": 94, 280 "line": 97,
281 "column": 25 281 "column": 25
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 97, 284 "line": 100,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Reload Service", 290 "defaultMessage": "!!!Reload Service",
291 "file": "src/lib/Menu.js", 291 "file": "src/lib/Menu.js",
292 "start": { 292 "start": {
293 "line": 98, 293 "line": 101,
294 "column": 17 294 "column": 17
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 101, 297 "line": 104,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Reload Franz", 303 "defaultMessage": "!!!Reload Franz",
304 "file": "src/lib/Menu.js", 304 "file": "src/lib/Menu.js",
305 "start": { 305 "start": {
306 "line": 102, 306 "line": 105,
307 "column": 15 307 "column": 15
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 105, 310 "line": 108,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Minimize", 316 "defaultMessage": "!!!Minimize",
317 "file": "src/lib/Menu.js", 317 "file": "src/lib/Menu.js",
318 "start": { 318 "start": {
319 "line": 106, 319 "line": 109,
320 "column": 12 320 "column": 12
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 109, 323 "line": 112,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!Close", 329 "defaultMessage": "!!!Close",
330 "file": "src/lib/Menu.js", 330 "file": "src/lib/Menu.js",
331 "start": { 331 "start": {
332 "line": 110, 332 "line": 113,
333 "column": 9 333 "column": 9
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 113, 336 "line": 116,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!Learn More", 342 "defaultMessage": "!!!Learn More",
343 "file": "src/lib/Menu.js", 343 "file": "src/lib/Menu.js",
344 "start": { 344 "start": {
345 "line": 114, 345 "line": 117,
346 "column": 13 346 "column": 13
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 117, 349 "line": 120,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Changelog", 355 "defaultMessage": "!!!Changelog",
356 "file": "src/lib/Menu.js", 356 "file": "src/lib/Menu.js",
357 "start": { 357 "start": {
358 "line": 118, 358 "line": 121,
359 "column": 13 359 "column": 13
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 121, 362 "line": 124,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!Support", 368 "defaultMessage": "!!!Support",
369 "file": "src/lib/Menu.js", 369 "file": "src/lib/Menu.js",
370 "start": { 370 "start": {
371 "line": 122, 371 "line": 125,
372 "column": 11 372 "column": 11
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 125, 375 "line": 128,
376 "column": 3 376 "column": 3
377 } 377 }
378 }, 378 },
@@ -381,11 +381,11 @@
381 "defaultMessage": "!!!Terms of Service", 381 "defaultMessage": "!!!Terms of Service",
382 "file": "src/lib/Menu.js", 382 "file": "src/lib/Menu.js",
383 "start": { 383 "start": {
384 "line": 126, 384 "line": 129,
385 "column": 7 385 "column": 7
386 }, 386 },
387 "end": { 387 "end": {
388 "line": 129, 388 "line": 132,
389 "column": 3 389 "column": 3
390 } 390 }
391 }, 391 },
@@ -394,11 +394,11 @@
394 "defaultMessage": "!!!Privacy Statement", 394 "defaultMessage": "!!!Privacy Statement",
395 "file": "src/lib/Menu.js", 395 "file": "src/lib/Menu.js",
396 "start": { 396 "start": {
397 "line": 130, 397 "line": 133,
398 "column": 11 398 "column": 11
399 }, 399 },
400 "end": { 400 "end": {
401 "line": 133, 401 "line": 136,
402 "column": 3 402 "column": 3
403 } 403 }
404 }, 404 },
@@ -407,11 +407,11 @@
407 "defaultMessage": "!!!File", 407 "defaultMessage": "!!!File",
408 "file": "src/lib/Menu.js", 408 "file": "src/lib/Menu.js",
409 "start": { 409 "start": {
410 "line": 134, 410 "line": 137,
411 "column": 8 411 "column": 8
412 }, 412 },
413 "end": { 413 "end": {
414 "line": 137, 414 "line": 140,
415 "column": 3 415 "column": 3
416 } 416 }
417 }, 417 },
@@ -420,11 +420,11 @@
420 "defaultMessage": "!!!View", 420 "defaultMessage": "!!!View",
421 "file": "src/lib/Menu.js", 421 "file": "src/lib/Menu.js",
422 "start": { 422 "start": {
423 "line": 138, 423 "line": 141,
424 "column": 8 424 "column": 8
425 }, 425 },
426 "end": { 426 "end": {
427 "line": 141, 427 "line": 144,
428 "column": 3 428 "column": 3
429 } 429 }
430 }, 430 },
@@ -433,11 +433,11 @@
433 "defaultMessage": "!!!Services", 433 "defaultMessage": "!!!Services",
434 "file": "src/lib/Menu.js", 434 "file": "src/lib/Menu.js",
435 "start": { 435 "start": {
436 "line": 142, 436 "line": 145,
437 "column": 12 437 "column": 12
438 }, 438 },
439 "end": { 439 "end": {
440 "line": 145, 440 "line": 148,
441 "column": 3 441 "column": 3
442 } 442 }
443 }, 443 },
@@ -446,11 +446,11 @@
446 "defaultMessage": "!!!Window", 446 "defaultMessage": "!!!Window",
447 "file": "src/lib/Menu.js", 447 "file": "src/lib/Menu.js",
448 "start": { 448 "start": {
449 "line": 146, 449 "line": 149,
450 "column": 10 450 "column": 10
451 }, 451 },
452 "end": { 452 "end": {
453 "line": 149, 453 "line": 152,
454 "column": 3 454 "column": 3
455 } 455 }
456 }, 456 },
@@ -459,11 +459,11 @@
459 "defaultMessage": "!!!Help", 459 "defaultMessage": "!!!Help",
460 "file": "src/lib/Menu.js", 460 "file": "src/lib/Menu.js",
461 "start": { 461 "start": {
462 "line": 150, 462 "line": 153,
463 "column": 8 463 "column": 8
464 }, 464 },
465 "end": { 465 "end": {
466 "line": 153, 466 "line": 156,
467 "column": 3 467 "column": 3
468 } 468 }
469 }, 469 },
@@ -472,11 +472,11 @@
472 "defaultMessage": "!!!About Franz", 472 "defaultMessage": "!!!About Franz",
473 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
474 "start": { 474 "start": {
475 "line": 154, 475 "line": 157,
476 "column": 9 476 "column": 9
477 }, 477 },
478 "end": { 478 "end": {
479 "line": 157, 479 "line": 160,
480 "column": 3 480 "column": 3
481 } 481 }
482 }, 482 },
@@ -485,11 +485,11 @@
485 "defaultMessage": "!!!What's new in Franz?", 485 "defaultMessage": "!!!What's new in Franz?",
486 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
487 "start": { 487 "start": {
488 "line": 158, 488 "line": 161,
489 "column": 16 489 "column": 16
490 }, 490 },
491 "end": { 491 "end": {
492 "line": 161, 492 "line": 164,
493 "column": 3 493 "column": 3
494 } 494 }
495 }, 495 },
@@ -498,11 +498,11 @@
498 "defaultMessage": "!!!Settings", 498 "defaultMessage": "!!!Settings",
499 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
500 "start": { 500 "start": {
501 "line": 162, 501 "line": 165,
502 "column": 12 502 "column": 12
503 }, 503 },
504 "end": { 504 "end": {
505 "line": 165, 505 "line": 168,
506 "column": 3 506 "column": 3
507 } 507 }
508 }, 508 },
@@ -511,11 +511,11 @@
511 "defaultMessage": "!!!Hide", 511 "defaultMessage": "!!!Hide",
512 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
513 "start": { 513 "start": {
514 "line": 166, 514 "line": 169,
515 "column": 8 515 "column": 8
516 }, 516 },
517 "end": { 517 "end": {
518 "line": 169, 518 "line": 172,
519 "column": 3 519 "column": 3
520 } 520 }
521 }, 521 },
@@ -524,11 +524,11 @@
524 "defaultMessage": "!!!Hide Others", 524 "defaultMessage": "!!!Hide Others",
525 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
526 "start": { 526 "start": {
527 "line": 170, 527 "line": 173,
528 "column": 14 528 "column": 14
529 }, 529 },
530 "end": { 530 "end": {
531 "line": 173, 531 "line": 176,
532 "column": 3 532 "column": 3
533 } 533 }
534 }, 534 },
@@ -537,11 +537,11 @@
537 "defaultMessage": "!!!Unhide", 537 "defaultMessage": "!!!Unhide",
538 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
539 "start": { 539 "start": {
540 "line": 174, 540 "line": 177,
541 "column": 10 541 "column": 10
542 }, 542 },
543 "end": { 543 "end": {
544 "line": 177, 544 "line": 180,
545 "column": 3 545 "column": 3
546 } 546 }
547 }, 547 },
@@ -550,11 +550,11 @@
550 "defaultMessage": "!!!Quit", 550 "defaultMessage": "!!!Quit",
551 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
552 "start": { 552 "start": {
553 "line": 178, 553 "line": 181,
554 "column": 8 554 "column": 8
555 }, 555 },
556 "end": { 556 "end": {
557 "line": 181, 557 "line": 184,
558 "column": 3 558 "column": 3
559 } 559 }
560 }, 560 },
@@ -563,11 +563,50 @@
563 "defaultMessage": "!!!Add New Service...", 563 "defaultMessage": "!!!Add New Service...",
564 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
565 "start": { 565 "start": {
566 "line": 182, 566 "line": 185,
567 "column": 17 567 "column": 17
568 }, 568 },
569 "end": { 569 "end": {
570 "line": 185, 570 "line": 188,
571 "column": 3
572 }
573 },
574 {
575 "id": "menu.workspaces.addNewWorkspace",
576 "defaultMessage": "!!!Add New Workspace...",
577 "file": "src/lib/Menu.js",
578 "start": {
579 "line": 189,
580 "column": 19
581 },
582 "end": {
583 "line": 192,
584 "column": 3
585 }
586 },
587 {
588 "id": "menu.workspaces.openWorkspaceDrawer",
589 "defaultMessage": "!!!Open workspace drawer",
590 "file": "src/lib/Menu.js",
591 "start": {
592 "line": 193,
593 "column": 23
594 },
595 "end": {
596 "line": 196,
597 "column": 3
598 }
599 },
600 {
601 "id": "menu.workspaces.closeWorkspaceDrawer",
602 "defaultMessage": "!!!Close workspace drawer",
603 "file": "src/lib/Menu.js",
604 "start": {
605 "line": 197,
606 "column": 24
607 },
608 "end": {
609 "line": 200,
571 "column": 3 610 "column": 3
572 } 611 }
573 }, 612 },
@@ -576,11 +615,11 @@
576 "defaultMessage": "!!!Activate next service...", 615 "defaultMessage": "!!!Activate next service...",
577 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
578 "start": { 617 "start": {
579 "line": 186, 618 "line": 201,
580 "column": 23 619 "column": 23
581 }, 620 },
582 "end": { 621 "end": {
583 "line": 189, 622 "line": 204,
584 "column": 3 623 "column": 3
585 } 624 }
586 }, 625 },
@@ -589,11 +628,11 @@
589 "defaultMessage": "!!!Activate previous service...", 628 "defaultMessage": "!!!Activate previous service...",
590 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
591 "start": { 630 "start": {
592 "line": 190, 631 "line": 205,
593 "column": 27 632 "column": 27
594 }, 633 },
595 "end": { 634 "end": {
596 "line": 193, 635 "line": 208,
597 "column": 3 636 "column": 3
598 } 637 }
599 }, 638 },
@@ -602,11 +641,11 @@
602 "defaultMessage": "!!!Disable notifications & audio", 641 "defaultMessage": "!!!Disable notifications & audio",
603 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
604 "start": { 643 "start": {
605 "line": 194, 644 "line": 209,
606 "column": 11 645 "column": 11
607 }, 646 },
608 "end": { 647 "end": {
609 "line": 197, 648 "line": 212,
610 "column": 3 649 "column": 3
611 } 650 }
612 }, 651 },
@@ -615,11 +654,37 @@
615 "defaultMessage": "!!!Enable notifications & audio", 654 "defaultMessage": "!!!Enable notifications & audio",
616 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
617 "start": { 656 "start": {
618 "line": 198, 657 "line": 213,
619 "column": 13 658 "column": 13
620 }, 659 },
621 "end": { 660 "end": {
622 "line": 201, 661 "line": 216,
662 "column": 3
663 }
664 },
665 {
666 "id": "menu.workspaces",
667 "defaultMessage": "!!!Workspaces",
668 "file": "src/lib/Menu.js",
669 "start": {
670 "line": 217,
671 "column": 14
672 },
673 "end": {
674 "line": 220,
675 "column": 3
676 }
677 },
678 {
679 "id": "menu.workspaces.defaultWorkspace",
680 "defaultMessage": "!!!Default",
681 "file": "src/lib/Menu.js",
682 "start": {
683 "line": 221,
684 "column": 20
685 },
686 "end": {
687 "line": 224,
623 "column": 3 688 "column": 3
624 } 689 }
625 } 690 }
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index 70f3b2877..46a347237 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -3,6 +3,9 @@ import { 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';
6import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../features/workspaces/index';
7import { workspaceActions } from '../features/workspaces/actions';
8import { gaEvent } from './analytics';
6 9
7const { app, Menu, dialog } = remote; 10const { app, Menu, dialog } = remote;
8 11
@@ -183,6 +186,18 @@ const menuItems = defineMessages({
183 id: 'menu.services.addNewService', 186 id: 'menu.services.addNewService',
184 defaultMessage: '!!!Add New Service...', 187 defaultMessage: '!!!Add New Service...',
185 }, 188 },
189 addNewWorkspace: {
190 id: 'menu.workspaces.addNewWorkspace',
191 defaultMessage: '!!!Add New Workspace...',
192 },
193 openWorkspaceDrawer: {
194 id: 'menu.workspaces.openWorkspaceDrawer',
195 defaultMessage: '!!!Open workspace drawer',
196 },
197 closeWorkspaceDrawer: {
198 id: 'menu.workspaces.closeWorkspaceDrawer',
199 defaultMessage: '!!!Close workspace drawer',
200 },
186 activateNextService: { 201 activateNextService: {
187 id: 'menu.services.setNextServiceActive', 202 id: 'menu.services.setNextServiceActive',
188 defaultMessage: '!!!Activate next service...', 203 defaultMessage: '!!!Activate next service...',
@@ -199,6 +214,14 @@ const menuItems = defineMessages({
199 id: 'sidebar.unmuteApp', 214 id: 'sidebar.unmuteApp',
200 defaultMessage: '!!!Enable notifications & audio', 215 defaultMessage: '!!!Enable notifications & audio',
201 }, 216 },
217 workspaces: {
218 id: 'menu.workspaces',
219 defaultMessage: '!!!Workspaces',
220 },
221 defaultWorkspace: {
222 id: 'menu.workspaces.defaultWorkspace',
223 defaultMessage: '!!!Default',
224 },
202}); 225});
203 226
204function getActiveWebview() { 227function getActiveWebview() {
@@ -302,6 +325,11 @@ const _templateFactory = intl => [
302 submenu: [], 325 submenu: [],
303 }, 326 },
304 { 327 {
328 label: intl.formatMessage(menuItems.workspaces),
329 submenu: [],
330 visible: workspaceStore.isFeatureEnabled,
331 },
332 {
305 label: intl.formatMessage(menuItems.window), 333 label: intl.formatMessage(menuItems.window),
306 role: 'window', 334 role: 'window',
307 submenu: [ 335 submenu: [
@@ -679,7 +707,7 @@ export default class FranzMenu {
679 }, 707 },
680 ); 708 );
681 709
682 tpl[4].submenu.unshift(about, { 710 tpl[5].submenu.unshift(about, {
683 type: 'separator', 711 type: 'separator',
684 }); 712 });
685 } else { 713 } else {
@@ -714,6 +742,10 @@ export default class FranzMenu {
714 tpl[3].submenu = serviceTpl; 742 tpl[3].submenu = serviceTpl;
715 } 743 }
716 744
745 if (workspaceStore.isFeatureEnabled) {
746 tpl[4].submenu = this.workspacesMenu();
747 }
748
717 this.currentTemplate = tpl; 749 this.currentTemplate = tpl;
718 const menu = Menu.buildFromTemplate(tpl); 750 const menu = Menu.buildFromTemplate(tpl);
719 Menu.setApplicationMenu(menu); 751 Menu.setApplicationMenu(menu);
@@ -764,6 +796,66 @@ export default class FranzMenu {
764 return menu; 796 return menu;
765 } 797 }
766 798
799 workspacesMenu() {
800 const { workspaces, activeWorkspace, isWorkspaceDrawerOpen } = workspaceStore;
801 const { intl } = window.franz;
802 const menu = [];
803
804 // Add new workspace item:
805 menu.push({
806 label: intl.formatMessage(menuItems.addNewWorkspace),
807 accelerator: `${cmdKey}+Shift+N`,
808 click: () => {
809 workspaceActions.openWorkspaceSettings();
810 },
811 enabled: this.stores.user.isLoggedIn,
812 });
813
814 // Open workspace drawer:
815 const drawerLabel = (
816 isWorkspaceDrawerOpen ? menuItems.closeWorkspaceDrawer : menuItems.openWorkspaceDrawer
817 );
818 menu.push({
819 label: intl.formatMessage(drawerLabel),
820 accelerator: `${cmdKey}+D`,
821 click: () => {
822 workspaceActions.toggleWorkspaceDrawer();
823 gaEvent(GA_CATEGORY_WORKSPACES, 'toggleDrawer', 'menu');
824 },
825 enabled: this.stores.user.isLoggedIn,
826 }, {
827 type: 'separator',
828 });
829
830 // Default workspace
831 menu.push({
832 label: intl.formatMessage(menuItems.defaultWorkspace),
833 accelerator: `${cmdKey}+Alt+0`,
834 type: 'radio',
835 checked: !activeWorkspace,
836 click: () => {
837 workspaceActions.deactivate();
838 gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'menu');
839 },
840 });
841
842 // Workspace items
843 if (this.stores.user.isPremium) {
844 workspaces.forEach((workspace, i) => menu.push({
845 label: workspace.name,
846 accelerator: i < 9 ? `${cmdKey}+Alt+${i + 1}` : null,
847 type: 'radio',
848 checked: activeWorkspace ? workspace.id === activeWorkspace.id : false,
849 click: () => {
850 workspaceActions.activate({ workspace });
851 gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'menu');
852 },
853 }));
854 }
855
856 return menu;
857 }
858
767 _getServiceName(service) { 859 _getServiceName(service) {
768 if (service.name) { 860 if (service.name) {
769 return service.name; 861 return service.name;
diff --git a/src/lib/analytics.js b/src/lib/analytics.js
index 0519192d1..e7daa9d06 100644
--- a/src/lib/analytics.js
+++ b/src/lib/analytics.js
@@ -28,12 +28,10 @@ ga('send', 'App');
28 28
29export function gaPage(page) { 29export function gaPage(page) {
30 ga('send', 'pageview', page); 30 ga('send', 'pageview', page);
31
32 debug('GA track page', page); 31 debug('GA track page', page);
33} 32}
34 33
35export function gaEvent(category, action, label) { 34export function gaEvent(category, action, label) {
36 ga('send', 'event', category, action, label); 35 ga('send', 'event', category, action, label);
37 36 debug('GA track event', category, action, label);
38 debug('GA track event', category, action);
39} 37}
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index 1c9044b07..dcda021c1 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -1,4 +1,9 @@
1import { computed, observable, reaction } from 'mobx'; 1import {
2 computed,
3 observable,
4 reaction,
5 runInAction,
6} from 'mobx';
2 7
3import Store from './lib/Store'; 8import Store from './lib/Store';
4import CachedRequest from './lib/CachedRequest'; 9import CachedRequest from './lib/CachedRequest';
@@ -7,6 +12,7 @@ import delayApp from '../features/delayApp';
7import spellchecker from '../features/spellchecker'; 12import spellchecker from '../features/spellchecker';
8import serviceProxy from '../features/serviceProxy'; 13import serviceProxy from '../features/serviceProxy';
9import basicAuth from '../features/basicAuth'; 14import basicAuth from '../features/basicAuth';
15import workspaces from '../features/workspaces';
10import shareFranz from '../features/shareFranz'; 16import shareFranz from '../features/shareFranz';
11import announcements from '../features/announcements'; 17import announcements from '../features/announcements';
12 18
@@ -17,13 +23,16 @@ export default class FeaturesStore extends Store {
17 23
18 @observable featuresRequest = new CachedRequest(this.api.features, 'features'); 24 @observable featuresRequest = new CachedRequest(this.api.features, 'features');
19 25
26 @observable features = Object.assign({}, DEFAULT_FEATURES_CONFIG);
27
20 async setup() { 28 async setup() {
21 this.registerReactions([ 29 this.registerReactions([
30 this._updateFeatures,
22 this._monitorLoginStatus.bind(this), 31 this._monitorLoginStatus.bind(this),
23 ]); 32 ]);
24 33
25 await this.featuresRequest._promise; 34 await this.featuresRequest._promise;
26 setTimeout(this._enableFeatures.bind(this), 1); 35 setTimeout(this._setupFeatures.bind(this), 1);
27 36
28 // single key reaction 37 // single key reaction
29 reaction(() => this.stores.user.data.isPremium, () => { 38 reaction(() => this.stores.user.data.isPremium, () => {
@@ -37,13 +46,16 @@ export default class FeaturesStore extends Store {
37 return this.defaultFeaturesRequest.execute().result || DEFAULT_FEATURES_CONFIG; 46 return this.defaultFeaturesRequest.execute().result || DEFAULT_FEATURES_CONFIG;
38 } 47 }
39 48
40 @computed get features() { 49 _updateFeatures = () => {
50 const features = Object.assign({}, DEFAULT_FEATURES_CONFIG);
41 if (this.stores.user.isLoggedIn) { 51 if (this.stores.user.isLoggedIn) {
42 return this.featuresRequest.execute().result || DEFAULT_FEATURES_CONFIG; 52 const requestResult = this.featuresRequest.execute().result;
53 Object.assign(features, requestResult);
43 } 54 }
44 55 runInAction('FeaturesStore::_updateFeatures', () => {
45 return DEFAULT_FEATURES_CONFIG; 56 this.features = features;
46 } 57 });
58 };
47 59
48 _monitorLoginStatus() { 60 _monitorLoginStatus() {
49 if (this.stores.user.isLoggedIn) { 61 if (this.stores.user.isLoggedIn) {
@@ -53,11 +65,12 @@ export default class FeaturesStore extends Store {
53 } 65 }
54 } 66 }
55 67
56 _enableFeatures() { 68 _setupFeatures() {
57 delayApp(this.stores, this.actions); 69 delayApp(this.stores, this.actions);
58 spellchecker(this.stores, this.actions); 70 spellchecker(this.stores, this.actions);
59 serviceProxy(this.stores, this.actions); 71 serviceProxy(this.stores, this.actions);
60 basicAuth(this.stores, this.actions); 72 basicAuth(this.stores, this.actions);
73 workspaces(this.stores, this.actions);
61 shareFranz(this.stores, this.actions); 74 shareFranz(this.stores, this.actions);
62 announcements(this.stores, this.actions); 75 announcements(this.stores, this.actions);
63 } 76 }
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 88b0331bf..d04fdd0c5 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -12,6 +12,7 @@ import Request from './lib/Request';
12import CachedRequest from './lib/CachedRequest'; 12import CachedRequest from './lib/CachedRequest';
13import { matchRoute } from '../helpers/routing-helpers'; 13import { matchRoute } from '../helpers/routing-helpers';
14import { gaEvent } from '../lib/analytics'; 14import { gaEvent } from '../lib/analytics';
15import { workspaceStore } from '../features/workspaces';
15 16
16const debug = require('debug')('Franz:ServiceStore'); 17const debug = require('debug')('Franz:ServiceStore');
17 18
@@ -100,7 +101,6 @@ export default class ServicesStore extends Store {
100 return observable(services.slice().slice().sort((a, b) => a.order - b.order)); 101 return observable(services.slice().slice().sort((a, b) => a.order - b.order));
101 } 102 }
102 } 103 }
103
104 return []; 104 return [];
105 } 105 }
106 106
@@ -109,13 +109,16 @@ export default class ServicesStore extends Store {
109 } 109 }
110 110
111 @computed get allDisplayed() { 111 @computed get allDisplayed() {
112 return this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled; 112 const services = this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled;
113 return workspaceStore.filterServicesByActiveWorkspace(services);
113 } 114 }
114 115
115 // This is just used to avoid unnecessary rerendering of resource-heavy webviews 116 // This is just used to avoid unnecessary rerendering of resource-heavy webviews
116 @computed get allDisplayedUnordered() { 117 @computed get allDisplayedUnordered() {
118 const { showDisabledServices } = this.stores.settings.all.app;
117 const services = this.allServicesRequest.execute().result || []; 119 const services = this.allServicesRequest.execute().result || [];
118 return this.stores.settings.all.app.showDisabledServices ? services : services.filter(service => service.isEnabled); 120 const filteredServices = showDisabledServices ? services : services.filter(service => service.isEnabled);
121 return workspaceStore.filterServicesByActiveWorkspace(filteredServices);
119 } 122 }
120 123
121 @computed get filtered() { 124 @computed get filtered() {
diff --git a/src/stores/UIStore.js b/src/stores/UIStore.js
index bb7965a4a..a95a8e1e0 100644
--- a/src/stores/UIStore.js
+++ b/src/stores/UIStore.js
@@ -21,11 +21,12 @@ export default class UIStore extends Store {
21 return (settings.app.isAppMuted && settings.app.showMessageBadgeWhenMuted) || !settings.isAppMuted; 21 return (settings.app.isAppMuted && settings.app.showMessageBadgeWhenMuted) || !settings.isAppMuted;
22 } 22 }
23 23
24 @computed get theme() { 24 @computed get isDarkThemeActive() {
25 if (this.stores.settings.all.app.darkMode) { 25 return this.stores.settings.all.app.darkMode;
26 return theme('dark'); 26 }
27 }
28 27
28 @computed get theme() {
29 if (this.isDarkThemeActive) return theme('dark');
29 return theme('default'); 30 return theme('default');
30 } 31 }
31 32
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index 77d84afe1..534690fbb 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -142,6 +142,10 @@ export default class UserStore extends Store {
142 return this.getUserInfoRequest.execute().result || {}; 142 return this.getUserInfoRequest.execute().result || {};
143 } 143 }
144 144
145 @computed get isPremium() {
146 return !!this.data.isPremium;
147 }
148
145 @computed get legacyServices() { 149 @computed get legacyServices() {
146 return this.getLegacyServicesRequest.execute() || {}; 150 return this.getLegacyServicesRequest.execute() || {};
147 } 151 }
diff --git a/src/stores/lib/Request.js b/src/stores/lib/Request.js
index 04f528156..486de8a49 100644
--- a/src/stores/lib/Request.js
+++ b/src/stores/lib/Request.js
@@ -85,6 +85,8 @@ export default class Request {
85 return this.execute(...this._currentApiCall.args); 85 return this.execute(...this._currentApiCall.args);
86 } 86 }
87 87
88 retry = () => this.reload();
89
88 isExecutingWithArgs(...args) { 90 isExecutingWithArgs(...args) {
89 return this.isExecuting && this._currentApiCall && isEqual(this._currentApiCall.args, args); 91 return this.isExecuting && this._currentApiCall && isEqual(this._currentApiCall.args, args);
90 } 92 }
@@ -107,7 +109,7 @@ export default class Request {
107 Request._hooks.forEach(hook => hook(this)); 109 Request._hooks.forEach(hook => hook(this));
108 } 110 }
109 111
110 reset() { 112 reset = () => {
111 this.result = null; 113 this.result = null;
112 this.isExecuting = false; 114 this.isExecuting = false;
113 this.isError = false; 115 this.isError = false;
@@ -116,5 +118,5 @@ export default class Request {
116 this._promise = Promise; 118 this._promise = Promise;
117 119
118 return this; 120 return this;
119 } 121 };
120} 122}
diff --git a/src/styles/auth.scss b/src/styles/auth.scss
index 817801982..0a075036a 100644
--- a/src/styles/auth.scss
+++ b/src/styles/auth.scss
@@ -107,7 +107,7 @@
107 &__scroll-container { 107 &__scroll-container {
108 max-height: 100vh; 108 max-height: 100vh;
109 padding: 80px 0; 109 padding: 80px 0;
110 overflow: scroll; 110 overflow: auto;
111 width: 100%; 111 width: 100%;
112 } 112 }
113 113
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index 9a003a922..e858b7904 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -18,8 +18,14 @@ html { overflow: hidden; }
18 font-size: 22px; 18 font-size: 22px;
19 19
20 &:hover, 20 &:hover,
21 &:active { color: $dark-theme-gray-smoke; } 21 &:active {
22 &.is-muted { color: $theme-brand-primary; } 22 color: $dark-theme-gray-smoke;
23 }
24
25 &.is-muted,
26 &.is-active {
27 color: $theme-brand-primary;
28 }
23 } 29 }
24 } 30 }
25 31
@@ -33,6 +39,7 @@ html { overflow: hidden; }
33 .app__content { display: flex; } 39 .app__content { display: flex; }
34 40
35 .app__service { 41 .app__service {
42 position: relative;
36 display: flex; 43 display: flex;
37 flex: 1; 44 flex: 1;
38 flex-direction: column; 45 flex-direction: column;
@@ -84,7 +91,7 @@ html { overflow: hidden; }
84 91
85 &:hover, 92 &:hover,
86 &:active { color: lighten($theme-gray-light, 10%); } 93 &:active { color: lighten($theme-gray-light, 10%); }
87 &.is-muted { color: $theme-brand-primary; } 94 &.is-muted, &.is-active { color: $theme-brand-primary; }
88 &--new-service { padding-bottom: 6px; } 95 &--new-service { padding-bottom: 6px; }
89 } 96 }
90 97
diff --git a/src/styles/settings.scss b/src/styles/settings.scss
index 750b6bedd..dd6f56d2b 100644
--- a/src/styles/settings.scss
+++ b/src/styles/settings.scss
@@ -68,7 +68,7 @@
68 } 68 }
69 } 69 }
70 70
71 .premium-info { 71 .premium-info {
72 background: $dark-theme-gray-darker; 72 background: $dark-theme-gray-darker;
73 border: 2px solid $theme-brand-primary; 73 border: 2px solid $theme-brand-primary;
74 } 74 }
@@ -414,6 +414,7 @@
414 414
415 .settings-navigation__link { 415 .settings-navigation__link {
416 align-items: center; 416 align-items: center;
417 justify-content: space-between;
417 color: $theme-text-color; 418 color: $theme-text-color;
418 display: flex; 419 display: flex;
419 flex-shrink: 0; 420 flex-shrink: 0;
@@ -425,7 +426,9 @@
425 &:hover { 426 &:hover {
426 background: darken($theme-gray-lightest, 5%); 427 background: darken($theme-gray-lightest, 5%);
427 428
428 .badge { background: #FFF; } 429 .badge {
430 background: #FFF;
431 }
429 } 432 }
430 433
431 &.is-active { 434 &.is-active {
@@ -442,8 +445,8 @@
442 .settings-navigation__expander { flex: 1; } 445 .settings-navigation__expander { flex: 1; }
443 446
444 .badge { 447 .badge {
448
445 display: initial; 449 display: initial;
446 margin-left: 5px;
447 transition: background $theme-transition-time, color $theme-transition-time; 450 transition: background $theme-transition-time, color $theme-transition-time;
448 } 451 }
449 452