aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar Stefan Malzner <stefan@adlk.io>2018-12-02 15:08:07 +0100
committerLibravatar Stefan Malzner <stefan@adlk.io>2018-12-02 15:08:07 +0100
commita5aa5e1380a0847eb33be3315d164fb9e0e23255 (patch)
treea1ea4b0f635cabb54d9cf028809d2f079727b9a1 /src
parentAdd instruction to install Franz with homebrew (#1134) (diff)
parentMerge branch 'develop' into release/5.0.0-beta.19 (diff)
downloadferdium-app-a5aa5e1380a0847eb33be3315d164fb9e0e23255.tar.gz
ferdium-app-a5aa5e1380a0847eb33be3315d164fb9e0e23255.tar.zst
ferdium-app-a5aa5e1380a0847eb33be3315d164fb9e0e23255.zip
Merge branch 'release/5.0.0-beta.19'
Diffstat (limited to 'src')
-rw-r--r--src/I18n.js3
-rw-r--r--src/api/FeaturesApi.js13
-rw-r--r--src/api/LocalApi.js8
-rw-r--r--src/api/RecipesApi.js2
-rw-r--r--src/api/index.js2
-rw-r--r--src/api/server/LocalApi.js21
-rw-r--r--src/api/server/ServerApi.js33
-rw-r--r--src/app.js2
-rw-r--r--src/components/auth/AuthLayout.js97
-rw-r--r--src/components/auth/Import.js3
-rw-r--r--src/components/auth/Invite.js3
-rw-r--r--src/components/auth/Login.js3
-rw-r--r--src/components/auth/Password.js3
-rw-r--r--src/components/auth/Pricing.js3
-rw-r--r--src/components/auth/Signup.js7
-rw-r--r--src/components/auth/Welcome.js3
-rw-r--r--src/components/layout/AppLayout.js11
-rw-r--r--src/components/layout/Sidebar.js3
-rw-r--r--src/components/services/content/ServiceDisabled.js3
-rw-r--r--src/components/services/content/ServiceWebview.js3
-rw-r--r--src/components/services/content/Services.js3
-rw-r--r--src/components/services/content/WebviewCrashHandler.js3
-rw-r--r--src/components/services/tabs/TabItem.js6
-rw-r--r--src/components/services/tabs/Tabbar.js3
-rw-r--r--src/components/settings/SettingsLayout.js3
-rw-r--r--src/components/settings/account/AccountDashboard.js81
-rw-r--r--src/components/settings/navigation/SettingsNavigation.js4
-rw-r--r--src/components/settings/recipes/RecipeItem.js3
-rw-r--r--src/components/settings/recipes/RecipesDashboard.js3
-rw-r--r--src/components/settings/services/EditServiceForm.js50
-rw-r--r--src/components/settings/services/ServiceError.js3
-rw-r--r--src/components/settings/services/ServiceItem.js3
-rw-r--r--src/components/settings/services/ServicesDashboard.js3
-rw-r--r--src/components/settings/settings/EditSettingsForm.js21
-rw-r--r--src/components/settings/user/EditUserForm.js11
-rw-r--r--src/components/subscription/SubscriptionForm.js38
-rw-r--r--src/components/subscription/SubscriptionPopup.js3
-rw-r--r--src/components/ui/Button.js3
-rw-r--r--src/components/ui/ImageUpload.js4
-rw-r--r--src/components/ui/InfoBar.js3
-rw-r--r--src/components/ui/Infobox.js3
-rw-r--r--src/components/ui/Input.js4
-rw-r--r--src/components/ui/Link.js4
-rw-r--r--src/components/ui/PremiumFeatureContainer/index.js76
-rw-r--r--src/components/ui/PremiumFeatureContainer/styles.js31
-rw-r--r--src/components/ui/Radio.js3
-rw-r--r--src/components/ui/SearchInput.js3
-rw-r--r--src/components/ui/Select.js3
-rw-r--r--src/components/ui/StatusBarTargetUrl.js3
-rw-r--r--src/components/ui/Tabs/Tabs.js3
-rw-r--r--src/components/ui/Toggle.js9
-rw-r--r--src/config.js29
-rw-r--r--src/containers/auth/AuthLayoutContainer.js25
-rw-r--r--src/containers/auth/ImportScreen.js3
-rw-r--r--src/containers/auth/InviteScreen.js3
-rw-r--r--src/containers/auth/LoginScreen.js3
-rw-r--r--src/containers/auth/PasswordScreen.js3
-rw-r--r--src/containers/auth/PricingScreen.js3
-rw-r--r--src/containers/auth/SignupScreen.js3
-rw-r--r--src/containers/auth/WelcomeScreen.js3
-rw-r--r--src/containers/layout/AppLayoutContainer.js57
-rw-r--r--src/containers/settings/AccountScreen.js3
-rw-r--r--src/containers/settings/EditServiceScreen.js77
-rw-r--r--src/containers/settings/EditSettingsScreen.js40
-rw-r--r--src/containers/settings/EditUserScreen.js4
-rw-r--r--src/containers/settings/InviteScreen.js3
-rw-r--r--src/containers/settings/RecipesScreen.js3
-rw-r--r--src/containers/settings/ServicesScreen.js3
-rw-r--r--src/containers/settings/SettingsWindow.js3
-rw-r--r--src/containers/subscription/SubscriptionFormScreen.js4
-rw-r--r--src/containers/subscription/SubscriptionPopupScreen.js3
-rw-r--r--src/electron/Settings.js30
-rw-r--r--src/electron/ipc-api/appIndicator.js2
-rw-r--r--src/electron/ipc-api/autoUpdate.js20
-rw-r--r--src/electron/ipc-api/download.js43
-rw-r--r--src/electron/ipc-api/index.js2
-rw-r--r--src/electron/ipc-api/settings.js10
-rw-r--r--src/features/delayApp/Component.js88
-rw-r--r--src/features/delayApp/index.js70
-rw-r--r--src/features/delayApp/styles.js23
-rw-r--r--src/features/serviceProxy/index.js45
-rw-r--r--src/features/spellchecker/index.js27
-rw-r--r--src/helpers/i18n-helpers.js27
-rw-r--r--src/helpers/visibility-helper.js27
-rw-r--r--src/i18n/languages.js80
-rw-r--r--src/i18n/locales/ca.json35
-rw-r--r--src/i18n/locales/cs.json25
-rw-r--r--src/i18n/locales/de.json73
-rw-r--r--src/i18n/locales/el.json123
-rw-r--r--src/i18n/locales/en-US.json21
-rw-r--r--src/i18n/locales/es.json59
-rw-r--r--src/i18n/locales/fr.json35
-rw-r--r--src/i18n/locales/ga.json19
-rw-r--r--src/i18n/locales/hr.json23
-rw-r--r--src/i18n/locales/hu.json117
-rw-r--r--src/i18n/locales/id.json139
-rw-r--r--src/i18n/locales/it.json109
-rw-r--r--src/i18n/locales/ja.json33
-rw-r--r--src/i18n/locales/ka.json45
-rw-r--r--src/i18n/locales/nl-BE.json129
-rw-r--r--src/i18n/locales/nl.json53
-rw-r--r--src/i18n/locales/pl.json49
-rw-r--r--src/i18n/locales/pt-BR.json109
-rw-r--r--src/i18n/locales/pt.json181
-rw-r--r--src/i18n/locales/ru.json125
-rw-r--r--src/i18n/locales/sk.json263
-rw-r--r--src/i18n/locales/sr.json169
-rw-r--r--src/i18n/locales/tr.json27
-rw-r--r--src/i18n/locales/uk.json127
-rw-r--r--src/i18n/locales/zh-TW.json105
-rw-r--r--src/index.js49
-rw-r--r--src/lib/Menu.js15
-rw-r--r--src/lib/analytics.js2
-rw-r--r--src/models/News.js8
-rw-r--r--src/models/Plan.js4
-rw-r--r--src/models/Recipe.js6
-rw-r--r--src/models/RecipePreview.js8
-rw-r--r--src/models/Service.js7
-rw-r--r--src/models/Settings.js33
-rw-r--r--src/stores/AppStore.js53
-rw-r--r--src/stores/DictionaryStore.js45
-rw-r--r--src/stores/FeaturesStore.js50
-rw-r--r--src/stores/RecipesStore.js2
-rw-r--r--src/stores/RequestStore.js2
-rw-r--r--src/stores/ServicesStore.js41
-rw-r--r--src/stores/SettingsStore.js116
-rw-r--r--src/stores/UIStore.js12
-rw-r--r--src/stores/UserStore.js10
-rw-r--r--src/stores/index.js4
-rw-r--r--src/styles/animations.scss54
-rw-r--r--src/styles/auth.scss121
-rw-r--r--src/styles/badge.scss25
-rw-r--r--src/styles/button.scss97
-rw-r--r--src/styles/colors.scss50
-rw-r--r--src/styles/content-tabs.scss34
-rw-r--r--src/styles/image-upload.scss93
-rw-r--r--src/styles/info-bar.scss49
-rw-r--r--src/styles/infobox.scss34
-rw-r--r--src/styles/input.scss95
-rw-r--r--src/styles/invite.scss11
-rw-r--r--src/styles/layout.scss162
-rw-r--r--src/styles/mixins.scss2
-rw-r--r--src/styles/radio.scss35
-rw-r--r--src/styles/recipes.scss56
-rw-r--r--src/styles/reset.scss67
-rw-r--r--src/styles/searchInput.scss30
-rw-r--r--src/styles/select.scss30
-rw-r--r--src/styles/service-table.scss39
-rw-r--r--src/styles/services.scss60
-rw-r--r--src/styles/settings.scss357
-rw-r--r--src/styles/status-bar-target-url.scss14
-rw-r--r--src/styles/subscription-popup.scss13
-rw-r--r--src/styles/subscription.scss56
-rw-r--r--src/styles/tabs.scss98
-rw-r--r--src/styles/title-bar.scss77
-rw-r--r--src/styles/toggle.scss72
-rw-r--r--src/styles/tooltip.scss2
-rw-r--r--src/styles/type-helper.scss100
-rw-r--r--src/styles/type.scss48
-rw-r--r--src/styles/util.scss10
-rw-r--r--src/styles/welcome.scss138
-rw-r--r--src/theme/dark/index.js6
-rw-r--r--src/theme/default/index.js21
-rw-r--r--src/theme/default/legacy.js39
-rw-r--r--src/webview/contextMenu.js178
-rw-r--r--src/webview/darkmode.js28
-rw-r--r--src/webview/plugin.js64
-rw-r--r--src/webview/spellchecker.js111
168 files changed, 4219 insertions, 2405 deletions
diff --git a/src/I18n.js b/src/I18n.js
index 4ee34157c..e33141576 100644
--- a/src/I18n.js
+++ b/src/I18n.js
@@ -7,8 +7,7 @@ import { oneOrManyChildElements } from './prop-types';
7import translations from './i18n/translations'; 7import translations from './i18n/translations';
8import UserStore from './stores/UserStore'; 8import UserStore from './stores/UserStore';
9 9
10@inject('stores') @observer 10export default @inject('stores') @observer class I18N extends Component {
11export default class I18N extends Component {
12 componentDidUpdate() { 11 componentDidUpdate() {
13 window.franz.menu.rebuild(); 12 window.franz.menu.rebuild();
14 } 13 }
diff --git a/src/api/FeaturesApi.js b/src/api/FeaturesApi.js
new file mode 100644
index 000000000..c66f28f5b
--- /dev/null
+++ b/src/api/FeaturesApi.js
@@ -0,0 +1,13 @@
1export default class FeaturesApi {
2 constructor(server) {
3 this.server = server;
4 }
5
6 default() {
7 return this.server.getDefaultFeatures();
8 }
9
10 features() {
11 return this.server.getFeatures();
12 }
13}
diff --git a/src/api/LocalApi.js b/src/api/LocalApi.js
index 741917104..e2a46874a 100644
--- a/src/api/LocalApi.js
+++ b/src/api/LocalApi.js
@@ -4,12 +4,12 @@ export default class LocalApi {
4 this.local = local; 4 this.local = local;
5 } 5 }
6 6
7 getAppSettings() { 7 getAppSettings(type) {
8 return this.local.getAppSettings(); 8 return this.local.getAppSettings(type);
9 } 9 }
10 10
11 updateAppSettings(data) { 11 updateAppSettings(type, data) {
12 return this.local.updateAppSettings(data); 12 return this.local.updateAppSettings(type, data);
13 } 13 }
14 14
15 getAppCacheSize() { 15 getAppCacheSize() {
diff --git a/src/api/RecipesApi.js b/src/api/RecipesApi.js
index 0573dacaf..800888b00 100644
--- a/src/api/RecipesApi.js
+++ b/src/api/RecipesApi.js
@@ -1,4 +1,4 @@
1export default class ServicesApi { 1export default class RecipesApi {
2 constructor(server) { 2 constructor(server) {
3 this.server = server; 3 this.server = server;
4 } 4 }
diff --git a/src/api/index.js b/src/api/index.js
index 3fc18c4b5..3c87cc087 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -6,12 +6,14 @@ import UserApi from './UserApi';
6import LocalApi from './LocalApi'; 6import LocalApi from './LocalApi';
7import PaymentApi from './PaymentApi'; 7import PaymentApi from './PaymentApi';
8import NewsApi from './NewsApi'; 8import NewsApi from './NewsApi';
9import FeaturesApi from './FeaturesApi';
9 10
10export default (server, local) => ({ 11export default (server, local) => ({
11 app: new AppApi(server, local), 12 app: new AppApi(server, local),
12 services: new ServicesApi(server, local), 13 services: new ServicesApi(server, local),
13 recipePreviews: new RecipePreviewsApi(server, local), 14 recipePreviews: new RecipePreviewsApi(server, local),
14 recipes: new RecipesApi(server, local), 15 recipes: new RecipesApi(server, local),
16 features: new FeaturesApi(server, local),
15 user: new UserApi(server, local), 17 user: new UserApi(server, local),
16 local: new LocalApi(server, local), 18 local: new LocalApi(server, local),
17 payment: new PaymentApi(server, local), 19 payment: new PaymentApi(server, local),
diff --git a/src/api/server/LocalApi.js b/src/api/server/LocalApi.js
index 78deb7aa5..ab1604a27 100644
--- a/src/api/server/LocalApi.js
+++ b/src/api/server/LocalApi.js
@@ -3,26 +3,29 @@ import du from 'du';
3 3
4import { getServicePartitionsDirectory } from '../../helpers/service-helpers.js'; 4import { getServicePartitionsDirectory } from '../../helpers/service-helpers.js';
5 5
6const debug = require('debug')('LocalApi'); 6const debug = require('debug')('Franz:LocalApi');
7 7
8const { session } = remote; 8const { session } = remote;
9 9
10export default class LocalApi { 10export default class LocalApi {
11 // Settings 11 // Settings
12 getAppSettings() { 12 getAppSettings(type) {
13 return new Promise((resolve) => { 13 return new Promise((resolve) => {
14 ipcRenderer.once('appSettings', (event, data) => { 14 ipcRenderer.once('appSettings', (event, resp) => {
15 debug('LocalApi::getAppSettings resolves', data); 15 debug('LocalApi::getAppSettings resolves', resp.type, resp.data);
16 resolve(data); 16 resolve(resp);
17 }); 17 });
18 18
19 ipcRenderer.send('getAppSettings'); 19 ipcRenderer.send('getAppSettings', type);
20 }); 20 });
21 } 21 }
22 22
23 async updateAppSettings(data) { 23 async updateAppSettings(type, data) {
24 debug('LocalApi::updateAppSettings resolves', data); 24 debug('LocalApi::updateAppSettings resolves', type, data);
25 ipcRenderer.send('updateAppSettings', data); 25 ipcRenderer.send('updateAppSettings', {
26 type,
27 data,
28 });
26 } 29 }
27 30
28 // Services 31 // Services
diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js
index 353faa7f4..164419951 100644
--- a/src/api/server/ServerApi.js
+++ b/src/api/server/ServerApi.js
@@ -27,7 +27,7 @@ import {
27 removeServicePartitionDirectory, 27 removeServicePartitionDirectory,
28} from '../../helpers/service-helpers.js'; 28} from '../../helpers/service-helpers.js';
29 29
30const debug = require('debug')('ServerApi'); 30const debug = require('debug')('Franz:ServerApi');
31 31
32module.paths.unshift( 32module.paths.unshift(
33 getDevRecipeDirectory(), 33 getDevRecipeDirectory(),
@@ -35,7 +35,7 @@ module.paths.unshift(
35); 35);
36 36
37const { app } = remote; 37const { app } = remote;
38const fetch = remote.require('electron-fetch'); 38const { default: fetch } = remote.require('electron-fetch');
39 39
40const SERVER_URL = API; 40const SERVER_URL = API;
41const API_VERSION = 'v1'; 41const API_VERSION = 'v1';
@@ -261,6 +261,35 @@ export default class ServerApi {
261 return data; 261 return data;
262 } 262 }
263 263
264 // Features
265 async getDefaultFeatures() {
266 const request = await window.fetch(`${SERVER_URL}/${API_VERSION}/features/default`, this._prepareAuthRequest({
267 method: 'GET',
268 }));
269 if (!request.ok) {
270 throw request;
271 }
272 const data = await request.json();
273
274 const features = data;
275 console.debug('ServerApi::getDefaultFeatures resolves', features);
276 return features;
277 }
278
279 async getFeatures() {
280 const request = await window.fetch(`${SERVER_URL}/${API_VERSION}/features`, this._prepareAuthRequest({
281 method: 'GET',
282 }));
283 if (!request.ok) {
284 throw request;
285 }
286 const data = await request.json();
287
288 const features = data;
289 console.debug('ServerApi::getFeatures resolves', features);
290 return features;
291 }
292
264 // Recipes 293 // Recipes
265 async getInstalledRecipes() { 294 async getInstalledRecipes() {
266 const recipesDirectory = getRecipeDirectory(); 295 const recipesDirectory = getRecipeDirectory();
diff --git a/src/app.js b/src/app.js
index 814bfacf1..43d0cf018 100644
--- a/src/app.js
+++ b/src/app.js
@@ -6,7 +6,7 @@ import { Provider } from 'mobx-react';
6import { syncHistoryWithStore, RouterStore } from 'mobx-react-router'; 6import { syncHistoryWithStore, RouterStore } from 'mobx-react-router';
7import { Router, Route, hashHistory, IndexRedirect } from 'react-router'; 7import { Router, Route, hashHistory, IndexRedirect } from 'react-router';
8 8
9import 'babel-polyfill'; 9import '@babel/polyfill';
10import smoothScroll from 'smoothscroll-polyfill'; 10import smoothScroll from 'smoothscroll-polyfill';
11 11
12import ServerApi from './api/server/ServerApi'; 12import ServerApi from './api/server/ServerApi';
diff --git a/src/components/auth/AuthLayout.js b/src/components/auth/AuthLayout.js
index 2741b8a15..4fb0e6a59 100644
--- a/src/components/auth/AuthLayout.js
+++ b/src/components/auth/AuthLayout.js
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { RouteTransition } from 'react-router-transition'; 4import { RouteTransition } from 'react-router-transition';
5import { intlShape } from 'react-intl'; 5import { intlShape } from 'react-intl';
6import { TitleBar } from 'electron-react-titlebar';
6 7
7import Link from '../ui/Link'; 8import Link from '../ui/Link';
8import InfoBar from '../ui/InfoBar'; 9import InfoBar from '../ui/InfoBar';
@@ -10,8 +11,9 @@ import InfoBar from '../ui/InfoBar';
10import { oneOrManyChildElements, globalError as globalErrorPropType } from '../../prop-types'; 11import { oneOrManyChildElements, globalError as globalErrorPropType } from '../../prop-types';
11import globalMessages from '../../i18n/globalMessages'; 12import globalMessages from '../../i18n/globalMessages';
12 13
13@observer 14import { isWindows } from '../../environment';
14export default class AuthLayout extends Component { 15
16export default @observer class AuthLayout extends Component {
15 static propTypes = { 17 static propTypes = {
16 children: oneOrManyChildElements.isRequired, 18 children: oneOrManyChildElements.isRequired,
17 pathname: PropTypes.string.isRequired, 19 pathname: PropTypes.string.isRequired,
@@ -20,6 +22,8 @@ export default class AuthLayout extends Component {
20 isAPIHealthy: PropTypes.bool.isRequired, 22 isAPIHealthy: PropTypes.bool.isRequired,
21 retryHealthCheck: PropTypes.func.isRequired, 23 retryHealthCheck: PropTypes.func.isRequired,
22 isHealthCheckLoading: PropTypes.bool.isRequired, 24 isHealthCheckLoading: PropTypes.bool.isRequired,
25 isFullScreen: PropTypes.bool.isRequired,
26 darkMode: PropTypes.bool.isRequired,
23 }; 27 };
24 28
25 static contextTypes = { 29 static contextTypes = {
@@ -35,53 +39,58 @@ export default class AuthLayout extends Component {
35 isAPIHealthy, 39 isAPIHealthy,
36 retryHealthCheck, 40 retryHealthCheck,
37 isHealthCheckLoading, 41 isHealthCheckLoading,
42 isFullScreen,
43 darkMode,
38 } = this.props; 44 } = this.props;
39 const { intl } = this.context; 45 const { intl } = this.context;
40 46
41 return ( 47 return (
42 <div className="auth"> 48 <div className={darkMode ? 'theme__dark' : ''}>
43 {!isOnline && ( 49 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon={'assets/images/logo.svg'} />}
44 <InfoBar 50 <div className={'auth'}>
45 type="warning" 51 {!isOnline && (
46 > 52 <InfoBar
47 <span className="mdi mdi-flash" /> 53 type="warning"
48 {intl.formatMessage(globalMessages.notConnectedToTheInternet)} 54 >
49 </InfoBar> 55 <span className="mdi mdi-flash" />
50 )} 56 {intl.formatMessage(globalMessages.notConnectedToTheInternet)}
51 {isOnline && !isAPIHealthy && ( 57 </InfoBar>
52 <InfoBar 58 )}
53 type="danger" 59 {isOnline && !isAPIHealthy && (
54 ctaLabel="Try again" 60 <InfoBar
55 ctaLoading={isHealthCheckLoading} 61 type="danger"
56 sticky 62 ctaLabel="Try again"
57 onClick={retryHealthCheck} 63 ctaLoading={isHealthCheckLoading}
58 > 64 sticky
59 <span className="mdi mdi-flash" /> 65 onClick={retryHealthCheck}
60 {intl.formatMessage(globalMessages.APIUnhealthy)} 66 >
61 </InfoBar> 67 <span className="mdi mdi-flash" />
62 )} 68 {intl.formatMessage(globalMessages.APIUnhealthy)}
63 <div className="auth__layout"> 69 </InfoBar>
64 <RouteTransition 70 )}
65 pathname={pathname} 71 <div className="auth__layout">
66 atEnter={{ opacity: 0 }} 72 <RouteTransition
67 atLeave={{ opacity: 0 }} 73 pathname={pathname}
68 atActive={{ opacity: 1 }} 74 atEnter={{ opacity: 0 }}
69 mapStyles={styles => ({ 75 atLeave={{ opacity: 0 }}
70 transform: `translateX(${styles.translateX}%)`, 76 atActive={{ opacity: 1 }}
71 opacity: styles.opacity, 77 mapStyles={styles => ({
72 })} 78 transform: `translateX(${styles.translateX}%)`,
73 component="span" 79 opacity: styles.opacity,
74 > 80 })}
75 {/* Inject globalError into children */} 81 component="span"
76 {React.cloneElement(children, { 82 >
77 error, 83 {/* Inject globalError into children */}
78 })} 84 {React.cloneElement(children, {
79 </RouteTransition> 85 error,
86 })}
87 </RouteTransition>
88 </div>
89 {/* </div> */}
90 <Link to="https://adlk.io" className="auth__adlk" target="_blank">
91 <img src="./assets/images/adlk.svg" alt="" />
92 </Link>
80 </div> 93 </div>
81 {/* </div> */}
82 <Link to="https://adlk.io" className="auth__adlk" target="_blank">
83 <img src="./assets/images/adlk.svg" alt="" />
84 </Link>
85 </div> 94 </div>
86 ); 95 );
87 } 96 }
diff --git a/src/components/auth/Import.js b/src/components/auth/Import.js
index 9ba14e768..0d5feb274 100644
--- a/src/components/auth/Import.js
+++ b/src/components/auth/Import.js
@@ -28,8 +28,7 @@ const messages = defineMessages({
28 }, 28 },
29}); 29});
30 30
31@observer 31export default @observer class Import extends Component {
32export default class Import extends Component {
33 static propTypes = { 32 static propTypes = {
34 services: MobxPropTypes.arrayOrObservableArray.isRequired, 33 services: MobxPropTypes.arrayOrObservableArray.isRequired,
35 onSubmit: PropTypes.func.isRequired, 34 onSubmit: PropTypes.func.isRequired,
diff --git a/src/components/auth/Invite.js b/src/components/auth/Invite.js
index f1c16986b..96821a61a 100644
--- a/src/components/auth/Invite.js
+++ b/src/components/auth/Invite.js
@@ -43,8 +43,7 @@ const messages = defineMessages({
43 }, 43 },
44}); 44});
45 45
46@observer 46export default @observer class Invite extends Component {
47export default class Invite extends Component {
48 static propTypes = { 47 static propTypes = {
49 onSubmit: PropTypes.func.isRequired, 48 onSubmit: PropTypes.func.isRequired,
50 embed: PropTypes.bool, 49 embed: PropTypes.bool,
diff --git a/src/components/auth/Login.js b/src/components/auth/Login.js
index 4a3cd6776..f465b35a5 100644
--- a/src/components/auth/Login.js
+++ b/src/components/auth/Login.js
@@ -55,8 +55,7 @@ const messages = defineMessages({
55 }, 55 },
56}); 56});
57 57
58@observer 58export default @observer class Login extends Component {
59export default class Login extends Component {
60 static propTypes = { 59 static propTypes = {
61 onSubmit: PropTypes.func.isRequired, 60 onSubmit: PropTypes.func.isRequired,
62 isSubmitting: PropTypes.bool.isRequired, 61 isSubmitting: PropTypes.bool.isRequired,
diff --git a/src/components/auth/Password.js b/src/components/auth/Password.js
index 5bcc80b6e..ad34e39af 100644
--- a/src/components/auth/Password.js
+++ b/src/components/auth/Password.js
@@ -41,8 +41,7 @@ const messages = defineMessages({
41 }, 41 },
42}); 42});
43 43
44@observer 44export default @observer class Password extends Component {
45export default class Password extends Component {
46 static propTypes = { 45 static propTypes = {
47 onSubmit: PropTypes.func.isRequired, 46 onSubmit: PropTypes.func.isRequired,
48 isSubmitting: PropTypes.bool.isRequired, 47 isSubmitting: PropTypes.bool.isRequired,
diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js
index 3cc8d5f6b..f08129568 100644
--- a/src/components/auth/Pricing.js
+++ b/src/components/auth/Pricing.js
@@ -28,8 +28,7 @@ const messages = defineMessages({
28 }, 28 },
29}); 29});
30 30
31@observer 31export default @observer class Signup extends Component {
32export default class Signup extends Component {
33 static propTypes = { 32 static propTypes = {
34 donor: MobxPropTypes.objectOrObservableObject.isRequired, 33 donor: MobxPropTypes.objectOrObservableObject.isRequired,
35 isLoading: PropTypes.bool.isRequired, 34 isLoading: PropTypes.bool.isRequired,
diff --git a/src/components/auth/Signup.js b/src/components/auth/Signup.js
index 219948274..bbcad8b67 100644
--- a/src/components/auth/Signup.js
+++ b/src/components/auth/Signup.js
@@ -65,8 +65,7 @@ const messages = defineMessages({
65 }, 65 },
66}); 66});
67 67
68@observer 68export default @observer class Signup extends Component {
69export default class Signup extends Component {
70 static propTypes = { 69 static propTypes = {
71 onSubmit: PropTypes.func.isRequired, 70 onSubmit: PropTypes.func.isRequired,
72 isSubmitting: PropTypes.bool.isRequired, 71 isSubmitting: PropTypes.bool.isRequired,
@@ -187,7 +186,7 @@ export default class Signup extends Component {
187 {intl.formatMessage(messages.legalInfo)} 186 {intl.formatMessage(messages.legalInfo)}
188 <br /> 187 <br />
189 <Link 188 <Link
190 to="http://meetfranz.com/terms" 189 to="https://meetfranz.com/terms"
191 target="_blank" 190 target="_blank"
192 className="link" 191 className="link"
193 > 192 >
@@ -195,7 +194,7 @@ export default class Signup extends Component {
195 </Link> 194 </Link>
196 &nbsp;&amp;&nbsp; 195 &nbsp;&amp;&nbsp;
197 <Link 196 <Link
198 to="http://meetfranz.com/privacy" 197 to="https://meetfranz.com/privacy"
199 target="_blank" 198 target="_blank"
200 className="link" 199 className="link"
201 > 200 >
diff --git a/src/components/auth/Welcome.js b/src/components/auth/Welcome.js
index 9e1c762a5..f6d77f70f 100644
--- a/src/components/auth/Welcome.js
+++ b/src/components/auth/Welcome.js
@@ -16,8 +16,7 @@ const messages = defineMessages({
16 }, 16 },
17}); 17});
18 18
19@observer 19export default @observer class Login extends Component {
20export default class Login extends Component {
21 static propTypes = { 20 static propTypes = {
22 loginRoute: PropTypes.string.isRequired, 21 loginRoute: PropTypes.string.isRequired,
23 signupRoute: PropTypes.string.isRequired, 22 signupRoute: PropTypes.string.isRequired,
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index 746775a7f..3ababe54a 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -5,6 +5,7 @@ import { defineMessages, intlShape } from 'react-intl';
5import { TitleBar } from 'electron-react-titlebar'; 5import { TitleBar } from 'electron-react-titlebar';
6 6
7import InfoBar from '../ui/InfoBar'; 7import InfoBar from '../ui/InfoBar';
8import { Component as DelayApp } from '../../features/delayApp';
8import globalMessages from '../../i18n/globalMessages'; 9import globalMessages from '../../i18n/globalMessages';
9 10
10import { isWindows } from '../../environment'; 11import { isWindows } from '../../environment';
@@ -40,8 +41,7 @@ const messages = defineMessages({
40 }, 41 },
41}); 42});
42 43
43@observer 44export default @observer class AppLayout extends Component {
44export default class AppLayout extends Component {
45 static propTypes = { 45 static propTypes = {
46 isFullScreen: PropTypes.bool.isRequired, 46 isFullScreen: PropTypes.bool.isRequired,
47 sidebar: PropTypes.element.isRequired, 47 sidebar: PropTypes.element.isRequired,
@@ -58,6 +58,8 @@ export default class AppLayout extends Component {
58 areRequiredRequestsSuccessful: PropTypes.bool.isRequired, 58 areRequiredRequestsSuccessful: PropTypes.bool.isRequired,
59 retryRequiredRequests: PropTypes.func.isRequired, 59 retryRequiredRequests: PropTypes.func.isRequired,
60 areRequiredRequestsLoading: PropTypes.bool.isRequired, 60 areRequiredRequestsLoading: PropTypes.bool.isRequired,
61 darkMode: PropTypes.bool.isRequired,
62 isDelayAppScreenVisible: PropTypes.bool.isRequired,
61 }; 63 };
62 64
63 static defaultProps = { 65 static defaultProps = {
@@ -85,12 +87,14 @@ export default class AppLayout extends Component {
85 areRequiredRequestsSuccessful, 87 areRequiredRequestsSuccessful,
86 retryRequiredRequests, 88 retryRequiredRequests,
87 areRequiredRequestsLoading, 89 areRequiredRequestsLoading,
90 darkMode,
91 isDelayAppScreenVisible,
88 } = this.props; 92 } = this.props;
89 93
90 const { intl } = this.context; 94 const { intl } = this.context;
91 95
92 return ( 96 return (
93 <div> 97 <div className={(darkMode ? 'theme__dark' : '')}>
94 <div className="app"> 98 <div className="app">
95 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon={'assets/images/logo.svg'} />} 99 {isWindows && !isFullScreen && <TitleBar menu={window.franz.menu.template} icon={'assets/images/logo.svg'} />}
96 <div className="app__content"> 100 <div className="app__content">
@@ -151,6 +155,7 @@ export default class AppLayout extends Component {
151 </a> 155 </a>
152 </InfoBar> 156 </InfoBar>
153 )} 157 )}
158 {isDelayAppScreenVisible && (<DelayApp />)}
154 {services} 159 {services}
155 </div> 160 </div>
156 </div> 161 </div>
diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js
index fa269f216..6ea95bf88 100644
--- a/src/components/layout/Sidebar.js
+++ b/src/components/layout/Sidebar.js
@@ -26,8 +26,7 @@ const messages = defineMessages({
26 }, 26 },
27}); 27});
28 28
29@observer 29export default @observer class Sidebar extends Component {
30export default class Sidebar extends Component {
31 static propTypes = { 30 static propTypes = {
32 openSettings: PropTypes.func.isRequired, 31 openSettings: PropTypes.func.isRequired,
33 toggleMuteApp: PropTypes.func.isRequired, 32 toggleMuteApp: PropTypes.func.isRequired,
diff --git a/src/components/services/content/ServiceDisabled.js b/src/components/services/content/ServiceDisabled.js
index b5af3743d..58fb38d8c 100644
--- a/src/components/services/content/ServiceDisabled.js
+++ b/src/components/services/content/ServiceDisabled.js
@@ -16,8 +16,7 @@ const messages = defineMessages({
16 }, 16 },
17}); 17});
18 18
19@observer 19export default @observer class ServiceDisabled extends Component {
20export default class ServiceDisabled extends Component {
21 static propTypes = { 20 static propTypes = {
22 name: PropTypes.string.isRequired, 21 name: PropTypes.string.isRequired,
23 enable: PropTypes.func.isRequired, 22 enable: PropTypes.func.isRequired,
diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js
index c146abf4e..7163209ee 100644
--- a/src/components/services/content/ServiceWebview.js
+++ b/src/components/services/content/ServiceWebview.js
@@ -10,8 +10,7 @@ import StatusBarTargetUrl from '../../ui/StatusBarTargetUrl';
10import WebviewCrashHandler from './WebviewCrashHandler'; 10import WebviewCrashHandler from './WebviewCrashHandler';
11import ServiceDisabled from './ServiceDisabled'; 11import ServiceDisabled from './ServiceDisabled';
12 12
13@observer 13export default @observer class ServiceWebview extends Component {
14export default class ServiceWebview extends Component {
15 static propTypes = { 14 static propTypes = {
16 service: PropTypes.instanceOf(ServiceModel).isRequired, 15 service: PropTypes.instanceOf(ServiceModel).isRequired,
17 setWebviewReference: PropTypes.func.isRequired, 16 setWebviewReference: PropTypes.func.isRequired,
diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js
index b1322afc2..4cbd51043 100644
--- a/src/components/services/content/Services.js
+++ b/src/components/services/content/Services.js
@@ -18,8 +18,7 @@ const messages = defineMessages({
18 }, 18 },
19}); 19});
20 20
21@observer 21export default @observer class Services extends Component {
22export default class Services extends Component {
23 static propTypes = { 22 static propTypes = {
24 services: MobxPropTypes.arrayOrObservableArray.isRequired, 23 services: MobxPropTypes.arrayOrObservableArray.isRequired,
25 setWebviewReference: PropTypes.func.isRequired, 24 setWebviewReference: PropTypes.func.isRequired,
diff --git a/src/components/services/content/WebviewCrashHandler.js b/src/components/services/content/WebviewCrashHandler.js
index d3e6951f3..3be1fccf4 100644
--- a/src/components/services/content/WebviewCrashHandler.js
+++ b/src/components/services/content/WebviewCrashHandler.js
@@ -24,8 +24,7 @@ const messages = defineMessages({
24 }, 24 },
25}); 25});
26 26
27@observer 27export default @observer class WebviewCrashHandler extends Component {
28export default class WebviewCrashHandler extends Component {
29 static propTypes = { 28 static propTypes = {
30 name: PropTypes.string.isRequired, 29 name: PropTypes.string.isRequired,
31 reload: PropTypes.func.isRequired, 30 reload: PropTypes.func.isRequired,
diff --git a/src/components/services/tabs/TabItem.js b/src/components/services/tabs/TabItem.js
index 638262f7f..8de7dc438 100644
--- a/src/components/services/tabs/TabItem.js
+++ b/src/components/services/tabs/TabItem.js
@@ -141,10 +141,10 @@ class TabItem extends Component {
141 {service.unreadIndirectMessageCount > 0 141 {service.unreadIndirectMessageCount > 0
142 && service.unreadDirectMessageCount === 0 142 && service.unreadDirectMessageCount === 0
143 && service.isIndirectMessageBadgeEnabled && ( 143 && service.isIndirectMessageBadgeEnabled && (
144 <span className="tab-item__message-count is-indirect"> 144 <span className="tab-item__message-count is-indirect">
145 • 145 •
146 </span> 146 </span>
147 )} 147 )}
148 </span> 148 </span>
149 ); 149 );
150 } 150 }
diff --git a/src/components/services/tabs/Tabbar.js b/src/components/services/tabs/Tabbar.js
index ceb88c51c..dd5c2140f 100644
--- a/src/components/services/tabs/Tabbar.js
+++ b/src/components/services/tabs/Tabbar.js
@@ -4,8 +4,7 @@ import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4 4
5import TabBarSortableList from './TabBarSortableList'; 5import TabBarSortableList from './TabBarSortableList';
6 6
7@observer 7export default @observer class TabBar extends Component {
8export default class TabBar extends Component {
9 static propTypes = { 8 static propTypes = {
10 services: MobxPropTypes.arrayOrObservableArray.isRequired, 9 services: MobxPropTypes.arrayOrObservableArray.isRequired,
11 setActive: PropTypes.func.isRequired, 10 setActive: PropTypes.func.isRequired,
diff --git a/src/components/settings/SettingsLayout.js b/src/components/settings/SettingsLayout.js
index d5392ddba..3cb08feb1 100644
--- a/src/components/settings/SettingsLayout.js
+++ b/src/components/settings/SettingsLayout.js
@@ -5,8 +5,7 @@ import { observer } from 'mobx-react';
5import { oneOrManyChildElements } from '../../prop-types'; 5import { oneOrManyChildElements } from '../../prop-types';
6import Appear from '../ui/effects/Appear'; 6import Appear from '../ui/effects/Appear';
7 7
8@observer 8export default @observer class SettingsLayout extends Component {
9export default class SettingsLayout extends Component {
10 static propTypes = { 9 static propTypes = {
11 navigation: PropTypes.element.isRequired, 10 navigation: PropTypes.element.isRequired,
12 children: oneOrManyChildElements.isRequired, 11 children: oneOrManyChildElements.isRequired,
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js
index 4992f0913..06c7074dd 100644
--- a/src/components/settings/account/AccountDashboard.js
+++ b/src/components/settings/account/AccountDashboard.js
@@ -44,6 +44,10 @@ const messages = defineMessages({
44 id: 'settings.account.accountType.premium', 44 id: 'settings.account.accountType.premium',
45 defaultMessage: '!!!Premium Supporter Account', 45 defaultMessage: '!!!Premium Supporter Account',
46 }, 46 },
47 accountTypeEnterprise: {
48 id: 'settings.account.accountType.enterprise',
49 defaultMessage: '!!!Enterprise Account',
50 },
47 accountEditButton: { 51 accountEditButton: {
48 id: 'settings.account.account.editButton', 52 id: 'settings.account.account.editButton',
49 defaultMessage: '!!!Edit Account', 53 defaultMessage: '!!!Edit Account',
@@ -74,8 +78,7 @@ const messages = defineMessages({
74 }, 78 },
75}); 79});
76 80
77@observer 81export default @observer class AccountDashboard extends Component {
78export default class AccountDashboard extends Component {
79 static propTypes = { 82 static propTypes = {
80 user: MobxPropTypes.observableObject.isRequired, 83 user: MobxPropTypes.observableObject.isRequired,
81 orders: MobxPropTypes.arrayOrObservableArray.isRequired, 84 orders: MobxPropTypes.arrayOrObservableArray.isRequired,
@@ -167,17 +170,19 @@ export default class AccountDashboard extends Component {
167 </h2> 170 </h2>
168 {user.organization && `${user.organization}, `} 171 {user.organization && `${user.organization}, `}
169 {user.email}<br /> 172 {user.email}<br />
170 {!user.isPremium && ( 173 {!user.isEnterprise && !user.isPremium && (
171 <span className="badge badge">{intl.formatMessage(messages.accountTypeBasic)}</span> 174 <span className="badge badge">{intl.formatMessage(messages.accountTypeBasic)}</span>
172 )} 175 )}
173 {user.isPremium && ( 176 {user.isPremium && (
174 <span className="badge badge--premium">{intl.formatMessage(messages.accountTypePremium)}</span> 177 <span className="badge badge--premium">{intl.formatMessage(messages.accountTypePremium)}</span>
175 )} 178 )}
179 {user.isEnterprise && (
180 <span className="badge badge--success">{intl.formatMessage(messages.accountTypeEnterprise)}</span>
181 )}
176 </div> 182 </div>
177 <Link to="/settings/user/edit" className="button"> 183 <Link to="/settings/user/edit" className="button">
178 {intl.formatMessage(messages.accountEditButton)} 184 {intl.formatMessage(messages.accountEditButton)}
179 </Link> 185 </Link>
180
181 {user.emailValidated} 186 {user.emailValidated}
182 </div> 187 </div>
183 </div> 188 </div>
@@ -230,6 +235,33 @@ export default class AccountDashboard extends Component {
230 ) 235 )
231 )} 236 )}
232 237
238 {user.isEnterprise && (
239 <div className="account">
240 <div className="account__box">
241 <h2>{user.company.name}</h2>
242 <p>
243 Technical contact:&nbsp;
244 <Link
245 className="link"
246 target="_blank"
247 to={`mailto:${user.company.contact.technical}?subject=Franz`}
248 >
249 {user.company.contact.technical}
250 </Link>
251 <br />
252 General contact:&nbsp;
253 <Link
254 className="link"
255 target="_blank"
256 to={`mailto:${user.company.contact.default}?subject=Franz`}
257 >
258 {user.company.contact.default}
259 </Link>
260 </p>
261 </div>
262 </div>
263 )}
264
233 {user.isMiner && ( 265 {user.isMiner && (
234 <div className="account franz-form"> 266 <div className="account franz-form">
235 <div className="account__box account__box"> 267 <div className="account__box account__box">
@@ -244,7 +276,7 @@ export default class AccountDashboard extends Component {
244 </div> 276 </div>
245 )} 277 )}
246 278
247 {!user.isPremium && ( 279 {!user.isEnterprise && !user.isPremium && (
248 isLoadingPlans ? ( 280 isLoadingPlans ? (
249 <Loader /> 281 <Loader />
250 ) : ( 282 ) : (
@@ -259,28 +291,29 @@ export default class AccountDashboard extends Component {
259 ) 291 )
260 )} 292 )}
261 293
262 <div className="account franz-form"> 294 {!user.isEnterprise && (
263 <div className="account__box"> 295 <div className="account franz-form">
264 <h2>{intl.formatMessage(messages.headlineDangerZone)}</h2> 296 <div className="account__box">
265 {!isDeleteAccountSuccessful && ( 297 <h2>{intl.formatMessage(messages.headlineDangerZone)}</h2>
266 <div className="account__subscription"> 298 {!isDeleteAccountSuccessful && (
267 <p>{intl.formatMessage(messages.deleteInfo)}</p> 299 <div className="account__subscription">
268 <Button 300 <p>{intl.formatMessage(messages.deleteInfo)}</p>
269 label={intl.formatMessage(messages.deleteAccount)} 301 <Button
270 buttonType="danger" 302 label={intl.formatMessage(messages.deleteAccount)}
271 onClick={() => deleteAccount()} 303 buttonType="danger"
272 loaded={!isLoadingDeleteAccount} 304 onClick={() => deleteAccount()}
273 /> 305 loaded={!isLoadingDeleteAccount}
274 </div> 306 />
275 )} 307 </div>
276 {isDeleteAccountSuccessful && ( 308 )}
277 <p>{intl.formatMessage(messages.deleteEmailSent)}</p> 309 {isDeleteAccountSuccessful && (
278 )} 310 <p>{intl.formatMessage(messages.deleteEmailSent)}</p>
311 )}
312 </div>
279 </div> 313 </div>
280 </div> 314 )}
281 </div> 315 </div>
282 )} 316 )}
283
284 </div> 317 </div>
285 <ReactTooltip place="right" type="dark" effect="solid" /> 318 <ReactTooltip place="right" type="dark" effect="solid" />
286 </div> 319 </div>
diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js
index 66539f324..b86d94ac7 100644
--- a/src/components/settings/navigation/SettingsNavigation.js
+++ b/src/components/settings/navigation/SettingsNavigation.js
@@ -1,6 +1,7 @@
1import React, { Component } from 'react'; 1import 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';
4 5
5import Link from '../../ui/Link'; 6import Link from '../../ui/Link';
6 7
@@ -31,7 +32,7 @@ const messages = defineMessages({
31 }, 32 },
32}); 33});
33 34
34export default class SettingsNavigation extends Component { 35export default @inject('stores') @observer class SettingsNavigation extends Component {
35 static propTypes = { 36 static propTypes = {
36 serviceCount: PropTypes.number.isRequired, 37 serviceCount: PropTypes.number.isRequired,
37 }; 38 };
@@ -92,3 +93,4 @@ export default class SettingsNavigation extends Component {
92 ); 93 );
93 } 94 }
94} 95}
96
diff --git a/src/components/settings/recipes/RecipeItem.js b/src/components/settings/recipes/RecipeItem.js
index 7b2f64d26..dae8891b3 100644
--- a/src/components/settings/recipes/RecipeItem.js
+++ b/src/components/settings/recipes/RecipeItem.js
@@ -4,8 +4,7 @@ import { observer } from 'mobx-react';
4 4
5import RecipePreviewModel from '../../../models/RecipePreview'; 5import RecipePreviewModel from '../../../models/RecipePreview';
6 6
7@observer 7export default @observer class RecipeItem extends Component {
8export default class RecipeItem extends Component {
9 static propTypes = { 8 static propTypes = {
10 recipe: PropTypes.instanceOf(RecipePreviewModel).isRequired, 9 recipe: PropTypes.instanceOf(RecipePreviewModel).isRequired,
11 onClick: PropTypes.func.isRequired, 10 onClick: PropTypes.func.isRequired,
diff --git a/src/components/settings/recipes/RecipesDashboard.js b/src/components/settings/recipes/RecipesDashboard.js
index 4610c69a5..cd783200f 100644
--- a/src/components/settings/recipes/RecipesDashboard.js
+++ b/src/components/settings/recipes/RecipesDashboard.js
@@ -46,8 +46,7 @@ const messages = defineMessages({
46 }, 46 },
47}); 47});
48 48
49@observer 49export default @observer class RecipesDashboard extends Component {
50export default class RecipesDashboard extends Component {
51 static propTypes = { 50 static propTypes = {
52 recipes: MobxPropTypes.arrayOrObservableArray.isRequired, 51 recipes: MobxPropTypes.arrayOrObservableArray.isRequired,
53 isLoading: PropTypes.bool.isRequired, 52 isLoading: PropTypes.bool.isRequired,
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js
index f6f2df2f3..d16ec35b8 100644
--- a/src/components/settings/services/EditServiceForm.js
+++ b/src/components/settings/services/EditServiceForm.js
@@ -15,6 +15,8 @@ import Toggle from '../../ui/Toggle';
15import Button from '../../ui/Button'; 15import Button from '../../ui/Button';
16import ImageUpload from '../../ui/ImageUpload'; 16import ImageUpload from '../../ui/ImageUpload';
17 17
18import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
19
18const messages = defineMessages({ 20const messages = defineMessages({
19 saveService: { 21 saveService: {
20 id: 'settings.service.form.saveButton', 22 id: 'settings.service.form.saveButton',
@@ -92,10 +94,17 @@ const messages = defineMessages({
92 id: 'settings.service.form.iconUpload', 94 id: 'settings.service.form.iconUpload',
93 defaultMessage: '!!!Drop your image, or click here', 95 defaultMessage: '!!!Drop your image, or click here',
94 }, 96 },
97 headlineProxy: {
98 id: 'settings.service.form.proxy.headline',
99 defaultMessage: '!!!Proxy Settings',
100 },
101 proxyInfo: {
102 id: 'settings.service.form.proxy.info',
103 defaultMessage: '!!!Proxy settings will not be synchronized with the Franz servers.',
104 },
95}); 105});
96 106
97@observer 107export default @observer class EditServiceForm extends Component {
98export default class EditServiceForm extends Component {
99 static propTypes = { 108 static propTypes = {
100 recipe: PropTypes.instanceOf(Recipe).isRequired, 109 recipe: PropTypes.instanceOf(Recipe).isRequired,
101 service(props, propName) { 110 service(props, propName) {
@@ -113,6 +122,8 @@ export default class EditServiceForm extends Component {
113 onDelete: PropTypes.func.isRequired, 122 onDelete: PropTypes.func.isRequired,
114 isSaving: PropTypes.bool.isRequired, 123 isSaving: PropTypes.bool.isRequired,
115 isDeleting: PropTypes.bool.isRequired, 124 isDeleting: PropTypes.bool.isRequired,
125 isProxyFeatureEnabled: PropTypes.bool.isRequired,
126 isProxyFeaturePremiumFeature: PropTypes.bool.isRequired,
116 }; 127 };
117 128
118 static defaultProps = { 129 static defaultProps = {
@@ -173,6 +184,8 @@ export default class EditServiceForm extends Component {
173 isSaving, 184 isSaving,
174 isDeleting, 185 isDeleting,
175 onDelete, 186 onDelete,
187 isProxyFeatureEnabled,
188 isProxyFeaturePremiumFeature,
176 } = this.props; 189 } = this.props;
177 const { intl } = this.context; 190 const { intl } = this.context;
178 191
@@ -202,6 +215,8 @@ export default class EditServiceForm extends Component {
202 activeTabIndex = 2; 215 activeTabIndex = 2;
203 } 216 }
204 217
218 const requiresUserInput = !recipe.hasHostedOption && (recipe.hasTeamId || recipe.hasCustomUrl);
219
205 return ( 220 return (
206 <div className="settings__main"> 221 <div className="settings__main">
207 <div className="settings__header"> 222 <div className="settings__header">
@@ -303,6 +318,9 @@ export default class EditServiceForm extends Component {
303 318
304 <div className="settings__settings-group"> 319 <div className="settings__settings-group">
305 <h3>{intl.formatMessage(messages.headlineGeneral)}</h3> 320 <h3>{intl.formatMessage(messages.headlineGeneral)}</h3>
321 {recipe.hasDarkMode && (
322 <Toggle field={form.$('isDarkModeEnabled')} />
323 )}
306 <Toggle field={form.$('isEnabled')} /> 324 <Toggle field={form.$('isEnabled')} />
307 </div> 325 </div>
308 </div> 326 </div>
@@ -314,6 +332,33 @@ export default class EditServiceForm extends Component {
314 /> 332 />
315 </div> 333 </div>
316 </div> 334 </div>
335
336 {isProxyFeatureEnabled && (
337 <PremiumFeatureContainer condition={isProxyFeaturePremiumFeature}>
338 <div className="settings__settings-group">
339 <h3>
340 {intl.formatMessage(messages.headlineProxy)}
341 <span className="badge badge--success">beta</span>
342 </h3>
343 <Toggle field={form.$('proxy.isEnabled')} />
344 {form.$('proxy.isEnabled').value && (
345 <div>
346 <Input field={form.$('proxy.host')} />
347 <Input field={form.$('proxy.user')} />
348 <Input
349 field={form.$('proxy.password')}
350 showPasswordToggle
351 />
352 <p>
353 <span className="mdi mdi-information" />
354 {intl.formatMessage(messages.proxyInfo)}
355 </p>
356 </div>
357 )}
358 </div>
359 </PremiumFeatureContainer>
360 )}
361
317 {recipe.message && ( 362 {recipe.message && (
318 <p className="settings__message"> 363 <p className="settings__message">
319 <span className="mdi mdi-information" /> 364 <span className="mdi mdi-information" />
@@ -340,6 +385,7 @@ export default class EditServiceForm extends Component {
340 type="submit" 385 type="submit"
341 label={intl.formatMessage(messages.saveService)} 386 label={intl.formatMessage(messages.saveService)}
342 htmlForm="form" 387 htmlForm="form"
388 disabled={action !== 'edit' && form.isPristine && requiresUserInput}
343 /> 389 />
344 )} 390 )}
345 </div> 391 </div>
diff --git a/src/components/settings/services/ServiceError.js b/src/components/settings/services/ServiceError.js
index 1f1512927..3cfc080d6 100644
--- a/src/components/settings/services/ServiceError.js
+++ b/src/components/settings/services/ServiceError.js
@@ -25,8 +25,7 @@ const messages = defineMessages({
25 }, 25 },
26}); 26});
27 27
28@observer 28export default @observer class ServiceError extends Component {
29export default class ServiceError extends Component {
30 static contextTypes = { 29 static contextTypes = {
31 intl: intlShape, 30 intl: intlShape,
32 }; 31 };
diff --git a/src/components/settings/services/ServiceItem.js b/src/components/settings/services/ServiceItem.js
index 9743315b0..84080519b 100644
--- a/src/components/settings/services/ServiceItem.js
+++ b/src/components/settings/services/ServiceItem.js
@@ -22,8 +22,7 @@ const messages = defineMessages({
22 }, 22 },
23}); 23});
24 24
25@observer 25export default @observer class ServiceItem extends Component {
26export default class ServiceItem extends Component {
27 static propTypes = { 26 static propTypes = {
28 service: PropTypes.instanceOf(ServiceModel).isRequired, 27 service: PropTypes.instanceOf(ServiceModel).isRequired,
29 goToServiceForm: PropTypes.func.isRequired, 28 goToServiceForm: PropTypes.func.isRequired,
diff --git a/src/components/settings/services/ServicesDashboard.js b/src/components/settings/services/ServicesDashboard.js
index 20e451f01..e7dfaf106 100644
--- a/src/components/settings/services/ServicesDashboard.js
+++ b/src/components/settings/services/ServicesDashboard.js
@@ -49,8 +49,7 @@ const messages = defineMessages({
49 }, 49 },
50}); 50});
51 51
52@observer 52export default @observer class ServicesDashboard extends Component {
53export default class ServicesDashboard extends Component {
54 static propTypes = { 53 static propTypes = {
55 services: MobxPropTypes.arrayOrObservableArray.isRequired, 54 services: MobxPropTypes.arrayOrObservableArray.isRequired,
56 isLoading: PropTypes.bool.isRequired, 55 isLoading: PropTypes.bool.isRequired,
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 97f535594..1ec2ab614 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -8,6 +8,7 @@ import Form from '../../../lib/Form';
8import Button from '../../ui/Button'; 8import Button from '../../ui/Button';
9import Toggle from '../../ui/Toggle'; 9import Toggle from '../../ui/Toggle';
10import Select from '../../ui/Select'; 10import Select from '../../ui/Select';
11import PremiumFeatureContainer from '../../ui/PremiumFeatureContainer';
11 12
12import { FRANZ_TRANSLATION } from '../../../config'; 13import { FRANZ_TRANSLATION } from '../../../config';
13 14
@@ -82,8 +83,7 @@ const messages = defineMessages({
82 }, 83 },
83}); 84});
84 85
85@observer 86export default @observer class EditSettingsForm extends Component {
86export default class EditSettingsForm extends Component {
87 static propTypes = { 87 static propTypes = {
88 checkForUpdates: PropTypes.func.isRequired, 88 checkForUpdates: PropTypes.func.isRequired,
89 installUpdate: PropTypes.func.isRequired, 89 installUpdate: PropTypes.func.isRequired,
@@ -96,6 +96,7 @@ export default class EditSettingsForm extends Component {
96 isClearingAllCache: PropTypes.bool.isRequired, 96 isClearingAllCache: PropTypes.bool.isRequired,
97 onClearAllCache: PropTypes.func.isRequired, 97 onClearAllCache: PropTypes.func.isRequired,
98 cacheSize: PropTypes.string.isRequired, 98 cacheSize: PropTypes.string.isRequired,
99 isSpellcheckerPremiumFeature: PropTypes.bool.isRequired,
99 }; 100 };
100 101
101 static contextTypes = { 102 static contextTypes = {
@@ -125,6 +126,7 @@ export default class EditSettingsForm extends Component {
125 isClearingAllCache, 126 isClearingAllCache,
126 onClearAllCache, 127 onClearAllCache,
127 cacheSize, 128 cacheSize,
129 isSpellcheckerPremiumFeature,
128 } = this.props; 130 } = this.props;
129 const { intl } = this.context; 131 const { intl } = this.context;
130 132
@@ -161,10 +163,23 @@ export default class EditSettingsForm extends Component {
161 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2> 163 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2>
162 <Toggle field={form.$('showDisabledServices')} /> 164 <Toggle field={form.$('showDisabledServices')} />
163 <Toggle field={form.$('showMessageBadgeWhenMuted')} /> 165 <Toggle field={form.$('showMessageBadgeWhenMuted')} />
166 <Toggle field={form.$('darkMode')} />
164 167
165 {/* Language */} 168 {/* Language */}
166 <h2 id="language">{intl.formatMessage(messages.headlineLanguage)}</h2> 169 <h2 id="language">{intl.formatMessage(messages.headlineLanguage)}</h2>
167 <Select field={form.$('locale')} showLabel={false} /> 170 <Select field={form.$('locale')} showLabel={false} />
171 <PremiumFeatureContainer
172 condition={isSpellcheckerPremiumFeature}
173 >
174 <div>
175 <Toggle
176 field={form.$('enableSpellchecking')}
177 />
178 {form.$('enableSpellchecking').value && (
179 <Select field={form.$('spellcheckerLanguage')} />
180 )}
181 </div>
182 </PremiumFeatureContainer>
168 <a 183 <a
169 href={FRANZ_TRANSLATION} 184 href={FRANZ_TRANSLATION}
170 target="_blank" 185 target="_blank"
@@ -175,10 +190,8 @@ export default class EditSettingsForm extends Component {
175 190
176 {/* Advanced */} 191 {/* Advanced */}
177 <h2 id="advanced">{intl.formatMessage(messages.headlineAdvanced)}</h2> 192 <h2 id="advanced">{intl.formatMessage(messages.headlineAdvanced)}</h2>
178 <Toggle field={form.$('enableSpellchecking')} />
179 <Toggle field={form.$('enableGPUAcceleration')} /> 193 <Toggle field={form.$('enableGPUAcceleration')} />
180 <p className="settings__help">{intl.formatMessage(messages.enableGPUAccelerationInfo)}</p> 194 <p className="settings__help">{intl.formatMessage(messages.enableGPUAccelerationInfo)}</p>
181 {/* <Select field={form.$('spellcheckingLanguage')} /> */}
182 <div className="settings__settings-group"> 195 <div className="settings__settings-group">
183 <h3> 196 <h3>
184 {intl.formatMessage(messages.subheadlineCache)} 197 {intl.formatMessage(messages.subheadlineCache)}
diff --git a/src/components/settings/user/EditUserForm.js b/src/components/settings/user/EditUserForm.js
index f36887fc2..b825f844a 100644
--- a/src/components/settings/user/EditUserForm.js
+++ b/src/components/settings/user/EditUserForm.js
@@ -39,13 +39,13 @@ const messages = defineMessages({
39 }, 39 },
40}); 40});
41 41
42@observer 42export default @observer class EditServiceForm extends Component {
43export default class EditServiceForm extends Component {
44 static propTypes = { 43 static propTypes = {
45 status: MobxPropTypes.observableArray.isRequired, 44 status: MobxPropTypes.observableArray.isRequired,
46 form: PropTypes.instanceOf(Form).isRequired, 45 form: PropTypes.instanceOf(Form).isRequired,
47 onSubmit: PropTypes.func.isRequired, 46 onSubmit: PropTypes.func.isRequired,
48 isSaving: PropTypes.bool.isRequired, 47 isSaving: PropTypes.bool.isRequired,
48 isEnterprise: PropTypes.bool.isRequired,
49 }; 49 };
50 50
51 static defaultProps = { 51 static defaultProps = {
@@ -72,6 +72,7 @@ export default class EditServiceForm extends Component {
72 // user, 72 // user,
73 status, 73 status,
74 form, 74 form,
75 isEnterprise,
75 isSaving, 76 isSaving,
76 } = this.props; 77 } = this.props;
77 const { intl } = this.context; 78 const { intl } = this.context;
@@ -105,8 +106,10 @@ export default class EditServiceForm extends Component {
105 <Input field={form.$('lastname')} /> 106 <Input field={form.$('lastname')} />
106 </div> 107 </div>
107 <Input field={form.$('email')} /> 108 <Input field={form.$('email')} />
108 <Radio field={form.$('accountType')} /> 109 {!isEnterprise && (
109 {form.$('accountType').value === 'company' && ( 110 <Radio field={form.$('accountType')} />
111 )}
112 {!isEnterprise && form.$('accountType').value === 'company' && (
110 <Input field={form.$('organization')} /> 113 <Input field={form.$('organization')} />
111 )} 114 )}
112 <h2>{intl.formatMessage(messages.headlinePassword)}</h2> 115 <h2>{intl.formatMessage(messages.headlinePassword)}</h2>
diff --git a/src/components/subscription/SubscriptionForm.js b/src/components/subscription/SubscriptionForm.js
index dd350479d..12e8471ff 100644
--- a/src/components/subscription/SubscriptionForm.js
+++ b/src/components/subscription/SubscriptionForm.js
@@ -36,25 +36,21 @@ const messages = defineMessages({
36 defaultMessage: '!!!The Franz Premium Supporter Account includes', 36 defaultMessage: '!!!The Franz Premium Supporter Account includes',
37 }, 37 },
38 features: { 38 features: {
39 unlimitedServices: {
40 id: 'subscription.features.unlimitedServices',
41 defaultMessage: '!!!Add unlimited services',
42 },
43 onpremise: { 39 onpremise: {
44 id: 'subscription.features.onpremise', 40 id: 'subscription.features.onpremise.mattermost',
45 defaultMessage: '!!!Add on-premise/hosted services like HipChat', 41 defaultMessage: '!!!Add on-premise/hosted services like Mattermost',
46 }, 42 },
47 customServices: { 43 noInterruptions: {
48 id: 'subscription.features.customServices', 44 id: 'subscription.features.noInterruptions',
49 defaultMessage: '!!!Add your custom services', 45 defaultMessage: '!!!No app delays & nagging to upgrade license',
50 }, 46 },
51 encryptedSync: { 47 proxy: {
52 id: 'subscription.features.encryptedSync', 48 id: 'subscription.features.proxy',
53 defaultMessage: '!!!Encrypted session synchronization', 49 defaultMessage: '!!!Proxy support for services',
54 }, 50 },
55 vpn: { 51 spellchecker: {
56 id: 'subscription.features.vpn', 52 id: 'subscription.features.spellchecker',
57 defaultMessage: '!!!Proxy & VPN support', 53 defaultMessage: '!!!Support for Spellchecker',
58 }, 54 },
59 ads: { 55 ads: {
60 id: 'subscription.features.ads', 56 id: 'subscription.features.ads',
@@ -71,8 +67,7 @@ const messages = defineMessages({
71 }, 67 },
72}); 68});
73 69
74@observer 70export default @observer class SubscriptionForm extends Component {
75export default class SubscriptionForm extends Component {
76 static propTypes = { 71 static propTypes = {
77 plan: MobxPropTypes.objectOrObservableObject.isRequired, 72 plan: MobxPropTypes.objectOrObservableObject.isRequired,
78 isLoading: PropTypes.bool.isRequired, 73 isLoading: PropTypes.bool.isRequired,
@@ -171,16 +166,13 @@ export default class SubscriptionForm extends Component {
171 <ul className="subscription__premium-features"> 166 <ul className="subscription__premium-features">
172 <li>{intl.formatMessage(messages.features.onpremise)}</li> 167 <li>{intl.formatMessage(messages.features.onpremise)}</li>
173 <li> 168 <li>
174 {intl.formatMessage(messages.features.encryptedSync)} 169 {intl.formatMessage(messages.features.noInterruptions)}
175 <span className="badge">{intl.formatMessage(messages.features.comingSoon)}</span>
176 </li> 170 </li>
177 <li> 171 <li>
178 {intl.formatMessage(messages.features.customServices)} 172 {intl.formatMessage(messages.features.spellchecker)}
179 <span className="badge">{intl.formatMessage(messages.features.comingSoon)}</span>
180 </li> 173 </li>
181 <li> 174 <li>
182 {intl.formatMessage(messages.features.vpn)} 175 {intl.formatMessage(messages.features.proxy)}
183 <span className="badge">{intl.formatMessage(messages.features.comingSoon)}</span>
184 </li> 176 </li>
185 <li> 177 <li>
186 {intl.formatMessage(messages.features.ads)} 178 {intl.formatMessage(messages.features.ads)}
diff --git a/src/components/subscription/SubscriptionPopup.js b/src/components/subscription/SubscriptionPopup.js
index 528d02907..f3c63e7ee 100644
--- a/src/components/subscription/SubscriptionPopup.js
+++ b/src/components/subscription/SubscriptionPopup.js
@@ -17,8 +17,7 @@ const messages = defineMessages({
17 }, 17 },
18}); 18});
19 19
20@observer 20export default @observer class SubscriptionPopup extends Component {
21export default class SubscriptionPopup extends Component {
22 static propTypes = { 21 static propTypes = {
23 url: PropTypes.string.isRequired, 22 url: PropTypes.string.isRequired,
24 closeWindow: PropTypes.func.isRequired, 23 closeWindow: PropTypes.func.isRequired,
diff --git a/src/components/ui/Button.js b/src/components/ui/Button.js
index 554206cb7..309e05bb4 100644
--- a/src/components/ui/Button.js
+++ b/src/components/ui/Button.js
@@ -4,8 +4,7 @@ import { observer } from 'mobx-react';
4import Loader from 'react-loader'; 4import Loader from 'react-loader';
5import classnames from 'classnames'; 5import classnames from 'classnames';
6 6
7@observer 7export default @observer class Button extends Component {
8export default class Button extends Component {
9 static propTypes = { 8 static propTypes = {
10 className: PropTypes.string, 9 className: PropTypes.string,
11 label: PropTypes.string.isRequired, 10 label: PropTypes.string.isRequired,
diff --git a/src/components/ui/ImageUpload.js b/src/components/ui/ImageUpload.js
index 81c3b8da6..76f77d631 100644
--- a/src/components/ui/ImageUpload.js
+++ b/src/components/ui/ImageUpload.js
@@ -2,12 +2,10 @@ 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 { Field } from 'mobx-react-form'; 4import { Field } from 'mobx-react-form';
5// import Loader from 'react-loader';
6import classnames from 'classnames'; 5import classnames from 'classnames';
7import Dropzone from 'react-dropzone'; 6import Dropzone from 'react-dropzone';
8 7
9@observer 8export default @observer class ImageUpload extends Component {
10export default class ImageUpload extends Component {
11 static propTypes = { 9 static propTypes = {
12 field: PropTypes.instanceOf(Field).isRequired, 10 field: PropTypes.instanceOf(Field).isRequired,
13 className: PropTypes.string, 11 className: PropTypes.string,
diff --git a/src/components/ui/InfoBar.js b/src/components/ui/InfoBar.js
index 84a5f1446..94a1ddf76 100644
--- a/src/components/ui/InfoBar.js
+++ b/src/components/ui/InfoBar.js
@@ -7,8 +7,7 @@ import Loader from 'react-loader';
7// import { oneOrManyChildElements } from '../../prop-types'; 7// import { oneOrManyChildElements } from '../../prop-types';
8import Appear from '../ui/effects/Appear'; 8import Appear from '../ui/effects/Appear';
9 9
10@observer 10export default @observer class InfoBar extends Component {
11export default class InfoBar extends Component {
12 static propTypes = { 11 static propTypes = {
13 // eslint-disable-next-line 12 // eslint-disable-next-line
14 children: PropTypes.any.isRequired, 13 children: PropTypes.any.isRequired,
diff --git a/src/components/ui/Infobox.js b/src/components/ui/Infobox.js
index 2d063c7ef..77051f567 100644
--- a/src/components/ui/Infobox.js
+++ b/src/components/ui/Infobox.js
@@ -4,8 +4,7 @@ import { observer } from 'mobx-react';
4import classnames from 'classnames'; 4import classnames from 'classnames';
5import Loader from 'react-loader'; 5import Loader from 'react-loader';
6 6
7@observer 7export default @observer class Infobox extends Component {
8export default class Infobox extends Component {
9 static propTypes = { 8 static propTypes = {
10 children: PropTypes.any.isRequired, // eslint-disable-line 9 children: PropTypes.any.isRequired, // eslint-disable-line
11 icon: PropTypes.string, 10 icon: PropTypes.string,
diff --git a/src/components/ui/Input.js b/src/components/ui/Input.js
index 0bb9f23bf..7bf6e1b00 100644
--- a/src/components/ui/Input.js
+++ b/src/components/ui/Input.js
@@ -6,8 +6,7 @@ import classnames from 'classnames';
6 6
7import { scorePassword as scorePasswordFunc } from '../../helpers/password-helpers'; 7import { scorePassword as scorePasswordFunc } from '../../helpers/password-helpers';
8 8
9@observer 9export default @observer class Input extends Component {
10export default class Input extends Component {
11 static propTypes = { 10 static propTypes = {
12 field: PropTypes.instanceOf(Field).isRequired, 11 field: PropTypes.instanceOf(Field).isRequired,
13 className: PropTypes.string, 12 className: PropTypes.string,
@@ -97,6 +96,7 @@ export default class Input extends Component {
97 onBlur={field.onBlur} 96 onBlur={field.onBlur}
98 onFocus={field.onFocus} 97 onFocus={field.onFocus}
99 ref={(element) => { this.inputElement = element; }} 98 ref={(element) => { this.inputElement = element; }}
99 disabled={field.disabled}
100 /> 100 />
101 {suffix && ( 101 {suffix && (
102 <span className="franz-form__input-suffix">{suffix}</span> 102 <span className="franz-form__input-suffix">{suffix}</span>
diff --git a/src/components/ui/Link.js b/src/components/ui/Link.js
index f5da921fa..0602290f1 100644
--- a/src/components/ui/Link.js
+++ b/src/components/ui/Link.js
@@ -9,9 +9,7 @@ import { oneOrManyChildElements } from '../../prop-types';
9import { matchRoute } from '../../helpers/routing-helpers'; 9import { matchRoute } from '../../helpers/routing-helpers';
10 10
11// TODO: create container component for this component 11// TODO: create container component for this component
12 12export default @inject('stores') @observer class Link extends Component {
13@inject('stores') @observer
14export default class Link extends Component {
15 onClick(e) { 13 onClick(e) {
16 if (this.props.target === '_blank') { 14 if (this.props.target === '_blank') {
17 e.preventDefault(); 15 e.preventDefault();
diff --git a/src/components/ui/PremiumFeatureContainer/index.js b/src/components/ui/PremiumFeatureContainer/index.js
new file mode 100644
index 000000000..73984be94
--- /dev/null
+++ b/src/components/ui/PremiumFeatureContainer/index.js
@@ -0,0 +1,76 @@
1import React, { Component } from 'react';
2import { inject, observer } from 'mobx-react';
3import PropTypes from 'prop-types';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import { oneOrManyChildElements } from '../../../prop-types';
8
9import UserStore from '../../../stores/UserStore';
10
11import styles from './styles';
12
13const messages = defineMessages({
14 action: {
15 id: 'premiumFeature.button.upgradeAccount',
16 defaultMessage: '!!!Upgrade account',
17 },
18});
19
20export default @inject('stores', 'actions') @injectSheet(styles) @observer class PremiumFeatureContainer extends Component {
21 static propTypes = {
22 classes: PropTypes.object.isRequired,
23 condition: PropTypes.bool,
24 };
25
26 static defaultProps = {
27 condition: true,
28 };
29
30 static contextTypes = {
31 intl: intlShape,
32 };
33
34 render() {
35 const {
36 classes,
37 children,
38 actions,
39 condition,
40 stores,
41 } = this.props;
42
43 const { intl } = this.context;
44
45 return !stores.user.data.isPremium && !!condition ? (
46 <div className={classes.container}>
47 <div className={classes.titleContainer}>
48 <p className={classes.title}>Premium Feature</p>
49 <button
50 className={classes.actionButton}
51 type="button"
52 onClick={() => actions.ui.openSettings({ path: 'user' })}
53 >
54 {intl.formatMessage(messages.action)}
55 </button>
56 </div>
57 <div className={classes.content}>
58 {children}
59 </div>
60 </div>
61 ) : children;
62 }
63}
64
65PremiumFeatureContainer.wrappedComponent.propTypes = {
66 children: oneOrManyChildElements.isRequired,
67 stores: PropTypes.shape({
68 user: PropTypes.instanceOf(UserStore).isRequired,
69 }).isRequired,
70 actions: PropTypes.shape({
71 ui: PropTypes.shape({
72 openSettings: PropTypes.func.isRequired,
73 }).isRequired,
74 }).isRequired,
75};
76
diff --git a/src/components/ui/PremiumFeatureContainer/styles.js b/src/components/ui/PremiumFeatureContainer/styles.js
new file mode 100644
index 000000000..16c40d0ec
--- /dev/null
+++ b/src/components/ui/PremiumFeatureContainer/styles.js
@@ -0,0 +1,31 @@
1export default theme => ({
2 container: {
3 background: theme.colorSubscriptionContainerBackground,
4 border: theme.colorSubscriptionContainerBorder,
5 margin: [0, 0, 20, -20],
6 padding: 20,
7 'border-radius': theme.borderRadius,
8 },
9 titleContainer: {
10 display: 'flex',
11 },
12 title: {
13 'font-weight': 'bold',
14 color: theme.colorSubscriptionContainerTitle,
15 },
16 actionButton: {
17 background: theme.colorSubscriptionContainerActionButtonBackground,
18 color: theme.colorSubscriptionContainerActionButtonColor,
19 'margin-left': 'auto',
20 'border-radius': theme.borderRadiusSmall,
21 padding: [2, 4],
22 'font-size': 12,
23 },
24 content: {
25 opacity: 0.5,
26 'margin-top': 20,
27 '& :last-child': {
28 'margin-bottom': 0,
29 },
30 },
31});
diff --git a/src/components/ui/Radio.js b/src/components/ui/Radio.js
index b54cfc820..63ca6f9b8 100644
--- a/src/components/ui/Radio.js
+++ b/src/components/ui/Radio.js
@@ -4,8 +4,7 @@ import { observer } from 'mobx-react';
4import { Field } from 'mobx-react-form'; 4import { Field } from 'mobx-react-form';
5import classnames from 'classnames'; 5import classnames from 'classnames';
6 6
7@observer 7export default @observer class Radio extends Component {
8export default class Radio extends Component {
9 static propTypes = { 8 static propTypes = {
10 field: PropTypes.instanceOf(Field).isRequired, 9 field: PropTypes.instanceOf(Field).isRequired,
11 className: PropTypes.string, 10 className: PropTypes.string,
diff --git a/src/components/ui/SearchInput.js b/src/components/ui/SearchInput.js
index a94cde201..5a9571d27 100644
--- a/src/components/ui/SearchInput.js
+++ b/src/components/ui/SearchInput.js
@@ -5,8 +5,7 @@ import classnames from 'classnames';
5import uuidv1 from 'uuid/v1'; 5import uuidv1 from 'uuid/v1';
6import { debounce } from 'lodash'; 6import { debounce } from 'lodash';
7 7
8@observer 8export default @observer class SearchInput extends Component {
9export default class SearchInput extends Component {
10 static propTypes = { 9 static propTypes = {
11 value: PropTypes.string, 10 value: PropTypes.string,
12 placeholder: PropTypes.string, 11 placeholder: PropTypes.string,
diff --git a/src/components/ui/Select.js b/src/components/ui/Select.js
index 2a877af3e..abcad417e 100644
--- a/src/components/ui/Select.js
+++ b/src/components/ui/Select.js
@@ -4,8 +4,7 @@ import { observer } from 'mobx-react';
4import { Field } from 'mobx-react-form'; 4import { Field } from 'mobx-react-form';
5import classnames from 'classnames'; 5import classnames from 'classnames';
6 6
7@observer 7export default @observer class Select extends Component {
8export default class Select extends Component {
9 static propTypes = { 8 static propTypes = {
10 field: PropTypes.instanceOf(Field).isRequired, 9 field: PropTypes.instanceOf(Field).isRequired,
11 className: PropTypes.string, 10 className: PropTypes.string,
diff --git a/src/components/ui/StatusBarTargetUrl.js b/src/components/ui/StatusBarTargetUrl.js
index b7b198f42..4285a343c 100644
--- a/src/components/ui/StatusBarTargetUrl.js
+++ b/src/components/ui/StatusBarTargetUrl.js
@@ -5,8 +5,7 @@ import classnames from 'classnames';
5 5
6import Appear from '../ui/effects/Appear'; 6import Appear from '../ui/effects/Appear';
7 7
8@observer 8export default @observer class StatusBarTargetUrl extends Component {
9export default class StatusBarTargetUrl extends Component {
10 static propTypes = { 9 static propTypes = {
11 className: PropTypes.string, 10 className: PropTypes.string,
12 text: PropTypes.string, 11 text: PropTypes.string,
diff --git a/src/components/ui/Tabs/Tabs.js b/src/components/ui/Tabs/Tabs.js
index 50397f9bb..12f650ffd 100644
--- a/src/components/ui/Tabs/Tabs.js
+++ b/src/components/ui/Tabs/Tabs.js
@@ -5,8 +5,7 @@ import classnames from 'classnames';
5 5
6import { oneOrManyChildElements } from '../../../prop-types'; 6import { oneOrManyChildElements } from '../../../prop-types';
7 7
8@observer 8export default @observer class Tab extends Component {
9export default class Tab extends Component {
10 static propTypes = { 9 static propTypes = {
11 children: oneOrManyChildElements.isRequired, 10 children: oneOrManyChildElements.isRequired,
12 active: PropTypes.number, 11 active: PropTypes.number,
diff --git a/src/components/ui/Toggle.js b/src/components/ui/Toggle.js
index 62d46393e..78fb77cbe 100644
--- a/src/components/ui/Toggle.js
+++ b/src/components/ui/Toggle.js
@@ -4,17 +4,18 @@ import { observer } from 'mobx-react';
4import classnames from 'classnames'; 4import classnames from 'classnames';
5import { Field } from 'mobx-react-form'; 5import { Field } from 'mobx-react-form';
6 6
7@observer 7export default @observer class Toggle extends Component {
8export default class Toggle extends Component {
9 static propTypes = { 8 static propTypes = {
10 field: PropTypes.instanceOf(Field).isRequired, 9 field: PropTypes.instanceOf(Field).isRequired,
11 className: PropTypes.string, 10 className: PropTypes.string,
12 showLabel: PropTypes.bool, 11 showLabel: PropTypes.bool,
12 disabled: PropTypes.bool,
13 }; 13 };
14 14
15 static defaultProps = { 15 static defaultProps = {
16 className: '', 16 className: '',
17 showLabel: true, 17 showLabel: true,
18 disabled: false,
18 }; 19 };
19 20
20 onChange(e) { 21 onChange(e) {
@@ -28,6 +29,7 @@ export default class Toggle extends Component {
28 field, 29 field,
29 className, 30 className,
30 showLabel, 31 showLabel,
32 disabled,
31 } = this.props; 33 } = this.props;
32 34
33 if (field.value === '' && field.default !== '') { 35 if (field.value === '' && field.default !== '') {
@@ -39,6 +41,7 @@ export default class Toggle extends Component {
39 className={classnames([ 41 className={classnames([
40 'franz-form__field', 42 'franz-form__field',
41 'franz-form__toggle-wrapper', 43 'franz-form__toggle-wrapper',
44 'franz-form__toggle-disabled',
42 className, 45 className,
43 ])} 46 ])}
44 > 47 >
@@ -56,7 +59,7 @@ export default class Toggle extends Component {
56 name={field.name} 59 name={field.name}
57 value={field.name} 60 value={field.name}
58 checked={field.value} 61 checked={field.value}
59 onChange={e => this.onChange(e)} 62 onChange={e => (!disabled ? this.onChange(e) : null)}
60 /> 63 />
61 </label> 64 </label>
62 {field.error && <div className={field.error}>{field.error}</div>} 65 {field.error && <div className={field.error}>{field.error}</div>}
diff --git a/src/config.js b/src/config.js
index 77fa92eca..08dbb85f3 100644
--- a/src/config.js
+++ b/src/config.js
@@ -7,7 +7,7 @@ export const CHECK_INTERVAL = 1000 * 3600; // How often should we perform checks
7export const LOCAL_API = 'http://localhost:3000'; 7export const LOCAL_API = 'http://localhost:3000';
8export const DEV_API = 'https://dev.franzinfra.com'; 8export const DEV_API = 'https://dev.franzinfra.com';
9export const LIVE_API = 'https://api.franzinfra.com'; 9export const LIVE_API = 'https://api.franzinfra.com';
10export const GA_ID = 'UA-74126766-6'; 10export const GA_ID = 'UA-74126766-10';
11 11
12export const DEFAULT_APP_SETTINGS = { 12export const DEFAULT_APP_SETTINGS = {
13 autoLaunchInBackground: false, 13 autoLaunchInBackground: false,
@@ -17,14 +17,35 @@ export const DEFAULT_APP_SETTINGS = {
17 showDisabledServices: true, 17 showDisabledServices: true,
18 showMessageBadgeWhenMuted: true, 18 showMessageBadgeWhenMuted: true,
19 enableSpellchecking: true, 19 enableSpellchecking: true,
20 spellcheckerLanguage: 'en-us',
21 darkMode: false,
20 locale: '', 22 locale: '',
21 fallbackLocale: 'en-US', 23 fallbackLocale: 'en-US',
22 beta: false, 24 beta: false,
23 isAppMuted: false, 25 isAppMuted: false,
24 enableGPUAcceleration: true, 26 enableGPUAcceleration: true,
27 serviceLimit: 5,
25}; 28};
26 29
27export const FRANZ_SERVICE_REQUEST = 'http://bit.ly/franz-service-request'; 30export const DEFAULT_FEATURES_CONFIG = {
28export const FRANZ_TRANSLATION = 'http://bit.ly/franz-translate'; 31 isSpellcheckerPremiumFeature: false,
32 needToWaitToProceed: false,
33 needToWaitToProceedConfig: {
34 delayOffset: 3600000,
35 wait: 10000,
36 },
37 isServiceProxyEnabled: false,
38 isServiceProxyPremiumFeature: true,
39};
40
41export const FRANZ_SERVICE_REQUEST = 'hhttp://bit.ly/franz-plugin-docs';
42export const FRANZ_TRANSLATION = 'https://bit.ly/franz-translate';
43
44export const FILE_SYSTEM_SETTINGS_TYPES = [
45 'app',
46 'proxy',
47];
48
49export const SETTINGS_PATH = path.join(app.getPath('userData'), 'config');
29 50
30export const SETTINGS_PATH = path.join(app.getPath('userData'), 'config', 'settings.json'); 51export const DICTIONARY_PATH = path.join(app.getPath('userData'), 'dicts');
diff --git a/src/containers/auth/AuthLayoutContainer.js b/src/containers/auth/AuthLayoutContainer.js
index 004054fdd..b73598f3d 100644
--- a/src/containers/auth/AuthLayoutContainer.js
+++ b/src/containers/auth/AuthLayoutContainer.js
@@ -5,11 +5,11 @@ import { inject, observer } from 'mobx-react';
5import AuthLayout from '../../components/auth/AuthLayout'; 5import AuthLayout from '../../components/auth/AuthLayout';
6import AppStore from '../../stores/AppStore'; 6import AppStore from '../../stores/AppStore';
7import GlobalErrorStore from '../../stores/GlobalErrorStore'; 7import GlobalErrorStore from '../../stores/GlobalErrorStore';
8import AppLoader from '../../components/ui/AppLoader';
8 9
9import { oneOrManyChildElements } from '../../prop-types'; 10import { oneOrManyChildElements } from '../../prop-types';
10 11
11@inject('stores', 'actions') @observer 12export default @inject('stores', 'actions') @observer class AuthLayoutContainer extends Component {
12export default class AuthLayoutContainer extends Component {
13 static propTypes = { 13 static propTypes = {
14 children: oneOrManyChildElements.isRequired, 14 children: oneOrManyChildElements.isRequired,
15 location: PropTypes.shape({ 15 location: PropTypes.shape({
@@ -19,14 +19,27 @@ export default class AuthLayoutContainer extends Component {
19 19
20 render() { 20 render() {
21 const { stores, actions, children, location } = this.props; 21 const { stores, actions, children, location } = this.props;
22 const { app, features, globalError } = stores;
23
24 const isLoadingBaseFeatures = features.defaultFeaturesRequest.isExecuting
25 && !features.defaultFeaturesRequest.wasExecuted;
26
27 if (isLoadingBaseFeatures) {
28 return (
29 <AppLoader />
30 );
31 }
32
22 return ( 33 return (
23 <AuthLayout 34 <AuthLayout
24 error={stores.globalError.response} 35 error={globalError.response}
25 pathname={location.pathname} 36 pathname={location.pathname}
26 isOnline={stores.app.isOnline} 37 isOnline={app.isOnline}
27 isAPIHealthy={!stores.app.healthCheckRequest.isError} 38 isAPIHealthy={!app.healthCheckRequest.isError}
28 retryHealthCheck={actions.app.healthCheck} 39 retryHealthCheck={actions.app.healthCheck}
29 isHealthCheckLoading={stores.app.healthCheckRequest.isExecuting} 40 isHealthCheckLoading={app.healthCheckRequest.isExecuting}
41 isFullScreen={app.isFullScreen}
42 darkMode={app.isSystemDarkModeEnabled}
30 > 43 >
31 {children} 44 {children}
32 </AuthLayout> 45 </AuthLayout>
diff --git a/src/containers/auth/ImportScreen.js b/src/containers/auth/ImportScreen.js
index ddd56ffb6..fc46f8b54 100644
--- a/src/containers/auth/ImportScreen.js
+++ b/src/containers/auth/ImportScreen.js
@@ -5,8 +5,7 @@ import Import from '../../components/auth/Import';
5import UserStore from '../../stores/UserStore'; 5import UserStore from '../../stores/UserStore';
6import { gaPage } from '../../lib/analytics'; 6import { gaPage } from '../../lib/analytics';
7 7
8@inject('stores', 'actions') @observer 8export default @inject('stores', 'actions') @observer class ImportScreen extends Component {
9export default class ImportScreen extends Component {
10 componentDidMount() { 9 componentDidMount() {
11 gaPage('Auth/Import'); 10 gaPage('Auth/Import');
12 } 11 }
diff --git a/src/containers/auth/InviteScreen.js b/src/containers/auth/InviteScreen.js
index 059888c99..26bf97038 100644
--- a/src/containers/auth/InviteScreen.js
+++ b/src/containers/auth/InviteScreen.js
@@ -4,8 +4,7 @@ import { inject, observer } from 'mobx-react';
4import Invite from '../../components/auth/Invite'; 4import Invite from '../../components/auth/Invite';
5import { gaPage } from '../../lib/analytics'; 5import { gaPage } from '../../lib/analytics';
6 6
7@inject('stores', 'actions') @observer 7export default @inject('stores', 'actions') @observer class InviteScreen extends Component {
8export default class InviteScreen extends Component {
9 componentDidMount() { 8 componentDidMount() {
10 gaPage('Auth/Invite'); 9 gaPage('Auth/Invite');
11 } 10 }
diff --git a/src/containers/auth/LoginScreen.js b/src/containers/auth/LoginScreen.js
index 9e22c5141..865bd38f8 100644
--- a/src/containers/auth/LoginScreen.js
+++ b/src/containers/auth/LoginScreen.js
@@ -7,8 +7,7 @@ import { gaPage } from '../../lib/analytics';
7 7
8import { globalError as globalErrorPropType } from '../../prop-types'; 8import { globalError as globalErrorPropType } from '../../prop-types';
9 9
10@inject('stores', 'actions') @observer 10export default @inject('stores', 'actions') @observer class LoginScreen extends Component {
11export default class LoginScreen extends Component {
12 static propTypes = { 11 static propTypes = {
13 error: globalErrorPropType.isRequired, 12 error: globalErrorPropType.isRequired,
14 }; 13 };
diff --git a/src/containers/auth/PasswordScreen.js b/src/containers/auth/PasswordScreen.js
index d88cb08e6..236fd2031 100644
--- a/src/containers/auth/PasswordScreen.js
+++ b/src/containers/auth/PasswordScreen.js
@@ -5,8 +5,7 @@ import Password from '../../components/auth/Password';
5import UserStore from '../../stores/UserStore'; 5import UserStore from '../../stores/UserStore';
6import { gaPage } from '../../lib/analytics'; 6import { gaPage } from '../../lib/analytics';
7 7
8@inject('stores', 'actions') @observer 8export default @inject('stores', 'actions') @observer class PasswordScreen extends Component {
9export default class PasswordScreen extends Component {
10 componentDidMount() { 9 componentDidMount() {
11 gaPage('Auth/Password Retrieve'); 10 gaPage('Auth/Password Retrieve');
12 } 11 }
diff --git a/src/containers/auth/PricingScreen.js b/src/containers/auth/PricingScreen.js
index 7e1586535..34b512e15 100644
--- a/src/containers/auth/PricingScreen.js
+++ b/src/containers/auth/PricingScreen.js
@@ -10,8 +10,7 @@ import { gaPage } from '../../lib/analytics';
10 10
11import { globalError as globalErrorPropType } from '../../prop-types'; 11import { globalError as globalErrorPropType } from '../../prop-types';
12 12
13@inject('stores', 'actions') @observer 13export default @inject('stores', 'actions') @observer class PricingScreen extends Component {
14export default class PricingScreen extends Component {
15 static propTypes = { 14 static propTypes = {
16 error: globalErrorPropType.isRequired, 15 error: globalErrorPropType.isRequired,
17 }; 16 };
diff --git a/src/containers/auth/SignupScreen.js b/src/containers/auth/SignupScreen.js
index 3b86ab138..caf75de90 100644
--- a/src/containers/auth/SignupScreen.js
+++ b/src/containers/auth/SignupScreen.js
@@ -8,8 +8,7 @@ import { gaPage } from '../../lib/analytics';
8 8
9import { globalError as globalErrorPropType } from '../../prop-types'; 9import { globalError as globalErrorPropType } from '../../prop-types';
10 10
11@inject('stores', 'actions') @observer 11export default @inject('stores', 'actions') @observer class SignupScreen extends Component {
12export default class SignupScreen extends Component {
13 static propTypes = { 12 static propTypes = {
14 error: globalErrorPropType.isRequired, 13 error: globalErrorPropType.isRequired,
15 }; 14 };
diff --git a/src/containers/auth/WelcomeScreen.js b/src/containers/auth/WelcomeScreen.js
index e413264a6..2c120f81c 100644
--- a/src/containers/auth/WelcomeScreen.js
+++ b/src/containers/auth/WelcomeScreen.js
@@ -7,8 +7,7 @@ import UserStore from '../../stores/UserStore';
7import RecipePreviewsStore from '../../stores/RecipePreviewsStore'; 7import RecipePreviewsStore from '../../stores/RecipePreviewsStore';
8import { gaPage } from '../../lib/analytics'; 8import { gaPage } from '../../lib/analytics';
9 9
10@inject('stores', 'actions') @observer 10export default @inject('stores', 'actions') @observer class LoginScreen extends Component {
11export default class LoginScreen extends Component {
12 componentDidMount() { 11 componentDidMount() {
13 gaPage('Auth/Welcome'); 12 gaPage('Auth/Welcome');
14 } 13 }
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index 9212f809f..e1423bdaa 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -1,10 +1,12 @@
1import React, { Component } from 'react'; 1import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react'; 3import { inject, observer } from 'mobx-react';
4import { ThemeProvider } from 'react-jss';
4 5
5import AppStore from '../../stores/AppStore'; 6import AppStore from '../../stores/AppStore';
6import RecipesStore from '../../stores/RecipesStore'; 7import RecipesStore from '../../stores/RecipesStore';
7import ServicesStore from '../../stores/ServicesStore'; 8import ServicesStore from '../../stores/ServicesStore';
9import FeaturesStore from '../../stores/FeaturesStore';
8import UIStore from '../../stores/UIStore'; 10import UIStore from '../../stores/UIStore';
9import NewsStore from '../../stores/NewsStore'; 11import NewsStore from '../../stores/NewsStore';
10import SettingsStore from '../../stores/SettingsStore'; 12import SettingsStore from '../../stores/SettingsStore';
@@ -17,8 +19,9 @@ import Sidebar from '../../components/layout/Sidebar';
17import Services from '../../components/services/content/Services'; 19import Services from '../../components/services/content/Services';
18import AppLoader from '../../components/ui/AppLoader'; 20import AppLoader from '../../components/ui/AppLoader';
19 21
20@inject('stores', 'actions') @observer 22import { state as delayAppState } from '../../features/delayApp';
21export default class AppLayoutContainer extends Component { 23
24export default @inject('stores', 'actions') @observer class AppLayoutContainer extends Component {
22 static defaultProps = { 25 static defaultProps = {
23 children: null, 26 children: null,
24 }; 27 };
@@ -26,6 +29,7 @@ export default class AppLayoutContainer extends Component {
26 render() { 29 render() {
27 const { 30 const {
28 app, 31 app,
32 features,
29 services, 33 services,
30 ui, 34 ui,
31 news, 35 news,
@@ -39,7 +43,6 @@ export default class AppLayoutContainer extends Component {
39 handleIPCMessage, 43 handleIPCMessage,
40 setWebviewReference, 44 setWebviewReference,
41 openWindow, 45 openWindow,
42 reloadUpdatedServices,
43 reorder, 46 reorder,
44 reload, 47 reload,
45 toggleNotifications, 48 toggleNotifications,
@@ -64,10 +67,13 @@ export default class AppLayoutContainer extends Component {
64 67
65 const { children } = this.props; 68 const { children } = this.props;
66 69
70 const isLoadingFeatures = features.featuresRequest.isExecuting
71 && !features.featuresRequest.wasExecuted;
72
67 const isLoadingServices = services.allServicesRequest.isExecuting 73 const isLoadingServices = services.allServicesRequest.isExecuting
68 && services.allServicesRequest.isExecutingFirstTime; 74 && services.allServicesRequest.isExecutingFirstTime;
69 75
70 if (isLoadingServices) { 76 if (isLoadingFeatures || isLoadingServices) {
71 return ( 77 return (
72 <AppLoader /> 78 <AppLoader />
73 ); 79 );
@@ -105,25 +111,29 @@ export default class AppLayoutContainer extends Component {
105 ); 111 );
106 112
107 return ( 113 return (
108 <AppLayout 114 <ThemeProvider theme={ui.theme}>
109 isFullScreen={app.isFullScreen} 115 <AppLayout
110 isOnline={app.isOnline} 116 isFullScreen={app.isFullScreen}
111 showServicesUpdatedInfoBar={ui.showServicesUpdatedInfoBar} 117 isOnline={app.isOnline}
112 appUpdateIsDownloaded={app.updateStatus === app.updateStatusTypes.DOWNLOADED} 118 showServicesUpdatedInfoBar={ui.showServicesUpdatedInfoBar}
113 sidebar={sidebar} 119 appUpdateIsDownloaded={app.updateStatus === app.updateStatusTypes.DOWNLOADED}
114 services={servicesContainer} 120 sidebar={sidebar}
115 news={news.latest} 121 services={servicesContainer}
116 removeNewsItem={hide} 122 news={news.latest}
117 reloadServicesAfterUpdate={reloadUpdatedServices} 123 removeNewsItem={hide}
118 installAppUpdate={installUpdate} 124 reloadServicesAfterUpdate={() => window.location.reload()}
119 globalError={globalError.error} 125 installAppUpdate={installUpdate}
120 showRequiredRequestsError={requests.showRequiredRequestsError} 126 globalError={globalError.error}
121 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful} 127 showRequiredRequestsError={requests.showRequiredRequestsError}
122 retryRequiredRequests={retryRequiredRequests} 128 areRequiredRequestsSuccessful={requests.areRequiredRequestsSuccessful}
123 areRequiredRequestsLoading={requests.areRequiredRequestsLoading} 129 retryRequiredRequests={retryRequiredRequests}
124 > 130 areRequiredRequestsLoading={requests.areRequiredRequestsLoading}
125 {React.Children.count(children) > 0 ? children : null} 131 darkMode={settings.all.app.darkMode}
126 </AppLayout> 132 isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible}
133 >
134 {React.Children.count(children) > 0 ? children : null}
135 </AppLayout>
136 </ThemeProvider>
127 ); 137 );
128 } 138 }
129} 139}
@@ -131,6 +141,7 @@ export default class AppLayoutContainer extends Component {
131AppLayoutContainer.wrappedComponent.propTypes = { 141AppLayoutContainer.wrappedComponent.propTypes = {
132 stores: PropTypes.shape({ 142 stores: PropTypes.shape({
133 services: PropTypes.instanceOf(ServicesStore).isRequired, 143 services: PropTypes.instanceOf(ServicesStore).isRequired,
144 features: PropTypes.instanceOf(FeaturesStore).isRequired,
134 recipes: PropTypes.instanceOf(RecipesStore).isRequired, 145 recipes: PropTypes.instanceOf(RecipesStore).isRequired,
135 app: PropTypes.instanceOf(AppStore).isRequired, 146 app: PropTypes.instanceOf(AppStore).isRequired,
136 ui: PropTypes.instanceOf(UIStore).isRequired, 147 ui: PropTypes.instanceOf(UIStore).isRequired,
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index c5c2982b0..5818af0b1 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -12,8 +12,7 @@ import AccountDashboard from '../../components/settings/account/AccountDashboard
12 12
13const { BrowserWindow } = remote; 13const { BrowserWindow } = remote;
14 14
15@inject('stores', 'actions') @observer 15export default @inject('stores', 'actions') @observer class AccountScreen extends Component {
16export default class AccountScreen extends Component {
17 componentDidMount() { 16 componentDidMount() {
18 gaPage('Settings/Account Dashboard'); 17 gaPage('Settings/Account Dashboard');
19 } 18 }
diff --git a/src/containers/settings/EditServiceScreen.js b/src/containers/settings/EditServiceScreen.js
index 67c2731fc..639e8b070 100644
--- a/src/containers/settings/EditServiceScreen.js
+++ b/src/containers/settings/EditServiceScreen.js
@@ -6,6 +6,8 @@ import { defineMessages, intlShape } from 'react-intl';
6import UserStore from '../../stores/UserStore'; 6import UserStore from '../../stores/UserStore';
7import RecipesStore from '../../stores/RecipesStore'; 7import RecipesStore from '../../stores/RecipesStore';
8import ServicesStore from '../../stores/ServicesStore'; 8import ServicesStore from '../../stores/ServicesStore';
9import SettingsStore from '../../stores/SettingsStore';
10import FeaturesStore from '../../stores/FeaturesStore';
9import Form from '../../lib/Form'; 11import Form from '../../lib/Form';
10import { gaPage } from '../../lib/analytics'; 12import { gaPage } from '../../lib/analytics';
11 13
@@ -13,6 +15,8 @@ import ServiceError from '../../components/settings/services/ServiceError';
13import EditServiceForm from '../../components/settings/services/EditServiceForm'; 15import EditServiceForm from '../../components/settings/services/EditServiceForm';
14import { required, url, oneRequired } from '../../helpers/validation-helpers'; 16import { required, url, oneRequired } from '../../helpers/validation-helpers';
15 17
18import { config as proxyFeature } from '../../features/serviceProxy';
19
16const messages = defineMessages({ 20const messages = defineMessages({
17 name: { 21 name: {
18 id: 'settings.service.form.name', 22 id: 'settings.service.form.name',
@@ -50,10 +54,29 @@ const messages = defineMessages({
50 id: 'settings.service.form.icon', 54 id: 'settings.service.form.icon',
51 defaultMessage: '!!!Custom icon', 55 defaultMessage: '!!!Custom icon',
52 }, 56 },
57 enableDarkMode: {
58 id: 'settings.service.form.enableDarkMode',
59 defaultMessage: '!!!Enable Dark Mode',
60 },
61 enableProxy: {
62 id: 'settings.service.form.proxy.isEnabled',
63 defaultMessage: '!!!Use Proxy',
64 },
65 proxyHost: {
66 id: 'settings.service.form.proxy.host',
67 defaultMessage: '!!!Proxy Host/IP',
68 },
69 proxyUser: {
70 id: 'settings.service.form.proxy.user',
71 defaultMessage: '!!!User',
72 },
73 proxyPassword: {
74 id: 'settings.service.form.proxy.password',
75 defaultMessage: '!!!Password',
76 },
53}); 77});
54 78
55@inject('stores', 'actions') @observer 79export default @inject('stores', 'actions') @observer class EditServiceScreen extends Component {
56export default class EditServiceScreen extends Component {
57 static contextTypes = { 80 static contextTypes = {
58 intl: intlShape, 81 intl: intlShape,
59 }; 82 };
@@ -77,7 +100,7 @@ export default class EditServiceScreen extends Component {
77 } 100 }
78 } 101 }
79 102
80 prepareForm(recipe, service) { 103 prepareForm(recipe, service, proxy) {
81 const { intl } = this.context; 104 const { intl } = this.context;
82 const config = { 105 const config = {
83 fields: { 106 fields: {
@@ -112,6 +135,11 @@ export default class EditServiceScreen extends Component {
112 default: null, 135 default: null,
113 type: 'file', 136 type: 'file',
114 }, 137 },
138 isDarkModeEnabled: {
139 label: intl.formatMessage(messages.enableDarkMode),
140 value: service.isDarkModeEnabled,
141 default: this.props.stores.settings.all.app.darkMode,
142 },
115 }, 143 },
116 }; 144 };
117 145
@@ -163,6 +191,40 @@ export default class EditServiceScreen extends Component {
163 }); 191 });
164 } 192 }
165 193
194 if (proxy.isEnabled) {
195 const serviceProxyConfig = this.props.stores.settings.proxy[service.id] || {};
196
197 Object.assign(config.fields, {
198 proxy: {
199 name: 'proxy',
200 label: 'proxy',
201 fields: {
202 isEnabled: {
203 label: intl.formatMessage(messages.enableProxy),
204 value: serviceProxyConfig.isEnabled,
205 default: false,
206 },
207 host: {
208 label: intl.formatMessage(messages.proxyHost),
209 value: serviceProxyConfig.host,
210 default: '',
211 },
212 user: {
213 label: intl.formatMessage(messages.proxyUser),
214 value: serviceProxyConfig.user,
215 default: '',
216 },
217 password: {
218 label: intl.formatMessage(messages.proxyPassword),
219 value: serviceProxyConfig.password,
220 default: '',
221 type: 'password',
222 },
223 },
224 },
225 });
226 }
227
166 return new Form(config); 228 return new Form(config);
167 } 229 }
168 230
@@ -215,7 +277,7 @@ export default class EditServiceScreen extends Component {
215 ); 277 );
216 } 278 }
217 279
218 const form = this.prepareForm(recipe, service); 280 const form = this.prepareForm(recipe, service, proxyFeature);
219 281
220 return ( 282 return (
221 <EditServiceForm 283 <EditServiceForm
@@ -229,6 +291,8 @@ export default class EditServiceScreen extends Component {
229 isDeleting={services.deleteServiceRequest.isExecuting} 291 isDeleting={services.deleteServiceRequest.isExecuting}
230 onSubmit={d => this.onSubmit(d)} 292 onSubmit={d => this.onSubmit(d)}
231 onDelete={() => this.deleteService()} 293 onDelete={() => this.deleteService()}
294 isProxyFeatureEnabled={proxyFeature.isEnabled}
295 isProxyFeaturePremiumFeature={proxyFeature.isPremium}
232 /> 296 />
233 ); 297 );
234 } 298 }
@@ -239,6 +303,8 @@ EditServiceScreen.wrappedComponent.propTypes = {
239 user: PropTypes.instanceOf(UserStore).isRequired, 303 user: PropTypes.instanceOf(UserStore).isRequired,
240 recipes: PropTypes.instanceOf(RecipesStore).isRequired, 304 recipes: PropTypes.instanceOf(RecipesStore).isRequired,
241 services: PropTypes.instanceOf(ServicesStore).isRequired, 305 services: PropTypes.instanceOf(ServicesStore).isRequired,
306 settings: PropTypes.instanceOf(SettingsStore).isRequired,
307 features: PropTypes.instanceOf(FeaturesStore).isRequired,
242 }).isRequired, 308 }).isRequired,
243 router: PropTypes.shape({ 309 router: PropTypes.shape({
244 params: PropTypes.shape({ 310 params: PropTypes.shape({
@@ -251,5 +317,8 @@ EditServiceScreen.wrappedComponent.propTypes = {
251 updateService: PropTypes.func.isRequired, 317 updateService: PropTypes.func.isRequired,
252 deleteService: PropTypes.func.isRequired, 318 deleteService: PropTypes.func.isRequired,
253 }).isRequired, 319 }).isRequired,
320 // settings: PropTypes.shape({
321 // update: PropTypes.func.isRequred,
322 // }).isRequired,
254 }).isRequired, 323 }).isRequired,
255}; 324};
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index 018ce663f..ea1d319d9 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -7,9 +7,10 @@ import AppStore from '../../stores/AppStore';
7import SettingsStore from '../../stores/SettingsStore'; 7import SettingsStore from '../../stores/SettingsStore';
8import UserStore from '../../stores/UserStore'; 8import UserStore from '../../stores/UserStore';
9import Form from '../../lib/Form'; 9import Form from '../../lib/Form';
10import { APP_LOCALES } from '../../i18n/languages'; 10import { APP_LOCALES, SPELLCHECKER_LOCALES } from '../../i18n/languages';
11import { gaPage } from '../../lib/analytics'; 11import { gaPage } from '../../lib/analytics';
12import { DEFAULT_APP_SETTINGS } from '../../config'; 12import { DEFAULT_APP_SETTINGS } from '../../config';
13import { config as spellcheckerConfig } from '../../features/spellchecker';
13 14
14 15
15import EditSettingsForm from '../../components/settings/settings/EditSettingsForm'; 16import EditSettingsForm from '../../components/settings/settings/EditSettingsForm';
@@ -39,6 +40,10 @@ const messages = defineMessages({
39 id: 'settings.app.form.language', 40 id: 'settings.app.form.language',
40 defaultMessage: '!!!Language', 41 defaultMessage: '!!!Language',
41 }, 42 },
43 darkMode: {
44 id: 'settings.app.form.darkMode',
45 defaultMessage: '!!!Dark Mode',
46 },
42 showDisabledServices: { 47 showDisabledServices: {
43 id: 'settings.app.form.showDisabledServices', 48 id: 'settings.app.form.showDisabledServices',
44 defaultMessage: '!!!Display disabled services tabs', 49 defaultMessage: '!!!Display disabled services tabs',
@@ -55,8 +60,8 @@ const messages = defineMessages({
55 id: 'settings.app.form.enableGPUAcceleration', 60 id: 'settings.app.form.enableGPUAcceleration',
56 defaultMessage: '!!!Enable GPU Acceleration', 61 defaultMessage: '!!!Enable GPU Acceleration',
57 }, 62 },
58 spellcheckingLanguage: { 63 spellcheckerLanguage: {
59 id: 'settings.app.form.spellcheckingLanguage', 64 id: 'settings.app.form.spellcheckerLanguage',
60 defaultMessage: '!!!Language for spell checking', 65 defaultMessage: '!!!Language for spell checking',
61 }, 66 },
62 beta: { 67 beta: {
@@ -65,8 +70,7 @@ const messages = defineMessages({
65 }, 70 },
66}); 71});
67 72
68@inject('stores', 'actions') @observer 73export default @inject('stores', 'actions') @observer class EditSettingsScreen extends Component {
69export default class EditSettingsScreen extends Component {
70 static contextTypes = { 74 static contextTypes = {
71 intl: intlShape, 75 intl: intlShape,
72 }; 76 };
@@ -91,8 +95,10 @@ export default class EditSettingsScreen extends Component {
91 minimizeToSystemTray: settingsData.minimizeToSystemTray, 95 minimizeToSystemTray: settingsData.minimizeToSystemTray,
92 enableGPUAcceleration: settingsData.enableGPUAcceleration, 96 enableGPUAcceleration: settingsData.enableGPUAcceleration,
93 showDisabledServices: settingsData.showDisabledServices, 97 showDisabledServices: settingsData.showDisabledServices,
98 darkMode: settingsData.darkMode,
94 showMessageBadgeWhenMuted: settingsData.showMessageBadgeWhenMuted, 99 showMessageBadgeWhenMuted: settingsData.showMessageBadgeWhenMuted,
95 enableSpellchecking: settingsData.enableSpellchecking, 100 enableSpellchecking: settingsData.enableSpellchecking,
101 spellcheckerLanguage: settingsData.spellcheckerLanguage,
96 beta: settingsData.beta, // we need this info in the main process as well 102 beta: settingsData.beta, // we need this info in the main process as well
97 locale: settingsData.locale, // we need this info in the main process as well 103 locale: settingsData.locale, // we need this info in the main process as well
98 }, 104 },
@@ -118,6 +124,14 @@ export default class EditSettingsScreen extends Component {
118 }); 124 });
119 }); 125 });
120 126
127 const spellcheckingLanguages = [];
128 Object.keys(SPELLCHECKER_LOCALES).sort(Intl.Collator().compare).forEach((key) => {
129 spellcheckingLanguages.push({
130 value: key,
131 label: SPELLCHECKER_LOCALES[key],
132 });
133 });
134
121 const config = { 135 const config = {
122 fields: { 136 fields: {
123 autoLaunchOnStart: { 137 autoLaunchOnStart: {
@@ -157,8 +171,19 @@ export default class EditSettingsScreen extends Component {
157 }, 171 },
158 enableSpellchecking: { 172 enableSpellchecking: {
159 label: intl.formatMessage(messages.enableSpellchecking), 173 label: intl.formatMessage(messages.enableSpellchecking),
160 value: settings.all.app.enableSpellchecking, 174 value: !this.props.stores.user.data.isPremium && spellcheckerConfig.isPremiumFeature ? false : settings.all.app.enableSpellchecking,
161 default: DEFAULT_APP_SETTINGS.enableSpellchecking, 175 default: !this.props.stores.user.data.isPremium && spellcheckerConfig.isPremiumFeature ? false : DEFAULT_APP_SETTINGS.enableSpellchecking,
176 },
177 spellcheckerLanguage: {
178 label: intl.formatMessage(messages.spellcheckerLanguage),
179 value: settings.all.app.spellcheckerLanguage,
180 options: spellcheckingLanguages,
181 default: DEFAULT_APP_SETTINGS.spellcheckerLanguage,
182 },
183 darkMode: {
184 label: intl.formatMessage(messages.darkMode),
185 value: settings.all.app.darkMode,
186 default: DEFAULT_APP_SETTINGS.darkMode,
162 }, 187 },
163 enableGPUAcceleration: { 188 enableGPUAcceleration: {
164 label: intl.formatMessage(messages.enableGPUAcceleration), 189 label: intl.formatMessage(messages.enableGPUAcceleration),
@@ -209,6 +234,7 @@ export default class EditSettingsScreen extends Component {
209 cacheSize={cacheSize} 234 cacheSize={cacheSize}
210 isClearingAllCache={isClearingAllCache} 235 isClearingAllCache={isClearingAllCache}
211 onClearAllCache={clearAllCache} 236 onClearAllCache={clearAllCache}
237 isSpellcheckerPremiumFeature={spellcheckerConfig.isPremiumFeature}
212 /> 238 />
213 ); 239 );
214 } 240 }
diff --git a/src/containers/settings/EditUserScreen.js b/src/containers/settings/EditUserScreen.js
index dda8ce513..3da3e8d2c 100644
--- a/src/containers/settings/EditUserScreen.js
+++ b/src/containers/settings/EditUserScreen.js
@@ -50,8 +50,7 @@ const messages = defineMessages({
50 }, 50 },
51}); 51});
52 52
53@inject('stores', 'actions') @observer 53export default @inject('stores', 'actions') @observer class EditUserScreen extends Component {
54export default class EditUserScreen extends Component {
55 static contextTypes = { 54 static contextTypes = {
56 intl: intlShape, 55 intl: intlShape,
57 }; 56 };
@@ -145,6 +144,7 @@ export default class EditUserScreen extends Component {
145 // user={user.data} 144 // user={user.data}
146 status={user.actionStatus} 145 status={user.actionStatus}
147 form={form} 146 form={form}
147 isEnterprise={user.data.isEnterprise}
148 isSaving={user.updateUserInfoRequest.isExecuting} 148 isSaving={user.updateUserInfoRequest.isExecuting}
149 onSubmit={d => this.onSubmit(d)} 149 onSubmit={d => this.onSubmit(d)}
150 /> 150 />
diff --git a/src/containers/settings/InviteScreen.js b/src/containers/settings/InviteScreen.js
index 5f341b1b3..38ca6ec74 100644
--- a/src/containers/settings/InviteScreen.js
+++ b/src/containers/settings/InviteScreen.js
@@ -5,8 +5,7 @@ import { inject, observer } from 'mobx-react';
5import Invite from '../../components/auth/Invite'; 5import Invite from '../../components/auth/Invite';
6import { gaPage } from '../../lib/analytics'; 6import { gaPage } from '../../lib/analytics';
7 7
8@inject('stores', 'actions') @observer 8export default @inject('stores', 'actions') @observer class InviteScreen extends Component {
9export default class InviteScreen extends Component {
10 componentDidMount() { 9 componentDidMount() {
11 gaPage('Settings/Invite'); 10 gaPage('Settings/Invite');
12 } 11 }
diff --git a/src/containers/settings/RecipesScreen.js b/src/containers/settings/RecipesScreen.js
index 65341e9e3..4efe81505 100644
--- a/src/containers/settings/RecipesScreen.js
+++ b/src/containers/settings/RecipesScreen.js
@@ -11,8 +11,7 @@ import { gaPage } from '../../lib/analytics';
11 11
12import RecipesDashboard from '../../components/settings/recipes/RecipesDashboard'; 12import RecipesDashboard from '../../components/settings/recipes/RecipesDashboard';
13 13
14@inject('stores', 'actions') @observer 14export default @inject('stores', 'actions') @observer class RecipesScreen extends Component {
15export default class RecipesScreen extends Component {
16 static propTypes = { 15 static propTypes = {
17 params: PropTypes.shape({ 16 params: PropTypes.shape({
18 filter: PropTypes.string, 17 filter: PropTypes.string,
diff --git a/src/containers/settings/ServicesScreen.js b/src/containers/settings/ServicesScreen.js
index 12db1bcd3..c1a133ef7 100644
--- a/src/containers/settings/ServicesScreen.js
+++ b/src/containers/settings/ServicesScreen.js
@@ -10,8 +10,7 @@ import { gaPage } from '../../lib/analytics';
10 10
11import ServicesDashboard from '../../components/settings/services/ServicesDashboard'; 11import ServicesDashboard from '../../components/settings/services/ServicesDashboard';
12 12
13@inject('stores', 'actions') @observer 13export default @inject('stores', 'actions') @observer class ServicesScreen extends Component {
14export default class ServicesScreen extends Component {
15 componentDidMount() { 14 componentDidMount() {
16 gaPage('Settings/Service Dashboard'); 15 gaPage('Settings/Service Dashboard');
17 } 16 }
diff --git a/src/containers/settings/SettingsWindow.js b/src/containers/settings/SettingsWindow.js
index 13ca96f72..55589d0be 100644
--- a/src/containers/settings/SettingsWindow.js
+++ b/src/containers/settings/SettingsWindow.js
@@ -7,8 +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';
9 9
10@inject('stores', 'actions') @observer 10export default @inject('stores', 'actions') @observer class SettingsContainer extends Component {
11export default class SettingsContainer extends Component {
12 render() { 11 render() {
13 const { children, stores } = this.props; 12 const { children, stores } = this.props;
14 const { closeSettings } = this.props.actions.ui; 13 const { closeSettings } = this.props.actions.ui;
diff --git a/src/containers/subscription/SubscriptionFormScreen.js b/src/containers/subscription/SubscriptionFormScreen.js
index fc6e3c4be..50ed19bef 100644
--- a/src/containers/subscription/SubscriptionFormScreen.js
+++ b/src/containers/subscription/SubscriptionFormScreen.js
@@ -9,8 +9,7 @@ import SubscriptionForm from '../../components/subscription/SubscriptionForm';
9 9
10const { BrowserWindow } = remote; 10const { BrowserWindow } = remote;
11 11
12@inject('stores', 'actions') @observer 12export default @inject('stores', 'actions') @observer class SubscriptionFormScreen extends Component {
13export default class SubscriptionFormScreen extends Component {
14 static propTypes = { 13 static propTypes = {
15 onCloseWindow: PropTypes.func, 14 onCloseWindow: PropTypes.func,
16 content: PropTypes.oneOrManyChildElements, 15 content: PropTypes.oneOrManyChildElements,
@@ -80,7 +79,6 @@ export default class SubscriptionFormScreen extends Component {
80 return ( 79 return (
81 <SubscriptionForm 80 <SubscriptionForm
82 plan={stores.payment.plan} 81 plan={stores.payment.plan}
83 // form={this.prepareForm(stores.payment.plan)}
84 isLoading={stores.payment.plansRequest.isExecuting} 82 isLoading={stores.payment.plansRequest.isExecuting}
85 retryPlanRequest={() => stores.payment.plansRequest.reload()} 83 retryPlanRequest={() => stores.payment.plansRequest.reload()}
86 isCreatingHostedPage={stores.payment.createHostedPageRequest.isExecuting} 84 isCreatingHostedPage={stores.payment.createHostedPageRequest.isExecuting}
diff --git a/src/containers/subscription/SubscriptionPopupScreen.js b/src/containers/subscription/SubscriptionPopupScreen.js
index bb0603170..6641f236d 100644
--- a/src/containers/subscription/SubscriptionPopupScreen.js
+++ b/src/containers/subscription/SubscriptionPopupScreen.js
@@ -5,8 +5,7 @@ import { inject, observer } from 'mobx-react';
5import SubscriptionPopup from '../../components/subscription/SubscriptionPopup'; 5import SubscriptionPopup from '../../components/subscription/SubscriptionPopup';
6 6
7 7
8@inject('stores', 'actions') @observer 8export default @inject('stores', 'actions') @observer class SubscriptionPopupScreen extends Component {
9export default class SubscriptionPopupScreen extends Component {
10 state = { 9 state = {
11 complete: false, 10 complete: false,
12 }; 11 };
diff --git a/src/electron/Settings.js b/src/electron/Settings.js
index b3138e948..6ac3b9177 100644
--- a/src/electron/Settings.js
+++ b/src/electron/Settings.js
@@ -1,15 +1,21 @@
1import { observable, toJS } from 'mobx'; 1import { observable, toJS } from 'mobx';
2import { pathExistsSync, outputJsonSync, readJsonSync } from 'fs-extra'; 2import { pathExistsSync, outputJsonSync, readJsonSync } from 'fs-extra';
3import path from 'path';
3 4
4import { SETTINGS_PATH, DEFAULT_APP_SETTINGS } from '../config'; 5import { SETTINGS_PATH } from '../config';
5 6
6const debug = require('debug')('Settings'); 7const debug = require('debug')('Franz:Settings');
7 8
8export default class Settings { 9export default class Settings {
9 @observable store = DEFAULT_APP_SETTINGS; 10 type = '';
11 @observable store = {};
10 12
11 constructor() { 13 constructor(type, defaultState = {}) {
12 if (!pathExistsSync(SETTINGS_PATH)) { 14 this.type = type;
15 this.store = defaultState;
16 this.defaultState = defaultState;
17
18 if (!pathExistsSync(this.settingsFile)) {
13 this._writeFile(); 19 this._writeFile();
14 } else { 20 } else {
15 this._hydrate(); 21 this._hydrate();
@@ -17,7 +23,7 @@ export default class Settings {
17 } 23 }
18 24
19 set(settings) { 25 set(settings) {
20 this.store = Object.assign(this.store, settings); 26 this.store = this._merge(settings);
21 27
22 this._writeFile(); 28 this._writeFile();
23 } 29 }
@@ -30,13 +36,21 @@ export default class Settings {
30 return this.store[key]; 36 return this.store[key];
31 } 37 }
32 38
39 _merge(settings) {
40 return Object.assign(this.defaultState, this.store, settings);
41 }
42
33 _hydrate() { 43 _hydrate() {
34 this.store = readJsonSync(SETTINGS_PATH); 44 this.store = this._merge(readJsonSync(this.settingsFile));
35 debug('Hydrate store', toJS(this.store)); 45 debug('Hydrate store', toJS(this.store));
36 } 46 }
37 47
38 _writeFile() { 48 _writeFile() {
39 outputJsonSync(SETTINGS_PATH, this.store); 49 outputJsonSync(this.settingsFile, this.store);
40 debug('Write settings file', toJS(this.store)); 50 debug('Write settings file', toJS(this.store));
41 } 51 }
52
53 get settingsFile() {
54 return path.join(SETTINGS_PATH, `${this.type === 'app' ? 'settings' : this.type}.json`);
55 }
42} 56}
diff --git a/src/electron/ipc-api/appIndicator.js b/src/electron/ipc-api/appIndicator.js
index d31819068..e568bf35d 100644
--- a/src/electron/ipc-api/appIndicator.js
+++ b/src/electron/ipc-api/appIndicator.js
@@ -15,7 +15,7 @@ function getAsset(type, asset) {
15 15
16export default (params) => { 16export default (params) => {
17 autorun(() => { 17 autorun(() => {
18 isTrayIconEnabled = params.settings.get('enableSystemTray'); 18 isTrayIconEnabled = params.settings.app.get('enableSystemTray');
19 19
20 if (!isTrayIconEnabled) { 20 if (!isTrayIconEnabled) {
21 params.trayIcon.hide(); 21 params.trayIcon.hide();
diff --git a/src/electron/ipc-api/autoUpdate.js b/src/electron/ipc-api/autoUpdate.js
index ba49a2f97..9ccc89ea2 100644
--- a/src/electron/ipc-api/autoUpdate.js
+++ b/src/electron/ipc-api/autoUpdate.js
@@ -1,17 +1,17 @@
1import { app, ipcMain } from 'electron'; 1import { app, ipcMain } from 'electron';
2import { autoUpdater } from 'electron-updater'; 2import { autoUpdater } from 'electron-updater';
3import { isDevMode } from '../../environment.js'; 3
4const debug = require('debug')('Franz:ipcApi:autoUpdate');
4 5
5export default (params) => { 6export default (params) => {
6 if (!isDevMode && (process.platform === 'darwin' || process.platform === 'win32')) { 7 if (process.platform === 'darwin' || process.platform === 'win32') {
7 // autoUpdater.setFeedURL(updateUrl);
8 ipcMain.on('autoUpdate', (event, args) => { 8 ipcMain.on('autoUpdate', (event, args) => {
9 try { 9 try {
10 autoUpdater.allowPrerelease = Boolean(params.settings.get('beta')); 10 autoUpdater.allowPrerelease = Boolean(params.settings.app.get('beta'));
11 if (args.action === 'check') { 11 if (args.action === 'check') {
12 autoUpdater.checkForUpdates(); 12 autoUpdater.checkForUpdates();
13 } else if (args.action === 'install') { 13 } else if (args.action === 'install') {
14 console.log('install update'); 14 debug('install update');
15 autoUpdater.quitAndInstall(); 15 autoUpdater.quitAndInstall();
16 // we need to send a quit event 16 // we need to send a quit event
17 setTimeout(() => { 17 setTimeout(() => {
@@ -25,12 +25,12 @@ export default (params) => {
25 }); 25 });
26 26
27 autoUpdater.on('update-not-available', () => { 27 autoUpdater.on('update-not-available', () => {
28 console.log('update-not-available'); 28 debug('update-not-available');
29 params.mainWindow.webContents.send('autoUpdate', { available: false }); 29 params.mainWindow.webContents.send('autoUpdate', { available: false });
30 }); 30 });
31 31
32 autoUpdater.on('update-available', () => { 32 autoUpdater.on('update-available', () => {
33 console.log('update-available'); 33 debug('update-available');
34 params.mainWindow.webContents.send('autoUpdate', { available: true }); 34 params.mainWindow.webContents.send('autoUpdate', { available: true });
35 }); 35 });
36 36
@@ -39,16 +39,16 @@ export default (params) => {
39 logMessage = `${logMessage} - Downloaded ${progressObj.percent}%`; 39 logMessage = `${logMessage} - Downloaded ${progressObj.percent}%`;
40 logMessage = `${logMessage} (${progressObj.transferred}/${progressObj.total})`; 40 logMessage = `${logMessage} (${progressObj.transferred}/${progressObj.total})`;
41 41
42 console.log(logMessage); 42 debug(logMessage);
43 }); 43 });
44 44
45 autoUpdater.on('update-downloaded', () => { 45 autoUpdater.on('update-downloaded', () => {
46 console.log('update-downloaded'); 46 debug('update-downloaded');
47 params.mainWindow.webContents.send('autoUpdate', { downloaded: true }); 47 params.mainWindow.webContents.send('autoUpdate', { downloaded: true });
48 }); 48 });
49 49
50 autoUpdater.on('error', () => { 50 autoUpdater.on('error', () => {
51 console.log('update-error'); 51 debug('update-error');
52 params.mainWindow.webContents.send('autoUpdate', { error: true }); 52 params.mainWindow.webContents.send('autoUpdate', { error: true });
53 }); 53 });
54 } 54 }
diff --git a/src/electron/ipc-api/download.js b/src/electron/ipc-api/download.js
new file mode 100644
index 000000000..9e504834d
--- /dev/null
+++ b/src/electron/ipc-api/download.js
@@ -0,0 +1,43 @@
1import { ipcMain, dialog } from 'electron';
2import { download } from 'electron-dl';
3import mime from 'mime-types';
4import fs from 'fs-extra';
5
6const debug = require('debug')('Franz:ipcApi:download');
7
8function decodeBase64Image(dataString) {
9 const matches = dataString.match(/^data:([A-Za-z-+/]+);base64,(.+)$/);
10
11 if (matches.length !== 3) {
12 return new Error('Invalid input string');
13 }
14
15 return new Buffer(matches[2], 'base64');
16}
17
18export default (params) => {
19 ipcMain.on('download-file', async (event, { url, content, fileOptions = {} }) => {
20 try {
21 if (!content) {
22 const dl = await download(params.mainWindow, url, {
23 saveAs: true,
24 });
25 debug('File saved to', dl.getSavePath());
26 } else {
27 const extension = mime.extension(fileOptions.mime);
28 const filename = `${fileOptions.name}.${extension}`;
29
30 dialog.showSaveDialog(params.mainWindow, {
31 defaultPath: filename,
32 }, (name) => {
33 const binaryImage = decodeBase64Image(content);
34 fs.writeFileSync(name, binaryImage, 'binary');
35
36 debug('File blob saved to', name);
37 });
38 }
39 } catch (e) {
40 console.error(e);
41 }
42 });
43};
diff --git a/src/electron/ipc-api/index.js b/src/electron/ipc-api/index.js
index 4ea6d1475..be8e0815a 100644
--- a/src/electron/ipc-api/index.js
+++ b/src/electron/ipc-api/index.js
@@ -1,9 +1,11 @@
1import autoUpdate from './autoUpdate'; 1import autoUpdate from './autoUpdate';
2import settings from './settings'; 2import settings from './settings';
3import appIndicator from './appIndicator'; 3import appIndicator from './appIndicator';
4import download from './download';
4 5
5export default (params) => { 6export default (params) => {
6 settings(params); 7 settings(params);
7 autoUpdate(params); 8 autoUpdate(params);
8 appIndicator(params); 9 appIndicator(params);
10 download(params);
9}; 11};
diff --git a/src/electron/ipc-api/settings.js b/src/electron/ipc-api/settings.js
index 3eab68a91..ce006bb92 100644
--- a/src/electron/ipc-api/settings.js
+++ b/src/electron/ipc-api/settings.js
@@ -1,11 +1,15 @@
1import { ipcMain } from 'electron'; 1import { ipcMain } from 'electron';
2 2
3export default (params) => { 3export default (params) => {
4 ipcMain.on('getAppSettings', () => { 4 ipcMain.on('getAppSettings', (event, type) => {
5 params.mainWindow.webContents.send('appSettings', params.settings.all); 5 console.log('getAppSettings', type, params.settings[type].all);
6 params.mainWindow.webContents.send('appSettings', {
7 type,
8 data: params.settings[type].all,
9 });
6 }); 10 });
7 11
8 ipcMain.on('updateAppSettings', (event, args) => { 12 ipcMain.on('updateAppSettings', (event, args) => {
9 params.settings.set(args); 13 params.settings[args.type].set(args.data);
10 }); 14 });
11}; 15};
diff --git a/src/features/delayApp/Component.js b/src/features/delayApp/Component.js
new file mode 100644
index 000000000..403340c7b
--- /dev/null
+++ b/src/features/delayApp/Component.js
@@ -0,0 +1,88 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { inject, observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import Button from '../../components/ui/Button';
8
9import { config } from './';
10import styles from './styles';
11
12const messages = defineMessages({
13 headline: {
14 id: 'feature.delayApp.headline',
15 defaultMessage: '!!!Please purchase license to skip waiting',
16 },
17 action: {
18 id: 'feature.delayApp.action',
19 defaultMessage: '!!!Get a Franz Supporter License',
20 },
21 text: {
22 id: 'feature.delayApp.text',
23 defaultMessage: '!!!Franz will continue in {seconds} seconds.',
24 },
25});
26
27export default @inject('actions') @injectSheet(styles) @observer class DelayApp extends Component {
28 static propTypes = {
29 // eslint-disable-next-line
30 classes: PropTypes.object.isRequired,
31 };
32
33 static contextTypes = {
34 intl: intlShape,
35 };
36
37 state = {
38 countdown: config.delayDuration,
39 }
40
41 componentDidMount() {
42 this.countdownInterval = setInterval(() => {
43 this.setState({
44 countdown: this.state.countdown - this.countdownIntervalTimeout,
45 });
46
47 if (this.state.countdown <= 0) {
48 // reload();
49 clearInterval(this.countdownInterval);
50 }
51 }, this.countdownIntervalTimeout);
52 }
53
54 componentWillUnmount() {
55 clearInterval(this.countdownInterval);
56 }
57
58 countdownInterval = null;
59 countdownIntervalTimeout = 1000;
60
61 render() {
62 const { classes, actions } = this.props;
63 const { intl } = this.context;
64
65 return (
66 <div className={`${classes.container}`}>
67 <h1 className={classes.headline}>{intl.formatMessage(messages.headline)}</h1>
68 <Button
69 label={intl.formatMessage(messages.action)}
70 className={classes.button}
71 buttonType="inverted"
72 onClick={() => actions.ui.openSettings({ path: 'user' })}
73 />
74 <p className="footnote">{intl.formatMessage(messages.text, {
75 seconds: this.state.countdown / 1000,
76 })}</p>
77 </div>
78 );
79 }
80}
81
82DelayApp.wrappedComponent.propTypes = {
83 actions: PropTypes.shape({
84 ui: PropTypes.shape({
85 openSettings: PropTypes.func.isRequired,
86 }).isRequired,
87 }).isRequired,
88};
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
new file mode 100644
index 000000000..9ffa1d2fd
--- /dev/null
+++ b/src/features/delayApp/index.js
@@ -0,0 +1,70 @@
1import { autorun, observable, reaction } from 'mobx';
2import moment from 'moment';
3import DelayAppComponent from './Component';
4
5import { DEFAULT_FEATURES_CONFIG } from '../../config';
6
7const debug = require('debug')('Franz:feature:delayApp');
8
9export const config = {
10 delayOffset: DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.delayOffset,
11 delayDuration: DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait,
12};
13
14export const state = observable({
15 isDelayAppScreenVisible: DEFAULT_FEATURES_CONFIG.needToWaitToProceed,
16});
17
18function setVisibility(value) {
19 Object.assign(state, {
20 isDelayAppScreenVisible: value,
21 });
22}
23
24export default function init(stores) {
25 reaction(
26 () => stores.features.features.needToWaitToProceed,
27 (enabled, r) => {
28 if (enabled) {
29 debug('Initializing `delayApp` feature');
30
31 // Dispose the reaction to run this only once
32 r.dispose();
33
34 const { needToWaitToProceedConfig: globalConfig } = stores.features.features;
35
36 let shownAfterLaunch = false;
37 let timeLastDelay = moment();
38
39 config.delayOffset = globalConfig.delayOffset !== undefined ? globalConfig.delayOffset : DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.delayOffset;
40 config.delayDuration = globalConfig.wait !== undefined ? globalConfig.wait : DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait;
41
42 autorun(() => {
43 if (stores.services.all.length === 0) {
44 shownAfterLaunch = true;
45 return;
46 }
47
48 const diff = moment().diff(timeLastDelay);
49 if ((stores.app.isFocused && diff >= config.delayOffset) || !shownAfterLaunch) {
50 debug(`App will be delayed for ${config.delayDuration / 1000}s`);
51
52 setVisibility(true);
53
54 timeLastDelay = moment();
55 shownAfterLaunch = true;
56
57 setTimeout(() => {
58 debug('Resetting app delay');
59
60 setVisibility(false);
61 }, DEFAULT_FEATURES_CONFIG.needToWaitToProceedConfig.wait + 1000); // timer needs to be able to hit 0
62 }
63 });
64 }
65 },
66 );
67}
68
69export const Component = DelayAppComponent;
70
diff --git a/src/features/delayApp/styles.js b/src/features/delayApp/styles.js
new file mode 100644
index 000000000..5c214cfdf
--- /dev/null
+++ b/src/features/delayApp/styles.js
@@ -0,0 +1,23 @@
1export default theme => ({
2 container: {
3 background: theme.colorBackground,
4 position: 'absolute',
5 top: 0,
6 width: '100%',
7 display: 'flex',
8 'flex-direction': 'column',
9 'align-items': 'center',
10 'justify-content': 'center',
11 'z-index': 150,
12 },
13 headline: {
14 color: theme.colorHeadline,
15 margin: [25, 0, 40],
16 'max-width': 500,
17 'text-align': 'center',
18 'line-height': '1.3em',
19 },
20 button: {
21 margin: [40, 0, 20],
22 },
23});
diff --git a/src/features/serviceProxy/index.js b/src/features/serviceProxy/index.js
new file mode 100644
index 000000000..cad9844fd
--- /dev/null
+++ b/src/features/serviceProxy/index.js
@@ -0,0 +1,45 @@
1import { autorun, observable } from 'mobx';
2import { remote } from 'electron';
3
4import { DEFAULT_FEATURES_CONFIG } from '../../config';
5
6const { session } = remote;
7
8const debug = require('debug')('Franz:feature:serviceProxy');
9
10export const config = observable({
11 isEnabled: DEFAULT_FEATURES_CONFIG.isServiceProxyEnabled,
12 isPremium: DEFAULT_FEATURES_CONFIG.isServiceProxyPremiumFeature,
13});
14
15export default function init(stores) {
16 debug('Initializing `serviceProxy` feature');
17
18 autorun(() => {
19 const { isServiceProxyEnabled, isServiceProxyPremiumFeature } = stores.features.features;
20
21 config.isEnabled = isServiceProxyEnabled !== undefined ? isServiceProxyEnabled : DEFAULT_FEATURES_CONFIG.isServiceProxyEnabled;
22 config.isPremium = isServiceProxyPremiumFeature !== undefined ? isServiceProxyPremiumFeature : DEFAULT_FEATURES_CONFIG.isServiceProxyPremiumFeature;
23
24 const services = stores.services.all;
25 const isPremiumUser = stores.user.data.isPremium;
26
27 services.forEach((service) => {
28 const s = session.fromPartition(`persist:service-${service.id}`);
29 let proxyHost = 'direct://';
30
31 if (config.isEnabled && (isPremiumUser || !config.isPremium)) {
32 const serviceProxyConfig = stores.settings.proxy[service.id];
33
34 if (serviceProxyConfig && serviceProxyConfig.isEnabled && serviceProxyConfig.host) {
35 proxyHost = serviceProxyConfig.host;
36 }
37 }
38
39 s.setProxy({ proxyRules: proxyHost }, (e) => {
40 debug(`Using proxy "${proxyHost}" for "${service.name}" (${service.id})`, e);
41 });
42 });
43 });
44}
45
diff --git a/src/features/spellchecker/index.js b/src/features/spellchecker/index.js
new file mode 100644
index 000000000..63506103c
--- /dev/null
+++ b/src/features/spellchecker/index.js
@@ -0,0 +1,27 @@
1import { autorun, observable } from 'mobx';
2
3import { DEFAULT_FEATURES_CONFIG } from '../../config';
4
5const debug = require('debug')('Franz:feature:spellchecker');
6
7export const config = observable({
8 isPremiumFeature: DEFAULT_FEATURES_CONFIG.isSpellcheckerPremiumFeature,
9});
10
11export default function init(stores) {
12 debug('Initializing `spellchecker` feature');
13
14 autorun(() => {
15 const { isSpellcheckerPremiumFeature } = stores.features.features;
16
17 config.isPremiumFeature = isSpellcheckerPremiumFeature !== undefined ? isSpellcheckerPremiumFeature : DEFAULT_FEATURES_CONFIG.isSpellcheckerPremiumFeature;
18
19 if (!stores.user.data.isPremium && config.isPremiumFeature && stores.settings.app.enableSpellchecking) {
20 debug('Override settings.spellcheckerEnabled flag to false');
21
22 Object.assign(stores.settings.app, {
23 enableSpellchecking: false,
24 });
25 }
26 });
27}
diff --git a/src/helpers/i18n-helpers.js b/src/helpers/i18n-helpers.js
new file mode 100644
index 000000000..00a2061c1
--- /dev/null
+++ b/src/helpers/i18n-helpers.js
@@ -0,0 +1,27 @@
1export function getLocale({ locale, locales, defaultLocale, fallbackLocale }) {
2 let localeStr = locale;
3 if (locales[locale] === undefined) {
4 let localeFuzzy;
5 Object.keys(locales).forEach((localStr) => {
6 if (locales && Object.hasOwnProperty.call(locales, localStr)) {
7 if (locale.substring(0, 2) === localStr.substring(0, 2)) {
8 localeFuzzy = localStr;
9 }
10 }
11 });
12
13 if (localeFuzzy !== undefined) {
14 localeStr = localeFuzzy;
15 }
16 }
17
18 if (locales[localeStr] === undefined) {
19 localeStr = defaultLocale;
20 }
21
22 if (!localeStr) {
23 localeStr = fallbackLocale;
24 }
25
26 return localeStr;
27}
diff --git a/src/helpers/visibility-helper.js b/src/helpers/visibility-helper.js
new file mode 100644
index 000000000..8456c4ecf
--- /dev/null
+++ b/src/helpers/visibility-helper.js
@@ -0,0 +1,27 @@
1export function onVisibilityChange(cb) {
2 let isVisible = true;
3
4 if (!cb) {
5 throw new Error('no callback given');
6 }
7
8 function focused() {
9 if (!isVisible) {
10 cb(isVisible = true);
11 }
12 }
13
14 function unfocused() {
15 if (isVisible) {
16 cb(isVisible = false);
17 }
18 }
19
20 document.addEventListener('visibilitychange', () => { (document.hidden ? unfocused : focused)(); });
21
22 window.onpageshow = focused;
23 window.onfocus = focused;
24
25 window.onpagehid = unfocused;
26 window.onblur = unfocused;
27}
diff --git a/src/i18n/languages.js b/src/i18n/languages.js
index 34b369da7..b262df01e 100644
--- a/src/i18n/languages.js
+++ b/src/i18n/languages.js
@@ -27,45 +27,43 @@ export const APP_LOCALES = {
27 es: 'Español', 27 es: 'Español',
28}; 28};
29 29
30export default APP_LOCALES; 30// Hunspell compatible keys
31export const SPELLCHECKER_LOCALES = {
32 'bg-bg': 'българÑки език',
33 'ca-es': 'Català',
34 'cs-cz': 'Čeština',
35 'da-dk': 'Dansk',
36 'de-de': 'Deutsch',
37 'el-gr': 'λληνικά (Greek)',
38 'en-us': 'English',
39 'es-es': 'Español',
40 'et-ee': 'Estonian',
41 'fa-ir': 'Ùارسی (Persian)',
42 'fo-fo': 'Faroese',
43 'fr-fr': 'Français',
44 'he-il': 'עברית (Hebrew)',
45 'hr-hr': 'Hrvatski jezik',
46 'hu-hu': 'Magyar',
47 'it-it': 'Italiano',
48 ko: 'Korean',
49 'lt-lt': 'Lietuvių kalba',
50 'lv-lv': 'Latviešu valoda',
51 'nb-no': 'Norsk bokmål',
52 'nl-nl': 'Nederlands',
53 'pl-pl': 'Język polski',
54 'pt-br': 'Português (Brazil)',
55 'pt-pt': 'Português',
56 'ro-ro': 'Limba română',
57 'ru-ru': 'РуÑÑкий (Russian)',
58 'sk-sk': 'SlovenÄina',
59 'sl-si': 'Slovenski jezik',
60 sr: 'СрпÑки језик (Serbian)',
61 'sv-se': 'Svenska',
62 'ta-in': 'தமிழ௠(Tamil)',
63 'tg-tg': 'Тоҷикӣ (Tajik)',
64 tr: 'Türkçe',
65 'uk-ua': 'УкраїнÑька (Ukrainian)',
66 vi: 'Tiếng Việt',
67};
31 68
32// export const SPELLCHECKER_LOCALES = { 69export default APP_LOCALES;
33// af: 'Afrikaans',
34// sq: 'Albanian',
35// ar: 'Arabic',
36// bg: 'Bulgarian',
37// zh: 'Chinese',
38// hr: 'Croatian',
39// cs: 'Czech',
40// da: 'Danish',
41// nl: 'Dutch',
42// en: 'English',
43// 'en-AU': 'English (AU)',
44// 'en-CA': 'English (CA)',
45// 'en-GB': 'English (GB)',
46// fi: 'Finnish',
47// fr: 'French',
48// ka: 'Georgian',
49// de: 'German',
50// el: 'Greek, Modern',
51// hi: 'Hindi',
52// hu: 'Hungarian',
53// id: 'Indonesian',
54// it: 'Italian',
55// ja: 'Japanese',
56// jv: 'Javanese',
57// ko: 'Korean',
58// lt: 'Lithuanian',
59// lv: 'Latvian',
60// ms: 'Malay',
61// no: 'Norwegian',
62// pl: 'Polish',
63// pt: 'Portuguese',
64// ro: 'Romanian, Moldavian, Moldovan',
65// ru: 'Russian',
66// sk: 'Slovak',
67// es: 'Spanish',
68// sv: 'Swedish',
69// uk: 'Ukrainian',
70// vi: 'Vietnamese',
71// };
diff --git a/src/i18n/locales/ca.json b/src/i18n/locales/ca.json
index 4ea3eb1a7..117e66d76 100644
--- a/src/i18n/locales/ca.json
+++ b/src/i18n/locales/ca.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "No es pot connectar amb els serveis en línia de Franz", 5 "global.api.unhealthy" : "No es pot connectar amb els serveis en línia de Franz",
3 "global.notConnectedToTheInternet" : "No esteu connectat a Internet.", 6 "global.notConnectedToTheInternet" : "No esteu connectat a Internet.",
4 "import.headline" : "Importa els teus serveis Franz 4", 7 "import.headline" : "Importa els teus serveis Franz 4",
@@ -7,23 +10,23 @@
7 "import.submit.label" : "Importa serveis", 10 "import.submit.label" : "Importa serveis",
8 "infobar.buttonChangelog" : "Que hi ha de nou?", 11 "infobar.buttonChangelog" : "Que hi ha de nou?",
9 "infobar.buttonInstallUpdate" : "Reinicia i instal·la l'actualització", 12 "infobar.buttonInstallUpdate" : "Reinicia i instal·la l'actualització",
10 "infobar.buttonReloadServices" : "Recarrega serveis", 13 "infobar.buttonReloadServices" : "Recarrega els serveis",
11 "infobar.requiredRequestsFailed" : "No s'han pogut carregar els serveis i la informació de l'usuari", 14 "infobar.requiredRequestsFailed" : "No s'han pogut carregar els serveis i la informació de l'usuari",
12 "infobar.servicesUpdated" : "Els vostres serveis s'han actualitzat.", 15 "infobar.servicesUpdated" : "Els teus serveis s'han actualitzat.",
13 "infobar.updateAvailable" : "Hi ha disponible una nova actualització per a Franz.", 16 "infobar.updateAvailable" : "Hi ha disponible una nova actualització per a Franz.",
14 "invite.email.label" : "Correu electrònic", 17 "invite.email.label" : "Correu electrònic",
15 "invite.headline.friends" : "Convida 3 dels teus amics o companys", 18 "invite.headline.friends" : "Convida a tres dels teus amics o companys",
16 "invite.name.label" : "Nom", 19 "invite.name.label" : "Nom",
17 "invite.skip.label" : "Vull fer-ho més tard", 20 "invite.skip.label" : "Ho vull fer més tard",
18 "invite.submit.label" : "Enviar invitacions", 21 "invite.submit.label" : "Enviar invitacions",
19 "invite.successInfo" : "Invitacions enviades correctament", 22 "invite.successInfo" : "Invitacions enviades correctament",
20 "login.email.label" : "Correu electrònic", 23 "login.email.label" : "Correu electrònic",
21 "login.headline" : "Accedir", 24 "login.headline" : "Accedir-hi",
22 "login.invalidCredentials" : "El correu electrònic o la contrasenya no són vàlids", 25 "login.invalidCredentials" : "El correu electrònic o la contrasenya no són vàlids",
23 "login.link.password" : "Restablir contrasenya", 26 "login.link.password" : "Restablir la contrasenya",
24 "login.link.signup" : "Crea un compte gratuït", 27 "login.link.signup" : "Crea un compte gratuït",
25 "login.password.label" : "Contrasenya", 28 "login.password.label" : "Contrasenya",
26 "login.serverLogout" : "La teva sessió ha caducat, torna a iniciar la sessió.", 29 "login.serverLogout" : "La teva sessió ha caducat, torna-la a iniciar.",
27 "login.submit.label" : "Accedir", 30 "login.submit.label" : "Accedir",
28 "login.tokenExpired" : "La teva sessió ha caducat, torna a iniciar la sessió.", 31 "login.tokenExpired" : "La teva sessió ha caducat, torna a iniciar la sessió.",
29 "menu.app.about" : "Sobre Franz", 32 "menu.app.about" : "Sobre Franz",
@@ -76,6 +79,7 @@
76 "password.noUser" : "No s'ha trobat cap usuari amb aquesta adreça de correu electrònic", 79 "password.noUser" : "No s'ha trobat cap usuari amb aquesta adreça de correu electrònic",
77 "password.submit.label" : "Enviar", 80 "password.submit.label" : "Enviar",
78 "password.successInfo" : "Comproveu el vostre correu electrònic", 81 "password.successInfo" : "Comproveu el vostre correu electrònic",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Donar suport a Franz", 83 "pricing.headline" : "Donar suport a Franz",
80 "pricing.link.skipPayment" : "No vull donar suport al desenvolupament de Franz.", 84 "pricing.link.skipPayment" : "No vull donar suport al desenvolupament de Franz.",
81 "pricing.submit.label" : "Vull donar suport al desenvolupament de Franz", 85 "pricing.submit.label" : "Vull donar suport al desenvolupament de Franz",
@@ -116,7 +120,8 @@
116 "settings.app.form.autoLaunchInBackground" : "Obrir en segon plà", 120 "settings.app.form.autoLaunchInBackground" : "Obrir en segon plà",
117 "settings.app.form.autoLaunchOnStart" : "Iniciar Franz a l'inici", 121 "settings.app.form.autoLaunchOnStart" : "Iniciar Franz a l'inici",
118 "settings.app.form.beta" : "Inclou versions beta", 122 "settings.app.form.beta" : "Inclou versions beta",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
124 "settings.app.form.enableGPUAcceleration" : "Activar acceleració GPU",
120 "settings.app.form.enableMenuBar" : "Mostra Franz a la barra de menú", 125 "settings.app.form.enableMenuBar" : "Mostra Franz a la barra de menú",
121 "settings.app.form.enableSpellchecking" : "Habilita la comprobació ortogràfica", 126 "settings.app.form.enableSpellchecking" : "Habilita la comprobació ortogràfica",
122 "settings.app.form.enableSystemTray" : "Mostra Franz a la safata del sistema", 127 "settings.app.form.enableSystemTray" : "Mostra Franz a la safata del sistema",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "Mantén a Franz en segon pla en tancar la finestra", 131 "settings.app.form.runInBackground" : "Mantén a Franz en segon pla en tancar la finestra",
127 "settings.app.form.showDisabledServices" : "Mostra les pestanyes dels serveis desactivats", 132 "settings.app.form.showDisabledServices" : "Mostra les pestanyes dels serveis desactivats",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra la insígnia de missatges no llegits quan les notificacions estiguin desactivades", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra la insígnia de missatges no llegits quan les notificacions estiguin desactivades",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Configuració", 135 "settings.app.headline" : "Configuració",
130 "settings.app.headlineAdvanced" : "Avançat", 136 "settings.app.headlineAdvanced" : "Avançat",
131 "settings.app.headlineAppearance" : "Aparença", 137 "settings.app.headlineAppearance" : "Aparença",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "Edita {name}", 172 "settings.service.form.editServiceHeadline" : "Edita {name}",
167 "settings.service.form.enableAudio" : "Activa l'àudio", 173 "settings.service.form.enableAudio" : "Activa l'àudio",
168 "settings.service.form.enableBadge" : "Mostra les insígnies als missatges no llegits.", 174 "settings.service.form.enableBadge" : "Mostra les insígnies als missatges no llegits.",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Activa les notificacions", 176 "settings.service.form.enableNotification" : "Activa les notificacions",
170 "settings.service.form.enableService" : "Activa el servei", 177 "settings.service.form.enableService" : "Activa el servei",
171 "settings.service.form.headlineBadges" : "Insígnies de missatges no llegits", 178 "settings.service.form.headlineBadges" : "Insígnies de missatges no llegits",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Mostra la insígnia de missatge per a tots els missatges nous", 185 "settings.service.form.indirectMessages" : "Mostra la insígnia de missatge per a tots els missatges nous",
179 "settings.service.form.isMutedInfo" : "Quan es desactiva, tots els sons de notificació i reproducció d'àudio es silenciaran", 186 "settings.service.form.isMutedInfo" : "Quan es desactiva, tots els sons de notificació i reproducció d'àudio es silenciaran",
180 "settings.service.form.name" : "Nom", 187 "settings.service.form.name" : "Nom",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Desa el servei", 194 "settings.service.form.saveButton" : "Desa el servei",
182 "settings.service.form.tabHosted" : "Allotjat", 195 "settings.service.form.tabHosted" : "Allotjat",
183 "settings.service.form.tabOnPremise" : "Allotjat per si mateix â­ï¸", 196 "settings.service.form.tabOnPremise" : "Allotjat per si mateix â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Residents d'EU: es poden aplicar impostos locals", 233 "subscription.euTaxInfo" : "Residents d'EU: es poden aplicar impostos locals",
221 "subscription.features.ads" : "Sense anuncis, mai!", 234 "subscription.features.ads" : "Sense anuncis, mai!",
222 "subscription.features.comingSoon" : "properament", 235 "subscription.features.comingSoon" : "properament",
223 "subscription.features.customServices" : "Serveis privats per a vostè i el seu equip",
224 "subscription.features.encryptedSync" : "Sincronització de sessió xifrada", 236 "subscription.features.encryptedSync" : "Sincronització de sessió xifrada",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Afegiu serveis en premissa\/allotjats com HipChat", 238 "subscription.features.onpremise" : "Afegiu serveis en premissa\/allotjats com HipChat",
226 "subscription.features.vpn" : "Compatibilitat amb proxy i VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "El compte de pagament Franz Premium Supporter inclou", 242 "subscription.includedFeatures" : "El compte de pagament Franz Premium Supporter inclou",
228 "subscription.paymentSessionError" : "No s'ha pogut inicialitzar el formulari de pagament", 243 "subscription.paymentSessionError" : "No s'ha pogut inicialitzar el formulari de pagament",
229 "subscription.submit.label" : "Vull donar suport al desenvolupament de Franz", 244 "subscription.submit.label" : "Vull donar suport al desenvolupament de Franz",
diff --git a/src/i18n/locales/cs.json b/src/i18n/locales/cs.json
index ed4c7a468..eb8088e28 100644
--- a/src/i18n/locales/cs.json
+++ b/src/i18n/locales/cs.json
@@ -1,5 +1,8 @@
1{ 1{
2 "global.api.unhealthy" : "Nemůžeme Franz připojit k online službám", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "global.api.unhealthy" : "Nemůžeme připojit Franz k online službám",
3 "global.notConnectedToTheInternet" : "Připojení k internetu není k dispozici.", 6 "global.notConnectedToTheInternet" : "Připojení k internetu není k dispozici.",
4 "import.headline" : "Importovat služby z Franz 4", 7 "import.headline" : "Importovat služby z Franz 4",
5 "import.notSupportedHeadline" : "Služby nejsou podporovány ve verzi Franz 5", 8 "import.notSupportedHeadline" : "Služby nejsou podporovány ve verzi Franz 5",
@@ -11,13 +14,13 @@
11 "infobar.requiredRequestsFailed" : "Není možné nahrát služby a informace o uživateli", 14 "infobar.requiredRequestsFailed" : "Není možné nahrát služby a informace o uživateli",
12 "infobar.servicesUpdated" : "Vaše služby byly aktualizovány", 15 "infobar.servicesUpdated" : "Vaše služby byly aktualizovány",
13 "infobar.updateAvailable" : "Nová aktualizace Franz je k dispozici", 16 "infobar.updateAvailable" : "Nová aktualizace Franz je k dispozici",
14 "invite.email.label" : "Email", 17 "invite.email.label" : "E-mailová adresa",
15 "invite.headline.friends" : "Pozvěte 3 přátele nebo kolegy", 18 "invite.headline.friends" : "Pozvěte 3 přátele nebo kolegy",
16 "invite.name.label" : "Jméno", 19 "invite.name.label" : "Jméno",
17 "invite.skip.label" : "Nechat na později", 20 "invite.skip.label" : "Nechat na později",
18 "invite.submit.label" : "Poslat pozvánky", 21 "invite.submit.label" : "Poslat pozvánky",
19 "invite.successInfo" : "Pozvánky byly úspěšně odeslány.", 22 "invite.successInfo" : "Pozvánky byly úspěšně odeslány.",
20 "login.email.label" : "Email", 23 "login.email.label" : "E-mailová adresa",
21 "login.headline" : "Přihlásit se", 24 "login.headline" : "Přihlásit se",
22 "login.invalidCredentials" : "Email nebo heslo nesouhlasí", 25 "login.invalidCredentials" : "Email nebo heslo nesouhlasí",
23 "login.link.password" : "Obnovit heslo", 26 "login.link.password" : "Obnovit heslo",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Pro emailovou adresu nebyl nalezený žádný uživatel", 79 "password.noUser" : "Pro emailovou adresu nebyl nalezený žádný uživatel",
77 "password.submit.label" : "Odeslat", 80 "password.submit.label" : "Odeslat",
78 "password.successInfo" : "Prosím, zkontrolujte svůj e-mail", 81 "password.successInfo" : "Prosím, zkontrolujte svůj e-mail",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Podpořit Franz", 83 "pricing.headline" : "Podpořit Franz",
80 "pricing.link.skipPayment" : "Nechci podporovat vývoj aplikace Franz.", 84 "pricing.link.skipPayment" : "Nechci podporovat vývoj aplikace Franz.",
81 "pricing.submit.label" : "Chci podpořit vývoj aplikace Franz", 85 "pricing.submit.label" : "Chci podpořit vývoj aplikace Franz",
@@ -116,6 +120,7 @@
116 "settings.app.form.autoLaunchInBackground" : "Spustit na pozadí", 120 "settings.app.form.autoLaunchInBackground" : "Spustit na pozadí",
117 "settings.app.form.autoLaunchOnStart" : "Spustit Franz při startu", 121 "settings.app.form.autoLaunchOnStart" : "Spustit Franz při startu",
118 "settings.app.form.beta" : "Zahrnout beta verze", 122 "settings.app.form.beta" : "Zahrnout beta verze",
123 "settings.app.form.darkMode" : "Join the Dark Side",
119 "settings.app.form.enableGPUAcceleration" : "Aktivovat GPU zrychlení", 124 "settings.app.form.enableGPUAcceleration" : "Aktivovat GPU zrychlení",
120 "settings.app.form.enableMenuBar" : "Zobraz Franz v Menu nabídce", 125 "settings.app.form.enableMenuBar" : "Zobraz Franz v Menu nabídce",
121 "settings.app.form.enableSpellchecking" : "Zapnout kontrolu pravopisu", 126 "settings.app.form.enableSpellchecking" : "Zapnout kontrolu pravopisu",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "Ponechat Franze v pozadí při zavírání okna", 131 "settings.app.form.runInBackground" : "Ponechat Franze v pozadí při zavírání okna",
127 "settings.app.form.showDisabledServices" : "Zobrazit záložky vypnutých služeb", 132 "settings.app.form.showDisabledServices" : "Zobrazit záložky vypnutých služeb",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Zobrazit odznak pro nepÅ™eÄtené zprávy když jsou upozornÄ›ní vypnutá", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Zobrazit odznak pro nepÅ™eÄtené zprávy když jsou upozornÄ›ní vypnutá",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Nastavení", 135 "settings.app.headline" : "Nastavení",
130 "settings.app.headlineAdvanced" : "PokroÄilé", 136 "settings.app.headlineAdvanced" : "PokroÄilé",
131 "settings.app.headlineAppearance" : "Vzhled", 137 "settings.app.headlineAppearance" : "Vzhled",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "Upravit {name}", 172 "settings.service.form.editServiceHeadline" : "Upravit {name}",
167 "settings.service.form.enableAudio" : "Zapnout zvuk", 173 "settings.service.form.enableAudio" : "Zapnout zvuk",
168 "settings.service.form.enableBadge" : "Ukázat odznaky nepÅ™eÄtených zpráv", 174 "settings.service.form.enableBadge" : "Ukázat odznaky nepÅ™eÄtených zpráv",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Povolit upozornění", 176 "settings.service.form.enableNotification" : "Povolit upozornění",
170 "settings.service.form.enableService" : "Povolit službu", 177 "settings.service.form.enableService" : "Povolit službu",
171 "settings.service.form.headlineBadges" : "Odznaky nepÅ™eÄtených zpráv", 178 "settings.service.form.headlineBadges" : "Odznaky nepÅ™eÄtených zpráv",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Zobrazovat znak zprávy pro všechny nové zprávy", 185 "settings.service.form.indirectMessages" : "Zobrazovat znak zprávy pro všechny nové zprávy",
179 "settings.service.form.isMutedInfo" : "Pokud je vypnuto, všechny zvuky notifikací a jiného audia budou ztišeny", 186 "settings.service.form.isMutedInfo" : "Pokud je vypnuto, všechny zvuky notifikací a jiného audia budou ztišeny",
180 "settings.service.form.name" : "Jméno", 187 "settings.service.form.name" : "Jméno",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Uložit službu", 194 "settings.service.form.saveButton" : "Uložit službu",
182 "settings.service.form.tabHosted" : "Hostováno", 195 "settings.service.form.tabHosted" : "Hostováno",
183 "settings.service.form.tabOnPremise" : "SamostatnÄ› hostované â­ï¸", 196 "settings.service.form.tabOnPremise" : "SamostatnÄ› hostované â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Pro obyvatelé EU: mohou být aplikovány lokální daně", 233 "subscription.euTaxInfo" : "Pro obyvatelé EU: mohou být aplikovány lokální daně",
221 "subscription.features.ads" : "Žádné reklamy, nikdy!", 234 "subscription.features.ads" : "Žádné reklamy, nikdy!",
222 "subscription.features.comingSoon" : "již brzy", 235 "subscription.features.comingSoon" : "již brzy",
223 "subscription.features.customServices" : "Privátní služby pro vás a váš tým",
224 "subscription.features.encryptedSync" : "Šifrovaná synchronizace relací", 236 "subscription.features.encryptedSync" : "Šifrovaná synchronizace relací",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Přidat hostované služby jako HipChat", 238 "subscription.features.onpremise" : "Přidat hostované služby jako HipChat",
226 "subscription.features.vpn" : "Proxy & VPN podpora", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Placený úÄet Premium Supporter Franz zahrnuje", 242 "subscription.includedFeatures" : "Placený úÄet Premium Supporter Franz zahrnuje",
228 "subscription.paymentSessionError" : "Nebylo možné inicializovat platbu od", 243 "subscription.paymentSessionError" : "Nebylo možné inicializovat platbu od",
229 "subscription.submit.label" : "Chci podpořit vývoj aplikace Franz", 244 "subscription.submit.label" : "Chci podpořit vývoj aplikace Franz",
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index fa61d26d4..6aa909519 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -1,37 +1,40 @@
1{ 1{
2 "feature.delayApp.action" : "Upgrade deinen Account",
3 "feature.delayApp.headline" : "Erspare dir das Warten mit einer Franz Supporter Lizenz",
4 "feature.delayApp.text" : "Es geht in {seconds} Sekunden weiter.",
2 "global.api.unhealthy" : "Verbindung mit dem Franz Online Service fehlgeschlagen", 5 "global.api.unhealthy" : "Verbindung mit dem Franz Online Service fehlgeschlagen",
3 "global.notConnectedToTheInternet" : "Du bist nicht mit dem Internet verbunden.", 6 "global.notConnectedToTheInternet" : "Du bist nicht mit dem Internet verbunden.",
4 "import.headline" : "Deine Franz 4 Dienste importieren", 7 "import.headline" : "Deine Franz 4 Dienste importieren",
5 "import.notSupportedHeadline" : "Dienste, die noch nicht von Franz 5 unterstützt werden", 8 "import.notSupportedHeadline" : "Dienste, die noch nicht von Franz 5 unterstützt werden",
6 "import.skip.label" : "Ich möchte Dienste selbst hinzufügen", 9 "import.skip.label" : "Ich möchte Dienste selbst hinzufügen",
7 "import.submit.label" : "Dienste importieren", 10 "import.submit.label" : "Dienste importieren",
8 "infobar.buttonChangelog" : "Was gibt es neues?", 11 "infobar.buttonChangelog" : "Was ist neu?",
9 "infobar.buttonInstallUpdate" : "Neu starten & Update installieren", 12 "infobar.buttonInstallUpdate" : "Neu starten & Update installieren",
10 "infobar.buttonReloadServices" : "Dienste neuladen", 13 "infobar.buttonReloadServices" : "Dienste neuladen",
11 "infobar.requiredRequestsFailed" : "Dienste und Benutzerinformationen konnten nicht geladen werden", 14 "infobar.requiredRequestsFailed" : "Dienste und Benutzerinformationen konnten nicht geladen werden",
12 "infobar.servicesUpdated" : "Deine Dienste wurden aktualisiert.", 15 "infobar.servicesUpdated" : "Deine Dienste wurden aktualisiert.",
13 "infobar.updateAvailable" : "Eine neue Version von Franz ist verfügbar.", 16 "infobar.updateAvailable" : "Eine neue Version von Franz ist verfügbar.",
14 "invite.email.label" : "E-Mail Adresse", 17 "invite.email.label" : "E-Mail-Adresse",
15 "invite.headline.friends" : "Lade 3 Freunde ein", 18 "invite.headline.friends" : "Lade 3 Freunde oder Kollegen ein",
16 "invite.name.label" : "Name", 19 "invite.name.label" : "Name",
17 "invite.skip.label" : "Ich möchte das später tun", 20 "invite.skip.label" : "Ich möchte das später tun",
18 "invite.submit.label" : "Einladungen schicken", 21 "invite.submit.label" : "Einladungen schicken",
19 "invite.successInfo" : "Einladungen wurden erfolgreich gesendet, vielen Dank.", 22 "invite.successInfo" : "Die Einladungen wurden erfolgreich gesendet.",
20 "login.email.label" : "E-Mail Adresse", 23 "login.email.label" : "E-Mail-Adresse",
21 "login.headline" : "Anmelden", 24 "login.headline" : "Anmelden",
22 "login.invalidCredentials" : "E-Mail Adresse oder Passwort ungültig", 25 "login.invalidCredentials" : "E-Mail Adresse oder Passwort ungültig",
23 "login.link.password" : "Passwort zurücksetzen", 26 "login.link.password" : "Passwort zurücksetzen",
24 "login.link.signup" : "Kostenloses Konto erstellen", 27 "login.link.signup" : "Kostenloses Konto erstellen",
25 "login.password.label" : "Passwort", 28 "login.password.label" : "Passwort",
26 "login.serverLogout" : "Deine Sitzung ist abgelaufen, bitte melde dich erneut an.", 29 "login.serverLogout" : "Deine Sitzung ist abgelaufen, bitte melde Dich erneut an.",
27 "login.submit.label" : "Anmelden", 30 "login.submit.label" : "Anmelden",
28 "login.tokenExpired" : "Deine Sitzung ist abgelaufen, bitte melde dich erneut an.", 31 "login.tokenExpired" : "Deine Sitzung ist abgelaufen, bitte melde Dich erneut an.",
29 "menu.app.about" : "Ãœber Franz", 32 "menu.app.about" : "Ãœber Franz",
30 "menu.app.hide" : "Franz ausblenden", 33 "menu.app.hide" : "Ausblenden",
31 "menu.app.hideOthers" : "Andere ausblenden", 34 "menu.app.hideOthers" : "Andere ausblenden",
32 "menu.app.quit" : "Franz Beenden", 35 "menu.app.quit" : "Beenden",
33 "menu.app.settings" : "Einstellungen", 36 "menu.app.settings" : "Einstellungen",
34 "menu.app.unhide" : "Alle einblenden", 37 "menu.app.unhide" : "Einblenden",
35 "menu.edit" : "Bearbeiten", 38 "menu.edit" : "Bearbeiten",
36 "menu.edit.copy" : "Kopieren", 39 "menu.edit.copy" : "Kopieren",
37 "menu.edit.cut" : "Ausschneiden", 40 "menu.edit.cut" : "Ausschneiden",
@@ -42,7 +45,7 @@
42 "menu.edit.redo" : "Wiederholen", 45 "menu.edit.redo" : "Wiederholen",
43 "menu.edit.selectAll" : "Alle auswählen", 46 "menu.edit.selectAll" : "Alle auswählen",
44 "menu.edit.speech" : "Sprachausgabe", 47 "menu.edit.speech" : "Sprachausgabe",
45 "menu.edit.startDictation" : "Diktat starten ...", 48 "menu.edit.startDictation" : "Diktat starten",
46 "menu.edit.startSpeaking" : "Sprachausgabe starten", 49 "menu.edit.startSpeaking" : "Sprachausgabe starten",
47 "menu.edit.stopSpeaking" : "Sprachausgabe stoppen", 50 "menu.edit.stopSpeaking" : "Sprachausgabe stoppen",
48 "menu.edit.undo" : "Widerrufen", 51 "menu.edit.undo" : "Widerrufen",
@@ -71,15 +74,16 @@
71 "menu.window.minimize" : "Minimieren", 74 "menu.window.minimize" : "Minimieren",
72 "password.email.label" : "E-Mail Adresse", 75 "password.email.label" : "E-Mail Adresse",
73 "password.headline" : "Passwort zurücksetzen", 76 "password.headline" : "Passwort zurücksetzen",
74 "password.link.login" : "An deinem Konto anmelden", 77 "password.link.login" : "An Deinem Konto anmelden",
75 "password.link.signup" : "Kostenloses Konto erstellen", 78 "password.link.signup" : "Kostenloses Konto erstellen",
76 "password.noUser" : "Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden.", 79 "password.noUser" : "Es wurde kein Benutzer mit dieser E-Mail-Adresse gefunden.",
77 "password.submit.label" : "Absenden", 80 "password.submit.label" : "Absenden",
78 "password.successInfo" : "Wir haben dir eine E-Mail mit weiteren Anweisungen geschickt.", 81 "password.successInfo" : "Wir haben Dir eine E-Mail mit weiteren Anweisungen geschickt.",
82 "premiumFeature.button.upgradeAccount" : "Account upgraden",
79 "pricing.headline" : "Franz unterstützen", 83 "pricing.headline" : "Franz unterstützen",
80 "pricing.link.skipPayment" : "Ich möchte die Entwicklung von Franz nicht unterstützen.", 84 "pricing.link.skipPayment" : "Ich möchte die Entwicklung von Franz nicht unterstützen.",
81 "pricing.submit.label" : "Ich möchte die Entwicklung von Franz unterstützen.", 85 "pricing.submit.label" : "Ich möchte die Entwicklung von Franz unterstützen.",
82 "pricing.support.label" : "Wie möchtest du Franz unterstützen?", 86 "pricing.support.label" : "Wie möchtest Du Franz unterstützen?",
83 "service.crashHandler.action" : "{name} neuladen", 87 "service.crashHandler.action" : "{name} neuladen",
84 "service.crashHandler.autoReload" : "{name} wird in {seconds} Sekunden automatisch wiederhergestellt", 88 "service.crashHandler.autoReload" : "{name} wird in {seconds} Sekunden automatisch wiederhergestellt",
85 "service.crashHandler.headline" : "Oh nein!", 89 "service.crashHandler.headline" : "Oh nein!",
@@ -93,8 +97,8 @@
93 "settings.account.accountType.premium" : "Premium-Supporter Konto", 97 "settings.account.accountType.premium" : "Premium-Supporter Konto",
94 "settings.account.buttonSave" : "Profil aktualisieren", 98 "settings.account.buttonSave" : "Profil aktualisieren",
95 "settings.account.deleteAccount" : "Benutzerkonto löschen", 99 "settings.account.deleteAccount" : "Benutzerkonto löschen",
96 "settings.account.deleteEmailSent" : "Du hast eine Email zur Bestätigung der Löschung deines Benutzerkontos erhalten. Dein Benutzerkonto und deine Daten können nach der Löschung nicht wiederhergestellt werden!", 100 "settings.account.deleteEmailSent" : "Du hast eine Email zur Bestätigung der Löschung Deines Benutzerkontos erhalten. Dein Benutzerkonto und Deine Daten können nach der Löschung nicht wiederhergestellt werden!",
97 "settings.account.deleteInfo" : "Hier kannst du dein Franz Benutzerkonto, und alle dazugehörigen Daten, löschen.", 101 "settings.account.deleteInfo" : "Wenn du dein Franz Benutzerkonto nicht mehr länger benötigst, kannst du hier deinen Account und alle dazugehörigen Daten löschen.",
98 "settings.account.headline" : "Konto", 102 "settings.account.headline" : "Konto",
99 "settings.account.headlineAccount" : "Konto Informationen", 103 "settings.account.headlineAccount" : "Konto Informationen",
100 "settings.account.headlineDangerZone" : "Benutzerkonto löschen", 104 "settings.account.headlineDangerZone" : "Benutzerkonto löschen",
@@ -116,29 +120,31 @@
116 "settings.app.form.autoLaunchInBackground" : "Im Hintergrund öffnen", 120 "settings.app.form.autoLaunchInBackground" : "Im Hintergrund öffnen",
117 "settings.app.form.autoLaunchOnStart" : "Franz beim Systemstart ausführen", 121 "settings.app.form.autoLaunchOnStart" : "Franz beim Systemstart ausführen",
118 "settings.app.form.beta" : "Beta-Versionen einbeziehen", 122 "settings.app.form.beta" : "Beta-Versionen einbeziehen",
123 "settings.app.form.darkMode" : "Die dunkle Seite erwartet dich (Dark Mode)",
119 "settings.app.form.enableGPUAcceleration" : "Hardwarebeschleunigung aktivieren", 124 "settings.app.form.enableGPUAcceleration" : "Hardwarebeschleunigung aktivieren",
120 "settings.app.form.enableMenuBar" : "Franz in Menüleiste anzeigen", 125 "settings.app.form.enableMenuBar" : "Franz in Menüleiste anzeigen",
121 "settings.app.form.enableSpellchecking" : "Rechtschreibprüfung aktivieren", 126 "settings.app.form.enableSpellchecking" : "Rechtschreibprüfung aktivieren",
122 "settings.app.form.enableSystemTray" : "Franz in der Systemleiste anzeigen", 127 "settings.app.form.enableSystemTray" : "Franz in der Taskleiste anzeigen",
123 "settings.app.form.hideDockIcon" : "Franz Icon im Dock ausblenden", 128 "settings.app.form.hideDockIcon" : "Franz Icon im Dock ausblenden",
124 "settings.app.form.language" : "Sprache", 129 "settings.app.form.language" : "Sprache",
125 "settings.app.form.minimizeToSystemTray" : "Franz in die Systemleiste minimieren", 130 "settings.app.form.minimizeToSystemTray" : "Franz in die Systemleiste minimieren",
126 "settings.app.form.runInBackground" : "Franz im Hintergrund behalten, wenn das Fenster geschlossen wird", 131 "settings.app.form.runInBackground" : "Franz im Hintergrund behalten, wenn das Fenster geschlossen wird",
127 "settings.app.form.showDisabledServices" : "Deaktivierte Services-Tabs anzeigen", 132 "settings.app.form.showDisabledServices" : "Deaktivierte Services-Tabs anzeigen",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Ungelesene Nachrichten zeigen, wenn die Benachrichtigungen deaktiviert sind", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Ungelesene Nachrichten zeigen, wenn die Benachrichtigungen deaktiviert sind",
134 "settings.app.form.spellcheckerLanguage" : "Sprache für Rechtschreibprüfung",
129 "settings.app.headline" : "Einstellungen", 135 "settings.app.headline" : "Einstellungen",
130 "settings.app.headlineAdvanced" : "Erweitert", 136 "settings.app.headlineAdvanced" : "Erweitert",
131 "settings.app.headlineAppearance" : "Darstellung", 137 "settings.app.headlineAppearance" : "Darstellung",
132 "settings.app.headlineGeneral" : "Allgemeines", 138 "settings.app.headlineGeneral" : "Allgemeines",
133 "settings.app.headlineLanguage" : "Sprache", 139 "settings.app.headlineLanguage" : "Sprache",
134 "settings.app.headlineUpdates" : "Updates", 140 "settings.app.headlineUpdates" : "Updates",
135 "settings.app.restartRequired" : "Änderungen werden erst nach einem Neustart wirksam. ", 141 "settings.app.restartRequired" : "Änderungen werden erst nach einem Neustart wirksam.",
136 "settings.app.subheadlineCache" : "Cache", 142 "settings.app.subheadlineCache" : "Cache",
137 "settings.app.translationHelp" : "Hilf uns, Franz in deine Sprache zu übersetzen.", 143 "settings.app.translationHelp" : "Hilf uns, Franz in Deine Sprache zu übersetzen.",
138 "settings.app.updateStatusAvailable" : "Update verfügbar, herunterladen...", 144 "settings.app.updateStatusAvailable" : "Update verfügbar, lädt herunter...",
139 "settings.app.updateStatusSearching" : "Suche nach Updates", 145 "settings.app.updateStatusSearching" : "Suche nach Updates",
140 "settings.app.updateStatusUpToDate" : "Du nutzt die aktuellste Version von Franz", 146 "settings.app.updateStatusUpToDate" : "Du nutzt die aktuellste Version von Franz",
141 "settings.invite.headline" : "Lade 3 deiner Freunde ein", 147 "settings.invite.headline" : "Lade 3 Deiner Freunde ein",
142 "settings.navigation.account" : "Konto", 148 "settings.navigation.account" : "Konto",
143 "settings.navigation.availableServices" : "Verfügbare Dienste", 149 "settings.navigation.availableServices" : "Verfügbare Dienste",
144 "settings.navigation.inviteFriends" : "Freunde einladen", 150 "settings.navigation.inviteFriends" : "Freunde einladen",
@@ -150,7 +156,7 @@
150 "settings.recipes.headline" : "Verfügbare Dienste", 156 "settings.recipes.headline" : "Verfügbare Dienste",
151 "settings.recipes.missingService" : "Fehlt ein Service?", 157 "settings.recipes.missingService" : "Fehlt ein Service?",
152 "settings.recipes.mostPopular" : "Am beliebtesten", 158 "settings.recipes.mostPopular" : "Am beliebtesten",
153 "settings.recipes.nothingFound" : "Entschuldigung, aber kein Dienst entspricht deiner Suchanfrage.", 159 "settings.recipes.nothingFound" : "Entschuldigung, aber der von Dir gesuchte Dienst konnte nicht gefunden werden.",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "Dienst erfolgreich hinzugefügt", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "Dienst erfolgreich hinzugefügt",
155 "settings.searchService" : "Service suchen", 161 "settings.searchService" : "Service suchen",
156 "settings.service.error.goBack" : "Zurück zu den Diensten", 162 "settings.service.error.goBack" : "Zurück zu den Diensten",
@@ -159,13 +165,14 @@
159 "settings.service.form.addServiceHeadline" : "{name} hinzufügen", 165 "settings.service.form.addServiceHeadline" : "{name} hinzufügen",
160 "settings.service.form.availableServices" : "Verfügbare Dienste", 166 "settings.service.form.availableServices" : "Verfügbare Dienste",
161 "settings.service.form.customUrl" : "Eigener Server", 167 "settings.service.form.customUrl" : "Eigener Server",
162 "settings.service.form.customUrlPremiumInfo" : "Um einen selbst gehosteten Dienst hinzuzufügen, brauchst du ein Franz Premium-Supporter Konto.", 168 "settings.service.form.customUrlPremiumInfo" : "Um einen selbst gehosteten Dienst hinzuzufügen, brauchst Du ein Franz Premium-Supporter Konto.",
163 "settings.service.form.customUrlUpgradeAccount" : "Dein Konto upgraden", 169 "settings.service.form.customUrlUpgradeAccount" : "Dein Konto upgraden",
164 "settings.service.form.customUrlValidationError" : "Dein {name}-Server konnte nicht verifiziert werden.", 170 "settings.service.form.customUrlValidationError" : "Dein {name}-Server konnte nicht verifiziert werden.",
165 "settings.service.form.deleteButton" : "Dienst löschen", 171 "settings.service.form.deleteButton" : "Dienst löschen",
166 "settings.service.form.editServiceHeadline" : "{name} bearbeiten", 172 "settings.service.form.editServiceHeadline" : "{name} bearbeiten",
167 "settings.service.form.enableAudio" : "Audio aktivieren", 173 "settings.service.form.enableAudio" : "Audio aktivieren",
168 "settings.service.form.enableBadge" : "Nachrichten-Badge anzeigen", 174 "settings.service.form.enableBadge" : "Nachrichten-Badge anzeigen",
175 "settings.service.form.enableDarkMode" : "Dark Mode aktivieren",
169 "settings.service.form.enableNotification" : "Benachrichtigungen aktivieren", 176 "settings.service.form.enableNotification" : "Benachrichtigungen aktivieren",
170 "settings.service.form.enableService" : "Dienst aktivieren", 177 "settings.service.form.enableService" : "Dienst aktivieren",
171 "settings.service.form.headlineBadges" : "Nachrichten-Badge", 178 "settings.service.form.headlineBadges" : "Nachrichten-Badge",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Nachrichten-Badge für alle neuen Nachrichten anzeigen", 185 "settings.service.form.indirectMessages" : "Nachrichten-Badge für alle neuen Nachrichten anzeigen",
179 "settings.service.form.isMutedInfo" : "Sämtliche Wiedergabe von Tönen wird deaktiviert", 186 "settings.service.form.isMutedInfo" : "Sämtliche Wiedergabe von Tönen wird deaktiviert",
180 "settings.service.form.name" : "Name", 187 "settings.service.form.name" : "Name",
188 "settings.service.form.proxy.headline" : "Proxy Einstellungen",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy Einstellungen werden nicht mit den Franz Servern synchronisiert.",
191 "settings.service.form.proxy.isEnabled" : "Proxy Server verwenden",
192 "settings.service.form.proxy.password" : "Passwort (optional)",
193 "settings.service.form.proxy.user" : "Benutzer (optional)",
181 "settings.service.form.saveButton" : "Dienst speichern", 194 "settings.service.form.saveButton" : "Dienst speichern",
182 "settings.service.form.tabHosted" : "Gehostet", 195 "settings.service.form.tabHosted" : "Gehostet",
183 "settings.service.form.tabOnPremise" : "Selbst gehostet â­ï¸", 196 "settings.service.form.tabOnPremise" : "Selbst gehostet â­ï¸",
@@ -211,19 +224,21 @@
211 "signup.firstname.label" : "Vorname", 224 "signup.firstname.label" : "Vorname",
212 "signup.headline" : "Anmelden", 225 "signup.headline" : "Anmelden",
213 "signup.lastname.label" : "Nachname", 226 "signup.lastname.label" : "Nachname",
214 "signup.legal.info" : "Mit der Erstellung eines Franz Kontos akzeptierst du die", 227 "signup.legal.info" : "Mit der Erstellung eines Franz Kontos akzeptierst Du die",
215 "signup.legal.privacy" : "Datenschutzerklärung", 228 "signup.legal.privacy" : "Datenschutzerklärung",
216 "signup.legal.terms" : "Nutzungsbedingungen", 229 "signup.legal.terms" : "Nutzungsbedingungen",
217 "signup.link.login" : "Du hast bereits ein Konto? Melde dich an.", 230 "signup.link.login" : "Du hast bereits ein Konto? Melde Dich an.",
218 "signup.password.label" : "Passwort", 231 "signup.password.label" : "Passwort",
219 "signup.submit.label" : "Konto erstellen", 232 "signup.submit.label" : "Konto erstellen",
220 "subscription.euTaxInfo" : "Preise sind exklusive Steuern.", 233 "subscription.euTaxInfo" : "Preise sind exklusive Steuern.",
221 "subscription.features.ads" : "Nie mehr Werbung!", 234 "subscription.features.ads" : "Werbefrei auf Lebenszeit!",
222 "subscription.features.comingSoon" : "folgt bald", 235 "subscription.features.comingSoon" : "folgt bald",
223 "subscription.features.customServices" : "Private Dienste für dich und dein Team",
224 "subscription.features.encryptedSync" : "Verschlüsselte Sitzungs-Synchronisation", 236 "subscription.features.encryptedSync" : "Verschlüsselte Sitzungs-Synchronisation",
237 "subscription.features.noInterruptions" : "Keine Wartezeiten um Franz zu verwenden",
225 "subscription.features.onpremise" : "Integration von gehosteten Diensten, wie HipChat", 238 "subscription.features.onpremise" : "Integration von gehosteten Diensten, wie HipChat",
226 "subscription.features.vpn" : "Proxy- & VPN-Unterstützung", 239 "subscription.features.onpremise.mattermost" : "Integration von gehosteten Diensten, wie Mattermost",
240 "subscription.features.proxy" : "Proxy Support für Dienste",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Bezahlte Franz Premium Support Konten beinhalten", 242 "subscription.includedFeatures" : "Bezahlte Franz Premium Support Konten beinhalten",
228 "subscription.paymentSessionError" : "Das Zahlungs-Formular konnte nicht geladen werden.", 243 "subscription.paymentSessionError" : "Das Zahlungs-Formular konnte nicht geladen werden.",
229 "subscription.submit.label" : "Ich möchte die Entwicklung von Franz unterstützen", 244 "subscription.submit.label" : "Ich möchte die Entwicklung von Franz unterstützen",
@@ -247,5 +262,5 @@
247 "validation.url" : "{field} ist keine gültige URL", 262 "validation.url" : "{field} ist keine gültige URL",
248 "welcome.loginButton" : "Bei Franz einloggen", 263 "welcome.loginButton" : "Bei Franz einloggen",
249 "welcome.signupButton" : "Kostenloses Konto erstellen", 264 "welcome.signupButton" : "Kostenloses Konto erstellen",
250 "welcome.slogan" : "Kommunikation, die für dich funktioniert" 265 "welcome.slogan" : "Kommunikation, die für Dich funktioniert"
251} 266}
diff --git a/src/i18n/locales/el.json b/src/i18n/locales/el.json
index 7361d29b7..31852d20c 100644
--- a/src/i18n/locales/el.json
+++ b/src/i18n/locales/el.json
@@ -1,7 +1,10 @@
1{ 1{
2 "global.api.unhealthy" : "Δεν είναι δυνατή η σÏνδεση με τις online υπηÏεσίες του Franz", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "global.notConnectedToTheInternet" : "Δεν είστε συνδεδεμένοι στο διαδίκτυο.", 3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "import.headline" : "Εισαγάγετε τις Franz 4 υπηÏεσίες σας", 4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "global.api.unhealthy" : "Δεν είναι δυνατή η σÏνδεση με τις ζωντανές υπηÏεσίες του Franz",
6 "global.notConnectedToTheInternet" : "Έχετε αποσυνδεθεί από το Διαδίκτυο",
7 "import.headline" : "Εισαγάγετε τις υπηÏεσίες σας Franz 4",
5 "import.notSupportedHeadline" : "ΥπηÏεσίες που δεν υποστηÏίζονται ακόμα στο Franz 5", 8 "import.notSupportedHeadline" : "ΥπηÏεσίες που δεν υποστηÏίζονται ακόμα στο Franz 5",
6 "import.skip.label" : "Θέλω να Ï€Ïοσθέσω υπηÏεσίες χειÏοκίνητα", 9 "import.skip.label" : "Θέλω να Ï€Ïοσθέσω υπηÏεσίες χειÏοκίνητα",
7 "import.submit.label" : "Εισαγωγή υπηÏεσιών", 10 "import.submit.label" : "Εισαγωγή υπηÏεσιών",
@@ -16,7 +19,7 @@
16 "invite.name.label" : "Όνομα", 19 "invite.name.label" : "Όνομα",
17 "invite.skip.label" : "Θέλω να το κάνω αÏγότεÏα", 20 "invite.skip.label" : "Θέλω να το κάνω αÏγότεÏα",
18 "invite.submit.label" : "Αποστολή Ï€Ïοσκλήσεων", 21 "invite.submit.label" : "Αποστολή Ï€Ïοσκλήσεων",
19 "invite.successInfo" : "Invitations sent successfully", 22 "invite.successInfo" : "Επιτυχής αποστολή Ï€Ïοσκλήσεων",
20 "login.email.label" : "ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου", 23 "login.email.label" : "ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου",
21 "login.headline" : "ΣÏνδεση", 24 "login.headline" : "ΣÏνδεση",
22 "login.invalidCredentials" : "Το email ή ο κωδικός Ï€Ïόσβασης δεν είναι έγκυÏος", 25 "login.invalidCredentials" : "Το email ή ο κωδικός Ï€Ïόσβασης δεν είναι έγκυÏος",
@@ -26,49 +29,49 @@
26 "login.serverLogout" : "Η συνεδÏία σας έληξε, συνδεθείτε ξανά.", 29 "login.serverLogout" : "Η συνεδÏία σας έληξε, συνδεθείτε ξανά.",
27 "login.submit.label" : "ΣÏνδεση", 30 "login.submit.label" : "ΣÏνδεση",
28 "login.tokenExpired" : "Η συνεδÏία σας έληξε, συνδεθείτε ξανά.", 31 "login.tokenExpired" : "Η συνεδÏία σας έληξε, συνδεθείτε ξανά.",
29 "menu.app.about" : "About Franz", 32 "menu.app.about" : "Σχετικά με το Franz",
30 "menu.app.hide" : "Hide", 33 "menu.app.hide" : "ΑπόκÏυψη",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "ΑπόκÏυψη των άλλων",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "Έξοδος",
33 "menu.app.settings" : "Ρυθμίσεις", 36 "menu.app.settings" : "Ρυθμίσεις",
34 "menu.app.unhide" : "Unhide", 37 "menu.app.unhide" : "Εμφάνιση",
35 "menu.edit" : "ΕπεξεÏγασία", 38 "menu.edit" : "ΕπεξεÏγασία",
36 "menu.edit.copy" : "Copy", 39 "menu.edit.copy" : "ΑντιγÏαφή",
37 "menu.edit.cut" : "Cut", 40 "menu.edit.cut" : "Αποκοπή",
38 "menu.edit.delete" : "ΔιαγÏαφή", 41 "menu.edit.delete" : "ΔιαγÏαφή",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "Emoji & ΣÏμβολα",
40 "menu.edit.paste" : "Paste", 43 "menu.edit.paste" : "Επικόλληση",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Επικόλληση και διατήÏηση μοÏφοποίησης",
42 "menu.edit.redo" : "Redo", 45 "menu.edit.redo" : "ΑκÏÏωση αναίÏεσης",
43 "menu.edit.selectAll" : "Select All", 46 "menu.edit.selectAll" : "Επιλογή Όλων",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Ομιλία",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "ΈναÏξη φωνητικής πληκτÏολόγησης",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "ΈναÏξη εκφώνησης",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "Σταμάτημα εκφώνησης",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "ΑναίÏεση",
49 "menu.file" : "File", 52 "menu.file" : "ΑÏχείο",
50 "menu.help" : "Help", 53 "menu.help" : "Βοήθεια",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "ΠÏόσφατες αλλαγές",
52 "menu.help.learnMore" : "Learn More", 55 "menu.help.learnMore" : "Μάθετε πεÏισσότεÏα",
53 "menu.help.privacy" : "Δήλωση αποÏÏήτου", 56 "menu.help.privacy" : "Δήλωση αποÏÏήτου",
54 "menu.help.support" : "Support", 57 "menu.help.support" : "ΥποστήÏιξη",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "ÎŒÏοι ΧÏήσης",
56 "menu.services" : "Services", 59 "menu.services" : "ΥπηÏεσίες",
57 "menu.services.addNewService" : "Add New Service...", 60 "menu.services.addNewService" : "Îέα ΥπηÏεσία",
58 "menu.view" : "View", 61 "menu.view" : "ΠÏοβολή",
59 "menu.view.enterFullScreen" : "Enter Full Screen", 62 "menu.view.enterFullScreen" : "ΠλήÏης Οθόνη",
60 "menu.view.exitFullScreen" : "Exit Full Screen", 63 "menu.view.exitFullScreen" : "Έξοδος από πλήÏη οθόνη",
61 "menu.view.reloadFranz" : "Reload Franz", 64 "menu.view.reloadFranz" : "Ανανέωση Franz",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "Ανανέωση ΥπηÏεσίας",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "ΠÏαγματικό μέγεθος",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Άνοιγμα ΕÏγαλειοθήκη ΠÏογÏαμματιστών",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "ΛειτουÏγία πλήÏους οθόνης",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "ΛειτουÏγεία ΥπηÏεσίασ ΕÏγαλειοθήκης ΠÏογÏαμματιστών",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "Μεγέθυνση",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "ΣμίκÏυνση",
69 "menu.window" : "Window", 72 "menu.window" : "ΠαÏάθυÏο",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "Κλείσιμο",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "Ελαχιστοποίηση",
72 "password.email.label" : "ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου", 75 "password.email.label" : "ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου",
73 "password.headline" : "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης", 76 "password.headline" : "ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης",
74 "password.link.login" : "ΣÏνδεση στο λογαÏιασμό σας", 77 "password.link.login" : "ΣÏνδεση στο λογαÏιασμό σας",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Δεν βÏέθηκε χÏήστης με τη συγκεκÏιμένη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου", 79 "password.noUser" : "Δεν βÏέθηκε χÏήστης με τη συγκεκÏιμένη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου",
77 "password.submit.label" : "Υποβολή", 80 "password.submit.label" : "Υποβολή",
78 "password.successInfo" : "Ελέγξτε το email σας", 81 "password.successInfo" : "Ελέγξτε το email σας",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "ΥποστηÏίξτε το Franz", 83 "pricing.headline" : "ΥποστηÏίξτε το Franz",
80 "pricing.link.skipPayment" : "Δεν θέλω να βοηθήσω στην ανάπτυξη του Franz.", 84 "pricing.link.skipPayment" : "Δεν θέλω να βοηθήσω στην ανάπτυξη του Franz.",
81 "pricing.submit.label" : "Θέλω να βοηθήσω στην ανάπτυξη του Franz", 85 "pricing.submit.label" : "Θέλω να βοηθήσω στην ανάπτυξη του Franz",
@@ -116,16 +120,18 @@
116 "settings.app.form.autoLaunchInBackground" : "Άνοιγμα στο παÏασκήνιο", 120 "settings.app.form.autoLaunchInBackground" : "Άνοιγμα στο παÏασκήνιο",
117 "settings.app.form.autoLaunchOnStart" : "Εκκίνηση του Franz κατά την εκκίνηση του συστήματος", 121 "settings.app.form.autoLaunchOnStart" : "Εκκίνηση του Franz κατά την εκκίνηση του συστήματος",
118 "settings.app.form.beta" : "ΣυμπεÏιλάβετε εκδόσεις beta", 122 "settings.app.form.beta" : "ΣυμπεÏιλάβετε εκδόσεις beta",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
120 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 124 "settings.app.form.enableGPUAcceleration" : "ΕνεÏγοποιήση Ενίσχυσης GPU ",
125 "settings.app.form.enableMenuBar" : "Εμφάνιση ΓÏαμμής ÎœÎµÎ½Î¿Ï Franz",
121 "settings.app.form.enableSpellchecking" : "ΕνεÏγοποίηση οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï ÎµÎ»Î­Î³Ï‡Î¿Ï…", 126 "settings.app.form.enableSpellchecking" : "ΕνεÏγοποίηση οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï ÎµÎ»Î­Î³Ï‡Î¿Ï…",
122 "settings.app.form.enableSystemTray" : "Εμφάνιση του Franz στη γÏαμμή ειδοποιήσεων", 127 "settings.app.form.enableSystemTray" : "Εμφάνιση του Franz στη γÏαμμή ειδοποιήσεων",
123 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 128 "settings.app.form.hideDockIcon" : "ΑπόκÏυψη εικονιδίου Franz",
124 "settings.app.form.language" : "Γλώσσα", 129 "settings.app.form.language" : "Γλώσσα",
125 "settings.app.form.minimizeToSystemTray" : "Ελαχιστοποίηση του Franz στη γÏαμμή ειδοποιήσεων", 130 "settings.app.form.minimizeToSystemTray" : "Ελαχιστοποίηση του Franz στη γÏαμμή ειδοποιήσεων",
126 "settings.app.form.runInBackground" : "ΚÏατήστε το Franz στο παÏασκήνιο κατά το κλείσιμο του παÏαθÏÏου", 131 "settings.app.form.runInBackground" : "ΚÏατήστε το Franz στο παÏασκήνιο κατά το κλείσιμο του παÏαθÏÏου",
127 "settings.app.form.showDisabledServices" : "ΠÏοβολή καÏτελών των απενεÏγοποιημένων υπηÏεσιών", 132 "settings.app.form.showDisabledServices" : "ΠÏοβολή καÏτελών των απενεÏγοποιημένων υπηÏεσιών",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "ΠÏοβολή του εικονιδίου μη αναγνωσμένου μηνÏματος όταν οι ειδοποιήσεις είναι απενεÏγοποιημένες", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "ΠÏοβολή του εικονιδίου μη αναγνωσμένου μηνÏματος όταν οι ειδοποιήσεις είναι απενεÏγοποιημένες",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Ρυθμίσεις", 135 "settings.app.headline" : "Ρυθμίσεις",
130 "settings.app.headlineAdvanced" : "Για Ï€ÏοχωÏημένους", 136 "settings.app.headlineAdvanced" : "Για Ï€ÏοχωÏημένους",
131 "settings.app.headlineAppearance" : "Εμφάνιση", 137 "settings.app.headlineAppearance" : "Εμφάνιση",
@@ -138,10 +144,10 @@
138 "settings.app.updateStatusAvailable" : "ΥπάÏχει διαθέσιμη ενημέÏωση, γίνεται λήψη...", 144 "settings.app.updateStatusAvailable" : "ΥπάÏχει διαθέσιμη ενημέÏωση, γίνεται λήψη...",
139 "settings.app.updateStatusSearching" : " Γίνεται αναζήτηση για ενημέÏωση", 145 "settings.app.updateStatusSearching" : " Γίνεται αναζήτηση για ενημέÏωση",
140 "settings.app.updateStatusUpToDate" : "ΧÏησιμοποιείτε την τελευταία έκδοση του Franz", 146 "settings.app.updateStatusUpToDate" : "ΧÏησιμοποιείτε την τελευταία έκδοση του Franz",
141 "settings.invite.headline" : "Invite Friends", 147 "settings.invite.headline" : "ΠÏοσκαλέστε Φίλους",
142 "settings.navigation.account" : "ΛογαÏιασμός", 148 "settings.navigation.account" : "ΛογαÏιασμός",
143 "settings.navigation.availableServices" : "Διαθέσιμες υπηÏεσίες", 149 "settings.navigation.availableServices" : "Διαθέσιμες υπηÏεσίες",
144 "settings.navigation.inviteFriends" : "Invite Friends", 150 "settings.navigation.inviteFriends" : "ΠÏασκαλέστε Φίλους",
145 "settings.navigation.logout" : "ΑποσÏνδεση", 151 "settings.navigation.logout" : "ΑποσÏνδεση",
146 "settings.navigation.settings" : "Ρυθμίσεις", 152 "settings.navigation.settings" : "Ρυθμίσεις",
147 "settings.navigation.yourServices" : "Οι υπηÏεσίες σας", 153 "settings.navigation.yourServices" : "Οι υπηÏεσίες σας",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "ΕπεξεÏγασία {name}", 172 "settings.service.form.editServiceHeadline" : "ΕπεξεÏγασία {name}",
167 "settings.service.form.enableAudio" : "ΕνεÏγοποίηση ήχου", 173 "settings.service.form.enableAudio" : "ΕνεÏγοποίηση ήχου",
168 "settings.service.form.enableBadge" : "Εμφάνιση εικονιδίων μη αναγνωσμένου μηνÏματος", 174 "settings.service.form.enableBadge" : "Εμφάνιση εικονιδίων μη αναγνωσμένου μηνÏματος",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "ΕνεÏγοποίηση ειδοποιήσεων", 176 "settings.service.form.enableNotification" : "ΕνεÏγοποίηση ειδοποιήσεων",
170 "settings.service.form.enableService" : "ΕνεÏγοποίηση υπηÏεσίας", 177 "settings.service.form.enableService" : "ΕνεÏγοποίηση υπηÏεσίας",
171 "settings.service.form.headlineBadges" : "Εικονίδια μη αναγνωσμένου μηνÏματος", 178 "settings.service.form.headlineBadges" : "Εικονίδια μη αναγνωσμένου μηνÏματος",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Εμφάνιση ειδοποίησης μηνÏματος για όλα τα νέα μηνÏματα", 185 "settings.service.form.indirectMessages" : "Εμφάνιση ειδοποίησης μηνÏματος για όλα τα νέα μηνÏματα",
179 "settings.service.form.isMutedInfo" : "Όλοι οι ήχοι καθώς και η αναπαÏαγωγή ήχου θα απενεÏγοποιηθοÏν", 186 "settings.service.form.isMutedInfo" : "Όλοι οι ήχοι καθώς και η αναπαÏαγωγή ήχου θα απενεÏγοποιηθοÏν",
180 "settings.service.form.name" : "Όνομα", 187 "settings.service.form.name" : "Όνομα",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Αποθήκευση υπηÏεσίας", 194 "settings.service.form.saveButton" : "Αποθήκευση υπηÏεσίας",
182 "settings.service.form.tabHosted" : "Φιλοξενείται", 195 "settings.service.form.tabHosted" : "Φιλοξενείται",
183 "settings.service.form.tabOnPremise" : "Αυτο-φιλοξενείται â­ï¸", 196 "settings.service.form.tabOnPremise" : "Αυτο-φιλοξενείται â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Πολίτες Ε.Ε.: Στις τιμές δεν πεÏιλαμβάνονται τυχόν φόÏοι και άλλες τοπικές επιβαÏÏνσεις", 233 "subscription.euTaxInfo" : "Πολίτες Ε.Ε.: Στις τιμές δεν πεÏιλαμβάνονται τυχόν φόÏοι και άλλες τοπικές επιβαÏÏνσεις",
221 "subscription.features.ads" : "Τέλος στις διαφημίσεις", 234 "subscription.features.ads" : "Τέλος στις διαφημίσεις",
222 "subscription.features.comingSoon" : "σÏντομα", 235 "subscription.features.comingSoon" : "σÏντομα",
223 "subscription.features.customServices" : "Ιδιωτικές υπηÏεσίες για εσάς και την ομάδα σας",
224 "subscription.features.encryptedSync" : "ΚÏυπτογÏαφημένος συγχÏονισμός πεÏιόδου σÏνδεσης", 236 "subscription.features.encryptedSync" : "ΚÏυπτογÏαφημένος συγχÏονισμός πεÏιόδου σÏνδεσης",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Add on-premise \/ hosted services όπως το HipChat", 238 "subscription.features.onpremise" : "Add on-premise \/ hosted services όπως το HipChat",
226 "subscription.features.vpn" : "ΥποστήÏιξη μεσολαβητή (Proxy) και VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Ο Premium λογαÏιασμός υποστήÏιξης Franz πεÏιλαμβάνει", 242 "subscription.includedFeatures" : "Ο Premium λογαÏιασμός υποστήÏιξης Franz πεÏιλαμβάνει",
228 "subscription.paymentSessionError" : "Δεν ήταν δυνατή η Ï€Ïοετοιμασία της φόÏμας πληÏωμής", 243 "subscription.paymentSessionError" : "Δεν ήταν δυνατή η Ï€Ïοετοιμασία της φόÏμας πληÏωμής",
229 "subscription.submit.label" : "Θέλω να βοηθήσω στην ανάπτυξη του Franz", 244 "subscription.submit.label" : "Θέλω να βοηθήσω στην ανάπτυξη του Franz",
@@ -241,10 +256,10 @@
241 "tabs.item.enableNotification" : "ΕνεÏγοποίηση ειδοποιήσεων", 256 "tabs.item.enableNotification" : "ΕνεÏγοποίηση ειδοποιήσεων",
242 "tabs.item.enableService" : "ΕνεÏγοποίηση υπηÏεσίας", 257 "tabs.item.enableService" : "ΕνεÏγοποίηση υπηÏεσίας",
243 "tabs.item.reload" : "ΕπαναφόÏτωση", 258 "tabs.item.reload" : "ΕπαναφόÏτωση",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{field} δεν είναι έγκυÏο",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "{field} Ï€Ïέπει να είναι τουλάχιστον {length} χαÏακτήÏες",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{field} είναι υποχÏεωτικό",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field} δεν είναι έγκυÏος σÏνδεσμος URL",
248 "welcome.loginButton" : "ΣÏνδεση στο λογαÏιασμό σας", 263 "welcome.loginButton" : "ΣÏνδεση στο λογαÏιασμό σας",
249 "welcome.signupButton" : "ΔημιουÏγία δωÏεάν λογαÏιασμοÏ", 264 "welcome.signupButton" : "ΔημιουÏγία δωÏεάν λογαÏιασμοÏ",
250 "welcome.slogan" : "Επικοινωνία που λειτουÏγεί για εσάς" 265 "welcome.slogan" : "Επικοινωνία που λειτουÏγεί για εσάς"
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 0c62da44a..aa55f5dfe 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -50,10 +50,12 @@
50 "subscription.paymentSessionError": "Could not initialize payment form", 50 "subscription.paymentSessionError": "Could not initialize payment form",
51 "subscription.includedFeatures": "Paid Franz Premium Supporter Account includes", 51 "subscription.includedFeatures": "Paid Franz Premium Supporter Account includes",
52 "subscription.features.onpremise": "Add on-premise/hosted services like HipChat", 52 "subscription.features.onpremise": "Add on-premise/hosted services like HipChat",
53 "subscription.features.customServices": "Private services for you and your team", 53 "subscription.features.onpremise.mattermost": "Add on-premise/hosted services like Mattermost",
54 "subscription.features.encryptedSync": "Encrypted session synchronization", 54 "subscription.features.encryptedSync": "Encrypted session synchronization",
55 "subscription.features.vpn": "Proxy & VPN support", 55 "subscription.features.proxy": "Proxy support for services",
56 "subscription.features.ads": "No ads, ever!", 56 "subscription.features.ads": "No ads, ever!",
57 "subscription.features.spellchecker": "Support for spellchecker",
58 "subscription.features.noInterruptions": "No app delays & nagging to upgrade license",
57 "subscription.features.comingSoon": "coming soon", 59 "subscription.features.comingSoon": "coming soon",
58 "infobar.servicesUpdated": "Your services have been updated.", 60 "infobar.servicesUpdated": "Your services have been updated.",
59 "infobar.updateAvailable": "A new update for Franz is available.", 61 "infobar.updateAvailable": "A new update for Franz is available.",
@@ -130,6 +132,13 @@
130 "settings.service.form.icon": "Custom icon", 132 "settings.service.form.icon": "Custom icon",
131 "settings.service.form.iconDelete": "Delete", 133 "settings.service.form.iconDelete": "Delete",
132 "settings.service.form.iconUpload": "Drop your image, or click here", 134 "settings.service.form.iconUpload": "Drop your image, or click here",
135 "settings.service.form.enableDarkMode": "Enable Dark Mode",
136 "settings.service.form.proxy.headline": "Proxy Settings",
137 "settings.service.form.proxy.isEnabled": "Use Proxy",
138 "settings.service.form.proxy.host": "Proxy Host/IP",
139 "settings.service.form.proxy.user": "User (optional)",
140 "settings.service.form.proxy.password": "Password (optional)",
141 "settings.service.form.proxy.info": "Proxy settings will not synced with the Franz servers.",
133 "settings.service.error.headline": "Error", 142 "settings.service.error.headline": "Error",
134 "settings.service.error.goBack": "Back to services", 143 "settings.service.error.goBack": "Back to services",
135 "settings.service.error.message": "Could not load service recipe.", 144 "settings.service.error.message": "Could not load service recipe.",
@@ -158,12 +167,14 @@
158 "settings.app.form.autoLaunchOnStart": "Launch Franz on start", 167 "settings.app.form.autoLaunchOnStart": "Launch Franz on start",
159 "settings.app.form.autoLaunchInBackground": "Open in background", 168 "settings.app.form.autoLaunchInBackground": "Open in background",
160 "settings.app.form.enableSystemTray": "Show Franz in system tray", 169 "settings.app.form.enableSystemTray": "Show Franz in system tray",
170 "settings.app.form.darkMode": "Join the Dark Side",
161 "settings.app.form.minimizeToSystemTray": "Minimize Franz to system tray", 171 "settings.app.form.minimizeToSystemTray": "Minimize Franz to system tray",
162 "settings.app.form.enableMenuBar": "Show Franz in Menu Bar", 172 "settings.app.form.enableMenuBar": "Show Franz in Menu Bar",
163 "settings.app.form.hideDockIcon": "Hide Franz icon in Dock", 173 "settings.app.form.hideDockIcon": "Hide Franz icon in Dock",
164 "settings.app.form.runInBackground": "Keep Franz in background when closing the window", 174 "settings.app.form.runInBackground": "Keep Franz in background when closing the window",
165 "settings.app.form.language": "Language", 175 "settings.app.form.language": "Language",
166 "settings.app.form.enableSpellchecking": "Enable spell checking", 176 "settings.app.form.enableSpellchecking": "Enable spell checking",
177 "settings.app.form.spellcheckerLanguage": "Spell checking language",
167 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration", 178 "settings.app.form.enableGPUAcceleration": "Enable GPU Acceleration",
168 "settings.app.form.showDisabledServices": "Display disabled services tabs", 179 "settings.app.form.showDisabledServices": "Display disabled services tabs",
169 "settings.app.form.showMessagesBadgesWhenMuted": "Show unread message badge when notifications are disabled", 180 "settings.app.form.showMessagesBadgesWhenMuted": "Show unread message badge when notifications are disabled",
@@ -247,5 +258,9 @@
247 "validation.required": "{field} is required", 258 "validation.required": "{field} is required",
248 "validation.email": "{field} is not valid", 259 "validation.email": "{field} is not valid",
249 "validation.url": "{field} is not a valid URL", 260 "validation.url": "{field} is not a valid URL",
250 "validation.minLength": "{field} should be at least {length} characters long" 261 "validation.minLength": "{field} should be at least {length} characters long",
262 "feature.delayApp.headline": "Please purchase a Franz Supporter License to skip waiting",
263 "feature.delayApp.action": "Get a Franz Supporter License",
264 "feature.delayApp.text": "Franz will continue in {seconds} seconds.",
265 "premiumFeature.button.upgradeAccount": "Upgrade account"
251} 266}
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 75047a613..a5984dd1c 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -1,8 +1,11 @@
1{ 1{
2 "global.api.unhealthy" : "No se puede conectar a los servicios en línea de Franz", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "global.notConnectedToTheInternet" : "No está conectado a Internet.", 3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "global.api.unhealthy" : "No es posible conectarse a los servicios en línea de Franz.",
6 "global.notConnectedToTheInternet" : "No estás conectado a Internet",
4 "import.headline" : "Importa tus servicios de Franz 4", 7 "import.headline" : "Importa tus servicios de Franz 4",
5 "import.notSupportedHeadline" : "Servicios no soportados aún en Franz 5", 8 "import.notSupportedHeadline" : "Servicios no admitidos aún en Franz 5",
6 "import.skip.label" : "Quiero agregar servicios manualmente", 9 "import.skip.label" : "Quiero agregar servicios manualmente",
7 "import.submit.label" : "Importar servicios", 10 "import.submit.label" : "Importar servicios",
8 "infobar.buttonChangelog" : "¿Qué hay de nuevo?", 11 "infobar.buttonChangelog" : "¿Qué hay de nuevo?",
@@ -14,7 +17,7 @@
14 "invite.email.label" : "Dirección de correo electrónico", 17 "invite.email.label" : "Dirección de correo electrónico",
15 "invite.headline.friends" : "Invita a 3 de tus amigos o compañeros", 18 "invite.headline.friends" : "Invita a 3 de tus amigos o compañeros",
16 "invite.name.label" : "Nombre", 19 "invite.name.label" : "Nombre",
17 "invite.skip.label" : "Quiero hacer esto después", 20 "invite.skip.label" : "Lo haré más tarde",
18 "invite.submit.label" : "Enviar invitaciones", 21 "invite.submit.label" : "Enviar invitaciones",
19 "invite.successInfo" : "Invitaciones enviadas correctamente", 22 "invite.successInfo" : "Invitaciones enviadas correctamente",
20 "login.email.label" : "Dirección de correo electrónico", 23 "login.email.label" : "Dirección de correo electrónico",
@@ -25,7 +28,7 @@
25 "login.password.label" : "Contraseña", 28 "login.password.label" : "Contraseña",
26 "login.serverLogout" : "Tu sesión ha expirado, por favor inicia la sesión de nuevo.", 29 "login.serverLogout" : "Tu sesión ha expirado, por favor inicia la sesión de nuevo.",
27 "login.submit.label" : "Iniciar sesión", 30 "login.submit.label" : "Iniciar sesión",
28 "login.tokenExpired" : "Tu sesión expiró, por favor inicia sesión otra vez.", 31 "login.tokenExpired" : "Tu sesión ha expirado, por favor inicia sesión de nuevo.",
29 "menu.app.about" : "Sobre Franz", 32 "menu.app.about" : "Sobre Franz",
30 "menu.app.hide" : "Ocultar", 33 "menu.app.hide" : "Ocultar",
31 "menu.app.hideOthers" : "Ocultar otros", 34 "menu.app.hideOthers" : "Ocultar otros",
@@ -51,12 +54,12 @@
51 "menu.help.changelog" : "Registro de cambios", 54 "menu.help.changelog" : "Registro de cambios",
52 "menu.help.learnMore" : "Conocer más", 55 "menu.help.learnMore" : "Conocer más",
53 "menu.help.privacy" : "Declaración de privacidad", 56 "menu.help.privacy" : "Declaración de privacidad",
54 "menu.help.support" : "Soporte", 57 "menu.help.support" : "Ayuda técnica",
55 "menu.help.tos" : "Términos del Servicio", 58 "menu.help.tos" : "Términos del Servicio",
56 "menu.services" : "Servicios", 59 "menu.services" : "Servicios",
57 "menu.services.addNewService" : "Añadir Nuevo Servicio...", 60 "menu.services.addNewService" : "Añadir Nuevo Servicio...",
58 "menu.view" : "Mostrar", 61 "menu.view" : "Mostrar",
59 "menu.view.enterFullScreen" : "Entrar a Pantalla Completa", 62 "menu.view.enterFullScreen" : "Pasar a pantalla completa",
60 "menu.view.exitFullScreen" : "Salir de Pantalla Completa", 63 "menu.view.exitFullScreen" : "Salir de Pantalla Completa",
61 "menu.view.reloadFranz" : "Recargar Franz", 64 "menu.view.reloadFranz" : "Recargar Franz",
62 "menu.view.reloadService" : "Recargar Servicio", 65 "menu.view.reloadService" : "Recargar Servicio",
@@ -71,11 +74,12 @@
71 "menu.window.minimize" : "Minimizar", 74 "menu.window.minimize" : "Minimizar",
72 "password.email.label" : "Dirección de correo electrónico", 75 "password.email.label" : "Dirección de correo electrónico",
73 "password.headline" : "Restablecer contraseña", 76 "password.headline" : "Restablecer contraseña",
74 "password.link.login" : "Iniciar sesión en tu cuenta", 77 "password.link.login" : "Inicia sesión en tu cuenta",
75 "password.link.signup" : "Crear una cuenta gratuita", 78 "password.link.signup" : "Crear una cuenta gratuita",
76 "password.noUser" : "No se encontró un usuario con esa dirección de correo electrónico", 79 "password.noUser" : "No se encontró un usuario con esa dirección de correo electrónico",
77 "password.submit.label" : "Enviar", 80 "password.submit.label" : "Enviar",
78 "password.successInfo" : "Por favor revisa tu correo electrónico", 81 "password.successInfo" : "Por favor revisa tu correo electrónico",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Apoya a Franz", 83 "pricing.headline" : "Apoya a Franz",
80 "pricing.link.skipPayment" : "No quiero apoyar el desarrollo de Franz.", 84 "pricing.link.skipPayment" : "No quiero apoyar el desarrollo de Franz.",
81 "pricing.submit.label" : "Quiero apoyar el desarrollo de Franz", 85 "pricing.submit.label" : "Quiero apoyar el desarrollo de Franz",
@@ -116,8 +120,9 @@
116 "settings.app.form.autoLaunchInBackground" : "Abrir en segundo plano", 120 "settings.app.form.autoLaunchInBackground" : "Abrir en segundo plano",
117 "settings.app.form.autoLaunchOnStart" : "Iniciar Franz al iniciar", 121 "settings.app.form.autoLaunchOnStart" : "Iniciar Franz al iniciar",
118 "settings.app.form.beta" : "Incluir versiones beta", 122 "settings.app.form.beta" : "Incluir versiones beta",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
120 "settings.app.form.enableMenuBar" : "mostrar a franz en La barra de menús", 124 "settings.app.form.enableGPUAcceleration" : "Habilitar aceleración de GPU",
125 "settings.app.form.enableMenuBar" : "Mostrar a Franz en la barra de menús",
121 "settings.app.form.enableSpellchecking" : "Activar corrección ortográfica", 126 "settings.app.form.enableSpellchecking" : "Activar corrección ortográfica",
122 "settings.app.form.enableSystemTray" : "Mostrar Franz en la bandeja del sistema", 127 "settings.app.form.enableSystemTray" : "Mostrar Franz en la bandeja del sistema",
123 "settings.app.form.hideDockIcon" : "Ocultar Icono de Franz en barra de herramientas", 128 "settings.app.form.hideDockIcon" : "Ocultar Icono de Franz en barra de herramientas",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "Mantener Franz en segundo plano al cerrar la ventana", 131 "settings.app.form.runInBackground" : "Mantener Franz en segundo plano al cerrar la ventana",
127 "settings.app.form.showDisabledServices" : "Mostrar pestañas de servicios desactivados", 132 "settings.app.form.showDisabledServices" : "Mostrar pestañas de servicios desactivados",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostrar la insignia de mensajes sin leer cuando las notificaciones están desactivadas", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostrar la insignia de mensajes sin leer cuando las notificaciones están desactivadas",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Configuración", 135 "settings.app.headline" : "Configuración",
130 "settings.app.headlineAdvanced" : "Avanzado", 136 "settings.app.headlineAdvanced" : "Avanzado",
131 "settings.app.headlineAppearance" : "Apariencia", 137 "settings.app.headlineAppearance" : "Apariencia",
@@ -134,7 +140,7 @@
134 "settings.app.headlineUpdates" : "Actualizaciones", 140 "settings.app.headlineUpdates" : "Actualizaciones",
135 "settings.app.restartRequired" : "Los cambios requieren reiniciar", 141 "settings.app.restartRequired" : "Los cambios requieren reiniciar",
136 "settings.app.subheadlineCache" : "Caché", 142 "settings.app.subheadlineCache" : "Caché",
137 "settings.app.translationHelp" : "Ayúdenos a traducir Franz a tu idioma.", 143 "settings.app.translationHelp" : "Ayúdanos a traducir Franz a tu idioma.",
138 "settings.app.updateStatusAvailable" : "Actualización disponible, descargando...", 144 "settings.app.updateStatusAvailable" : "Actualización disponible, descargando...",
139 "settings.app.updateStatusSearching" : "Buscando actualizaciones", 145 "settings.app.updateStatusSearching" : "Buscando actualizaciones",
140 "settings.app.updateStatusUpToDate" : "Estás utilizando la última versión de Franz", 146 "settings.app.updateStatusUpToDate" : "Estás utilizando la última versión de Franz",
@@ -144,18 +150,18 @@
144 "settings.navigation.inviteFriends" : "Invita a tus amigos", 150 "settings.navigation.inviteFriends" : "Invita a tus amigos",
145 "settings.navigation.logout" : "Cerrar sesión", 151 "settings.navigation.logout" : "Cerrar sesión",
146 "settings.navigation.settings" : "Configuración", 152 "settings.navigation.settings" : "Configuración",
147 "settings.navigation.yourServices" : "Sus servicios", 153 "settings.navigation.yourServices" : "Tus servicios",
148 "settings.recipes.all" : "Todos los servicios", 154 "settings.recipes.all" : "Todos los servicios",
149 "settings.recipes.dev" : "Desarrollo", 155 "settings.recipes.dev" : "Desarrollo",
150 "settings.recipes.headline" : "Servicios disponibles", 156 "settings.recipes.headline" : "Servicios disponibles",
151 "settings.recipes.missingService" : "¿Falta algún servicio?", 157 "settings.recipes.missingService" : "¿Echas de menos algún servicio?",
152 "settings.recipes.mostPopular" : "Más populares", 158 "settings.recipes.mostPopular" : "Más populares",
153 "settings.recipes.nothingFound" : "Lo siento, pero no hay ningún servicio coincidente con tus términos de búsqueda.", 159 "settings.recipes.nothingFound" : "Lo siento, pero no hay ningún servicio coincidente con tus términos de búsqueda.",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "Servicio añadido exitosamente", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "Servicio añadido con éxito",
155 "settings.searchService" : "Buscar servicio", 161 "settings.searchService" : "Buscar servicio",
156 "settings.service.error.goBack" : "Volver a los servicios", 162 "settings.service.error.goBack" : "Volver a los servicios",
157 "settings.service.error.headline" : "Error", 163 "settings.service.error.headline" : "Error",
158 "settings.service.error.message" : "No se pudo cargar el servicio", 164 "settings.service.error.message" : "No se pudo cargar el servicio.",
159 "settings.service.form.addServiceHeadline" : "Añadir {name}", 165 "settings.service.form.addServiceHeadline" : "Añadir {name}",
160 "settings.service.form.availableServices" : "Servicios disponibles", 166 "settings.service.form.availableServices" : "Servicios disponibles",
161 "settings.service.form.customUrl" : "Servidor personalizado", 167 "settings.service.form.customUrl" : "Servidor personalizado",
@@ -165,7 +171,8 @@
165 "settings.service.form.deleteButton" : "Eliminar servicio", 171 "settings.service.form.deleteButton" : "Eliminar servicio",
166 "settings.service.form.editServiceHeadline" : "Editar {name}", 172 "settings.service.form.editServiceHeadline" : "Editar {name}",
167 "settings.service.form.enableAudio" : "Habilitar audio", 173 "settings.service.form.enableAudio" : "Habilitar audio",
168 "settings.service.form.enableBadge" : "Mostrar insignia de mensajes no leídos", 174 "settings.service.form.enableBadge" : "Mostrar señal de mensajes no leídos",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Activar notificaciones", 176 "settings.service.form.enableNotification" : "Activar notificaciones",
170 "settings.service.form.enableService" : "Activar servicio", 177 "settings.service.form.enableService" : "Activar servicio",
171 "settings.service.form.headlineBadges" : "Insignias de mensaje no leídos", 178 "settings.service.form.headlineBadges" : "Insignias de mensaje no leídos",
@@ -175,9 +182,15 @@
175 "settings.service.form.iconDelete" : "Borrar", 182 "settings.service.form.iconDelete" : "Borrar",
176 "settings.service.form.iconUpload" : "Arrastra tu imagen, o haz clic aquí", 183 "settings.service.form.iconUpload" : "Arrastra tu imagen, o haz clic aquí",
177 "settings.service.form.indirectMessageInfo" : "Serás notificado de todos los mensajes del canal, no sólo @username, @channel, @here, ...", 184 "settings.service.form.indirectMessageInfo" : "Serás notificado de todos los mensajes del canal, no sólo @username, @channel, @here, ...",
178 "settings.service.form.indirectMessages" : "Mostrar insignia de notificación para todos los mensajes nuevos", 185 "settings.service.form.indirectMessages" : "Mostrar señal de notificación para todos los mensajes nuevos",
179 "settings.service.form.isMutedInfo" : "Cuando estén desactivados, todos los sonidos de notificación y la reproducción de audio serán silenciados", 186 "settings.service.form.isMutedInfo" : "Cuando estén desactivados, todos los sonidos de notificación y la reproducción de audio serán silenciados",
180 "settings.service.form.name" : "Nombre", 187 "settings.service.form.name" : "Nombre",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Guardar servicio", 194 "settings.service.form.saveButton" : "Guardar servicio",
182 "settings.service.form.tabHosted" : "Alojado", 195 "settings.service.form.tabHosted" : "Alojado",
183 "settings.service.form.tabOnPremise" : "Auto alojado â­ï¸", 196 "settings.service.form.tabOnPremise" : "Auto alojado â­ï¸",
@@ -192,10 +205,10 @@
192 "settings.services.tooltip.isMuted" : "Todos los sonidos están silenciados", 205 "settings.services.tooltip.isMuted" : "Todos los sonidos están silenciados",
193 "settings.services.tooltip.notificationsDisabled" : "Las notificaciones están desactivadas", 206 "settings.services.tooltip.notificationsDisabled" : "Las notificaciones están desactivadas",
194 "settings.services.updatedInfo" : "Tus cambios han sido guardados", 207 "settings.services.updatedInfo" : "Tus cambios han sido guardados",
195 "settings.user.form.accountType.company" : "Compañía", 208 "settings.user.form.accountType.company" : "Empresa",
196 "settings.user.form.accountType.individual" : "Individual", 209 "settings.user.form.accountType.individual" : "Individual",
197 "settings.user.form.accountType.label" : "Tipo de cuenta", 210 "settings.user.form.accountType.label" : "Tipo de cuenta",
198 "settings.user.form.accountType.non-profit" : "Sin fines de lucro", 211 "settings.user.form.accountType.non-profit" : "Sin ánimo de lucro",
199 "settings.user.form.currentPassword" : "Contraseña actual", 212 "settings.user.form.currentPassword" : "Contraseña actual",
200 "settings.user.form.email" : "Correo electrónico", 213 "settings.user.form.email" : "Correo electrónico",
201 "settings.user.form.firstname" : "Nombre", 214 "settings.user.form.firstname" : "Nombre",
@@ -211,7 +224,7 @@
211 "signup.firstname.label" : "Nombre", 224 "signup.firstname.label" : "Nombre",
212 "signup.headline" : "Registrarse", 225 "signup.headline" : "Registrarse",
213 "signup.lastname.label" : "Apellido", 226 "signup.lastname.label" : "Apellido",
214 "signup.legal.info" : "Al crear una cuenta en Franz usted acepta las", 227 "signup.legal.info" : "Al crear una cuenta en Franz usted acepta",
215 "signup.legal.privacy" : "Declaración de privacidad", 228 "signup.legal.privacy" : "Declaración de privacidad",
216 "signup.legal.terms" : "Términos de servicio", 229 "signup.legal.terms" : "Términos de servicio",
217 "signup.link.login" : "Ya tienes una cuenta, ¿Iniciar sesión?", 230 "signup.link.login" : "Ya tienes una cuenta, ¿Iniciar sesión?",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Residentes de la UE: pueden aplicarse impuestos locales", 233 "subscription.euTaxInfo" : "Residentes de la UE: pueden aplicarse impuestos locales",
221 "subscription.features.ads" : "¡Sin publicidad, para siempre!", 234 "subscription.features.ads" : "¡Sin publicidad, para siempre!",
222 "subscription.features.comingSoon" : "próximamente", 235 "subscription.features.comingSoon" : "próximamente",
223 "subscription.features.customServices" : "Servicios privados para ti y tu equipo",
224 "subscription.features.encryptedSync" : "Sincronización de sesión encriptada", 236 "subscription.features.encryptedSync" : "Sincronización de sesión encriptada",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Añade servicios locales\/autoalojados como HipChat", 238 "subscription.features.onpremise" : "Añade servicios locales\/autoalojados como HipChat",
226 "subscription.features.vpn" : "Soporte para Proxy y VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "La Cuenta pagada de Colaborador Premium de Franz incluye", 242 "subscription.includedFeatures" : "La Cuenta pagada de Colaborador Premium de Franz incluye",
228 "subscription.paymentSessionError" : "No se pudo inicializar el formulario de pago", 243 "subscription.paymentSessionError" : "No se pudo inicializar el formulario de pago",
229 "subscription.submit.label" : "Quiero apoyar el desarrollo de Franz", 244 "subscription.submit.label" : "Quiero apoyar el desarrollo de Franz",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index e00a5671b..6964d27d2 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz", 5 "global.api.unhealthy" : "Impossible de se connecter aux services en ligne de Franz",
3 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.", 6 "global.notConnectedToTheInternet" : "Vous n'êtes pas connecté à Internet.",
4 "import.headline" : "Importez vos services depuis la version 4 de Franz.", 7 "import.headline" : "Importez vos services depuis la version 4 de Franz.",
@@ -11,20 +14,20 @@
11 "infobar.requiredRequestsFailed" : "Impossible d'accéder aux services et informations de l'utilisateur", 14 "infobar.requiredRequestsFailed" : "Impossible d'accéder aux services et informations de l'utilisateur",
12 "infobar.servicesUpdated" : "Vos services ont été mis à jour.", 15 "infobar.servicesUpdated" : "Vos services ont été mis à jour.",
13 "infobar.updateAvailable" : "Une nouvelle mise à jour pour Franz est disponible.", 16 "infobar.updateAvailable" : "Une nouvelle mise à jour pour Franz est disponible.",
14 "invite.email.label" : "Adresse e-mail", 17 "invite.email.label" : "Adresse Email",
15 "invite.headline.friends" : "Invitez 3 amis ou collègues", 18 "invite.headline.friends" : "Invitez 3 amis ou collègues",
16 "invite.name.label" : "Nom", 19 "invite.name.label" : "Nom",
17 "invite.skip.label" : "Je veux faire cela plus tard", 20 "invite.skip.label" : "Je veux faire cela plus tard",
18 "invite.submit.label" : "Envoyer des invitations", 21 "invite.submit.label" : "Envoyer des invitations",
19 "invite.successInfo" : "Invitations envoyées", 22 "invite.successInfo" : "Invitations envoyées avec succès",
20 "login.email.label" : "Adresse e-mail", 23 "login.email.label" : "Adresse email",
21 "login.headline" : "S'inscrire", 24 "login.headline" : "S'identifier",
22 "login.invalidCredentials" : "E-mail ou mot de passe invalide", 25 "login.invalidCredentials" : "Email ou mot de passe invalide",
23 "login.link.password" : "Réinitialiser le mot de passe", 26 "login.link.password" : "Réinitialiser le mot de passe",
24 "login.link.signup" : "Créer un compte gratuit", 27 "login.link.signup" : "Créer un compte gratuit",
25 "login.password.label" : "Mot de passe", 28 "login.password.label" : "Mot de passe",
26 "login.serverLogout" : "Votre session a expiré. Reconnectez-vous s'il vous plaît.", 29 "login.serverLogout" : "Votre session a expiré. Reconnectez-vous s'il vous plaît.",
27 "login.submit.label" : "Connexion", 30 "login.submit.label" : "Se connecter",
28 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.", 31 "login.tokenExpired" : "Votre session a expiré, veuillez vous reconnecter.",
29 "menu.app.about" : "À propos de Franz", 32 "menu.app.about" : "À propos de Franz",
30 "menu.app.hide" : "Masquer", 33 "menu.app.hide" : "Masquer",
@@ -55,7 +58,7 @@
55 "menu.help.tos" : "Conditions d'utilisation", 58 "menu.help.tos" : "Conditions d'utilisation",
56 "menu.services" : "Services", 59 "menu.services" : "Services",
57 "menu.services.addNewService" : "Ajouter un nouveau service...", 60 "menu.services.addNewService" : "Ajouter un nouveau service...",
58 "menu.view" : "Affichage", 61 "menu.view" : "Aperçu",
59 "menu.view.enterFullScreen" : "Entrer en mode plein écran", 62 "menu.view.enterFullScreen" : "Entrer en mode plein écran",
60 "menu.view.exitFullScreen" : "Sortir du mode plein écran", 63 "menu.view.exitFullScreen" : "Sortir du mode plein écran",
61 "menu.view.reloadFranz" : "Actualiser Franz", 64 "menu.view.reloadFranz" : "Actualiser Franz",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Aucun utilisateur n'a été trouvé avec cette adresse e-mail", 79 "password.noUser" : "Aucun utilisateur n'a été trouvé avec cette adresse e-mail",
77 "password.submit.label" : "Soumettre", 80 "password.submit.label" : "Soumettre",
78 "password.successInfo" : "Merci de consulter vos e-mails", 81 "password.successInfo" : "Merci de consulter vos e-mails",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Soutenez Franz", 83 "pricing.headline" : "Soutenez Franz",
80 "pricing.link.skipPayment" : "Je ne veux pas soutenir le développement de Franz.", 84 "pricing.link.skipPayment" : "Je ne veux pas soutenir le développement de Franz.",
81 "pricing.submit.label" : "Je veux soutenir le développement de Franz", 85 "pricing.submit.label" : "Je veux soutenir le développement de Franz",
@@ -116,7 +120,8 @@
116 "settings.app.form.autoLaunchInBackground" : "Ouvrir en arrière-plan", 120 "settings.app.form.autoLaunchInBackground" : "Ouvrir en arrière-plan",
117 "settings.app.form.autoLaunchOnStart" : "Lancer Franz au démarrage", 121 "settings.app.form.autoLaunchOnStart" : "Lancer Franz au démarrage",
118 "settings.app.form.beta" : "Accepter les versions bêta", 122 "settings.app.form.beta" : "Accepter les versions bêta",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
124 "settings.app.form.enableGPUAcceleration" : "Activer l'accélération GPU",
120 "settings.app.form.enableMenuBar" : "Afficher Franz dans la barre des menus", 125 "settings.app.form.enableMenuBar" : "Afficher Franz dans la barre des menus",
121 "settings.app.form.enableSpellchecking" : "Activer la vérification orthographique", 126 "settings.app.form.enableSpellchecking" : "Activer la vérification orthographique",
122 "settings.app.form.enableSystemTray" : "Afficher Franz dans la barre d'état système", 127 "settings.app.form.enableSystemTray" : "Afficher Franz dans la barre d'état système",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "Garder Franz ouvert en arrière-plan à la fermeture de la fenêtre", 131 "settings.app.form.runInBackground" : "Garder Franz ouvert en arrière-plan à la fermeture de la fenêtre",
127 "settings.app.form.showDisabledServices" : "Afficher les onglets des services désactivés", 132 "settings.app.form.showDisabledServices" : "Afficher les onglets des services désactivés",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Afficher les badges de messages non lus quand les notifications sont désactivées.", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Afficher les badges de messages non lus quand les notifications sont désactivées.",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Paramètres", 135 "settings.app.headline" : "Paramètres",
130 "settings.app.headlineAdvanced" : "Paramètres avancés", 136 "settings.app.headlineAdvanced" : "Paramètres avancés",
131 "settings.app.headlineAppearance" : "Apparence", 137 "settings.app.headlineAppearance" : "Apparence",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "Modifier {name}", 172 "settings.service.form.editServiceHeadline" : "Modifier {name}",
167 "settings.service.form.enableAudio" : "Activer l'audio", 173 "settings.service.form.enableAudio" : "Activer l'audio",
168 "settings.service.form.enableBadge" : "Afficher le badge des messages non lus", 174 "settings.service.form.enableBadge" : "Afficher le badge des messages non lus",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Activer les notifications", 176 "settings.service.form.enableNotification" : "Activer les notifications",
170 "settings.service.form.enableService" : "Activer le service", 177 "settings.service.form.enableService" : "Activer le service",
171 "settings.service.form.headlineBadges" : "Badge des messages non lus", 178 "settings.service.form.headlineBadges" : "Badge des messages non lus",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Afficher le badge des messages pour tous les nouveaux messages", 185 "settings.service.form.indirectMessages" : "Afficher le badge des messages pour tous les nouveaux messages",
179 "settings.service.form.isMutedInfo" : "Lorsque désactivé, tous les sons de notifications ainsi que l'audio sont coupés", 186 "settings.service.form.isMutedInfo" : "Lorsque désactivé, tous les sons de notifications ainsi que l'audio sont coupés",
180 "settings.service.form.name" : "Nom", 187 "settings.service.form.name" : "Nom",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Enregistrer le service", 194 "settings.service.form.saveButton" : "Enregistrer le service",
182 "settings.service.form.tabHosted" : "Hébergé", 195 "settings.service.form.tabHosted" : "Hébergé",
183 "settings.service.form.tabOnPremise" : "Auto-hébergé â­ï¸", 196 "settings.service.form.tabOnPremise" : "Auto-hébergé â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Résidents de l'UE : une taxe locale peut s'appliquer", 233 "subscription.euTaxInfo" : "Résidents de l'UE : une taxe locale peut s'appliquer",
221 "subscription.features.ads" : "Plus de pubs !", 234 "subscription.features.ads" : "Plus de pubs !",
222 "subscription.features.comingSoon" : "Bientôt disponible", 235 "subscription.features.comingSoon" : "Bientôt disponible",
223 "subscription.features.customServices" : "Services privés pour vous et votre équipe",
224 "subscription.features.encryptedSync" : "Synchronisation de session cryptée", 236 "subscription.features.encryptedSync" : "Synchronisation de session cryptée",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Ajouter des services locaux\/hébergés comme HipChat", 238 "subscription.features.onpremise" : "Ajouter des services locaux\/hébergés comme HipChat",
226 "subscription.features.vpn" : "Support des Proxy et VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Le compte payant Supporter Premium Franz inclut", 242 "subscription.includedFeatures" : "Le compte payant Supporter Premium Franz inclut",
228 "subscription.paymentSessionError" : "Initialisation du paiement impossible", 243 "subscription.paymentSessionError" : "Initialisation du paiement impossible",
229 "subscription.submit.label" : "Je souhaite aider au développement de Franz", 244 "subscription.submit.label" : "Je souhaite aider au développement de Franz",
diff --git a/src/i18n/locales/ga.json b/src/i18n/locales/ga.json
index 1c0b537b2..3bb838ba3 100644
--- a/src/i18n/locales/ga.json
+++ b/src/i18n/locales/ga.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Ní féidir nascadh le seirbhísí Franz ar líne", 5 "global.api.unhealthy" : "Ní féidir nascadh le seirbhísí Franz ar líne",
3 "global.notConnectedToTheInternet" : "Níl tú nasctha leis an Idirlíon.", 6 "global.notConnectedToTheInternet" : "Níl tú nasctha leis an Idirlíon.",
4 "import.headline" : "Iompórtáil do sheirbhísí Franz 4", 7 "import.headline" : "Iompórtáil do sheirbhísí Franz 4",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Níor aimsíodh úsáideoir leis an seoladh ríomhphoist seo", 79 "password.noUser" : "Níor aimsíodh úsáideoir leis an seoladh ríomhphoist seo",
77 "password.submit.label" : "Cuir isteach", 80 "password.submit.label" : "Cuir isteach",
78 "password.successInfo" : "Seiceáil do chuid ríomhphoist le do thoil", 81 "password.successInfo" : "Seiceáil do chuid ríomhphoist le do thoil",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Tabhair tacaíocht do Franz", 83 "pricing.headline" : "Tabhair tacaíocht do Franz",
80 "pricing.link.skipPayment" : "Níor mhaith liom tacaíocht a thabhairt d'fhorbairt Franz.", 84 "pricing.link.skipPayment" : "Níor mhaith liom tacaíocht a thabhairt d'fhorbairt Franz.",
81 "pricing.submit.label" : "Ba mhaith liom tacaíocht a thabhairt d'fhorbairt Franz.", 85 "pricing.submit.label" : "Ba mhaith liom tacaíocht a thabhairt d'fhorbairt Franz.",
@@ -116,6 +120,7 @@
116 "settings.app.form.autoLaunchInBackground" : "Oscail sa chúlra", 120 "settings.app.form.autoLaunchInBackground" : "Oscail sa chúlra",
117 "settings.app.form.autoLaunchOnStart" : "Láinseáil Franz ón tús", 121 "settings.app.form.autoLaunchOnStart" : "Láinseáil Franz ón tús",
118 "settings.app.form.beta" : "Cuir leagain béite san áireamh", 122 "settings.app.form.beta" : "Cuir leagain béite san áireamh",
123 "settings.app.form.darkMode" : "Join the Dark Side",
119 "settings.app.form.enableGPUAcceleration" : "Cumasaigh luasghéarú APG", 124 "settings.app.form.enableGPUAcceleration" : "Cumasaigh luasghéarú APG",
120 "settings.app.form.enableMenuBar" : "Taispeáin Franz sa bharra roghchláir", 125 "settings.app.form.enableMenuBar" : "Taispeáin Franz sa bharra roghchláir",
121 "settings.app.form.enableSpellchecking" : "Cumasaigh seiceáil litrithe", 126 "settings.app.form.enableSpellchecking" : "Cumasaigh seiceáil litrithe",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "Coimeád Franz sa chúlra nuair a dhúntar an fhuinneog", 131 "settings.app.form.runInBackground" : "Coimeád Franz sa chúlra nuair a dhúntar an fhuinneog",
127 "settings.app.form.showDisabledServices" : "Taispeáin tabanna do sheirbhísí dhíchumasaithe", 132 "settings.app.form.showDisabledServices" : "Taispeáin tabanna do sheirbhísí dhíchumasaithe",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Taispeáin teachtaireachtaí neamhléite, nuair a dhíchumasaítear fógraí", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Taispeáin teachtaireachtaí neamhléite, nuair a dhíchumasaítear fógraí",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Socruithe", 135 "settings.app.headline" : "Socruithe",
130 "settings.app.headlineAdvanced" : "Casta", 136 "settings.app.headlineAdvanced" : "Casta",
131 "settings.app.headlineAppearance" : "Dealramh", 137 "settings.app.headlineAppearance" : "Dealramh",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "Cuir {name} in eagar", 172 "settings.service.form.editServiceHeadline" : "Cuir {name} in eagar",
167 "settings.service.form.enableAudio" : "Cumasaigh fuaim", 173 "settings.service.form.enableAudio" : "Cumasaigh fuaim",
168 "settings.service.form.enableBadge" : "Taispeáin comhartha do theachtaireachtaí neamhléite", 174 "settings.service.form.enableBadge" : "Taispeáin comhartha do theachtaireachtaí neamhléite",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Cumasaigh fógraí", 176 "settings.service.form.enableNotification" : "Cumasaigh fógraí",
170 "settings.service.form.enableService" : "Cumasaigh seirbhís", 177 "settings.service.form.enableService" : "Cumasaigh seirbhís",
171 "settings.service.form.headlineBadges" : "Comhartha do theachtaireachtaí neamhléite", 178 "settings.service.form.headlineBadges" : "Comhartha do theachtaireachtaí neamhléite",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Taispeáin comhartha theachtaireachta do gach teachtaireacht nua", 185 "settings.service.form.indirectMessages" : "Taispeáin comhartha theachtaireachta do gach teachtaireacht nua",
179 "settings.service.form.isMutedInfo" : "Tachtar gach fuaim fógraí agus athchasadh fuaime", 186 "settings.service.form.isMutedInfo" : "Tachtar gach fuaim fógraí agus athchasadh fuaime",
180 "settings.service.form.name" : "Ainm", 187 "settings.service.form.name" : "Ainm",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Sábháil seirbhís", 194 "settings.service.form.saveButton" : "Sábháil seirbhís",
182 "settings.service.form.tabHosted" : "Óstáilte", 195 "settings.service.form.tabHosted" : "Óstáilte",
183 "settings.service.form.tabOnPremise" : "Féinóstáilte â­ï¸", 196 "settings.service.form.tabOnPremise" : "Féinóstáilte â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Ãithritheoirí an tAÉ: is féidir cáin díolacháin áitiúla a chur i bhfeidhm", 233 "subscription.euTaxInfo" : "Ãithritheoirí an tAÉ: is féidir cáin díolacháin áitiúla a chur i bhfeidhm",
221 "subscription.features.ads" : "Fógraí ar bith, choíche!", 234 "subscription.features.ads" : "Fógraí ar bith, choíche!",
222 "subscription.features.comingSoon" : "ag teacht go luath", 235 "subscription.features.comingSoon" : "ag teacht go luath",
223 "subscription.features.customServices" : "Seirbhísí phríobháideach dhuitse agus do d'fhoireann",
224 "subscription.features.encryptedSync" : "Sionchronú seisiúin chriptithe", 236 "subscription.features.encryptedSync" : "Sionchronú seisiúin chriptithe",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Cuir seirbhísí óstáilte ar nós HipChat leis", 238 "subscription.features.onpremise" : "Cuir seirbhísí óstáilte ar nós HipChat leis",
226 "subscription.features.vpn" : "Tacaíocht seachfhreastalaí ⊠LPF", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Cuireann Cuntas Phŕeimhthacadóra Franz san áireamh", 242 "subscription.includedFeatures" : "Cuireann Cuntas Phŕeimhthacadóra Franz san áireamh",
228 "subscription.paymentSessionError" : "Ní féidir an bhfoirm íocaíochta a lódáil", 243 "subscription.paymentSessionError" : "Ní féidir an bhfoirm íocaíochta a lódáil",
229 "subscription.submit.label" : "Ba mhaith liom tacaíocht a thabhairt d'fhorbairt Franz", 244 "subscription.submit.label" : "Ba mhaith liom tacaíocht a thabhairt d'fhorbairt Franz",
diff --git a/src/i18n/locales/hr.json b/src/i18n/locales/hr.json
index e227c4537..ae9f25695 100644
--- a/src/i18n/locales/hr.json
+++ b/src/i18n/locales/hr.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Nije se moguće povezati na Francove on-line servise. ", 5 "global.api.unhealthy" : "Nije se moguće povezati na Francove on-line servise. ",
3 "global.notConnectedToTheInternet" : "Sada ste povezani s internetom. ", 6 "global.notConnectedToTheInternet" : "Sada ste povezani s internetom. ",
4 "import.headline" : "Uvezite svoje Franc 4 servise. ", 7 "import.headline" : "Uvezite svoje Franc 4 servise. ",
@@ -26,7 +29,7 @@
26 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.", 29 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.",
27 "login.submit.label" : "Prijavite se", 30 "login.submit.label" : "Prijavite se",
28 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.", 31 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.",
29 "menu.app.about" : "About Franz", 32 "menu.app.about" : "O aplikaciji",
30 "menu.app.hide" : "Hide", 33 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "Hide Others",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "Quit",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Ne postoji ni jedan korisnik s tom e-mail adresom", 79 "password.noUser" : "Ne postoji ni jedan korisnik s tom e-mail adresom",
77 "password.submit.label" : "Pošalji", 80 "password.submit.label" : "Pošalji",
78 "password.successInfo" : "Molimo Vas da provjerite svoju e-mail adresu", 81 "password.successInfo" : "Molimo Vas da provjerite svoju e-mail adresu",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Podržite Franz aplikaciju", 83 "pricing.headline" : "Podržite Franz aplikaciju",
80 "pricing.link.skipPayment" : "Ne želim da podržim razvoj Franz-a.", 84 "pricing.link.skipPayment" : "Ne želim da podržim razvoj Franz-a.",
81 "pricing.submit.label" : "Želim da podržim razvoj Franz-a.", 85 "pricing.submit.label" : "Želim da podržim razvoj Franz-a.",
@@ -116,16 +120,18 @@
116 "settings.app.form.autoLaunchInBackground" : "Otvori u pozadini", 120 "settings.app.form.autoLaunchInBackground" : "Otvori u pozadini",
117 "settings.app.form.autoLaunchOnStart" : "Pokreni Franz sa sistemom", 121 "settings.app.form.autoLaunchOnStart" : "Pokreni Franz sa sistemom",
118 "settings.app.form.beta" : "Obuhvati i beta verzije", 122 "settings.app.form.beta" : "Obuhvati i beta verzije",
123 "settings.app.form.darkMode" : "Join the Dark Side",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 124 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
120 "settings.app.form.enableMenuBar" : "Prikaži Franz u traci izbornika", 125 "settings.app.form.enableMenuBar" : "Prikaži Franz u traci izbornika",
121 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa", 126 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa",
122 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci", 127 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci",
123 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 128 "settings.app.form.hideDockIcon" : "Sakrij ikonu Franz u prostoru za obavijesti",
124 "settings.app.form.language" : "Jezik", 129 "settings.app.form.language" : "Jezik",
125 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku", 130 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku",
126 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren", 131 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren",
127 "settings.app.form.showDisabledServices" : "Prikaži ploÄe s onemogućenim servisima", 132 "settings.app.form.showDisabledServices" : "Prikaži ploÄe s onemogućenim servisima",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Pokaži neproÄitane znaÄke poruka kad se obavjeÅ¡tenja onemoguće", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Pokaži neproÄitane znaÄke poruka kad se obavjeÅ¡tenja onemoguće",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Postavke", 135 "settings.app.headline" : "Postavke",
130 "settings.app.headlineAdvanced" : "Napredne alatke", 136 "settings.app.headlineAdvanced" : "Napredne alatke",
131 "settings.app.headlineAppearance" : "Izgled", 137 "settings.app.headlineAppearance" : "Izgled",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "Uredite {ime}", 172 "settings.service.form.editServiceHeadline" : "Uredite {ime}",
167 "settings.service.form.enableAudio" : "Omogućite zvuk", 173 "settings.service.form.enableAudio" : "Omogućite zvuk",
168 "settings.service.form.enableBadge" : "Show unread message badges", 174 "settings.service.form.enableBadge" : "Show unread message badges",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Omogućite obavijesti", 176 "settings.service.form.enableNotification" : "Omogućite obavijesti",
170 "settings.service.form.enableService" : "Omogućite usluge", 177 "settings.service.form.enableService" : "Omogućite usluge",
171 "settings.service.form.headlineBadges" : "Unread message badges", 178 "settings.service.form.headlineBadges" : "Unread message badges",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Prikaži znaÄku na svim novim porukuama", 185 "settings.service.form.indirectMessages" : "Prikaži znaÄku na svim novim porukuama",
179 "settings.service.form.isMutedInfo" : "Kada je onemogućeno, sve obavijesti, svi zvukovi i sva pozadinska podrÅ¡ka će biti neÄujna. ", 186 "settings.service.form.isMutedInfo" : "Kada je onemogućeno, sve obavijesti, svi zvukovi i sva pozadinska podrÅ¡ka će biti neÄujna. ",
180 "settings.service.form.name" : "Ime", 187 "settings.service.form.name" : "Ime",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "SaÄuvaj uslugu\/e", 194 "settings.service.form.saveButton" : "SaÄuvaj uslugu\/e",
182 "settings.service.form.tabHosted" : "Hostovano", 195 "settings.service.form.tabHosted" : "Hostovano",
183 "settings.service.form.tabOnPremise" : "Samo-hostovano â­ï¸", 196 "settings.service.form.tabOnPremise" : "Samo-hostovano â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje ", 233 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje ",
221 "subscription.features.ads" : "Bez reklama, doživotno!", 234 "subscription.features.ads" : "Bez reklama, doživotno!",
222 "subscription.features.comingSoon" : "Dolazi uskoro", 235 "subscription.features.comingSoon" : "Dolazi uskoro",
223 "subscription.features.customServices" : "Privatni servisi za Vas i Vaš tim",
224 "subscription.features.encryptedSync" : "Kodirano usklađivanje sesija.", 236 "subscription.features.encryptedSync" : "Kodirano usklađivanje sesija.",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Dodajte pretpostavljeni\/hostirani servis kao Å¡to ima usluga HipChat ", 238 "subscription.features.onpremise" : "Dodajte pretpostavljeni\/hostirani servis kao Å¡to ima usluga HipChat ",
226 "subscription.features.vpn" : "Podrška za Proxy i VPM ( VPN )", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Plaćeni\/Premium raÄun ukljuÄuje sljedeće: ", 242 "subscription.includedFeatures" : "Plaćeni\/Premium raÄun ukljuÄuje sljedeće: ",
228 "subscription.paymentSessionError" : "Nemoguće inicijalizirati obrazac za uplatu", 243 "subscription.paymentSessionError" : "Nemoguće inicijalizirati obrazac za uplatu",
229 "subscription.submit.label" : "Želim da podržim razvoj Franca. ", 244 "subscription.submit.label" : "Želim da podržim razvoj Franca. ",
diff --git a/src/i18n/locales/hu.json b/src/i18n/locales/hu.json
index 3571ad453..365dec9c6 100644
--- a/src/i18n/locales/hu.json
+++ b/src/i18n/locales/hu.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Nem lehet csatlakozni a Franz online szolgáltatáshoz", 5 "global.api.unhealthy" : "Nem lehet csatlakozni a Franz online szolgáltatáshoz",
3 "global.notConnectedToTheInternet" : "Nincs hálózati kapcsolat.", 6 "global.notConnectedToTheInternet" : "Nincs hálózati kapcsolat.",
4 "import.headline" : "Importáld szolgáltatásaidat a Franz 4-ből", 7 "import.headline" : "Importáld szolgáltatásaidat a Franz 4-ből",
@@ -16,7 +19,7 @@
16 "invite.name.label" : "Név", 19 "invite.name.label" : "Név",
17 "invite.skip.label" : "Későbbre halasztom", 20 "invite.skip.label" : "Későbbre halasztom",
18 "invite.submit.label" : "Meghívók küldése", 21 "invite.submit.label" : "Meghívók küldése",
19 "invite.successInfo" : "Invitations sent successfully", 22 "invite.successInfo" : "Meghívás sikeresen elküldve",
20 "login.email.label" : "Email cím", 23 "login.email.label" : "Email cím",
21 "login.headline" : "Bejelentkezés", 24 "login.headline" : "Bejelentkezés",
22 "login.invalidCredentials" : "Hibás email cím vagy jelszó", 25 "login.invalidCredentials" : "Hibás email cím vagy jelszó",
@@ -26,49 +29,49 @@
26 "login.serverLogout" : "A munkamenet lejárt, kérlek lépj be újra.", 29 "login.serverLogout" : "A munkamenet lejárt, kérlek lépj be újra.",
27 "login.submit.label" : "Bejelentkezés", 30 "login.submit.label" : "Bejelentkezés",
28 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.", 31 "login.tokenExpired" : "A munkamenet lejárt, kérlek lépj be újra.",
29 "menu.app.about" : "About Franz", 32 "menu.app.about" : "Névjegy",
30 "menu.app.hide" : "Hide", 33 "menu.app.hide" : "Elrejt",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "Többi elrejtése",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "Kilépés",
33 "menu.app.settings" : "Beállítások", 36 "menu.app.settings" : "Beállítások",
34 "menu.app.unhide" : "Unhide", 37 "menu.app.unhide" : "Megjelenít",
35 "menu.edit" : "Szerkesztés", 38 "menu.edit" : "Szerkesztés",
36 "menu.edit.copy" : "Copy", 39 "menu.edit.copy" : "Másolás",
37 "menu.edit.cut" : "Cut", 40 "menu.edit.cut" : "Kivágás",
38 "menu.edit.delete" : "Törlés", 41 "menu.edit.delete" : "Törlés",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "Emoji és Szimbólumok",
40 "menu.edit.paste" : "Paste", 43 "menu.edit.paste" : "Beillesztés",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Beillesztés ugyanazzal a megjelenéssel",
42 "menu.edit.redo" : "Redo", 45 "menu.edit.redo" : "Újra",
43 "menu.edit.selectAll" : "Select All", 46 "menu.edit.selectAll" : "Összes kijelölése",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Beszéd",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "Diktálás elkezdése",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "Beszélgetés kezdeményezése",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "Beszéd vége",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "Visszavonás",
49 "menu.file" : "File", 52 "menu.file" : "fájl",
50 "menu.help" : "Help", 53 "menu.help" : "Súgó",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "Változások listája",
52 "menu.help.learnMore" : "Learn More", 55 "menu.help.learnMore" : "Tudjon meg többet",
53 "menu.help.privacy" : "Adatvédelmi Nyilatkozatot", 56 "menu.help.privacy" : "Adatvédelmi Nyilatkozatot",
54 "menu.help.support" : "Support", 57 "menu.help.support" : "Támogatás",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "Felhasználói feltételek",
56 "menu.services" : "Services", 59 "menu.services" : "Szolgáltatások",
57 "menu.services.addNewService" : "Add New Service...", 60 "menu.services.addNewService" : "Új kiszolgáló hozzáadása",
58 "menu.view" : "View", 61 "menu.view" : "Nézet",
59 "menu.view.enterFullScreen" : "Enter Full Screen", 62 "menu.view.enterFullScreen" : "Kilépés a teljes képernyős módból",
60 "menu.view.exitFullScreen" : "Exit Full Screen", 63 "menu.view.exitFullScreen" : "Kilépés a teljes képernyős módból",
61 "menu.view.reloadFranz" : "Reload Franz", 64 "menu.view.reloadFranz" : "Franz újrainditása",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "Kiszolgáló újraindítása",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "Tényleges méret",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "fejlesztői eszközök bekapcsolása",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "Váltás Teljes képernyős módra",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Kiszolgáló Fejlesztői Eszközök Bekapcsolása",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "Nagyítás",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "Kicsinyítés",
69 "menu.window" : "Window", 72 "menu.window" : "Ablak",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "Bezárás",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "Tálcára",
72 "password.email.label" : "Email cím", 75 "password.email.label" : "Email cím",
73 "password.headline" : "Jelszó visszaállítása", 76 "password.headline" : "Jelszó visszaállítása",
74 "password.link.login" : "Jelentkezz be a fiókodba", 77 "password.link.login" : "Jelentkezz be a fiókodba",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Nem található felhasználó a megadott email címmel", 79 "password.noUser" : "Nem található felhasználó a megadott email címmel",
77 "password.submit.label" : "Küldés", 80 "password.submit.label" : "Küldés",
78 "password.successInfo" : "Ellenőrizd az email fiókodat", 81 "password.successInfo" : "Ellenőrizd az email fiókodat",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Támogasd a Franz-ot", 83 "pricing.headline" : "Támogasd a Franz-ot",
80 "pricing.link.skipPayment" : "Nem szeretném támogatni a Franz fejlesztését.", 84 "pricing.link.skipPayment" : "Nem szeretném támogatni a Franz fejlesztését.",
81 "pricing.submit.label" : "Támogatni szeretném a Franz fejlesztését.", 85 "pricing.submit.label" : "Támogatni szeretném a Franz fejlesztését.",
@@ -116,16 +120,18 @@
116 "settings.app.form.autoLaunchInBackground" : "Megnyitás háttérben", 120 "settings.app.form.autoLaunchInBackground" : "Megnyitás háttérben",
117 "settings.app.form.autoLaunchOnStart" : "Franz betöltése indításkor", 121 "settings.app.form.autoLaunchOnStart" : "Franz betöltése indításkor",
118 "settings.app.form.beta" : "Béta verziók keresése", 122 "settings.app.form.beta" : "Béta verziók keresése",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
120 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 124 "settings.app.form.enableGPUAcceleration" : "hardveres gyorsítás engedélyezése",
125 "settings.app.form.enableMenuBar" : "Franz megjelenítése a menüsorban",
121 "settings.app.form.enableSpellchecking" : "Helyesírás-ellenőrzés engedélyezése", 126 "settings.app.form.enableSpellchecking" : "Helyesírás-ellenőrzés engedélyezése",
122 "settings.app.form.enableSystemTray" : "Franz mutatása a tálcán", 127 "settings.app.form.enableSystemTray" : "Franz mutatása a tálcán",
123 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 128 "settings.app.form.hideDockIcon" : "Franz ikon elrejtése a Dock mögött",
124 "settings.app.form.language" : "Nyelv", 129 "settings.app.form.language" : "Nyelv",
125 "settings.app.form.minimizeToSystemTray" : "Franz kicsinyítése a tálcára", 130 "settings.app.form.minimizeToSystemTray" : "Franz kicsinyítése a tálcára",
126 "settings.app.form.runInBackground" : "Franz fusson a háttérben az ablak bezárásakor", 131 "settings.app.form.runInBackground" : "Franz fusson a háttérben az ablak bezárásakor",
127 "settings.app.form.showDisabledServices" : "Letiltott szolgáltatások megjelenítése", 132 "settings.app.form.showDisabledServices" : "Letiltott szolgáltatások megjelenítése",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Mutass az 'olvasatlan üzenet' jelzést amikor az értesítések le vannak tiltva.", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Mutass az 'olvasatlan üzenet' jelzést amikor az értesítések le vannak tiltva.",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Beállítások", 135 "settings.app.headline" : "Beállítások",
130 "settings.app.headlineAdvanced" : "Haladó", 136 "settings.app.headlineAdvanced" : "Haladó",
131 "settings.app.headlineAppearance" : "Megjelenés", 137 "settings.app.headlineAppearance" : "Megjelenés",
@@ -138,10 +144,10 @@
138 "settings.app.updateStatusAvailable" : "Frissítés elérhető, letöltés folyamatban...", 144 "settings.app.updateStatusAvailable" : "Frissítés elérhető, letöltés folyamatban...",
139 "settings.app.updateStatusSearching" : "Frissítéseket keres", 145 "settings.app.updateStatusSearching" : "Frissítéseket keres",
140 "settings.app.updateStatusUpToDate" : "A Franz legfrissebb verzióját használod", 146 "settings.app.updateStatusUpToDate" : "A Franz legfrissebb verzióját használod",
141 "settings.invite.headline" : "Invite Friends", 147 "settings.invite.headline" : "Barát meghívása",
142 "settings.navigation.account" : "Fiók", 148 "settings.navigation.account" : "Fiók",
143 "settings.navigation.availableServices" : "Elérhető szolgáltatások", 149 "settings.navigation.availableServices" : "Elérhető szolgáltatások",
144 "settings.navigation.inviteFriends" : "Invite Friends", 150 "settings.navigation.inviteFriends" : "Barát meghívása",
145 "settings.navigation.logout" : "Kijelentkezés", 151 "settings.navigation.logout" : "Kijelentkezés",
146 "settings.navigation.settings" : "Beállítások", 152 "settings.navigation.settings" : "Beállítások",
147 "settings.navigation.yourServices" : "Szolgáltatásaid", 153 "settings.navigation.yourServices" : "Szolgáltatásaid",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "{name} szerkesztése", 172 "settings.service.form.editServiceHeadline" : "{name} szerkesztése",
167 "settings.service.form.enableAudio" : "Hang engedélyezése", 173 "settings.service.form.enableAudio" : "Hang engedélyezése",
168 "settings.service.form.enableBadge" : "Mutasd az olvasatlan jelzéseket", 174 "settings.service.form.enableBadge" : "Mutasd az olvasatlan jelzéseket",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Értesítések engedélyezése", 176 "settings.service.form.enableNotification" : "Értesítések engedélyezése",
170 "settings.service.form.enableService" : "Szolgáltatás engedélyezése", 177 "settings.service.form.enableService" : "Szolgáltatás engedélyezése",
171 "settings.service.form.headlineBadges" : "Olvasatlan üzenet jelzések", 178 "settings.service.form.headlineBadges" : "Olvasatlan üzenet jelzések",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Üzenet kitűző megjelenítése minden üzenethez", 185 "settings.service.form.indirectMessages" : "Üzenet kitűző megjelenítése minden üzenethez",
179 "settings.service.form.isMutedInfo" : "Ha kikapcsolod, minden értesítési és lejátszott hang némításra kerül.", 186 "settings.service.form.isMutedInfo" : "Ha kikapcsolod, minden értesítési és lejátszott hang némításra kerül.",
180 "settings.service.form.name" : "Név", 187 "settings.service.form.name" : "Név",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Szolgáltatás mentése", 194 "settings.service.form.saveButton" : "Szolgáltatás mentése",
182 "settings.service.form.tabHosted" : "Ãœzemeltetett", 195 "settings.service.form.tabHosted" : "Ãœzemeltetett",
183 "settings.service.form.tabOnPremise" : "Egyénileg üzemeltetett", 196 "settings.service.form.tabOnPremise" : "Egyénileg üzemeltetett",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "EU állampolgárok: helyi vásárlás esetén adók kerülhetnek felszámolásra", 233 "subscription.euTaxInfo" : "EU állampolgárok: helyi vásárlás esetén adók kerülhetnek felszámolásra",
221 "subscription.features.ads" : "Hirdetésmentes, mindig!", 234 "subscription.features.ads" : "Hirdetésmentes, mindig!",
222 "subscription.features.comingSoon" : "Hamarosan!", 235 "subscription.features.comingSoon" : "Hamarosan!",
223 "subscription.features.customServices" : "Privát szolgáltatások neked és a csapatodnak",
224 "subscription.features.encryptedSync" : "Titkosított munkamenet szinkronizálás", 236 "subscription.features.encryptedSync" : "Titkosított munkamenet szinkronizálás",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Helyi\/üzemeltetett szolgáltatások használata, pl. HipChat", 238 "subscription.features.onpremise" : "Helyi\/üzemeltetett szolgáltatások használata, pl. HipChat",
226 "subscription.features.vpn" : "Proxy & VPN támogatás", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Az előfizetett Franz Prémium Támogató Fiók tartalmazza", 242 "subscription.includedFeatures" : "Az előfizetett Franz Prémium Támogató Fiók tartalmazza",
228 "subscription.paymentSessionError" : "Nem sikerült a fizetési felületet betölteni", 243 "subscription.paymentSessionError" : "Nem sikerült a fizetési felületet betölteni",
229 "subscription.submit.label" : "Szeretném támogatni a Franz fejlesztését", 244 "subscription.submit.label" : "Szeretném támogatni a Franz fejlesztését",
@@ -241,10 +256,10 @@
241 "tabs.item.enableNotification" : "Értesítések engedélyezése", 256 "tabs.item.enableNotification" : "Értesítések engedélyezése",
242 "tabs.item.enableService" : "Szolgáltatás engedélyezése", 257 "tabs.item.enableService" : "Szolgáltatás engedélyezése",
243 "tabs.item.reload" : "Újratöltés", 258 "tabs.item.reload" : "Újratöltés",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{field} nem érvényes",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "{field} legalább {length} karakter hosszúnak kell lennie",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{field} Kitöltése kötelező",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field} nem érvényes URL",
248 "welcome.loginButton" : "Jelentkezz be a fiókodba", 263 "welcome.loginButton" : "Jelentkezz be a fiókodba",
249 "welcome.signupButton" : "Új fiók létrehozása", 264 "welcome.signupButton" : "Új fiók létrehozása",
250 "welcome.slogan" : "Üzenetküldés okosan" 265 "welcome.slogan" : "Üzenetküldés okosan"
diff --git a/src/i18n/locales/id.json b/src/i18n/locales/id.json
index e6d671c1b..437c1304f 100644
--- a/src/i18n/locales/id.json
+++ b/src/i18n/locales/id.json
@@ -1,74 +1,77 @@
1{ 1{
2 "global.api.unhealthy" : "Tidak bisa tersambung ke layanan Franz", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "global.notConnectedToTheInternet" : "Anda tidak tersambung ke internet.", 3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "global.api.unhealthy" : "Tidak dapat tersambung ke layanan Franz",
6 "global.notConnectedToTheInternet" : "Anda tidak mempunyai koneksi internet",
4 "import.headline" : "Impor layanan Franz 4 Anda", 7 "import.headline" : "Impor layanan Franz 4 Anda",
5 "import.notSupportedHeadline" : "Layanan belum didukung di Franz 5", 8 "import.notSupportedHeadline" : "Layanan belum didukung di Franz 5",
6 "import.skip.label" : "Saya ingin menambahkan layanan secara manual", 9 "import.skip.label" : "Saya ingin menambahkan layanan secara manual",
7 "import.submit.label" : "Impor layanan", 10 "import.submit.label" : "Impor layanan",
8 "infobar.buttonChangelog" : "Yang baru", 11 "infobar.buttonChangelog" : "Apa yang baru?",
9 "infobar.buttonInstallUpdate" : "Mulai ulang dan instal versi baru", 12 "infobar.buttonInstallUpdate" : "Mulai ulang & instal pembaruan",
10 "infobar.buttonReloadServices" : "Muat ulang layanan", 13 "infobar.buttonReloadServices" : "Muat ulang layanan",
11 "infobar.requiredRequestsFailed" : "Tidak bisa memuat layanan dan informasi pengguna", 14 "infobar.requiredRequestsFailed" : "Gagal memuat layanan dan informasi pengguna",
12 "infobar.servicesUpdated" : "Layanan Anda telah diperbarui", 15 "infobar.servicesUpdated" : "Layanan Anda telah diperbarui",
13 "infobar.updateAvailable" : "Versi baru Franz tersedia.", 16 "infobar.updateAvailable" : "Versi baru Franz tersedia.",
14 "invite.email.label" : "Alamat email", 17 "invite.email.label" : "Alamat email",
15 "invite.headline.friends" : "Undang 3 teman atau kolega Anda", 18 "invite.headline.friends" : "Undang 3 teman atau kolega Anda",
16 "invite.name.label" : "Nama", 19 "invite.name.label" : "Nama",
17 "invite.skip.label" : "Saya ingin melakukannya nanti saja", 20 "invite.skip.label" : "Nanti saja",
18 "invite.submit.label" : "Kirim undangan", 21 "invite.submit.label" : "Kirim undangan",
19 "invite.successInfo" : "Undangan berhasil dikirim", 22 "invite.successInfo" : "Undangan berhasil dikirim",
20 "login.email.label" : "Alamat email", 23 "login.email.label" : "Alamat email",
21 "login.headline" : "Masuk", 24 "login.headline" : "Masuk",
22 "login.invalidCredentials" : "Email atau sandi tidak valid", 25 "login.invalidCredentials" : "Email atau sandi salah",
23 "login.link.password" : "Setel ulang sandi", 26 "login.link.password" : "Setel ulang sandi",
24 "login.link.signup" : "Buat akun gratis", 27 "login.link.signup" : "Buat akun gratis",
25 "login.password.label" : "Sandi", 28 "login.password.label" : "Sandi",
26 "login.serverLogout" : "Sesi Anda telah berakhir, silakan masuk kembali.", 29 "login.serverLogout" : "Sesi Anda telah berakhir, silakan masuk kembali.",
27 "login.submit.label" : "Masuk", 30 "login.submit.label" : "Masuk",
28 "login.tokenExpired" : "Sesi Anda kedaluwarsa, silakan masuk kembali.", 31 "login.tokenExpired" : "Sesi Anda telah kedaluwarsa, silakan masuk kembali.",
29 "menu.app.about" : "About Franz", 32 "menu.app.about" : "Tentang Franz",
30 "menu.app.hide" : "Hide", 33 "menu.app.hide" : "Sembunyikan",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "Sembunyikan Lainnya",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "Keluar",
33 "menu.app.settings" : "Pengaturan", 36 "menu.app.settings" : "Pengaturan",
34 "menu.app.unhide" : "Unhide", 37 "menu.app.unhide" : "Perlihatkan",
35 "menu.edit" : "Edit", 38 "menu.edit" : "Edit",
36 "menu.edit.copy" : "Copy", 39 "menu.edit.copy" : "Salin",
37 "menu.edit.cut" : "Cut", 40 "menu.edit.cut" : "Potong",
38 "menu.edit.delete" : "Hapus", 41 "menu.edit.delete" : "Hapus",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "Emoji & Simbol",
40 "menu.edit.paste" : "Paste", 43 "menu.edit.paste" : "Tempel",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Tempel dan Cocokkan Gaya",
42 "menu.edit.redo" : "Redo", 45 "menu.edit.redo" : "Ulangi lagi",
43 "menu.edit.selectAll" : "Select All", 46 "menu.edit.selectAll" : "Pilih Semua",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Bicara",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "Mulai Dikte",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "Mulai Berbicara",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "Berhenti Berbicara",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "Batalkan",
49 "menu.file" : "File", 52 "menu.file" : "Berkas",
50 "menu.help" : "Help", 53 "menu.help" : "Bantuan",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "Log Perubahan",
52 "menu.help.learnMore" : "Learn More", 55 "menu.help.learnMore" : "Pelajari Lebih Lanjut",
53 "menu.help.privacy" : "Pernyataan Privasi", 56 "menu.help.privacy" : "Pernyataan Privasi",
54 "menu.help.support" : "Support", 57 "menu.help.support" : "Dukungan",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "Ketentuan Layanan",
56 "menu.services" : "Services", 59 "menu.services" : "Layanan",
57 "menu.services.addNewService" : "Add New Service...", 60 "menu.services.addNewService" : "Tambahkan Layanan Baru...",
58 "menu.view" : "View", 61 "menu.view" : "Tampilan",
59 "menu.view.enterFullScreen" : "Enter Full Screen", 62 "menu.view.enterFullScreen" : "Masuk ke Mode Layar Penuh",
60 "menu.view.exitFullScreen" : "Exit Full Screen", 63 "menu.view.exitFullScreen" : "Keluar dari Layar Penuh",
61 "menu.view.reloadFranz" : "Reload Franz", 64 "menu.view.reloadFranz" : "Muat Ulang Franz",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "Muat ulang Layanan",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "Ukuran Sebenarnya",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Aktif\/Nonaktifkan alat pengembang",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "Aktif\/Nonaktifkan Layar Penuh",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Aktif\/Nonaktifkan layanan alat pengembang",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "Perbesar",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "Perkecil",
69 "menu.window" : "Window", 72 "menu.window" : "Jendela",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "Tutup",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "Minimalkan",
72 "password.email.label" : "Alamat email", 75 "password.email.label" : "Alamat email",
73 "password.headline" : "Setel ulang sandi", 76 "password.headline" : "Setel ulang sandi",
74 "password.link.login" : "Masuk ke akun Anda", 77 "password.link.login" : "Masuk ke akun Anda",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Tidak ditemukan pengguna dengan email tersebut", 79 "password.noUser" : "Tidak ditemukan pengguna dengan email tersebut",
77 "password.submit.label" : "Kirim", 80 "password.submit.label" : "Kirim",
78 "password.successInfo" : "Periksa email Anda", 81 "password.successInfo" : "Periksa email Anda",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Dukung Franz", 83 "pricing.headline" : "Dukung Franz",
80 "pricing.link.skipPayment" : "Saya tidak ingin mendukung pengembangan Franz.", 84 "pricing.link.skipPayment" : "Saya tidak ingin mendukung pengembangan Franz.",
81 "pricing.submit.label" : "Saya ingin mendukung pengembangan Franz", 85 "pricing.submit.label" : "Saya ingin mendukung pengembangan Franz",
@@ -86,7 +90,7 @@
86 "service.crashHandler.text" : "{name} menyebabkan kesalahan.", 90 "service.crashHandler.text" : "{name} menyebabkan kesalahan.",
87 "service.disabledHandler.action" : "Aktifkan {name}", 91 "service.disabledHandler.action" : "Aktifkan {name}",
88 "service.disabledHandler.headline" : "{name} dinonaktifkan", 92 "service.disabledHandler.headline" : "{name} dinonaktifkan",
89 "services.getStarted" : "Memulai", 93 "services.getStarted" : "Ayo mulai!",
90 "services.welcome" : "Selamat datang di Franz", 94 "services.welcome" : "Selamat datang di Franz",
91 "settings.account.account.editButton" : "Edit akun", 95 "settings.account.account.editButton" : "Edit akun",
92 "settings.account.accountType.basic" : "Akun Dasar", 96 "settings.account.accountType.basic" : "Akun Dasar",
@@ -107,7 +111,7 @@
107 "settings.account.manageSubscription.label" : "Kelola langganan Anda", 111 "settings.account.manageSubscription.label" : "Kelola langganan Anda",
108 "settings.account.successInfo" : "Perubahan Anda telah disimpan", 112 "settings.account.successInfo" : "Perubahan Anda telah disimpan",
109 "settings.account.tryReloadUserInfoRequest" : "Coba lagi", 113 "settings.account.tryReloadUserInfoRequest" : "Coba lagi",
110 "settings.account.userInfoRequestFailed" : "Tidak bisa memuat informasi pengguna", 114 "settings.account.userInfoRequestFailed" : "Gagal memuat informasi pengguna",
111 "settings.app.buttonClearAllCache" : "Bersihkan singgahan", 115 "settings.app.buttonClearAllCache" : "Bersihkan singgahan",
112 "settings.app.buttonInstallUpdate" : "Mulai ulang dan instal versi baru", 116 "settings.app.buttonInstallUpdate" : "Mulai ulang dan instal versi baru",
113 "settings.app.buttonSearchForUpdate" : "Periksa versi baru", 117 "settings.app.buttonSearchForUpdate" : "Periksa versi baru",
@@ -116,7 +120,8 @@
116 "settings.app.form.autoLaunchInBackground" : "Buka di latar belakang", 120 "settings.app.form.autoLaunchInBackground" : "Buka di latar belakang",
117 "settings.app.form.autoLaunchOnStart" : "Jalankan Franz saat komputer dimulai", 121 "settings.app.form.autoLaunchOnStart" : "Jalankan Franz saat komputer dimulai",
118 "settings.app.form.beta" : "Sertakan versi beta", 122 "settings.app.form.beta" : "Sertakan versi beta",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
124 "settings.app.form.enableGPUAcceleration" : "Aktifkan Akselerasi GPU",
120 "settings.app.form.enableMenuBar" : "Tampilkan Franz di Bilah Menu", 125 "settings.app.form.enableMenuBar" : "Tampilkan Franz di Bilah Menu",
121 "settings.app.form.enableSpellchecking" : "Aktifkan pemeriksaan ejaan", 126 "settings.app.form.enableSpellchecking" : "Aktifkan pemeriksaan ejaan",
122 "settings.app.form.enableSystemTray" : "Tampilkan Franz di baki sistem", 127 "settings.app.form.enableSystemTray" : "Tampilkan Franz di baki sistem",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "Tetap jalankan Franz di latar belakang saat menutup jendela", 131 "settings.app.form.runInBackground" : "Tetap jalankan Franz di latar belakang saat menutup jendela",
127 "settings.app.form.showDisabledServices" : "Tampilkan tab layanan yang dinonaktifkan", 132 "settings.app.form.showDisabledServices" : "Tampilkan tab layanan yang dinonaktifkan",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Tampilkan lencana pesan belum dibaca saat pemberitahuan dinonaktifkan", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Tampilkan lencana pesan belum dibaca saat pemberitahuan dinonaktifkan",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Pengaturan", 135 "settings.app.headline" : "Pengaturan",
130 "settings.app.headlineAdvanced" : "Tingkat Lanjut", 136 "settings.app.headlineAdvanced" : "Tingkat Lanjut",
131 "settings.app.headlineAppearance" : "Tampilan", 137 "settings.app.headlineAppearance" : "Tampilan",
@@ -149,7 +155,7 @@
149 "settings.recipes.dev" : "Pengembangan", 155 "settings.recipes.dev" : "Pengembangan",
150 "settings.recipes.headline" : "Layanan tersedia", 156 "settings.recipes.headline" : "Layanan tersedia",
151 "settings.recipes.missingService" : "Layanan tidak tersedia?", 157 "settings.recipes.missingService" : "Layanan tidak tersedia?",
152 "settings.recipes.mostPopular" : "Paling populer", 158 "settings.recipes.mostPopular" : "Terpopuler",
153 "settings.recipes.nothingFound" : "Maaf, tidak ada layanan yang cocok dengan pencarian Anda.", 159 "settings.recipes.nothingFound" : "Maaf, tidak ada layanan yang cocok dengan pencarian Anda.",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "Layanan berhasil ditambahkan", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "Layanan berhasil ditambahkan",
155 "settings.searchService" : "Cari layanan", 161 "settings.searchService" : "Cari layanan",
@@ -161,11 +167,12 @@
161 "settings.service.form.customUrl" : "Server khusus", 167 "settings.service.form.customUrl" : "Server khusus",
162 "settings.service.form.customUrlPremiumInfo" : "Untuk menambahkan layanan hosted yang dijalankan mandiri, Anda membutuhkan Franz Premium Supporter Account.", 168 "settings.service.form.customUrlPremiumInfo" : "Untuk menambahkan layanan hosted yang dijalankan mandiri, Anda membutuhkan Franz Premium Supporter Account.",
163 "settings.service.form.customUrlUpgradeAccount" : "Tingkatkan akun Anda", 169 "settings.service.form.customUrlUpgradeAccount" : "Tingkatkan akun Anda",
164 "settings.service.form.customUrlValidationError" : "Tidak bisa memvalidasi server {name} khusus.", 170 "settings.service.form.customUrlValidationError" : "Gagal memvalidasi server {nama} khusus.",
165 "settings.service.form.deleteButton" : "Hapus layanan", 171 "settings.service.form.deleteButton" : "Hapus layanan",
166 "settings.service.form.editServiceHeadline" : "Edit {name}", 172 "settings.service.form.editServiceHeadline" : "Edit {nama}",
167 "settings.service.form.enableAudio" : "Aktifkan audio", 173 "settings.service.form.enableAudio" : "Aktifkan audio",
168 "settings.service.form.enableBadge" : "Tampilkan lencana pesan belum dibaca", 174 "settings.service.form.enableBadge" : "Tampilkan lencana pesan belum dibaca",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Aktifkan pemberitahuan", 176 "settings.service.form.enableNotification" : "Aktifkan pemberitahuan",
170 "settings.service.form.enableService" : "Aktifkan layanan", 177 "settings.service.form.enableService" : "Aktifkan layanan",
171 "settings.service.form.headlineBadges" : "Lencana pesan belum dibaca", 178 "settings.service.form.headlineBadges" : "Lencana pesan belum dibaca",
@@ -175,9 +182,15 @@
175 "settings.service.form.iconDelete" : "Hapus", 182 "settings.service.form.iconDelete" : "Hapus",
176 "settings.service.form.iconUpload" : "Lepaskan gambar atau klik di sini", 183 "settings.service.form.iconUpload" : "Lepaskan gambar atau klik di sini",
177 "settings.service.form.indirectMessageInfo" : "Anda akan diberi tahu tentang semua pesan dalam kanal, bukan hanya @username, @channel, @here, ...", 184 "settings.service.form.indirectMessageInfo" : "Anda akan diberi tahu tentang semua pesan dalam kanal, bukan hanya @username, @channel, @here, ...",
178 "settings.service.form.indirectMessages" : "Tampilkan lencana pesan untuk semua pesan", 185 "settings.service.form.indirectMessages" : "Tampilkan lencana pesan untuk semua pesan baru",
179 "settings.service.form.isMutedInfo" : "Saat dinonaktifkan, semua suara pemberitahuan dan pemutaran audio akan dibisukan", 186 "settings.service.form.isMutedInfo" : "Saat dinonaktifkan, semua suara pemberitahuan dan pemutaran audio akan dibisukan",
180 "settings.service.form.name" : "Nama", 187 "settings.service.form.name" : "Nama",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Simpan layanan", 194 "settings.service.form.saveButton" : "Simpan layanan",
182 "settings.service.form.tabHosted" : "Hosted", 195 "settings.service.form.tabHosted" : "Hosted",
183 "settings.service.form.tabOnPremise" : "Hosted mandiri", 196 "settings.service.form.tabOnPremise" : "Hosted mandiri",
@@ -187,7 +200,7 @@
187 "settings.services.deletedInfo" : "Layanan telah dihapus", 200 "settings.services.deletedInfo" : "Layanan telah dihapus",
188 "settings.services.discoverServices" : "Temukan layanan", 201 "settings.services.discoverServices" : "Temukan layanan",
189 "settings.services.headline" : "Layanan Anda", 202 "settings.services.headline" : "Layanan Anda",
190 "settings.services.noServicesAdded" : "Anda belum menambahkan layanan.", 203 "settings.services.noServicesAdded" : "Anda belum menambahkan layanan apa pun.",
191 "settings.services.tooltip.isDisabled" : "Layanan dinonaktifkan", 204 "settings.services.tooltip.isDisabled" : "Layanan dinonaktifkan",
192 "settings.services.tooltip.isMuted" : "Semua suara dibisukan", 205 "settings.services.tooltip.isMuted" : "Semua suara dibisukan",
193 "settings.services.tooltip.notificationsDisabled" : "Pemberitahuan dinonaktifkan", 206 "settings.services.tooltip.notificationsDisabled" : "Pemberitahuan dinonaktifkan",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Warga UE: pajak penjualan lokal mungkin berlaku", 233 "subscription.euTaxInfo" : "Warga UE: pajak penjualan lokal mungkin berlaku",
221 "subscription.features.ads" : "Tanpa iklan, selamanya!", 234 "subscription.features.ads" : "Tanpa iklan, selamanya!",
222 "subscription.features.comingSoon" : "segera hadir", 235 "subscription.features.comingSoon" : "segera hadir",
223 "subscription.features.customServices" : "Layanan pribadi untuk Anda dan tim Anda",
224 "subscription.features.encryptedSync" : "Sinkronisasi sesi terenkripsi", 236 "subscription.features.encryptedSync" : "Sinkronisasi sesi terenkripsi",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Layanan add-on premise\/hosted seperti HipChat", 238 "subscription.features.onpremise" : "Layanan add-on premise\/hosted seperti HipChat",
226 "subscription.features.vpn" : "Dukungan proxy & VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Franz Premium Supporter Account berbayar menyertakan", 242 "subscription.includedFeatures" : "Franz Premium Supporter Account berbayar menyertakan",
228 "subscription.paymentSessionError" : "Tidak bisa menginisialisasi formulir pembayaran", 243 "subscription.paymentSessionError" : "Tidak bisa menginisialisasi formulir pembayaran",
229 "subscription.submit.label" : "Saya ingin mendukung pengembangan Franz", 244 "subscription.submit.label" : "Saya ingin mendukung pengembangan Franz",
@@ -236,15 +251,15 @@
236 "tabs.item.disableAudio" : "Nonaktifkan audio", 251 "tabs.item.disableAudio" : "Nonaktifkan audio",
237 "tabs.item.disableNotifications" : "Nonaktifkan pemberitahuan", 252 "tabs.item.disableNotifications" : "Nonaktifkan pemberitahuan",
238 "tabs.item.disableService" : "Nonaktifkan layanan", 253 "tabs.item.disableService" : "Nonaktifkan layanan",
239 "tabs.item.edit" : "Edit", 254 "tabs.item.edit" : "Sunting",
240 "tabs.item.enableAudio" : "Aktifkan audio", 255 "tabs.item.enableAudio" : "Aktifkan audio",
241 "tabs.item.enableNotification" : "Aktifkan pemberitahuan", 256 "tabs.item.enableNotification" : "Aktifkan pemberitahuan",
242 "tabs.item.enableService" : "Aktifkan layanan", 257 "tabs.item.enableService" : "Aktifkan layanan",
243 "tabs.item.reload" : "Muat Ulang", 258 "tabs.item.reload" : "Muat Ulang",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{field} tidak benar",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "{field} setidaknya harus {length} karakter",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{field} wajib diisi",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field} bukan URL yang benar",
248 "welcome.loginButton" : "Masuk ke akun Anda", 263 "welcome.loginButton" : "Masuk ke akun Anda",
249 "welcome.signupButton" : "Buat akun gratis", 264 "welcome.signupButton" : "Buat akun gratis",
250 "welcome.slogan" : "Perpesanan yang bekerja untuk Anda" 265 "welcome.slogan" : "Perpesanan yang bekerja untuk Anda"
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index 9d23a309b..958d1470d 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -1,14 +1,17 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Impossibile connettersi ai servizi online di Franz", 5 "global.api.unhealthy" : "Impossibile connettersi ai servizi online di Franz",
3 "global.notConnectedToTheInternet" : "Non sei connesso a Internet.", 6 "global.notConnectedToTheInternet" : "Non sei connesso a Internet.",
4 "import.headline" : "Importa i servizi di Franz 4", 7 "import.headline" : "Importa i servizi di Franz 4",
5 "import.notSupportedHeadline" : "Servizi non ancora supportati in Franz 5", 8 "import.notSupportedHeadline" : "Servizi non ancora supportati in Franz 5",
6 "import.skip.label" : "Voglio aggiungere servizi manualmente", 9 "import.skip.label" : "Voglio aggiungere i servizi manualmente",
7 "import.submit.label" : "Importa servizi", 10 "import.submit.label" : "Importa servizi",
8 "infobar.buttonChangelog" : "Cosa c'è di nuovo?", 11 "infobar.buttonChangelog" : "Cosa c'è di nuovo?",
9 "infobar.buttonInstallUpdate" : "Riavvia e installa aggiornamento", 12 "infobar.buttonInstallUpdate" : "Riavvia e installa l'aggiornamento",
10 "infobar.buttonReloadServices" : "Ricarica servizi", 13 "infobar.buttonReloadServices" : "Ricarica servizi",
11 "infobar.requiredRequestsFailed" : "Impossibile caricare servizi e info utente", 14 "infobar.requiredRequestsFailed" : "Impossibile caricare i servizi e le informazioni dell'utente",
12 "infobar.servicesUpdated" : "I tuoi servizi sono stati aggiornati.", 15 "infobar.servicesUpdated" : "I tuoi servizi sono stati aggiornati.",
13 "infobar.updateAvailable" : "È disponibile un nuovo aggiornamento di Franz.", 16 "infobar.updateAvailable" : "È disponibile un nuovo aggiornamento di Franz.",
14 "invite.email.label" : "Indirizzo email", 17 "invite.email.label" : "Indirizzo email",
@@ -23,14 +26,14 @@
23 "login.link.password" : "Reimposta password", 26 "login.link.password" : "Reimposta password",
24 "login.link.signup" : "Crea un account gratuito", 27 "login.link.signup" : "Crea un account gratuito",
25 "login.password.label" : "Password", 28 "login.password.label" : "Password",
26 "login.serverLogout" : "La tua sessione è scaduta, accedi nuovamente.", 29 "login.serverLogout" : "La tua sessione è scaduta, per favore accedi di nuovo.",
27 "login.submit.label" : "Accedi", 30 "login.submit.label" : "Accedi",
28 "login.tokenExpired" : "La tua sessione è scaduta, accedi nuovamente.", 31 "login.tokenExpired" : "La tua sessione è scaduta, per favore accedi di nuovo.",
29 "menu.app.about" : "Info su Franz", 32 "menu.app.about" : "Info su Franz",
30 "menu.app.hide" : "Nascondi", 33 "menu.app.hide" : "Nascondi",
31 "menu.app.hideOthers" : "Nascondi Altri", 34 "menu.app.hideOthers" : "Nascondi Altri",
32 "menu.app.quit" : "Esci", 35 "menu.app.quit" : "Esci",
33 "menu.app.settings" : "Impostazioni", 36 "menu.app.settings" : "Settings",
34 "menu.app.unhide" : "Mostra", 37 "menu.app.unhide" : "Mostra",
35 "menu.edit" : "Modifica", 38 "menu.edit" : "Modifica",
36 "menu.edit.copy" : "Copia", 39 "menu.edit.copy" : "Copia",
@@ -50,20 +53,20 @@
50 "menu.help" : "Aiuto", 53 "menu.help" : "Aiuto",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "Changelog",
52 "menu.help.learnMore" : "Maggiori Informazioni", 55 "menu.help.learnMore" : "Maggiori Informazioni",
53 "menu.help.privacy" : "Informativa sulla Privacy", 56 "menu.help.privacy" : "Dichiarazione della Privacy",
54 "menu.help.support" : "Supporto", 57 "menu.help.support" : "Supporto",
55 "menu.help.tos" : "Termini di Servizio", 58 "menu.help.tos" : "Termini di Servizio",
56 "menu.services" : "Servizi", 59 "menu.services" : "Servizi",
57 "menu.services.addNewService" : "Aggiungi Nuovo Servizio...", 60 "menu.services.addNewService" : "Aggiungi Nuovo Servizio...",
58 "menu.view" : "Visualizza", 61 "menu.view" : "Visualizza",
59 "menu.view.enterFullScreen" : "Visualizza a Tutto Schermo", 62 "menu.view.enterFullScreen" : "Visualizza a Schermo Intero",
60 "menu.view.exitFullScreen" : "Modalità Finestra", 63 "menu.view.exitFullScreen" : "Esci da Schermo Intero",
61 "menu.view.reloadFranz" : "Ricarica Franz", 64 "menu.view.reloadFranz" : "Ricarica Franz",
62 "menu.view.reloadService" : "Ricarica Servizio", 65 "menu.view.reloadService" : "Ricarica Servizio",
63 "menu.view.resetZoom" : "Dimensione Attuale", 66 "menu.view.resetZoom" : "Dimensione Attuale",
64 "menu.view.toggleDevTools" : "Attiva Strumenti Sviluppo", 67 "menu.view.toggleDevTools" : "Attiva\/Disattiva Strumenti Sviluppo",
65 "menu.view.toggleFullScreen" : "Passa a Schermo Intero", 68 "menu.view.toggleFullScreen" : "Attiva\/Disattiva Schermo Intero",
66 "menu.view.toggleServiceDevTools" : "Attiva Strumenti per Sviluppatori di Servizi", 69 "menu.view.toggleServiceDevTools" : "Attiva\/Disattiva Strumenti per Sviluppatori di Servizi",
67 "menu.view.zoomIn" : "Aumenta Zoom", 70 "menu.view.zoomIn" : "Aumenta Zoom",
68 "menu.view.zoomOut" : "Diminuisci Zoom", 71 "menu.view.zoomOut" : "Diminuisci Zoom",
69 "menu.window" : "Finestra", 72 "menu.window" : "Finestra",
@@ -75,11 +78,12 @@
75 "password.link.signup" : "Crea un account gratuito", 78 "password.link.signup" : "Crea un account gratuito",
76 "password.noUser" : "Non è stato trovato nessun utente con questo indirizzo e-mail", 79 "password.noUser" : "Non è stato trovato nessun utente con questo indirizzo e-mail",
77 "password.submit.label" : "Invia", 80 "password.submit.label" : "Invia",
78 "password.successInfo" : "Please check your email", 81 "password.successInfo" : "Per favore controlla la tua email",
79 "pricing.headline" : "Support Franz", 82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
80 "pricing.link.skipPayment" : "Non voglio supportare lo sviluppo di Franz.", 83 "pricing.headline" : "Supporta Franz",
84 "pricing.link.skipPayment" : "Non voglio supportare lo sviluppo di Franz",
81 "pricing.submit.label" : "Voglio supportare lo sviluppo di Franz", 85 "pricing.submit.label" : "Voglio supportare lo sviluppo di Franz",
82 "pricing.support.label" : "Select your support plan", 86 "pricing.support.label" : "Seleziona la modalità di supporto",
83 "service.crashHandler.action" : "Ricarica {name}", 87 "service.crashHandler.action" : "Ricarica {name}",
84 "service.crashHandler.autoReload" : "Tentativo di ripristino automatico di {name} in {seconds} secondi", 88 "service.crashHandler.autoReload" : "Tentativo di ripristino automatico di {name} in {seconds} secondi",
85 "service.crashHandler.headline" : "Oh no!", 89 "service.crashHandler.headline" : "Oh no!",
@@ -87,13 +91,13 @@
87 "service.disabledHandler.action" : "Attiva {name}", 91 "service.disabledHandler.action" : "Attiva {name}",
88 "service.disabledHandler.headline" : "{name} è disattivato", 92 "service.disabledHandler.headline" : "{name} è disattivato",
89 "services.getStarted" : "Iniziamo", 93 "services.getStarted" : "Iniziamo",
90 "services.welcome" : "Welcome to Franz", 94 "services.welcome" : "Benvenuto su Franz",
91 "settings.account.account.editButton" : "Modifica account", 95 "settings.account.account.editButton" : "Modifica account",
92 "settings.account.accountType.basic" : "Account Basic", 96 "settings.account.accountType.basic" : "Account Base",
93 "settings.account.accountType.premium" : "Premium Supporter Account", 97 "settings.account.accountType.premium" : "Account Supporto Premium ",
94 "settings.account.buttonSave" : "Aggiorna profilo", 98 "settings.account.buttonSave" : "Aggiorna profilo",
95 "settings.account.deleteAccount" : "Elimina account", 99 "settings.account.deleteAccount" : "Elimina account",
96 "settings.account.deleteEmailSent" : "Hai ricevuto un'email con un link per confermare l'eliminazione del tuo account. I dati del tuo account non potranno più essere ripristinati!", 100 "settings.account.deleteEmailSent" : "Hai ricevuto un'email con un link per confermare l'eliminazione del tuo account.I dati del tuo account non potranno più essere ripristinati!",
97 "settings.account.deleteInfo" : "Se non hai più bisogno dell'account Franz, puoi eliminare il tuo account e tutti i dati relativi qui.", 101 "settings.account.deleteInfo" : "Se non hai più bisogno dell'account Franz, puoi eliminare il tuo account e tutti i dati relativi qui.",
98 "settings.account.headline" : "Account", 102 "settings.account.headline" : "Account",
99 "settings.account.headlineAccount" : "Informazioni account", 103 "settings.account.headlineAccount" : "Informazioni account",
@@ -101,13 +105,13 @@
101 "settings.account.headlineInvoices" : "Fatture", 105 "settings.account.headlineInvoices" : "Fatture",
102 "settings.account.headlinePassword" : "Cambia password", 106 "settings.account.headlinePassword" : "Cambia password",
103 "settings.account.headlineProfile" : "Aggiorna profilo", 107 "settings.account.headlineProfile" : "Aggiorna profilo",
104 "settings.account.headlineSubscription" : "La tua iscrizione", 108 "settings.account.headlineSubscription" : "Il tuo abbonamento",
105 "settings.account.headlineUpgrade" : "Aggiorna il tuo account e supporta Franz", 109 "settings.account.headlineUpgrade" : "Aggiorna il tuo account e supporta Franz",
106 "settings.account.invoiceDownload" : "Scarica", 110 "settings.account.invoiceDownload" : "Scarica",
107 "settings.account.manageSubscription.label" : "Gestisci la tua iscrizione", 111 "settings.account.manageSubscription.label" : "Gestisci il tuo abbonamento",
108 "settings.account.successInfo" : "Le tue modifiche sono state salvate", 112 "settings.account.successInfo" : "Le tue modifiche sono state salvate",
109 "settings.account.tryReloadUserInfoRequest" : "Prova ancora", 113 "settings.account.tryReloadUserInfoRequest" : "Prova di nuovo",
110 "settings.account.userInfoRequestFailed" : "Impossibile caricare informazioni utente.", 114 "settings.account.userInfoRequestFailed" : "Impossibile caricare le informazioni dell'utente.",
111 "settings.app.buttonClearAllCache" : "Svuota la cache", 115 "settings.app.buttonClearAllCache" : "Svuota la cache",
112 "settings.app.buttonInstallUpdate" : "Riavvia e installa l'aggiornamento", 116 "settings.app.buttonInstallUpdate" : "Riavvia e installa l'aggiornamento",
113 "settings.app.buttonSearchForUpdate" : "Controlla aggiornamenti", 117 "settings.app.buttonSearchForUpdate" : "Controlla aggiornamenti",
@@ -116,16 +120,18 @@
116 "settings.app.form.autoLaunchInBackground" : "Apri in background", 120 "settings.app.form.autoLaunchInBackground" : "Apri in background",
117 "settings.app.form.autoLaunchOnStart" : "Esegui Franz all'avvio", 121 "settings.app.form.autoLaunchOnStart" : "Esegui Franz all'avvio",
118 "settings.app.form.beta" : "Includi versioni beta", 122 "settings.app.form.beta" : "Includi versioni beta",
123 "settings.app.form.darkMode" : "Join the Dark Side",
119 "settings.app.form.enableGPUAcceleration" : "Attiva Accelerazione GPU", 124 "settings.app.form.enableGPUAcceleration" : "Attiva Accelerazione GPU",
120 "settings.app.form.enableMenuBar" : "Mostra Franz nella Barra del Menu", 125 "settings.app.form.enableMenuBar" : "Mostra Franz nella Barra del Menu",
121 "settings.app.form.enableSpellchecking" : "Attiva controllo ortografico", 126 "settings.app.form.enableSpellchecking" : "Attiva controllo ortografico",
122 "settings.app.form.enableSystemTray" : "Mostra Franz nell'area di notifica", 127 "settings.app.form.enableSystemTray" : "Mostra Franz nell'area di notifica",
123 "settings.app.form.hideDockIcon" : "Nascondi icona Franz nella Dock", 128 "settings.app.form.hideDockIcon" : "Nascondi l'icona Franz nel Dock",
124 "settings.app.form.language" : "Lingua", 129 "settings.app.form.language" : "Lingua",
125 "settings.app.form.minimizeToSystemTray" : "Minimizza Franz nell'area di notifica", 130 "settings.app.form.minimizeToSystemTray" : "Minimizza Franz nell'area di notifica",
126 "settings.app.form.runInBackground" : "Mantieni Franz in esecuzione quando chiudi la finestra", 131 "settings.app.form.runInBackground" : "Mantieni Franz in esecuzione quando chiudi la finestra",
127 "settings.app.form.showDisabledServices" : "Mostra schede servizi disattivati", 132 "settings.app.form.showDisabledServices" : "Mostra schede servizi disattivati",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra l'etichetta dei messaggi non letti quanto le notifiche sono disattivate", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostra l'etichetta dei messaggi non letti quando le notifiche sono disattivate",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Impostazioni", 135 "settings.app.headline" : "Impostazioni",
130 "settings.app.headlineAdvanced" : "Avanzate", 136 "settings.app.headlineAdvanced" : "Avanzate",
131 "settings.app.headlineAppearance" : "Aspetto", 137 "settings.app.headlineAppearance" : "Aspetto",
@@ -136,7 +142,7 @@
136 "settings.app.subheadlineCache" : "Cache", 142 "settings.app.subheadlineCache" : "Cache",
137 "settings.app.translationHelp" : "Aiutaci a tradurre Franz nella tua lingua.", 143 "settings.app.translationHelp" : "Aiutaci a tradurre Franz nella tua lingua.",
138 "settings.app.updateStatusAvailable" : "Aggiornamento disponibile, download in corso...", 144 "settings.app.updateStatusAvailable" : "Aggiornamento disponibile, download in corso...",
139 "settings.app.updateStatusSearching" : "Ricerca aggiornamenti...", 145 "settings.app.updateStatusSearching" : "Ricerca aggiornamenti",
140 "settings.app.updateStatusUpToDate" : "Stai utilizzando l'ultima versione di Franz", 146 "settings.app.updateStatusUpToDate" : "Stai utilizzando l'ultima versione di Franz",
141 "settings.invite.headline" : "Invita Amici", 147 "settings.invite.headline" : "Invita Amici",
142 "settings.navigation.account" : "Account", 148 "settings.navigation.account" : "Account",
@@ -148,14 +154,14 @@
148 "settings.recipes.all" : "Tutti i servizi", 154 "settings.recipes.all" : "Tutti i servizi",
149 "settings.recipes.dev" : "Sviluppo", 155 "settings.recipes.dev" : "Sviluppo",
150 "settings.recipes.headline" : "Servizi disponibili", 156 "settings.recipes.headline" : "Servizi disponibili",
151 "settings.recipes.missingService" : "Richiedi un servizio", 157 "settings.recipes.missingService" : "Manca un servizio?",
152 "settings.recipes.mostPopular" : "Più popolari", 158 "settings.recipes.mostPopular" : "Più popolari",
153 "settings.recipes.nothingFound" : "Ci dispiace, ma nessun servizio corrisponde alla tua ricerca.", 159 "settings.recipes.nothingFound" : "Ci dispiace, ma nessun servizio corrisponde alla tua ricerca.",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "Servizio aggiunto con successo", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "Servizio aggiunto con successo",
155 "settings.searchService" : "Cerca servizio", 161 "settings.searchService" : "Cerca servizio",
156 "settings.service.error.goBack" : "Torna ai servizi", 162 "settings.service.error.goBack" : "Torna ai servizi",
157 "settings.service.error.headline" : "Errore", 163 "settings.service.error.headline" : "Errore",
158 "settings.service.error.message" : "Impossibile caricare il servizio.", 164 "settings.service.error.message" : "Impossibile caricare il contenuto del servizio.",
159 "settings.service.form.addServiceHeadline" : "Aggiungi {name}", 165 "settings.service.form.addServiceHeadline" : "Aggiungi {name}",
160 "settings.service.form.availableServices" : "Servizi disponibili", 166 "settings.service.form.availableServices" : "Servizi disponibili",
161 "settings.service.form.customUrl" : "Server personalizzato", 167 "settings.service.form.customUrl" : "Server personalizzato",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "Modifica {name}", 172 "settings.service.form.editServiceHeadline" : "Modifica {name}",
167 "settings.service.form.enableAudio" : "Attiva audio", 173 "settings.service.form.enableAudio" : "Attiva audio",
168 "settings.service.form.enableBadge" : "Mostra l'etichetta dei messaggi non letti", 174 "settings.service.form.enableBadge" : "Mostra l'etichetta dei messaggi non letti",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Attiva le notifiche", 176 "settings.service.form.enableNotification" : "Attiva le notifiche",
170 "settings.service.form.enableService" : "Attiva il servizio", 177 "settings.service.form.enableService" : "Attiva il servizio",
171 "settings.service.form.headlineBadges" : "Etichetta dei messaggi non letti", 178 "settings.service.form.headlineBadges" : "Etichetta dei messaggi non letti",
@@ -175,9 +182,15 @@
175 "settings.service.form.iconDelete" : "Elimina", 182 "settings.service.form.iconDelete" : "Elimina",
176 "settings.service.form.iconUpload" : "Trascina la tua immagine o clicca qui", 183 "settings.service.form.iconUpload" : "Trascina la tua immagine o clicca qui",
177 "settings.service.form.indirectMessageInfo" : "Verranno notificati tutti i messaggi di un canale, non solo @username, @channel, @here, ...", 184 "settings.service.form.indirectMessageInfo" : "Verranno notificati tutti i messaggi di un canale, non solo @username, @channel, @here, ...",
178 "settings.service.form.indirectMessages" : "Mostra l'etichetta per tutti i messaggi", 185 "settings.service.form.indirectMessages" : "Mostra l'etichetta per tutti i nuovi messaggi",
179 "settings.service.form.isMutedInfo" : "Se disattivato, tutte le notifiche sonore e le riproduzioni audio saranno mute", 186 "settings.service.form.isMutedInfo" : "Se disattivato, tutte le notifiche sonore e le riproduzioni audio saranno mutate",
180 "settings.service.form.name" : "Nome", 187 "settings.service.form.name" : "Nome",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Salva servizio", 194 "settings.service.form.saveButton" : "Salva servizio",
182 "settings.service.form.tabHosted" : "Hosted", 195 "settings.service.form.tabHosted" : "Hosted",
183 "settings.service.form.tabOnPremise" : "Self hosted â­ï¸", 196 "settings.service.form.tabOnPremise" : "Self hosted â­ï¸",
@@ -187,15 +200,15 @@
187 "settings.services.deletedInfo" : "Il servizio è stato eliminato", 200 "settings.services.deletedInfo" : "Il servizio è stato eliminato",
188 "settings.services.discoverServices" : "Scopri servizi", 201 "settings.services.discoverServices" : "Scopri servizi",
189 "settings.services.headline" : "I tuoi servizi", 202 "settings.services.headline" : "I tuoi servizi",
190 "settings.services.noServicesAdded" : "Non aggiunto nessun servizio.", 203 "settings.services.noServicesAdded" : "Non hai aggiunto ancora nessun servizio.",
191 "settings.services.tooltip.isDisabled" : "Il servizio è disattivato", 204 "settings.services.tooltip.isDisabled" : "Il servizio è disattivato",
192 "settings.services.tooltip.isMuted" : "Tutti i suoni sono stati disattivati", 205 "settings.services.tooltip.isMuted" : "Tutti i suoni sono disattivati",
193 "settings.services.tooltip.notificationsDisabled" : "Le notifiche sono state disattivate", 206 "settings.services.tooltip.notificationsDisabled" : "Le notifiche sono disattivate",
194 "settings.services.updatedInfo" : "Le modifiche sono state salvate", 207 "settings.services.updatedInfo" : "Le tue modifiche sono state salvate",
195 "settings.user.form.accountType.company" : "Società", 208 "settings.user.form.accountType.company" : "Società",
196 "settings.user.form.accountType.individual" : "Individuo", 209 "settings.user.form.accountType.individual" : "Individuale",
197 "settings.user.form.accountType.label" : "Tipo account", 210 "settings.user.form.accountType.label" : "Tipo di account",
198 "settings.user.form.accountType.non-profit" : "Non-Profit", 211 "settings.user.form.accountType.non-profit" : "No profit",
199 "settings.user.form.currentPassword" : "Password attuale", 212 "settings.user.form.currentPassword" : "Password attuale",
200 "settings.user.form.email" : "Email", 213 "settings.user.form.email" : "Email",
201 "settings.user.form.firstname" : "Nome", 214 "settings.user.form.firstname" : "Nome",
@@ -211,21 +224,23 @@
211 "signup.firstname.label" : "Nome", 224 "signup.firstname.label" : "Nome",
212 "signup.headline" : "Iscriviti", 225 "signup.headline" : "Iscriviti",
213 "signup.lastname.label" : "Cognome", 226 "signup.lastname.label" : "Cognome",
214 "signup.legal.info" : "Creando un account di Franz accetti", 227 "signup.legal.info" : "Creando un account di Franz accetti l' ",
215 "signup.legal.privacy" : "Informativa sulla Privacy", 228 "signup.legal.privacy" : "Informativa sulla Privacy",
216 "signup.legal.terms" : "Termini del Servizio", 229 "signup.legal.terms" : "Termini di Servizio",
217 "signup.link.login" : "Hai già un account, accedi?", 230 "signup.link.login" : "Hai già un account, vuoi accedere?",
218 "signup.password.label" : "Password", 231 "signup.password.label" : "Password",
219 "signup.submit.label" : "Crea un account", 232 "signup.submit.label" : "Crea un account",
220 "subscription.euTaxInfo" : "Per i residenti UE: possono essere applicate tasse locali", 233 "subscription.euTaxInfo" : "Per i residenti UE: possono essere applicate tasse locali",
221 "subscription.features.ads" : "Nessuna pubblicità, mai!", 234 "subscription.features.ads" : "Nessuna pubblicità, mai!",
222 "subscription.features.comingSoon" : "in arrivo", 235 "subscription.features.comingSoon" : "in arrivo",
223 "subscription.features.customServices" : "Servizi privati per te e il tuo gruppo",
224 "subscription.features.encryptedSync" : "Sincronizzazione sessione crittografata", 236 "subscription.features.encryptedSync" : "Sincronizzazione sessione crittografata",
225 "subscription.features.onpremise" : "Aggiungi servizi on-premise\/in casa come HipChat", 237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
226 "subscription.features.vpn" : "Supporto Proxy e VPN", 238 "subscription.features.onpremise" : "Aggiungi servizi on-premise\/hosted come HipChat",
239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "L'account a pagamento Franz Premium Supporter include", 242 "subscription.includedFeatures" : "L'account a pagamento Franz Premium Supporter include",
228 "subscription.paymentSessionError" : "Impossibile inizializzare il form del pagamento", 243 "subscription.paymentSessionError" : "Impossibile inizializzare il modulo per il pagamento",
229 "subscription.submit.label" : "Voglio supportare lo sviluppo di Franz", 244 "subscription.submit.label" : "Voglio supportare lo sviluppo di Franz",
230 "subscription.type.free" : "gratis", 245 "subscription.type.free" : "gratis",
231 "subscription.type.month" : "mese", 246 "subscription.type.month" : "mese",
@@ -240,12 +255,12 @@
240 "tabs.item.enableAudio" : "Attiva audio", 255 "tabs.item.enableAudio" : "Attiva audio",
241 "tabs.item.enableNotification" : "Attiva notifiche", 256 "tabs.item.enableNotification" : "Attiva notifiche",
242 "tabs.item.enableService" : "Attiva servizio", 257 "tabs.item.enableService" : "Attiva servizio",
243 "tabs.item.reload" : "Aggiorna", 258 "tabs.item.reload" : "Ricarica",
244 "validation.email" : "{field} non valido", 259 "validation.email" : "{field} non valido",
245 "validation.minLength" : "{field} dovrebbe contenere almeno {length} caratteri", 260 "validation.minLength" : "{field} dovrebbe contenere almeno {length} caratteri",
246 "validation.required" : "{field} è necessario", 261 "validation.required" : "{field} è necessario",
247 "validation.url" : "{field} non è un URL valido", 262 "validation.url" : "{field} non è un URL valido",
248 "welcome.loginButton" : "Accedi al tuo account", 263 "welcome.loginButton" : "Accedi al tuo account",
249 "welcome.signupButton" : "Crea un account gratuito", 264 "welcome.signupButton" : "Crea un account gratuito",
250 "welcome.slogan" : "Un sistema di messaggistica che funziona" 265 "welcome.slogan" : "Un sistema di messaggistica che va bene per te"
251} 266}
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index a7af10aba..57b767ef1 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -1,11 +1,14 @@
1{ 1{
2 "global.api.unhealthy" : "Franzオンラインサービスã«æŽ¥ç¶šã§ãã¾ã›ã‚“。", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "global.api.unhealthy" : "Franzã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚µãƒ¼ãƒ“スã«æŽ¥ç¶šã§ãã¾ã›ã‚“。",
3 "global.notConnectedToTheInternet" : "インターãƒãƒƒãƒˆã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“。", 6 "global.notConnectedToTheInternet" : "インターãƒãƒƒãƒˆã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“。",
4 "import.headline" : "Franz 4ã®ã‚µãƒ¼ãƒ“スをインãƒãƒ¼ãƒˆ", 7 "import.headline" : "Franz 4ã®ã‚µãƒ¼ãƒ“スをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„",
5 "import.notSupportedHeadline" : "Franz 5ã§ã¯ã“ã®ã‚µãƒ¼ãƒ“スã«ã¾ã å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“", 8 "import.notSupportedHeadline" : "Franz 5ã§ã¯ã“ã®ã‚µãƒ¼ãƒ“スã«ã¾ã å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“",
6 "import.skip.label" : "後ã§æ‰‹å‹•ã§ã‚µãƒ¼ãƒ“スを追加ã™ã‚‹", 9 "import.skip.label" : "手動ã§ã‚µãƒ¼ãƒ“スを追加ã™ã‚‹",
7 "import.submit.label" : "サービスをインãƒãƒ¼ãƒˆ", 10 "import.submit.label" : "サービスをインãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„",
8 "infobar.buttonChangelog" : "最新情報", 11 "infobar.buttonChangelog" : "最新ã®æƒ…å ±",
9 "infobar.buttonInstallUpdate" : "å†èµ·å‹•ã—ã¦æ›´æ–°ã‚’インストールã™ã‚‹", 12 "infobar.buttonInstallUpdate" : "å†èµ·å‹•ã—ã¦æ›´æ–°ã‚’インストールã™ã‚‹",
10 "infobar.buttonReloadServices" : "サービスã®å†èª­ã¿è¾¼ã¿", 13 "infobar.buttonReloadServices" : "サービスã®å†èª­ã¿è¾¼ã¿",
11 "infobar.requiredRequestsFailed" : "サービスã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼æƒ…報を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ", 14 "infobar.requiredRequestsFailed" : "サービスã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼æƒ…報を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ",
@@ -26,7 +29,7 @@
26 "login.serverLogout" : "セッションã®æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ログインã—ç›´ã—ã¦ä¸‹ã•ã„。", 29 "login.serverLogout" : "セッションã®æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ログインã—ç›´ã—ã¦ä¸‹ã•ã„。",
27 "login.submit.label" : "サインイン", 30 "login.submit.label" : "サインイン",
28 "login.tokenExpired" : "セッションã®æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ログインã—ç›´ã—ã¦ä¸‹ã•ã„。", 31 "login.tokenExpired" : "セッションã®æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ログインã—ç›´ã—ã¦ä¸‹ã•ã„。",
29 "menu.app.about" : "Franzã«ã¤ãã¦", 32 "menu.app.about" : "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±",
30 "menu.app.hide" : "éš ã™", 33 "menu.app.hide" : "éš ã™",
31 "menu.app.hideOthers" : "ä»–ã‚’éš ã™", 34 "menu.app.hideOthers" : "ä»–ã‚’éš ã™",
32 "menu.app.quit" : "終了", 35 "menu.app.quit" : "終了",
@@ -49,7 +52,7 @@
49 "menu.file" : "ファイル", 52 "menu.file" : "ファイル",
50 "menu.help" : "ヘルプ", 53 "menu.help" : "ヘルプ",
51 "menu.help.changelog" : "更新履歴", 54 "menu.help.changelog" : "更新履歴",
52 "menu.help.learnMore" : "詳細ã«ã¤ã„ã¦", 55 "menu.help.learnMore" : "Franzã«ã¤ã„ã¦",
53 "menu.help.privacy" : "プライãƒã‚·ãƒ¼ã«ã¤ã„ã¦", 56 "menu.help.privacy" : "プライãƒã‚·ãƒ¼ã«ã¤ã„ã¦",
54 "menu.help.support" : "サãƒãƒ¼ãƒˆ", 57 "menu.help.support" : "サãƒãƒ¼ãƒˆ",
55 "menu.help.tos" : "サービス利用è¦ç´„", 58 "menu.help.tos" : "サービス利用è¦ç´„",
@@ -76,6 +79,7 @@
76 "password.noUser" : "ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã¾ã ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“", 79 "password.noUser" : "ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã¾ã ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“",
77 "password.submit.label" : "é€ä¿¡", 80 "password.submit.label" : "é€ä¿¡",
78 "password.successInfo" : "メールを確èªã—ã¦ä¸‹ã•ã„", 81 "password.successInfo" : "メールを確èªã—ã¦ä¸‹ã•ã„",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Franzを支æ´ã™ã‚‹", 83 "pricing.headline" : "Franzを支æ´ã™ã‚‹",
80 "pricing.link.skipPayment" : "Franzã®é–‹ç™ºã‚’支æ´ã—ãŸããªã„。", 84 "pricing.link.skipPayment" : "Franzã®é–‹ç™ºã‚’支æ´ã—ãŸããªã„。",
81 "pricing.submit.label" : "Franzã®é–‹ç™ºã‚’支æ´ã—ãŸã„。", 85 "pricing.submit.label" : "Franzã®é–‹ç™ºã‚’支æ´ã—ãŸã„。",
@@ -116,6 +120,7 @@
116 "settings.app.form.autoLaunchInBackground" : "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§é–‹ã", 120 "settings.app.form.autoLaunchInBackground" : "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§é–‹ã",
117 "settings.app.form.autoLaunchOnStart" : "システム起動時ã«Franzã‚’é–‹ã", 121 "settings.app.form.autoLaunchOnStart" : "システム起動時ã«Franzã‚’é–‹ã",
118 "settings.app.form.beta" : "Betaãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å«ã‚ã‚‹", 122 "settings.app.form.beta" : "Betaãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å«ã‚ã‚‹",
123 "settings.app.form.darkMode" : "Join the Dark Side",
119 "settings.app.form.enableGPUAcceleration" : "GPUアクセラレーションを有効ã«ã™ã‚‹", 124 "settings.app.form.enableGPUAcceleration" : "GPUアクセラレーションを有効ã«ã™ã‚‹",
120 "settings.app.form.enableMenuBar" : "メニューãƒãƒ¼ã«Franzを表示ã™ã‚‹", 125 "settings.app.form.enableMenuBar" : "メニューãƒãƒ¼ã«Franzを表示ã™ã‚‹",
121 "settings.app.form.enableSpellchecking" : "スペルãƒã‚§ãƒƒã‚¯ã‚’有効ã«ã™ã‚‹", 126 "settings.app.form.enableSpellchecking" : "スペルãƒã‚§ãƒƒã‚¯ã‚’有効ã«ã™ã‚‹",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "ウインドウを閉ã˜ãŸéš›ã«Franzã‚’ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å®Ÿè¡Œã•ã›ã¦ãŠã", 131 "settings.app.form.runInBackground" : "ウインドウを閉ã˜ãŸéš›ã«Franzã‚’ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å®Ÿè¡Œã•ã›ã¦ãŠã",
127 "settings.app.form.showDisabledServices" : "無効化ã•ã‚ŒãŸã‚µãƒ¼ãƒ“スã®ã‚¿ãƒ–を表示ã™ã‚‹", 132 "settings.app.form.showDisabledServices" : "無効化ã•ã‚ŒãŸã‚µãƒ¼ãƒ“スã®ã‚¿ãƒ–を表示ã™ã‚‹",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "通知ã®ç„¡åŠ¹æ™‚ã«æœªèª­ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä»¶æ•°ã‚’表示ã™ã‚‹", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "通知ã®ç„¡åŠ¹æ™‚ã«æœªèª­ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä»¶æ•°ã‚’表示ã™ã‚‹",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "設定", 135 "settings.app.headline" : "設定",
130 "settings.app.headlineAdvanced" : "詳細", 136 "settings.app.headlineAdvanced" : "詳細",
131 "settings.app.headlineAppearance" : "表示スタイル", 137 "settings.app.headlineAppearance" : "表示スタイル",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "{name}を編集", 172 "settings.service.form.editServiceHeadline" : "{name}を編集",
167 "settings.service.form.enableAudio" : "オーディオを有効ã«ã™ã‚‹", 173 "settings.service.form.enableAudio" : "オーディオを有効ã«ã™ã‚‹",
168 "settings.service.form.enableBadge" : "未読件数ã®é€šçŸ¥ãƒãƒƒã‚¸ã‚’表示ã™ã‚‹", 174 "settings.service.form.enableBadge" : "未読件数ã®é€šçŸ¥ãƒãƒƒã‚¸ã‚’表示ã™ã‚‹",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "通知を有効ã«ã™ã‚‹", 176 "settings.service.form.enableNotification" : "通知を有効ã«ã™ã‚‹",
170 "settings.service.form.enableService" : "サービスを有効ã«ã™ã‚‹", 177 "settings.service.form.enableService" : "サービスを有効ã«ã™ã‚‹",
171 "settings.service.form.headlineBadges" : "未読件数ã®é€šçŸ¥ãƒãƒƒã‚¸", 178 "settings.service.form.headlineBadges" : "未読件数ã®é€šçŸ¥ãƒãƒƒã‚¸",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "ã™ã¹ã¦ã®æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¤ã„ã¦ãƒãƒƒã‚¸ã‚’表示ã™ã‚‹", 185 "settings.service.form.indirectMessages" : "ã™ã¹ã¦ã®æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¤ã„ã¦ãƒãƒƒã‚¸ã‚’表示ã™ã‚‹",
179 "settings.service.form.isMutedInfo" : "無効化ã•ã‚Œã¦ã„ã‚‹å ´åˆã€å…¨ã¦ã®é€šçŸ¥éŸ³ã‚„オーディオå†ç”Ÿã¯ç„¡éŸ³ã«ãªã‚Šã¾ã™", 186 "settings.service.form.isMutedInfo" : "無効化ã•ã‚Œã¦ã„ã‚‹å ´åˆã€å…¨ã¦ã®é€šçŸ¥éŸ³ã‚„オーディオå†ç”Ÿã¯ç„¡éŸ³ã«ãªã‚Šã¾ã™",
180 "settings.service.form.name" : "サービスå", 187 "settings.service.form.name" : "サービスå",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "サービスã®ä¿å­˜", 194 "settings.service.form.saveButton" : "サービスã®ä¿å­˜",
182 "settings.service.form.tabHosted" : "ホスト", 195 "settings.service.form.tabHosted" : "ホスト",
183 "settings.service.form.tabOnPremise" : "セルフホスト â­ï¸", 196 "settings.service.form.tabOnPremise" : "セルフホスト â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "EU在ä½è€… : 地域ã®æ¶ˆè²»ç¨ŽãŒé©ç”¨ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™", 233 "subscription.euTaxInfo" : "EU在ä½è€… : 地域ã®æ¶ˆè²»ç¨ŽãŒé©ç”¨ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™",
221 "subscription.features.ads" : "広告ã¯ä¸€åˆ‡ã‚ã‚Šã¾ã›ã‚“!", 234 "subscription.features.ads" : "広告ã¯ä¸€åˆ‡ã‚ã‚Šã¾ã›ã‚“!",
222 "subscription.features.comingSoon" : "ã¾ã‚‚ãªã登場", 235 "subscription.features.comingSoon" : "ã¾ã‚‚ãªã登場",
223 "subscription.features.customServices" : "ã‚ãªãŸã¨ã‚ãªãŸã®ãƒãƒ¼ãƒ ã®ãŸã‚ã®ãƒ—ライベートサービス",
224 "subscription.features.encryptedSync" : "æš—å·åŒ–ã•ã‚ŒãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã®åŒæœŸ", 236 "subscription.features.encryptedSync" : "æš—å·åŒ–ã•ã‚ŒãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã®åŒæœŸ",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "HipChatã®ã‚ˆã†ãªã‚ªãƒ³ãƒ—レミス\/ホスト型サービスã®è¿½åŠ ", 238 "subscription.features.onpremise" : "HipChatã®ã‚ˆã†ãªã‚ªãƒ³ãƒ—レミス\/ホスト型サービスã®è¿½åŠ ",
226 "subscription.features.vpn" : "プロキシサーãƒãƒ¼ã¨VPNã®ã‚µãƒãƒ¼ãƒˆ", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Franz Premium Supporter有料アカウントã«ã¯ä»¥ä¸‹ãŒå«ã¾ã‚Œã¾ã™", 242 "subscription.includedFeatures" : "Franz Premium Supporter有料アカウントã«ã¯ä»¥ä¸‹ãŒå«ã¾ã‚Œã¾ã™",
228 "subscription.paymentSessionError" : "支払ã„フォームをåˆæœŸåŒ–出æ¥ã¾ã›ã‚“", 243 "subscription.paymentSessionError" : "支払ã„フォームをåˆæœŸåŒ–出æ¥ã¾ã›ã‚“",
229 "subscription.submit.label" : "Franzã®é–‹ç™ºã‚’支æ´ã—ãŸã„", 244 "subscription.submit.label" : "Franzã®é–‹ç™ºã‚’支æ´ã—ãŸã„",
diff --git a/src/i18n/locales/ka.json b/src/i18n/locales/ka.json
index 7679bc6fc..d521c838a 100644
--- a/src/i18n/locales/ka.json
+++ b/src/i18n/locales/ka.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Franz-ის áƒáƒœáƒšáƒáƒ˜áƒœ სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ", 5 "global.api.unhealthy" : "Franz-ის áƒáƒœáƒšáƒáƒ˜áƒœ სერვისთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ",
3 "global.notConnectedToTheInternet" : "თქვენ áƒáƒ  ხáƒáƒ áƒ— ინტერნეტთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული.", 6 "global.notConnectedToTheInternet" : "თქვენ áƒáƒ  ხáƒáƒ áƒ— ინტერნეტთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული.",
4 "import.headline" : "შემáƒáƒ˜áƒ¢áƒáƒœáƒ” Franz 4-ის სერვისები", 7 "import.headline" : "შემáƒáƒ˜áƒ¢áƒáƒœáƒ” Franz 4-ის სერვისები",
@@ -26,23 +29,23 @@
26 "login.serverLogout" : "თქვენს სესიáƒáƒ¡ ვáƒáƒ“რგáƒáƒ£áƒ•áƒ˜áƒ“áƒ, შედით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ხელáƒáƒ®áƒšáƒ.", 29 "login.serverLogout" : "თქვენს სესიáƒáƒ¡ ვáƒáƒ“რგáƒáƒ£áƒ•áƒ˜áƒ“áƒ, შედით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ხელáƒáƒ®áƒšáƒ.",
27 "login.submit.label" : "შესვლáƒ", 30 "login.submit.label" : "შესვლáƒ",
28 "login.tokenExpired" : "თქვენს სესიáƒáƒ¡ ვáƒáƒ“რგáƒáƒ£áƒ•áƒ˜áƒ“áƒ, შედით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ხელáƒáƒ®áƒšáƒ.", 31 "login.tokenExpired" : "თქვენს სესიáƒáƒ¡ ვáƒáƒ“რგáƒáƒ£áƒ•áƒ˜áƒ“áƒ, შედით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ხელáƒáƒ®áƒšáƒ.",
29 "menu.app.about" : "About Franz", 32 "menu.app.about" : "Franz-ის შესáƒáƒ®áƒ”ბ",
30 "menu.app.hide" : "Hide", 33 "menu.app.hide" : "Hide",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "სხვების დáƒáƒ›áƒáƒšáƒ•áƒ",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ",
33 "menu.app.settings" : "პáƒáƒ áƒáƒ›áƒ”ტრები", 36 "menu.app.settings" : "პáƒáƒ áƒáƒ›áƒ”ტრები",
34 "menu.app.unhide" : "Unhide", 37 "menu.app.unhide" : "Unhide",
35 "menu.edit" : "რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ", 38 "menu.edit" : "რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ",
36 "menu.edit.copy" : "Copy", 39 "menu.edit.copy" : "კáƒáƒžáƒ˜áƒ áƒ”ბáƒ",
37 "menu.edit.cut" : "Cut", 40 "menu.edit.cut" : "áƒáƒ›áƒáƒ­áƒ áƒ",
38 "menu.edit.delete" : "Delete", 41 "menu.edit.delete" : "წáƒáƒ¨áƒšáƒ",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "გრáƒáƒ¤áƒ˜áƒ™áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები & სიმბáƒáƒšáƒáƒ”ბი",
40 "menu.edit.paste" : "Paste", 43 "menu.edit.paste" : "ჩáƒáƒ¡áƒ›áƒ",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style",
42 "menu.edit.redo" : "Redo", 45 "menu.edit.redo" : "áƒáƒ¦áƒ“გენáƒ",
43 "menu.edit.selectAll" : "Select All", 46 "menu.edit.selectAll" : "ყველáƒáƒ¡ მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "სáƒáƒ£áƒ‘რები",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ დáƒáƒ¬áƒ§áƒ”ბáƒ",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "Start Speaking",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "Stop Speaking",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "Undo",
@@ -76,6 +79,7 @@
76 "password.noUser" : "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი მითითებული მეილით ვერ მáƒáƒ˜áƒ«áƒ”ბნáƒ", 79 "password.noUser" : "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი მითითებული მეილით ვერ მáƒáƒ˜áƒ«áƒ”ბნáƒ",
77 "password.submit.label" : "დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ", 80 "password.submit.label" : "დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ",
78 "password.successInfo" : "გთხáƒáƒ•áƒ— შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ მეილი", 81 "password.successInfo" : "გთხáƒáƒ•áƒ— შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ მეილი",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Franz-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რáƒ", 83 "pricing.headline" : "Franz-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რáƒ",
80 "pricing.link.skipPayment" : "áƒáƒ  მინდრხელი შევუწყრFranz-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¡.", 84 "pricing.link.skipPayment" : "áƒáƒ  მინდრხელი შევუწყრFranz-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¡.",
81 "pricing.submit.label" : "მინდრხელი შევუწყრFranz-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¡", 85 "pricing.submit.label" : "მინდრხელი შევუწყრFranz-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¡",
@@ -116,6 +120,7 @@
116 "settings.app.form.autoLaunchInBackground" : "გáƒáƒ®áƒ¡áƒ”ნით ფáƒáƒœáƒ–ე", 120 "settings.app.form.autoLaunchInBackground" : "გáƒáƒ®áƒ¡áƒ”ნით ფáƒáƒœáƒ–ე",
117 "settings.app.form.autoLaunchOnStart" : "გáƒáƒ”შვáƒáƒ¡ Franz სისტემის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡", 121 "settings.app.form.autoLaunchOnStart" : "გáƒáƒ”შვáƒáƒ¡ Franz სისტემის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡",
118 "settings.app.form.beta" : "ჩáƒáƒ áƒ—ეთ ბეტრვერსიები", 122 "settings.app.form.beta" : "ჩáƒáƒ áƒ—ეთ ბეტრვერსიები",
123 "settings.app.form.darkMode" : "Join the Dark Side",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 124 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration",
120 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 125 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar",
121 "settings.app.form.enableSpellchecking" : "Enable spell checking", 126 "settings.app.form.enableSpellchecking" : "Enable spell checking",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "დáƒáƒ¢áƒáƒ•áƒ”თ Franz გáƒáƒ¨áƒ•áƒ”ბული რáƒáƒ“ესáƒáƒª ფáƒáƒœáƒ¯áƒáƒ áƒ დáƒáƒ˜áƒ®áƒ£áƒ áƒ”ბáƒ", 131 "settings.app.form.runInBackground" : "დáƒáƒ¢áƒáƒ•áƒ”თ Franz გáƒáƒ¨áƒ•áƒ”ბული რáƒáƒ“ესáƒáƒª ფáƒáƒœáƒ¯áƒáƒ áƒ დáƒáƒ˜áƒ®áƒ£áƒ áƒ”ბáƒ",
127 "settings.app.form.showDisabledServices" : "Display disabled services tabs", 132 "settings.app.form.showDisabledServices" : "Display disabled services tabs",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "პáƒáƒ áƒáƒ›áƒ”ტრები", 135 "settings.app.headline" : "პáƒáƒ áƒáƒ›áƒ”ტრები",
130 "settings.app.headlineAdvanced" : "Advanced", 136 "settings.app.headlineAdvanced" : "Advanced",
131 "settings.app.headlineAppearance" : "Appearance", 137 "settings.app.headlineAppearance" : "Appearance",
@@ -166,18 +172,25 @@
166 "settings.service.form.editServiceHeadline" : "შეáƒáƒ¡áƒ¬áƒáƒ áƒ” {name}", 172 "settings.service.form.editServiceHeadline" : "შეáƒáƒ¡áƒ¬áƒáƒ áƒ” {name}",
167 "settings.service.form.enableAudio" : "Enable audio", 173 "settings.service.form.enableAudio" : "Enable audio",
168 "settings.service.form.enableBadge" : "Show unread message badges", 174 "settings.service.form.enableBadge" : "Show unread message badges",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "შეტყáƒáƒ‘ინებების ჩáƒáƒ áƒ—ვáƒ", 176 "settings.service.form.enableNotification" : "შეტყáƒáƒ‘ინებების ჩáƒáƒ áƒ—ვáƒ",
170 "settings.service.form.enableService" : "სერვისის ჩáƒáƒ áƒ—ვáƒ", 177 "settings.service.form.enableService" : "სერვისის ჩáƒáƒ áƒ—ვáƒ",
171 "settings.service.form.headlineBadges" : "Unread message badges", 178 "settings.service.form.headlineBadges" : "Unread message badges",
172 "settings.service.form.headlineGeneral" : "მთáƒáƒ•áƒáƒ áƒ˜", 179 "settings.service.form.headlineGeneral" : "მთáƒáƒ•áƒáƒ áƒ˜",
173 "settings.service.form.headlineNotifications" : "Notifications", 180 "settings.service.form.headlineNotifications" : "Notifications",
174 "settings.service.form.icon" : "Custom icon", 181 "settings.service.form.icon" : "Custom icon",
175 "settings.service.form.iconDelete" : "Delete", 182 "settings.service.form.iconDelete" : "წáƒáƒ¨áƒšáƒ",
176 "settings.service.form.iconUpload" : "Drop your image, or click here", 183 "settings.service.form.iconUpload" : "Drop your image, or click here",
177 "settings.service.form.indirectMessageInfo" : "თქვენ მიიღებთ შეტყáƒáƒ‘ინებáƒáƒ¡ ყáƒáƒ•áƒ”ლი áƒáƒ®áƒáƒšáƒ˜ შეტყáƒáƒ‘ინებისáƒáƒ¡ áƒáƒ áƒ®áƒ–ე, áƒáƒ áƒáƒ›áƒáƒ áƒ¢áƒ @username, @channel, @here, ...", 184 "settings.service.form.indirectMessageInfo" : "თქვენ მიიღებთ შეტყáƒáƒ‘ინებáƒáƒ¡ ყáƒáƒ•áƒ”ლი áƒáƒ®áƒáƒšáƒ˜ შეტყáƒáƒ‘ინებისáƒáƒ¡ áƒáƒ áƒ®áƒ–ე, áƒáƒ áƒáƒ›áƒáƒ áƒ¢áƒ @username, @channel, @here, ...",
178 "settings.service.form.indirectMessages" : "áƒáƒ©áƒ•áƒ”ნე შეტყáƒáƒ‘ინებების ნიშáƒáƒœáƒ˜ ყáƒáƒ•áƒ”ლი áƒáƒ®áƒáƒšáƒ˜ შეტყáƒáƒ‘ინებისთვის", 185 "settings.service.form.indirectMessages" : "áƒáƒ©áƒ•áƒ”ნე შეტყáƒáƒ‘ინებების ნიშáƒáƒœáƒ˜ ყáƒáƒ•áƒ”ლი áƒáƒ®áƒáƒšáƒ˜ შეტყáƒáƒ‘ინებისთვის",
179 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted", 186 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted",
180 "settings.service.form.name" : "სáƒáƒ®áƒ”ლი", 187 "settings.service.form.name" : "სáƒáƒ®áƒ”ლი",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "სერვისის შენáƒáƒ®áƒ•áƒ", 194 "settings.service.form.saveButton" : "სერვისის შენáƒáƒ®áƒ•áƒ",
182 "settings.service.form.tabHosted" : "დáƒáƒ°áƒáƒ¡áƒ¢áƒ˜áƒšáƒ˜", 195 "settings.service.form.tabHosted" : "დáƒáƒ°áƒáƒ¡áƒ¢áƒ˜áƒšáƒ˜",
183 "settings.service.form.tabOnPremise" : "თვით დáƒáƒ°áƒáƒ¡áƒ¢áƒ˜áƒšáƒ˜ â­ï¸", 196 "settings.service.form.tabOnPremise" : "თვით დáƒáƒ°áƒáƒ¡áƒ¢áƒ˜áƒšáƒ˜ â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "EU residents: local sales tax may apply", 233 "subscription.euTaxInfo" : "EU residents: local sales tax may apply",
221 "subscription.features.ads" : "áƒáƒ áƒáƒœáƒáƒ˜áƒ áƒ˜ რეკლáƒáƒ›áƒ”ბი, áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡!", 234 "subscription.features.ads" : "áƒáƒ áƒáƒœáƒáƒ˜áƒ áƒ˜ რეკლáƒáƒ›áƒ”ბი, áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡!",
222 "subscription.features.comingSoon" : "მáƒáƒšáƒ”", 235 "subscription.features.comingSoon" : "მáƒáƒšáƒ”",
223 "subscription.features.customServices" : "პირáƒáƒ“ი მáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ”ბრთქვენთვის დრთქვენი გუნდისთვის",
224 "subscription.features.encryptedSync" : "დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜ სესიის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ", 236 "subscription.features.encryptedSync" : "დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜ სესიის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "on-premise\/hosted სერვისების დáƒáƒ›áƒáƒ¢áƒ”ბáƒ, რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ HipChat", 238 "subscription.features.onpremise" : "on-premise\/hosted სერვისების დáƒáƒ›áƒáƒ¢áƒ”ბáƒ, რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ HipChat",
226 "subscription.features.vpn" : "Proxy-სრდრVPN-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რáƒ", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "ფáƒáƒ¡áƒ˜áƒáƒœáƒ˜ Franz-ის პრემიუმ მხáƒáƒ áƒ›áƒ“áƒáƒ›áƒ­áƒ”რი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜", 242 "subscription.includedFeatures" : "ფáƒáƒ¡áƒ˜áƒáƒœáƒ˜ Franz-ის პრემიუმ მხáƒáƒ áƒ›áƒ“áƒáƒ›áƒ­áƒ”რი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜",
228 "subscription.paymentSessionError" : "გáƒáƒ“áƒáƒ®áƒ“ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ ვერ მáƒáƒ®áƒ”რხდáƒ", 243 "subscription.paymentSessionError" : "გáƒáƒ“áƒáƒ®áƒ“ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ ვერ მáƒáƒ®áƒ”რხდáƒ",
229 "subscription.submit.label" : "მინდრხელი შევუწყრFranz-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¡", 244 "subscription.submit.label" : "მინდრხელი შევუწყრFranz-ის გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¡",
diff --git a/src/i18n/locales/nl-BE.json b/src/i18n/locales/nl-BE.json
index 13dc7548e..5807f11f6 100644
--- a/src/i18n/locales/nl-BE.json
+++ b/src/i18n/locales/nl-BE.json
@@ -1,11 +1,14 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz services", 5 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz services",
3 "global.notConnectedToTheInternet" : "Je hebt geen internet verbinding.", 6 "global.notConnectedToTheInternet" : "Je hebt geen internet verbinding.",
4 "import.headline" : "Importeer je Franz 4 services", 7 "import.headline" : "Importeer je Franz 4 services",
5 "import.notSupportedHeadline" : "De volgende services worden nog niet ondersteund in Franz 5", 8 "import.notSupportedHeadline" : "De volgende services worden nog niet ondersteund in Franz 5",
6 "import.skip.label" : "I want to add services manually", 9 "import.skip.label" : "Ik wens services manueel toe te voegen",
7 "import.submit.label" : "Importeer services", 10 "import.submit.label" : "Importeer services",
8 "infobar.buttonChangelog" : "What is new?", 11 "infobar.buttonChangelog" : "Wat is er nieuw?",
9 "infobar.buttonInstallUpdate" : "Start opnieuw op & installeer de update", 12 "infobar.buttonInstallUpdate" : "Start opnieuw op & installeer de update",
10 "infobar.buttonReloadServices" : "Herlaad de services", 13 "infobar.buttonReloadServices" : "Herlaad de services",
11 "infobar.requiredRequestsFailed" : "Kan de services en gebruikers informatie niet laden", 14 "infobar.requiredRequestsFailed" : "Kan de services en gebruikers informatie niet laden",
@@ -16,7 +19,7 @@
16 "invite.name.label" : "Naam", 19 "invite.name.label" : "Naam",
17 "invite.skip.label" : "Ik wil dit later doen", 20 "invite.skip.label" : "Ik wil dit later doen",
18 "invite.submit.label" : "Verzend uitnodigingen", 21 "invite.submit.label" : "Verzend uitnodigingen",
19 "invite.successInfo" : "Invitations sent successfully", 22 "invite.successInfo" : "Uitnodiging met succes verzonden",
20 "login.email.label" : "E-mailadres", 23 "login.email.label" : "E-mailadres",
21 "login.headline" : "Inloggen", 24 "login.headline" : "Inloggen",
22 "login.invalidCredentials" : "E-mailadres of wachtwoord ongeldig", 25 "login.invalidCredentials" : "E-mailadres of wachtwoord ongeldig",
@@ -26,49 +29,49 @@
26 "login.serverLogout" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 29 "login.serverLogout" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
27 "login.submit.label" : "Log in", 30 "login.submit.label" : "Log in",
28 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.", 31 "login.tokenExpired" : "De sessie is verlopen, log opnieuw in alsjeblieft.",
29 "menu.app.about" : "About Franz", 32 "menu.app.about" : "Over Franz",
30 "menu.app.hide" : "Hide", 33 "menu.app.hide" : "Verbergen",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "Andere verbergen",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "Afsluiten",
33 "menu.app.settings" : "Instellingen", 36 "menu.app.settings" : "Instellingen",
34 "menu.app.unhide" : "Unhide", 37 "menu.app.unhide" : "Zichtbaar maken",
35 "menu.edit" : "Aanpassen", 38 "menu.edit" : "Aanpassen",
36 "menu.edit.copy" : "Copy", 39 "menu.edit.copy" : "Kopiëren",
37 "menu.edit.cut" : "Cut", 40 "menu.edit.cut" : "Knippen",
38 "menu.edit.delete" : "Delete", 41 "menu.edit.delete" : "Verwijderen",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "Emoji & Symbolen",
40 "menu.edit.paste" : "Paste", 43 "menu.edit.paste" : "Plakken",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Plakken en stijl overeen laten komen",
42 "menu.edit.redo" : "Redo", 45 "menu.edit.redo" : "Opnieuw uitvoeren",
43 "menu.edit.selectAll" : "Select All", 46 "menu.edit.selectAll" : "Selecteer alles",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Spraakuitvoer",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "Beginnen met dicteren",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "Begin met spreken",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "Stoppen met spreken",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "Ongedaan maken",
49 "menu.file" : "File", 52 "menu.file" : "Bestand",
50 "menu.help" : "Help", 53 "menu.help" : "Help",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "Logboek",
52 "menu.help.learnMore" : "Learn More", 55 "menu.help.learnMore" : "Meer weten",
53 "menu.help.privacy" : "Privacyverklaring", 56 "menu.help.privacy" : "Privacyverklaring",
54 "menu.help.support" : "Support", 57 "menu.help.support" : "Ondersteuning",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "Servicevoorwaarden",
56 "menu.services" : "Services", 59 "menu.services" : "Diensten",
57 "menu.services.addNewService" : "Add New Service...", 60 "menu.services.addNewService" : "Nieuwe service toevoegen...",
58 "menu.view" : "View", 61 "menu.view" : "Beeld",
59 "menu.view.enterFullScreen" : "Enter Full Screen", 62 "menu.view.enterFullScreen" : "Volledig scherm openen",
60 "menu.view.exitFullScreen" : "Exit Full Screen", 63 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
61 "menu.view.reloadFranz" : "Reload Franz", 64 "menu.view.reloadFranz" : "Franz Herladen",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "Service herladen",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "Werkelijke grootte",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Toggle Developer Tools",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "Volledig scherm aan\/uit",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "Inzoomen",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "Uitzoomen",
69 "menu.window" : "Window", 72 "menu.window" : "Venster",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "Sluiten",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "Minimaliseren",
72 "password.email.label" : "E-mailadres", 75 "password.email.label" : "E-mailadres",
73 "password.headline" : "Wachtwoord resetten", 76 "password.headline" : "Wachtwoord resetten",
74 "password.link.login" : "Log in op je account", 77 "password.link.login" : "Log in op je account",
@@ -76,28 +79,29 @@
76 "password.noUser" : "Geen gebruiker bekend met dat e-mailadres", 79 "password.noUser" : "Geen gebruiker bekend met dat e-mailadres",
77 "password.submit.label" : "Doorgaan", 80 "password.submit.label" : "Doorgaan",
78 "password.successInfo" : "Controleer alsjeblieft je e-mail", 81 "password.successInfo" : "Controleer alsjeblieft je e-mail",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Ondersteun Franz", 83 "pricing.headline" : "Ondersteun Franz",
80 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Franz niet ondersteunen.", 84 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Franz niet ondersteunen.",
81 "pricing.submit.label" : "Ik wil de ontwikkeling van Franz ondersteunen", 85 "pricing.submit.label" : "Ik wil de ontwikkeling van Franz ondersteunen",
82 "pricing.support.label" : "Selecteer je ondersteuningsplan", 86 "pricing.support.label" : "Selecteer je ondersteuningsplan",
83 "service.crashHandler.action" : "{naam} herladen", 87 "service.crashHandler.action" : "{naam} herladen",
84 "service.crashHandler.autoReload" : "Trying to automatically restore {name} in {seconds} seconds", 88 "service.crashHandler.autoReload" : "Automatisch herstellen {name} proberen in {seconds} seconden",
85 "service.crashHandler.headline" : "Oh no!", 89 "service.crashHandler.headline" : "Oh nee!",
86 "service.crashHandler.text" : "{name} has caused an error.", 90 "service.crashHandler.text" : "{name} heeft een probleem veroorzaakt.",
87 "service.disabledHandler.action" : "Enable {name}", 91 "service.disabledHandler.action" : "Activeer {name}",
88 "service.disabledHandler.headline" : "{name} is disabled", 92 "service.disabledHandler.headline" : "{name} is uitgeschakeld",
89 "services.getStarted" : "Beginnen", 93 "services.getStarted" : "Beginnen",
90 "services.welcome" : "Welkom bij Franz", 94 "services.welcome" : "Welkom bij Franz",
91 "settings.account.account.editButton" : "Bewerk account", 95 "settings.account.account.editButton" : "Bewerk account",
92 "settings.account.accountType.basic" : "Basis Account", 96 "settings.account.accountType.basic" : "Basis Account",
93 "settings.account.accountType.premium" : "Premium Supporter Account", 97 "settings.account.accountType.premium" : "Premium Supporter Account",
94 "settings.account.buttonSave" : "Profiel aanpassen", 98 "settings.account.buttonSave" : "Profiel aanpassen",
95 "settings.account.deleteAccount" : "Delete account", 99 "settings.account.deleteAccount" : "Account verwijderen",
96 "settings.account.deleteEmailSent" : "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 100 "settings.account.deleteEmailSent" : "U heeft een email ontvangen met een bevestiginslink om uw account te verwijderen. Uw account en de bijhorende gegevens kunnen niet meer worden herstel na deze actie!",
97 "settings.account.deleteInfo" : "If you don't need your Franz account any longer, you can delete your account and all related data here.", 101 "settings.account.deleteInfo" : "Indien u uw Franz account nietmeer nodig heeft, kan u hier uw account en de gerelateerde gegegevens verwijderen.",
98 "settings.account.headline" : "Account", 102 "settings.account.headline" : "Account",
99 "settings.account.headlineAccount" : "Account informatie", 103 "settings.account.headlineAccount" : "Account informatie",
100 "settings.account.headlineDangerZone" : "Danger Zone", 104 "settings.account.headlineDangerZone" : "Gevaren Zone",
101 "settings.account.headlineInvoices" : "Facturen", 105 "settings.account.headlineInvoices" : "Facturen",
102 "settings.account.headlinePassword" : "Wijzig wachtwoord", 106 "settings.account.headlinePassword" : "Wijzig wachtwoord",
103 "settings.account.headlineProfile" : "Profiel aanpassen", 107 "settings.account.headlineProfile" : "Profiel aanpassen",
@@ -108,17 +112,18 @@
108 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen", 112 "settings.account.successInfo" : "Je wijzigingen zijn opgeslagen",
109 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw", 113 "settings.account.tryReloadUserInfoRequest" : "Probeer opnieuw",
110 "settings.account.userInfoRequestFailed" : "Kon gebruikerinformatie niet laden", 114 "settings.account.userInfoRequestFailed" : "Kon gebruikerinformatie niet laden",
111 "settings.app.buttonClearAllCache" : "Clear cache", 115 "settings.app.buttonClearAllCache" : "Cache wissen",
112 "settings.app.buttonInstallUpdate" : "Herstart & installeer update", 116 "settings.app.buttonInstallUpdate" : "Herstart & installeer update",
113 "settings.app.buttonSearchForUpdate" : "Controleer op updates", 117 "settings.app.buttonSearchForUpdate" : "Controleer op updates",
114 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.", 118 "settings.app.cacheInfo" : "Franz cache gebruikt momenteel {size} schijfruimte.",
115 "settings.app.currentVersion" : "Huidige versie:", 119 "settings.app.currentVersion" : "Huidige versie:",
116 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond", 120 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond",
117 "settings.app.form.autoLaunchOnStart" : "Lanceer Franz bij opstarten", 121 "settings.app.form.autoLaunchOnStart" : "Lanceer Franz bij opstarten",
118 "settings.app.form.beta" : "Inclusief bèta versies", 122 "settings.app.form.beta" : "Inclusief bèta versies",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
120 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 124 "settings.app.form.enableGPUAcceleration" : "GPU Acceleratie Activeren",
121 "settings.app.form.enableSpellchecking" : "Enable spell checking", 125 "settings.app.form.enableMenuBar" : "Toon Franz in Menu Bar",
126 "settings.app.form.enableSpellchecking" : "Spellingcontrole inschakelen",
122 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk", 127 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk",
123 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 128 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock",
124 "settings.app.form.language" : "Taal", 129 "settings.app.form.language" : "Taal",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt", 131 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt",
127 "settings.app.form.showDisabledServices" : "Display disabled services tabs", 132 "settings.app.form.showDisabledServices" : "Display disabled services tabs",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Instellingen", 135 "settings.app.headline" : "Instellingen",
130 "settings.app.headlineAdvanced" : "Advanced", 136 "settings.app.headlineAdvanced" : "Advanced",
131 "settings.app.headlineAppearance" : "Appearance", 137 "settings.app.headlineAppearance" : "Appearance",
@@ -166,18 +172,25 @@
166 "settings.service.form.editServiceHeadline" : "{name} aanpassen", 172 "settings.service.form.editServiceHeadline" : "{name} aanpassen",
167 "settings.service.form.enableAudio" : "Enable audio", 173 "settings.service.form.enableAudio" : "Enable audio",
168 "settings.service.form.enableBadge" : "Show unread message badges", 174 "settings.service.form.enableBadge" : "Show unread message badges",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Notificaties aanzetten", 176 "settings.service.form.enableNotification" : "Notificaties aanzetten",
170 "settings.service.form.enableService" : "Service aanzetten", 177 "settings.service.form.enableService" : "Service aanzetten",
171 "settings.service.form.headlineBadges" : "Unread message badges", 178 "settings.service.form.headlineBadges" : "Unread message badges",
172 "settings.service.form.headlineGeneral" : "Algemeen", 179 "settings.service.form.headlineGeneral" : "Algemeen",
173 "settings.service.form.headlineNotifications" : "Notifications", 180 "settings.service.form.headlineNotifications" : "Notifications",
174 "settings.service.form.icon" : "Custom icon", 181 "settings.service.form.icon" : "Custom icon",
175 "settings.service.form.iconDelete" : "Delete", 182 "settings.service.form.iconDelete" : "Verwijderen",
176 "settings.service.form.iconUpload" : "Drop your image, or click here", 183 "settings.service.form.iconUpload" : "Drop your image, or click here",
177 "settings.service.form.indirectMessageInfo" : "Je wordt verwittigd over alle nieuwe berichten in een kanaal, niet alleen @username, @channel, @here, ...", 184 "settings.service.form.indirectMessageInfo" : "Je wordt verwittigd over alle nieuwe berichten in een kanaal, niet alleen @username, @channel, @here, ...",
178 "settings.service.form.indirectMessages" : "Toon berichten-badge voor alle nieuwe berichten", 185 "settings.service.form.indirectMessages" : "Toon berichten-badge voor alle nieuwe berichten",
179 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted", 186 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted",
180 "settings.service.form.name" : "Naam", 187 "settings.service.form.name" : "Naam",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Service bewaren", 194 "settings.service.form.saveButton" : "Service bewaren",
182 "settings.service.form.tabHosted" : "Gehost", 195 "settings.service.form.tabHosted" : "Gehost",
183 "settings.service.form.tabOnPremise" : "Intern gehost â­ï¸", 196 "settings.service.form.tabOnPremise" : "Intern gehost â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "EU residents: local sales tax may apply", 233 "subscription.euTaxInfo" : "EU residents: local sales tax may apply",
221 "subscription.features.ads" : "Geen reclame, nooit!", 234 "subscription.features.ads" : "Geen reclame, nooit!",
222 "subscription.features.comingSoon" : "komt binnenkort", 235 "subscription.features.comingSoon" : "komt binnenkort",
223 "subscription.features.customServices" : "Persoonlijke services voor jou en je team",
224 "subscription.features.encryptedSync" : "Synchronisatie van geëncrypteerde sessies", 236 "subscription.features.encryptedSync" : "Synchronisatie van geëncrypteerde sessies",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Intern gehoste services zoals HipChat", 238 "subscription.features.onpremise" : "Intern gehoste services zoals HipChat",
226 "subscription.features.vpn" : "Proxy & VPN ondersteuning", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Een betalend account voor Franz omvat", 242 "subscription.includedFeatures" : "Een betalend account voor Franz omvat",
228 "subscription.paymentSessionError" : "Betalingsformulier kon niet geladen worden", 243 "subscription.paymentSessionError" : "Betalingsformulier kon niet geladen worden",
229 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz steunen", 244 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz steunen",
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index 4ff3cdd80..a6db3d773 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz-services", 5 "global.api.unhealthy" : "Kan geen verbinding maken met de Franz-services",
3 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.", 6 "global.notConnectedToTheInternet" : "U bent niet verbonden met het internet.",
4 "import.headline" : "Importeer uw Franz 4-services", 7 "import.headline" : "Importeer uw Franz 4-services",
@@ -21,7 +24,7 @@
21 "login.headline" : "Inloggen", 24 "login.headline" : "Inloggen",
22 "login.invalidCredentials" : "E-mailadres of wachtwoord ongeldig", 25 "login.invalidCredentials" : "E-mailadres of wachtwoord ongeldig",
23 "login.link.password" : "Wachtwoord vergeten", 26 "login.link.password" : "Wachtwoord vergeten",
24 "login.link.signup" : "Maak een gratis account", 27 "login.link.signup" : "Maak een gratis account aan",
25 "login.password.label" : "Wachtwoord", 28 "login.password.label" : "Wachtwoord",
26 "login.serverLogout" : "De sessie is verlopen, log alsjeblieft opnieuw in.", 29 "login.serverLogout" : "De sessie is verlopen, log alsjeblieft opnieuw in.",
27 "login.submit.label" : "Inloggen", 30 "login.submit.label" : "Inloggen",
@@ -59,16 +62,16 @@
59 "menu.view.enterFullScreen" : "Gebruik volledig scherm", 62 "menu.view.enterFullScreen" : "Gebruik volledig scherm",
60 "menu.view.exitFullScreen" : "Volledig scherm verlaten", 63 "menu.view.exitFullScreen" : "Volledig scherm verlaten",
61 "menu.view.reloadFranz" : "Herlaad Franz", 64 "menu.view.reloadFranz" : "Herlaad Franz",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "Een service opnieuw laden",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "Werkelijke grootte",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Ontwikkelaarstools aan\/uit",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "Volledig scherm aan\/uit",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Service ontwikkelaarstools aan\/uit",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "Inzoomen",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "Uitzoomen",
69 "menu.window" : "Window", 72 "menu.window" : "Venster",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "Sluiten",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "Minimaliseren",
72 "password.email.label" : "E-mailadres", 75 "password.email.label" : "E-mailadres",
73 "password.headline" : "Wachtwoord vergeten", 76 "password.headline" : "Wachtwoord vergeten",
74 "password.link.login" : "Log in op je account", 77 "password.link.login" : "Log in op je account",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Geen gebruiker bekend met dat e-mailadres", 79 "password.noUser" : "Geen gebruiker bekend met dat e-mailadres",
77 "password.submit.label" : "Verzenden", 80 "password.submit.label" : "Verzenden",
78 "password.successInfo" : "Controleer alsjeblieft je e-mail", 81 "password.successInfo" : "Controleer alsjeblieft je e-mail",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Steun Franz", 83 "pricing.headline" : "Steun Franz",
80 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Franz niet ondersteunen.", 84 "pricing.link.skipPayment" : "Ik wil de ontwikkeling van Franz niet ondersteunen.",
81 "pricing.submit.label" : "Ik wil de ontwikkeling van Franz steunen", 85 "pricing.submit.label" : "Ik wil de ontwikkeling van Franz steunen",
@@ -116,7 +120,8 @@
116 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond", 120 "settings.app.form.autoLaunchInBackground" : "Open op de achtergrond",
117 "settings.app.form.autoLaunchOnStart" : "Open Franz bij opstarten", 121 "settings.app.form.autoLaunchOnStart" : "Open Franz bij opstarten",
118 "settings.app.form.beta" : "Inclusief bètaversies", 122 "settings.app.form.beta" : "Inclusief bètaversies",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
124 "settings.app.form.enableGPUAcceleration" : "Schakel videokaart acceleratie in ",
120 "settings.app.form.enableMenuBar" : "Toon Franz in menubalk", 125 "settings.app.form.enableMenuBar" : "Toon Franz in menubalk",
121 "settings.app.form.enableSpellchecking" : "Zet spellingcontrole aan", 126 "settings.app.form.enableSpellchecking" : "Zet spellingcontrole aan",
122 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk", 127 "settings.app.form.enableSystemTray" : "Toon Franz in de systeembalk",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt", 131 "settings.app.form.runInBackground" : "Houd Franz op de achtergrond wanneer het venster gesloten wordt",
127 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services", 132 "settings.app.form.showDisabledServices" : "Toon uitgeschakelde services",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Toon badge met ongelezen berichten wanneer meldingen zijn uitgeschakeld",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Instellingen", 135 "settings.app.headline" : "Instellingen",
130 "settings.app.headlineAdvanced" : "Geavanceerd", 136 "settings.app.headlineAdvanced" : "Geavanceerd",
131 "settings.app.headlineAppearance" : "Weergave", 137 "settings.app.headlineAppearance" : "Weergave",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "Bewerk {name}", 172 "settings.service.form.editServiceHeadline" : "Bewerk {name}",
167 "settings.service.form.enableAudio" : "Audio inschakelen", 173 "settings.service.form.enableAudio" : "Audio inschakelen",
168 "settings.service.form.enableBadge" : "Toon badges met ongelezen berichten", 174 "settings.service.form.enableBadge" : "Toon badges met ongelezen berichten",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Meldingen inschakelen", 176 "settings.service.form.enableNotification" : "Meldingen inschakelen",
170 "settings.service.form.enableService" : "Service inschakelen", 177 "settings.service.form.enableService" : "Service inschakelen",
171 "settings.service.form.headlineBadges" : "Ongelezen berichten badges", 178 "settings.service.form.headlineBadges" : "Ongelezen berichten badges",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Toon berichtenbadge voor alle nieuwe berichten", 185 "settings.service.form.indirectMessages" : "Toon berichtenbadge voor alle nieuwe berichten",
179 "settings.service.form.isMutedInfo" : "Indien uitgeschakeld zullen alle meldinggeluiden en afgespeelde audio uitgeschakeld zijn", 186 "settings.service.form.isMutedInfo" : "Indien uitgeschakeld zullen alle meldinggeluiden en afgespeelde audio uitgeschakeld zijn",
180 "settings.service.form.name" : "Naam", 187 "settings.service.form.name" : "Naam",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Service opslaan", 194 "settings.service.form.saveButton" : "Service opslaan",
182 "settings.service.form.tabHosted" : "Gehost", 195 "settings.service.form.tabHosted" : "Gehost",
183 "settings.service.form.tabOnPremise" : "Zelf-gehost â­ï¸", 196 "settings.service.form.tabOnPremise" : "Zelf-gehost â­ï¸",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Bewoners binnen EU: lokale belasting kan van toepassing zijn", 233 "subscription.euTaxInfo" : "Bewoners binnen EU: lokale belasting kan van toepassing zijn",
221 "subscription.features.ads" : "Geen advertenties, nooit!", 234 "subscription.features.ads" : "Geen advertenties, nooit!",
222 "subscription.features.comingSoon" : "komt binnenkort", 235 "subscription.features.comingSoon" : "komt binnenkort",
223 "subscription.features.customServices" : "Privé-services voor jou en je team",
224 "subscription.features.encryptedSync" : "Beveiligde sessie synchronisatie", 236 "subscription.features.encryptedSync" : "Beveiligde sessie synchronisatie",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Add on-geschikt\/gehoste services zoals HipChat", 238 "subscription.features.onpremise" : "Add on-geschikt\/gehoste services zoals HipChat",
226 "subscription.features.vpn" : "Proxy & VPN ondersteuning", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Betaald Franz Premium Supporter Account bevat", 242 "subscription.includedFeatures" : "Betaald Franz Premium Supporter Account bevat",
228 "subscription.paymentSessionError" : "Kan betaalformulier niet initialiseren", 243 "subscription.paymentSessionError" : "Kan betaalformulier niet initialiseren",
229 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz ondersteunen", 244 "subscription.submit.label" : "Ik wil de ontwikkeling van Franz ondersteunen",
@@ -236,15 +251,15 @@
236 "tabs.item.disableAudio" : "Schakel audio uit", 251 "tabs.item.disableAudio" : "Schakel audio uit",
237 "tabs.item.disableNotifications" : "Schakel meldingen uit", 252 "tabs.item.disableNotifications" : "Schakel meldingen uit",
238 "tabs.item.disableService" : "Schakel service uit", 253 "tabs.item.disableService" : "Schakel service uit",
239 "tabs.item.edit" : "Bewerk", 254 "tabs.item.edit" : "Bewerken",
240 "tabs.item.enableAudio" : "Audio inschakelen", 255 "tabs.item.enableAudio" : "Audio inschakelen",
241 "tabs.item.enableNotification" : "Meldingen inschakelen", 256 "tabs.item.enableNotification" : "Meldingen inschakelen",
242 "tabs.item.enableService" : "Service inschakelen", 257 "tabs.item.enableService" : "Service inschakelen",
243 "tabs.item.reload" : "Laad opnieuw", 258 "tabs.item.reload" : "Laad opnieuw",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{field} is niet geldig",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "{field} moet minimaal {length} karakters lang zijn",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{field} is vereist",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field} is niet een geldige URL",
248 "welcome.loginButton" : "Log in op je account", 263 "welcome.loginButton" : "Log in op je account",
249 "welcome.signupButton" : "Maak een gratis account", 264 "welcome.signupButton" : "Maak een gratis account",
250 "welcome.slogan" : "Messaging die voor jou werkt" 265 "welcome.slogan" : "Messaging die voor jou werkt"
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index 9fb72b9c9..60ced5933 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Nie można połączyć się z usługami Franz online", 5 "global.api.unhealthy" : "Nie można połączyć się z usługami Franz online",
3 "global.notConnectedToTheInternet" : "Nie masz połączenia z Internetem.", 6 "global.notConnectedToTheInternet" : "Nie masz połączenia z Internetem.",
4 "import.headline" : "Importuj usługi Franz 4", 7 "import.headline" : "Importuj usługi Franz 4",
@@ -28,20 +31,20 @@
28 "login.tokenExpired" : "Twoja sesja wygasła, zaloguj się ponownie.", 31 "login.tokenExpired" : "Twoja sesja wygasła, zaloguj się ponownie.",
29 "menu.app.about" : "O Franz", 32 "menu.app.about" : "O Franz",
30 "menu.app.hide" : "Ukryj", 33 "menu.app.hide" : "Ukryj",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "Ukryj pozostałe",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "Zakończ",
33 "menu.app.settings" : "Ustawienia", 36 "menu.app.settings" : "Ustawienia",
34 "menu.app.unhide" : "Pokaż", 37 "menu.app.unhide" : "Pokaż",
35 "menu.edit" : "Edytuj", 38 "menu.edit" : "Edytuj",
36 "menu.edit.copy" : "Skopiuj", 39 "menu.edit.copy" : "Skopiuj",
37 "menu.edit.cut" : "Wytnij", 40 "menu.edit.cut" : "Wytnij",
38 "menu.edit.delete" : "Usuń", 41 "menu.edit.delete" : "Usuń",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "Emoji i symbole",
40 "menu.edit.paste" : "Wklej", 43 "menu.edit.paste" : "Wklej",
41 "menu.edit.pasteAndMatchStyle" : "Wklej i dopasuj styl", 44 "menu.edit.pasteAndMatchStyle" : "Wklej i dopasuj styl",
42 "menu.edit.redo" : "Ponów", 45 "menu.edit.redo" : "Ponów",
43 "menu.edit.selectAll" : "Zaznacz wszystko", 46 "menu.edit.selectAll" : "Zaznacz wszystko",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Mowa",
45 "menu.edit.startDictation" : "Zacznij dyktować", 48 "menu.edit.startDictation" : "Zacznij dyktować",
46 "menu.edit.startSpeaking" : "Zacznij mówić", 49 "menu.edit.startSpeaking" : "Zacznij mówić",
47 "menu.edit.stopSpeaking" : "Przestań mówić", 50 "menu.edit.stopSpeaking" : "Przestań mówić",
@@ -52,7 +55,7 @@
52 "menu.help.learnMore" : "Dowiedz się więcej", 55 "menu.help.learnMore" : "Dowiedz się więcej",
53 "menu.help.privacy" : "Polityka prywatności", 56 "menu.help.privacy" : "Polityka prywatności",
54 "menu.help.support" : "Wsparcie", 57 "menu.help.support" : "Wsparcie",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "Warunki świadczenia usług",
56 "menu.services" : "Usługi", 59 "menu.services" : "Usługi",
57 "menu.services.addNewService" : "Dodaj nową usługę...", 60 "menu.services.addNewService" : "Dodaj nową usługę...",
58 "menu.view" : "Widok", 61 "menu.view" : "Widok",
@@ -61,9 +64,9 @@
61 "menu.view.reloadFranz" : "Przeładuj Franz", 64 "menu.view.reloadFranz" : "Przeładuj Franz",
62 "menu.view.reloadService" : "Przeładuj usługę", 65 "menu.view.reloadService" : "Przeładuj usługę",
63 "menu.view.resetZoom" : "Domyślny rozmiar", 66 "menu.view.resetZoom" : "Domyślny rozmiar",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Pokaż narzędzia developerskie",
65 "menu.view.toggleFullScreen" : "Przełącz tryb pełnoekranowy", 68 "menu.view.toggleFullScreen" : "Przełącz tryb pełnoekranowy",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Włącz narzędzia developerskie serwisu",
67 "menu.view.zoomIn" : "Powiększ", 70 "menu.view.zoomIn" : "Powiększ",
68 "menu.view.zoomOut" : "Pomniejsz", 71 "menu.view.zoomOut" : "Pomniejsz",
69 "menu.window" : "Okno", 72 "menu.window" : "Okno",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Nie znaleziono użytkownika z takim adresem email", 79 "password.noUser" : "Nie znaleziono użytkownika z takim adresem email",
77 "password.submit.label" : "Wyślij", 80 "password.submit.label" : "Wyślij",
78 "password.successInfo" : "Proszę sprawdzić swój email", 81 "password.successInfo" : "Proszę sprawdzić swój email",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Wspieraj Franz", 83 "pricing.headline" : "Wspieraj Franz",
80 "pricing.link.skipPayment" : "Nie chcę wspierać rozwoju aplikacji Franz.", 84 "pricing.link.skipPayment" : "Nie chcę wspierać rozwoju aplikacji Franz.",
81 "pricing.submit.label" : "Chcę wspierać rozwój aplikacji Franz", 85 "pricing.submit.label" : "Chcę wspierać rozwój aplikacji Franz",
@@ -116,16 +120,18 @@
116 "settings.app.form.autoLaunchInBackground" : "Otwórz w tle", 120 "settings.app.form.autoLaunchInBackground" : "Otwórz w tle",
117 "settings.app.form.autoLaunchOnStart" : "Uruchom Franz na poczÄ…tku", 121 "settings.app.form.autoLaunchOnStart" : "Uruchom Franz na poczÄ…tku",
118 "settings.app.form.beta" : "Uwzględnij wersje beta", 122 "settings.app.form.beta" : "Uwzględnij wersje beta",
123 "settings.app.form.darkMode" : "Join the Dark Side",
119 "settings.app.form.enableGPUAcceleration" : "WÅ‚Ä…cz akceleracjÄ™ GPU", 124 "settings.app.form.enableGPUAcceleration" : "WÅ‚Ä…cz akceleracjÄ™ GPU",
120 "settings.app.form.enableMenuBar" : "Pokaż Franz na pasku menu", 125 "settings.app.form.enableMenuBar" : "Pokaż Franz na pasku menu",
121 "settings.app.form.enableSpellchecking" : "WÅ‚Ä…cz sprawdzanie pisowni", 126 "settings.app.form.enableSpellchecking" : "WÅ‚Ä…cz sprawdzanie pisowni",
122 "settings.app.form.enableSystemTray" : "Pokaż Franza w tacy systemowej", 127 "settings.app.form.enableSystemTray" : "Pokaż Franza w obszarze powiadomień",
123 "settings.app.form.hideDockIcon" : "Ukrywaj ikonÄ™ Franz w zasobniku systemowym", 128 "settings.app.form.hideDockIcon" : "Ukrywaj ikonÄ™ Franz w zasobniku systemowym",
124 "settings.app.form.language" : "Język", 129 "settings.app.form.language" : "Język",
125 "settings.app.form.minimizeToSystemTray" : "Zminimalizuj aplikacjÄ™ Franz", 130 "settings.app.form.minimizeToSystemTray" : "Zminimalizuj aplikacjÄ™ Franz",
126 "settings.app.form.runInBackground" : "Zachowaj aplikację Franz w tle po zamknięciu okna", 131 "settings.app.form.runInBackground" : "Zachowaj aplikację Franz w tle po zamknięciu okna",
127 "settings.app.form.showDisabledServices" : "Wyłącz wyświetlanie zakładek z usługami", 132 "settings.app.form.showDisabledServices" : "Wyłącz wyświetlanie zakładek z usługami",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Pokaż licznik nieprzeczytanych wiadomości gdy powiadomienia są wyłączone", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Pokaż licznik nieprzeczytanych wiadomości gdy powiadomienia są wyłączone",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Ustawienia", 135 "settings.app.headline" : "Ustawienia",
130 "settings.app.headlineAdvanced" : "Zaawansowane", 136 "settings.app.headlineAdvanced" : "Zaawansowane",
131 "settings.app.headlineAppearance" : "WyglÄ…d", 137 "settings.app.headlineAppearance" : "WyglÄ…d",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "Edytuj {name}", 172 "settings.service.form.editServiceHeadline" : "Edytuj {name}",
167 "settings.service.form.enableAudio" : "Włącz dźwięk", 173 "settings.service.form.enableAudio" : "Włącz dźwięk",
168 "settings.service.form.enableBadge" : "Pokaż znacznik nieprzeczytanych wiadomości", 174 "settings.service.form.enableBadge" : "Pokaż znacznik nieprzeczytanych wiadomości",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Aktywuj powiadomienia", 176 "settings.service.form.enableNotification" : "Aktywuj powiadomienia",
170 "settings.service.form.enableService" : "Aktywuj usługę", 177 "settings.service.form.enableService" : "Aktywuj usługę",
171 "settings.service.form.headlineBadges" : "Znaczniki nieprzeczytanych wiadomości", 178 "settings.service.form.headlineBadges" : "Znaczniki nieprzeczytanych wiadomości",
@@ -178,11 +185,17 @@
178 "settings.service.form.indirectMessages" : "Pokaż ikonę wiadomości dla wszystkich nowych wiadomości", 185 "settings.service.form.indirectMessages" : "Pokaż ikonę wiadomości dla wszystkich nowych wiadomości",
179 "settings.service.form.isMutedInfo" : "Kiedy nieaktywne, wszystkie dźwięki powiadomień są wyciszone", 186 "settings.service.form.isMutedInfo" : "Kiedy nieaktywne, wszystkie dźwięki powiadomień są wyciszone",
180 "settings.service.form.name" : "Nazwa", 187 "settings.service.form.name" : "Nazwa",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Zapisz usługę", 194 "settings.service.form.saveButton" : "Zapisz usługę",
182 "settings.service.form.tabHosted" : "Hostowane", 195 "settings.service.form.tabHosted" : "Hostowane",
183 "settings.service.form.tabOnPremise" : "Hostowane lokalnie â­ï¸", 196 "settings.service.form.tabOnPremise" : "Hostowane lokalnie â­ï¸",
184 "settings.service.form.team" : "Zespół", 197 "settings.service.form.team" : "Zespół",
185 "settings.service.form.useHostedService" : "Use the hosted {name} service.", 198 "settings.service.form.useHostedService" : "Użyj hostowanej usługi {name}",
186 "settings.service.form.yourServices" : "Twoje usługi", 199 "settings.service.form.yourServices" : "Twoje usługi",
187 "settings.services.deletedInfo" : "Usługa została usunięta", 200 "settings.services.deletedInfo" : "Usługa została usunięta",
188 "settings.services.discoverServices" : "Przeglądaj usługi", 201 "settings.services.discoverServices" : "Przeglądaj usługi",
@@ -195,13 +208,13 @@
195 "settings.user.form.accountType.company" : "Firma", 208 "settings.user.form.accountType.company" : "Firma",
196 "settings.user.form.accountType.individual" : "Prywatne", 209 "settings.user.form.accountType.individual" : "Prywatne",
197 "settings.user.form.accountType.label" : "Typ konta", 210 "settings.user.form.accountType.label" : "Typ konta",
198 "settings.user.form.accountType.non-profit" : "Non-profit", 211 "settings.user.form.accountType.non-profit" : "Non-Profit",
199 "settings.user.form.currentPassword" : "Obecne hasło", 212 "settings.user.form.currentPassword" : "Obecne hasło",
200 "settings.user.form.email" : "Adres email", 213 "settings.user.form.email" : "Adres email",
201 "settings.user.form.firstname" : "ImiÄ™", 214 "settings.user.form.firstname" : "ImiÄ™",
202 "settings.user.form.lastname" : "Nazwisko", 215 "settings.user.form.lastname" : "Nazwisko",
203 "settings.user.form.newPassword" : "Nowe hasło", 216 "settings.user.form.newPassword" : "Nowe hasło",
204 "sidebar.addNewService" : "!!!Add new service", 217 "sidebar.addNewService" : "Dodaj kolejną usługę",
205 "sidebar.muteApp" : "Wyłącz powiadomienia i dźwięki", 218 "sidebar.muteApp" : "Wyłącz powiadomienia i dźwięki",
206 "sidebar.settings" : "Ustawienia", 219 "sidebar.settings" : "Ustawienia",
207 "sidebar.unmuteApp" : "Włącz powiadomienia i dźwięki", 220 "sidebar.unmuteApp" : "Włącz powiadomienia i dźwięki",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Rezydenci UE: lokalne stawki VAT mogą zostać zaaplikowane", 233 "subscription.euTaxInfo" : "Rezydenci UE: lokalne stawki VAT mogą zostać zaaplikowane",
221 "subscription.features.ads" : "Brak reklam, na zawsze!", 234 "subscription.features.ads" : "Brak reklam, na zawsze!",
222 "subscription.features.comingSoon" : "wkrótce dostępne", 235 "subscription.features.comingSoon" : "wkrótce dostępne",
223 "subscription.features.customServices" : "Prywatne usługi dla Ciebie i Twojego zespołu",
224 "subscription.features.encryptedSync" : "Szyfrowana synchronizacja sesji", 236 "subscription.features.encryptedSync" : "Szyfrowana synchronizacja sesji",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Dodawanie lokalnych\/hostowanych usług takich jak HipChat", 238 "subscription.features.onpremise" : "Dodawanie lokalnych\/hostowanych usług takich jak HipChat",
226 "subscription.features.vpn" : "Wsprarcie Proxy i VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "PÅ‚atne konto Franz Premium obejmuje", 242 "subscription.includedFeatures" : "PÅ‚atne konto Franz Premium obejmuje",
228 "subscription.paymentSessionError" : "Nie można wczytać formularza płatności\"", 243 "subscription.paymentSessionError" : "Nie można wczytać formularza płatności\"",
229 "subscription.submit.label" : "Chcę wspierać rozwój aplikacji Franz", 244 "subscription.submit.label" : "Chcę wspierać rozwój aplikacji Franz",
@@ -241,10 +256,10 @@
241 "tabs.item.enableNotification" : "WÅ‚Ä…cz powiadomienia", 256 "tabs.item.enableNotification" : "WÅ‚Ä…cz powiadomienia",
242 "tabs.item.enableService" : "Aktywuj usługę", 257 "tabs.item.enableService" : "Aktywuj usługę",
243 "tabs.item.reload" : "Przeładuj", 258 "tabs.item.reload" : "Przeładuj",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "Pole {field} nie jest poprawne",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "Pole {field} powinno składać się z co najmniej {length} znaków",
246 "validation.required" : "{field} is required", 261 "validation.required" : "Pole {field} jest wymagane",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "Pole {field} nie jest poprawnym ciÄ…giem URL.",
248 "welcome.loginButton" : "Zaloguj siÄ™ na swoje konto", 263 "welcome.loginButton" : "Zaloguj siÄ™ na swoje konto",
249 "welcome.signupButton" : "Stwórz darmowe konto", 264 "welcome.signupButton" : "Stwórz darmowe konto",
250 "welcome.slogan" : "Komunikator który działa" 265 "welcome.slogan" : "Komunikator który działa"
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index ceb35ce30..70f6431df 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -1,23 +1,26 @@
1{ 1{
2 "global.api.unhealthy" : "Não foi possível conectar aos serviços do Franz", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "global.notConnectedToTheInternet" : "Você não está conectado à internet.", 3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "import.headline" : "Importe seus serviços do Franz 4", 4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5", 5 "global.api.unhealthy" : "Não foi possível conectar-se aos serviços on-line do Franz.",
6 "global.notConnectedToTheInternet" : "Você não está conectado à internet",
7 "import.headline" : "Importe seus serviços do Franz 4 ",
8 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5 ",
6 "import.skip.label" : "Quero adicionar serviços manualmente", 9 "import.skip.label" : "Quero adicionar serviços manualmente",
7 "import.submit.label" : "Importar serviços", 10 "import.submit.label" : "Importar serviços",
8 "infobar.buttonChangelog" : "O que há de novo?", 11 "infobar.buttonChangelog" : "O que há de novo?",
9 "infobar.buttonInstallUpdate" : "Reiniciar e instalar atualizações", 12 "infobar.buttonInstallUpdate" : "Reiniciar e instalar atualizações ",
10 "infobar.buttonReloadServices" : "Recarregar serviços", 13 "infobar.buttonReloadServices" : "Recarregar serviços",
11 "infobar.requiredRequestsFailed" : "Não foi possível carregar serviços e informações do usuário", 14 "infobar.requiredRequestsFailed" : "Não foi possível carregar os serviços e informações de usuário",
12 "infobar.servicesUpdated" : "Seus serviços foram atualizados.", 15 "infobar.servicesUpdated" : "Seus serviços foram atualizados.",
13 "infobar.updateAvailable" : "Uma nova atualização do Franz está disponível.", 16 "infobar.updateAvailable" : "Uma nova atualização do Franz está disponível.",
14 "invite.email.label" : "Endereço de e-mail ", 17 "invite.email.label" : "Endereço de E-mail",
15 "invite.headline.friends" : "Convide três de seus amigos ou colegas", 18 "invite.headline.friends" : "Convide 3 amigos ou colegas",
16 "invite.name.label" : "Nome", 19 "invite.name.label" : "Nome",
17 "invite.skip.label" : "Quero fazer isso depois", 20 "invite.skip.label" : "Quero fazer isso depois",
18 "invite.submit.label" : "Enviar convites", 21 "invite.submit.label" : "Enviar convites",
19 "invite.successInfo" : "Convites enviados com sucesso", 22 "invite.successInfo" : "Convites enviados com sucesso",
20 "login.email.label" : "Endereço de e-mail", 23 "login.email.label" : "E-mail",
21 "login.headline" : "Entrar", 24 "login.headline" : "Entrar",
22 "login.invalidCredentials" : "E-mail ou senha inválida", 25 "login.invalidCredentials" : "E-mail ou senha inválida",
23 "login.link.password" : "Trocar a senha", 26 "login.link.password" : "Trocar a senha",
@@ -28,58 +31,59 @@
28 "login.tokenExpired" : "Sua sessão expirou, faça o login novamente.", 31 "login.tokenExpired" : "Sua sessão expirou, faça o login novamente.",
29 "menu.app.about" : "Sobre Franz", 32 "menu.app.about" : "Sobre Franz",
30 "menu.app.hide" : "Ocultar", 33 "menu.app.hide" : "Ocultar",
31 "menu.app.hideOthers" : "Ocultar os demais", 34 "menu.app.hideOthers" : "Ocultar Outros",
32 "menu.app.quit" : "Sair", 35 "menu.app.quit" : "Sair",
33 "menu.app.settings" : "Ajustes", 36 "menu.app.settings" : "Configurações",
34 "menu.app.unhide" : "Exibir", 37 "menu.app.unhide" : "Reexibir",
35 "menu.edit" : "Editar", 38 "menu.edit" : "Editar",
36 "menu.edit.copy" : "Copiar", 39 "menu.edit.copy" : "Copiar",
37 "menu.edit.cut" : "Cortar", 40 "menu.edit.cut" : "Cortar",
38 "menu.edit.delete" : "Excluir", 41 "menu.edit.delete" : "Excluir",
39 "menu.edit.emojiSymbols" : "Emoji & Símbolos ", 42 "menu.edit.emojiSymbols" : "Emoji & Símbolos",
40 "menu.edit.paste" : "Colar", 43 "menu.edit.paste" : "Colar",
41 "menu.edit.pasteAndMatchStyle" : "Colar e corresponder ao estilo", 44 "menu.edit.pasteAndMatchStyle" : "Colar e Corresponder ao Estilo",
42 "menu.edit.redo" : "Refazer", 45 "menu.edit.redo" : "Refazer",
43 "menu.edit.selectAll" : "Selecionar tudo", 46 "menu.edit.selectAll" : "Selecionar Tudo",
44 "menu.edit.speech" : "Discurso", 47 "menu.edit.speech" : "Discurso",
45 "menu.edit.startDictation" : "iniciar digitação por voz", 48 "menu.edit.startDictation" : "Iniciar Digitação",
46 "menu.edit.startSpeaking" : "começar a falar", 49 "menu.edit.startSpeaking" : "Começar a Falar",
47 "menu.edit.stopSpeaking" : "Parar de falar", 50 "menu.edit.stopSpeaking" : "Parar de Falar",
48 "menu.edit.undo" : "Desfazer", 51 "menu.edit.undo" : "Desfazer",
49 "menu.file" : "Arquivo", 52 "menu.file" : "Arquivo",
50 "menu.help" : "Ajuda", 53 "menu.help" : "Ajuda",
51 "menu.help.changelog" : "Registro de alterações", 54 "menu.help.changelog" : "Registro de Alterações ",
52 "menu.help.learnMore" : "Saiba Mais", 55 "menu.help.learnMore" : "Saiba Mais ",
53 "menu.help.privacy" : "Declaração de privacidade", 56 "menu.help.privacy" : "Declaração de Privacidade ",
54 "menu.help.support" : "Suporte", 57 "menu.help.support" : "Suporte",
55 "menu.help.tos" : "Termos de Serviço", 58 "menu.help.tos" : "Termos de Serviço",
56 "menu.services" : "Serviços", 59 "menu.services" : "Serviços",
57 "menu.services.addNewService" : "Adicionar Novo Serviço", 60 "menu.services.addNewService" : "Adicionar Novo Serviço",
58 "menu.view" : "Visualizar", 61 "menu.view" : "Visualizar ",
59 "menu.view.enterFullScreen" : "Entrar na tela cheia", 62 "menu.view.enterFullScreen" : "Modo Tela Cheia",
60 "menu.view.exitFullScreen" : "Sair da tela cheia", 63 "menu.view.exitFullScreen" : "Sair da Tela Cheia",
61 "menu.view.reloadFranz" : "Recarregar Franz", 64 "menu.view.reloadFranz" : "Recarregar Franz",
62 "menu.view.reloadService" : "Reiniciar o serviço", 65 "menu.view.reloadService" : "Reiniciar o Serviço",
63 "menu.view.resetZoom" : "Tamanho real", 66 "menu.view.resetZoom" : "Tamanho real",
64 "menu.view.toggleDevTools" : "alternar ferramentas de desenvolvedor", 67 "menu.view.toggleDevTools" : "Ferramentas de Desenvolvedor",
65 "menu.view.toggleFullScreen" : "tela cheia", 68 "menu.view.toggleFullScreen" : "Modo Tela Cheia",
66 "menu.view.toggleServiceDevTools" : "habilitar ferramentas de serviços de desenvolvedor", 69 "menu.view.toggleServiceDevTools" : "Ferramentas de Serviços de Desenvolvedor",
67 "menu.view.zoomIn" : "Ampliar", 70 "menu.view.zoomIn" : "Ampliar",
68 "menu.view.zoomOut" : "reduzir", 71 "menu.view.zoomOut" : "Reduzir",
69 "menu.window" : "Janela", 72 "menu.window" : "Modo Janela",
70 "menu.window.close" : "Fechar", 73 "menu.window.close" : "Fechar",
71 "menu.window.minimize" : "Minimizar", 74 "menu.window.minimize" : "Minimizar",
72 "password.email.label" : "Endereço de e-mail", 75 "password.email.label" : "E-mail",
73 "password.headline" : "Trocar a senha", 76 "password.headline" : "Trocar senha",
74 "password.link.login" : "Fazer login na sua conta", 77 "password.link.login" : "Fazer login na sua conta",
75 "password.link.signup" : "Criar uma conta grátis", 78 "password.link.signup" : "Criar uma conta grátis",
76 "password.noUser" : "Nenhum usuário com este e-mail foi encontrado", 79 "password.noUser" : "Nenhum usuário com este e-mail foi encontrado",
77 "password.submit.label" : "Enviar", 80 "password.submit.label" : "Enviar",
78 "password.successInfo" : "Por favor, verifique o seu e-mail", 81 "password.successInfo" : "Por favor, verifique o seu e-mail",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Apoie o Franz", 83 "pricing.headline" : "Apoie o Franz",
80 "pricing.link.skipPayment" : "Eu não quero apoiar o desenvolvimento do Franz.", 84 "pricing.link.skipPayment" : "Eu não quero apoiar o desenvolvimento do Franz.",
81 "pricing.submit.label" : "Eu quero apoiar o desenvolvimento do Franz", 85 "pricing.submit.label" : "Eu quero apoiar o desenvolvimento do Franz",
82 "pricing.support.label" : "Selecione uma opção de apoio", 86 "pricing.support.label" : "Selecione uma opção de plano",
83 "service.crashHandler.action" : "Recarregar {name}", 87 "service.crashHandler.action" : "Recarregar {name}",
84 "service.crashHandler.autoReload" : "Tentando reestabelecer {name} automaticamente em {seconds} segundos", 88 "service.crashHandler.autoReload" : "Tentando reestabelecer {name} automaticamente em {seconds} segundos",
85 "service.crashHandler.headline" : "Ah, não!", 89 "service.crashHandler.headline" : "Ah, não!",
@@ -97,7 +101,7 @@
97 "settings.account.deleteInfo" : "Se você não precisa mais de sua conta Franz, pode exclui-la juntamente com todos os dados relacionados, aqui.", 101 "settings.account.deleteInfo" : "Se você não precisa mais de sua conta Franz, pode exclui-la juntamente com todos os dados relacionados, aqui.",
98 "settings.account.headline" : "Conta", 102 "settings.account.headline" : "Conta",
99 "settings.account.headlineAccount" : "Informações de conta", 103 "settings.account.headlineAccount" : "Informações de conta",
100 "settings.account.headlineDangerZone" : "Zona de perigo", 104 "settings.account.headlineDangerZone" : "Zona de Perigo",
101 "settings.account.headlineInvoices" : "Recibos", 105 "settings.account.headlineInvoices" : "Recibos",
102 "settings.account.headlinePassword" : "Mudar senha", 106 "settings.account.headlinePassword" : "Mudar senha",
103 "settings.account.headlineProfile" : "Atualizar perfil", 107 "settings.account.headlineProfile" : "Atualizar perfil",
@@ -116,16 +120,18 @@
116 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano", 120 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano",
117 "settings.app.form.autoLaunchOnStart" : "Abrir o Franz ao iniciar o sistema", 121 "settings.app.form.autoLaunchOnStart" : "Abrir o Franz ao iniciar o sistema",
118 "settings.app.form.beta" : "Incluir versões beta", 122 "settings.app.form.beta" : "Incluir versões beta",
119 "settings.app.form.enableGPUAcceleration" : "Ativar Aceleração de GPU (Unidade de Processamento Gráfico)", 123 "settings.app.form.darkMode" : "Join the Dark Side",
124 "settings.app.form.enableGPUAcceleration" : "Ativar Aceleração de GPU",
120 "settings.app.form.enableMenuBar" : "Mostrar Franz na Barra de Menu", 125 "settings.app.form.enableMenuBar" : "Mostrar Franz na Barra de Menu",
121 "settings.app.form.enableSpellchecking" : "Ativar correção ortográfica", 126 "settings.app.form.enableSpellchecking" : "Ativar correção ortográfica",
122 "settings.app.form.enableSystemTray" : "Exibir o Franz na área de notificações", 127 "settings.app.form.enableSystemTray" : "Exibir o Franz na barra de sistema",
123 "settings.app.form.hideDockIcon" : "Ocultar ícone do Franz no Dock", 128 "settings.app.form.hideDockIcon" : "Ocultar ícone do Franz no Dock",
124 "settings.app.form.language" : "Idioma", 129 "settings.app.form.language" : "Idioma",
125 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a área de notificações", 130 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a área de sistema",
126 "settings.app.form.runInBackground" : "Manter o Franz no fundo quando fechar a janela", 131 "settings.app.form.runInBackground" : "Manter o Franz no fundo quando fechar a janela",
127 "settings.app.form.showDisabledServices" : "Mostrar abas de serviços desativados", 132 "settings.app.form.showDisabledServices" : "Mostrar abas de serviços desativados",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostrar ícone de mensagem não lida quando as notificações estiverem desativadas", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Mostrar ícone de mensagem não lida quando as notificações estiverem desativadas",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Configurações", 135 "settings.app.headline" : "Configurações",
130 "settings.app.headlineAdvanced" : "Avançado", 136 "settings.app.headlineAdvanced" : "Avançado",
131 "settings.app.headlineAppearance" : "Aparência", 137 "settings.app.headlineAppearance" : "Aparência",
@@ -133,20 +139,20 @@
133 "settings.app.headlineLanguage" : "Idioma", 139 "settings.app.headlineLanguage" : "Idioma",
134 "settings.app.headlineUpdates" : "Atualizações", 140 "settings.app.headlineUpdates" : "Atualizações",
135 "settings.app.restartRequired" : "As atualizações exigem reiniciar o sistema", 141 "settings.app.restartRequired" : "As atualizações exigem reiniciar o sistema",
136 "settings.app.subheadlineCache" : "Cache", 142 "settings.app.subheadlineCache" : "Cachê",
137 "settings.app.translationHelp" : "Ajude-nos a traduzir o Franz para seu idioma.", 143 "settings.app.translationHelp" : "Ajude-nos a traduzir o Franz para seu idioma.",
138 "settings.app.updateStatusAvailable" : "Atualização disponível, baixando...", 144 "settings.app.updateStatusAvailable" : "Atualização disponível, baixando...",
139 "settings.app.updateStatusSearching" : "Buscando atualizações", 145 "settings.app.updateStatusSearching" : "Buscando atualizações",
140 "settings.app.updateStatusUpToDate" : "Você está usando a última versão do Franz", 146 "settings.app.updateStatusUpToDate" : "Você está usando a última versão do Franz",
141 "settings.invite.headline" : "Convidar amigos", 147 "settings.invite.headline" : "Convidar Amigos",
142 "settings.navigation.account" : "Conta", 148 "settings.navigation.account" : "Conta",
143 "settings.navigation.availableServices" : "Serviços disponíveis", 149 "settings.navigation.availableServices" : "Serviços disponíveis",
144 "settings.navigation.inviteFriends" : "Convidar amigos", 150 "settings.navigation.inviteFriends" : "Convidar Amigos",
145 "settings.navigation.logout" : "Sair", 151 "settings.navigation.logout" : "Sair",
146 "settings.navigation.settings" : "Ajustes", 152 "settings.navigation.settings" : "Ajustes",
147 "settings.navigation.yourServices" : "Seus serviços", 153 "settings.navigation.yourServices" : "Seus serviços",
148 "settings.recipes.all" : "Todos os serviços", 154 "settings.recipes.all" : "Todos os serviços",
149 "settings.recipes.dev" : "Desenvolvimento ", 155 "settings.recipes.dev" : "Desenvolvimento",
150 "settings.recipes.headline" : "Serviços disponíveis", 156 "settings.recipes.headline" : "Serviços disponíveis",
151 "settings.recipes.missingService" : "Sentiu falta de algum serviço?", 157 "settings.recipes.missingService" : "Sentiu falta de algum serviço?",
152 "settings.recipes.mostPopular" : "Mais populares", 158 "settings.recipes.mostPopular" : "Mais populares",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "Editar {name}", 172 "settings.service.form.editServiceHeadline" : "Editar {name}",
167 "settings.service.form.enableAudio" : "Ativar áudio", 173 "settings.service.form.enableAudio" : "Ativar áudio",
168 "settings.service.form.enableBadge" : "Mostrar aviso de mensagens não lidas", 174 "settings.service.form.enableBadge" : "Mostrar aviso de mensagens não lidas",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Ativar notificações", 176 "settings.service.form.enableNotification" : "Ativar notificações",
170 "settings.service.form.enableService" : "Ativar serviço", 177 "settings.service.form.enableService" : "Ativar serviço",
171 "settings.service.form.headlineBadges" : "Mensagens não lidas", 178 "settings.service.form.headlineBadges" : "Mensagens não lidas",
@@ -178,7 +185,13 @@
178 "settings.service.form.indirectMessages" : "Mostrar avisos para todas as mensagens", 185 "settings.service.form.indirectMessages" : "Mostrar avisos para todas as mensagens",
179 "settings.service.form.isMutedInfo" : "Quando desativado, as notificações sonoras e áudios ficarão em silêncio", 186 "settings.service.form.isMutedInfo" : "Quando desativado, as notificações sonoras e áudios ficarão em silêncio",
180 "settings.service.form.name" : "Nome", 187 "settings.service.form.name" : "Nome",
181 "settings.service.form.saveButton" : "Gravar serviço", 188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
194 "settings.service.form.saveButton" : "Salvar serviço",
182 "settings.service.form.tabHosted" : "Hospedado", 195 "settings.service.form.tabHosted" : "Hospedado",
183 "settings.service.form.tabOnPremise" : "Auto-hospedado â­ï¸", 196 "settings.service.form.tabOnPremise" : "Auto-hospedado â­ï¸",
184 "settings.service.form.team" : "Equipe", 197 "settings.service.form.team" : "Equipe",
@@ -212,18 +225,20 @@
212 "signup.headline" : "Cadastrar-se", 225 "signup.headline" : "Cadastrar-se",
213 "signup.lastname.label" : "Sobrenome", 226 "signup.lastname.label" : "Sobrenome",
214 "signup.legal.info" : "Ao criar uma conta Franz, você aceita os ", 227 "signup.legal.info" : "Ao criar uma conta Franz, você aceita os ",
215 "signup.legal.privacy" : "Declaração de privacidade", 228 "signup.legal.privacy" : "Declaração de Privacidade",
216 "signup.legal.terms" : "Termos de serviço", 229 "signup.legal.terms" : "Termos de serviço",
217 "signup.link.login" : "Já tem uma conta?", 230 "signup.link.login" : "Já tem uma conta?",
218 "signup.password.label" : "Senha", 231 "signup.password.label" : "Senha",
219 "signup.submit.label" : "Criar uma conta", 232 "signup.submit.label" : "Criar uma conta",
220 "subscription.euTaxInfo" : "Residentes na União Europeia: taxas locais serão aplicadas", 233 "subscription.euTaxInfo" : "Residentes na União Europeia: taxas locais serão aplicadas",
221 "subscription.features.ads" : "Sem anúncios, sempre!", 234 "subscription.features.ads" : "Sem anúncios, pra sempre!",
222 "subscription.features.comingSoon" : "em breve", 235 "subscription.features.comingSoon" : "em breve",
223 "subscription.features.customServices" : "Serviços privados para você e sua equipe",
224 "subscription.features.encryptedSync" : "Sincronização encriptada das sessões", 236 "subscription.features.encryptedSync" : "Sincronização encriptada das sessões",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Adicionar serviços locais\/hospedados como o HipChat", 238 "subscription.features.onpremise" : "Adicionar serviços locais\/hospedados como o HipChat",
226 "subscription.features.vpn" : "Suporte a proxy e VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "A conta Apoiador Franz Premium inclui", 242 "subscription.includedFeatures" : "A conta Apoiador Franz Premium inclui",
228 "subscription.paymentSessionError" : "Não foi possível abrir o formulário de pagamento", 243 "subscription.paymentSessionError" : "Não foi possível abrir o formulário de pagamento",
229 "subscription.submit.label" : "Eu quero apoiar o desenvolvimento do Franz", 244 "subscription.submit.label" : "Eu quero apoiar o desenvolvimento do Franz",
@@ -242,7 +257,7 @@
242 "tabs.item.enableService" : "Ativar serviço", 257 "tabs.item.enableService" : "Ativar serviço",
243 "tabs.item.reload" : "Recarregar", 258 "tabs.item.reload" : "Recarregar",
244 "validation.email" : "inválido", 259 "validation.email" : "inválido",
245 "validation.minLength" : "{campo} deve ser pelo menos {comprimento} mais caracteres ", 260 "validation.minLength" : "{campo} deve ter pelo menos {comprimento} mais caracteres ",
246 "validation.required" : "{campo} obrigatório", 261 "validation.required" : "{campo} obrigatório",
247 "validation.url" : "{campo} essa URL não é válida", 262 "validation.url" : "{campo} essa URL não é válida",
248 "welcome.loginButton" : "Entrar na sua conta", 263 "welcome.loginButton" : "Entrar na sua conta",
diff --git a/src/i18n/locales/pt.json b/src/i18n/locales/pt.json
index 44048e505..71978ed6b 100644
--- a/src/i18n/locales/pt.json
+++ b/src/i18n/locales/pt.json
@@ -1,32 +1,35 @@
1{ 1{
2 "global.api.unhealthy" : "Não foi possível conetar aos serviços do Franz", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "global.notConnectedToTheInternet" : "Não existe ligação à Internet.", 3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "global.api.unhealthy" : "Não foi possível estabelecer ligação aos serviços do Franz",
6 "global.notConnectedToTheInternet" : "Não existe ligação à Internet",
4 "import.headline" : "Importe os seus serviços do Franz 4", 7 "import.headline" : "Importe os seus serviços do Franz 4",
5 "import.notSupportedHeadline" : "Serviços ainda não são suportados pelo Franz 5", 8 "import.notSupportedHeadline" : "Serviços ainda não suportados pelo Franz 5",
6 "import.skip.label" : "Quero adicionar serviços manualmente", 9 "import.skip.label" : "Pretendo adicionar serviços manualmente",
7 "import.submit.label" : "Importar serviços", 10 "import.submit.label" : "Importar serviços",
8 "infobar.buttonChangelog" : "Novidades?", 11 "infobar.buttonChangelog" : "O que há de novo?",
9 "infobar.buttonInstallUpdate" : "Reiniciar & Instalar Atualizações", 12 "infobar.buttonInstallUpdate" : "Reiniciar e instalar atualizações",
10 "infobar.buttonReloadServices" : "Recarregar serviços", 13 "infobar.buttonReloadServices" : "Recarregar serviços",
11 "infobar.requiredRequestsFailed" : "Não foi possivel carregar os serviços e informações do utilizador", 14 "infobar.requiredRequestsFailed" : "Não foi possível carregar os serviços e informações do utilizador",
12 "infobar.servicesUpdated" : "Os seus serviços foram atualizados.", 15 "infobar.servicesUpdated" : "Os seus serviços foram atualizados.",
13 "infobar.updateAvailable" : "Está disponível uma atualização", 16 "infobar.updateAvailable" : "Está disponível uma nova atualização para o Franz",
14 "invite.email.label" : "Endereço de e-mail", 17 "invite.email.label" : "Endereço de e-mail",
15 "invite.headline.friends" : "Convide 3 amigos ou colegas", 18 "invite.headline.friends" : "Convide 3 amigos ou colegas",
16 "invite.name.label" : "Nome", 19 "invite.name.label" : "Nome",
17 "invite.skip.label" : "Quero fazer isto mais tarde", 20 "invite.skip.label" : "Pretendo fazer isto mais tarde",
18 "invite.submit.label" : "Enviar convites", 21 "invite.submit.label" : "Enviar convites",
19 "invite.successInfo" : "Convites enviados com sucesso", 22 "invite.successInfo" : "Convites enviados com sucesso",
20 "login.email.label" : "Endereço de e-mail", 23 "login.email.label" : "Endereço de e-mail",
21 "login.headline" : "Registar", 24 "login.headline" : "Iniciar Sessão",
22 "login.invalidCredentials" : "O email ou a palavra-passe estão incorretos", 25 "login.invalidCredentials" : "O email ou a palavra-passe estão incorrectos",
23 "login.link.password" : "Repor a minha palavra-passe", 26 "login.link.password" : "Repor a minha palavra-passe",
24 "login.link.signup" : "Criar uma conta gratuita", 27 "login.link.signup" : "Criar uma conta gratuita",
25 "login.password.label" : "Palavra-passe", 28 "login.password.label" : "Palavra-passe",
26 "login.serverLogout" : "A sua sessão expirou, inicie sessão novamente.", 29 "login.serverLogout" : "A sua sessão expirou, inicie sessão novamente.",
27 "login.submit.label" : "Iniciar sessão", 30 "login.submit.label" : "Iniciar sessão",
28 "login.tokenExpired" : "A sua sessão expirou, inicie sessão novamente.", 31 "login.tokenExpired" : "A sua sessão expirou, inicie sessão novamente.",
29 "menu.app.about" : "Sobre Franz", 32 "menu.app.about" : "Sobre o Franz",
30 "menu.app.hide" : "Ocultar", 33 "menu.app.hide" : "Ocultar",
31 "menu.app.hideOthers" : "Ocultar Outros", 34 "menu.app.hideOthers" : "Ocultar Outros",
32 "menu.app.quit" : "Sair", 35 "menu.app.quit" : "Sair",
@@ -36,51 +39,52 @@
36 "menu.edit.copy" : "Copiar", 39 "menu.edit.copy" : "Copiar",
37 "menu.edit.cut" : "Cortar", 40 "menu.edit.cut" : "Cortar",
38 "menu.edit.delete" : "Apagar", 41 "menu.edit.delete" : "Apagar",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "Emojis e Símbolos",
40 "menu.edit.paste" : "Paste", 43 "menu.edit.paste" : "Colar",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Colar e Manter Estilo",
42 "menu.edit.redo" : "Redo", 45 "menu.edit.redo" : "Refazer",
43 "menu.edit.selectAll" : "Select All", 46 "menu.edit.selectAll" : "Selecionar Tudo",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Voz",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "Começar a ditar",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "Comece a falar",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "Pare de Falar",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "Desfazer",
49 "menu.file" : "File", 52 "menu.file" : "Ficheiro",
50 "menu.help" : "Help", 53 "menu.help" : "Ajuda",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "Registo de alterações",
52 "menu.help.learnMore" : "Learn More", 55 "menu.help.learnMore" : "Saber mais",
53 "menu.help.privacy" : "Declaração de privacidade", 56 "menu.help.privacy" : "Declaração de privacidade",
54 "menu.help.support" : "Support", 57 "menu.help.support" : "Suporte",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "Termos do Serviço",
56 "menu.services" : "Services", 59 "menu.services" : "Serviços",
57 "menu.services.addNewService" : "Add New Service...", 60 "menu.services.addNewService" : "Adicionar Novo Serviço...",
58 "menu.view" : "View", 61 "menu.view" : "Ver",
59 "menu.view.enterFullScreen" : "Enter Full Screen", 62 "menu.view.enterFullScreen" : "Ativar Modo de Ecrã Completo",
60 "menu.view.exitFullScreen" : "Exit Full Screen", 63 "menu.view.exitFullScreen" : "Sair do Modo de Ecrã Completo",
61 "menu.view.reloadFranz" : "Reload Franz", 64 "menu.view.reloadFranz" : "Recarregar Franz",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "Recarregar serviço",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "Tamanho Real",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Activar\/Desativar Ferramentas de Desenvolvimento",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "Ativar\/Desativar Ecrã Completo",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Ativar\/Desativar Ferramentas de Desenvolvimento de Serviços",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "Aumentar",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "Reduzir",
69 "menu.window" : "Window", 72 "menu.window" : "Janela",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "Fechar",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "Minimizar",
72 "password.email.label" : "Endereço de e-mail", 75 "password.email.label" : "Endereço de e-mail",
73 "password.headline" : "Repor a minha palavra-passe", 76 "password.headline" : "Repor a minha palavra-passe",
74 "password.link.login" : "Iniciar sessão", 77 "password.link.login" : "Iniciar sessão",
75 "password.link.signup" : "Criar uma conta gratuita", 78 "password.link.signup" : "Criar uma conta gratuita",
76 "password.noUser" : "Não existe nenhuma conta associada a esse email", 79 "password.noUser" : "Não existe nenhuma conta associada a esse endereço de e-mail",
77 "password.submit.label" : "Submeter", 80 "password.submit.label" : "Submeter",
78 "password.successInfo" : "Por favor reveja o seu email", 81 "password.successInfo" : "Por favor verifique o seu endereço de e-mail",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Apoie o Franz", 83 "pricing.headline" : "Apoie o Franz",
80 "pricing.link.skipPayment" : "Não pretendo ajudar no desenvolvimento do Franz", 84 "pricing.link.skipPayment" : "Não pretendo patrocinar o desenvolvimento do Franz",
81 "pricing.submit.label" : "Pretendo ajudar no desenvolvimento do Franz", 85 "pricing.submit.label" : "Pretendo patrocinar o desenvolvimento do Franz",
82 "pricing.support.label" : "Selecione o seu plano", 86 "pricing.support.label" : "Selecione o seu plano",
83 "service.crashHandler.action" : "Recarregar", 87 "service.crashHandler.action" : "Recarregar {name}",
84 "service.crashHandler.autoReload" : "A tentar restaurar automaticamente {name} em {seconds} segundos", 88 "service.crashHandler.autoReload" : "A tentar restaurar automaticamente {name} em {seconds} segundos",
85 "service.crashHandler.headline" : "Oh não!", 89 "service.crashHandler.headline" : "Oh não!",
86 "service.crashHandler.text" : "{name} causou um erro.", 90 "service.crashHandler.text" : "{name} causou um erro.",
@@ -94,7 +98,7 @@
94 "settings.account.buttonSave" : "Atualizar o perfil", 98 "settings.account.buttonSave" : "Atualizar o perfil",
95 "settings.account.deleteAccount" : "Apagar conta", 99 "settings.account.deleteAccount" : "Apagar conta",
96 "settings.account.deleteEmailSent" : "Recebeu um email com um endereço para confirmar a remoção da sua conta. A sua conta e dados não poderão ser restaurados!", 100 "settings.account.deleteEmailSent" : "Recebeu um email com um endereço para confirmar a remoção da sua conta. A sua conta e dados não poderão ser restaurados!",
97 "settings.account.deleteInfo" : "Se não necessita mais da sua conta Franz, pode apagar a sua conta e dados aqui.", 101 "settings.account.deleteInfo" : "Se já não necessita da sua conta Franz, pode apagar a sua conta e todos os dados aqui.",
98 "settings.account.headline" : "Conta", 102 "settings.account.headline" : "Conta",
99 "settings.account.headlineAccount" : "Informação da conta", 103 "settings.account.headlineAccount" : "Informação da conta",
100 "settings.account.headlineDangerZone" : "Zona de perigo", 104 "settings.account.headlineDangerZone" : "Zona de perigo",
@@ -105,38 +109,40 @@
105 "settings.account.headlineUpgrade" : "Atualize a sua conta e ajude o Franz", 109 "settings.account.headlineUpgrade" : "Atualize a sua conta e ajude o Franz",
106 "settings.account.invoiceDownload" : "Transferir", 110 "settings.account.invoiceDownload" : "Transferir",
107 "settings.account.manageSubscription.label" : "Gerir as minhas subscrições", 111 "settings.account.manageSubscription.label" : "Gerir as minhas subscrições",
108 "settings.account.successInfo" : "As suas mudanças foram efetuadas com sucesso", 112 "settings.account.successInfo" : "As suas alterações foram efetuadas com sucesso",
109 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente", 113 "settings.account.tryReloadUserInfoRequest" : "Tentar novamente",
110 "settings.account.userInfoRequestFailed" : "Não é possível carregar a informação do utilizador", 114 "settings.account.userInfoRequestFailed" : "Não é possível carregar a informação do utilizador",
111 "settings.app.buttonClearAllCache" : "Limpar cache", 115 "settings.app.buttonClearAllCache" : "Limpar cache",
112 "settings.app.buttonInstallUpdate" : "Reiniciar & Instalar Atualizações", 116 "settings.app.buttonInstallUpdate" : "Reiniciar & instalar atualização",
113 "settings.app.buttonSearchForUpdate" : "Procurar por atualizações", 117 "settings.app.buttonSearchForUpdate" : "Procurar atualizações",
114 "settings.app.cacheInfo" : "A cache do Franz está a usar {size} do espaço em disco.", 118 "settings.app.cacheInfo" : "A cache do Franz está a usar {size} de espaço em disco.",
115 "settings.app.currentVersion" : "Versão atual", 119 "settings.app.currentVersion" : "Versão atual",
116 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano", 120 "settings.app.form.autoLaunchInBackground" : "Abrir em segundo plano",
117 "settings.app.form.autoLaunchOnStart" : "Iniciar o Franz com o início de sessão", 121 "settings.app.form.autoLaunchOnStart" : "Iniciar o Franz após iniciar o computador",
118 "settings.app.form.beta" : "Incluir versões instáveis (beta)", 122 "settings.app.form.beta" : "Incluir versões instáveis (beta)",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
124 "settings.app.form.enableGPUAcceleration" : "Activar Aceleração de GPU",
120 "settings.app.form.enableMenuBar" : "Mostrar Franz na Barra de Menu", 125 "settings.app.form.enableMenuBar" : "Mostrar Franz na Barra de Menu",
121 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica", 126 "settings.app.form.enableSpellchecking" : "Ativar verificação ortográfica",
122 "settings.app.form.enableSystemTray" : "Mostrar o Franz na barra do sistema", 127 "settings.app.form.enableSystemTray" : "Mostrar o Franz na barra do sistema",
123 "settings.app.form.hideDockIcon" : "Esconder ícone na Dock", 128 "settings.app.form.hideDockIcon" : "Esconder ícone na Dock",
124 "settings.app.form.language" : "Idioma:", 129 "settings.app.form.language" : "Idioma",
125 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a barra do sistema", 130 "settings.app.form.minimizeToSystemTray" : "Minimizar o Franz para a barra do sistema",
126 "settings.app.form.runInBackground" : "Manter o Franz em segundo plano ao fechar a janela", 131 "settings.app.form.runInBackground" : "Manter o Franz em segundo plano ao fechar a janela",
127 "settings.app.form.showDisabledServices" : "Apresentar separadores de serviços desativados", 132 "settings.app.form.showDisabledServices" : "Apresentar separadores de serviços desativados",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Apresentar emblema com o número de mensagens não lidas quando as notificações estão desactivadas", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Apresentar emblema com o número de mensagens não lidas quando as notificações estão desativadas",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Definições", 135 "settings.app.headline" : "Definições",
130 "settings.app.headlineAdvanced" : "Avançado", 136 "settings.app.headlineAdvanced" : "Avançado",
131 "settings.app.headlineAppearance" : "Aparência", 137 "settings.app.headlineAppearance" : "Aparência",
132 "settings.app.headlineGeneral" : "Geral", 138 "settings.app.headlineGeneral" : "Geral",
133 "settings.app.headlineLanguage" : "Idioma:", 139 "settings.app.headlineLanguage" : "Idioma",
134 "settings.app.headlineUpdates" : "Atualizações", 140 "settings.app.headlineUpdates" : "Atualizações",
135 "settings.app.restartRequired" : "Alterações requerem reinício", 141 "settings.app.restartRequired" : "Alterações requerem reinício",
136 "settings.app.subheadlineCache" : "Cache", 142 "settings.app.subheadlineCache" : "Cache",
137 "settings.app.translationHelp" : "Ajude-nos a traduzir a Franz para a sua língua.", 143 "settings.app.translationHelp" : "Ajude-nos a traduzir a Franz para a sua língua.",
138 "settings.app.updateStatusAvailable" : "Atualização disponivel, a transferir...", 144 "settings.app.updateStatusAvailable" : "Atualização disponivel, a transferir...",
139 "settings.app.updateStatusSearching" : "Procurando por atualizações", 145 "settings.app.updateStatusSearching" : "A procurar atualizações",
140 "settings.app.updateStatusUpToDate" : "Está a usar a versão mais recente do Franz", 146 "settings.app.updateStatusUpToDate" : "Está a usar a versão mais recente do Franz",
141 "settings.invite.headline" : "Convide amigos", 147 "settings.invite.headline" : "Convide amigos",
142 "settings.navigation.account" : "Conta", 148 "settings.navigation.account" : "Conta",
@@ -148,9 +154,9 @@
148 "settings.recipes.all" : "Todos os serviços", 154 "settings.recipes.all" : "Todos os serviços",
149 "settings.recipes.dev" : "Desenvolvimento", 155 "settings.recipes.dev" : "Desenvolvimento",
150 "settings.recipes.headline" : "Serviços disponíveis", 156 "settings.recipes.headline" : "Serviços disponíveis",
151 "settings.recipes.missingService" : "A faltar um serviço?", 157 "settings.recipes.missingService" : "Falta um serviço?",
152 "settings.recipes.mostPopular" : "Os mais populares", 158 "settings.recipes.mostPopular" : "Os mais populares",
153 "settings.recipes.nothingFound" : "Lamentamos, mas não existe nenhum serviço corresponde ao pesquisado.", 159 "settings.recipes.nothingFound" : "Lamentamos, nenhum serviço corresponde ao pesquisado.",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "Serviço adicionado", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "Serviço adicionado",
155 "settings.searchService" : "Pesquisa de serviço", 161 "settings.searchService" : "Pesquisa de serviço",
156 "settings.service.error.goBack" : "Voltar aos serviços", 162 "settings.service.error.goBack" : "Voltar aos serviços",
@@ -159,25 +165,32 @@
159 "settings.service.form.addServiceHeadline" : "Adicionar {name}", 165 "settings.service.form.addServiceHeadline" : "Adicionar {name}",
160 "settings.service.form.availableServices" : "Serviços disponíveis", 166 "settings.service.form.availableServices" : "Serviços disponíveis",
161 "settings.service.form.customUrl" : "Servidor personalizado", 167 "settings.service.form.customUrl" : "Servidor personalizado",
162 "settings.service.form.customUrlPremiumInfo" : "Para adicionar serviços com domínio próprio, é necessário uma Conta Premium.", 168 "settings.service.form.customUrlPremiumInfo" : "Para adicionar serviços com domínio próprio, é necessário uma Conta Premium no Franz.",
163 "settings.service.form.customUrlUpgradeAccount" : "Atualizar a conta", 169 "settings.service.form.customUrlUpgradeAccount" : "Atualizar a conta",
164 "settings.service.form.customUrlValidationError" : "Não foi possível validar o servidor {nome}.", 170 "settings.service.form.customUrlValidationError" : "Não foi possível validar o servidor {nome}.",
165 "settings.service.form.deleteButton" : "Apagar serviço", 171 "settings.service.form.deleteButton" : "Apagar serviço",
166 "settings.service.form.editServiceHeadline" : "Editar {name}", 172 "settings.service.form.editServiceHeadline" : "Editar {name}",
167 "settings.service.form.enableAudio" : "Ativar áudio", 173 "settings.service.form.enableAudio" : "Ativar áudio",
168 "settings.service.form.enableBadge" : "Mostrar emblema de mensagens não vistas", 174 "settings.service.form.enableBadge" : "Mostrar emblemas de mensagens não lidas",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Ativar notificações", 176 "settings.service.form.enableNotification" : "Ativar notificações",
170 "settings.service.form.enableService" : "Ativar serviço", 177 "settings.service.form.enableService" : "Ativar serviço",
171 "settings.service.form.headlineBadges" : "Emblema de mensagem não vista", 178 "settings.service.form.headlineBadges" : "Emblema de mensagem não lida",
172 "settings.service.form.headlineGeneral" : "Geral", 179 "settings.service.form.headlineGeneral" : "Geral",
173 "settings.service.form.headlineNotifications" : "Notificações", 180 "settings.service.form.headlineNotifications" : "Notificações",
174 "settings.service.form.icon" : "Personalizar ícone", 181 "settings.service.form.icon" : "Personalizar ícone",
175 "settings.service.form.iconDelete" : "Apagar", 182 "settings.service.form.iconDelete" : "Apagar",
176 "settings.service.form.iconUpload" : "Arraste a sua imagem, ou clique aqui", 183 "settings.service.form.iconUpload" : "Arraste a sua imagem, ou clique aqui",
177 "settings.service.form.indirectMessageInfo" : "Será notificado sobre todas as novas mensagens de um canal, não apenas @username, @channel, @here, ...", 184 "settings.service.form.indirectMessageInfo" : "Será notificado sobre todas as novas mensagens num canal, não apenas @username, @channel, @here, ...",
178 "settings.service.form.indirectMessages" : "Mostrar o emblema da mensagem para todas as novas mensagens", 185 "settings.service.form.indirectMessages" : "Mostrar o emblema da mensagem para todas as novas mensagens",
179 "settings.service.form.isMutedInfo" : "Quando desativado, todas as notificações de áudio serão silenciadas", 186 "settings.service.form.isMutedInfo" : "Quando desativado, todos sons e reproduções de áudio serão silenciados",
180 "settings.service.form.name" : "Nome", 187 "settings.service.form.name" : "Nome",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Guardar serviço", 194 "settings.service.form.saveButton" : "Guardar serviço",
182 "settings.service.form.tabHosted" : "Com domínio", 195 "settings.service.form.tabHosted" : "Com domínio",
183 "settings.service.form.tabOnPremise" : "Com domínio próprio â­ï¸", 196 "settings.service.form.tabOnPremise" : "Com domínio próprio â­ï¸",
@@ -187,7 +200,7 @@
187 "settings.services.deletedInfo" : "O serviço foi apagado", 200 "settings.services.deletedInfo" : "O serviço foi apagado",
188 "settings.services.discoverServices" : "Descobrir serviços", 201 "settings.services.discoverServices" : "Descobrir serviços",
189 "settings.services.headline" : "Os seus serviços", 202 "settings.services.headline" : "Os seus serviços",
190 "settings.services.noServicesAdded" : "Ainda não adicionou nenhum serviço.", 203 "settings.services.noServicesAdded" : "Ainda não adicionou um serviço.",
191 "settings.services.tooltip.isDisabled" : "O serviço está desativado", 204 "settings.services.tooltip.isDisabled" : "O serviço está desativado",
192 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados", 205 "settings.services.tooltip.isMuted" : "Todos os sons estão silenciados",
193 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desativadas", 206 "settings.services.tooltip.notificationsDisabled" : "As notificações estão desativadas",
@@ -206,28 +219,30 @@
206 "sidebar.settings" : "Definições", 219 "sidebar.settings" : "Definições",
207 "sidebar.unmuteApp" : "Ativar notificações e áudio", 220 "sidebar.unmuteApp" : "Ativar notificações e áudio",
208 "signup.company.label" : "Empresa", 221 "signup.company.label" : "Empresa",
209 "signup.email.label" : "Endereço de e-mail", 222 "signup.email.label" : "Endereço de email",
210 "signup.emailDuplicate" : "Já existe uma conta associada a este endereço", 223 "signup.emailDuplicate" : "Já existe uma conta associada a este endereço de email",
211 "signup.firstname.label" : "Primeiro Nome", 224 "signup.firstname.label" : "Primeiro Nome",
212 "signup.headline" : "Criar conta", 225 "signup.headline" : "Criar conta",
213 "signup.lastname.label" : "Último Nome", 226 "signup.lastname.label" : "Último Nome",
214 "signup.legal.info" : "Ao criar uma conta Franz, aceita", 227 "signup.legal.info" : "Ao criar uma conta Franz, aceita",
215 "signup.legal.privacy" : "Declaração de privacidade", 228 "signup.legal.privacy" : "Declaração de Privacidade",
216 "signup.legal.terms" : "Termos de Serviço", 229 "signup.legal.terms" : "Termos do Serviço",
217 "signup.link.login" : "Já tem conta, iniciar sessão?", 230 "signup.link.login" : "Já tem uma conta, iniciar sessão?",
218 "signup.password.label" : "Palavra-passe", 231 "signup.password.label" : "Palavra-passe",
219 "signup.submit.label" : "Criar uma conta", 232 "signup.submit.label" : "Criar uma conta",
220 "subscription.euTaxInfo" : "Residentes EU: Taxas locais podem ser aplicadas", 233 "subscription.euTaxInfo" : "Residentes EU: Taxas locais podem ser aplicadas",
221 "subscription.features.ads" : "Sem anúncios, para sempre!", 234 "subscription.features.ads" : "Sem anúncios, para sempre!",
222 "subscription.features.comingSoon" : "Em breve!", 235 "subscription.features.comingSoon" : "em breve",
223 "subscription.features.customServices" : "Serviços privados para si e para a sua equipa", 236 "subscription.features.encryptedSync" : "Sincronização encriptada de sessão",
224 "subscription.features.encryptedSync" : "Sincronização encriptada de serviços", 237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Adicionar serviços 'on-premise'\/hosted como o HipChat", 238 "subscription.features.onpremise" : "Adicionar serviços 'on-premise'\/hosted como o HipChat",
226 "subscription.features.vpn" : "Suporte para proxy\/VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Ao subscrever uma Conta Premium, tem acesso a", 242 "subscription.includedFeatures" : "Ao subscrever uma Conta Premium, tem acesso a",
228 "subscription.paymentSessionError" : "Erro no serviço de pagamento", 243 "subscription.paymentSessionError" : "Erro no serviço de pagamento",
229 "subscription.submit.label" : "Pretendo ajudar o desenvolvimento do Franz", 244 "subscription.submit.label" : "Pretendo ajudar o desenvolvimento do Franz",
230 "subscription.type.free" : "Gratuito", 245 "subscription.type.free" : "gratuito",
231 "subscription.type.month" : "mês", 246 "subscription.type.month" : "mês",
232 "subscription.type.year" : "ano", 247 "subscription.type.year" : "ano",
233 "subscriptionPopup.buttonCancel" : "Cancelar", 248 "subscriptionPopup.buttonCancel" : "Cancelar",
@@ -241,11 +256,11 @@
241 "tabs.item.enableNotification" : "Ativar notificações", 256 "tabs.item.enableNotification" : "Ativar notificações",
242 "tabs.item.enableService" : "Ativar serviço", 257 "tabs.item.enableService" : "Ativar serviço",
243 "tabs.item.reload" : "Recarregar", 258 "tabs.item.reload" : "Recarregar",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{field} não é válido",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "{field} deveria ter pelo menos {comprimento} caracteres",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{field} é obrigatório",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field} não é uma hiperligação válida",
248 "welcome.loginButton" : "Iniciar sessão", 263 "welcome.loginButton" : "Iniciar sessão",
249 "welcome.signupButton" : "Criar uma conta gratuita", 264 "welcome.signupButton" : "Criar uma conta gratuita",
250 "welcome.slogan" : "Messaging that works for you" 265 "welcome.slogan" : "Sistema de mensagens feito para si"
251} 266}
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index ecebc46ee..78030dc15 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -1,25 +1,28 @@
1{ 1{
2 "global.api.unhealthy" : "Ðевозможно подключитьÑÑ Ðº ÑервиÑам Franz", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "global.notConnectedToTheInternet" : "Ðет Интернет-ÑоединениÑ", 3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "import.headline" : "Импортировать ÑервиÑÑ‹ из Franz 4", 4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "import.notSupportedHeadline" : "СервиÑÑ‹ ещё не поддерживаютÑÑ Ð² Franz 5", 5 "global.api.unhealthy" : "Ðевозможно подключитьÑÑ Ðº онлайн-ÑервиÑам Franz",
6 "import.skip.label" : "Я хочу добавить ÑÐµÑ€Ð²Ð¸Ñ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ", 6 "global.notConnectedToTheInternet" : "Ð’Ñ‹ не подключены к Ñети Интернет",
7 "import.headline" : "Импортировать ваши ÑервиÑÑ‹ из Franz 4",
8 "import.notSupportedHeadline" : "СервиÑÑ‹ пока ещё не поддерживаютÑÑ Ð² Franz 5",
9 "import.skip.label" : "Я хочу добавить ÑервиÑÑ‹ вручную",
7 "import.submit.label" : "Импортировать ÑервиÑÑ‹", 10 "import.submit.label" : "Импортировать ÑервиÑÑ‹",
8 "infobar.buttonChangelog" : "Что новенького?", 11 "infobar.buttonChangelog" : "Что новенького?",
9 "infobar.buttonInstallUpdate" : "ПерезапуÑтить и обновить", 12 "infobar.buttonInstallUpdate" : "ПерезапуÑтить и уÑтановить обновлениÑ",
10 "infobar.buttonReloadServices" : "Перезагрузить ÑервиÑÑ‹", 13 "infobar.buttonReloadServices" : "Перезагрузить ÑервиÑÑ‹",
11 "infobar.requiredRequestsFailed" : "Ðевозможно загрузить ÑервиÑÑ‹ и информацию пользователÑ", 14 "infobar.requiredRequestsFailed" : "Ðевозможно загрузить ÑервиÑÑ‹ и информацию пользователÑ",
12 "infobar.servicesUpdated" : "Ваши ÑервиÑÑ‹ были обновлены.", 15 "infobar.servicesUpdated" : "Ваши ÑервиÑÑ‹ были обновлены.",
13 "infobar.updateAvailable" : "ДоÑтупно обновление Franz.", 16 "infobar.updateAvailable" : "ДоÑтупно обновление Franz.",
14 "invite.email.label" : "Email адреÑ", 17 "invite.email.label" : "ÐÐ´Ñ€ÐµÑ Ñлектронной почты",
15 "invite.headline.friends" : "ПриглаÑите 3-Ñ… друзей или коллег", 18 "invite.headline.friends" : "ПриглаÑите 3-Ñ… друзей или коллег",
16 "invite.name.label" : "ИмÑ", 19 "invite.name.label" : "ИмÑ",
17 "invite.skip.label" : "Я Ñделаю Ñто позже", 20 "invite.skip.label" : "Я Ñделаю Ñто позже",
18 "invite.submit.label" : "Ð’Ñ‹Ñлать приглашениÑ", 21 "invite.submit.label" : "Ð’Ñ‹Ñлать приглашениÑ",
19 "invite.successInfo" : "ÐŸÑ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ ÑƒÑпешно отправлены", 22 "invite.successInfo" : "ÐŸÑ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ ÑƒÑпешно отправлены",
20 "login.email.label" : "Email", 23 "login.email.label" : "ÐÐ´Ñ€ÐµÑ Ñлектронной почты",
21 "login.headline" : "Вход", 24 "login.headline" : "Вход",
22 "login.invalidCredentials" : "Ðеправильный email или пароль", 25 "login.invalidCredentials" : "Ðеправильный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты или пароль",
23 "login.link.password" : "ВоÑÑтановить пароль", 26 "login.link.password" : "ВоÑÑтановить пароль",
24 "login.link.signup" : "Создать беÑплатный аккаунт", 27 "login.link.signup" : "Создать беÑплатный аккаунт",
25 "login.password.label" : "Пароль", 28 "login.password.label" : "Пароль",
@@ -32,19 +35,19 @@
32 "menu.app.quit" : "Выйти", 35 "menu.app.quit" : "Выйти",
33 "menu.app.settings" : "ÐаÑтройки", 36 "menu.app.settings" : "ÐаÑтройки",
34 "menu.app.unhide" : "Показать", 37 "menu.app.unhide" : "Показать",
35 "menu.edit" : "Редактировать", 38 "menu.edit" : "Правка",
36 "menu.edit.copy" : "Копировать", 39 "menu.edit.copy" : "Копировать",
37 "menu.edit.cut" : "Вырезать", 40 "menu.edit.cut" : "Вырезать",
38 "menu.edit.delete" : "Удалить", 41 "menu.edit.delete" : "Удалить",
39 "menu.edit.emojiSymbols" : "Эмодзи и Ñимволы", 42 "menu.edit.emojiSymbols" : "Эмодзи и Ñимволы",
40 "menu.edit.paste" : "Ð’Ñтавить", 43 "menu.edit.paste" : "Ð’Ñтавить",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Ð’Ñтавить Ñ Ñоблюдением ÑтилÑ",
42 "menu.edit.redo" : "Вернуть", 45 "menu.edit.redo" : "Вернуть",
43 "menu.edit.selectAll" : "Выделить вÑÑ‘", 46 "menu.edit.selectAll" : "Выделить вÑÑ‘",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Речь",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "Ðачать диктовать",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "Ðачать говорить",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "Закончить говорить",
48 "menu.edit.undo" : "Отменить", 51 "menu.edit.undo" : "Отменить",
49 "menu.file" : "Файл", 52 "menu.file" : "Файл",
50 "menu.help" : "Справка", 53 "menu.help" : "Справка",
@@ -53,33 +56,34 @@
53 "menu.help.privacy" : "Политика конфиденциальноÑти", 56 "menu.help.privacy" : "Политика конфиденциальноÑти",
54 "menu.help.support" : "Поддержка", 57 "menu.help.support" : "Поддержка",
55 "menu.help.tos" : "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑпользованиÑ", 58 "menu.help.tos" : "УÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑпользованиÑ",
56 "menu.services" : "Services", 59 "menu.services" : "Службы",
57 "menu.services.addNewService" : "Добавить ÑервиÑ...", 60 "menu.services.addNewService" : "Добавить новый ÑервиÑ...",
58 "menu.view" : "Вид", 61 "menu.view" : "Вид",
59 "menu.view.enterFullScreen" : "Ðа веÑÑŒ Ñкран", 62 "menu.view.enterFullScreen" : "Ðа веÑÑŒ Ñкран",
60 "menu.view.exitFullScreen" : "В окне", 63 "menu.view.exitFullScreen" : "В окне",
61 "menu.view.reloadFranz" : "Перезагрузить Franz", 64 "menu.view.reloadFranz" : "Перезагрузить Franz",
62 "menu.view.reloadService" : "ПерезапуÑтить ÑервиÑ", 65 "menu.view.reloadService" : "ПерезапуÑтить ÑервиÑ",
63 "menu.view.resetZoom" : "ФактичеÑкий размер", 66 "menu.view.resetZoom" : "ФактичеÑкий размер",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Показать инÑтрументы разработчика",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "ПереключитьÑÑ Ð½Ð° полный Ñкран",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Показать инÑтрументы разработчика ÑервиÑа",
67 "menu.view.zoomIn" : "Увеличить маÑштаб", 70 "menu.view.zoomIn" : "Увеличить маÑштаб",
68 "menu.view.zoomOut" : "Уменьшить маÑштаб", 71 "menu.view.zoomOut" : "Уменьшить маÑштаб",
69 "menu.window" : "Окно", 72 "menu.window" : "Окно",
70 "menu.window.close" : "Закрыть", 73 "menu.window.close" : "Закрыть",
71 "menu.window.minimize" : "Свернуть", 74 "menu.window.minimize" : "Свернуть",
72 "password.email.label" : "Email адреÑ", 75 "password.email.label" : "ÐÐ´Ñ€ÐµÑ Ñлектронной почты",
73 "password.headline" : "СброÑить пароль", 76 "password.headline" : "СброÑить пароль",
74 "password.link.login" : "Вход", 77 "password.link.login" : "Вход",
75 "password.link.signup" : "Создать учётную запиÑÑŒ пользователÑ", 78 "password.link.signup" : "Создать беÑплатную учётную запиÑÑŒ пользователÑ",
76 "password.noUser" : "Ðе найдено Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ email", 79 "password.noUser" : "Ðе найдено Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ адреÑом Ñлектронной почты",
77 "password.submit.label" : "ПринÑÑ‚ÑŒ", 80 "password.submit.label" : "ПринÑÑ‚ÑŒ",
78 "password.successInfo" : "Проверьте Вашу Ñлектронную почту", 81 "password.successInfo" : "Проверьте вашу Ñлектронную почту",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Поддержать Franz", 83 "pricing.headline" : "Поддержать Franz",
80 "pricing.link.skipPayment" : "Я не хочу поддерживать разработку Franz.", 84 "pricing.link.skipPayment" : "Я не хочу поддерживать разработку Franz.",
81 "pricing.submit.label" : "Я хочу поддержать разработку Franz", 85 "pricing.submit.label" : "Я хочу поддержать разработку Franz",
82 "pricing.support.label" : "Выберите план поддержки", 86 "pricing.support.label" : "Выберите ваш план поддержки",
83 "service.crashHandler.action" : "Перезагрузить {name}", 87 "service.crashHandler.action" : "Перезагрузить {name}",
84 "service.crashHandler.autoReload" : "ПытаюÑÑŒ автоматичеÑки воÑÑтановить {name} в течение {seconds} Ñекунд", 88 "service.crashHandler.autoReload" : "ПытаюÑÑŒ автоматичеÑки воÑÑтановить {name} в течение {seconds} Ñекунд",
85 "service.crashHandler.headline" : "О, нет!", 89 "service.crashHandler.headline" : "О, нет!",
@@ -104,8 +108,8 @@
104 "settings.account.headlineSubscription" : "Ваша подпиÑка", 108 "settings.account.headlineSubscription" : "Ваша подпиÑка",
105 "settings.account.headlineUpgrade" : "Улучшить аккаунт и поддержать Franz", 109 "settings.account.headlineUpgrade" : "Улучшить аккаунт и поддержать Franz",
106 "settings.account.invoiceDownload" : "Скачать", 110 "settings.account.invoiceDownload" : "Скачать",
107 "settings.account.manageSubscription.label" : "Управление подпиÑкой", 111 "settings.account.manageSubscription.label" : "Управление вашей подпиÑкой",
108 "settings.account.successInfo" : "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñохранены", 112 "settings.account.successInfo" : "Ðаши Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ Ñохранены",
109 "settings.account.tryReloadUserInfoRequest" : "Попробовать Ñнова", 113 "settings.account.tryReloadUserInfoRequest" : "Попробовать Ñнова",
110 "settings.account.userInfoRequestFailed" : "Ðевозможно загрузить информацию пользователÑ", 114 "settings.account.userInfoRequestFailed" : "Ðевозможно загрузить информацию пользователÑ",
111 "settings.app.buttonClearAllCache" : "ОчиÑтить кÑш", 115 "settings.app.buttonClearAllCache" : "ОчиÑтить кÑш",
@@ -116,16 +120,18 @@
116 "settings.app.form.autoLaunchInBackground" : "Открывать в фоне", 120 "settings.app.form.autoLaunchInBackground" : "Открывать в фоне",
117 "settings.app.form.autoLaunchOnStart" : "ЗапуÑкать Franz при Ñтарте", 121 "settings.app.form.autoLaunchOnStart" : "ЗапуÑкать Franz при Ñтарте",
118 "settings.app.form.beta" : "Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð±ÐµÑ‚Ð° верÑии", 122 "settings.app.form.beta" : "Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð±ÐµÑ‚Ð° верÑии",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
120 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 124 "settings.app.form.enableGPUAcceleration" : "Включить уÑкорение GPU",
125 "settings.app.form.enableMenuBar" : "Показывать Franz на панели меню",
121 "settings.app.form.enableSpellchecking" : "Включить проверку правопиÑаниÑ", 126 "settings.app.form.enableSpellchecking" : "Включить проверку правопиÑаниÑ",
122 "settings.app.form.enableSystemTray" : "Показывать Franz в ÑиÑтемном трее", 127 "settings.app.form.enableSystemTray" : "Показывать Franz в ÑиÑтемном трее",
123 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 128 "settings.app.form.hideDockIcon" : "СпрÑтать иконку Franz на панели",
124 "settings.app.form.language" : "Язык", 129 "settings.app.form.language" : "Язык",
125 "settings.app.form.minimizeToSystemTray" : "Сворачивать Franz в ÑиÑтемный трей", 130 "settings.app.form.minimizeToSystemTray" : "Сворачивать Franz в ÑиÑтемный трей",
126 "settings.app.form.runInBackground" : "ОÑтавлÑÑ‚ÑŒ Franz в фоне при закрытии окна", 131 "settings.app.form.runInBackground" : "ОÑтавлÑÑ‚ÑŒ Franz в фоне при закрытии окна",
127 "settings.app.form.showDisabledServices" : "Показывать вкладки отключённых Ñлужб", 132 "settings.app.form.showDisabledServices" : "Показывать вкладки отключённых Ñлужб",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Показывать значок непрочитанного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ отключённых уведомлениÑÑ…", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Показывать значок непрочитанного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ отключённых уведомлениÑÑ…",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "ÐаÑтройки", 135 "settings.app.headline" : "ÐаÑтройки",
130 "settings.app.headlineAdvanced" : "Дополнительно", 136 "settings.app.headlineAdvanced" : "Дополнительно",
131 "settings.app.headlineAppearance" : "Внешний вид", 137 "settings.app.headlineAppearance" : "Внешний вид",
@@ -148,43 +154,50 @@
148 "settings.recipes.all" : "Ð’Ñе ÑервиÑÑ‹", 154 "settings.recipes.all" : "Ð’Ñе ÑервиÑÑ‹",
149 "settings.recipes.dev" : "Разработка", 155 "settings.recipes.dev" : "Разработка",
150 "settings.recipes.headline" : "ДоÑтупные ÑервиÑÑ‹", 156 "settings.recipes.headline" : "ДоÑтупные ÑервиÑÑ‹",
151 "settings.recipes.missingService" : "Ðе можете найти ÑлуÐбу?", 157 "settings.recipes.missingService" : "Ðе можете найти ÑеÑвиÑ?",
152 "settings.recipes.mostPopular" : "ПопулÑрные", 158 "settings.recipes.mostPopular" : "Самые популÑрные",
153 "settings.recipes.nothingFound" : "Ðичего не найдено по вашему запроÑу.", 159 "settings.recipes.nothingFound" : "Извините, но ничего не найдено по вашему поиÑковому запроÑу.",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "Ð¡ÐµÑ€Ð²Ð¸Ñ ÑƒÑпешно добавлен", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "Ð¡ÐµÑ€Ð²Ð¸Ñ ÑƒÑпешно добавлен",
155 "settings.searchService" : "Ðайти ÑервиÑ", 161 "settings.searchService" : "Ðайти ÑервиÑ",
156 "settings.service.error.goBack" : "ВернутьÑÑ Ðº ÑервиÑам", 162 "settings.service.error.goBack" : "ВернутьÑÑ Ðº ÑервиÑам",
157 "settings.service.error.headline" : "Ошибка", 163 "settings.service.error.headline" : "Ошибка",
158 "settings.service.error.message" : "Ðевозможно загрузить рецепт ÑервиÑа.", 164 "settings.service.error.message" : "Ðевозможно загрузить \"рецепт\" ÑервиÑа.",
159 "settings.service.form.addServiceHeadline" : "Добавление {name}", 165 "settings.service.form.addServiceHeadline" : "Добавление {name}",
160 "settings.service.form.availableServices" : "ДоÑтупные ÑервиÑÑ‹", 166 "settings.service.form.availableServices" : "ДоÑтупные ÑервиÑÑ‹",
161 "settings.service.form.customUrl" : "ÐдÑÐµÑ Ñервера", 167 "settings.service.form.customUrl" : "ПользовательÑкий Ñервер",
162 "settings.service.form.customUrlPremiumInfo" : "Ð”Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑервиÑа на Ñвоем хоÑтинге необходим аккаунт Franz Premium.", 168 "settings.service.form.customUrlPremiumInfo" : "Ð”Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑервиÑа на Ñвоем хоÑтинге необходим премиум аккаунт Franz.",
163 "settings.service.form.customUrlUpgradeAccount" : "Улучшить аккаунт", 169 "settings.service.form.customUrlUpgradeAccount" : "Улучшить ваш аккаунт",
164 "settings.service.form.customUrlValidationError" : "Ðевозможно проверить Ñервер {name}.", 170 "settings.service.form.customUrlValidationError" : "Ðевозможно проверить Ñервер {name}.",
165 "settings.service.form.deleteButton" : "Удалить ÑервиÑ", 171 "settings.service.form.deleteButton" : "Удалить ÑервиÑ",
166 "settings.service.form.editServiceHeadline" : "Редактирование {name}", 172 "settings.service.form.editServiceHeadline" : "Редактирование {name}",
167 "settings.service.form.enableAudio" : "Включить звук", 173 "settings.service.form.enableAudio" : "Включить звук",
168 "settings.service.form.enableBadge" : "Показывать иконку непрочитанных Ñообщений", 174 "settings.service.form.enableBadge" : "Показывать иконку непрочитанных Ñообщений",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Включить уведомлениÑ", 176 "settings.service.form.enableNotification" : "Включить уведомлениÑ",
170 "settings.service.form.enableService" : "Включить ÑервиÑ", 177 "settings.service.form.enableService" : "Включить ÑервиÑ",
171 "settings.service.form.headlineBadges" : "Значки непрочитанных Ñообщений", 178 "settings.service.form.headlineBadges" : "Значки непрочитанных Ñообщений",
172 "settings.service.form.headlineGeneral" : "Общие", 179 "settings.service.form.headlineGeneral" : "Общие",
173 "settings.service.form.headlineNotifications" : "УведомлениÑ", 180 "settings.service.form.headlineNotifications" : "УведомлениÑ",
174 "settings.service.form.icon" : "ÐеÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð¸ÐºÐ¾Ð½ÐºÐ°", 181 "settings.service.form.icon" : "ПользовательÑÐºÐ°Ñ Ð¸ÐºÐ¾Ð½ÐºÐ°",
175 "settings.service.form.iconDelete" : "Удалить", 182 "settings.service.form.iconDelete" : "Удалить",
176 "settings.service.form.iconUpload" : "Перетащите картинку или кликните здеÑÑŒ", 183 "settings.service.form.iconUpload" : "Перетащите ваше изображение или кликните здеÑÑŒ",
177 "settings.service.form.indirectMessageInfo" : "Ð’Ñ‹ будете получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñех Ñообщений, не только Ð´Ð»Ñ @username, @channel, @here, ...", 184 "settings.service.form.indirectMessageInfo" : "Ð’Ñ‹ будете получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð¾ вÑех новых Ñообщений на канале, не только Ð´Ð»Ñ @username, @channel, @here, ...",
178 "settings.service.form.indirectMessages" : "Показывать значок уведомлений Ð´Ð»Ñ Ð²Ñех новых Ñообщений", 185 "settings.service.form.indirectMessages" : "Показывать значок уведомлений Ð´Ð»Ñ Ð²Ñех новых Ñообщений",
179 "settings.service.form.isMutedInfo" : "Когда выключено, вÑе звуковые ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отключены", 186 "settings.service.form.isMutedInfo" : "Когда выключено, вÑе звуковые ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отключены",
180 "settings.service.form.name" : "Ðазвание", 187 "settings.service.form.name" : "Ðазвание",
181 "settings.service.form.saveButton" : "Сохранить", 188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
194 "settings.service.form.saveButton" : "Сохранить ÑервиÑ",
182 "settings.service.form.tabHosted" : "Размещено", 195 "settings.service.form.tabHosted" : "Размещено",
183 "settings.service.form.tabOnPremise" : "Свой хоÑтинг â­ï¸", 196 "settings.service.form.tabOnPremise" : "Свой хоÑтинг â­ï¸",
184 "settings.service.form.team" : "Команда", 197 "settings.service.form.team" : "Команда",
185 "settings.service.form.useHostedService" : "ИÑпользовать ÑобÑтвенный ÑÐµÑ€Ð²Ð¸Ñ {name}", 198 "settings.service.form.useHostedService" : "ИÑпользовать ÑобÑтвенный ÑÐµÑ€Ð²Ð¸Ñ {name}",
186 "settings.service.form.yourServices" : "Ваши ÑервиÑÑ‹", 199 "settings.service.form.yourServices" : "Ваши ÑервиÑÑ‹",
187 "settings.services.deletedInfo" : "Ð¡ÐµÑ€Ð²Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½", 200 "settings.services.deletedInfo" : "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð±Ñ‹Ð» удален",
188 "settings.services.discoverServices" : "Ðайти ÑервиÑÑ‹", 201 "settings.services.discoverServices" : "Ðайти ÑервиÑÑ‹",
189 "settings.services.headline" : "Ваши ÑервиÑÑ‹", 202 "settings.services.headline" : "Ваши ÑервиÑÑ‹",
190 "settings.services.noServicesAdded" : "Ð’Ñ‹ пока не добавили никаких ÑервиÑов.", 203 "settings.services.noServicesAdded" : "Ð’Ñ‹ пока не добавили никаких ÑервиÑов.",
@@ -197,7 +210,7 @@
197 "settings.user.form.accountType.label" : "Тип аккаунта", 210 "settings.user.form.accountType.label" : "Тип аккаунта",
198 "settings.user.form.accountType.non-profit" : "ÐекоммерчеÑкий", 211 "settings.user.form.accountType.non-profit" : "ÐекоммерчеÑкий",
199 "settings.user.form.currentPassword" : "Текущий пароль", 212 "settings.user.form.currentPassword" : "Текущий пароль",
200 "settings.user.form.email" : "Email", 213 "settings.user.form.email" : "ÐÐ´Ñ€ÐµÑ Ñлектронной почты",
201 "settings.user.form.firstname" : "ИмÑ", 214 "settings.user.form.firstname" : "ИмÑ",
202 "settings.user.form.lastname" : "ФамилиÑ", 215 "settings.user.form.lastname" : "ФамилиÑ",
203 "settings.user.form.newPassword" : "Ðовый пароль", 216 "settings.user.form.newPassword" : "Ðовый пароль",
@@ -206,8 +219,8 @@
206 "sidebar.settings" : "ÐаÑтройки", 219 "sidebar.settings" : "ÐаÑтройки",
207 "sidebar.unmuteApp" : "Включить ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¸ звук", 220 "sidebar.unmuteApp" : "Включить ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¸ звук",
208 "signup.company.label" : "ОрганизациÑ", 221 "signup.company.label" : "ОрганизациÑ",
209 "signup.email.label" : "Email адреÑ", 222 "signup.email.label" : "ÐÐ´Ñ€ÐµÑ Ñлектронной почты",
210 "signup.emailDuplicate" : "Пользователь Ñ Ñ‚Ð°ÐºÐ¸Ð¼ email уже ÑущеÑтвует", 223 "signup.emailDuplicate" : "Пользователь Ñ Ñ‚Ð°ÐºÐ¸Ð¼ адреÑом Ñлектронной почты уже ÑущеÑтвует",
211 "signup.firstname.label" : "ИмÑ", 224 "signup.firstname.label" : "ИмÑ",
212 "signup.headline" : "РегиÑтрациÑ", 225 "signup.headline" : "РегиÑтрациÑ",
213 "signup.lastname.label" : "ФамилиÑ", 226 "signup.lastname.label" : "ФамилиÑ",
@@ -220,11 +233,13 @@
220 "subscription.euTaxInfo" : "Резидентам ЕвроСоюза: могут применÑÑ‚ÑŒÑÑ Ð¼ÐµÑтные налоги", 233 "subscription.euTaxInfo" : "Резидентам ЕвроСоюза: могут применÑÑ‚ÑŒÑÑ Ð¼ÐµÑтные налоги",
221 "subscription.features.ads" : "Без рекламы, навÑегда!", 234 "subscription.features.ads" : "Без рекламы, навÑегда!",
222 "subscription.features.comingSoon" : "Ñкоро", 235 "subscription.features.comingSoon" : "Ñкоро",
223 "subscription.features.customServices" : "ÐаÑтраиваемые ÑервиÑÑ‹ Ð´Ð»Ñ Ð²Ð°Ñ Ð¸ вашей команды", 236 "subscription.features.encryptedSync" : "Зашифрованные ÑеÑÑии Ñинхронизации",
224 "subscription.features.encryptedSync" : "Шифрование ÑеÑÑий Ñинхронизации", 237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Добавление облачных Ñлужб или Ñлужб на Ñвоём хоÑтинге типа HipChat", 238 "subscription.features.onpremise" : "Добавление облачных Ñлужб или Ñлужб на Ñвоём хоÑтинге типа HipChat",
226 "subscription.features.vpn" : "Поддержку прокÑи и VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
227 "subscription.includedFeatures" : "Платный аккаунт Franz Premium включает", 240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
242 "subscription.includedFeatures" : "Платный премиум аккаунт Franz включает",
228 "subscription.paymentSessionError" : "Ðевозможно загрузить форму оплаты", 243 "subscription.paymentSessionError" : "Ðевозможно загрузить форму оплаты",
229 "subscription.submit.label" : "Я хочу поддержать разработку Franz", 244 "subscription.submit.label" : "Я хочу поддержать разработку Franz",
230 "subscription.type.free" : "беÑплатно", 245 "subscription.type.free" : "беÑплатно",
@@ -241,11 +256,11 @@
241 "tabs.item.enableNotification" : "Включить уведомлениÑ", 256 "tabs.item.enableNotification" : "Включить уведомлениÑ",
242 "tabs.item.enableService" : "Включить Ñлужбу", 257 "tabs.item.enableService" : "Включить Ñлужбу",
243 "tabs.item.reload" : "Перезагрузить", 258 "tabs.item.reload" : "Перезагрузить",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{field} недейÑтвительно",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "{field} должно быть не менее {length} Ñимволов",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{field} обÑзательно",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field} ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительной ÑÑылкой",
248 "welcome.loginButton" : "Вход", 263 "welcome.loginButton" : "Вход",
249 "welcome.signupButton" : "Создать аккаунт", 264 "welcome.signupButton" : "Создать беÑплатный аккаунт",
250 "welcome.slogan" : "Общение, которое проÑто работает" 265 "welcome.slogan" : "Общение, которое работает Ð´Ð»Ñ Ð²Ð°Ñ"
251} 266}
diff --git a/src/i18n/locales/sk.json b/src/i18n/locales/sk.json
index c43e998a4..70e3e7f2d 100644
--- a/src/i18n/locales/sk.json
+++ b/src/i18n/locales/sk.json
@@ -1,233 +1,248 @@
1{ 1{
2 "global.api.unhealthy" : "Franz sa nemôže pripojit k online službám", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "global.notConnectedToTheInternet" : "Nie ste pripojený k internetu", 3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "import.headline" : "Importovať služby z Franz 4", 4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "global.api.unhealthy" : "Nedá sa pripojiť k online službám Franz",
6 "global.notConnectedToTheInternet" : "Nie ste pripojení k internetu.",
7 "import.headline" : "Importovať vaše služby z Franz 4",
5 "import.notSupportedHeadline" : "Služby zatiaľ nie sú podporované vo verzii Franz 5", 8 "import.notSupportedHeadline" : "Služby zatiaľ nie sú podporované vo verzii Franz 5",
6 "import.skip.label" : "Chcem pridaÅ¥ službu ruÄne", 9 "import.skip.label" : "Chcem pridaÅ¥ služby ruÄne",
7 "import.submit.label" : "Importovať služby", 10 "import.submit.label" : "Importovať služby",
8 "infobar.buttonChangelog" : "Čo je nové:", 11 "infobar.buttonChangelog" : "Čo je nového?",
9 "infobar.buttonInstallUpdate" : "Reštartovať a inštalovať aktualizáciu", 12 "infobar.buttonInstallUpdate" : "Reštartovať a nainštalovať aktualizáciu",
10 "infobar.buttonReloadServices" : "Obnoviť služby", 13 "infobar.buttonReloadServices" : "Obnoviť služby",
11 "infobar.requiredRequestsFailed" : "Nie je možné naÄítaÅ¥ služby a informácie o užívateľovi", 14 "infobar.requiredRequestsFailed" : "Nie je možné naÄítaÅ¥ služby a informácie o používateľovi",
12 "infobar.servicesUpdated" : "Vaše služby boli aktualizované.", 15 "infobar.servicesUpdated" : "Vaše služby boli aktualizované.",
13 "infobar.updateAvailable" : "Nová aktualizácia Franz je k dispozícii.", 16 "infobar.updateAvailable" : "Je k dispozícii nová aktualizácia Franz.",
14 "invite.email.label" : "E-mailová adresa", 17 "invite.email.label" : "E-mailová adresa",
15 "invite.headline.friends" : "Pozvite 3 priateľov alebo kolegov", 18 "invite.headline.friends" : "Pozvite troch vašich priateľov alebo kolegov",
16 "invite.name.label" : "Meno", 19 "invite.name.label" : "Meno",
17 "invite.skip.label" : "Spravím to neskôr", 20 "invite.skip.label" : "Chcem to urobiť neskôr",
18 "invite.submit.label" : "Poslať pozvánky", 21 "invite.submit.label" : "Poslať pozvánky",
19 "invite.successInfo" : "Pozvánky boli úspešne odoslané", 22 "invite.successInfo" : "Pozvánky boli úspešne odoslané",
20 "login.email.label" : "Emailová adresa", 23 "login.email.label" : "E-mailová adresa",
21 "login.headline" : "Prihlásiť sa", 24 "login.headline" : "Prihlásiť sa",
22 "login.invalidCredentials" : "E-mail alebo heslo nesúhlasí", 25 "login.invalidCredentials" : "E-mail alebo heslo nesúhlasia",
23 "login.link.password" : "Obnoviť heslo", 26 "login.link.password" : "Obnoviť heslo",
24 "login.link.signup" : "VytvoriÅ¥ užívateľský úÄet zdarma", 27 "login.link.signup" : "VytvoriÅ¥ používateľský úÄet zdarma",
25 "login.password.label" : "Heslo", 28 "login.password.label" : "Heslo",
26 "login.serverLogout" : "Relácia vypršala, prihláste sa prosím znova.", 29 "login.serverLogout" : "Vaša relácia vypršala, prihláste sa prosím znovu.",
27 "login.submit.label" : "Prihlásiť sa", 30 "login.submit.label" : "Prihlásiť sa",
28 "login.tokenExpired" : "Relácia vypršala, prosím prihláste sa znova.", 31 "login.tokenExpired" : "Vaša relácia vypršala, prihláste sa prosím znovu.",
29 "menu.app.about" : "About Franz", 32 "menu.app.about" : "O aplikácii",
30 "menu.app.hide" : "Hide", 33 "menu.app.hide" : "Skryť",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "Skryť ostatné",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "UkonÄiÅ¥",
33 "menu.app.settings" : "Nastavenia", 36 "menu.app.settings" : "Nastavenia",
34 "menu.app.unhide" : "Unhide", 37 "menu.app.unhide" : "Odkryť",
35 "menu.edit" : "Upraviť", 38 "menu.edit" : "Upraviť",
36 "menu.edit.copy" : "Copy", 39 "menu.edit.copy" : "Kopírovať",
37 "menu.edit.cut" : "Cut", 40 "menu.edit.cut" : "Vystrihnúť",
38 "menu.edit.delete" : "Zmazať", 41 "menu.edit.delete" : "Zmazať",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "Emoji a symboly",
40 "menu.edit.paste" : "Paste", 43 "menu.edit.paste" : "Vložiť",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Vložiť s prevzatím jestvujúceho štýlu",
42 "menu.edit.redo" : "Redo", 45 "menu.edit.redo" : "Znovu",
43 "menu.edit.selectAll" : "Select All", 46 "menu.edit.selectAll" : "Vybrať všetko",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Rozprávanie",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "ZaÄaÅ¥ diktovanie",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "ZaÄaÅ¥ rozprávanie",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "Zastaviť rozprávanie",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "Späť",
49 "menu.file" : "File", 52 "menu.file" : "Súbor",
50 "menu.help" : "Help", 53 "menu.help" : "Pomocník",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "Záznam zmien",
52 "menu.help.learnMore" : "Learn More", 55 "menu.help.learnMore" : "Zistiť viac",
53 "menu.help.privacy" : "Vyhlásenie o ochrane súkromia", 56 "menu.help.privacy" : "Vyhlásenie o ochrane súkromia",
54 "menu.help.support" : "Support", 57 "menu.help.support" : "Podpora",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "Podmienky použitia",
56 "menu.services" : "Services", 59 "menu.services" : "Služby",
57 "menu.services.addNewService" : "Add New Service...", 60 "menu.services.addNewService" : "Pridať novú službu...",
58 "menu.view" : "View", 61 "menu.view" : "Zobraziť",
59 "menu.view.enterFullScreen" : "Enter Full Screen", 62 "menu.view.enterFullScreen" : "Na celú obrazovku",
60 "menu.view.exitFullScreen" : "Exit Full Screen", 63 "menu.view.exitFullScreen" : "UkonÄiÅ¥ režim na celú obrazovku",
61 "menu.view.reloadFranz" : "Reload Franz", 64 "menu.view.reloadFranz" : "Obnoviť Franz",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "Obnoviť službu",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "Pôvodná veľkosť",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Prepnúť vývojárske nástroje",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "Prepnúť na celú obrazovku",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Prepnúť vývojárske nástroje služby",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "Priblížiť",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "Oddialiť",
69 "menu.window" : "Window", 72 "menu.window" : "Okno",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "Zatvoriť",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "Minimalizovať",
72 "password.email.label" : "Emailová adresa", 75 "password.email.label" : "E-mailová adresa",
73 "password.headline" : "Vynulovať heslo", 76 "password.headline" : "Obnoviť heslo",
74 "password.link.login" : "Prihlásenie do vaÅ¡eho úÄtu", 77 "password.link.login" : "PrihlásiÅ¥ sa do vášho úÄtu",
75 "password.link.signup" : "VytvoriÅ¥ užívateľský úÄet zdarma", 78 "password.link.signup" : "VytvoriÅ¥ používateľský úÄet zdarma",
76 "password.noUser" : "Užívateľ s touto emailovou adresou nebol nájdený", 79 "password.noUser" : "Používateľ s touto e-mailovou adresou nebol nájdený",
77 "password.submit.label" : "Odoslať", 80 "password.submit.label" : "Odoslať",
78 "password.successInfo" : "Prosím, zkontrolujte svoj e-mail", 81 "password.successInfo" : "Skontrolujte prosím váš e-mail",
79 "pricing.headline" : "Podporte Franz", 82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
83 "pricing.headline" : "Podporiť Franz",
80 "pricing.link.skipPayment" : "Nechcem podporiť vývoj aplikácie Franz.", 84 "pricing.link.skipPayment" : "Nechcem podporiť vývoj aplikácie Franz.",
81 "pricing.submit.label" : "Chcem podporiť vývoj aplikácie Franz", 85 "pricing.submit.label" : "Chcem podporiť vývoj aplikácie Franz",
82 "pricing.support.label" : "Vyberte váš plán podpory", 86 "pricing.support.label" : "Vyberte si váš plán podpory",
83 "service.crashHandler.action" : "NaÄítaÅ¥ znovu {name}", 87 "service.crashHandler.action" : "Znovu naÄítaÅ¥ {name}",
84 "service.crashHandler.autoReload" : "Pokus o automatické obnovenie {name} za {seconds} sekúnd", 88 "service.crashHandler.autoReload" : "Najbližší pokus o automatické obnovenie {name} o {seconds} sekúnd",
85 "service.crashHandler.headline" : "Ale nie!", 89 "service.crashHandler.headline" : "Ale nie!",
86 "service.crashHandler.text" : "{name} spôsobil chybu.", 90 "service.crashHandler.text" : "{name} spôsobil chybu.",
87 "service.disabledHandler.action" : "Zapnúť {name}", 91 "service.disabledHandler.action" : "Zapnúť {name}",
88 "service.disabledHandler.headline" : "{name} je vypnutý", 92 "service.disabledHandler.headline" : "{name} je vypnuté",
89 "services.getStarted" : "ZaÄíname", 93 "services.getStarted" : "ZaÄíname",
90 "services.welcome" : "Víta vás Franz", 94 "services.welcome" : "Vítajte v aplikácii Franz",
91 "settings.account.account.editButton" : "UpraviÅ¥ úÄet", 95 "settings.account.account.editButton" : "UpraviÅ¥ úÄet",
92 "settings.account.accountType.basic" : "Základný úÄet", 96 "settings.account.accountType.basic" : "Základný úÄet",
93 "settings.account.accountType.premium" : "Prémiový úÄet podporovateľa", 97 "settings.account.accountType.premium" : "Prémiový úÄet podporovateľa",
94 "settings.account.buttonSave" : "Aktualizovať profil", 98 "settings.account.buttonSave" : "Aktualizovať profil",
95 "settings.account.deleteAccount" : "OdstrániÅ¥ úÄet", 99 "settings.account.deleteAccount" : "OdstrániÅ¥ úÄet",
96 "settings.account.deleteEmailSent" : "Na váš mail bol odoslaný email s odkazom pre potvrdenie zmazanie úÄtu. Váš úÄet a dáta potom nepôjde obnoviÅ¥!", 100 "settings.account.deleteEmailSent" : "Bol vám odoslaný e-mail s odkazom pre potvrdenie odstránenia vášho úÄtu. Váš úÄet a údaje sa nebudú daÅ¥ obnoviÅ¥!",
97 "settings.account.deleteInfo" : "Ak už nepotrebujete váš Franz úÄet, môžete tu váš úÄet, a vÅ¡etky dáta v ňom, zmazaÅ¥.", 101 "settings.account.deleteInfo" : "Ak už nepotrebujete váš Franz úÄet, tu ho môžete zmazaÅ¥ spolu so vÅ¡etkými prislúchajúcimi údajmi.",
98 "settings.account.headline" : "ÚÄet", 102 "settings.account.headline" : "ÚÄet",
99 "settings.account.headlineAccount" : "Informácie o úÄte", 103 "settings.account.headlineAccount" : "Informácie o úÄte",
100 "settings.account.headlineDangerZone" : "NebezpeÄná zóna", 104 "settings.account.headlineDangerZone" : "NebezpeÄná zóna",
101 "settings.account.headlineInvoices" : "Faktúry", 105 "settings.account.headlineInvoices" : "Faktúry",
102 "settings.account.headlinePassword" : "Zmeniť heslo", 106 "settings.account.headlinePassword" : "Zmeniť heslo",
103 "settings.account.headlineProfile" : "Aktualizovať profil", 107 "settings.account.headlineProfile" : "Aktualizovať profil",
104 "settings.account.headlineSubscription" : "Vaše predplatné", 108 "settings.account.headlineSubscription" : "Vaše odoberanie",
105 "settings.account.headlineUpgrade" : "Inovujte svoj úÄet a podporte Franz", 109 "settings.account.headlineUpgrade" : "Povýšte svoj úÄet a podporte Franz",
106 "settings.account.invoiceDownload" : "Stiahnuť", 110 "settings.account.invoiceDownload" : "Prevziať",
107 "settings.account.manageSubscription.label" : "Spravovať vaše predplatné", 111 "settings.account.manageSubscription.label" : "Spravovať vaše odoberanie",
108 "settings.account.successInfo" : "Vaše zmeny boli uložené", 112 "settings.account.successInfo" : "Vaše zmeny boli uložené",
109 "settings.account.tryReloadUserInfoRequest" : "Skúsiť znova", 113 "settings.account.tryReloadUserInfoRequest" : "Skúsiť znova",
110 "settings.account.userInfoRequestFailed" : "Nebolo možné získaÅ¥ informácie o užívateľovi", 114 "settings.account.userInfoRequestFailed" : "Nebolo možné naÄítaÅ¥ informácie o používateľovi",
111 "settings.app.buttonClearAllCache" : "VyÄistiÅ¥ vyrovnávaciu pamäť", 115 "settings.app.buttonClearAllCache" : "VyÄistiÅ¥ vyrovnávaciu pamäť",
112 "settings.app.buttonInstallUpdate" : "Reštart a inštalácia aktualizácií", 116 "settings.app.buttonInstallUpdate" : "Reštartovať a nainštalovať aktualizáciu",
113 "settings.app.buttonSearchForUpdate" : "Skontrolovať aktualizácie", 117 "settings.app.buttonSearchForUpdate" : "Skontrolovať aktualizácie",
114 "settings.app.cacheInfo" : "Franz momentálne používa {size} miesta na disku.", 118 "settings.app.cacheInfo" : "Vyrovnávacia pamäť Franz momentálne používa {size} miesta na disku.",
115 "settings.app.currentVersion" : "Aktuálna verzia:", 119 "settings.app.currentVersion" : "SúÄasná verzia:",
116 "settings.app.form.autoLaunchInBackground" : "Otvoriť na pozadí", 120 "settings.app.form.autoLaunchInBackground" : "Otvoriť na pozadí",
117 "settings.app.form.autoLaunchOnStart" : "Spustiť Franz pri štarte", 121 "settings.app.form.autoLaunchOnStart" : "Spustiť Franz pri štarte",
118 "settings.app.form.beta" : "Vrátane beta verzií", 122 "settings.app.form.beta" : "Vrátane beta verzií",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
120 "settings.app.form.enableMenuBar" : "Zobraz Franz v Menu bare", 124 "settings.app.form.enableGPUAcceleration" : "Zapnúť GPU zrýchlenie",
121 "settings.app.form.enableSpellchecking" : "Povoliť zvýraznenie preklepov", 125 "settings.app.form.enableMenuBar" : "Zobraziť Franz v ponuke menu",
126 "settings.app.form.enableSpellchecking" : "Zapnúť kontrolu pravopisu",
122 "settings.app.form.enableSystemTray" : "Zobrazovať Franz v systémovej lište", 127 "settings.app.form.enableSystemTray" : "Zobrazovať Franz v systémovej lište",
123 "settings.app.form.hideDockIcon" : "Schovaj ikonu Franz v doku", 128 "settings.app.form.hideDockIcon" : "Skryť ikonu Franz v doku",
124 "settings.app.form.language" : "Jazyk", 129 "settings.app.form.language" : "Jazyk",
125 "settings.app.form.minimizeToSystemTray" : "Minimalizovať Franz do systémovej lišty", 130 "settings.app.form.minimizeToSystemTray" : "Minimalizovať Franz do systémovej lišty",
126 "settings.app.form.runInBackground" : "Ponechať Franz spustený v pozadí pri zatvorení okna", 131 "settings.app.form.runInBackground" : "Po zatvorení okna ponechať Franz spustený na pozadí",
127 "settings.app.form.showDisabledServices" : "Zobraziť záložky vypnutých služieb", 132 "settings.app.form.showDisabledServices" : "Zobraziť záložky vypnutých služieb",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "ZobraziÅ¥ odznak pre nepreÄítané správy keÄ sú upozornenia vypnutá", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "ZobraziÅ¥ symbol pre nepreÄítané správy, keÄ sú vypnuté upozornenia",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Nastavenia", 135 "settings.app.headline" : "Nastavenia",
130 "settings.app.headlineAdvanced" : "Rozšírené", 136 "settings.app.headlineAdvanced" : "PokroÄilé",
131 "settings.app.headlineAppearance" : "Vzhľad", 137 "settings.app.headlineAppearance" : "Vzhľad",
132 "settings.app.headlineGeneral" : "Všeobecné", 138 "settings.app.headlineGeneral" : "Všeobecné",
133 "settings.app.headlineLanguage" : "Jazyk", 139 "settings.app.headlineLanguage" : "Jazyk",
134 "settings.app.headlineUpdates" : "Aktualizácie", 140 "settings.app.headlineUpdates" : "Aktualizácie",
135 "settings.app.restartRequired" : "Zmeny vyžadujú restart", 141 "settings.app.restartRequired" : "Zmeny vyžadujú reštart",
136 "settings.app.subheadlineCache" : "Vyrovnávacia pamäť", 142 "settings.app.subheadlineCache" : "Vyrovnávacia pamäť",
137 "settings.app.translationHelp" : "Pomôžte nám preložiť Franz do svojho jazyka.", 143 "settings.app.translationHelp" : "Pomôžte nám preložiť Franz do svojho jazyka.",
138 "settings.app.updateStatusAvailable" : "Dostupná aktualizácia, sťahujem...", 144 "settings.app.updateStatusAvailable" : "Je dostupná aktualizácia, sťahuje sa...",
139 "settings.app.updateStatusSearching" : "Vyhľadávam aktualizácie", 145 "settings.app.updateStatusSearching" : "Vyhľadáva aktualizácie",
140 "settings.app.updateStatusUpToDate" : "Používate najnovšiu verziu Franz", 146 "settings.app.updateStatusUpToDate" : "Používate najnovšiu verziu Franz",
141 "settings.invite.headline" : "Pozvi priateľov", 147 "settings.invite.headline" : "Pozvať priateľov",
142 "settings.navigation.account" : "ÚÄet", 148 "settings.navigation.account" : "ÚÄet",
143 "settings.navigation.availableServices" : "Dostupné služby", 149 "settings.navigation.availableServices" : "Dostupné služby",
144 "settings.navigation.inviteFriends" : "Pozvi priateľov", 150 "settings.navigation.inviteFriends" : "Pozvať priateľov",
145 "settings.navigation.logout" : "Odhlásiť sa", 151 "settings.navigation.logout" : "Odhlásiť sa",
146 "settings.navigation.settings" : "Nastavenia", 152 "settings.navigation.settings" : "Nastavenia",
147 "settings.navigation.yourServices" : "Vaše služby", 153 "settings.navigation.yourServices" : "Vaše služby",
148 "settings.recipes.all" : "Všetky služby", 154 "settings.recipes.all" : "Všetky služby",
149 "settings.recipes.dev" : "Vývoj", 155 "settings.recipes.dev" : "Vývoj",
150 "settings.recipes.headline" : "Dostupné služby", 156 "settings.recipes.headline" : "Dostupné služby",
151 "settings.recipes.missingService" : "Chýbajúce služba?", 157 "settings.recipes.missingService" : "Chýba vám služba?",
152 "settings.recipes.mostPopular" : "Najpopulárnejšie", 158 "settings.recipes.mostPopular" : "Najpopulárnejšie",
153 "settings.recipes.nothingFound" : "Je nám ľúto, ale žiadna služba nezodpovedala vášmu hľadanému výrazu.", 159 "settings.recipes.nothingFound" : "Ľutujeme, ale žiadna služba nezodpovedá vami hľadanému výrazu.",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "Služba úspešne pridaná", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "Služba bola úspešne pridaná",
155 "settings.searchService" : "Vyhľadať službu", 161 "settings.searchService" : "Vyhľadať službu",
156 "settings.service.error.goBack" : "Späť na služby", 162 "settings.service.error.goBack" : "Späť na služby",
157 "settings.service.error.headline" : "Chyba", 163 "settings.service.error.headline" : "Chyba",
158 "settings.service.error.message" : "Nepodarilo sa naÄítaÅ¥ službu.", 164 "settings.service.error.message" : "Nepodarilo sa naÄítaÅ¥ službu.",
159 "settings.service.form.addServiceHeadline" : "Pridať {názov}", 165 "settings.service.form.addServiceHeadline" : "Pridať {name}",
160 "settings.service.form.availableServices" : "Dostupné služby", 166 "settings.service.form.availableServices" : "Dostupné služby",
161 "settings.service.form.customUrl" : "Vlastný server", 167 "settings.service.form.customUrl" : "Vlastný server",
162 "settings.service.form.customUrlPremiumInfo" : "Ak chcete pridaÅ¥ vlastné hostované služby, potrebujete úÄet Franz Premium Supporter.", 168 "settings.service.form.customUrlPremiumInfo" : "Ak chcete pridaÅ¥ vlastné hostované služby, potrebujete úÄet Franz Premium Supporter.",
163 "settings.service.form.customUrlUpgradeAccount" : "Inovujte váš úÄet", 169 "settings.service.form.customUrlUpgradeAccount" : "Povýšte váš úÄet",
164 "settings.service.form.customUrlValidationError" : "Nebolo možné overiť vlastný server: {name}.", 170 "settings.service.form.customUrlValidationError" : "Nebolo možné overiť vlastný server: {name}.",
165 "settings.service.form.deleteButton" : "Odstrániť službu", 171 "settings.service.form.deleteButton" : "Odstrániť službu",
166 "settings.service.form.editServiceHeadline" : "Upraviť {meno}", 172 "settings.service.form.editServiceHeadline" : "Upraviť {name}",
167 "settings.service.form.enableAudio" : "Zapnúť zvuk", 173 "settings.service.form.enableAudio" : "Zapnúť zvuk",
168 "settings.service.form.enableBadge" : "UkázaÅ¥ odznaky nepreÄítaných správ", 174 "settings.service.form.enableBadge" : "ZobraziÅ¥ symboly nepreÄítaných správ",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Povoliť oznámenia", 176 "settings.service.form.enableNotification" : "Povoliť oznámenia",
170 "settings.service.form.enableService" : "Povoliť službu", 177 "settings.service.form.enableService" : "Povoliť službu",
171 "settings.service.form.headlineBadges" : "Odznaky nepreÄítaných správ", 178 "settings.service.form.headlineBadges" : "Symboly nepreÄítaných správ",
172 "settings.service.form.headlineGeneral" : "Všeobecné", 179 "settings.service.form.headlineGeneral" : "Všeobecné",
173 "settings.service.form.headlineNotifications" : "Upozornenia", 180 "settings.service.form.headlineNotifications" : "Oznámenia",
174 "settings.service.form.icon" : "Vlastná ikona", 181 "settings.service.form.icon" : "Vlastná ikona",
175 "settings.service.form.iconDelete" : "Zmazať", 182 "settings.service.form.iconDelete" : "Zmazať",
176 "settings.service.form.iconUpload" : "Presuňte váš obrázok, alebo kliknite sem", 183 "settings.service.form.iconUpload" : "Presuňte váš obrázok, alebo kliknite sem",
177 "settings.service.form.indirectMessageInfo" : "Budete dostávať upozornenia na všetky nové správy v kanáli, nielen na @meno, @kanál, @kde, ...", 184 "settings.service.form.indirectMessageInfo" : "Budete dostávať upozornenia na všetky nové správy v kanáli, nielen na @username, @channel, @here, ......",
178 "settings.service.form.indirectMessages" : "Zobraziť znak správy pre všetky nové správy", 185 "settings.service.form.indirectMessages" : "Zobraziť symbol správy pre všetky nové správy",
179 "settings.service.form.isMutedInfo" : "Ak je vypnuté, všetky zvuky notifikácií a iného audia budú stíšené", 186 "settings.service.form.isMutedInfo" : "Ak je vypnuté, všetky zvuky oznámení a iné prehrávania budú stíšené",
180 "settings.service.form.name" : "Meno", 187 "settings.service.form.name" : "Meno",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Uložiť službu", 194 "settings.service.form.saveButton" : "Uložiť službu",
182 "settings.service.form.tabHosted" : "Hostovaný", 195 "settings.service.form.tabHosted" : "Hostované",
183 "settings.service.form.tabOnPremise" : "Vlastné hosÅ¥ovanie â­ï¸", 196 "settings.service.form.tabOnPremise" : "Vlastné hostovanie â­ï¸",
184 "settings.service.form.team" : "Tím", 197 "settings.service.form.team" : "Tím",
185 "settings.service.form.useHostedService" : "Použite hostovanú {name} službu.", 198 "settings.service.form.useHostedService" : "Použiť hostovanú {name} službu.",
186 "settings.service.form.yourServices" : "Vaše služby", 199 "settings.service.form.yourServices" : "Vaše služby",
187 "settings.services.deletedInfo" : "Služba bola odstránená", 200 "settings.services.deletedInfo" : "Služba bola odstránená",
188 "settings.services.discoverServices" : "Preskúmajte služby", 201 "settings.services.discoverServices" : "Preskúmať služby",
189 "settings.services.headline" : "Vaše služby", 202 "settings.services.headline" : "Vaše služby",
190 "settings.services.noServicesAdded" : "Nepridali ste ešte žiadne služby", 203 "settings.services.noServicesAdded" : "Doposiaľ ste nepridali žiadne služby.",
191 "settings.services.tooltip.isDisabled" : "Služba je vypnutá", 204 "settings.services.tooltip.isDisabled" : "Služba je vypnutá",
192 "settings.services.tooltip.isMuted" : "Všetky zvuky sú stíšené", 205 "settings.services.tooltip.isMuted" : "Všetky zvuky sú stíšené",
193 "settings.services.tooltip.notificationsDisabled" : "Oznámenia sú vypnuté", 206 "settings.services.tooltip.notificationsDisabled" : "Oznámenia sú vypnuté",
194 "settings.services.updatedInfo" : "Vaše zmeny boli uložené", 207 "settings.services.updatedInfo" : "Vaše zmeny boli uložené",
195 "settings.user.form.accountType.company" : "SpoloÄnosÅ¥", 208 "settings.user.form.accountType.company" : "SpoloÄnosÅ¥",
196 "settings.user.form.accountType.individual" : "Jednotlivec", 209 "settings.user.form.accountType.individual" : "Osoba",
197 "settings.user.form.accountType.label" : "Typ úÄtu", 210 "settings.user.form.accountType.label" : "Typ úÄtu",
198 "settings.user.form.accountType.non-profit" : "Nezisková organizácia", 211 "settings.user.form.accountType.non-profit" : "Nezisková organizácia",
199 "settings.user.form.currentPassword" : "SúÄasné heslo", 212 "settings.user.form.currentPassword" : "SúÄasné heslo",
200 "settings.user.form.email" : "Email", 213 "settings.user.form.email" : "E-mail",
201 "settings.user.form.firstname" : "Krstné meno", 214 "settings.user.form.firstname" : "Krstné meno",
202 "settings.user.form.lastname" : "Priezvisko", 215 "settings.user.form.lastname" : "Priezvisko",
203 "settings.user.form.newPassword" : "Nové heslo", 216 "settings.user.form.newPassword" : "Nové heslo",
204 "sidebar.addNewService" : "Pridať novú službu", 217 "sidebar.addNewService" : "Pridať novú službu",
205 "sidebar.muteApp" : "Vypnúť upozornenia a zvuky", 218 "sidebar.muteApp" : "Vypnúť upozornenia a zvuky",
206 "sidebar.settings" : "Nastavenia", 219 "sidebar.settings" : "Nastavenia",
207 "sidebar.unmuteApp" : "Zapnúť upozornenia a zvuky", 220 "sidebar.unmuteApp" : "Povoliť oznámenia a zvuky",
208 "signup.company.label" : "SpoloÄnosÅ¥", 221 "signup.company.label" : "SpoloÄnosÅ¥",
209 "signup.email.label" : "Emailová adresa", 222 "signup.email.label" : "E-mailová adresa",
210 "signup.emailDuplicate" : "Kontakt s touto emailovou adresou už existuje", 223 "signup.emailDuplicate" : "Používateľ s touto e-mailovou adresou už jestvuje",
211 "signup.firstname.label" : "Krstné meno", 224 "signup.firstname.label" : "Krstné meno",
212 "signup.headline" : "Prihlásiť sa", 225 "signup.headline" : "Prihlásiť sa",
213 "signup.lastname.label" : "Priezvisko", 226 "signup.lastname.label" : "Priezvisko",
214 "signup.legal.info" : "Vytvorením úÄtu Franz akceptujete", 227 "signup.legal.info" : "Vytvorením úÄtu Franz súhlasíte s",
215 "signup.legal.privacy" : "Vyhlásenie o ochrane súkromia", 228 "signup.legal.privacy" : "Vyhlásenie o ochrane súkromia",
216 "signup.legal.terms" : "Podmienky služby", 229 "signup.legal.terms" : "Podmienky služby",
217 "signup.link.login" : "Už máte úÄet, prihlásiÅ¥ sa?", 230 "signup.link.login" : "Už máte úÄet, chcete sa prihlásiÅ¥?",
218 "signup.password.label" : "Heslo", 231 "signup.password.label" : "Heslo",
219 "signup.submit.label" : "VytvoriÅ¥ úÄet", 232 "signup.submit.label" : "VytvoriÅ¥ úÄet",
220 "subscription.euTaxInfo" : "Pro obyvatelé EÚ: môžu byť aplikované miestne dane", 233 "subscription.euTaxInfo" : "Pre obyvateľov EÚ: môže byť aplikovaná miestna daň",
221 "subscription.features.ads" : "Žiadne reklamy, nikdy!", 234 "subscription.features.ads" : "Žiadne reklamy, nikdy!",
222 "subscription.features.comingSoon" : "už Äoskoro", 235 "subscription.features.comingSoon" : "už Äoskoro",
223 "subscription.features.customServices" : "Privátne ​​služby pre vás a váš tím",
224 "subscription.features.encryptedSync" : "Šifrovaná synchronizácia relácie", 236 "subscription.features.encryptedSync" : "Šifrovaná synchronizácia relácie",
225 "subscription.features.onpremise" : "Pridať vlastné\/hostované služby, ako je HipChat", 237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
226 "subscription.features.vpn" : "Proxy & VPN podpora", 238 "subscription.features.onpremise" : "Pridať lokálne hostované služby, ako napr. HipChat",
239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Platený úÄet Premium Supporter Franz zahŕňa", 242 "subscription.includedFeatures" : "Platený úÄet Premium Supporter Franz zahŕňa",
228 "subscription.paymentSessionError" : "Nepodarilo sa inicializovať platbu od", 243 "subscription.paymentSessionError" : "Nepodarilo sa inicializovať platbu od",
229 "subscription.submit.label" : "Chcem podporiť vývoj programu Franz", 244 "subscription.submit.label" : "Chcem podporiť vývoj aplikácie Franz",
230 "subscription.type.free" : "Zdarma", 245 "subscription.type.free" : "zdarma",
231 "subscription.type.month" : "mesiac", 246 "subscription.type.month" : "mesiac",
232 "subscription.type.year" : "rok", 247 "subscription.type.year" : "rok",
233 "subscriptionPopup.buttonCancel" : "Zrušiť", 248 "subscriptionPopup.buttonCancel" : "Zrušiť",
@@ -241,11 +256,11 @@
241 "tabs.item.enableNotification" : "Povoliť oznámenia", 256 "tabs.item.enableNotification" : "Povoliť oznámenia",
242 "tabs.item.enableService" : "Povoliť službu", 257 "tabs.item.enableService" : "Povoliť službu",
243 "tabs.item.reload" : "Obnoviť", 258 "tabs.item.reload" : "Obnoviť",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{field} je neplatný",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "{field} by malo byť dlhé aspoň {length} znakov",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{field} je povinné",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field} nie je platné URL",
248 "welcome.loginButton" : "Prihláste sa k vášmu úÄtu", 263 "welcome.loginButton" : "PrihlásiÅ¥ sa do vášho úÄtu",
249 "welcome.signupButton" : "VytvoriÅ¥ užívateľský úÄet zdarma", 264 "welcome.signupButton" : "VytvoriÅ¥ úÄet zdarma",
250 "welcome.slogan" : "Správy, ktoré pracujú pre vás" 265 "welcome.slogan" : "Správy, ktoré pracujú pre vás"
251} 266}
diff --git a/src/i18n/locales/sr.json b/src/i18n/locales/sr.json
index 1f31bc834..dd4c74277 100644
--- a/src/i18n/locales/sr.json
+++ b/src/i18n/locales/sr.json
@@ -1,9 +1,12 @@
1{ 1{
2 "global.api.unhealthy" : "Nije moguće pristupiti Francovim on-line servisima. ", 2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
5 "global.api.unhealthy" : "Nije moguće pristupiti Franz-ovim on-line servisima. ",
3 "global.notConnectedToTheInternet" : "Niste povezani sa serverom.", 6 "global.notConnectedToTheInternet" : "Niste povezani sa serverom.",
4 "import.headline" : "Uvezite svoje Franc4 servise", 7 "import.headline" : "Uvezite svoje Franz 4 servise",
5 "import.notSupportedHeadline" : "Servis trenutno nije podržan u Franc5", 8 "import.notSupportedHeadline" : "Servis trenutno nije podržan u Franz 5",
6 "import.skip.label" : "I want to add services manually", 9 "import.skip.label" : "Желим да додам уÑлуге ручно",
7 "import.submit.label" : "Uvezi servise", 10 "import.submit.label" : "Uvezi servise",
8 "infobar.buttonChangelog" : "Å ta je novo? ", 11 "infobar.buttonChangelog" : "Å ta je novo? ",
9 "infobar.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje ", 12 "infobar.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje ",
@@ -16,7 +19,7 @@
16 "invite.name.label" : "Ime", 19 "invite.name.label" : "Ime",
17 "invite.skip.label" : "Želim da ovo uradim kasnije", 20 "invite.skip.label" : "Želim da ovo uradim kasnije",
18 "invite.submit.label" : "Pošalji pozivnice", 21 "invite.submit.label" : "Pošalji pozivnice",
19 "invite.successInfo" : "Invitations sent successfully", 22 "invite.successInfo" : "Poziv je uspešno poslat.",
20 "login.email.label" : "Vaša e-adresa:", 23 "login.email.label" : "Vaša e-adresa:",
21 "login.headline" : "Prijavite se", 24 "login.headline" : "Prijavite se",
22 "login.invalidCredentials" : "E-mail ili lozinka nisu toÄni", 25 "login.invalidCredentials" : "E-mail ili lozinka nisu toÄni",
@@ -26,49 +29,49 @@
26 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.", 29 "login.serverLogout" : "Vaša sesija je istekla, prijavite se ponovo.",
27 "login.submit.label" : "Prijavite se", 30 "login.submit.label" : "Prijavite se",
28 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.", 31 "login.tokenExpired" : "Vaša sesija je istekla, prijavite se ponovo.",
29 "menu.app.about" : "About Franz", 32 "menu.app.about" : "O Francu",
30 "menu.app.hide" : "Hide", 33 "menu.app.hide" : "Sakrij",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "Sakrij ostale",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "Izađi",
33 "menu.app.settings" : "Postavke", 36 "menu.app.settings" : "Postavke",
34 "menu.app.unhide" : "Unhide", 37 "menu.app.unhide" : "Otkrij",
35 "menu.edit" : "Uredi", 38 "menu.edit" : "Uredi",
36 "menu.edit.copy" : "Copy", 39 "menu.edit.copy" : "Kopiraj",
37 "menu.edit.cut" : "Cut", 40 "menu.edit.cut" : "Iseci",
38 "menu.edit.delete" : "Delete", 41 "menu.edit.delete" : "Obriši",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "Smajliji i simboli",
40 "menu.edit.paste" : "Paste", 43 "menu.edit.paste" : "Nalepi",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Ðалепи не мењајући Ñтил",
42 "menu.edit.redo" : "Redo", 45 "menu.edit.redo" : "Понови",
43 "menu.edit.selectAll" : "Select All", 46 "menu.edit.selectAll" : "Изабери Ñве",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Говор",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "Започни диктирање",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "Започни изговор",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "ЗауÑтави изговор",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "Поништи",
49 "menu.file" : "File", 52 "menu.file" : "Датотека",
50 "menu.help" : "Help", 53 "menu.help" : "Помоћ",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "Дневник измена",
52 "menu.help.learnMore" : "Learn More", 55 "menu.help.learnMore" : "Сазнајте више",
53 "menu.help.privacy" : "Izjava o privatnosti", 56 "menu.help.privacy" : "Izjava o privatnosti",
54 "menu.help.support" : "Support", 57 "menu.help.support" : "Подршка",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "УÑлови коришћења уÑлуге",
56 "menu.services" : "Services", 59 "menu.services" : "Usluge",
57 "menu.services.addNewService" : "Add New Service...", 60 "menu.services.addNewService" : "Додај нову уÑлугу",
58 "menu.view" : "View", 61 "menu.view" : "Преглед",
59 "menu.view.enterFullScreen" : "Enter Full Screen", 62 "menu.view.enterFullScreen" : "Отвори у целом екрану",
60 "menu.view.exitFullScreen" : "Exit Full Screen", 63 "menu.view.exitFullScreen" : "ÐапуÑти цео екран",
61 "menu.view.reloadFranz" : "Reload Franz", 64 "menu.view.reloadFranz" : "Поново учитај Франз",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "Поново учирај уÑлугу",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "Стварна величина",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Промени алатке за развој",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "Преко целог екрана",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "Увећај приказ",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "Умањи приказ",
69 "menu.window" : "Window", 72 "menu.window" : "У прозору",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "Затвори",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "Умањи",
72 "password.email.label" : "Vaša e-adresa", 75 "password.email.label" : "Vaša e-adresa",
73 "password.headline" : "Stvorite novu zaporku", 76 "password.headline" : "Stvorite novu zaporku",
74 "password.link.login" : "Prijavite se na VaÅ¡ raÄun", 77 "password.link.login" : "Prijavite se na VaÅ¡ raÄun",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Ne postoji ni jedan korisnik s tom e-mail adresom", 79 "password.noUser" : "Ne postoji ni jedan korisnik s tom e-mail adresom",
77 "password.submit.label" : "Pošalji", 80 "password.submit.label" : "Pošalji",
78 "password.successInfo" : "Molimo Vas da provjerite vašu e-mail adresu", 81 "password.successInfo" : "Molimo Vas da provjerite vašu e-mail adresu",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Podržite Franz", 83 "pricing.headline" : "Podržite Franz",
80 "pricing.link.skipPayment" : "Ne želim da podržim razvoj Franz-a.", 84 "pricing.link.skipPayment" : "Ne želim da podržim razvoj Franz-a.",
81 "pricing.submit.label" : "Želim da podržim razvoj Franz-a.", 85 "pricing.submit.label" : "Želim da podržim razvoj Franz-a.",
@@ -92,12 +96,12 @@
92 "settings.account.accountType.basic" : "Osnovni raÄun", 96 "settings.account.accountType.basic" : "Osnovni raÄun",
93 "settings.account.accountType.premium" : "Premium raÄun", 97 "settings.account.accountType.premium" : "Premium raÄun",
94 "settings.account.buttonSave" : "Ažuriraj profil", 98 "settings.account.buttonSave" : "Ažuriraj profil",
95 "settings.account.deleteAccount" : "Delete account", 99 "settings.account.deleteAccount" : "Обриши налог",
96 "settings.account.deleteEmailSent" : "You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", 100 "settings.account.deleteEmailSent" : "Добили Ñте имејл Ñа линком путем којег потврђујете бриÑање Ñвог налога. Ваш налог и подаци не могу бити повраћени!",
97 "settings.account.deleteInfo" : "If you don't need your Franz account any longer, you can delete your account and all related data here.", 101 "settings.account.deleteInfo" : "Уколико Вам више није потребан Франз налог, овде можете обриÑати Ñвој налог и Ñве податке везане за иÑти.",
98 "settings.account.headline" : "KorisniÄki nalog", 102 "settings.account.headline" : "KorisniÄki nalog",
99 "settings.account.headlineAccount" : "Podaci o nalogu", 103 "settings.account.headlineAccount" : "Podaci o nalogu",
100 "settings.account.headlineDangerZone" : "Danger Zone", 104 "settings.account.headlineDangerZone" : "Зона опреза",
101 "settings.account.headlineInvoices" : "Fakture", 105 "settings.account.headlineInvoices" : "Fakture",
102 "settings.account.headlinePassword" : "Promijenite lozinku", 106 "settings.account.headlinePassword" : "Promijenite lozinku",
103 "settings.account.headlineProfile" : "Ažurirajte profil", 107 "settings.account.headlineProfile" : "Ažurirajte profil",
@@ -108,40 +112,42 @@
108 "settings.account.successInfo" : "Vaše promjene su spremljene", 112 "settings.account.successInfo" : "Vaše promjene su spremljene",
109 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno", 113 "settings.account.tryReloadUserInfoRequest" : "Pokušajte ponovno",
110 "settings.account.userInfoRequestFailed" : "Nije moguće uÄitati informacije o korisniku", 114 "settings.account.userInfoRequestFailed" : "Nije moguće uÄitati informacije o korisniku",
111 "settings.app.buttonClearAllCache" : "Clear cache", 115 "settings.app.buttonClearAllCache" : "ОчиÑти кеш",
112 "settings.app.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje", 116 "settings.app.buttonInstallUpdate" : "Ponovo pokreni i instaliraj ažuriranje",
113 "settings.app.buttonSearchForUpdate" : "Potraži ažuriranja", 117 "settings.app.buttonSearchForUpdate" : "Potraži ažuriranja",
114 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.", 118 "settings.app.cacheInfo" : "Франз кеш тренутно кориÑти {величина} проÑтора на диÑку.",
115 "settings.app.currentVersion" : "Trenutna verzija:", 119 "settings.app.currentVersion" : "Trenutna verzija:",
116 "settings.app.form.autoLaunchInBackground" : "Otvori u pozadini", 120 "settings.app.form.autoLaunchInBackground" : "Otvori u pozadini",
117 "settings.app.form.autoLaunchOnStart" : "Pokreni Franz sa sistemom", 121 "settings.app.form.autoLaunchOnStart" : "Pokreni Franz sa sistemom",
118 "settings.app.form.beta" : "Obuhvati i beta verzije", 122 "settings.app.form.beta" : "Obuhvati i beta verzije",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
120 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 124 "settings.app.form.enableGPUAcceleration" : "Омогући убрзање графичке јединице",
125 "settings.app.form.enableMenuBar" : "Покажи Франз у менију",
121 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa", 126 "settings.app.form.enableSpellchecking" : "Omogući provjeru pravopisa",
122 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci", 127 "settings.app.form.enableSystemTray" : "Prikaži aplikaciju u sustavskoj traci",
123 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 128 "settings.app.form.hideDockIcon" : "Сакриј Франз иконицу у доку",
124 "settings.app.form.language" : "Jezik", 129 "settings.app.form.language" : "Jezik",
125 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku", 130 "settings.app.form.minimizeToSystemTray" : "Smanji Franca u sustavsku traku",
126 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren", 131 "settings.app.form.runInBackground" : "Neka se Franc održava u pozadini i ako je prozor zatvoren",
127 "settings.app.form.showDisabledServices" : "Prikaži ploÄe s onemogućenim servisima", 132 "settings.app.form.showDisabledServices" : "Prikaži ploÄe s onemogućenim servisima",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Show unread message badge when notifications are disabled", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Покажи беџ за непрочитане поруке када Ñу обавештења онемогућена",
129 "settings.app.headline" : "Postavke", 134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
135 "settings.app.headline" : "Подешавања",
130 "settings.app.headlineAdvanced" : "Napredne alatke", 136 "settings.app.headlineAdvanced" : "Napredne alatke",
131 "settings.app.headlineAppearance" : "Izgled", 137 "settings.app.headlineAppearance" : "Izgled",
132 "settings.app.headlineGeneral" : "Općenito", 138 "settings.app.headlineGeneral" : "Općenito",
133 "settings.app.headlineLanguage" : "Jezik", 139 "settings.app.headlineLanguage" : "Jezik",
134 "settings.app.headlineUpdates" : "Nadogradnje", 140 "settings.app.headlineUpdates" : "Nadogradnje",
135 "settings.app.restartRequired" : "Promjene postavki zahtijevaju ponovni pogon", 141 "settings.app.restartRequired" : "Promjene postavki zahtijevaju ponovni pogon",
136 "settings.app.subheadlineCache" : "Cache", 142 "settings.app.subheadlineCache" : "Кеш",
137 "settings.app.translationHelp" : "Pomozite nam prevesti aplikaciju na Vaš jezik. ", 143 "settings.app.translationHelp" : "Pomozite nam prevesti aplikaciju na Vaš jezik. ",
138 "settings.app.updateStatusAvailable" : "Nadogradnja dostupna, preuzimanje...", 144 "settings.app.updateStatusAvailable" : "Nadogradnja dostupna, preuzimanje...",
139 "settings.app.updateStatusSearching" : "Traže se ažuriranja", 145 "settings.app.updateStatusSearching" : "Traže se ažuriranja",
140 "settings.app.updateStatusUpToDate" : "Koristite najnoviju verziju Franca.", 146 "settings.app.updateStatusUpToDate" : "Koristite najnoviju verziju Franca.",
141 "settings.invite.headline" : "Invite Friends", 147 "settings.invite.headline" : "Позови пријатеље",
142 "settings.navigation.account" : "RaÄun", 148 "settings.navigation.account" : "RaÄun",
143 "settings.navigation.availableServices" : "Dostupne usluge", 149 "settings.navigation.availableServices" : "Dostupne usluge",
144 "settings.navigation.inviteFriends" : "Invite Friends", 150 "settings.navigation.inviteFriends" : "Позови пријатеље",
145 "settings.navigation.logout" : "Odjava", 151 "settings.navigation.logout" : "Odjava",
146 "settings.navigation.settings" : "Postavke", 152 "settings.navigation.settings" : "Postavke",
147 "settings.navigation.yourServices" : "Vaše usluge", 153 "settings.navigation.yourServices" : "Vaše usluge",
@@ -152,7 +158,7 @@
152 "settings.recipes.mostPopular" : "Najpopularniji", 158 "settings.recipes.mostPopular" : "Najpopularniji",
153 "settings.recipes.nothingFound" : "Žao nam je, ali ne postoje usluge koje se poklapaju s onima koje tražite", 159 "settings.recipes.nothingFound" : "Žao nam je, ali ne postoje usluge koje se poklapaju s onima koje tražite",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "Usluga uspješno dodana", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "Usluga uspješno dodana",
155 "settings.searchService" : "Search service", 161 "settings.searchService" : "Претражи уÑлуге",
156 "settings.service.error.goBack" : "Nazad do servisa", 162 "settings.service.error.goBack" : "Nazad do servisa",
157 "settings.service.error.headline" : "Greška ", 163 "settings.service.error.headline" : "Greška ",
158 "settings.service.error.message" : "Nemoguće uÄitati sadržaj usluge", 164 "settings.service.error.message" : "Nemoguće uÄitati sadržaj usluge",
@@ -165,24 +171,31 @@
165 "settings.service.form.deleteButton" : "Izbriši uslugu", 171 "settings.service.form.deleteButton" : "Izbriši uslugu",
166 "settings.service.form.editServiceHeadline" : "Uredite {ime}", 172 "settings.service.form.editServiceHeadline" : "Uredite {ime}",
167 "settings.service.form.enableAudio" : "Omogućite zvuk", 173 "settings.service.form.enableAudio" : "Omogućite zvuk",
168 "settings.service.form.enableBadge" : "Show unread message badges", 174 "settings.service.form.enableBadge" : "Покажи беџеве за непрочитане поруке",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Omogućite obavijesti", 176 "settings.service.form.enableNotification" : "Omogućite obavijesti",
170 "settings.service.form.enableService" : "Omogućite usluge", 177 "settings.service.form.enableService" : "Omogućite usluge",
171 "settings.service.form.headlineBadges" : "Unread message badges", 178 "settings.service.form.headlineBadges" : "Беџеви за непрочитане поруке",
172 "settings.service.form.headlineGeneral" : "Općenito", 179 "settings.service.form.headlineGeneral" : "Опште",
173 "settings.service.form.headlineNotifications" : "Notifications", 180 "settings.service.form.headlineNotifications" : "Обавештења",
174 "settings.service.form.icon" : "Custom icon", 181 "settings.service.form.icon" : "ПоÑебна иконица",
175 "settings.service.form.iconDelete" : "Delete", 182 "settings.service.form.iconDelete" : "Обриши",
176 "settings.service.form.iconUpload" : "Drop your image, or click here", 183 "settings.service.form.iconUpload" : "Превуци Ñлику или кликни овде",
177 "settings.service.form.indirectMessageInfo" : "Vi ćete biti obavješteni o svim novim porukama na kanalu, ne samo o @imenima, kanalima, @ovdje, ...", 184 "settings.service.form.indirectMessageInfo" : "Vi ćete biti obavješteni o svim novim porukama na kanalu, ne samo o @imenima, kanalima, @ovdje, ...",
178 "settings.service.form.indirectMessages" : "Prikaži znaÄku na svim novim porukuama", 185 "settings.service.form.indirectMessages" : "Prikaži znaÄku na svim novim porukuama",
179 "settings.service.form.isMutedInfo" : "Kada je onemogućeno, sve obavijesti, svi zvukovi i sva pozadinska podrÅ¡ka će biti neÄujna.", 186 "settings.service.form.isMutedInfo" : "Kada je onemogućeno, sve obavijesti, svi zvukovi i sva pozadinska podrÅ¡ka će biti neÄujna.",
180 "settings.service.form.name" : "Ime", 187 "settings.service.form.name" : "Ime",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "SaÄuvaj uslugu\/e", 194 "settings.service.form.saveButton" : "SaÄuvaj uslugu\/e",
182 "settings.service.form.tabHosted" : "Hostovano", 195 "settings.service.form.tabHosted" : "Hostovano",
183 "settings.service.form.tabOnPremise" : "Samo-hostovano â­ï¸", 196 "settings.service.form.tabOnPremise" : "Samo-hostovano â­ï¸",
184 "settings.service.form.team" : "Tim", 197 "settings.service.form.team" : "Tim",
185 "settings.service.form.useHostedService" : "Use the hosted {name} service.", 198 "settings.service.form.useHostedService" : "КориÑти хоÑтовану {име} уÑлугу.",
186 "settings.service.form.yourServices" : "Vaše usluge", 199 "settings.service.form.yourServices" : "Vaše usluge",
187 "settings.services.deletedInfo" : "Usluga je onemogućena", 200 "settings.services.deletedInfo" : "Usluga je onemogućena",
188 "settings.services.discoverServices" : "Pronađite usluge", 201 "settings.services.discoverServices" : "Pronađite usluge",
@@ -202,9 +215,9 @@
202 "settings.user.form.lastname" : "Prezime", 215 "settings.user.form.lastname" : "Prezime",
203 "settings.user.form.newPassword" : "Nova lozinka", 216 "settings.user.form.newPassword" : "Nova lozinka",
204 "sidebar.addNewService" : "Dodajte novu uslugu", 217 "sidebar.addNewService" : "Dodajte novu uslugu",
205 "sidebar.muteApp" : "Disable notifications & audio", 218 "sidebar.muteApp" : "Онемогући обавештења и звукове",
206 "sidebar.settings" : "Postavke", 219 "sidebar.settings" : "Postavke",
207 "sidebar.unmuteApp" : "Enable notifications & audio", 220 "sidebar.unmuteApp" : "ИÑкључи обавештења и звукове",
208 "signup.company.label" : "Tvrtka", 221 "signup.company.label" : "Tvrtka",
209 "signup.email.label" : "Vaša e-adresa", 222 "signup.email.label" : "Vaša e-adresa",
210 "signup.emailDuplicate" : "Već postoji korisnik s tom e-mail adresom", 223 "signup.emailDuplicate" : "Već postoji korisnik s tom e-mail adresom",
@@ -212,7 +225,7 @@
212 "signup.headline" : "Prijava", 225 "signup.headline" : "Prijava",
213 "signup.lastname.label" : "Prezime", 226 "signup.lastname.label" : "Prezime",
214 "signup.legal.info" : "Prilikom stvaranja Franz raÄuna, slažete se sa sljedećim stavkama", 227 "signup.legal.info" : "Prilikom stvaranja Franz raÄuna, slažete se sa sljedećim stavkama",
215 "signup.legal.privacy" : "Izjava o privatnosti", 228 "signup.legal.privacy" : "Изјава о приватноÑти",
216 "signup.legal.terms" : "Uvjeti korištenja", 229 "signup.legal.terms" : "Uvjeti korištenja",
217 "signup.link.login" : "Imate raÄun? Prijavite se.", 230 "signup.link.login" : "Imate raÄun? Prijavite se.",
218 "signup.password.label" : "Lozinka", 231 "signup.password.label" : "Lozinka",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje", 233 "subscription.euTaxInfo" : "EU državljani, upozerenje: Moguće taksiranje",
221 "subscription.features.ads" : "Bez reklama, doživotno!", 234 "subscription.features.ads" : "Bez reklama, doživotno!",
222 "subscription.features.comingSoon" : "Dolazi uskoro", 235 "subscription.features.comingSoon" : "Dolazi uskoro",
223 "subscription.features.customServices" : "Privatni servisi za Vas i Vaš tim",
224 "subscription.features.encryptedSync" : "Kodirano usklađivanje sesija.", 236 "subscription.features.encryptedSync" : "Kodirano usklađivanje sesija.",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Dodajte pretpostavljeni\/hostirani servis kao Å¡to ima usluga HipChat", 238 "subscription.features.onpremise" : "Dodajte pretpostavljeni\/hostirani servis kao Å¡to ima usluga HipChat",
226 "subscription.features.vpn" : "Podrška za Proxy i VPM ( VPN )", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Plaćeni\/Premium raÄun ukljuÄuje sljedeće:", 242 "subscription.includedFeatures" : "Plaćeni\/Premium raÄun ukljuÄuje sljedeće:",
228 "subscription.paymentSessionError" : "Nemoguće inicijalizirati obrazac za uplatu", 243 "subscription.paymentSessionError" : "Nemoguće inicijalizirati obrazac za uplatu",
229 "subscription.submit.label" : "Želim da podržim razvoj Franca.", 244 "subscription.submit.label" : "Želim da podržim razvoj Franca.",
@@ -236,15 +251,15 @@
236 "tabs.item.disableAudio" : "Onemogući zvuk", 251 "tabs.item.disableAudio" : "Onemogući zvuk",
237 "tabs.item.disableNotifications" : "Onemogući obavijesti", 252 "tabs.item.disableNotifications" : "Onemogući obavijesti",
238 "tabs.item.disableService" : "Onemogući servis", 253 "tabs.item.disableService" : "Onemogući servis",
239 "tabs.item.edit" : "Uredi", 254 "tabs.item.edit" : "Уреди",
240 "tabs.item.enableAudio" : "UkljuÄi zvuk", 255 "tabs.item.enableAudio" : "UkljuÄi zvuk",
241 "tabs.item.enableNotification" : "Omogući obavijesti", 256 "tabs.item.enableNotification" : "Omogući obavijesti",
242 "tabs.item.enableService" : "Omogući usluge", 257 "tabs.item.enableService" : "Omogući usluge",
243 "tabs.item.reload" : "Ponovno uÄitavanje", 258 "tabs.item.reload" : "Ponovno uÄitavanje",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{поље} није валидно",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "{поље} треба да буде најмање {дужина} карактера дугачко",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{поље} је неопходно",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field} није валидан УРЛ",
248 "welcome.loginButton" : "Prijavite se na raÄun", 263 "welcome.loginButton" : "Prijavite se na raÄun",
249 "welcome.signupButton" : "Stvorite novi korisniÄki raÄun", 264 "welcome.signupButton" : "Stvorite novi korisniÄki raÄun",
250 "welcome.slogan" : "Poruke koje su stvorene za tebe" 265 "welcome.slogan" : "Poruke koje su stvorene za tebe"
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index d03077d8d..130b51ddf 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -1,8 +1,11 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Franz hizmetlerine ÅŸu anda eriÅŸilemiyor.", 5 "global.api.unhealthy" : "Franz hizmetlerine ÅŸu anda eriÅŸilemiyor.",
3 "global.notConnectedToTheInternet" : "İnternete bağlı değilsiniz.", 6 "global.notConnectedToTheInternet" : "İnternete bağlı değilsiniz.",
4 "import.headline" : "Franz 4 servislerinizi ekleyin.", 7 "import.headline" : "Franz 4 servislerinizi ekleyin.",
5 "import.notSupportedHeadline" : "Servisler henüz Franz 5'te desteklenmiyor.", 8 "import.notSupportedHeadline" : "Servisler henüz Franz 5'de desteklenmiyor.",
6 "import.skip.label" : "Servisleri kendim eklemek istiyorum", 9 "import.skip.label" : "Servisleri kendim eklemek istiyorum",
7 "import.submit.label" : "Servisleri içe aktar", 10 "import.submit.label" : "Servisleri içe aktar",
8 "infobar.buttonChangelog" : "Yeni ne var?", 11 "infobar.buttonChangelog" : "Yeni ne var?",
@@ -21,7 +24,7 @@
21 "login.headline" : "Oturum Aç", 24 "login.headline" : "Oturum Aç",
22 "login.invalidCredentials" : "Yanlış parola ya da e-posta adresi", 25 "login.invalidCredentials" : "Yanlış parola ya da e-posta adresi",
23 "login.link.password" : "Parola sıfırla", 26 "login.link.password" : "Parola sıfırla",
24 "login.link.signup" : "Kullanıcı hesabı oluştur", 27 "login.link.signup" : "Ücretsiz hesap oluştur",
25 "login.password.label" : "Parola", 28 "login.password.label" : "Parola",
26 "login.serverLogout" : "Oturum süreniz dolmuş, lütfen tekrar giriş yapın.", 29 "login.serverLogout" : "Oturum süreniz dolmuş, lütfen tekrar giriş yapın.",
27 "login.submit.label" : "Oturum Aç", 30 "login.submit.label" : "Oturum Aç",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Bu e-posta adresinde bir kullanıcı bulunamadı", 79 "password.noUser" : "Bu e-posta adresinde bir kullanıcı bulunamadı",
77 "password.submit.label" : "Gönder", 80 "password.submit.label" : "Gönder",
78 "password.successInfo" : "E-postanızı kontrol ediniz", 81 "password.successInfo" : "E-postanızı kontrol ediniz",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Franz'ı Destekle", 83 "pricing.headline" : "Franz'ı Destekle",
80 "pricing.link.skipPayment" : "Franz'ın gelişimini desteklemek istemiyorum.", 84 "pricing.link.skipPayment" : "Franz'ın gelişimini desteklemek istemiyorum.",
81 "pricing.submit.label" : "Franz'ın gelişimini desteklemek istiyorum", 85 "pricing.submit.label" : "Franz'ın gelişimini desteklemek istiyorum",
@@ -84,7 +88,7 @@
84 "service.crashHandler.autoReload" : "{name}'i {seconds} saniye içerisinde otomatik onarmayı deniyoruz", 88 "service.crashHandler.autoReload" : "{name}'i {seconds} saniye içerisinde otomatik onarmayı deniyoruz",
85 "service.crashHandler.headline" : "Aman Tanrım hayır!", 89 "service.crashHandler.headline" : "Aman Tanrım hayır!",
86 "service.crashHandler.text" : "{name} bir hataya neden oldu.", 90 "service.crashHandler.text" : "{name} bir hataya neden oldu.",
87 "service.disabledHandler.action" : "AktifleÅŸtir {name}", 91 "service.disabledHandler.action" : "{name} aktif",
88 "service.disabledHandler.headline" : "{name} devredışı", 92 "service.disabledHandler.headline" : "{name} devredışı",
89 "services.getStarted" : "Haydi başlayalım", 93 "services.getStarted" : "Haydi başlayalım",
90 "services.welcome" : "Franz'a HoÅŸgeldiniz", 94 "services.welcome" : "Franz'a HoÅŸgeldiniz",
@@ -116,7 +120,8 @@
116 "settings.app.form.autoLaunchInBackground" : "Arka planda aç", 120 "settings.app.form.autoLaunchInBackground" : "Arka planda aç",
117 "settings.app.form.autoLaunchOnStart" : "Franz'ı başlangıçta aç", 121 "settings.app.form.autoLaunchOnStart" : "Franz'ı başlangıçta aç",
118 "settings.app.form.beta" : "Beta versiyonları dahil et", 122 "settings.app.form.beta" : "Beta versiyonları dahil et",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
124 "settings.app.form.enableGPUAcceleration" : "Grafik İşlemci Ünitesi (GPU) Hızlandırıcısını Aktif et",
120 "settings.app.form.enableMenuBar" : "Menü çubuğunda Franz'ı göster", 125 "settings.app.form.enableMenuBar" : "Menü çubuğunda Franz'ı göster",
121 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir", 126 "settings.app.form.enableSpellchecking" : "Yazım denetimini etkinleştir",
122 "settings.app.form.enableSystemTray" : "Franz'ı sistem tepsisinde göster", 127 "settings.app.form.enableSystemTray" : "Franz'ı sistem tepsisinde göster",
@@ -126,6 +131,7 @@
126 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut", 131 "settings.app.form.runInBackground" : "Pencereyi kapatırken Franz'ı arka planda tut",
127 "settings.app.form.showDisabledServices" : "Devre dışı bırakılan servis sekmelerini göster", 132 "settings.app.form.showDisabledServices" : "Devre dışı bırakılan servis sekmelerini göster",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Bildirimler kapalı iken okunmamış mesaj sayısını göster", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Bildirimler kapalı iken okunmamış mesaj sayısını göster",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "Ayarlar", 135 "settings.app.headline" : "Ayarlar",
130 "settings.app.headlineAdvanced" : "GeliÅŸmiÅŸ", 136 "settings.app.headlineAdvanced" : "GeliÅŸmiÅŸ",
131 "settings.app.headlineAppearance" : "Görünüm", 137 "settings.app.headlineAppearance" : "Görünüm",
@@ -166,6 +172,7 @@
166 "settings.service.form.editServiceHeadline" : "{name} düzenle", 172 "settings.service.form.editServiceHeadline" : "{name} düzenle",
167 "settings.service.form.enableAudio" : "Sesi etkinleÅŸtirin", 173 "settings.service.form.enableAudio" : "Sesi etkinleÅŸtirin",
168 "settings.service.form.enableBadge" : "Okunmamış mesajları göster", 174 "settings.service.form.enableBadge" : "Okunmamış mesajları göster",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Bildirimleri etkinleÅŸtir", 176 "settings.service.form.enableNotification" : "Bildirimleri etkinleÅŸtir",
170 "settings.service.form.enableService" : "Servisi etkinleÅŸtir", 177 "settings.service.form.enableService" : "Servisi etkinleÅŸtir",
171 "settings.service.form.headlineBadges" : "Okunmamış mesajlar", 178 "settings.service.form.headlineBadges" : "Okunmamış mesajlar",
@@ -178,6 +185,12 @@
178 "settings.service.form.indirectMessages" : "Mesaj rozetini tüm yeni mesajlar için göster", 185 "settings.service.form.indirectMessages" : "Mesaj rozetini tüm yeni mesajlar için göster",
179 "settings.service.form.isMutedInfo" : "Devre dışı bırakıldığında, tüm bildirim sesleri sessize alınır", 186 "settings.service.form.isMutedInfo" : "Devre dışı bırakıldığında, tüm bildirim sesleri sessize alınır",
180 "settings.service.form.name" : "Ä°sim", 187 "settings.service.form.name" : "Ä°sim",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Servisi kaydet", 194 "settings.service.form.saveButton" : "Servisi kaydet",
182 "settings.service.form.tabHosted" : "Barındırılan", 195 "settings.service.form.tabHosted" : "Barındırılan",
183 "settings.service.form.tabOnPremise" : "Kendi barındırılan", 196 "settings.service.form.tabOnPremise" : "Kendi barındırılan",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "AB vatandaşları: yerel satış vergileri uygulanabilir", 233 "subscription.euTaxInfo" : "AB vatandaşları: yerel satış vergileri uygulanabilir",
221 "subscription.features.ads" : "Reklam yok, asla!", 234 "subscription.features.ads" : "Reklam yok, asla!",
222 "subscription.features.comingSoon" : "yakında geliyor", 235 "subscription.features.comingSoon" : "yakında geliyor",
223 "subscription.features.customServices" : "Sen ve takımın için gizli servis",
224 "subscription.features.encryptedSync" : "Åžifreli oturum senkronizasyonu", 236 "subscription.features.encryptedSync" : "Åžifreli oturum senkronizasyonu",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "HipChat gibi kurum içi\/barındırılan hizmetler ekle", 238 "subscription.features.onpremise" : "HipChat gibi kurum içi\/barındırılan hizmetler ekle",
226 "subscription.features.vpn" : "Proxy & VPN desteÄŸi", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Ücretli Franz Premium Destekçi Hesabına dahil", 242 "subscription.includedFeatures" : "Ücretli Franz Premium Destekçi Hesabına dahil",
228 "subscription.paymentSessionError" : "Ödeme formu başlatılamadı", 243 "subscription.paymentSessionError" : "Ödeme formu başlatılamadı",
229 "subscription.submit.label" : "Franz'ın gelişimini desteklemek istiyorum", 244 "subscription.submit.label" : "Franz'ın gelişimini desteklemek istiyorum",
diff --git a/src/i18n/locales/uk.json b/src/i18n/locales/uk.json
index 3f732b896..94c6f7e54 100644
--- a/src/i18n/locales/uk.json
+++ b/src/i18n/locales/uk.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "Ðе можна підключитиÑÑŒ до онлайн ÑервіÑів Franz", 5 "global.api.unhealthy" : "Ðе можна підключитиÑÑŒ до онлайн ÑервіÑів Franz",
3 "global.notConnectedToTheInternet" : "Ви не підключені до Інтернету.", 6 "global.notConnectedToTheInternet" : "Ви не підключені до Інтернету.",
4 "import.headline" : "Імпортувати ваші ÑервіÑи з Franz 4", 7 "import.headline" : "Імпортувати ваші ÑервіÑи з Franz 4",
@@ -26,49 +29,49 @@
26 "login.serverLogout" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, зайдіть знову.", 29 "login.serverLogout" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, зайдіть знову.",
27 "login.submit.label" : "Увійти", 30 "login.submit.label" : "Увійти",
28 "login.tokenExpired" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, зайдіть знову.", 31 "login.tokenExpired" : "Ваша ÑеÑÑ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑŒ, будь лаÑка, зайдіть знову.",
29 "menu.app.about" : "About Franz", 32 "menu.app.about" : "Про Franz",
30 "menu.app.hide" : "Hide", 33 "menu.app.hide" : "Приховати",
31 "menu.app.hideOthers" : "Hide Others", 34 "menu.app.hideOthers" : "Приховати інші",
32 "menu.app.quit" : "Quit", 35 "menu.app.quit" : "Вийти",
33 "menu.app.settings" : "ÐалаштуваннÑ", 36 "menu.app.settings" : "ÐалаштуваннÑ",
34 "menu.app.unhide" : "Unhide", 37 "menu.app.unhide" : "Показати",
35 "menu.edit" : "Редагувати", 38 "menu.edit" : "Редагувати",
36 "menu.edit.copy" : "Copy", 39 "menu.edit.copy" : "Копіювати",
37 "menu.edit.cut" : "Cut", 40 "menu.edit.cut" : "Вирізати",
38 "menu.edit.delete" : "Видалити", 41 "menu.edit.delete" : "Видалити",
39 "menu.edit.emojiSymbols" : "Emoji & Symbols", 42 "menu.edit.emojiSymbols" : "Емодзі та Ñимволи",
40 "menu.edit.paste" : "Paste", 43 "menu.edit.paste" : "Ð’Ñтавити",
41 "menu.edit.pasteAndMatchStyle" : "Paste And Match Style", 44 "menu.edit.pasteAndMatchStyle" : "Ð’Ñтавити з дотриманнÑм Ñтилю",
42 "menu.edit.redo" : "Redo", 45 "menu.edit.redo" : "Повернути",
43 "menu.edit.selectAll" : "Select All", 46 "menu.edit.selectAll" : "Виділити вÑе",
44 "menu.edit.speech" : "Speech", 47 "menu.edit.speech" : "Мова",
45 "menu.edit.startDictation" : "Start Dictation", 48 "menu.edit.startDictation" : "Почати диктувати",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "Почати говорити",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "Закінчити говорити",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "Відмінити",
49 "menu.file" : "File", 52 "menu.file" : "Файл",
50 "menu.help" : "Help", 53 "menu.help" : "Довідка",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "Журнал змін",
52 "menu.help.learnMore" : "Learn More", 55 "menu.help.learnMore" : "Докладніше",
53 "menu.help.privacy" : "ЗаÑва про конфіденційніÑÑ‚ÑŒ", 56 "menu.help.privacy" : "ЗаÑва про конфіденційніÑÑ‚ÑŒ",
54 "menu.help.support" : "Support", 57 "menu.help.support" : "Підтримка",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "Умови викориÑтаннÑ",
56 "menu.services" : "Services", 59 "menu.services" : "Служби",
57 "menu.services.addNewService" : "Add New Service...", 60 "menu.services.addNewService" : "Додати ÑервіÑ",
58 "menu.view" : "View", 61 "menu.view" : "ВиглÑд",
59 "menu.view.enterFullScreen" : "Enter Full Screen", 62 "menu.view.enterFullScreen" : "Вікно на повний екран",
60 "menu.view.exitFullScreen" : "Exit Full Screen", 63 "menu.view.exitFullScreen" : "Вийти з повного екрану",
61 "menu.view.reloadFranz" : "Reload Franz", 64 "menu.view.reloadFranz" : "Перезавантажити Franz",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "Перезавантажити ÑервіÑ",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "Фактичний розмір",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "Переключити інÑтрумент розробника",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "ПереключитиÑÑ Ð½Ð° повний екран",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "Переключити інÑтрументи розробника ÑервіÑу",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "Збільшити маÑштаб",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "Зменьшити маÑштаб",
69 "menu.window" : "Window", 72 "menu.window" : "Вікно",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "Закрити",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "Згорнути",
72 "password.email.label" : "Email адреÑа", 75 "password.email.label" : "Email адреÑа",
73 "password.headline" : "Скинути пароль", 76 "password.headline" : "Скинути пароль",
74 "password.link.login" : "Увійти до вашого акаунту", 77 "password.link.login" : "Увійти до вашого акаунту",
@@ -76,6 +79,7 @@
76 "password.noUser" : "Ðе знайдено жодного кориÑтувача з цією email адреÑою", 79 "password.noUser" : "Ðе знайдено жодного кориÑтувача з цією email адреÑою",
77 "password.submit.label" : "Подати", 80 "password.submit.label" : "Подати",
78 "password.successInfo" : "Будь лаÑка, перевірте ваш email", 81 "password.successInfo" : "Будь лаÑка, перевірте ваш email",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "Підтримайте Franz", 83 "pricing.headline" : "Підтримайте Franz",
80 "pricing.link.skipPayment" : "Я не хочу підтримувати розробку Franz.", 84 "pricing.link.skipPayment" : "Я не хочу підтримувати розробку Franz.",
81 "pricing.submit.label" : "Я хочу підтримати розробку Franz", 85 "pricing.submit.label" : "Я хочу підтримати розробку Franz",
@@ -93,7 +97,7 @@
93 "settings.account.accountType.premium" : "Преміум Ðкаунт Прихильника", 97 "settings.account.accountType.premium" : "Преміум Ðкаунт Прихильника",
94 "settings.account.buttonSave" : "Оновити профіль", 98 "settings.account.buttonSave" : "Оновити профіль",
95 "settings.account.deleteAccount" : "Видалити обліковий запиÑ", 99 "settings.account.deleteAccount" : "Видалити обліковий запиÑ",
96 "settings.account.deleteEmailSent" : "Ви отримали електронного лиÑта з лінком, щоб підтвердити Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу. Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ– дані не можна буде відновити!", 100 "settings.account.deleteEmailSent" : "Ви отримали електронного лиÑта з поÑиланнÑм, щоб підтвердити Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу. Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ– дані не можна буде відновити!",
97 "settings.account.deleteInfo" : "Якщо Вам більше не потрібний обліковий Ð·Ð°Ð¿Ð¸Ñ Franz, Ви можете його видалити Ñ– вÑÑ– Ñуміжні дані.", 101 "settings.account.deleteInfo" : "Якщо Вам більше не потрібний обліковий Ð·Ð°Ð¿Ð¸Ñ Franz, Ви можете його видалити Ñ– вÑÑ– Ñуміжні дані.",
98 "settings.account.headline" : "Ðкаунт", 102 "settings.account.headline" : "Ðкаунт",
99 "settings.account.headlineAccount" : "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ акаунт", 103 "settings.account.headlineAccount" : "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ акаунт",
@@ -111,23 +115,25 @@
111 "settings.app.buttonClearAllCache" : "ОчиÑтити кеш", 115 "settings.app.buttonClearAllCache" : "ОчиÑтити кеш",
112 "settings.app.buttonInstallUpdate" : "Перезавантажити Ñ– вÑтановити оновленнÑ", 116 "settings.app.buttonInstallUpdate" : "Перезавантажити Ñ– вÑтановити оновленнÑ",
113 "settings.app.buttonSearchForUpdate" : "Перевірити наÑвніÑÑ‚ÑŒ оновлень", 117 "settings.app.buttonSearchForUpdate" : "Перевірити наÑвніÑÑ‚ÑŒ оновлень",
114 "settings.app.cacheInfo" : "Кеш, Ñкий викориÑтовує Franz, займає {розмір} диÑку.", 118 "settings.app.cacheInfo" : "Кеш, Ñкий викориÑтовує Franz, займає {size} диÑкового проÑтору.",
115 "settings.app.currentVersion" : "Поточна верÑÑ–Ñ:", 119 "settings.app.currentVersion" : "Поточна верÑÑ–Ñ:",
116 "settings.app.form.autoLaunchInBackground" : "Відкрити у фоновому режимі", 120 "settings.app.form.autoLaunchInBackground" : "Відкрити у фоновому режимі",
117 "settings.app.form.autoLaunchOnStart" : "ЗапуÑкати Franz на початку", 121 "settings.app.form.autoLaunchOnStart" : "ЗапуÑкати Franz на початку",
118 "settings.app.form.beta" : "Включити бета-верÑÑ–Ñ—", 122 "settings.app.form.beta" : "Включити бета-верÑÑ–Ñ—",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
124 "settings.app.form.enableGPUAcceleration" : "Ввімкнути приÑÐºÐ¾Ñ€ÐµÐ½Ð½Ñ GPU",
120 "settings.app.form.enableMenuBar" : "Відображати Franz в панелі головного меню", 125 "settings.app.form.enableMenuBar" : "Відображати Franz в панелі головного меню",
121 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії", 126 "settings.app.form.enableSpellchecking" : "Увімкнути перевірку орфографії",
122 "settings.app.form.enableSystemTray" : "Показувати Franz у ÑиÑтемному лотку", 127 "settings.app.form.enableSystemTray" : "Показувати Franz у ÑиÑтемному лотку",
123 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 128 "settings.app.form.hideDockIcon" : "Сховати значок Franz в Dock",
124 "settings.app.form.language" : "Мова", 129 "settings.app.form.language" : "Мова",
125 "settings.app.form.minimizeToSystemTray" : "Мінімізувати Franz до ÑиÑтемного лотка", 130 "settings.app.form.minimizeToSystemTray" : "Мінімізувати Franz до ÑиÑтемного лотка",
126 "settings.app.form.runInBackground" : "Тримати Franz в фоні при закритті вікна", 131 "settings.app.form.runInBackground" : "Тримати Franz в фоні при закритті вікна",
127 "settings.app.form.showDisabledServices" : "Показати вкладку вимкнених ÑервіÑів", 132 "settings.app.form.showDisabledServices" : "Показати вкладку вимкнених ÑервіÑів",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "Показувати значок непрочитаних повідомлень коли ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ñ–", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "Показувати значок непрочитаних повідомлень коли ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ñ–",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "ÐалаштуваннÑ", 135 "settings.app.headline" : "ÐалаштуваннÑ",
130 "settings.app.headlineAdvanced" : "Advanced", 136 "settings.app.headlineAdvanced" : "Додаткові налаштуваннÑ",
131 "settings.app.headlineAppearance" : "ВиглÑд", 137 "settings.app.headlineAppearance" : "ВиглÑд",
132 "settings.app.headlineGeneral" : "Загальні", 138 "settings.app.headlineGeneral" : "Загальні",
133 "settings.app.headlineLanguage" : "Мова", 139 "settings.app.headlineLanguage" : "Мова",
@@ -152,7 +158,7 @@
152 "settings.recipes.mostPopular" : "Ðайбільш популÑрні", 158 "settings.recipes.mostPopular" : "Ðайбільш популÑрні",
153 "settings.recipes.nothingFound" : "Вибачте, але жоден ÑÐµÑ€Ð²Ñ–Ñ Ð½Ðµ відповідає пошуковому терміну.", 159 "settings.recipes.nothingFound" : "Вибачте, але жоден ÑÐµÑ€Ð²Ñ–Ñ Ð½Ðµ відповідає пошуковому терміну.",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "Ð¡ÐµÑ€Ð²Ñ–Ñ ÑƒÑпішно додано", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "Ð¡ÐµÑ€Ð²Ñ–Ñ ÑƒÑпішно додано",
155 "settings.searchService" : "Search service", 161 "settings.searchService" : "Знайти ÑервіÑ",
156 "settings.service.error.goBack" : "ПовернутиÑÑŒ до ÑервіÑів", 162 "settings.service.error.goBack" : "ПовернутиÑÑŒ до ÑервіÑів",
157 "settings.service.error.headline" : "Помилка", 163 "settings.service.error.headline" : "Помилка",
158 "settings.service.error.message" : "Ðе вдалоÑÑŒ завантажити Ñерверний протокол.", 164 "settings.service.error.message" : "Ðе вдалоÑÑŒ завантажити Ñерверний протокол.",
@@ -165,10 +171,11 @@
165 "settings.service.form.deleteButton" : "Видалити ÑервіÑ", 171 "settings.service.form.deleteButton" : "Видалити ÑервіÑ",
166 "settings.service.form.editServiceHeadline" : "Редагувати {name}", 172 "settings.service.form.editServiceHeadline" : "Редагувати {name}",
167 "settings.service.form.enableAudio" : "Увімкнути звук", 173 "settings.service.form.enableAudio" : "Увімкнути звук",
168 "settings.service.form.enableBadge" : "Show unread message badges", 174 "settings.service.form.enableBadge" : "Показувати непрочитані повідомленнÑ",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "Увімкнути ÑповіщеннÑ", 176 "settings.service.form.enableNotification" : "Увімкнути ÑповіщеннÑ",
170 "settings.service.form.enableService" : "Увімкнути ÑервіÑ", 177 "settings.service.form.enableService" : "Увімкнути ÑервіÑ",
171 "settings.service.form.headlineBadges" : "Unread message badges", 178 "settings.service.form.headlineBadges" : "Значки непрочитаних повідомлень",
172 "settings.service.form.headlineGeneral" : "Загальні", 179 "settings.service.form.headlineGeneral" : "Загальні",
173 "settings.service.form.headlineNotifications" : "СповіщеннÑ", 180 "settings.service.form.headlineNotifications" : "СповіщеннÑ",
174 "settings.service.form.icon" : "Ð¡Ð²Ð¾Ñ Ñ–ÐºÐ¾Ð½ÐºÐ°", 181 "settings.service.form.icon" : "Ð¡Ð²Ð¾Ñ Ñ–ÐºÐ¾Ð½ÐºÐ°",
@@ -176,13 +183,19 @@
176 "settings.service.form.iconUpload" : "Скиньте Ñвоє Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ натиÑніть тут", 183 "settings.service.form.iconUpload" : "Скиньте Ñвоє Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ натиÑніть тут",
177 "settings.service.form.indirectMessageInfo" : "Ви отримаєте ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ вÑÑ– нові Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð² каналі, а не лише про @username, @channel, @here, ...", 184 "settings.service.form.indirectMessageInfo" : "Ви отримаєте ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ вÑÑ– нові Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð² каналі, а не лише про @username, @channel, @here, ...",
178 "settings.service.form.indirectMessages" : "Показувати значок Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ–Ñ… нових повідомлень", 185 "settings.service.form.indirectMessages" : "Показувати значок Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ–Ñ… нових повідомлень",
179 "settings.service.form.isMutedInfo" : "When disabled, all notification sounds and audio playback are muted", 186 "settings.service.form.isMutedInfo" : "Коли вимкнено, вÑÑ– ÑÐ¿Ð¾Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð° Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ–Ð³Ð½Ð¾Ñ€ÑƒÑŽÑ‚ÑŒÑÑ",
180 "settings.service.form.name" : "Ім'Ñ", 187 "settings.service.form.name" : "Ім'Ñ",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "Зберегти ÑервіÑ", 194 "settings.service.form.saveButton" : "Зберегти ÑервіÑ",
182 "settings.service.form.tabHosted" : "Розміщений", 195 "settings.service.form.tabHosted" : "Розміщений",
183 "settings.service.form.tabOnPremise" : "СамоÑтійно розміщений â­ï¸", 196 "settings.service.form.tabOnPremise" : "СамоÑтійно розміщений â­ï¸",
184 "settings.service.form.team" : "Команда", 197 "settings.service.form.team" : "Команда",
185 "settings.service.form.useHostedService" : "Use the hosted {name} service.", 198 "settings.service.form.useHostedService" : "Викоритати розміщений {name} ÑервіÑ.",
186 "settings.service.form.yourServices" : "Ваші ÑервіÑи", 199 "settings.service.form.yourServices" : "Ваші ÑервіÑи",
187 "settings.services.deletedInfo" : "Ð¡ÐµÑ€Ð²Ñ–Ñ Ð±ÑƒÐ»Ð¾ видалено", 200 "settings.services.deletedInfo" : "Ð¡ÐµÑ€Ð²Ñ–Ñ Ð±ÑƒÐ»Ð¾ видалено",
188 "settings.services.discoverServices" : "Відкрийте Ð´Ð»Ñ Ñебе ÑервіÑи", 201 "settings.services.discoverServices" : "Відкрийте Ð´Ð»Ñ Ñебе ÑервіÑи",
@@ -212,7 +225,7 @@
212 "signup.headline" : "Увійти", 225 "signup.headline" : "Увійти",
213 "signup.lastname.label" : "Прізвище", 226 "signup.lastname.label" : "Прізвище",
214 "signup.legal.info" : "СтвореннÑм акаунту Franz ви приймаєте", 227 "signup.legal.info" : "СтвореннÑм акаунту Franz ви приймаєте",
215 "signup.legal.privacy" : "ÐаÑва про конфіденційніÑÑ‚ÑŒ", 228 "signup.legal.privacy" : "Політика конфіденційноÑÑ‚Ñ",
216 "signup.legal.terms" : "Умови викориÑтаннÑ", 229 "signup.legal.terms" : "Умови викориÑтаннÑ",
217 "signup.link.login" : "У Ð²Ð°Ñ Ð²Ð¶Ðµ Ñ” обліковий запиÑ, увійти?", 230 "signup.link.login" : "У Ð²Ð°Ñ Ð²Ð¶Ðµ Ñ” обліковий запиÑ, увійти?",
218 "signup.password.label" : "Пароль", 231 "signup.password.label" : "Пароль",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "Ð”Ð»Ñ Ð¶Ð¸Ñ‚ÐµÐ»Ñ–Ð² ЄС: можуть заÑтоÑовуватиÑÑ Ð¿Ð¾Ð´Ð°Ñ‚ÐºÐ¸", 233 "subscription.euTaxInfo" : "Ð”Ð»Ñ Ð¶Ð¸Ñ‚ÐµÐ»Ñ–Ð² ЄС: можуть заÑтоÑовуватиÑÑ Ð¿Ð¾Ð´Ð°Ñ‚ÐºÐ¸",
221 "subscription.features.ads" : "Жодної реклами!", 234 "subscription.features.ads" : "Жодної реклами!",
222 "subscription.features.comingSoon" : "очікуйте незабаром", 235 "subscription.features.comingSoon" : "очікуйте незабаром",
223 "subscription.features.customServices" : "Приватні ÑервіÑи Ð´Ð»Ñ Ð²Ð°Ñ Ñ– вашої команди",
224 "subscription.features.encryptedSync" : "Шифрована ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÑеанÑу", 236 "subscription.features.encryptedSync" : "Шифрована ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÑеанÑу",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "Додайте on-premise \/ hosted ÑервіÑи, такі Ñк Hipchat", 238 "subscription.features.onpremise" : "Додайте on-premise \/ hosted ÑервіÑи, такі Ñк Hipchat",
226 "subscription.features.vpn" : "Підтримка прокÑÑ– та VPN", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "Платний Преміальний Ðкаунт Прихильника Franz включає", 242 "subscription.includedFeatures" : "Платний Преміальний Ðкаунт Прихильника Franz включає",
228 "subscription.paymentSessionError" : "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ форму платежу", 243 "subscription.paymentSessionError" : "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ форму платежу",
229 "subscription.submit.label" : "Я хочу підтримати розробку Franz", 244 "subscription.submit.label" : "Я хочу підтримати розробку Franz",
@@ -241,10 +256,10 @@
241 "tabs.item.enableNotification" : "Увімкнути ÑповіщеннÑ", 256 "tabs.item.enableNotification" : "Увімкнути ÑповіщеннÑ",
242 "tabs.item.enableService" : "Увімкнути Ñлужбу", 257 "tabs.item.enableService" : "Увімкнути Ñлужбу",
243 "tabs.item.reload" : "Перезавантажити", 258 "tabs.item.reload" : "Перезавантажити",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{field} не валідне",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "КількіÑÑ‚ÑŒ Ñимволів в {field} повина бути не меньше {length} ",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{field} обов'Ñзвоке",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field} не валідний URL",
248 "welcome.loginButton" : "Увійдіть до Ñвого акаунту", 263 "welcome.loginButton" : "Увійдіть до Ñвого акаунту",
249 "welcome.signupButton" : "Створити безплатний акаунт", 264 "welcome.signupButton" : "Створити безплатний акаунт",
250 "welcome.slogan" : "Обмін повідомленнÑми, Ñкий працює Ð´Ð»Ñ Ð²Ð°Ñ" 265 "welcome.slogan" : "Обмін повідомленнÑми, Ñкий працює Ð´Ð»Ñ Ð²Ð°Ñ"
diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json
index 3bbcc8288..23bff247d 100644
--- a/src/i18n/locales/zh-TW.json
+++ b/src/i18n/locales/zh-TW.json
@@ -1,4 +1,7 @@
1{ 1{
2 "feature.delayApp.action" : "Get a Franz Supporter License",
3 "feature.delayApp.headline" : "Please purchase a Franz Supporter License to skip waiting",
4 "feature.delayApp.text" : "Franz will continue in {seconds} seconds.",
2 "global.api.unhealthy" : "無法連線至Franz的伺æœå™¨ã€‚", 5 "global.api.unhealthy" : "無法連線至Franz的伺æœå™¨ã€‚",
3 "global.notConnectedToTheInternet" : "你沒有連上網路。", 6 "global.notConnectedToTheInternet" : "你沒有連上網路。",
4 "import.headline" : "匯入Franz 4çš„æœå‹™", 7 "import.headline" : "匯入Franz 4çš„æœå‹™",
@@ -43,32 +46,32 @@
43 "menu.edit.selectAll" : "é¸æ“‡æ‰€æœ‰", 46 "menu.edit.selectAll" : "é¸æ“‡æ‰€æœ‰",
44 "menu.edit.speech" : "朗讀", 47 "menu.edit.speech" : "朗讀",
45 "menu.edit.startDictation" : "開始è½å¯«", 48 "menu.edit.startDictation" : "開始è½å¯«",
46 "menu.edit.startSpeaking" : "Start Speaking", 49 "menu.edit.startSpeaking" : "開始語音",
47 "menu.edit.stopSpeaking" : "Stop Speaking", 50 "menu.edit.stopSpeaking" : "åœæ­¢èªžéŸ³",
48 "menu.edit.undo" : "Undo", 51 "menu.edit.undo" : "復原",
49 "menu.file" : "File", 52 "menu.file" : "檔案",
50 "menu.help" : "Help", 53 "menu.help" : "求助",
51 "menu.help.changelog" : "Changelog", 54 "menu.help.changelog" : "變更紀錄",
52 "menu.help.learnMore" : "Learn More", 55 "menu.help.learnMore" : "深入瞭解",
53 "menu.help.privacy" : "éš±ç§è²æ˜Ž", 56 "menu.help.privacy" : "éš±ç§è²æ˜Ž",
54 "menu.help.support" : "Support", 57 "menu.help.support" : "支æ´",
55 "menu.help.tos" : "Terms of Service", 58 "menu.help.tos" : "æœå‹™æ¢æ¬¾",
56 "menu.services" : "Services", 59 "menu.services" : "æœå‹™",
57 "menu.services.addNewService" : "Add New Service...", 60 "menu.services.addNewService" : "新增æœå‹™",
58 "menu.view" : "View", 61 "menu.view" : "檢視",
59 "menu.view.enterFullScreen" : "Enter Full Screen", 62 "menu.view.enterFullScreen" : "進入全螢幕模å¼",
60 "menu.view.exitFullScreen" : "Exit Full Screen", 63 "menu.view.exitFullScreen" : "離開全螢幕模å¼",
61 "menu.view.reloadFranz" : "Reload Franz", 64 "menu.view.reloadFranz" : "é‡æ–°è¼‰å…¥Franz",
62 "menu.view.reloadService" : "Reload Service", 65 "menu.view.reloadService" : "é‡æ–°è¼‰å…¥æœå‹™",
63 "menu.view.resetZoom" : "Actual Size", 66 "menu.view.resetZoom" : "實際大å°",
64 "menu.view.toggleDevTools" : "Toggle Developer Tools", 67 "menu.view.toggleDevTools" : "切æ›é–‹ç™¼è€…工具",
65 "menu.view.toggleFullScreen" : "Toggle Full Screen", 68 "menu.view.toggleFullScreen" : "切æ›å…¨èž¢å¹•",
66 "menu.view.toggleServiceDevTools" : "Toggle Service Developer Tools", 69 "menu.view.toggleServiceDevTools" : "切æ›æœå‹™é–‹ç™¼è€…工具",
67 "menu.view.zoomIn" : "Zoom In", 70 "menu.view.zoomIn" : "放大",
68 "menu.view.zoomOut" : "Zoom Out", 71 "menu.view.zoomOut" : "縮å°",
69 "menu.window" : "Window", 72 "menu.window" : "視窗",
70 "menu.window.close" : "Close", 73 "menu.window.close" : "關閉",
71 "menu.window.minimize" : "Minimize", 74 "menu.window.minimize" : "最å°åŒ–",
72 "password.email.label" : "é›»å­éƒµä»¶åœ°å€", 75 "password.email.label" : "é›»å­éƒµä»¶åœ°å€",
73 "password.headline" : "é‡è¨­å¯†ç¢¼", 76 "password.headline" : "é‡è¨­å¯†ç¢¼",
74 "password.link.login" : "登入您的帳號", 77 "password.link.login" : "登入您的帳號",
@@ -76,6 +79,7 @@
76 "password.noUser" : "找ä¸åˆ°è©²é›»å­éƒµä»¶åœ°å€çš„用戶", 79 "password.noUser" : "找ä¸åˆ°è©²é›»å­éƒµä»¶åœ°å€çš„用戶",
77 "password.submit.label" : "é€å‡º", 80 "password.submit.label" : "é€å‡º",
78 "password.successInfo" : "請檢查您的電å­éƒµä»¶", 81 "password.successInfo" : "請檢查您的電å­éƒµä»¶",
82 "premiumFeature.button.upgradeAccount" : "Upgrade account",
79 "pricing.headline" : "支æŒFranz", 83 "pricing.headline" : "支æŒFranz",
80 "pricing.link.skipPayment" : "我ä¸æƒ³æ”¯æŒFranz的開發。", 84 "pricing.link.skipPayment" : "我ä¸æƒ³æ”¯æŒFranz的開發。",
81 "pricing.submit.label" : "我想支æŒFranz的開發。", 85 "pricing.submit.label" : "我想支æŒFranz的開發。",
@@ -111,21 +115,23 @@
111 "settings.app.buttonClearAllCache" : "清除快å–", 115 "settings.app.buttonClearAllCache" : "清除快å–",
112 "settings.app.buttonInstallUpdate" : "é‡æ–°å•Ÿå‹•ä¸¦å®‰è£æ›´æ–°", 116 "settings.app.buttonInstallUpdate" : "é‡æ–°å•Ÿå‹•ä¸¦å®‰è£æ›´æ–°",
113 "settings.app.buttonSearchForUpdate" : "檢查更新", 117 "settings.app.buttonSearchForUpdate" : "檢查更新",
114 "settings.app.cacheInfo" : "Franz cache is currently using {size} of disk space.", 118 "settings.app.cacheInfo" : "Franzå¿«å–ç›®å‰å ç”¨ç£ç¢Ÿç©ºé–“{大å°}。",
115 "settings.app.currentVersion" : "ç›®å‰çš„版本", 119 "settings.app.currentVersion" : "ç›®å‰çš„版本",
116 "settings.app.form.autoLaunchInBackground" : "在背景開啟", 120 "settings.app.form.autoLaunchInBackground" : "在背景開啟",
117 "settings.app.form.autoLaunchOnStart" : "開機時啟動Franz", 121 "settings.app.form.autoLaunchOnStart" : "開機時啟動Franz",
118 "settings.app.form.beta" : "包å«æ¸¬è©¦ç‰ˆ", 122 "settings.app.form.beta" : "包å«æ¸¬è©¦ç‰ˆ",
119 "settings.app.form.enableGPUAcceleration" : "Enable GPU Acceleration", 123 "settings.app.form.darkMode" : "Join the Dark Side",
120 "settings.app.form.enableMenuBar" : "Show Franz in Menu Bar", 124 "settings.app.form.enableGPUAcceleration" : "啟用GPU加速",
125 "settings.app.form.enableMenuBar" : "顯示Franz在é¸å–®åˆ—",
121 "settings.app.form.enableSpellchecking" : "啟用拼字檢查", 126 "settings.app.form.enableSpellchecking" : "啟用拼字檢查",
122 "settings.app.form.enableSystemTray" : "顯示Franz在系統列", 127 "settings.app.form.enableSystemTray" : "顯示Franz在系統列",
123 "settings.app.form.hideDockIcon" : "Hide Franz icon in Dock", 128 "settings.app.form.hideDockIcon" : "在工作列中隱è—Franz圖示",
124 "settings.app.form.language" : "語言", 129 "settings.app.form.language" : "語言",
125 "settings.app.form.minimizeToSystemTray" : "最å°åŒ–Franz到系統列", 130 "settings.app.form.minimizeToSystemTray" : "最å°åŒ–Franz到系統列",
126 "settings.app.form.runInBackground" : "當關閉視窗時ä¿æŒFranz在背景é‹ä½œ", 131 "settings.app.form.runInBackground" : "當關閉視窗時ä¿æŒFranz在背景é‹ä½œ",
127 "settings.app.form.showDisabledServices" : "顯示åœç”¨çš„æœå‹™æ¨™ç±¤", 132 "settings.app.form.showDisabledServices" : "顯示åœç”¨çš„æœå‹™æ¨™ç±¤",
128 "settings.app.form.showMessagesBadgesWhenMuted" : "當通知關閉時,標記未讀的訊æ¯", 133 "settings.app.form.showMessagesBadgesWhenMuted" : "當通知關閉時,標記未讀的訊æ¯",
134 "settings.app.form.spellcheckerLanguage" : "Spell checking language",
129 "settings.app.headline" : "設定", 135 "settings.app.headline" : "設定",
130 "settings.app.headlineAdvanced" : "進階", 136 "settings.app.headlineAdvanced" : "進階",
131 "settings.app.headlineAppearance" : "外觀", 137 "settings.app.headlineAppearance" : "外觀",
@@ -133,15 +139,15 @@
133 "settings.app.headlineLanguage" : "語言", 139 "settings.app.headlineLanguage" : "語言",
134 "settings.app.headlineUpdates" : "æ›´æ–°", 140 "settings.app.headlineUpdates" : "æ›´æ–°",
135 "settings.app.restartRequired" : "需è¦é‡å•Ÿä»¥æ›´è®Š", 141 "settings.app.restartRequired" : "需è¦é‡å•Ÿä»¥æ›´è®Š",
136 "settings.app.subheadlineCache" : "Cache", 142 "settings.app.subheadlineCache" : "å¿«å–",
137 "settings.app.translationHelp" : "幫助我們將Franz翻譯æˆæ‚¨çš„語言。", 143 "settings.app.translationHelp" : "幫助我們將Franz翻譯æˆæ‚¨çš„語言。",
138 "settings.app.updateStatusAvailable" : "有å¯ç”¨æ›´æ–°ï¼Œä¸‹è¼‰ä¸­...", 144 "settings.app.updateStatusAvailable" : "有å¯ç”¨æ›´æ–°ï¼Œä¸‹è¼‰ä¸­...",
139 "settings.app.updateStatusSearching" : "正在æœå°‹æ›´æ–°", 145 "settings.app.updateStatusSearching" : "正在æœå°‹æ›´æ–°",
140 "settings.app.updateStatusUpToDate" : "您正在使用最新版本的Franz", 146 "settings.app.updateStatusUpToDate" : "您正在使用最新版本的Franz",
141 "settings.invite.headline" : "Invite Friends", 147 "settings.invite.headline" : "邀請朋å‹",
142 "settings.navigation.account" : "帳號", 148 "settings.navigation.account" : "帳號",
143 "settings.navigation.availableServices" : "å¯ä½¿ç”¨çš„æœå‹™", 149 "settings.navigation.availableServices" : "å¯ä½¿ç”¨çš„æœå‹™",
144 "settings.navigation.inviteFriends" : "Invite Friends", 150 "settings.navigation.inviteFriends" : "邀請朋å‹",
145 "settings.navigation.logout" : "登出", 151 "settings.navigation.logout" : "登出",
146 "settings.navigation.settings" : "設定", 152 "settings.navigation.settings" : "設定",
147 "settings.navigation.yourServices" : "您的æœå‹™", 153 "settings.navigation.yourServices" : "您的æœå‹™",
@@ -152,7 +158,7 @@
152 "settings.recipes.mostPopular" : "最熱門", 158 "settings.recipes.mostPopular" : "最熱門",
153 "settings.recipes.nothingFound" : "很抱歉,沒有與您的æœå°‹å­—詞符åˆçš„æœå‹™", 159 "settings.recipes.nothingFound" : "很抱歉,沒有與您的æœå°‹å­—詞符åˆçš„æœå‹™",
154 "settings.recipes.servicesSuccessfulAddedInfo" : "æœå‹™å·²æˆåŠŸæ–°å¢žã€‚", 160 "settings.recipes.servicesSuccessfulAddedInfo" : "æœå‹™å·²æˆåŠŸæ–°å¢žã€‚",
155 "settings.searchService" : "Search service", 161 "settings.searchService" : "尋找æœå‹™",
156 "settings.service.error.goBack" : "返回æœå‹™", 162 "settings.service.error.goBack" : "返回æœå‹™",
157 "settings.service.error.headline" : "錯誤", 163 "settings.service.error.headline" : "錯誤",
158 "settings.service.error.message" : "無法載入æœå‹™å‘½ä»¤ã€‚", 164 "settings.service.error.message" : "無法載入æœå‹™å‘½ä»¤ã€‚",
@@ -165,24 +171,31 @@
165 "settings.service.form.deleteButton" : "刪除æœå‹™", 171 "settings.service.form.deleteButton" : "刪除æœå‹™",
166 "settings.service.form.editServiceHeadline" : "編輯{å稱}", 172 "settings.service.form.editServiceHeadline" : "編輯{å稱}",
167 "settings.service.form.enableAudio" : "啟用音訊", 173 "settings.service.form.enableAudio" : "啟用音訊",
168 "settings.service.form.enableBadge" : "Show unread message badges", 174 "settings.service.form.enableBadge" : "顯示未讀訊æ¯åœ–示",
175 "settings.service.form.enableDarkMode" : "Enable Dark Mode",
169 "settings.service.form.enableNotification" : "啟用通知", 176 "settings.service.form.enableNotification" : "啟用通知",
170 "settings.service.form.enableService" : "啟用æœå‹™", 177 "settings.service.form.enableService" : "啟用æœå‹™",
171 "settings.service.form.headlineBadges" : "Unread message badges", 178 "settings.service.form.headlineBadges" : "未讀訊æ¯åœ–示",
172 "settings.service.form.headlineGeneral" : "一般", 179 "settings.service.form.headlineGeneral" : "一般",
173 "settings.service.form.headlineNotifications" : "Notifications", 180 "settings.service.form.headlineNotifications" : "通知",
174 "settings.service.form.icon" : "Custom icon", 181 "settings.service.form.icon" : "自訂圖示",
175 "settings.service.form.iconDelete" : "刪除", 182 "settings.service.form.iconDelete" : "刪除",
176 "settings.service.form.iconUpload" : "Drop your image, or click here", 183 "settings.service.form.iconUpload" : "拖曳你的圖片,或按此上傳",
177 "settings.service.form.indirectMessageInfo" : "您將收到有關頻é“中所有新消æ¯çš„通知,而ä¸åƒ…僅是@username,@channel,@here,...", 184 "settings.service.form.indirectMessageInfo" : "您將收到有關頻é“中所有新消æ¯çš„通知,而ä¸åƒ…僅是@username,@channel,@here,...",
178 "settings.service.form.indirectMessages" : "顯示所有新消æ¯çš„消æ¯æ¨™èªŒ", 185 "settings.service.form.indirectMessages" : "顯示所有新消æ¯çš„消æ¯æ¨™èªŒ",
179 "settings.service.form.isMutedInfo" : "åœç”¨æ™‚,所有通知è²å’Œè²éŸ³æ’­æ”¾éƒ½å°‡éœéŸ³", 186 "settings.service.form.isMutedInfo" : "åœç”¨æ™‚,所有通知è²å’Œè²éŸ³æ’­æ”¾éƒ½å°‡éœéŸ³",
180 "settings.service.form.name" : "å稱", 187 "settings.service.form.name" : "å稱",
188 "settings.service.form.proxy.headline" : "Proxy Settings",
189 "settings.service.form.proxy.host" : "Proxy Host\/IP",
190 "settings.service.form.proxy.info" : "Proxy settings will not synced with the Franz servers.",
191 "settings.service.form.proxy.isEnabled" : "Use Proxy",
192 "settings.service.form.proxy.password" : "Password (optional)",
193 "settings.service.form.proxy.user" : "User (optional)",
181 "settings.service.form.saveButton" : "ä¿å­˜æœå‹™", 194 "settings.service.form.saveButton" : "ä¿å­˜æœå‹™",
182 "settings.service.form.tabHosted" : "託管", 195 "settings.service.form.tabHosted" : "託管",
183 "settings.service.form.tabOnPremise" : "自我託管â­ï¸", 196 "settings.service.form.tabOnPremise" : "自我託管â­ï¸",
184 "settings.service.form.team" : "團隊", 197 "settings.service.form.team" : "團隊",
185 "settings.service.form.useHostedService" : "Use the hosted {name} service.", 198 "settings.service.form.useHostedService" : "使用託管{name}æœå‹™",
186 "settings.service.form.yourServices" : "您的æœå‹™", 199 "settings.service.form.yourServices" : "您的æœå‹™",
187 "settings.services.deletedInfo" : "已刪除æœå‹™", 200 "settings.services.deletedInfo" : "已刪除æœå‹™",
188 "settings.services.discoverServices" : "發ç¾æœå‹™", 201 "settings.services.discoverServices" : "發ç¾æœå‹™",
@@ -220,10 +233,12 @@
220 "subscription.euTaxInfo" : "æ­ç›Ÿå±…民:å¯èƒ½æŽ¡ç”¨ç•¶åœ°éŠ·å”®ç¨…", 233 "subscription.euTaxInfo" : "æ­ç›Ÿå±…民:å¯èƒ½æŽ¡ç”¨ç•¶åœ°éŠ·å”®ç¨…",
221 "subscription.features.ads" : "無廣告,永é !", 234 "subscription.features.ads" : "無廣告,永é !",
222 "subscription.features.comingSoon" : "å³å°‡æŽ¨å‡º", 235 "subscription.features.comingSoon" : "å³å°‡æŽ¨å‡º",
223 "subscription.features.customServices" : "為您和您的團隊æä¾›ç§äººæœå‹™",
224 "subscription.features.encryptedSync" : "加密的會話åŒæ­¥", 236 "subscription.features.encryptedSync" : "加密的會話åŒæ­¥",
237 "subscription.features.noInterruptions" : "No app delays & nagging to upgrade license",
225 "subscription.features.onpremise" : "添加本地\/託管æœå‹™å¦‚HipChat", 238 "subscription.features.onpremise" : "添加本地\/託管æœå‹™å¦‚HipChat",
226 "subscription.features.vpn" : "代ç†å’ŒVPN支æŒ", 239 "subscription.features.onpremise.mattermost" : "Add on-premise\/hosted services like Mattermost",
240 "subscription.features.proxy" : "Proxy support for services",
241 "subscription.features.spellchecker" : "Support for spellchecker",
227 "subscription.includedFeatures" : "包å«é«˜ç´šFranz付費帳戶", 242 "subscription.includedFeatures" : "包å«é«˜ç´šFranz付費帳戶",
228 "subscription.paymentSessionError" : "無法åˆå§‹åŒ–付款表單", 243 "subscription.paymentSessionError" : "無法åˆå§‹åŒ–付款表單",
229 "subscription.submit.label" : "我想支æŒFranz的開發", 244 "subscription.submit.label" : "我想支æŒFranz的開發",
@@ -241,10 +256,10 @@
241 "tabs.item.enableNotification" : "啟用通知", 256 "tabs.item.enableNotification" : "啟用通知",
242 "tabs.item.enableService" : "啟用æœå‹™", 257 "tabs.item.enableService" : "啟用æœå‹™",
243 "tabs.item.reload" : "é‡æ–°è¼‰å…¥", 258 "tabs.item.reload" : "é‡æ–°è¼‰å…¥",
244 "validation.email" : "{field} is not valid", 259 "validation.email" : "{field}無效",
245 "validation.minLength" : "{field} should be at least {length} characters long", 260 "validation.minLength" : "{field}長度至少應為{length}個字",
246 "validation.required" : "{field} is required", 261 "validation.required" : "{field}為必填",
247 "validation.url" : "{field} is not a valid URL", 262 "validation.url" : "{field}ä¸æ˜¯å€‹æœ‰æ•ˆçš„網å€",
248 "welcome.loginButton" : "登入您的帳戶", 263 "welcome.loginButton" : "登入您的帳戶",
249 "welcome.signupButton" : "建立å…費帳號", 264 "welcome.signupButton" : "建立å…費帳號",
250 "welcome.slogan" : "為你通信" 265 "welcome.slogan" : "為你通信"
diff --git a/src/index.js b/src/index.js
index 5ba901b89..663f81cc9 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,10 +1,16 @@
1import { app, BrowserWindow, shell } from 'electron'; 1import { app, BrowserWindow, shell, ipcMain } from 'electron';
2
2import fs from 'fs-extra'; 3import fs from 'fs-extra';
3import path from 'path'; 4import path from 'path';
4
5import windowStateKeeper from 'electron-window-state'; 5import windowStateKeeper from 'electron-window-state';
6 6
7import { isDevMode, isMac, isWindows, isLinux } from './environment'; 7import { isDevMode, isMac, isWindows, isLinux } from './environment';
8
9// DEV MODE: Save user data into FranzDev
10if (isDevMode) {
11 app.setPath('userData', path.join(app.getPath('appData'), 'FranzDev'));
12}
13/* eslint-disable import/first */
8import ipcApi from './electron/ipc-api'; 14import ipcApi from './electron/ipc-api';
9import Tray from './lib/Tray'; 15import Tray from './lib/Tray';
10import Settings from './electron/Settings'; 16import Settings from './electron/Settings';
@@ -12,7 +18,10 @@ import handleDeepLink from './electron/deepLinking';
12import { appId } from './package.json'; // eslint-disable-line import/no-unresolved 18import { appId } from './package.json'; // eslint-disable-line import/no-unresolved
13import './electron/exception'; 19import './electron/exception';
14 20
15const debug = require('debug')('App'); 21import { DEFAULT_APP_SETTINGS } from './config';
22/* eslint-enable import/first */
23
24const debug = require('debug')('Franz:App');
16 25
17// Keep a global reference of the window object, if you don't, the window will 26// Keep a global reference of the window object, if you don't, the window will
18// be closed automatically when the JavaScript object is garbage collected. 27// be closed automatically when the JavaScript object is garbage collected.
@@ -57,7 +66,8 @@ if (isLinux && ['Pantheon', 'Unity:Unity7'].indexOf(process.env.XDG_CURRENT_DESK
57} 66}
58 67
59// Initialize Settings 68// Initialize Settings
60const settings = new Settings(); 69const settings = new Settings('app', DEFAULT_APP_SETTINGS);
70const proxySettings = new Settings('proxy');
61 71
62// Disable GPU acceleration 72// Disable GPU acceleration
63if (!settings.get('enableGPUAcceleration')) { 73if (!settings.get('enableGPUAcceleration')) {
@@ -82,14 +92,21 @@ const createWindow = () => {
82 minHeight: 500, 92 minHeight: 500,
83 titleBarStyle: isMac ? 'hidden' : '', 93 titleBarStyle: isMac ? 'hidden' : '',
84 frame: isLinux, 94 frame: isLinux,
85 backgroundColor: '#3498db', 95 backgroundColor: !settings.get('darkMode') ? '#3498db' : '#1E1E1E',
86 }); 96 });
87 97
88 // Initialize System Tray 98 // Initialize System Tray
89 const trayIcon = new Tray(); 99 const trayIcon = new Tray();
90 100
91 // Initialize ipcApi 101 // Initialize ipcApi
92 ipcApi({ mainWindow, settings, trayIcon }); 102 ipcApi({
103 mainWindow,
104 settings: {
105 app: settings,
106 proxy: proxySettings,
107 },
108 trayIcon,
109 });
93 110
94 // Manage Window State 111 // Manage Window State
95 mainWindowState.manage(mainWindow); 112 mainWindowState.manage(mainWindow);
@@ -115,7 +132,7 @@ const createWindow = () => {
115 mainWindow.hide(); 132 mainWindow.hide();
116 } 133 }
117 134
118 if (isWindows && settings.get('minimizeToSystemTray')) { 135 if (isWindows) {
119 mainWindow.setSkipTaskbar(true); 136 mainWindow.setSkipTaskbar(true);
120 } 137 }
121 } else { 138 } else {
@@ -172,6 +189,24 @@ const createWindow = () => {
172// Some APIs can only be used after this event occurs. 189// Some APIs can only be used after this event occurs.
173app.on('ready', createWindow); 190app.on('ready', createWindow);
174 191
192// This is the worst possible implementation as the webview.webContents based callback doesn't work 🖕
193app.on('login', (event, webContents, request, authInfo, callback) => {
194 event.preventDefault();
195 debug('browser login event', authInfo);
196 if (authInfo.isProxy && authInfo.scheme === 'basic') {
197 webContents.send('get-service-id');
198
199 ipcMain.on('service-id', (e, id) => {
200 debug('Received service id', id);
201
202 const ps = proxySettings.get(id);
203 callback(ps.user, ps.password);
204 });
205 } else {
206 // TODO: implement basic auth
207 }
208});
209
175// Quit when all windows are closed. 210// Quit when all windows are closed.
176app.on('window-all-closed', () => { 211app.on('window-all-closed', () => {
177 // On OS X it is common for applications and their menu bar 212 // On OS X it is common for applications and their menu bar
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index e3f8a04fa..32ec1b207 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -285,7 +285,7 @@ const _templateFactory = intl => [
285 submenu: [ 285 submenu: [
286 { 286 {
287 label: intl.formatMessage(menuItems.learnMore), 287 label: intl.formatMessage(menuItems.learnMore),
288 click() { shell.openExternal('http://meetfranz.com'); }, 288 click() { shell.openExternal('https://meetfranz.com'); },
289 }, 289 },
290 { 290 {
291 label: intl.formatMessage(menuItems.changelog), 291 label: intl.formatMessage(menuItems.changelog),
@@ -296,7 +296,7 @@ const _templateFactory = intl => [
296 }, 296 },
297 { 297 {
298 label: intl.formatMessage(menuItems.support), 298 label: intl.formatMessage(menuItems.support),
299 click() { shell.openExternal('http://meetfranz.com/support'); }, 299 click() { shell.openExternal('https://meetfranz.com/support'); },
300 }, 300 },
301 { 301 {
302 type: 'separator', 302 type: 'separator',
@@ -485,7 +485,9 @@ export default class FranzMenu {
485 this.stores = stores; 485 this.stores = stores;
486 this.actions = actions; 486 this.actions = actions;
487 487
488 autorun(this._build.bind(this)); 488 setTimeout(() => {
489 autorun(this._build.bind(this));
490 }, 10);
489 } 491 }
490 492
491 rebuild() { 493 rebuild() {
@@ -497,7 +499,6 @@ export default class FranzMenu {
497 } 499 }
498 500
499 _build() { 501 _build() {
500 // console.log(window.franz);
501 const serviceTpl = Object.assign([], this.serviceTpl); // need to clone object so we don't modify computed (cached) object 502 const serviceTpl = Object.assign([], this.serviceTpl); // need to clone object so we don't modify computed (cached) object
502 503
503 if (window.franz === undefined) { 504 if (window.franz === undefined) {
@@ -521,6 +522,7 @@ export default class FranzMenu {
521 click: () => { 522 click: () => {
522 this.actions.service.openDevToolsForActiveService(); 523 this.actions.service.openDevToolsForActiveService();
523 }, 524 },
525 enabled: this.stores.user.isLoggedIn && this.stores.services.enabled.length > 0,
524 }); 526 });
525 527
526 tpl[1].submenu.unshift({ 528 tpl[1].submenu.unshift({
@@ -559,6 +561,7 @@ export default class FranzMenu {
559 click: () => { 561 click: () => {
560 this.actions.ui.openSettings({ path: 'app' }); 562 this.actions.ui.openSettings({ path: 'app' });
561 }, 563 },
564 enabled: this.stores.user.isLoggedIn,
562 }, 565 },
563 { 566 {
564 type: 'separator', 567 type: 'separator',
@@ -640,6 +643,7 @@ export default class FranzMenu {
640 click: () => { 643 click: () => {
641 this.actions.ui.openSettings({ path: 'app' }); 644 this.actions.ui.openSettings({ path: 'app' });
642 }, 645 },
646 enabled: this.stores.user.isLoggedIn,
643 }, 647 },
644 { 648 {
645 type: 'separator', 649 type: 'separator',
@@ -661,6 +665,7 @@ export default class FranzMenu {
661 click: () => { 665 click: () => {
662 this.actions.ui.openSettings({ path: 'recipes' }); 666 this.actions.ui.openSettings({ path: 'recipes' });
663 }, 667 },
668 enabled: this.stores.user.isLoggedIn,
664 }, { 669 }, {
665 type: 'separator', 670 type: 'separator',
666 }); 671 });
@@ -680,7 +685,7 @@ export default class FranzMenu {
680 if (this.stores.user.isLoggedIn) { 685 if (this.stores.user.isLoggedIn) {
681 return services.map((service, i) => ({ 686 return services.map((service, i) => ({
682 label: this._getServiceName(service), 687 label: this._getServiceName(service),
683 accelerator: i <= 9 ? `${cmdKey}+${i + 1}` : null, 688 accelerator: i < 9 ? `${cmdKey}+${i + 1}` : null,
684 type: 'radio', 689 type: 'radio',
685 checked: service.isActive, 690 checked: service.isActive,
686 click: () => { 691 click: () => {
diff --git a/src/lib/analytics.js b/src/lib/analytics.js
index 585cbcdba..8b9a44579 100644
--- a/src/lib/analytics.js
+++ b/src/lib/analytics.js
@@ -2,7 +2,7 @@ import { remote } from 'electron';
2import { GA_ID } from '../config'; 2import { GA_ID } from '../config';
3// import { isDevMode } from '../environment'; 3// import { isDevMode } from '../environment';
4 4
5const debug = require('debug')('Analytics'); 5const debug = require('debug')('Franz:Analytics');
6 6
7const { app } = remote; 7const { app } = remote;
8 8
diff --git a/src/models/News.js b/src/models/News.js
index a96e6550f..caf1d70e5 100644
--- a/src/models/News.js
+++ b/src/models/News.js
@@ -1,10 +1,10 @@
1// @flow 1// @flow
2 2
3export default class News { 3export default class News {
4 id: string = ''; 4 id = '';
5 message: string = ''; 5 message = '';
6 type: string = 'primary'; 6 type = 'primary';
7 sticky: bool = false; 7 sticky = false;
8 8
9 constructor(data) { 9 constructor(data) {
10 if (!data.id) { 10 if (!data.id) {
diff --git a/src/models/Plan.js b/src/models/Plan.js
index e77353824..c7b4a0962 100644
--- a/src/models/Plan.js
+++ b/src/models/Plan.js
@@ -1,11 +1,11 @@
1// @flow 1// @flow
2 2
3export default class Plan { 3export default class Plan {
4 month: { 4 month = {
5 id: '', 5 id: '',
6 price: 0, 6 price: 0,
7 } 7 }
8 year: { 8 year = {
9 id: '', 9 id: '',
10 price: 0, 10 price: 0,
11 } 11 }
diff --git a/src/models/Recipe.js b/src/models/Recipe.js
index 032a9aa19..43c44514c 100644
--- a/src/models/Recipe.js
+++ b/src/models/Recipe.js
@@ -1,5 +1,7 @@
1import emailParser from 'address-rfc2822'; 1import emailParser from 'address-rfc2822';
2import semver from 'semver'; 2import semver from 'semver';
3import fs from 'fs-extra';
4import path from 'path';
3 5
4export default class Recipe { 6export default class Recipe {
5 id = ''; 7 id = '';
@@ -73,4 +75,8 @@ export default class Recipe {
73 75
74 return []; 76 return [];
75 } 77 }
78
79 get hasDarkMode() {
80 return fs.pathExistsSync(path.join(this.path, 'darkmode.css'));
81 }
76} 82}
diff --git a/src/models/RecipePreview.js b/src/models/RecipePreview.js
index 525a5c4b5..7470d757a 100644
--- a/src/models/RecipePreview.js
+++ b/src/models/RecipePreview.js
@@ -1,10 +1,10 @@
1// @flow 1// @flow
2 2
3export default class RecipePreview { 3export default class RecipePreview {
4 id: string = ''; 4 id = '';
5 name: string = ''; 5 name = '';
6 icon: string = ''; // TODO: check if this isn't replaced by `icons` 6 icon = ''; // TODO: check if this isn't replaced by `icons`
7 featured: bool = false; 7 featured = false;
8 8
9 constructor(data) { 9 constructor(data) {
10 if (!data.id) { 10 if (!data.id) {
diff --git a/src/models/Service.js b/src/models/Service.js
index bafb3f564..41180dd76 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -7,7 +7,7 @@ export default class Service {
7 recipe = ''; 7 recipe = '';
8 webview = null; 8 webview = null;
9 timer = null; 9 timer = null;
10 events: {}; 10 events = {};
11 11
12 isAttached = false; 12 isAttached = false;
13 13
@@ -28,6 +28,7 @@ export default class Service {
28 @observable iconUrl = ''; 28 @observable iconUrl = '';
29 @observable hasCustomUploadedIcon = false; 29 @observable hasCustomUploadedIcon = false;
30 @observable hasCrashed = false; 30 @observable hasCrashed = false;
31 @observable isDarkModeEnabled = false;
31 32
32 constructor(data, recipe) { 33 constructor(data, recipe) {
33 if (!data) { 34 if (!data) {
@@ -64,8 +65,12 @@ export default class Service {
64 65
65 this.isMuted = data.isMuted !== undefined ? data.isMuted : this.isMuted; 66 this.isMuted = data.isMuted !== undefined ? data.isMuted : this.isMuted;
66 67
68 this.isDarkModeEnabled = data.isDarkModeEnabled !== undefined ? data.isDarkModeEnabled : this.isDarkModeEnabled;
69
67 this.hasCustomUploadedIcon = data.hasCustomIcon !== undefined ? data.hasCustomIcon : this.hasCustomUploadedIcon; 70 this.hasCustomUploadedIcon = data.hasCustomIcon !== undefined ? data.hasCustomIcon : this.hasCustomUploadedIcon;
68 71
72 this.proxy = data.proxy !== undefined ? data.proxy : this.proxy;
73
69 this.recipe = recipe; 74 this.recipe = recipe;
70 75
71 autorun(() => { 76 autorun(() => {
diff --git a/src/models/Settings.js b/src/models/Settings.js
deleted file mode 100644
index 0e4c59057..000000000
--- a/src/models/Settings.js
+++ /dev/null
@@ -1,33 +0,0 @@
1import { observable, extendObservable } from 'mobx';
2import { DEFAULT_APP_SETTINGS } from '../config';
3
4export default class Settings {
5 @observable app = DEFAULT_APP_SETTINGS
6
7 @observable service = {
8 activeService: '',
9 }
10
11 @observable group = {
12 collapsed: [],
13 disabled: [],
14 }
15
16 @observable stats = {
17 appStarts: 0,
18 }
19
20 @observable migration = {}
21
22 constructor({ app, service, group, stats, migration }) {
23 Object.assign(this.app, app);
24 Object.assign(this.service, service);
25 Object.assign(this.group, group);
26 Object.assign(this.stats, stats);
27 Object.assign(this.migration, migration);
28 }
29
30 update(data) {
31 extendObservable(this, data);
32 }
33}
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index 38edff1b4..6f156a96d 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -12,12 +12,14 @@ import { CHECK_INTERVAL, DEFAULT_APP_SETTINGS } from '../config';
12import { isMac, isLinux, isWindows } from '../environment'; 12import { isMac, isLinux, isWindows } from '../environment';
13import locales from '../i18n/translations'; 13import locales from '../i18n/translations';
14import { gaEvent } from '../lib/analytics'; 14import { gaEvent } from '../lib/analytics';
15import { onVisibilityChange } from '../helpers/visibility-helper';
16import { getLocale } from '../helpers/i18n-helpers';
15 17
16import { getServiceIdsFromPartitions, removeServicePartitionDirectory } from '../helpers/service-helpers.js'; 18import { getServiceIdsFromPartitions, removeServicePartitionDirectory } from '../helpers/service-helpers.js';
17 19
18const debug = require('debug')('AppStore'); 20const debug = require('debug')('Franz:AppStore');
19 21
20const { app } = remote; 22const { app, systemPreferences } = remote;
21 23
22const mainWindow = remote.getCurrentWindow(); 24const mainWindow = remote.getCurrentWindow();
23 25
@@ -50,10 +52,16 @@ export default class AppStore extends Store {
50 52
51 @observable isSystemMuteOverridden = false; 53 @observable isSystemMuteOverridden = false;
52 54
55 @observable isSystemDarkModeEnabled = false;
56
53 @observable isClearingAllCache = false; 57 @observable isClearingAllCache = false;
54 58
55 @observable isFullScreen = mainWindow.isFullScreen(); 59 @observable isFullScreen = mainWindow.isFullScreen();
56 60
61 @observable isFocused = true;
62
63 dictionaries = [];
64
57 constructor(...args) { 65 constructor(...args) {
58 super(...args); 66 super(...args);
59 67
@@ -77,7 +85,7 @@ export default class AppStore extends Store {
77 ]); 85 ]);
78 } 86 }
79 87
80 setup() { 88 async setup() {
81 this._appStartsCounter(); 89 this._appStartsCounter();
82 // Focus the active service 90 // Focus the active service
83 window.addEventListener('focus', this.actions.service.focusActiveService); 91 window.addEventListener('focus', this.actions.service.focusActiveService);
@@ -159,6 +167,14 @@ export default class AppStore extends Store {
159 this.locale = this._getDefaultLocale(); 167 this.locale = this._getDefaultLocale();
160 168
161 this._healthCheck(); 169 this._healthCheck();
170
171 this.isSystemDarkModeEnabled = systemPreferences.isDarkMode();
172
173 onVisibilityChange((isVisible) => {
174 this.isFocused = isVisible;
175
176 debug('Window is visible/focused', isVisible);
177 });
162 } 178 }
163 179
164 @computed get cacheSize() { 180 @computed get cacheSize() {
@@ -304,31 +320,12 @@ export default class AppStore extends Store {
304 } 320 }
305 321
306 _getDefaultLocale() { 322 _getDefaultLocale() {
307 let locale = app.getLocale(); 323 return getLocale({
308 if (locales[locale] === undefined) { 324 locale: app.getLocale(),
309 let localeFuzzy; 325 locales,
310 Object.keys(locales).forEach((localStr) => { 326 defaultLocale,
311 if (locales && Object.hasOwnProperty.call(locales, localStr)) { 327 fallbackLocale: DEFAULT_APP_SETTINGS.fallbackLocale,
312 if (locale.substring(0, 2) === localStr.substring(0, 2)) { 328 });
313 localeFuzzy = localStr;
314 }
315 }
316 });
317
318 if (localeFuzzy !== undefined) {
319 locale = localeFuzzy;
320 }
321 }
322
323 if (locales[locale] === undefined) {
324 locale = defaultLocale;
325 }
326
327 if (!locale) {
328 locale = DEFAULT_APP_SETTINGS.fallbackLocale;
329 }
330
331 return locale;
332 } 329 }
333 330
334 _muteAppHandler() { 331 _muteAppHandler() {
diff --git a/src/stores/DictionaryStore.js b/src/stores/DictionaryStore.js
new file mode 100644
index 000000000..b9c5f2abf
--- /dev/null
+++ b/src/stores/DictionaryStore.js
@@ -0,0 +1,45 @@
1import { observable } from 'mobx';
2import { createDownloader } from 'hunspell-dict-downloader';
3
4import Store from './lib/Store';
5
6import { DICTIONARY_PATH } from '../config';
7
8const debug = require('debug')('Franz:DictionaryStore');
9
10export default class DictionaryStore extends Store {
11 @observable available = []
12 @observable installed = []
13
14 _dictDownloader = null
15
16 constructor(...args) {
17 super(...args);
18
19 this.registerReactions([
20 this._downloadDictForUserLocale.bind(this),
21 ]);
22 }
23
24 async setup() {
25 this._dictDownloader = await createDownloader(DICTIONARY_PATH);
26 debug('dicts', this._dictDownloader);
27
28 this.available = this._dictDownloader.availableDictionaries;
29 this.installed = this._dictDownloader.installedDictionaries;
30
31 if (!this.installed.includes('en-us')) {
32 this._dictDownloader.installDictionary('en-us');
33 }
34 }
35
36 _downloadDictForUserLocale() {
37 const spellcheckerLanguage = this.stores.settings.app.spellcheckerLanguage;
38
39 debug('trying to Downloading dict for', spellcheckerLanguage);
40 if (!this.installed.includes(spellcheckerLanguage) && this.available.includes(spellcheckerLanguage) && spellcheckerLanguage !== 'en-us') {
41 debug('Downloading dict for', spellcheckerLanguage);
42 this._dictDownloader.installDictionary(spellcheckerLanguage);
43 }
44 }
45}
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
new file mode 100644
index 000000000..10c893d3f
--- /dev/null
+++ b/src/stores/FeaturesStore.js
@@ -0,0 +1,50 @@
1import { computed, observable } from 'mobx';
2
3import Store from './lib/Store';
4import CachedRequest from './lib/CachedRequest';
5
6import delayApp from '../features/delayApp';
7import spellchecker from '../features/spellchecker';
8import serviceProxy from '../features/serviceProxy';
9
10import { DEFAULT_FEATURES_CONFIG } from '../config';
11
12export default class FeaturesStore extends Store {
13 @observable defaultFeaturesRequest = new CachedRequest(this.api.features, 'default');
14 @observable featuresRequest = new CachedRequest(this.api.features, 'features');
15
16 async setup() {
17 this.registerReactions([
18 this._monitorLoginStatus.bind(this),
19 ]);
20
21 await this.featuresRequest._promise;
22 setTimeout(this._enableFeatures.bind(this), 1);
23 }
24
25 @computed get anonymousFeatures() {
26 return this.defaultFeaturesRequest.execute().result || DEFAULT_FEATURES_CONFIG;
27 }
28
29 @computed get features() {
30 if (this.stores.user.isLoggedIn) {
31 return this.featuresRequest.execute().result || DEFAULT_FEATURES_CONFIG;
32 }
33
34 return DEFAULT_FEATURES_CONFIG;
35 }
36
37 _monitorLoginStatus() {
38 if (this.stores.user.isLoggedIn) {
39 this.featuresRequest.invalidate({ immediately: true });
40 } else {
41 this.defaultFeaturesRequest.invalidate({ immediately: true });
42 }
43 }
44
45 _enableFeatures() {
46 delayApp(this.stores, this.actions);
47 spellchecker(this.stores, this.actions);
48 serviceProxy(this.stores, this.actions);
49 }
50}
diff --git a/src/stores/RecipesStore.js b/src/stores/RecipesStore.js
index a24308f6a..f2480bc8e 100644
--- a/src/stores/RecipesStore.js
+++ b/src/stores/RecipesStore.js
@@ -5,7 +5,7 @@ import CachedRequest from './lib/CachedRequest';
5import Request from './lib/Request'; 5import Request from './lib/Request';
6import { matchRoute } from '../helpers/routing-helpers'; 6import { matchRoute } from '../helpers/routing-helpers';
7 7
8const debug = require('debug')('RecipeStore'); 8const debug = require('debug')('Franz:RecipeStore');
9 9
10export default class RecipesStore extends Store { 10export default class RecipesStore extends Store {
11 @observable allRecipesRequest = new CachedRequest(this.api.recipes, 'all'); 11 @observable allRecipesRequest = new CachedRequest(this.api.recipes, 'all');
diff --git a/src/stores/RequestStore.js b/src/stores/RequestStore.js
index 595852583..bbfe6f6df 100644
--- a/src/stores/RequestStore.js
+++ b/src/stores/RequestStore.js
@@ -2,7 +2,7 @@ import { action, computed, observable } from 'mobx';
2 2
3import Store from './lib/Store'; 3import Store from './lib/Store';
4 4
5const debug = require('debug')('RequestsStore'); 5const debug = require('debug')('Franz:RequestsStore');
6 6
7export default class RequestStore extends Store { 7export default class RequestStore extends Store {
8 @observable userInfoRequest; 8 @observable userInfoRequest;
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index ccb85421a..99b091589 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -7,7 +7,7 @@ import CachedRequest from './lib/CachedRequest';
7import { matchRoute } from '../helpers/routing-helpers'; 7import { matchRoute } from '../helpers/routing-helpers';
8import { gaEvent } from '../lib/analytics'; 8import { gaEvent } from '../lib/analytics';
9 9
10const debug = require('debug')('ServiceStore'); 10const debug = require('debug')('Franz:ServiceStore');
11 11
12export default class ServicesStore extends Store { 12export default class ServicesStore extends Store {
13 @observable allServicesRequest = new CachedRequest(this.api.services, 'all'); 13 @observable allServicesRequest = new CachedRequest(this.api.services, 'all');
@@ -67,9 +67,14 @@ export default class ServicesStore extends Store {
67 } 67 }
68 68
69 setup() { 69 setup() {
70 // Single key reactions 70 // Single key reactions for the sake of your CPU
71 reaction( 71 reaction(
72 () => this.stores.settings.all.app.enableSpellchecking, 72 () => this.stores.settings.app.enableSpellchecking,
73 () => this._shareSettingsWithServiceProcess(),
74 );
75
76 reaction(
77 () => this.stores.settings.app.spellcheckerLanguage,
73 () => this._shareSettingsWithServiceProcess(), 78 () => this._shareSettingsWithServiceProcess(),
74 ); 79 );
75 } 80 }
@@ -93,7 +98,7 @@ export default class ServicesStore extends Store {
93 return this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled; 98 return this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled;
94 } 99 }
95 100
96 // This is just used to avoid unnecessary rerendering of resource-heavy webviews 101 // This is just used to avoid unnecessary rerendering of resource-heavy webviews
97 @computed get allDisplayedUnordered() { 102 @computed get allDisplayedUnordered() {
98 const services = this.allServicesRequest.execute().result || []; 103 const services = this.allServicesRequest.execute().result || [];
99 return this.stores.settings.all.app.showDisabledServices ? services : services.filter(service => service.isEnabled); 104 return this.stores.settings.all.app.showDisabledServices ? services : services.filter(service => service.isEnabled);
@@ -143,6 +148,7 @@ export default class ServicesStore extends Store {
143 // Actions 148 // Actions
144 @action async _createService({ recipeId, serviceData, redirect = true }) { 149 @action async _createService({ recipeId, serviceData, redirect = true }) {
145 const data = this._cleanUpTeamIdAndCustomUrl(recipeId, serviceData); 150 const data = this._cleanUpTeamIdAndCustomUrl(recipeId, serviceData);
151
146 const response = await this.createServiceRequest.execute(recipeId, data)._promise; 152 const response = await this.createServiceRequest.execute(recipeId, data)._promise;
147 153
148 this.allServicesRequest.patch((result) => { 154 this.allServicesRequest.patch((result) => {
@@ -150,6 +156,13 @@ export default class ServicesStore extends Store {
150 result.push(response.data); 156 result.push(response.data);
151 }); 157 });
152 158
159 this.actions.settings.update({
160 type: 'proxy',
161 data: {
162 [`${response.data.id}`]: data.proxy,
163 },
164 });
165
153 this.actionStatus = response.status || []; 166 this.actionStatus = response.status || [];
154 167
155 if (redirect) { 168 if (redirect) {
@@ -214,6 +227,21 @@ export default class ServicesStore extends Store {
214 await request._promise; 227 await request._promise;
215 this.actionStatus = request.result.status; 228 this.actionStatus = request.result.status;
216 229
230 if (service.isEnabled) {
231 this._sendIPCMessage({
232 serviceId,
233 channel: 'service-settings-update',
234 args: newData,
235 });
236 }
237
238 this.actions.settings.update({
239 type: 'proxy',
240 data: {
241 [`${serviceId}`]: data.proxy,
242 },
243 });
244
217 if (redirect) { 245 if (redirect) {
218 this.stores.router.push('/settings/services'); 246 this.stores.router.push('/settings/services');
219 gaEvent('Service', 'update', service.recipe.id); 247 gaEvent('Service', 'update', service.recipe.id);
@@ -411,6 +439,8 @@ export default class ServicesStore extends Store {
411 439
412 @action _reload({ serviceId }) { 440 @action _reload({ serviceId }) {
413 const service = this.one(serviceId); 441 const service = this.one(serviceId);
442 if (!service.isEnabled) return;
443
414 service.resetMessageCount(); 444 service.resetMessageCount();
415 445
416 service.webview.loadURL(service.url); 446 service.webview.loadURL(service.url);
@@ -567,9 +597,10 @@ export default class ServicesStore extends Store {
567 } 597 }
568 598
569 _shareSettingsWithServiceProcess() { 599 _shareSettingsWithServiceProcess() {
600 const settings = this.stores.settings.app;
570 this.actions.service.sendIPCMessageToAllServices({ 601 this.actions.service.sendIPCMessageToAllServices({
571 channel: 'settings-update', 602 channel: 'settings-update',
572 args: this.stores.settings.all.app, 603 args: settings,
573 }); 604 });
574 } 605 }
575 606
diff --git a/src/stores/SettingsStore.js b/src/stores/SettingsStore.js
index d8519c609..9ea14a911 100644
--- a/src/stores/SettingsStore.js
+++ b/src/stores/SettingsStore.js
@@ -1,54 +1,105 @@
1import { remote, ipcRenderer } from 'electron';
1import { action, computed, observable } from 'mobx'; 2import { action, computed, observable } from 'mobx';
2import localStorage from 'mobx-localstorage'; 3import localStorage from 'mobx-localstorage';
3 4
4import Store from './lib/Store'; 5import Store from './lib/Store';
5import SettingsModel from '../models/Settings';
6import Request from './lib/Request'; 6import Request from './lib/Request';
7import CachedRequest from './lib/CachedRequest'; 7import CachedRequest from './lib/CachedRequest';
8import { getLocale } from '../helpers/i18n-helpers';
8 9
9const debug = require('debug')('SettingsStore'); 10import { DEFAULT_APP_SETTINGS, FILE_SYSTEM_SETTINGS_TYPES } from '../config';
11import { SPELLCHECKER_LOCALES } from '../i18n/languages';
12
13const { systemPreferences } = remote;
14const debug = require('debug')('Franz:SettingsStore');
10 15
11export default class SettingsStore extends Store { 16export default class SettingsStore extends Store {
12 @observable appSettingsRequest = new CachedRequest(this.api.local, 'getAppSettings'); 17 @observable appSettingsRequest = new CachedRequest(this.api.local, 'getAppSettings');
13 @observable updateAppSettingsRequest = new Request(this.api.local, 'updateAppSettings'); 18 @observable updateAppSettingsRequest = new Request(this.api.local, 'updateAppSettings');
14 19
20 @observable fileSystemSettingsRequests = [];
21
22 fileSystemSettingsTypes = FILE_SYSTEM_SETTINGS_TYPES;
23 @observable _fileSystemSettingsCache = {
24 app: DEFAULT_APP_SETTINGS,
25 proxy: {},
26 };
27
15 constructor(...args) { 28 constructor(...args) {
16 super(...args); 29 super(...args);
17 30
18 // Register action handlers 31 // Register action handlers
19 this.actions.settings.update.listen(this._update.bind(this)); 32 this.actions.settings.update.listen(this._update.bind(this));
20 this.actions.settings.remove.listen(this._remove.bind(this)); 33 this.actions.settings.remove.listen(this._remove.bind(this));
34
35 this.fileSystemSettingsTypes.forEach((type) => {
36 this.fileSystemSettingsRequests[type] = new CachedRequest(this.api.local, 'getAppSettings');
37 });
38
39 ipcRenderer.on('appSettings', (event, resp) => {
40 debug('Get appSettings resolves', resp, resp.type, resp.data);
41
42 this._fileSystemSettingsCache[resp.type] = resp.data;
43 });
44
45 this.fileSystemSettingsTypes.forEach((type) => {
46 ipcRenderer.send('getAppSettings', type);
47 });
21 } 48 }
22 49
23 async setup() { 50 async setup() {
24 // We need to wait until `appSettingsRequest` has been executed once, otherwise we can't patch the result. If we don't wait we'd run into an issue with mobx not reacting to changes of previously not existing keys 51 // We need to wait until `appSettingsRequest` has been executed once, otherwise we can't patch the result. If we don't wait we'd run into an issue with mobx not reacting to changes of previously not existing keys
25 await this.appSettingsRequest._promise; 52 await this.appSettingsRequest._promise;
26 this._migrate(); 53 await this._migrate();
54 }
55
56 @computed get app() {
57 return this._fileSystemSettingsCache.app || DEFAULT_APP_SETTINGS;
58 }
59
60 @computed get proxy() {
61 return this._fileSystemSettingsCache.proxy || {};
62 }
63
64 @computed get service() {
65 return localStorage.getItem('service') || {
66 activeService: '',
67 };
68 }
69
70 @computed get stats() {
71 return localStorage.getItem('stats') || {
72 activeService: '',
73 };
74 }
75
76 @computed get migration() {
77 return localStorage.getItem('migration') || {};
27 } 78 }
28 79
29 @computed get all() { 80 @computed get all() {
30 return new SettingsModel({ 81 return {
31 app: this.appSettingsRequest.execute().result || {}, 82 app: this.app,
32 service: localStorage.getItem('service') || {}, 83 proxy: this.proxy,
33 group: localStorage.getItem('group') || {}, 84 service: this.service,
34 stats: localStorage.getItem('stats') || {}, 85 stats: this.stats,
35 migration: localStorage.getItem('migration') || {}, 86 migration: this.migration,
36 }); 87 };
37 } 88 }
38 89
39 @action async _update({ type, data }) { 90 @action async _update({ type, data }) {
40 const appSettings = this.all; 91 const appSettings = this.all;
41 if (type !== 'app') { 92 if (!this.fileSystemSettingsTypes.includes(type)) {
42 debug('Update settings', type, data, this.all); 93 debug('Update settings', type, data, this.all);
43 localStorage.setItem(type, Object.assign(appSettings[type], data)); 94 localStorage.setItem(type, Object.assign(appSettings[type], data));
44 } else { 95 } else {
45 debug('Update settings on file system', type, data); 96 debug('Update settings on file system', type, data);
46 this.updateAppSettingsRequest.execute(data); 97 ipcRenderer.send('updateAppSettings', {
47 98 type,
48 this.appSettingsRequest.patch((result) => { 99 data,
49 if (!result) return;
50 Object.assign(result, data);
51 }); 100 });
101
102 Object.assign(this._fileSystemSettingsCache[type], data);
52 } 103 }
53 } 104 }
54 105
@@ -67,8 +118,8 @@ export default class SettingsStore extends Store {
67 } 118 }
68 119
69 // Helper 120 // Helper
70 _migrate() { 121 async _migrate() {
71 const legacySettings = localStorage.getItem('app'); 122 const legacySettings = localStorage.getItem('app') || {};
72 123
73 if (!this.all.migration['5.0.0-beta.17-settings']) { 124 if (!this.all.migration['5.0.0-beta.17-settings']) {
74 this.actions.settings.update({ 125 this.actions.settings.update({
@@ -104,5 +155,34 @@ export default class SettingsStore extends Store {
104 155
105 debug('Migrated settings to split stores'); 156 debug('Migrated settings to split stores');
106 } 157 }
158
159 // Enable dark mode once
160 if (!this.all.migration['5.0.0-beta.19-settings']) {
161 const spellcheckerLanguage = getLocale({
162 locale: this.stores.settings.app.locale,
163 locales: SPELLCHECKER_LOCALES,
164 defaultLocale: DEFAULT_APP_SETTINGS.spellcheckerLanguage,
165 fallbackLocale: DEFAULT_APP_SETTINGS.spellcheckerLanguage,
166 });
167
168 this.actions.settings.update({
169 type: 'app',
170 data: {
171 darkMode: systemPreferences.isDarkMode(),
172 spellcheckerLanguage,
173 },
174 });
175
176 this.actions.settings.update({
177 type: 'migration',
178 data: {
179 '5.0.0-beta.19-settings': true,
180 },
181 });
182 }
183 }
184
185 _getFileBasedSettings(type) {
186 ipcRenderer.send('getAppSettings', type);
107 } 187 }
108} 188}
diff --git a/src/stores/UIStore.js b/src/stores/UIStore.js
index b391bdcae..d37ebe4c7 100644
--- a/src/stores/UIStore.js
+++ b/src/stores/UIStore.js
@@ -1,6 +1,8 @@
1import { action, observable, computed } from 'mobx'; 1import { action, observable, computed } from 'mobx';
2 2
3import Store from './lib/Store'; 3import Store from './lib/Store';
4import * as themeDefault from '../theme/default';
5import * as themeDark from '../theme/dark';
4 6
5export default class UIStore extends Store { 7export default class UIStore extends Store {
6 @observable showServicesUpdatedInfoBar = false; 8 @observable showServicesUpdatedInfoBar = false;
@@ -20,13 +22,21 @@ export default class UIStore extends Store {
20 return (settings.app.isAppMuted && settings.app.showMessageBadgeWhenMuted) || !settings.isAppMuted; 22 return (settings.app.isAppMuted && settings.app.showMessageBadgeWhenMuted) || !settings.isAppMuted;
21 } 23 }
22 24
25 @computed get theme() {
26 if (this.stores.settings.all.app.darkMode) {
27 return Object.assign({}, themeDefault, themeDark);
28 }
29
30 return themeDefault;
31 }
32
23 // Actions 33 // Actions
24 @action _openSettings({ path = '/settings' }) { 34 @action _openSettings({ path = '/settings' }) {
25 const settingsPath = path !== '/settings' ? `/settings/${path}` : path; 35 const settingsPath = path !== '/settings' ? `/settings/${path}` : path;
26 this.stores.router.push(settingsPath); 36 this.stores.router.push(settingsPath);
27 } 37 }
28 38
29 @action _closeSettings(): void { 39 @action _closeSettings() {
30 this.stores.router.push('/'); 40 this.stores.router.push('/');
31 } 41 }
32 42
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index 574616925..26ac2c60e 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -9,7 +9,7 @@ import Request from './lib/Request';
9import CachedRequest from './lib/CachedRequest'; 9import CachedRequest from './lib/CachedRequest';
10import { gaEvent } from '../lib/analytics'; 10import { gaEvent } from '../lib/analytics';
11 11
12const debug = require('debug')('UserStore'); 12const debug = require('debug')('Franz:UserStore');
13 13
14// TODO: split stores into UserStore and AuthStore 14// TODO: split stores into UserStore and AuthStore
15export default class UserStore extends Store { 15export default class UserStore extends Store {
@@ -122,13 +122,13 @@ export default class UserStore extends Store {
122 } 122 }
123 123
124 @computed get data() { 124 @computed get data() {
125 this.getUserInfoRequest.execute(); 125 if (!this.isLoggedIn) return {};
126 return this.getUserInfoRequest.result || {}; 126
127 return this.getUserInfoRequest.execute().result || {};
127 } 128 }
128 129
129 @computed get legacyServices() { 130 @computed get legacyServices() {
130 this.getLegacyServicesRequest.execute(); 131 return this.getLegacyServicesRequest.execute() || {};
131 return this.getLegacyServicesRequest.result || [];
132 } 132 }
133 133
134 // Actions 134 // Actions
diff --git a/src/stores/index.js b/src/stores/index.js
index 2d99e3952..f547d0a7a 100644
--- a/src/stores/index.js
+++ b/src/stores/index.js
@@ -1,5 +1,6 @@
1import AppStore from './AppStore'; 1import AppStore from './AppStore';
2import UserStore from './UserStore'; 2import UserStore from './UserStore';
3import FeaturesStore from './FeaturesStore';
3import SettingsStore from './SettingsStore'; 4import SettingsStore from './SettingsStore';
4import ServicesStore from './ServicesStore'; 5import ServicesStore from './ServicesStore';
5import RecipesStore from './RecipesStore'; 6import RecipesStore from './RecipesStore';
@@ -8,6 +9,7 @@ import UIStore from './UIStore';
8import PaymentStore from './PaymentStore'; 9import PaymentStore from './PaymentStore';
9import NewsStore from './NewsStore'; 10import NewsStore from './NewsStore';
10import RequestStore from './RequestStore'; 11import RequestStore from './RequestStore';
12import DictionaryStore from './DictionaryStore';
11import GlobalErrorStore from './GlobalErrorStore'; 13import GlobalErrorStore from './GlobalErrorStore';
12 14
13export default (api, actions, router) => { 15export default (api, actions, router) => {
@@ -16,6 +18,7 @@ export default (api, actions, router) => {
16 router, 18 router,
17 app: new AppStore(stores, api, actions), 19 app: new AppStore(stores, api, actions),
18 user: new UserStore(stores, api, actions), 20 user: new UserStore(stores, api, actions),
21 features: new FeaturesStore(stores, api, actions),
19 settings: new SettingsStore(stores, api, actions), 22 settings: new SettingsStore(stores, api, actions),
20 services: new ServicesStore(stores, api, actions), 23 services: new ServicesStore(stores, api, actions),
21 recipes: new RecipesStore(stores, api, actions), 24 recipes: new RecipesStore(stores, api, actions),
@@ -24,6 +27,7 @@ export default (api, actions, router) => {
24 payment: new PaymentStore(stores, api, actions), 27 payment: new PaymentStore(stores, api, actions),
25 news: new NewsStore(stores, api, actions), 28 news: new NewsStore(stores, api, actions),
26 requests: new RequestStore(stores, api, actions), 29 requests: new RequestStore(stores, api, actions),
30 dictionary: new DictionaryStore(stores, api, actions),
27 globalError: new GlobalErrorStore(stores, api, actions), 31 globalError: new GlobalErrorStore(stores, api, actions),
28 }); 32 });
29 // Initialize all stores 33 // Initialize all stores
diff --git a/src/styles/animations.scss b/src/styles/animations.scss
index 1e49af207..b121af7d2 100644
--- a/src/styles/animations.scss
+++ b/src/styles/animations.scss
@@ -1,49 +1,41 @@
1// FadeIn 1// FadeIn
2.fadeIn-appear { 2.fadeIn-appear { opacity: .01; }
3 opacity: 0.01;
4}
5 3
6.fadeIn-appear.fadeIn-appear-active { 4.fadeIn-appear.fadeIn-appear-active {
7 opacity: 1; 5 opacity: 1;
8 transition: opacity 0.5s ease-out; 6 transition: opacity .5s ease-out;
9} 7}
10 8
11.fadeIn-enter { 9.fadeIn-enter {
12 opacity: 0.01; 10 opacity: .01;
13 transition: opacity 0.5s ease-out; 11 transition: opacity .5s ease-out;
14} 12}
15 13
16.fadeIn-leave { 14.fadeIn-leave { opacity: 1; }
17 opacity: 1;
18}
19 15
20.fadeIn-leave.fadeIn-leave-active { 16.fadeIn-leave.fadeIn-leave-active {
21 opacity: 0.01; 17 opacity: .01;
22 transition: opacity 300ms ease-in; 18 transition: opacity 300ms ease-in;
23} 19}
24 20
25// FadeIn Fast 21// FadeIn Fast
26.fadeIn-fast-appear { 22.fadeIn-fast-appear { opacity: .01; }
27 opacity: 0.01;
28}
29 23
30.fadeIn-fast-appear.fadeIn-fast-appear-active { 24.fadeIn-fast-appear.fadeIn-fast-appear-active {
31 opacity: 1; 25 opacity: 1;
32 transition: opacity 0.25s ease-out; 26 transition: opacity .25s ease-out;
33} 27}
34 28
35.fadeIn-fast-enter { 29.fadeIn-fast-enter {
36 opacity: 0.01; 30 opacity: .01;
37 transition: opacity 0.25s ease-out; 31 transition: opacity .25s ease-out;
38} 32}
39 33
40.fadeIn-fast-leave { 34.fadeIn-fast-leave { opacity: 1; }
41 opacity: 1;
42}
43 35
44.fadeIn-fast-leave.fadeIn-fast-leave-active { 36.fadeIn-fast-leave.fadeIn-fast-leave-active {
45 opacity: 0.01; 37 opacity: .01;
46 transition: opacity 0.25s ease-in; 38 transition: opacity .25s ease-in;
47} 39}
48 40
49// Slide down 41// Slide down
@@ -54,37 +46,35 @@
54 46
55.slideDown-appear.slideDown-appear-active { 47.slideDown-appear.slideDown-appear-active {
56 max-height: 500px; 48 max-height: 500px;
57 transition: max-height 0.5s ease-out; 49 transition: max-height .5s ease-out;
58} 50}
59 51
60.slideDown-enter { 52.slideDown-enter {
61 max-height: 0; 53 max-height: 0;
62 transition: max-height 0.5s ease-out; 54 transition: max-height .5s ease-out;
63} 55}
64 56
65// Slide up 57// Slide up
66.slideUp-appear { 58.slideUp-appear {
67 transform: translateY(20px);
68 opacity: 0; 59 opacity: 0;
60 transform: translateY(20px);
69} 61}
70 62
71.slideUp-appear.slideUp-appear-active { 63.slideUp-appear.slideUp-appear-active {
72 transform: translateY(0px);
73 opacity: 1; 64 opacity: 1;
74 transition: all 0.3s ease-out; 65 transform: translateY(0px);
66 transition: all .3s ease-out;
75} 67}
76 68
77.slideUp-enter { 69.slideUp-enter {
78 transform: translateY(20px);
79 opacity: 0; 70 opacity: 0;
80 transition: all 0.3s ease-out; 71 transform: translateY(20px);
72 transition: all .3s ease-out;
81} 73}
82 74
83.slideUp-leave { 75.slideUp-leave { opacity: 1; }
84 opacity: 1;
85}
86 76
87.slideUp-leave.slideUp-leave-active { 77.slideUp-leave.slideUp-leave-active {
88 opacity: 0.01; 78 opacity: .01;
89 transition: opacity 300ms ease-in; 79 transition: opacity 300ms ease-in;
90} 80}
diff --git a/src/styles/auth.scss b/src/styles/auth.scss
index 9ad71867c..54e264dc6 100644
--- a/src/styles/auth.scss
+++ b/src/styles/auth.scss
@@ -1,144 +1,135 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.theme__dark .auth {
4 background: $dark-theme-gray-darkest;
5
6 .auth__container {
7 background: $dark-theme-gray-darker;
8 box-shadow: 0 0 50px rgba($dark-theme-black, .2);
9 }
10
11 .auth__logo.auth__logo--sm {
12 border: 4px solid $dark-theme-black;
13 box-shadow: 0 0 6px rgba($dark-theme-black, .5);
14 }
15
16 .auth__links {
17 background: $dark-theme-gray-dark;
18
19 a { color: $dark-theme-text-color; }
20 }
21
22 .legal {
23 color: $dark-theme-text-color;
24
25 a { color: $dark-theme-gray-lightest; }
26 }
27}
28
3.auth { 29.auth {
30 background: $theme-brand-primary;
4 display: flex; 31 display: flex;
5 justify-content: center; 32 justify-content: center;
6 background: $theme-brand-primary;
7 33
8 .auth__layout { 34 .auth__layout {
9 width: 100%; 35 width: 100%;
10 &>div>span {
11 width: 100%;
12 }
13 // display: flex;
14 // align-items: center;
15 // justify-content: center;
16 // flex-direction: column;
17
18 // @media only screen and (max-height : 700px) {
19 // margin: 100px 0;
20 // }
21 36
22 &>div { 37 & > div {
38 align-items: center;
23 display: flex; 39 display: flex;
24 justify-content: center; 40 justify-content: center;
25 align-items: center;
26 41
27 &>span { 42 & > span {
28 position: absolute; 43 position: absolute;
44 width: 100%;
29 } 45 }
30 } 46 }
31 } 47 }
32 48
33 .auth__container { 49 .auth__container {
34 position: relative;
35 width: 350px;
36 height: auto;
37 margin: 40px auto 0 auto;
38 background: #FFF; 50 background: #FFF;
39 // padding: 20px;
40 border-radius: $theme-border-radius; 51 border-radius: $theme-border-radius;
41 box-shadow: 0 0 50px rgba(black, 0.2); 52 box-shadow: 0 0 50px rgba(black, .2);
53 height: auto;
54 margin: 40px auto 0;
55 position: relative;
56 width: 350px;
42 57
43 &.auth__container--signup { 58 &.auth__container--signup { width: 450px; }
44 width: 450px;
45 // margin-left: auto;
46 // margin-right: auto;
47 }
48 } 59 }
49 60
50 .auth__logo { 61 .auth__logo {
62 border-radius: $theme-border-radius;
51 display: block; 63 display: block;
52 width: 150px;
53 height: auto; 64 height: auto;
54 margin: -105px auto 20px auto; 65 margin: -105px auto 20px auto;
55 border-radius: $theme-border-radius; 66 width: 150px;
56 67
57 &.auth__logo--sm { 68 &.auth__logo--sm {
58 border: 4px solid #FFF; 69 border: 4px solid #FFF;
59 box-shadow: 0 0 6px rgba(black, 0.5);
60 border-radius: 100%; 70 border-radius: 100%;
71 box-shadow: 0 0 6px rgba(black, .5);
61 } 72 }
62 } 73 }
63 74
64 .auth__form { 75 .auth__form {
65 padding: 20px; 76 padding: 20px;
66 77
67 h1 { 78 h1 { text-align: center; }
68 text-align: center;
69 }
70 } 79 }
71 80
72 .auth__button { 81 .auth__button {
73 width: 100%; 82 width: 100%;
74 83
75 &.auth__button--skip { 84 &.auth__button--skip { margin: 10px auto 0; }
76 margin: 10px auto 0;
77 }
78 } 85 }
79 86
80 .auth__links { 87 .auth__links {
81 padding: 20px;
82 background: $theme-gray-lighter; 88 background: $theme-gray-lighter;
83 border-bottom-left-radius: $theme-border-radius; 89 border-bottom-left-radius: $theme-border-radius;
84 border-bottom-right-radius: $theme-border-radius; 90 border-bottom-right-radius: $theme-border-radius;
91 padding: 20px;
85 92
86 a { 93 a {
87 display: block; 94 display: block;
88 text-align: center;
89 color: $theme-gray; 95 color: $theme-gray;
90 margin-bottom: 8px; 96 margin-bottom: 8px;
97 text-align: center;
91 98
92 &:last-of-type { 99 &:last-of-type { margin-bottom: 0; }
93 margin-bottom: 0;
94 }
95 } 100 }
96 } 101 }
97 102
98 .auth__adlk { 103 .auth__adlk {
104 bottom: 15px;
99 position: absolute; 105 position: absolute;
100 right: 25px; 106 right: 25px;
101 bottom: 15px;
102 107
103 img { 108 img { width: 65px; }
104 width: 65px;
105 }
106 } 109 }
107 110
108 .auth__letter { 111 .auth__letter { margin-bottom: 30px; }
109 margin-bottom: 30px; 112 .scroll-container { z-index: 10; }
110 } 113 .info-bar { position: absolute; }
111
112 .scroll-container {
113 z-index: 10;
114 }
115
116 .info-bar {
117 position: absolute;
118 }
119 114
120 &__scroll-container { 115 &__scroll-container {
121 overflow: scroll;
122 width: 100%;
123 max-height: 100vh; 116 max-height: 100vh;
124 padding: 80px 0; 117 padding: 80px 0;
118 overflow: scroll;
119 width: 100%;
125 } 120 }
126 121
127 .available-services { 122 .available-services { margin-bottom: 15px; }
128 margin-bottom: 15px;
129 }
130 123
131 .unavailable-services { 124 .unavailable-services {
132 margin: 15px 0; 125 margin: 15px 0;
133 126
134 p { 127 p { text-transform: capitalize; }
135 text-transform: capitalize;
136 }
137 } 128 }
138 129
139 .legal { 130 .legal {
140 text-align: center;
141 margin-top: 20px;
142 color: $theme-gray-light; 131 color: $theme-gray-light;
132 margin-top: 20px;
133 text-align: center;
143 } 134 }
144} 135}
diff --git a/src/styles/badge.scss b/src/styles/badge.scss
index d7dfaf783..f9fac039a 100644
--- a/src/styles/badge.scss
+++ b/src/styles/badge.scss
@@ -1,15 +1,34 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.theme__dark .badge {
4 background: $dark-theme-gray;
5 border-radius: $theme-border-radius-small;
6 color: $dark-theme-gray-lightest;
7
8 &.badge--primary,
9 &.badge--premium {
10 background: $theme-brand-primary;
11 color: $dark-theme-gray-smoke;
12 }
13}
14
15
3.badge { 16.badge {
4 font-size: 14px; 17 background: $theme-gray-lighter;
18 border-radius: $theme-border-radius;
5 display: inline-block; 19 display: inline-block;
20 font-size: 14px;
6 padding: 5px 10px; 21 padding: 5px 10px;
7 border-radius: $theme-border-radius;
8 background: $theme-gray-lighter;
9 22
10 &.badge--primary, 23 &.badge--primary,
11 &.badge--premium { 24 &.badge--premium {
12 background: $theme-brand-primary; 25 background: $theme-brand-primary;
13 color: #FFF; 26 color: #FFF;
14 } 27 }
28
29 &.badge--success {
30 background: $theme-brand-success;
31 color: #FFF;
32 }
33
15} 34}
diff --git a/src/styles/button.scss b/src/styles/button.scss
index 8d2adbbcc..a66345114 100644
--- a/src/styles/button.scss
+++ b/src/styles/button.scss
@@ -1,71 +1,94 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.theme__dark .franz-form__button {
4 background: $theme-brand-primary;
5 color: $dark-theme-text-color;
6
7 &:hover { background: darken($theme-brand-primary, 5%); }
8 &:active { background: lighten($theme-brand-primary, 5%); }
9
10 &.franz-form__button--secondary {
11 background: $dark-theme-gray-lighter;
12 color: $dark-theme-text-color;
13
14 &:hover { background: lighten($dark-theme-gray-lighter, 10%); }
15 &:active { background: lighten($dark-theme-gray-lighter, 20%); }
16 }
17
18 &.franz-form__button--danger {
19 background: $theme-brand-danger;
20
21 &:hover { background: darken($theme-brand-danger, 5%); }
22 &:active { background: lighten($theme-brand-danger, 5%); }
23 }
24
25 &.franz-form__button--warning {
26 background: $theme-brand-warning;
27
28 &:hover { background: darken($theme-brand-warning, 5%); }
29 &:active { background: lighten($theme-brand-warning, 5%); }
30 }
31
32 &.franz-form__button--inverted {
33 border: 2px solid $theme-brand-primary;
34 color: $theme-brand-primary;
35
36 &:hover {
37 background: darken($theme-brand-primary, 5%);
38 color: $dark-theme-text-color;
39 }
40 }
41
42 &:disabled { opacity: .5; }
43}
44
3.franz-form__button { 45.franz-form__button {
4 position: relative;
5 background: $theme-brand-primary; 46 background: $theme-brand-primary;
47 border-radius: 3px;
6 display: block; 48 display: block;
7 padding: 10px 20px;
8 color: #FFF; 49 color: #FFF;
9 border-radius: 3px; 50 padding: 10px 20px;
10 transition: background 0.5s; 51 position: relative;
52 transition: background .5s;
11 text-align: center; 53 text-align: center;
12 54
13 &:hover { 55 &:hover { background: darken($theme-brand-primary, 5%) }
14 background: darken($theme-brand-primary, 5%);
15 }
16 56
17 &:active { 57 &:active {
18 transition: none;
19 background: lighten($theme-brand-primary, 5%); 58 background: lighten($theme-brand-primary, 5%);
59 transition: none;
20 } 60 }
21 61
22 &:disabled { 62 &:disabled { opacity: .2; }
23 opacity: 0.2;
24 }
25 63
26 &.franz-form__button--secondary { 64 &.franz-form__button--secondary {
27 background: $theme-gray-lighter; 65 background: $theme-gray-lighter;
28 color: $theme-gray; 66 color: $theme-gray;
29 67
30 &:hover { 68 &:hover { background: darken($theme-gray-lighter, 5%); }
31 background: darken($theme-gray-lighter, 5%); 69 &:active { background: lighten($theme-gray-lighter, 5%); }
32 }
33
34 &:active {
35 background: lighten($theme-gray-lighter, 5%);
36 }
37 } 70 }
38 71
39 &.franz-form__button--danger { 72 &.franz-form__button--danger {
40 background: $theme-brand-danger; 73 background: $theme-brand-danger;
41 74
42 &:hover { 75 &:hover { background: darken($theme-brand-danger, 5%); }
43 background: darken($theme-brand-danger, 5%); 76 &:active { background: lighten($theme-brand-danger, 5%); }
44 }
45
46 &:active {
47 background: lighten($theme-brand-danger, 5%);
48 }
49 } 77 }
50 78
51 &.franz-form__button--warning { 79 &.franz-form__button--warning {
52 background: $theme-brand-warning; 80 background: $theme-brand-warning;
53 81
54 &:hover { 82 &:hover { background: darken($theme-brand-warning, 5%); }
55 background: darken($theme-brand-warning, 5%); 83 &:active { background: lighten($theme-brand-warning, 5%); }
56 }
57
58 &:active {
59 background: lighten($theme-brand-warning, 5%);
60 }
61 } 84 }
62 85
63 &.franz-form__button--inverted { 86 &.franz-form__button--inverted {
64 background: none; 87 background: none;
65 padding: 10px 20px;
66 border: 2px solid $theme-brand-primary; 88 border: 2px solid $theme-brand-primary;
67 color: $theme-brand-primary; 89 color: $theme-brand-primary;
68 transition: background 0.5s, color 0.5s; 90 padding: 10px 20px;
91 transition: background .5s, color .5s;
69 92
70 &:hover { 93 &:hover {
71 background: darken($theme-brand-primary, 5%); 94 background: darken($theme-brand-primary, 5%);
@@ -74,11 +97,11 @@
74 } 97 }
75 98
76 .loader { 99 .loader {
100 display: inline-block;
101 height: 12px;
102 margin-right: 5px;
77 position: relative; 103 position: relative;
78 width: 20px; 104 width: 20px;
79 height: 12px;
80 z-index: 9999; 105 z-index: 9999;
81 display: inline-block;
82 margin-right: 5px;
83 } 106 }
84} 107}
diff --git a/src/styles/colors.scss b/src/styles/colors.scss
index 5d8302c28..80c2fb633 100644
--- a/src/styles/colors.scss
+++ b/src/styles/colors.scss
@@ -1,22 +1,40 @@
1$theme-brand-primary: #3498db; 1@import "./type-helper";
2$theme-brand-success: #5cb85c;
3$theme-brand-info: #5bc0de;
4$theme-brand-warning: #FF9F00;
5$theme-brand-danger: #d9534f;
6 2
7$theme-gray-dark: #373a3c; 3$theme-brand-primary: convert-rgb-string-to-color($raw-theme-brand-primary);
8$theme-gray: #55595c; 4$theme-brand-success: convert-rgb-string-to-color($raw-theme-brand-success);
9$theme-gray-light: #818a91; 5$theme-brand-info: convert-rgb-string-to-color($raw-theme-brand-info);
10$theme-gray-lighter: #eceeef; 6$theme-brand-warning: convert-rgb-string-to-color($raw-theme-brand-warning);
11$theme-gray-lightest: #f7f7f9; 7$theme-brand-danger: convert-rgb-string-to-color($raw-theme-brand-danger);
12 8
13$theme-border-radius: 6px; 9$theme-gray-dark: convert-rgb-string-to-color($raw-theme-gray-dark);
14$theme-border-radius-small: 3px; 10$theme-gray: convert-rgb-string-to-color($raw-theme-gray);
11$theme-gray-light: convert-rgb-string-to-color($raw-theme-gray-light);
12$theme-gray-lighter: convert-rgb-string-to-color($raw-theme-gray-lighter);
13$theme-gray-lightest: convert-rgb-string-to-color($raw-theme-gray-lightest);
15 14
16$theme-sidebar-width: 68px; 15$theme-border-radius: to-number($raw-theme-border-radius);
16$theme-border-radius-small: to-number($raw-theme-border-radius-small);
17 17
18$theme-text-color: $theme-gray-dark; 18$theme-sidebar-width: to-number($raw-theme-sidebar-width);
19 19
20$theme-transition-time: 0.5s; 20$theme-text-color: convert-rgb-string-to-color($raw-theme-gray-dark);
21 21
22$theme-inset-shadow: inset 0 2px 5px rgba(0,0,0,0.03); 22$theme-transition-time: .5s;
23
24$theme-inset-shadow: inset 0 2px 5px rgba(0, 0, 0, .03);
25
26// Dark Theme
27$dark-theme-black: convert-rgb-string-to-color($raw-dark-theme-black);
28
29$dark-theme-gray-darkest: convert-rgb-string-to-color($raw-dark-theme-gray-darkest);
30$dark-theme-gray-darker: convert-rgb-string-to-color($raw-dark-theme-gray-darker);
31$dark-theme-gray-dark: convert-rgb-string-to-color($raw-dark-theme-gray-dark);
32
33$dark-theme-gray: convert-rgb-string-to-color($raw-dark-theme-gray);
34
35$dark-theme-gray-light: convert-rgb-string-to-color($raw-dark-theme-gray-light);
36$dark-theme-gray-lighter: convert-rgb-string-to-color($raw-dark-theme-gray-lighter);
37$dark-theme-gray-lightest: convert-rgb-string-to-color($raw-dark-theme-gray-lightest);
38
39$dark-theme-gray-smoke: convert-rgb-string-to-color($raw-dark-theme-gray-smoke);
40$dark-theme-text-color: convert-rgb-string-to-color($raw-dark-theme-text-color);
diff --git a/src/styles/content-tabs.scss b/src/styles/content-tabs.scss
index 47dfea2c4..ca3820fb4 100644
--- a/src/styles/content-tabs.scss
+++ b/src/styles/content-tabs.scss
@@ -2,53 +2,43 @@
2 2
3.content-tabs { 3.content-tabs {
4 .content-tabs__tabs { 4 .content-tabs__tabs {
5 display: flex;
6 border-top-left-radius: $theme-border-radius-small; 5 border-top-left-radius: $theme-border-radius-small;
7 border-top-right-radius: $theme-border-radius-small; 6 border-top-right-radius: $theme-border-radius-small;
7 display: flex;
8 overflow: hidden; 8 overflow: hidden;
9 9
10 .content-tabs__item { 10 .content-tabs__item {
11 padding: 10px;
12 flex: 1;
13 // border: 1px solid $theme-gray-lightest;
14 color: $theme-gray-dark;
15 background: linear-gradient($theme-gray-lightest 80%, darken($theme-gray-lightest, 3%)); 11 background: linear-gradient($theme-gray-lightest 80%, darken($theme-gray-lightest, 3%));
16 border-right: 1px solid $theme-gray-lighter; 12 border-right: 1px solid $theme-gray-lighter;
13 color: $theme-gray-dark;
14 flex: 1;
15 padding: 10px;
17 transition: background $theme-transition-time; 16 transition: background $theme-transition-time;
18 17
19 &:last-of-type { 18 &:last-of-type { border-right: 0; }
20 border-right: 0;
21 }
22 19
23 &.is-active { 20 &.is-active {
24 background: $theme-brand-primary; 21 background: $theme-brand-primary;
25 color: #FFF;
26 box-shadow: none; 22 box-shadow: none;
23 color: #FFF;
27 } 24 }
28 } 25 }
29 } 26 }
30 27
31 .content-tabs__content { 28 .content-tabs__content {
32 padding: 20px 20px; 29 background: $theme-gray-lightest;
33 border-bottom-left-radius: $theme-border-radius-small; 30 border-bottom-left-radius: $theme-border-radius-small;
34 border-bottom-right-radius: $theme-border-radius-small; 31 border-bottom-right-radius: $theme-border-radius-small;
35 background: $theme-gray-lightest; 32 padding: 20px 20px;
36 33
37 .content-tabs__item { 34 .content-tabs__item {
38 top: 0;
39 display: none; 35 display: none;
36 top: 0;
40 37
41 &.is-active { 38 &.is-active { display: block; }
42 display: block;
43 }
44 }
45
46 .franz-form__input-wrapper {
47 background: #FFF;
48 } 39 }
49 40
50 .franz-form__field:last-of-type { 41 .franz-form__input-wrapper { background: #FFF; }
51 margin-bottom: 0; 42 .franz-form__field:last-of-type { margin-bottom: 0; }
52 }
53 } 43 }
54} 44}
diff --git a/src/styles/image-upload.scss b/src/styles/image-upload.scss
index 06176a7af..31300c227 100644
--- a/src/styles/image-upload.scss
+++ b/src/styles/image-upload.scss
@@ -1,74 +1,89 @@
1.theme__dark {
2 .image-upload {
3 background: $dark-theme-gray-darker;
4 border: 1px solid $dark-theme-gray-light;
5 color: $dark-theme-gray-lighter;
6
7 &__action {
8 &-background { background: rgba($dark-theme-black, .7); }
9
10 button {
11 color: $dark-theme-gray-lightest;
12
13 .mdi { color: $dark-theme-gray-lightest; }
14 }
15 }
16 }
17
18 .image-upload-wrapper .mdi { color: $dark-theme-gray-light; }
19}
20
1.image-upload { 21.image-upload {
2 position: absolute; 22 background: $theme-gray-lightest;
3 width: 140px;
4 height: 140px;
5 border: 1px solid $theme-gray-lighter; 23 border: 1px solid $theme-gray-lighter;
6 border-radius: $theme-border-radius-small; 24 border-radius: $theme-border-radius-small;
7 background: $theme-gray-lightest; 25 height: 140px;
8 overflow: hidden;
9 margin-top: 5px; 26 margin-top: 5px;
27 overflow: hidden;
28 position: relative;
29 width: 140px;
10 30
11 &__preview, 31 &__preview,
12 &__action { 32 &__action {
13 position: absolute;
14 top: 0;
15 left: 0; 33 left: 0;
34 position: absolute;
16 right: 0; 35 right: 0;
36 top: 0;
17 } 37 }
18 38
19 &__preview { 39 &__preview {
20 z-index: 1;
21 background-size: cover;
22 background-size: 100%;
23 background-repeat: no-repeat;
24 background-position: center center; 40 background-position: center center;
41 background-repeat: no-repeat;
42 background-size: cover;
25 border-radius: 3px; 43 border-radius: 3px;
44 z-index: 1;
26 } 45 }
27 46
28 &__action { 47 &__action {
29 position: relative;
30 z-index: 10;
31 opacity: 0;
32 transition: opacity 0.5s;
33 display: flex; 48 display: flex;
34 justify-content: center; 49 justify-content: center;
50 opacity: 0;
51 position: relative;
52 transition: opacity .5s;
53 z-index: 10;
35 54
36 &-background { 55 &-background {
37 position: absolute; 56 background: rgba($theme-gray, .7);
38 top: 0; 57 bottom: 0;
39 left: 0; 58 left: 0;
59 position: absolute;
40 right: 0; 60 right: 0;
41 bottom: 0; 61 top: 0;
42 background: rgba($theme-gray, 0.7);
43 z-index: 10; 62 z-index: 10;
44 } 63 }
45 64
46 button { 65 button {
66 color: #FFF;
47 position: relative; 67 position: relative;
48 z-index: 100; 68 z-index: 100;
49 color: #FFF;
50 69
51 .mdi { 70 .mdi { color: #FFF; }
52 color: #FFF;
53 }
54 } 71 }
55 } 72 }
56 73
57 &__dropzone { 74 &__dropzone {
58 text-align: center; 75 align-items: center;
59 border-radius: 5px; 76 border-radius: 5px;
60 padding: 10px;
61 display: flex; 77 display: flex;
62 align-items: center;
63 justify-content: center;
64 flex-direction: column; 78 flex-direction: column;
79 justify-content: center;
80 padding: 10px;
81 text-align: center;
65 } 82 }
66 83
67 &__dropzone, 84 &__dropzone,
68 button { 85 button {
69 .mdi { 86 .mdi { margin-bottom: 5px; }
70 margin-bottom: 5px;
71 }
72 87
73 p { 88 p {
74 font-size: 10px; 89 font-size: 10px;
@@ -76,16 +91,10 @@
76 } 91 }
77 } 92 }
78 93
79 &:hover { 94 &:hover .image-upload__action { opacity: 1; }
80 .image-upload__action {
81 opacity: 1;
82 }
83 }
84} 95}
85 96
86.image-upload-wrapper { 97.image-upload-wrapper .mdi {
87 .mdi { 98 color: $theme-gray-light;
88 font-size: 40px; 99 font-size: 40px;
89 color: $theme-gray-light; 100}
90 }
91} \ No newline at end of file
diff --git a/src/styles/info-bar.scss b/src/styles/info-bar.scss
index b6d1e84e2..fb4917358 100644
--- a/src/styles/info-bar.scss
+++ b/src/styles/info-bar.scss
@@ -1,83 +1,68 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.info-bar { 3.info-bar {
4 width: 100%; 4 align-items: center;
5 height: 50px;
6 background: $theme-brand-primary; 5 background: $theme-brand-primary;
6 box-shadow: 0 0 8px rgba(black, .2);
7 display: flex; 7 display: flex;
8 align-items: center; 8 height: 50px;
9 justify-content: center; 9 justify-content: center;
10 padding: 0 20px; 10 padding: 0 20px;
11 position: relative; 11 position: relative;
12 // bottom: 0; 12 width: 100%;
13 z-index: 100; 13 z-index: 100;
14 box-shadow: 0 0 8px rgba(black, 0.2);
15 14
16 .info-bar__content { 15 .info-bar__content {
17 height: auto; 16 height: auto;
18 17
19 .mdi { 18 .mdi { margin-right: 5px; }
20 margin-right: 5px;
21 }
22 } 19 }
23 20
24 .info-bar__close { 21 .info-bar__close {
22 color: #FFF;
25 position: absolute; 23 position: absolute;
26 right: 10px; 24 right: 10px;
27 color: #FFF;
28 } 25 }
29 26
30 .info-bar__cta { 27 .info-bar__cta {
31 color: #FFF;
32 padding: 3px 8px;
33 border-radius: $theme-border-radius-small;
34 border-color: #FFF; 28 border-color: #FFF;
35 border-width: 2px; 29 border-radius: $theme-border-radius-small;
36 border-style: solid; 30 border-style: solid;
31 border-width: 2px;
32 color: #FFF;
37 margin-left: 15px; 33 margin-left: 15px;
34 padding: 3px 8px;
38 35
39 .loader { 36 .loader {
37 display: inline-block;
38 height: 12px;
39 margin-right: 5px;
40 position: relative; 40 position: relative;
41 width: 20px; 41 width: 20px;
42 height: 12px;
43 z-index: 9999; 42 z-index: 9999;
44 display: inline-block;
45 margin-right: 5px;
46 } 43 }
47 } 44 }
48 45
49 a { 46 &.info-bar--bottom { order: 10; }
50 // text-decoration: underline;
51 }
52
53 &.info-bar--bottom {
54 order: 10;
55 }
56 47
57 &.info-bar--primary { 48 &.info-bar--primary {
58 background: $theme-brand-primary; 49 background: $theme-brand-primary;
59 color: #FFF; 50 color: #FFF;
60 51
61 a { 52 a { color: #FFF; }
62 color: #FFF;
63 }
64 } 53 }
65 54
66 &.info-bar--warning { 55 &.info-bar--warning {
67 background: $theme-brand-warning; 56 background: $theme-brand-warning;
68 color: #FFF; 57 color: #FFF;
69 58
70 a { 59 a { color: #FFF; }
71 color: #FFF;
72 }
73 } 60 }
74 61
75 &.info-bar--danger { 62 &.info-bar--danger {
76 background: $theme-brand-danger; 63 background: $theme-brand-danger;
77 color: #FFF; 64 color: #FFF;
78 65
79 a { 66 a { color: #FFF; }
80 color: #FFF;
81 }
82 } 67 }
83} 68}
diff --git a/src/styles/infobox.scss b/src/styles/infobox.scss
index 7ab094058..e287e5be7 100644
--- a/src/styles/infobox.scss
+++ b/src/styles/infobox.scss
@@ -1,20 +1,16 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.infobox { 3.infobox {
4 height: auto; 4 align-items: center;
5 padding: 15px 20px;
6 margin-bottom: 30px;
7 border-radius: $theme-border-radius-small; 5 border-radius: $theme-border-radius-small;
8 display: flex; 6 display: flex;
9 align-items: center; 7 height: auto;
8 margin-bottom: 30px;
9 padding: 15px 20px;
10 10
11 a { 11 a { color: #FFF; }
12 color: #FFF;
13 }
14 12
15 .infobox__content { 13 .infobox__content { flex: 1; }
16 flex: 1;
17 }
18 14
19 &.infobox--success { 15 &.infobox--success {
20 background: $theme-brand-success; 16 background: $theme-brand-success;
@@ -36,26 +32,24 @@
36 color: #FFF; 32 color: #FFF;
37 } 33 }
38 34
39 .mdi { 35 .mdi { margin-right: 10px; }
40 margin-right: 10px;
41 }
42 36
43 .infobox__cta { 37 .infobox__cta {
44 color: #FFF;
45 padding: 3px 8px;
46 border-radius: $theme-border-radius-small;
47 border-color: #FFF; 38 border-color: #FFF;
48 border-width: 2px; 39 border-radius: $theme-border-radius-small;
49 border-style: solid; 40 border-style: solid;
41 border-width: 2px;
42 color: #FFF;
50 margin-left: 15px; 43 margin-left: 15px;
44 padding: 3px 8px;
51 45
52 .loader { 46 .loader {
47 display: inline-block;
48 height: 12px;
49 margin-right: 5px;
53 position: relative; 50 position: relative;
54 width: 20px; 51 width: 20px;
55 height: 12px;
56 z-index: 9999; 52 z-index: 9999;
57 display: inline-block;
58 margin-right: 5px;
59 } 53 }
60 } 54 }
61 55
diff --git a/src/styles/input.scss b/src/styles/input.scss
index 7042f56e8..687bcac64 100644
--- a/src/styles/input.scss
+++ b/src/styles/input.scss
@@ -1,6 +1,34 @@
1@import './config.scss'; 1@import './config.scss';
2@import './mixins.scss'; 2@import './mixins.scss';
3 3
4.theme__dark .franz-form {
5 .franz-form__label { color: $dark-theme-text-color; }
6
7 .franz-form__input-wrapper {
8 background: $dark-theme-gray-dark;
9 border: 1px solid $dark-theme-gray-light;
10 }
11
12 .franz-form__input {
13 color: $dark-theme-gray-lightest;
14
15 &::placeholder { color: $dark-theme-gray-lighter; }
16 }
17
18 .franz-form__input-prefix,
19 .franz-form__input-suffix {
20 background: $dark-theme-gray;
21 color: $dark-theme-gray-lighter;
22 }
23
24 .franz-form__input-modifier {
25 border-left: 1px solid $dark-theme-gray-light;
26 color: $dark-theme-gray-lighter;
27 }
28
29 .franz-form__password-score { background: $dark-theme-gray-dark; }
30}
31
4.franz-form { 32.franz-form {
5 .franz-form__field { 33 .franz-form__field {
6 display: flex; 34 display: flex;
@@ -9,19 +37,12 @@
9 margin-bottom: 20px; 37 margin-bottom: 20px;
10 38
11 &.has-error { 39 &.has-error {
12 .franz-form__input-wrapper { 40 .franz-form__input-wrapper,
13 border-color: $theme-brand-danger; 41 .franz-form__input-modifier { border-color: $theme-brand-danger; }
14 }
15
16 .franz-form__input-modifier {
17 border-color: $theme-brand-danger;
18 }
19 } 42 }
20 } 43 }
21 44
22 .franz-form__label { 45 .franz-form__label { @include formLabel(); }
23 @include formLabel();
24 }
25 46
26 .franz-form__error { 47 .franz-form__error {
27 color: $theme-brand-danger; 48 color: $theme-brand-danger;
@@ -30,74 +51,60 @@
30 } 51 }
31 52
32 .franz-form__input-wrapper { 53 .franz-form__input-wrapper {
33 display: flex;
34 width: 100%;
35 order: 1;
36 border-radius: $theme-border-radius-small;
37 background: $theme-gray-lightest; 54 background: $theme-gray-lightest;
38 border: 1px solid $theme-gray-lighter; 55 border: 1px solid $theme-gray-lighter;
56 border-radius: $theme-border-radius-small;
57 display: flex;
39 flex-wrap: wrap; 58 flex-wrap: wrap;
59 order: 1;
60 width: 100%;
40 } 61 }
41 62
42 .franz-form__input { 63 .franz-form__input {
43 flex: 1;
44 border: 0;
45 background: none; 64 background: none;
46 width: 100%; 65 border: 0;
47 padding: 8px;
48 // font-size: 18px;
49 color: $theme-gray; 66 color: $theme-gray;
67 flex: 1;
68 padding: 8px;
69 width: 100%;
50 70
51 &::placeholder { 71 &::placeholder { color: lighten($theme-gray-light, 10%); }
52 color: lighten($theme-gray-light, 10%);
53 }
54 } 72 }
55 73
56 .franz-form__input-prefix, 74 .franz-form__input-prefix,
57 .franz-form__input-suffix { 75 .franz-form__input-suffix {
58 padding: 0 10px;
59 background: $theme-gray-lighter; 76 background: $theme-gray-lighter;
60 color: $theme-gray-light; 77 color: $theme-gray-light;
61 line-height: 35px; 78 line-height: 35px;
79 padding: 0 10px;
62 } 80 }
63 81
64 .franz-form__input-modifier { 82 .franz-form__input-modifier {
65 padding: 0 20px;
66 border-left: 1px solid $theme-gray-lighter; 83 border-left: 1px solid $theme-gray-lighter;
67 color: $theme-gray-light; 84 color: $theme-gray-light;
68 font-size: 20px; 85 font-size: 20px;
86 padding: 0 20px;
69 } 87 }
70 88
71 .franz-form__password-score { 89 .franz-form__password-score {
72 background: $theme-gray-lighter; 90 background: $theme-gray-lighter;
73 height: 5px;
74 flex-basis: 100%;
75 border-bottom-left-radius: 3px; 91 border-bottom-left-radius: 3px;
76 border-bottom-right-radius: 3px; 92 border-bottom-right-radius: 3px;
93 flex-basis: 100%;
94 height: 5px;
77 95
78 meter { 96 meter {
79 width: 100%;
80 height: 100%;
81 display: block;
82 border-bottom-left-radius: 3px; 97 border-bottom-left-radius: 3px;
83 border-bottom-right-radius: 3px; 98 border-bottom-right-radius: 3px;
99 display: block;
100 height: 100%;
84 overflow: hidden; 101 overflow: hidden;
102 width: 100%;
85 103
86 &::-webkit-meter-bar { 104 &::-webkit-meter-bar { background: none; }
87 background: none; 105 &::-webkit-meter-even-less-good-value { background: $theme-brand-danger; }
88 } 106 &::-webkit-meter-suboptimum-value { background: $theme-brand-warning; }
89 107 &::-webkit-meter-optimum-value { background: $theme-brand-success; }
90 &::-webkit-meter-even-less-good-value {
91 background: $theme-brand-danger;
92 }
93
94 &::-webkit-meter-suboptimum-value {
95 background: $theme-brand-warning;
96 }
97
98 &::-webkit-meter-optimum-value {
99 background: $theme-brand-success;
100 }
101 } 108 }
102 } 109 }
103} 110}
diff --git a/src/styles/invite.scss b/src/styles/invite.scss
index bfb1a4b6b..594224f62 100644
--- a/src/styles/invite.scss
+++ b/src/styles/invite.scss
@@ -1,15 +1,8 @@
1.invite__form { 1.invite__form {
2 /* play with values to see different layouts */
3 // display: flex;
4 align-items: center; 2 align-items: center;
5 align-self: center; 3 align-self: center;
6 justify-content: center; 4 justify-content: center;
7} 5}
8 6
9.invite__embed { 7.invite__embed { text-align: center; }
10 text-align: center; 8.invite__embed--button { width: 100%; }
11}
12
13.invite__embed--button {
14 width: 100%;
15} \ No newline at end of file
diff --git a/src/styles/layout.scss b/src/styles/layout.scss
index 964a9fcea..ebf468cf0 100644
--- a/src/styles/layout.scss
+++ b/src/styles/layout.scss
@@ -1,16 +1,36 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3html { 3html { overflow: hidden; }
4 overflow: hidden; 4
5.theme__dark .app {
6 .sidebar {
7 background: $dark-theme-gray-darker;
8 box-shadow: 0 0 5px 0 $dark-theme-black;
9 color: $theme-text-color;
10
11 .sidebar__add-service {
12 color: $dark-theme-gray-lighter;
13 background: $dark-theme-gray;
14 }
15
16 .sidebar__button {
17 color: $dark-theme-gray-lighter;
18 font-size: 22px;
19
20 &:hover,
21 &:active { color: $dark-theme-gray-smoke; }
22 &.is-muted { color: $dark-theme-gray; }
23 }
24 }
25
26 .app-loader .app-loader__title { color: $dark-theme-gray-lightest; }
5} 27}
6 28
7.app { 29.app {
8 display: flex; 30 display: flex;
9 flex-direction: column; 31 flex-direction: column;
10 32
11 .app__content { 33 .app__content { display: flex; }
12 display: flex;
13 }
14 34
15 .app__service { 35 .app__service {
16 display: flex; 36 display: flex;
@@ -19,134 +39,100 @@ html {
19 } 39 }
20} 40}
21 41
22.electron-app-title-bar { 42.electron-app-title-bar { z-index: 99999999; }
23 z-index: 99999999;
24}
25 43
26.window-draggable { 44.window-draggable {
27 position: absolute;
28 width: 100%;
29 top: 0px;
30 left: 0px;
31 height: 35px; 45 height: 35px;
46 left: 0;
32 pointer-events: none; 47 pointer-events: none;
33 -webkit-app-region: drag; 48 position: absolute;
49 top: 0;
50 width: 100%;
34 z-index: 9999; 51 z-index: 9999;
52 -webkit-app-region: drag;
35} 53}
36 54
37.darwin { 55.darwin .sidebar { padding-top: 23px; }
38 .sidebar {
39 padding-top: 23px;
40 }
41}
42 56
43.sidebar { 57.sidebar {
44 display: flex;
45 flex-direction: column;
46 align-items: center; 58 align-items: center;
47 width: $theme-sidebar-width;
48 background: $theme-gray-lightest; 59 background: $theme-gray-lightest;
49 box-shadow: 1px 0 10px rgba(0,0,0,0.08); 60 box-shadow: 1px 0 10px rgba(0, 0, 0, .08);
50 z-index: 200;
51 text-align: center;
52 color: $theme-text-color; 61 color: $theme-text-color;
62 display: flex;
63 flex-direction: column;
53 padding-bottom: 10px; 64 padding-bottom: 10px;
65 text-align: center;
66 width: $theme-sidebar-width;
67 z-index: 200;
54 68
55 .sidebar__add-service { 69 .sidebar__add-service {
56 width: 32px; 70 color: $theme-gray-light;
57 height: 32px;
58 background: $theme-gray-lighter; 71 background: $theme-gray-lighter;
59 border-radius: $theme-border-radius-small; 72 border-radius: $theme-border-radius-small;
73 height: 32px;
60 margin: 10px auto; 74 margin: 10px auto;
61 color: $theme-gray-light; 75 width: 32px;
62 } 76 }
63 77
64 .sidebar__button { 78 .sidebar__button {
65 width: $theme-sidebar-width; 79 color: $theme-gray-light;
66 padding: 7px 0;
67 font-size: 24px; 80 font-size: 24px;
81 padding: 7px 0;
68 position: relative; 82 position: relative;
69 color: $theme-gray-light; 83 width: $theme-sidebar-width;
70
71 &:hover {
72 color: darken($theme-gray-light, 10%);
73 }
74
75 &:active {
76 color: lighten($theme-gray-light, 10%);
77 }
78
79 &.is-muted {
80 color: $theme-brand-primary;
81 }
82 84
83 &--new-service { 85 &:hover,
84 padding-bottom: 6px; 86 &:active { color: lighten($theme-gray-light, 10%); }
85 } 87 &.is-muted { color: $theme-brand-primary; }
88 &--new-service { padding-bottom: 6px; }
86 } 89 }
87 90
88 & > div { 91 & > div {
89 display: flex; 92 display: flex;
90 overflow-y: scroll; 93 overflow-y: scroll;
91 94
92 &::-webkit-scrollbar { 95 &::-webkit-scrollbar { display: none; }
93 display: none;
94 }
95 } 96 }
96} 97}
97 98
98.grid { 99.grid .grid__row {
99 .grid__row { 100 display: flex;
100 display: flex; 101 flex-direction: row;
101 flex-direction: row;
102
103 &>* {
104 margin-right: 20px;
105 }
106 102
107 & :last-child { 103 & > * { margin-right: 20px; }
108 margin-right: 0; 104 & :last-child { margin-right: 0; }
109 }
110 }
111} 105}
112 106
113.app-loader { 107.app-loader {
108 align-items: center;
114 display: flex; 109 display: flex;
115 justify-content: center; 110 justify-content: center;
116 align-items: center;
117 111
118 .app-loader__title { 112 .app-loader__title {
119 color: #FFF; 113 color: #FFF;
120 font-size: 40px; 114 font-size: 40px;
121 } 115 }
122 116
123 &>span { 117 & > span { height: auto; }
124 height: auto;
125 }
126}
127
128.dev-warning {
129 display: none;
130} 118}
131 119
132.isDevMode { 120.dev-warning { display: none; }
133 .dev-warning { 121
134 display: block; 122.isDevMode .dev-warning {
135 position: fixed; 123 border-radius: 3px;
136 background: $theme-brand-warning; 124 background: $theme-brand-warning;
137 width: auto; 125 color: #FFF;
138 height: auto; 126 display: block;
139 top: 5px; 127 font-size: 10px;
140 right: 5px; 128 height: auto;
141 padding: 4px; 129 padding: 4px;
142 font-size: 10px; 130 position: fixed;
143 color: #FFF; 131 right: 5px;
144 z-index: 999999999; 132 top: 5px;
145 border-radius: 3px; 133 transition: opacity .5s ease;
146 transition: opacity 0.5s ease; 134 width: auto;
147 135 z-index: 999999999;
148 &:hover { 136
149 opacity: 0; 137 &:hover { opacity: 0; }
150 }
151 }
152} 138}
diff --git a/src/styles/mixins.scss b/src/styles/mixins.scss
index c9b1bc988..06efb475a 100644
--- a/src/styles/mixins.scss
+++ b/src/styles/mixins.scss
@@ -1,9 +1,9 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3@mixin formLabel { 3@mixin formLabel {
4 width: 100%;
5 color: $theme-gray-light; 4 color: $theme-gray-light;
6 display: block; 5 display: block;
7 margin-bottom: 5px; 6 margin-bottom: 5px;
8 order: 0; 7 order: 0;
8 width: 100%;
9} 9}
diff --git a/src/styles/radio.scss b/src/styles/radio.scss
index 644478cd6..87d401215 100644
--- a/src/styles/radio.scss
+++ b/src/styles/radio.scss
@@ -1,34 +1,39 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.franz-form { 3.theme__dark .franz-form .franz-form__radio {
4 .franz-form__radio-wrapper { 4 border: 1px solid $dark-theme-gray-lighter;
5 display: flex; 5 color: $dark-theme-gray-lightest;
6
7 &.is-selected {
8 background: $dark-theme-gray-lighter;
9 border: 1px solid $dark-theme-gray-lighter;
10 color: $dark-theme-gray-smoke;
6 } 11 }
12}
13
14
15.franz-form {
16 .franz-form__radio-wrapper { display: flex; }
7 17
8 .franz-form__radio { 18 .franz-form__radio {
9 // background: $theme-gray-lightest;
10 border: 2px solid $theme-gray-lighter; 19 border: 2px solid $theme-gray-lighter;
20 border-radius: $theme-border-radius-small;
21 box-shadow: $theme-inset-shadow;
11 color: $theme-gray; 22 color: $theme-gray;
12 padding: 11px; 23 flex: 1;
13 margin-right: 20px; 24 margin-right: 20px;
25 padding: 11px;
14 text-align: center; 26 text-align: center;
15 border-radius: $theme-border-radius-small;
16 flex: 1;
17 box-shadow: $theme-inset-shadow;
18 transition: background $theme-transition-time; 27 transition: background $theme-transition-time;
19 28
20 &:last-of-type { 29 &:last-of-type { margin-right: 0; }
21 margin-right: 0;
22 }
23 30
24 &.is-selected { 31 &.is-selected {
25 border: 2px solid $theme-brand-primary;
26 background: #FFF; 32 background: #FFF;
33 border: 2px solid $theme-brand-primary;
27 color: $theme-brand-primary; 34 color: $theme-brand-primary;
28 } 35 }
29 36
30 input { 37 input { display: none; }
31 display: none;
32 }
33 } 38 }
34} 39}
diff --git a/src/styles/recipes.scss b/src/styles/recipes.scss
index 1b519a5e5..84222e1fe 100644
--- a/src/styles/recipes.scss
+++ b/src/styles/recipes.scss
@@ -1,16 +1,22 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.theme__dark .recipe-teaser {
4 background-color: $dark-theme-gray-dark;
5
6 &:hover { background-color: $dark-theme-gray; }
7}
8
3.recipes { 9.recipes {
4 .recipes__list { 10 .recipes__list {
11 align-content: flex-start;
5 display: flex; 12 display: flex;
6 flex-flow: row wrap; 13 flex-flow: row wrap;
7 align-content: flex-start;
8 min-height: 70%;
9 height: auto; 14 height: auto;
15 min-height: 70%;
10 16
11 &.recipes__list--disabled { 17 &.recipes__list--disabled {
12 opacity: 0.3;
13 filter: grayscale(100%); 18 filter: grayscale(100%);
19 opacity: .3;
14 pointer-events: none; 20 pointer-events: none;
15 } 21 }
16 } 22 }
@@ -19,58 +25,48 @@
19 height: auto; 25 height: auto;
20 margin-bottom: 35px; 26 margin-bottom: 35px;
21 27
22 .badge { 28 .badge { margin-right: 10px; }
23 margin-right: 10px;
24 }
25 29
26 &.recipes__navigation--disabled { 30 &.recipes__navigation--disabled {
27 opacity: 0.3;
28 filter: grayscale(100%); 31 filter: grayscale(100%);
32 opacity: .3;
29 pointer-events: none; 33 pointer-events: none;
30 } 34 }
31 } 35 }
32 36
33 &__service-request { 37 &__service-request { float: right; }
34 float: right;
35 }
36} 38}
37 39
38.recipe-teaser { 40.recipe-teaser {
39 position: relative; 41 background-color: $theme-gray-lightest;
40 width: calc(25% - 20px); 42 border-radius: $theme-border-radius;
41 height: 120px; 43 height: 120px;
42 margin: 0 20px 20px 0; 44 margin: 0 20px 20px 0;
43 border-radius: $theme-border-radius;
44 background-color: $theme-gray-lightest;
45 transition: background $theme-transition-time;
46 overflow: hidden; 45 overflow: hidden;
46 position: relative;
47 transition: background $theme-transition-time;
48 width: calc(25% - 20px);
47 49
48 &:hover { 50 &:hover { background-color: $theme-gray-lighter; }
49 background-color: $theme-gray-lighter;
50 }
51 51
52 .recipe-teaser__icon { 52 .recipe-teaser__icon {
53 width: 50px;
54 margin-bottom: 10px; 53 margin-bottom: 10px;
54 width: 50px;
55 } 55 }
56 56
57 .recipe-teaser__label { 57 .recipe-teaser__label { display: block; }
58 display: block;
59 }
60 58
61 h2 { 59 h2 { z-index: 10; }
62 z-index: 10;
63 }
64 60
65 &__dev-badge { 61 &__dev-badge {
66 position: absolute;
67 top: 5px;
68 right: -13px;
69 width: 50px;
70 background: $theme-brand-warning; 62 background: $theme-brand-warning;
63 box-shadow: 0 0 4px rgba(black, .2);
71 color: #FFF; 64 color: #FFF;
72 font-size: 10px; 65 font-size: 10px;
66 position: absolute;
67 right: -13px;
68 top: 5px;
73 transform: rotateZ(45deg); 69 transform: rotateZ(45deg);
74 box-shadow: 0 0 4px rgba(black, 0.2); 70 width: 50px;
75 } 71 }
76} 72}
diff --git a/src/styles/reset.scss b/src/styles/reset.scss
index 21763f44f..80328dcef 100644
--- a/src/styles/reset.scss
+++ b/src/styles/reset.scss
@@ -16,63 +16,62 @@ article, aside, canvas, details, embed,
16figure, figcaption, footer, header, hgroup, 16figure, figcaption, footer, header, hgroup,
17menu, nav, output, ruby, section, summary, 17menu, nav, output, ruby, section, summary,
18time, mark, audio, video { 18time, mark, audio, video {
19 margin: 0;
20 padding: 0;
21 border: 0; 19 border: 0;
22 font-size: 100%;
23 font: inherit; 20 font: inherit;
21 font-size: 100%;
22 margin: 0;
23 padding: 0;
24} 24}
25/* HTML5 display-role reset for older browsers */ 25
26article, aside, details, figcaption, figure, 26article, aside, details, figcaption, figure,
27footer, header, hgroup, menu, nav, section { 27footer, header, hgroup, menu, nav, section { display: block; }
28 display: block; 28
29} 29ol,
30body { 30ul { list-style: none; }
31 line-height: 1; 31
32} 32blockquote,
33ol, ul { 33q {
34 list-style: none;
35}
36blockquote, q {
37 quotes: none; 34 quotes: none;
35
36 &::before,
37 &::after {
38 content: '';
39 content: none;
40 }
38} 41}
39blockquote:before, blockquote:after, q:before, q:after { 42
40 content: '';
41 content: none;
42}
43table { 43table {
44 border-collapse: collapse; 44 border-collapse: collapse;
45 border-spacing: 0; 45 border-spacing: 0;
46} 46}
47 47
48/* Buttons should not have any special style applied by default */
49button { 48button {
50 background: none; 49 background: none;
51 border: none; 50 border: none;
52 padding: 0; 51 padding: 0;
53}
54 52
55button:focus { 53 &:focus { outline: 0; }
56 outline: 0; 54 .theme__dark & { color: $dark-theme-gray-smoke; }
57} 55}
58 56
59html { 57html {
60 /* base for rem / 1rem = 10px */
61 font-size: 62.5%; 58 font-size: 62.5%;
62 font-family: 'Open Sans'; 59 font-family: 'Open Sans';
63} 60}
64 61
65body { 62body {
66 /* default font size = 14px */
67 font-size: 1.4rem;
68 color: $theme-gray-dark; 63 color: $theme-gray-dark;
64 font-size: 1.4rem;
65 line-height: 1;
66
67 .theme__dark { color: $dark-theme-gray-smoke; }
69} 68}
70 69
71* { 70* {
72 -webkit-font-smoothing: antialiased;
73 box-sizing: border-box; 71 box-sizing: border-box;
74 font-size: 1.4rem;
75 font-family: 'Open Sans'; 72 font-family: 'Open Sans';
73 font-size: 1.4rem;
74 -webkit-font-smoothing: antialiased;
76 -webkit-user-select: none; 75 -webkit-user-select: none;
77} 76}
78 77
@@ -82,14 +81,6 @@ html, body, div {
82 box-sizing: border-box; 81 box-sizing: border-box;
83} 82}
84 83
85*:focus { 84*:focus { outline: none; }
86 outline: none; 85img { pointer-events: none; }
87} 86a { cursor: default; }
88
89img {
90 pointer-events: none;
91}
92
93a {
94 cursor: default;
95}
diff --git a/src/styles/searchInput.scss b/src/styles/searchInput.scss
index 633a31e09..32b9da065 100644
--- a/src/styles/searchInput.scss
+++ b/src/styles/searchInput.scss
@@ -1,20 +1,32 @@
1@import './config.scss';
2@import './mixins.scss';
3
4.theme__dark .search-input {
5 @extend %headline__dark;
6 background: $dark-theme-gray-dark;
7 border: 1px solid $dark-theme-gray-light;
8 border-radius: $theme-border-radius;
9 color: $dark-theme-gray-lightest;
10
11 input { color: $dark-theme-gray-lightest; }
12}
13
1.search-input { 14.search-input {
2 width: 100%; 15 @extend %headline;
3 height: auto;
4 display: flex;
5 align-items: center; 16 align-items: center;
6 padding: 0 10px;
7 border-radius: 30px;
8 background: $theme-gray-lightest; 17 background: $theme-gray-lightest;
9 padding: 5px 10px; 18 border-radius: 30px;
10 @extend %headline;
11 color: $theme-gray-light; 19 color: $theme-gray-light;
20 display: flex;
21 height: auto;
22 padding: 5px 10px;
23 width: 100%;
12 24
13 input { 25 input {
14 padding-left: 10px;
15 background: none; 26 background: none;
16 border: 0; 27 border: 0;
17 flex: 1;
18 color: $theme-gray-light; 28 color: $theme-gray-light;
29 flex: 1;
30 padding-left: 10px;
19 } 31 }
20} 32}
diff --git a/src/styles/select.scss b/src/styles/select.scss
index 965b4321a..ed0fc0fc2 100644
--- a/src/styles/select.scss
+++ b/src/styles/select.scss
@@ -3,17 +3,21 @@
3 3
4$toggle: "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDM1Ljk3MDk4MyAyMy4wOTE1MTgiCiAgIGhlaWdodD0iNi41MTY5Mzk2bW0iCiAgIHdpZHRoPSIxMC4xNTE4MTFtbSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAyLjAxNDUxLC00MDcuMTIyMjUpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MzMzNiIKICAgICAgIHk9IjYyOS41MDUwNyIKICAgICAgIHg9IjI5MS40Mjg1NiIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjQwcHg7bGluZS1oZWlnaHQ6MTI1JTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIj48dHNwYW4KICAgICAgICAgeT0iNjI5LjUwNTA3IgogICAgICAgICB4PSIyOTEuNDI4NTYiCiAgICAgICAgIGlkPSJ0c3BhbjMzMzgiPjwvdHNwYW4+PC90ZXh0PgogICAgPGcKICAgICAgIGlkPSJ0ZXh0MzM0MCIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0MHB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6Rm9udEF3ZXNvbWU7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpGb250QXdlc29tZTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgzMzQ1IgogICAgICAgICBzdHlsZT0iZmlsbDojMzMzMzMzO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICBkPSJtIDIzNy41NjY5Niw0MTMuMjU1MDcgYyAwLjU1ODA0LC0wLjU1ODA0IDAuNTU4MDQsLTEuNDczMjIgMCwtMi4wMzEyNSBsIC0zLjcwNTM1LC0zLjY4MzA0IGMgLTAuNTU4MDQsLTAuNTU4MDQgLTEuNDUwOSwtMC41NTgwNCAtMi4wMDg5MywwIEwgMjIwLDQxOS4zOTM0NiAyMDguMTQ3MzIsNDA3LjU0MDc4IGMgLTAuNTU4MDMsLTAuNTU4MDQgLTEuNDUwODksLTAuNTU4MDQgLTIuMDA4OTMsMCBsIC0zLjcwNTM1LDMuNjgzMDQgYyAtMC41NTgwNCwwLjU1ODAzIC0wLjU1ODA0LDEuNDczMjEgMCwyLjAzMTI1IGwgMTYuNTYyNSwxNi41NDAxNyBjIDAuNTU4MDMsMC41NTgwNCAxLjQ1MDg5LDAuNTU4MDQgMi4wMDg5MiwwIGwgMTYuNTYyNSwtMTYuNTQwMTcgeiIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo="; 4$toggle: "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDM1Ljk3MDk4MyAyMy4wOTE1MTgiCiAgIGhlaWdodD0iNi41MTY5Mzk2bW0iCiAgIHdpZHRoPSIxMC4xNTE4MTFtbSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAyLjAxNDUxLC00MDcuMTIyMjUpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MzMzNiIKICAgICAgIHk9IjYyOS41MDUwNyIKICAgICAgIHg9IjI5MS40Mjg1NiIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjQwcHg7bGluZS1oZWlnaHQ6MTI1JTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIj48dHNwYW4KICAgICAgICAgeT0iNjI5LjUwNTA3IgogICAgICAgICB4PSIyOTEuNDI4NTYiCiAgICAgICAgIGlkPSJ0c3BhbjMzMzgiPjwvdHNwYW4+PC90ZXh0PgogICAgPGcKICAgICAgIGlkPSJ0ZXh0MzM0MCIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0MHB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6Rm9udEF3ZXNvbWU7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpGb250QXdlc29tZTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgzMzQ1IgogICAgICAgICBzdHlsZT0iZmlsbDojMzMzMzMzO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICBkPSJtIDIzNy41NjY5Niw0MTMuMjU1MDcgYyAwLjU1ODA0LC0wLjU1ODA0IDAuNTU4MDQsLTEuNDczMjIgMCwtMi4wMzEyNSBsIC0zLjcwNTM1LC0zLjY4MzA0IGMgLTAuNTU4MDQsLTAuNTU4MDQgLTEuNDUwOSwtMC41NTgwNCAtMi4wMDg5MywwIEwgMjIwLDQxOS4zOTM0NiAyMDguMTQ3MzIsNDA3LjU0MDc4IGMgLTAuNTU4MDMsLTAuNTU4MDQgLTEuNDUwODksLTAuNTU4MDQgLTIuMDA4OTMsMCBsIC0zLjcwNTM1LDMuNjgzMDQgYyAtMC41NTgwNCwwLjU1ODAzIC0wLjU1ODA0LDEuNDczMjEgMCwyLjAzMTI1IGwgMTYuNTYyNSwxNi41NDAxNyBjIDAuNTU4MDMsMC41NTgwNCAxLjQ1MDg5LDAuNTU4MDQgMi4wMDg5MiwwIGwgMTYuNTYyNSwtMTYuNTQwMTcgeiIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=";
5 5
6.franz-form { 6.theme__dark .franz-form .franz-form__select {
7 .franz-form__select { 7 background-color: $dark-theme-gray-dark;
8 -webkit-appearance: none; 8 border: 1px solid $dark-theme-gray-light;
9 min-width: 200px; 9 color: $dark-theme-gray-lightest;
10 padding: 10px; 10}
11 background-color: $theme-gray-lightest; 11
12 background-position: right center; 12.franz-form .franz-form__select {
13 background-repeat: no-repeat; 13 background-color: $theme-gray-lightest;
14 background-size: 1ex; 14 background-image: url(data:image/svg+xml;base64,#{$toggle});
15 background-origin: content-box; 15 background-origin: content-box;
16 background-image: url(data:image/svg+xml;base64,#{$toggle}); 16 background-position: right center;
17 border: 1px solid $theme-gray-lighter; 17 background-repeat: no-repeat;
18 } 18 background-size: 1ex;
19 border: 1px solid $theme-gray-lighter;
20 min-width: 200px;
21 padding: 10px;
22 -webkit-appearance: none;
19} 23}
diff --git a/src/styles/service-table.scss b/src/styles/service-table.scss
index 66d5ac941..f2090685b 100644
--- a/src/styles/service-table.scss
+++ b/src/styles/service-table.scss
@@ -1,62 +1,63 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.theme__dark .service-table {
4 .service-table__icon.has-custom-icon { border: 1px solid $dark-theme-gray-dark; }
5 .service-table__column-info .mdi { color: $dark-theme-gray-lightest; }
6
7 .service-table__row {
8 border-bottom: 1px solid $dark-theme-gray-darker;
9
10 &:hover { background: $dark-theme-gray-darker; }
11 &.service-table__row--disabled { color: $dark-theme-gray; }
12 }
13}
14
3.service-table { 15.service-table {
4 width: 100%; 16 width: 100%;
5 17
6 .service-table__toggle { 18 .service-table__toggle {
7 width: 60px; 19 width: 60px;
8 20
9 .franz-form__field { 21 .franz-form__field { margin-bottom: 0; }
10 margin-bottom: 0;
11 }
12 } 22 }
13 23
14 .service-table__icon { 24 .service-table__icon {
15 width: 35px; 25 width: 35px;
16 26
17 &.has-custom-icon { 27 &.has-custom-icon {
18 border-radius: $theme-border-radius;
19 border: 1px solid $theme-gray-lighter; 28 border: 1px solid $theme-gray-lighter;
29 border-radius: $theme-border-radius;
20 width: 37px; 30 width: 37px;
21 } 31 }
22 } 32 }
23 33
24 .service-table__column-icon { 34 .service-table__column-icon,
25 width: 40px; 35 .service-table__column-action { width: 40px }
26 }
27
28 .service-table__column-action {
29 width: 40px
30 }
31 36
32 .service-table__column-info { 37 .service-table__column-info {
33 width: 40px; 38 width: 40px;
34 39
35 .mdi { 40 .mdi {
41 color: $theme-gray-light;
36 display: block; 42 display: block;
37 font-size: 18px; 43 font-size: 18px;
38 color: $theme-gray-light;
39 } 44 }
40 } 45 }
41 46
42 .service-table__row { 47 .service-table__row {
43 border-bottom: 1px solid $theme-gray-lightest; 48 border-bottom: 1px solid $theme-gray-lightest;
44 49
45 &:hover { 50 &:hover { background: $theme-gray-lightest; }
46 background: $theme-gray-lightest;
47 }
48 51
49 &.service-table__row--disabled { 52 &.service-table__row--disabled {
50 color: $theme-gray-light; 53 color: $theme-gray-light;
51 54
52 .service-table__column-icon { 55 .service-table__column-icon {
53 filter: grayscale(100%); 56 filter: grayscale(100%);
54 opacity: 0.5; 57 opacity: .5;
55 } 58 }
56 } 59 }
57 } 60 }
58 61
59 td { 62 td { padding: 10px; }
60 padding: 10px;
61 }
62} 63}
diff --git a/src/styles/services.scss b/src/styles/services.scss
index 9f6cfc772..0e559501c 100644
--- a/src/styles/services.scss
+++ b/src/styles/services.scss
@@ -1,30 +1,46 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.theme__dark .services {
4 background: $dark-theme-gray-darkest;
5
6 .services__webview-wrapper { background: $dark-theme-gray-darkest; }
7
8 .services__webview,
9 .services__info-layer {
10 webview { background: $dark-theme-gray-darkest; }
11 }
12
13 .services__no-service,
14 .services__info-layer {
15 background: $dark-theme-gray-darkest;
16
17 h1 { color: $dark-theme-gray-lightest; }
18 }
19}
20
3.services { 21.services {
22 background: #FFF;
4 flex: 1; 23 flex: 1;
5 height: 100%; 24 height: 100%;
6 position: relative;
7 overflow: hidden;
8 background: #FFF;
9 order: 5; 25 order: 5;
26 overflow: hidden;
27 position: relative;
10 28
11 .services__webview-wrapper { 29 .services__webview-wrapper { background: $theme-gray-lighter; }
12 background: $theme-gray-lighter;
13 }
14 30
15 .services__webview, 31 .services__webview,
16 .services__info-layer { 32 .services__info-layer {
33 left: 0;
17 position: absolute; 34 position: absolute;
18 width: 100%;
19 top: 0; 35 top: 0;
20 left: 0; 36 width: 100%;
21 z-index: 0; 37 z-index: 0;
22 38
23 webview { 39 webview {
24 display: inline-flex;
25 width: 0px;
26 height: 0px;
27 background: $theme-gray-lighter; 40 background: $theme-gray-lighter;
41 display: inline-flex;
42 height: 0;
43 width: 0;
28 } 44 }
29 45
30 &.is-active { 46 &.is-active {
@@ -32,36 +48,30 @@
32 48
33 webview { 49 webview {
34 flex: 0 1; 50 flex: 0 1;
35 width: 100%;
36 height: 100%; 51 height: 100%;
52 width: 100%;
37 } 53 }
38 } 54 }
39 55
40 &--force-repaint { 56 &--force-repaint webview { z-index: 5; }
41 webview {
42 z-index: 5;
43 }
44 }
45 } 57 }
46 58
47 .services__no-service, 59 .services__no-service,
48 .services__info-layer { 60 .services__info-layer {
61 align-items: center;
62 background: $theme-gray-lighter;
49 display: flex; 63 display: flex;
50 flex-direction: column; 64 flex-direction: column;
51 justify-content: center; 65 justify-content: center;
52 align-items: center;
53 text-align: center; 66 text-align: center;
54 background: $theme-gray-lighter;
55 67
56 h1 { 68 h1 {
57 margin: 25px 0 40px;
58 color: $theme-gray-dark; 69 color: $theme-gray-dark;
70 margin: 25px 0 40px;
59 } 71 }
60 72
61 a.button, 73 a.button,
62 button { 74 button { margin: 40px 0 20px; }
63 margin: 40px 0 20px;
64 }
65 } 75 }
66 76
67 .services__info-layer { 77 .services__info-layer {
diff --git a/src/styles/settings.scss b/src/styles/settings.scss
index 2182c9b5f..f94ca114d 100644
--- a/src/styles/settings.scss
+++ b/src/styles/settings.scss
@@ -1,130 +1,215 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3%headline { 3%headline {
4 color: $theme-gray-light;
4 font-size: 20px; 5 font-size: 20px;
5 font-weight: 400; 6 font-weight: 400;
6 letter-spacing: -1px; 7 letter-spacing: -1px;
7 color: $theme-gray-light;
8 8
9 a { 9 a { color: $theme-gray-light; }
10 color: $theme-gray-light; 10}
11
12%headline__dark {
13 color: $dark-theme-gray-lightest;
14
15 a { color: $dark-theme-gray-lightest; }
16}
17
18.theme__dark {
19 .settings-wrapper { background: rgba($dark-theme-black, .8); }
20
21 .settings {
22 background: $dark-theme-gray-darkest;
23 box-shadow: 0 20px 50px rgba($dark-theme-black, .5);
24
25 .settings__header {
26 background: $dark-theme-gray-darker;
27
28 h1,
29 .settings__header-item { @extend %headline__dark; }
30
31 .separator { border-right: 1px solid $dark-theme-gray-dark; }
32 .mdi { color: $dark-theme-gray-lightest; }
33 }
34
35 .settings__body::-webkit-scrollbar-thumb { background: $dark-theme-gray; }
36
37 .settings__close {
38 background: $dark-theme-gray-darker;
39 border-left: none;
40 color: $dark-theme-gray-lightest;
41
42 &:hover { background: darken($dark-theme-gray-darker, 5%); }
43 }
44
45 &__settings-group h3 { color: $dark-theme-gray-lightest; }
46
47 .settings__message {
48 border-top: 1px solid $theme-gray-lighter;
49 color: $dark-theme-gray-lightest;
50
51 .mdi { color: $dark-theme-gray-lightest; }
52 }
53
54 .settings__help { color: $dark-theme-gray-lightest; }
55
56 .settings__controls {
57 background: $dark-theme-gray-darker;
58
59 .franz-form__button.franz-form__button--secondary { background: $theme-gray-light; }
60 }
61
62 .account {
63 .account__box { background: $dark-theme-gray-darker; }
64
65 .invoices {
66 td { border-bottom: 1px solid $dark-theme-gray-darker; }
67 .invoices__action button { color: $theme-brand-primary; }
68 }
69 }
70
71 .premium-info {
72 background: $dark-theme-gray-darker;
73 border: 2px solid $theme-brand-primary;
74 }
75 .legal { color: $theme-gray-light; }
76 }
77
78 .settings-navigation {
79 background: $dark-theme-gray-darker;
80 border-right: 1px solid $dark-theme-gray-dark;
81
82 .settings-navigation__link {
83 color: $dark-theme-gray-lightest;
84
85 .badge {
86 background: $dark-theme-gray-lighter;
87 color: $dark-theme-gray-smoke;
88 }
89
90 &:hover {
91 background: darken($dark-theme-gray-darker, 5%);
92
93 .badge {
94 background: $dark-theme-gray-lighter;
95 color: $dark-theme-gray-smoke;
96 }
97 }
98
99 &.is-active {
100 background: $dark-theme-gray;
101 color: $dark-theme-gray-smoke;
102
103 .badge {
104 background: $dark-theme-gray-lighter;
105 color: $dark-theme-gray-smoke;
106 }
107 }
108 }
109
110 .settings-navigation__action-badge { background: $theme-brand-danger; }
11 } 111 }
12} 112}
13 113
14.settings-wrapper { 114.settings-wrapper {
15 background: rgba(black, 0.5); 115 align-items: center;
16 position: absolute; 116 background: rgba(black, .5);
17 width: 100%; 117 display: flex;
18 height: 100%; 118 height: 100%;
19 top: 0;
20 left: 0; 119 left: 0;
21 z-index: 9998;
22 display: flex;
23 justify-content: center; 120 justify-content: center;
24 align-items: center;
25 padding: 25px; 121 padding: 25px;
122 position: absolute;
123 top: 0;
124 width: 100%;
125 z-index: 9998;
26 126
27 .settings-wrapper__action { 127 .settings-wrapper__action {
28 position: absolute;
29 width: 100%;
30 height: 100%; 128 height: 100%;
31 top: 0;
32 left: 0; 129 left: 0;
130 position: absolute;
131 top: 0;
132 width: 100%;
33 } 133 }
34} 134}
35 135
36.settings { 136.settings {
37 position: relative; 137 background: #FFF;
138 border-radius: $theme-border-radius;
139 box-shadow: 0 20px 50px rgba(black, .5);
38 display: flex; 140 display: flex;
39 height: 100%; 141 height: 100%;
40 width: 100%; 142 max-height: 720px;
41 max-width: 900px; 143 max-width: 900px;
42 min-height: 400px; 144 min-height: 400px;
43 max-height: 720px;
44 z-index: 9999;
45 background: #FFF;
46 border-radius: $theme-border-radius;
47 box-shadow: 0 20px 50px rgba(black, 0.5);
48 overflow: hidden; 145 overflow: hidden;
49 // margin-top: -10%; 146 position: relative;
147 width: 100%;
148 z-index: 9999;
50 149
51 .settings__main { 150 .settings__main {
52 flex: 1;
53 display: flex; 151 display: flex;
152 flex: 1;
54 flex-direction: column; 153 flex-direction: column;
55 height: auto; 154 height: auto;
56 } 155 }
57 156
58 .settings__header { 157 .settings__header {
59 display: flex;
60 align-items: center; 158 align-items: center;
61 width: calc(100% - 60px); 159 background: $theme-gray-lighter;
160 display: flex;
62 height: 50px; 161 height: 50px;
63 padding: 0 40px; 162 padding: 0 40px;
64 background: $theme-gray-lighter; 163 width: calc(100% - 60px);
65 164
66 h1 { 165 h1 {
67 @extend %headline; 166 @extend %headline;
68 margin: 0; 167 margin: 0;
69 } 168 }
70 169
71 .settings__header-item { 170 .settings__header-item { @extend %headline; }
72 @extend %headline;
73 }
74 171
75 .separator { 172 .separator {
173 border-right: 1px solid darken($theme-gray-lighter, 10%);
76 height: 100%; 174 height: 100%;
77 margin: 0 15px; 175 margin: 0 15px;
78 border-right: 1px solid darken($theme-gray-lighter, 10%);
79 transform: skew(15deg) rotate(2deg); 176 transform: skew(15deg) rotate(2deg);
80 } 177 }
81 178
82 .mdi { 179 .mdi { color: $theme-gray-light; }
83 color: $theme-gray-light;
84 }
85 } 180 }
86 181
87 .settings__body { 182 .settings__body {
88 flex: 1; 183 flex: 1;
89 padding: 25px 15px 15px 25px;
90 margin: 15px; 184 margin: 15px;
91 overflow-y: scroll; 185 overflow-y: scroll;
186 padding: 25px 15px 15px 25px;
92 187
93 &::-webkit-scrollbar { 188 &::-webkit-scrollbar { width: 8px; }
94 width: 8px;
95 }
96 189
97 /* Track */ 190 /* Track */
98 &::-webkit-scrollbar-track { 191 &::-webkit-scrollbar-track {
99 -webkit-border-radius: 10px;
100 border-radius: 10px;
101 background: none; 192 background: none;
193 border-radius: 10px;
194 -webkit-border-radius: 10px;
102 } 195 }
103 196
104 /* Handle */ 197 /* Handle */
105 &::-webkit-scrollbar-thumb { 198 &::-webkit-scrollbar-thumb {
106 -webkit-border-radius: 10px;
107 border-radius: 10px;
108 background: $theme-gray-lighter; 199 background: $theme-gray-lighter;
200 border-radius: 10px;
201 -webkit-border-radius: 10px;
109 } 202 }
110 203
111 &::-webkit-scrollbar-thumb:window-inactive { 204 &::-webkit-scrollbar-thumb:window-inactive { background: none; }
112 background: none; 205 .service-flex-grid { display: flex; }
113 } 206 .service-name { flex: 1px; }
114
115 .service-flex-grid {
116 display: flex;
117 }
118
119 .service-name {
120 flex: 1px;
121 }
122 207
123 .service-icon { 208 .service-icon {
124 width: 140px;
125 float: right; 209 float: right;
126 margin-top: 30px;
127 margin-left: 40px; 210 margin-left: 40px;
211 margin-top: 30px;
212 width: 140px;
128 213
129 label { 214 label {
130 font-weight: bold; 215 font-weight: bold;
@@ -134,51 +219,50 @@
134 } 219 }
135 220
136 .settings__close { 221 .settings__close {
137 position: absolute;
138 right: 0;
139 background: $theme-gray-lighter; 222 background: $theme-gray-lighter;
140 height: 50px;
141 padding: 0 20px;
142 font-size: 20px;
143 border-left: 1px solid darken($theme-gray-lighter, 5%); 223 border-left: 1px solid darken($theme-gray-lighter, 5%);
144 color: $theme-gray-light; 224 color: $theme-gray-light;
225 font-size: 20px;
226 height: 50px;
227 padding: 0 20px;
228 position: absolute;
229 right: 0;
145 transition: background $theme-transition-time; 230 transition: background $theme-transition-time;
146 231
147 &:hover { 232 &:hover { background: darken($theme-gray-lighter, 5%); }
148 background: darken($theme-gray-lighter, 5%);
149 }
150 } 233 }
151 234
152 .search-input { 235 .search-input { margin-bottom: 30px; }
153 margin-bottom: 30px;
154 }
155 236
156 &__options { 237 &__options {
157 margin-top: 20px;
158 flex: 1; 238 flex: 1;
239 margin-top: 20px;
159 } 240 }
160 241
161 &__settings-group { 242 &__settings-group {
162 margin-top: 10px; 243 margin-top: 10px;
163 244
164 h3 { 245 h3 {
246 color: $theme-gray-light;
165 font-weight: bold; 247 font-weight: bold;
248 letter-spacing: -.1px;
166 margin: 25px 0 15px; 249 margin: 25px 0 15px;
167 color: $theme-gray-light;
168 letter-spacing: -0.1px;
169 250
170 &:first-of-type { 251 &:first-of-type { margin-top: 0; }
171 margin-top: 0; 252
253 .badge {
254 font-weight: normal;
255 margin-left: 10px;
172 } 256 }
173 } 257 }
174 } 258 }
175 259
176 .settings__message { 260 .settings__message {
261 border-top: 1px solid $theme-gray-lighter;
262 color: $theme-gray-light;
177 display: flex; 263 display: flex;
178 margin-top: 40px; 264 margin-top: 40px;
179 padding-top: 15px; 265 padding-top: 15px;
180 border-top: 1px solid $theme-gray-lighter;
181 color: $theme-gray-light;
182 266
183 .mdi { 267 .mdi {
184 color: $theme-gray-light; 268 color: $theme-gray-light;
@@ -188,69 +272,53 @@
188 } 272 }
189 273
190 .settings__help { 274 .settings__help {
191 margin: -10px 0 20px 55px;;
192 font-size: 12px;
193 color: $theme-gray-light; 275 color: $theme-gray-light;
276 font-size: 12px;
277 margin: -10px 0 20px 55px;;
194 } 278 }
195 279
196 .settings__controls { 280 .settings__controls {
281 background: $theme-gray-lighter;
197 display: flex; 282 display: flex;
283 height: auto;
198 justify-content: space-between; 284 justify-content: space-between;
199 padding: 10px 20px; 285 padding: 10px 20px;
200 height: auto;
201 background: $theme-gray-lighter;
202 286
203 .franz-form__button { 287 .franz-form__button {
204 &[type='submit'] { 288 &[type='submit'] { margin-left: auto; }
205 margin-left: auto; 289 &.franz-form__button--secondary { background: $theme-gray-light; }
206 }
207
208 &.franz-form__button--secondary {
209 background: $theme-gray-light;
210 }
211 } 290 }
212 } 291 }
213 292
214 .settings__delete-button { 293 .settings__delete-button { right: 0; }
215 right: 0;
216 }
217 294
218 .settings__empty-state { 295 .settings__empty-state {
219 width: 100%; 296 align-items: center;
297 align-self: center;
220 height: auto; 298 height: auto;
221 min-height: 70%; 299 min-height: 70%;
222 text-align: center; 300 text-align: center;
223 align-self: center; 301 width: 100%;
224 // margin-top: -20px;
225 align-items: center;
226 302
227 a.button { 303 a.button { margin-top: 40px; }
228 margin-top: 40px;
229 }
230 } 304 }
231 305
232 .account { 306 .account {
233 height: auto; 307 height: auto;
234 // padding: 20px;
235 308
236 .account__box { 309 .account__box {
310 align-items: center;
237 background: $theme-gray-lightest; 311 background: $theme-gray-lightest;
238 border-radius: $theme-border-radius; 312 border-radius: $theme-border-radius;
239 padding: 20px;
240 margin-bottom: 40px; 313 margin-bottom: 40px;
241 align-items: center; 314 padding: 20px;
242
243 &.account__box--flex {
244 display: flex;
245 }
246 315
247 &.account__box--last { 316 &.account__box--flex { display: flex; }
248 margin-bottom: 0; 317 &.account__box--last { margin-bottom: 0; }
249 }
250 318
251 .auth__button { 319 .auth__button {
252 width: 100%;
253 margin-top: 10px; 320 margin-top: 10px;
321 width: 100%;
254 } 322 }
255 } 323 }
256 324
@@ -258,57 +326,40 @@
258 margin-right: 20px; 326 margin-right: 20px;
259 position: relative; 327 position: relative;
260 328
261 .emoji img { 329 .emoji img { width: 30px; }
262 width: 30px;
263 }
264 } 330 }
265 331
266 .account__avatar-premium { 332 .account__avatar-premium {
333 font-size: 26px;
267 position: absolute; 334 position: absolute;
268 top: 2px;
269 right: 2px; 335 right: 2px;
270 font-size: 26px; 336 top: 2px;
271 } 337 }
272 338
273 .account__info { 339 .account__info {
274 flex: 1; 340 flex: 1;
275 341
276 h2 { 342 h2 { margin-bottom: 5px; }
277 margin-bottom: 5px; 343 .badge { margin-top: 5px; }
278 }
279
280 .badge {
281 margin-top: 5px;
282 }
283 } 344 }
284 345
285 .account__subscription { 346 .account__subscription {
286 display: flex;
287 align-items: center; 347 align-items: center;
348 display: flex;
288 349
289 .badge { 350 .badge { margin-left: 10px; }
290 margin-left: 10px;
291 }
292 }
293
294 .account__subscription-button {
295 margin-left: auto;
296 }
297
298 .franz-form__button {
299 white-space: nowrap;
300 } 351 }
301 352
302 div { 353 .account__subscription-button { margin-left: auto; }
303 height: auto; 354 .franz-form__button { white-space: nowrap; }
304 } 355 div { height: auto; }
305 356
306 .invoices { 357 .invoices {
307 width: 100%; 358 width: 100%;
308 359
309 td { 360 td {
310 padding: 15px 0;
311 border-bottom: 1px solid $theme-gray-lighter; 361 border-bottom: 1px solid $theme-gray-lighter;
362 padding: 15px 0;
312 } 363 }
313 364
314 tr:last-of-type td { 365 tr:last-of-type td {
@@ -319,9 +370,7 @@
319 .invoices__action { 370 .invoices__action {
320 text-align: right; 371 text-align: right;
321 372
322 button { 373 button { color: $theme-brand-primary; }
323 color: $theme-brand-primary;
324 }
325 } 374 }
326 } 375 }
327 } 376 }
@@ -331,15 +380,13 @@
331 font-size: 40px; 380 font-size: 40px;
332 margin-bottom: 20px; 381 margin-bottom: 20px;
333 382
334 img { 383 img { width: 40px; }
335 width: 40px;
336 }
337 } 384 }
338 385
339 .premium-info { 386 .premium-info {
340 background: lighten($theme-brand-primary, 40%); 387 background: lighten($theme-brand-primary, 40%);
341 padding: 20px;
342 border-radius: $theme-border-radius; 388 border-radius: $theme-border-radius;
389 padding: 20px;
343 } 390 }
344 391
345 .content-tabs .premium-info { 392 .content-tabs .premium-info {
@@ -348,35 +395,33 @@
348 } 395 }
349 396
350 .legal { 397 .legal {
351 text-align: center;
352 margin-top: 20px;
353 color: $theme-gray-light; 398 color: $theme-gray-light;
399 margin-top: 20px;
400 text-align: center;
354 } 401 }
355} 402}
356 403
357.settings-navigation { 404.settings-navigation {
358 width: 200px;
359 height: auto;
360 background: $theme-gray-lightest;
361 display: flex; 405 display: flex;
406 background: $theme-gray-lightest;
362 flex-direction: column; 407 flex-direction: column;
408 height: auto;
409 width: 200px;
363 410
364 .settings-navigation__link { 411 .settings-navigation__link {
365 display: flex;
366 align-items: center; 412 align-items: center;
367 height: 50px;
368 flex-shrink: 0;
369 text-decoration: none;
370 color: $theme-text-color; 413 color: $theme-text-color;
414 display: flex;
415 flex-shrink: 0;
416 height: 50px;
371 padding: 0 20px; 417 padding: 0 20px;
418 text-decoration: none;
372 transition: background $theme-transition-time, color $theme-transition-time; 419 transition: background $theme-transition-time, color $theme-transition-time;
373 420
374 &:hover { 421 &:hover {
375 background: darken($theme-gray-lightest, 5%); 422 background: darken($theme-gray-lightest, 5%);
376 423
377 .badge { 424 .badge { background: #FFF; }
378 background: #FFF;
379 }
380 } 425 }
381 426
382 &.is-active { 427 &.is-active {
@@ -390,22 +435,20 @@
390 } 435 }
391 } 436 }
392 437
393 .settings-navigation__expander { 438 .settings-navigation__expander { flex: 1; }
394 flex: 1;
395 }
396 439
397 .badge { 440 .badge {
398 transition: background $theme-transition-time, color $theme-transition-time;
399 display: initial; 441 display: initial;
400 margin-left: 5px; 442 margin-left: 5px;
443 transition: background $theme-transition-time, color $theme-transition-time;
401 } 444 }
402 445
403 .settings-navigation__action-badge { 446 .settings-navigation__action-badge {
404 display: inline-block;
405 width: 7px;
406 height: 7px;
407 background: $theme-brand-danger; 447 background: $theme-brand-danger;
408 border-radius: 100%; 448 border-radius: 100%;
449 display: inline-block;
450 height: 7px;
409 margin-left: 5px; 451 margin-left: 5px;
452 width: 7px;
410 } 453 }
411} 454}
diff --git a/src/styles/status-bar-target-url.scss b/src/styles/status-bar-target-url.scss
index bc7438be9..36f69df28 100644
--- a/src/styles/status-bar-target-url.scss
+++ b/src/styles/status-bar-target-url.scss
@@ -1,14 +1,14 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.status-bar-target-url { 3.status-bar-target-url {
4 height: auto;
5 background: $theme-gray-lighter; 4 background: $theme-gray-lighter;
6 padding: 4px; 5 border-top-left-radius: 5px;
7 position: absolute;
8 box-shadow: 0 0 8px rgba(black, 0.2);
9 font-size: 12px;
10 color: $theme-gray-dark;
11 bottom: 0; 6 bottom: 0;
7 box-shadow: 0 0 8px rgba(black, .2);
8 color: $theme-gray-dark;
9 font-size: 12px;
10 height: auto;
12 right: 0; 11 right: 0;
13 border-top-left-radius: 5px; 12 padding: 4px;
13 position: absolute;
14} 14}
diff --git a/src/styles/subscription-popup.scss b/src/styles/subscription-popup.scss
index b6f232fcb..fb4795d6c 100644
--- a/src/styles/subscription-popup.scss
+++ b/src/styles/subscription-popup.scss
@@ -1,20 +1,15 @@
1.subscription-popup { 1.subscription-popup {
2 height: 100%; 2 height: 100%;
3 3
4 &__content { 4 &__content { height: calc(100% - 60px); }
5 height: calc(100% - 60px); 5 &__webview { height: 100%; }
6 }
7
8 &__webview {
9 height: 100%;
10 }
11 6
12 &__toolbar { 7 &__toolbar {
13 height: 60px;
14 background: $theme-gray-lightest; 8 background: $theme-gray-lightest;
9 border-top: 1px solid $theme-gray-lighter;
15 display: flex; 10 display: flex;
11 height: 60px;
16 justify-content: space-between; 12 justify-content: space-between;
17 padding: 10px; 13 padding: 10px;
18 border-top: 1px solid $theme-gray-lighter;
19 } 14 }
20} 15}
diff --git a/src/styles/subscription.scss b/src/styles/subscription.scss
index 8bfb68d23..70fb41cde 100644
--- a/src/styles/subscription.scss
+++ b/src/styles/subscription.scss
@@ -3,63 +3,47 @@
3 margin: 10px 0; 3 margin: 10px 0;
4 4
5 li { 5 li {
6 height: 30px;
7 align-items: center; 6 align-items: center;
8 display: flex; 7 display: flex;
8 height: 30px;
9 9
10 &:before { 10 &:before {
11 content: "ðŸ‘"; 11 content: "ðŸ‘";
12 margin-right: 10px; 12 margin-right: 10px;
13 } 13 }
14 14
15 .badge { 15 .badge { margin-left: 10px; }
16 margin-left: 10px;
17 }
18 } 16 }
19 } 17 }
20 18
21 .subscription__premium-info { 19 .subscription__premium-info { margin: 15px 0 25px; }
22 margin: 15px 0 25px;
23 }
24} 20}
25 21
26.paymentTiers { 22.paymentTiers .franz-form__radio-wrapper {
27 .franz-form__radio-wrapper { 23 flex-flow: wrap;
28 flex-flow: wrap;
29 24
30 .franz-form__radio { 25 .franz-form__radio {
31 width: 32%; 26 flex: initial;
32 flex: initial; 27 margin-right: 2%;
33 margin-right: 2%; 28 width: 32%;
34 29
35 &:nth-child(3) { 30 &:nth-child(3) { margin-right: 0; }
36 margin-right: 0;
37 }
38 31
39 &:nth-child(4) { 32 &:nth-child(4) {
40 margin-right: 0; 33 margin-right: 0;
41 margin-top: 2%; 34 margin-top: 2%;
42 width: 100%; 35 width: 100%;
43 }
44 } 36 }
45 } 37 }
46} 38}
47 39
48.settings { 40.settings .paymentTiers .franz-form__radio-wrapper .franz-form__radio {
49 .paymentTiers { 41 width: 49%;
50 .franz-form__radio-wrapper {
51 .franz-form__radio {
52 width: 49%;
53 42
54 &:nth-child(2) { 43 &:nth-child(2) { margin-right: 0; }
55 margin-right: 0;
56 }
57 44
58 &:nth-child(3) { 45 &:nth-child(3) {
59 margin-top: 2%; 46 margin-top: 2%;
60 width: 100%; 47 width: 100%;
61 }
62 }
63 }
64 } 48 }
65} 49}
diff --git a/src/styles/tabs.scss b/src/styles/tabs.scss
index ac48aabd6..cbd833f04 100644
--- a/src/styles/tabs.scss
+++ b/src/styles/tabs.scss
@@ -1,104 +1,88 @@
1@import './config.scss'; 1@import './config.scss';
2 2
3.theme__dark .tab-item {
4 &.is-active {
5 background: $dark-theme-gray;
6
7 .tab-item__icon { margin-left: -4px; }
8 }
9
10 &.is-disabled .tab-item__icon { filter: grayscale(100%) opacity(.2); }
11 .tab-item__icon { width: 34px; }
12}
13
3.tabs { 14.tabs {
4 display: flex; 15 display: flex;
5 // flex: 1;
6 flex-direction: column; 16 flex-direction: column;
7 flex-shrink: 1; 17 flex-shrink: 1;
8 // align-items: center;
9 // height: auto;
10 18
11 .placeholder { 19 .placeholder {
12 width: 100%;
13 height: 40px; 20 height: 40px;
21 width: 100%;
14 } 22 }
15} 23}
16 24
17.tab-item { 25.tab-item {
18 display: flex;
19 justify-content: center;
20 align-items: center; 26 align-items: center;
21 position: relative; 27 display: flex;
22 width: $theme-sidebar-width;
23 height: 65px; 28 height: 65px;
29 justify-content: center;
24 min-height: 50px; 30 min-height: 50px;
31 position: relative;
25 transition: background $theme-transition-time; 32 transition: background $theme-transition-time;
33 width: $theme-sidebar-width;
26 34
27 &.is-active { 35 &.is-active {
28 border-left: 4px solid $theme-brand-primary;
29 background: lighten($theme-brand-primary, 35%); 36 background: lighten($theme-brand-primary, 35%);
37 border-left: 4px solid $theme-brand-primary;
30 38
31 .tab-item__icon { 39 .tab-item__icon { margin-left: -4px; }
32 margin-left: -4px;
33 }
34 }
35
36 &.is-disabled {
37 .tab-item__icon {
38 filter: grayscale(100%) opacity(0.2);
39 }
40 }
41
42 &.has-custom-icon {
43 .tab-item__icon {
44 border-radius: $theme-border-radius;
45 // border: 1px solid $theme-gray-lighter;
46 // width: 32px;
47 }
48 } 40 }
49 41
50 &:active { 42 &.is-disabled .tab-item__icon { filter: grayscale(100%) opacity(0.2); }
51 .tab-item__icon { 43 &.has-custom-icon .tab-item__icon { border-radius: $theme-border-radius; }
52 opacity: 0.7; 44 &:active .tab-item__icon { opacity: .7; }
53 }
54 }
55 45
56 .tab-item__icon { 46 .tab-item__icon {
57 width: 30px;
58 height: auto; 47 height: auto;
48 width: 30px;
59 } 49 }
60 50
61 .tab-item__message-count { 51 .tab-item__message-count {
62 min-width: 17px; 52 align-items: center;
63 min-height: 17px;
64 background: $theme-brand-danger; 53 background: $theme-brand-danger;
65 color: #FFF;
66 border-radius: 20px; 54 border-radius: 20px;
67 padding: 0px 5px;
68 font-size: 11px;
69 position: absolute;
70 right: 8px;
71 bottom: 8px; 55 bottom: 8px;
56 color: #FFF;
72 display: flex; 57 display: flex;
58 font-size: 11px;
73 justify-content: center; 59 justify-content: center;
74 align-items: center; 60 min-height: 17px;
61 min-width: 17px;
62 padding: 0px 5px;
63 position: absolute;
64 right: 8px;
75 65
76 &.is-indirect { 66 &.is-indirect { padding-top: 0; }
77 padding-top: 0px;
78 }
79 } 67 }
80 68
81 .tab-item__info-badge { 69 .tab-item__info-badge {
82 width: 17px; 70 align-items: center;
83 height: 17px;
84 background: $theme-gray-light; 71 background: $theme-gray-light;
85 color: $theme-gray-lighter; 72 bottom: 8px;
86 border-radius: 20px; 73 border-radius: 20px;
87 padding: 0px 5px; 74 color: $theme-gray-lighter;
75 display: flex;
88 font-size: 11px; 76 font-size: 11px;
77 height: 17px;
78 justify-content: center;
79 padding: 0px 5px;
89 position: absolute; 80 position: absolute;
90 right: 8px; 81 right: 8px;
91 bottom: 8px; 82 width: 17px;
92 display: flex;
93 justify-content: center;
94 align-items: center;
95 83
96 &.is-indirect { 84 &.is-indirect { padding-top: 0; }
97 padding-top: 0px;
98 }
99 } 85 }
100 86
101 &.is-reordering { 87 &.is-reordering { z-index: 99999; }
102 z-index: 99999;
103 }
104} 88}
diff --git a/src/styles/title-bar.scss b/src/styles/title-bar.scss
index 5316f35b3..885eb94c4 100644
--- a/src/styles/title-bar.scss
+++ b/src/styles/title-bar.scss
@@ -1,49 +1,80 @@
1#electron-app-title-bar { 1@import './config.scss';
2 background: $theme-gray-lightest;
3 border-bottom: 0;
4 box-shadow: 0px 0 8px rgba(#000, 0.1);
5
6 span {
7 line-height: normal;
8 }
9 2
10 div { 3.theme__dark #electron-app-title-bar {
11 height: auto; 4 background: $dark-theme-gray-darker;
12 }
13 5
14 .toolbar-dropdown { 6 .toolbar-dropdown {
15 &.open { 7 &.open > .toolbar-button > button {
16 box-shadow: 0px 0 8px rgba(#000, 0.1); 8 background: $dark-theme-gray-light;
9 color: $dark-theme-gray-lightest;
17 } 10 }
18 11
19 &:not(.open) { 12 &:not(.open) {
20 .menu-item .menu-label { 13 .menu-item .menu-label { opacity: 1; }
21 opacity: 1; 14 > .toolbar-button > button:hover {
15 background: $dark-theme-gray-darkest;
22 } 16 }
17 }
18 }
23 19
24 &>.toolbar-button > button:hover { 20 #app-menu-bar #foldout-container .foldout {
25 background: $theme-brand-primary; 21 color: $dark-theme-gray-lightest;
22
23 .menu-pane {
24 background: $dark-theme-gray-light;
25
26 .menu-item {
27 .accelerator {
28 color: lighten($dark-theme-gray-light, 20%);
29 }
30 }
31
32 hr {
33 border-color: $dark-theme-gray-lighter;
26 } 34 }
27 } 35 }
28 } 36 }
29 37
38 .list .ReactVirtualized__Grid {
39 background: $dark-theme-gray-light;
40 }
41}
42
43#electron-app-title-bar {
44 background: $theme-gray-lightest;
45 border-bottom: 0;
46 box-shadow: 0 0 8px rgba(black, .1);
47
48 span { line-height: normal; }
49
50 div { height: auto; }
51
52 .toolbar-dropdown {
53 &.open { box-shadow: 0 0 8px rgba(black, 0.1); }
54
55 &:not(.open) {
56 .menu-item .menu-label { opacity: 1; }
57 > .toolbar-button > button:hover { background: $theme-brand-primary; }
58 }
59 }
60
30 .list-item { 61 .list-item {
31 .menu-item { 62 .menu-item {
32 margin: 4px;
33 border-radius: $theme-border-radius-small; 63 border-radius: $theme-border-radius-small;
64 margin: 4px;
34 } 65 }
35 &.selected, &.selected:focus { 66
67 &.selected,
68 &.selected:focus {
36 background: none; 69 background: none;
37 70
38 .menu-item { 71 .menu-item { background: $theme-brand-primary; }
39 background: $theme-brand-primary;
40 }
41 } 72 }
42 } 73 }
43 74
44 .menu-pane { 75 .menu-pane {
45 box-shadow: 0px 0 10px rgba(#000, 0.5);
46 border-bottom-left-radius: $theme-border-radius-small; 76 border-bottom-left-radius: $theme-border-radius-small;
47 border-bottom-right-radius: $theme-border-radius-small; 77 border-bottom-right-radius: $theme-border-radius-small;
78 box-shadow: 0 0 10px rgba(black, .5);
48 } 79 }
49} 80}
diff --git a/src/styles/toggle.scss b/src/styles/toggle.scss
index 5b47e6495..0ce0c3379 100644
--- a/src/styles/toggle.scss
+++ b/src/styles/toggle.scss
@@ -4,44 +4,46 @@ $toggle-size: 14px;
4$toggle-width: 40px; 4$toggle-width: 40px;
5$toggle-button-size: 22px; 5$toggle-button-size: 22px;
6 6
7.franz-form { 7.theme__dark .franz-form .franz-form__toggle-wrapper .franz-form__toggle {
8 .franz-form__toggle-wrapper { 8 background: $dark-theme-gray;
9 display: flex; 9 border-radius: $toggle-size / 2;
10 flex-direction: row;
11 10
12 .franz-form__label { 11 .franz-form__toggle-button {
13 margin-left: 20px; 12 background: $dark-theme-gray-lighter;
13 box-shadow: 0 1px 4px rgba($dark-theme-black, .3);
14 }
15}
16
17.franz-form .franz-form__toggle-wrapper {
18 display: flex;
19 flex-direction: row;
20
21 .franz-form__label { margin-left: 20px; }
22
23 .franz-form__toggle {
24 background: $theme-gray-lighter;
25 border-radius: $theme-border-radius;
26 height: $toggle-size;
27 position: relative;
28 width: $toggle-width;
29
30 .franz-form__toggle-button {
31 background: $theme-gray-light;
32 border-radius: 100%;
33 box-shadow: 0 1px 4px rgba(0, 0, 0, .3);
34 height: $toggle-size - 2;
35 left: 1px;
36 top: 1px;
37 position: absolute;
38 transition: all .5s;
39 width: $toggle-size - 2;
14 } 40 }
15 41
16 .franz-form__toggle { 42 &.is-active .franz-form__toggle-button {
17 width: $toggle-width; 43 background: $theme-brand-primary;
18 height: $toggle-size; 44 left: $toggle-width - $toggle-size - 3;;
19 position: relative;
20 background: $theme-gray-lighter;
21 border-radius: $theme-border-radius;
22
23 .franz-form__toggle-button {
24 position: absolute;
25 left: 0;
26 top: -($toggle-button-size - $toggle-size) / 2;
27 width: $toggle-button-size;
28 height: $toggle-button-size;
29 background: $theme-gray-light;
30 border-radius: 100%;
31 transition: all 0.5s;
32 box-shadow: 0 1px 4px rgba(0,0,0,0.3);
33 }
34
35 &.is-active {
36 .franz-form__toggle-button {
37 left: $toggle-width - $toggle-button-size;
38 background: $theme-brand-primary;
39 }
40 }
41
42 input {
43 display: none;
44 }
45 } 45 }
46
47 input { display: none; }
46 } 48 }
47} 49}
diff --git a/src/styles/tooltip.scss b/src/styles/tooltip.scss
index 1194e7fbb..5700e994c 100644
--- a/src/styles/tooltip.scss
+++ b/src/styles/tooltip.scss
@@ -1,4 +1,4 @@
1.__react_component_tooltip { 1.__react_component_tooltip {
2 padding: 10px !important;
3 height: auto; 2 height: auto;
3 padding: 10px !important;
4} 4}
diff --git a/src/styles/type-helper.scss b/src/styles/type-helper.scss
new file mode 100644
index 000000000..b1da394b5
--- /dev/null
+++ b/src/styles/type-helper.scss
@@ -0,0 +1,100 @@
1@function str-split($string, $separator) {
2 // empty array/list
3 $split-arr: ();
4 // first index of separator in string
5 $index : str-index($string, $separator);
6 // loop through string
7 @while $index != null {
8 // get the substring from the first character to the separator
9 $item: str-slice($string, 1, $index - 1);
10 // push item to array
11 $split-arr: append($split-arr, $item);
12 // remove item and separator from string
13 $string: str-slice($string, $index + 1);
14 // find new index of separator
15 $index : str-index($string, $separator);
16 }
17 // add the remaining string to list (the last item)
18 $split-arr: append($split-arr, $string);
19
20 @return $split-arr;
21}
22
23// ----
24// Sass (v3.4.13)
25// Compass (v1.0.3)
26// ----
27
28/// String to number converter
29/// @author Hugo Giraudel
30/// @access private
31
32
33/// Casts a string into a number
34///
35/// @param {String | Number} $value - Value to be parsed
36///
37/// @return {Number}
38
39@function to-number($value) {
40 @if type-of($value) == 'number' {
41 @return $value;
42 } @else if type-of($value) != 'string' {
43 $_: log('Value for `to-number` should be a number or a string.');
44 }
45
46 $result: 0;
47 $digits: 0;
48 $minus: str-slice($value, 1, 1) == '-';
49 $numbers: ('0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9);
50
51 @for $i from if($minus, 2, 1) through str-length($value) {
52 $character: str-slice($value, $i, $i);
53
54 @if not (index(map-keys($numbers), $character) or $character == '.') {
55 @return to-length(if($minus, -$result, $result), str-slice($value, $i))
56 }
57
58 @if $character == '.' {
59 $digits: 1;
60 } @else if $digits == 0 {
61 $result: $result * 10 + map-get($numbers, $character);
62 } @else {
63 $digits: $digits * 10;
64 $result: $result + map-get($numbers, $character) / $digits;
65 }
66 }
67
68 @return if($minus, -$result, $result);;
69}
70
71
72/// Add `$unit` to `$value`
73///
74/// @param {Number} $value - Value to add unit to
75/// @param {String} $unit - String representation of the unit
76///
77/// @return {Number} - `$value` expressed in `$unit`
78@function to-length($value, $unit) {
79 $units: ('px': 1px, 'cm': 1cm, 'mm': 1mm, '%': 1%, 'ch': 1ch, 'pc': 1pc, 'in': 1in, 'em': 1em, 'rem': 1rem, 'pt': 1pt, 'ex': 1ex, 'vw': 1vw, 'vh': 1vh, 'vmin': 1vmin, 'vmax': 1vmax);
80
81 @if not index(map-keys($units), $unit) {
82 $_: log('Invalid unit `#{$unit}`.');
83 }
84
85 @return $value * map-get($units, $unit);
86}
87
88
89
90/// converts injectes rgb strings to sass colors
91@function convert-rgb-string-to-color($string) {
92 $values: str-split($string, ',');
93 $colorList: ();
94 @each $value in $values {
95 $colorList: append($colorList, to-number($value));
96 }
97
98 $rgbaColor: rgb(nth($colorList, 1), nth($colorList, 2), nth($colorList, 3));
99 @return $rgbaColor;
100} \ No newline at end of file
diff --git a/src/styles/type.scss b/src/styles/type.scss
index cacbec482..135d32da0 100644
--- a/src/styles/type.scss
+++ b/src/styles/type.scss
@@ -1,6 +1,12 @@
1@import './config.scss'; 1@import './config.scss';
2@import './mixins.scss'; 2@import './mixins.scss';
3 3
4.theme__dark {
5 a { color: $dark-theme-gray-smoke; }
6 .label { color: $dark-theme-gray-lightest; }
7 .footnote { color: $dark-theme-gray-lightest; }
8}
9
4h1 { 10h1 {
5 font-size: 30px; 11 font-size: 30px;
6 font-weight: 300; 12 font-weight: 300;
@@ -15,38 +21,32 @@ h2 {
15 margin-bottom: 25px; 21 margin-bottom: 25px;
16 margin-top: 55px; 22 margin-top: 55px;
17 23
18 &:first-of-type { 24 &:first-of-type { margin-top: 0; }
19 margin-top: 0;
20 }
21} 25}
22 26
23p { 27p {
24 margin-bottom: 10px; 28 margin-bottom: 10px;
25 line-height: 1.7rem; 29 line-height: 1.7rem;
26 30
27 &:last-of-type { 31 &:last-of-type { margin-bottom: 0; }
28 margin-bottom: 0;
29 }
30} 32}
31 33
32strong { 34strong { font-weight: bold; }
33 font-weight: bold;
34}
35 35
36a { 36a {
37 text-decoration: none;
38 color: $theme-text-color; 37 color: $theme-text-color;
38 text-decoration: none;
39 39
40 &.button { 40 &.button {
41 position: relative;
42 background: none; 41 background: none;
43 display: inline-block;
44 padding: 10px 20px;
45 border: 2px solid $theme-brand-primary; 42 border: 2px solid $theme-brand-primary;
46 color: $theme-brand-primary;
47 border-radius: 3px; 43 border-radius: 3px;
48 transition: background 0.5s, color 0.5s; 44 color: $theme-brand-primary;
45 display: inline-block;
46 padding: 10px 20px;
47 position: relative;
49 text-align: center; 48 text-align: center;
49 transition: background .5s, color .5s;
50 50
51 &:hover { 51 &:hover {
52 background: darken($theme-brand-primary, 5%); 52 background: darken($theme-brand-primary, 5%);
@@ -54,25 +54,19 @@ a {
54 } 54 }
55 } 55 }
56 56
57 &.link { 57 &.link { color: $theme-brand-primary; }
58 color: $theme-brand-primary;
59 }
60} 58}
61 59
62.error-message, .error-message:last-of-type { 60.error-message, .error-message:last-of-type {
63 margin: 10px 0;
64 color: $theme-brand-danger; 61 color: $theme-brand-danger;
62 margin: 10px 0;
65} 63}
66 64
67.center { 65.center { text-align: center; }
68 text-align: center;
69}
70 66
71.label { 67.label { @include formLabel(); }
72 @include formLabel();
73}
74 68
75.footnote { 69.footnote {
76 font-size: 12px;
77 color: $theme-gray-light; 70 color: $theme-gray-light;
78} \ No newline at end of file 71 font-size: 12px;
72}
diff --git a/src/styles/util.scss b/src/styles/util.scss
index 3faad8db3..cc93f79ab 100644
--- a/src/styles/util.scss
+++ b/src/styles/util.scss
@@ -1,16 +1,16 @@
1.scroll-container { 1.scroll-container {
2 height: 100%;
3 flex: 1; 2 flex: 1;
4 overflow-y: scroll; 3 height: 100%;
5 overflow-x: hidden; 4 overflow-x: hidden;
5 overflow-y: scroll;
6} 6}
7 7
8.loader { 8.loader {
9 position: relative;
10 z-index: 9999;
11 display: block; 9 display: block;
12 width: 100%;
13 height: 40px; 10 height: 40px;
11 position: relative;
12 width: 100%;
13 z-index: 9999;
14} 14}
15 15
16.align-middle { 16.align-middle {
diff --git a/src/styles/welcome.scss b/src/styles/welcome.scss
index a12069ba4..b3d6515b1 100644
--- a/src/styles/welcome.scss
+++ b/src/styles/welcome.scss
@@ -1,92 +1,84 @@
1.auth { 1.auth .welcome {
2 .welcome { 2 &__content {
3 3 align-items: center;
4 &__content { 4 color: #FFF;
5 display: flex; 5 display: flex;
6 align-items: center; 6 justify-content: center;
7 justify-content: center; 7 }
8 color: #FFF;
9 }
10
11 &__logo {
12 width: 100px;
13 }
14 8
15 &__text { 9 &__logo { width: 100px; }
16 margin-left: 40px;
17 padding-left: 40px;
18 border-left: 1px solid #FFF;
19 10
20 h1 { 11 &__text {
21 font-size: 60px; 12 border-left: 1px solid #FFF;
22 letter-spacing: -0.4rem; 13 margin-left: 40px;
23 margin-bottom: 5px; 14 padding-left: 40px;
24 }
25 15
26 h2 { 16 h1 {
27 margin-left: 2px; 17 font-size: 60px;
28 margin-bottom: 0; 18 letter-spacing: -.4rem;
29 } 19 margin-bottom: 5px;
30 } 20 }
31 21
32 &__services { 22 h2 {
33 width: 100%; 23 margin-bottom: 0;
34 max-width: 800px; 24 margin-left: 2px;
35 height: 100%;
36 max-height: 600px;
37 margin-left: -450px;
38 } 25 }
26 }
39 27
40 &__buttons { 28 &__services {
41 display: block; 29 height: 100%;
42 margin-top: 100px; 30 margin-left: -450px;
43 text-align: center; 31 max-height: 600px;
32 max-width: 800px;
33 width: 100%;
34 }
44 35
45 .button:first-of-type { 36 &__buttons {
46 margin-right: 25px; 37 display: block;
47 } 38 margin-top: 100px;
48 } 39 text-align: center;
49 40
50 .button { 41 .button:first-of-type { margin-right: 25px; }
51 border-color: #FFF; 42 }
52 color: #FFF;
53 43
54 &:hover { 44 .button {
55 background: #FFF; 45 border-color: #FFF;
56 color: $theme-brand-primary; 46 color: #FFF;
57 }
58 47
59 &__inverted { 48 &:hover {
60 background: #FFF; 49 background: #FFF;
61 color: $theme-brand-primary; 50 color: $theme-brand-primary;
62 }
63 &__inverted:hover {
64 background: none;
65 color: #FFF;
66 }
67 } 51 }
68 52
69 &__featured-services { 53 &__inverted {
70 text-align: center;
71 width: 480px;
72 margin: 80px auto 0 auto;
73 display: flex;
74 align-items: center;
75 flex-wrap: wrap;
76 background: #FFF; 54 background: #FFF;
77 border-radius: 6px; 55 color: $theme-brand-primary;
78 padding: 20px 20px 5px;
79 } 56 }
80 57
81 &__featured-service { 58 &__inverted:hover {
82 width: 35px; 59 background: none;
83 height: 35px; 60 color: #FFF;
84 margin: 0 10px 15px;
85 transition: 0.5s filter, 0.5s opacity;
86
87 img {
88 width: 35px;
89 }
90 } 61 }
91 } 62 }
63
64 &__featured-services {
65 align-items: center;
66 background: #FFF;
67 border-radius: 6px;
68 display: flex;
69 flex-wrap: wrap;
70 margin: 80px auto 0 auto;
71 padding: 20px 20px 5px;
72 text-align: center;
73 width: 480px;
74 }
75
76 &__featured-service {
77 margin: 0 10px 15px;
78 height: 35px;
79 transition: .5s filter, .5s opacity;
80 width: 35px;
81
82 img { width: 35px; }
83 }
92} 84}
diff --git a/src/theme/dark/index.js b/src/theme/dark/index.js
new file mode 100644
index 000000000..496a51119
--- /dev/null
+++ b/src/theme/dark/index.js
@@ -0,0 +1,6 @@
1import * as legacyStyles from '../default/legacy';
2
3export const colorBackground = legacyStyles.darkThemeGrayDarkest;
4export const colorBackgroundSubscriptionContainer = legacyStyles.themeBrandInfo;
5
6export const colorHeadline = legacyStyles.darkThemeTextColor;
diff --git a/src/theme/default/index.js b/src/theme/default/index.js
new file mode 100644
index 000000000..8766fb609
--- /dev/null
+++ b/src/theme/default/index.js
@@ -0,0 +1,21 @@
1import * as legacyStyles from './legacy';
2
3export const brandPrimary = '#3498db';
4export const brandSuccess = '#5cb85c';
5export const brandInfo = '#5bc0de';
6export const brandWarning = '#FF9F00';
7export const brandDanger = '#d9534f';
8
9export const borderRadius = legacyStyles.themeBorderRadius;
10export const borderRadiusSmall = legacyStyles.themeBorderRadiusSmall;
11
12export const colorBackground = legacyStyles.themeGrayLighter;
13export const colorHeadline = legacyStyles.themeGrayDark;
14
15// Subscription Container Component
16export const colorSubscriptionContainerBackground = 'none';
17export const colorSubscriptionContainerBorder = [1, 'solid', brandPrimary];
18export const colorSubscriptionContainerTitle = brandPrimary;
19export const colorSubscriptionContainerActionButtonBackground = brandPrimary;
20export const colorSubscriptionContainerActionButtonColor = '#FFF';
21
diff --git a/src/theme/default/legacy.js b/src/theme/default/legacy.js
new file mode 100644
index 000000000..b676dc1d9
--- /dev/null
+++ b/src/theme/default/legacy.js
@@ -0,0 +1,39 @@
1/* legacy config, injected into sass */
2export const themeBrandPrimary = '#3498db';
3export const themeBrandSuccess = '#5cb85c';
4export const themeBrandInfo = '#5bc0de';
5export const themeBrandWarning = '#FF9F00';
6export const themeBrandDanger = '#d9534f';
7
8export const themeGrayDark = '#373a3c';
9export const themeGray = '#55595c';
10export const themeGrayLight = '#818a91';
11export const themeGrayLighter = '#eceeef';
12export const themeGrayLightest = '#f7f7f9';
13
14export const themeBorderRadius = '6px';
15export const themeBorderRadiusSmall = '3px';
16
17export const themeSidebarWidth = '68px';
18
19export const themeTextColor = themeGrayDark;
20
21export const themeTransitionTime = '.5s';
22
23export const themeInsetShadow = 'inset 0 2px 5px rgba(0, 0, 0, .03)';
24
25
26export const darkThemeBlack = '#1A1A1A';
27
28export const darkThemeGrayDarkest = '#1E1E1E';
29export const darkThemeGrayDarker = '#2D2F31';
30export const darkThemeGrayDark = '#383A3B';
31
32export const darkThemeGray = '#47494B';
33
34export const darkThemeGrayLight = '#515355';
35export const darkThemeGrayLighter = '#8a8b8b';
36export const darkThemeGrayLightest = '#FFFFFF';
37
38export const darkThemeGraySmoke = '#CED0D1';
39export const darkThemeTextColor = '#FFFFFF';
diff --git a/src/webview/contextMenu.js b/src/webview/contextMenu.js
new file mode 100644
index 000000000..195306fda
--- /dev/null
+++ b/src/webview/contextMenu.js
@@ -0,0 +1,178 @@
1// This is heavily based on https://github.com/sindresorhus/electron-context-menu
2// ⤠@sindresorhus
3
4import { clipboard, remote, ipcRenderer, shell } from 'electron';
5
6import { isDevMode } from '../environment';
7
8const debug = require('debug')('Franz:contextMenu');
9
10const { Menu } = remote;
11
12// const win = remote.getCurrentWindow();
13const webContents = remote.getCurrentWebContents();
14
15function delUnusedElements(menuTpl) {
16 let notDeletedPrevEl;
17 return menuTpl.filter(el => el.visible !== false).filter((el, i, array) => {
18 const toDelete = el.type === 'separator' && (!notDeletedPrevEl || i === array.length - 1 || array[i + 1].type === 'separator');
19 notDeletedPrevEl = toDelete ? notDeletedPrevEl : el;
20 return !toDelete;
21 });
22}
23
24const buildMenuTpl = (props, suggestions) => {
25 const { editFlags } = props;
26 const hasText = props.selectionText.trim().length > 0;
27 const can = type => editFlags[`can${type}`] && hasText;
28
29 console.log(props);
30
31 let menuTpl = [
32 {
33 type: 'separator',
34 }, {
35 id: 'cut',
36 role: can('Cut') ? 'cut' : '',
37 enabled: can('Cut'),
38 visible: !!props.selectionText.trim(),
39 }, {
40 id: 'copy',
41 label: 'Copy',
42 role: can('Copy') ? 'copy' : '',
43 enabled: can('Copy'),
44 visible: props.isEditable || hasText,
45 }, {
46 id: 'paste',
47 label: 'Paste',
48 role: editFlags.canPaste ? 'paste' : '',
49 enabled: editFlags.canPaste,
50 visible: props.isEditable,
51 }, {
52 type: 'separator',
53 },
54 ];
55
56 if (props.linkURL && props.mediaType === 'none') {
57 menuTpl = [{
58 type: 'separator',
59 }, {
60 id: 'openLink',
61 label: 'Open Link in Browser',
62 click() {
63 shell.openExternal(props.linkURL);
64 },
65 }, {
66 id: 'copyLink',
67 label: 'Copy Link',
68 click() {
69 clipboard.write({
70 bookmark: props.linkText,
71 text: props.linkURL,
72 });
73 },
74 }, {
75 type: 'separator',
76 }];
77 }
78
79 if (props.mediaType === 'image') {
80 menuTpl.push({
81 type: 'separator',
82 }, {
83 id: 'openImage',
84 label: 'Open Image in Browser',
85 click() {
86 shell.openExternal(props.srcURL);
87 },
88 }, {
89 id: 'copyImageAddress',
90 label: 'Copy Image Address',
91 click() {
92 clipboard.write({
93 bookmark: props.srcURL,
94 text: props.srcURL,
95 });
96 },
97 }, {
98 type: 'separator',
99 });
100 }
101
102 if (props.mediaType === 'image') {
103 menuTpl.push({
104 id: 'saveImageAs',
105 label: 'Save Image As…',
106 async click() {
107 if (props.srcURL.startsWith('blob:')) {
108 const url = new window.URL(props.srcURL.substr(5));
109 const fileName = url.pathname.substr(1);
110 const resp = await window.fetch(props.srcURL);
111 const blob = await resp.blob();
112 const reader = new window.FileReader();
113 reader.readAsDataURL(blob);
114 reader.onloadend = () => {
115 const base64data = reader.result;
116
117 ipcRenderer.send('download-file', {
118 content: base64data,
119 fileOptions: {
120 name: fileName,
121 mime: blob.type,
122 },
123 });
124 };
125 debug('binary string', blob);
126 } else {
127 ipcRenderer.send('download-file', { url: props.srcURL });
128 }
129 },
130 }, {
131 type: 'separator',
132 });
133 }
134
135 console.log('suggestions', suggestions.length, suggestions);
136 if (suggestions.length > 0) {
137 suggestions.reverse().map(suggestion => menuTpl.unshift({
138 id: `suggestion-${suggestion}`,
139 label: suggestion,
140 click() {
141 webContents.replaceMisspelling(suggestion);
142 },
143 }));
144 }
145
146 if (isDevMode) {
147 menuTpl.push({
148 type: 'separator',
149 }, {
150 id: 'inspect',
151 label: 'Inspect Element',
152 click() {
153 webContents.inspectElement(props.x, props.y);
154 },
155 }, {
156 type: 'separator',
157 });
158 }
159
160 return delUnusedElements(menuTpl);
161};
162
163export default function contextMenu(spellcheckProvider) {
164 webContents.on('context-menu', (e, props) => {
165 e.preventDefault();
166
167 let suggestions = [];
168 if (spellcheckProvider && props.misspelledWord) {
169 suggestions = spellcheckProvider.getSuggestion(props.misspelledWord);
170
171 debug('Suggestions', suggestions);
172 }
173
174 const menu = Menu.buildFromTemplate(buildMenuTpl(props, suggestions.slice(0, 5)));
175
176 menu.popup(remote.getCurrentWindow());
177 });
178}
diff --git a/src/webview/darkmode.js b/src/webview/darkmode.js
new file mode 100644
index 000000000..9830ef33c
--- /dev/null
+++ b/src/webview/darkmode.js
@@ -0,0 +1,28 @@
1import path from 'path';
2import fs from 'fs-extra';
3
4const ID = 'franz-theme-dark-mode';
5
6export function injectDarkModeStyle(recipePath) {
7 const darkModeStyle = path.join(recipePath, 'darkmode.css');
8 if (fs.pathExistsSync(darkModeStyle)) {
9 const data = fs.readFileSync(darkModeStyle);
10 const styles = document.createElement('style');
11 styles.id = ID;
12 styles.innerHTML = data.toString();
13
14 document.querySelector('head').appendChild(styles);
15 }
16}
17
18export function removeDarkModeStyle() {
19 const style = document.querySelector(`#${ID}`);
20
21 if (style) {
22 style.remove();
23 }
24}
25
26export function isDarkModeStyleInjected() {
27 return !!document.querySelector(`#${ID}`);
28}
diff --git a/src/webview/plugin.js b/src/webview/plugin.js
index c6530fef6..72530733d 100644
--- a/src/webview/plugin.js
+++ b/src/webview/plugin.js
@@ -1,14 +1,17 @@
1import { ipcRenderer } from 'electron'; 1import { ipcRenderer } from 'electron';
2import { ContextMenuListener, ContextMenuBuilder } from 'electron-spellchecker';
3import path from 'path'; 2import path from 'path';
4 3
5import { isDevMode } from '../environment';
6import RecipeWebview from './lib/RecipeWebview'; 4import RecipeWebview from './lib/RecipeWebview';
7 5
8import Spellchecker from './spellchecker'; 6import spellchecker, { switchDict, disable as disableSpellchecker } from './spellchecker';
7import { injectDarkModeStyle, isDarkModeStyleInjected, removeDarkModeStyle } from './darkmode';
8import contextMenu from './contextMenu';
9import './notifications'; 9import './notifications';
10 10
11const debug = require('debug')('Plugin'); 11const debug = require('debug')('Franz:Plugin');
12
13window.franzSettings = {};
14let serviceData;
12 15
13ipcRenderer.on('initializeRecipe', (e, data) => { 16ipcRenderer.on('initializeRecipe', (e, data) => {
14 const modulePath = path.join(data.recipe.path, 'webview.js'); 17 const modulePath = path.join(data.recipe.path, 'webview.js');
@@ -17,27 +20,58 @@ ipcRenderer.on('initializeRecipe', (e, data) => {
17 try { 20 try {
18 // eslint-disable-next-line 21 // eslint-disable-next-line
19 require(modulePath)(new RecipeWebview(), data); 22 require(modulePath)(new RecipeWebview(), data);
20 debug('Initialize Recipe'); 23 debug('Initialize Recipe', data);
24
25 serviceData = data;
26
27 if (data.isDarkModeEnabled) {
28 injectDarkModeStyle(data.recipe.path);
29 debug('Add dark theme styles');
30 }
21 } catch (err) { 31 } catch (err) {
22 debug('Recipe initialization failed', err); 32 debug('Recipe initialization failed', err);
23 } 33 }
24}); 34});
25 35
26const spellchecker = new Spellchecker(); 36// Needs to run asap to intialize dictionaries
27spellchecker.initialize(); 37(async () => {
38 const spellcheckingProvider = await spellchecker();
39 contextMenu(spellcheckingProvider);
40})();
28 41
29const contextMenuBuilder = new ContextMenuBuilder(spellchecker.handler, null, isDevMode); 42ipcRenderer.on('settings-update', async (e, data) => {
43 debug('Settings update received', data);
30 44
31new ContextMenuListener((info) => { // eslint-disable-line 45 if (data.enableSpellchecking) {
32 contextMenuBuilder.showPopupMenu(info); 46 switchDict(data.spellcheckerLanguage);
47 } else {
48 disableSpellchecker();
49 }
50
51 window.franzSettings = data;
33}); 52});
34 53
35ipcRenderer.on('settings-update', (e, data) => { 54ipcRenderer.on('service-settings-update', (e, data) => {
36 spellchecker.toggleSpellchecker(data.enableSpellchecking); 55 debug('Service settings update received', data);
37 debug('Settings update received', data); 56
57 if (data.isDarkModeEnabled && !isDarkModeStyleInjected()) {
58 injectDarkModeStyle(serviceData.recipe.path);
59
60 debug('Enable service dark mode');
61 } else if (!data.isDarkModeEnabled && isDarkModeStyleInjected()) {
62 removeDarkModeStyle();
63
64 debug('Disable service dark mode');
65 }
66});
67
68// Needed for current implementation of electrons 'login' event 🤦â€
69ipcRenderer.on('get-service-id', (event) => {
70 debug('Asking for service id', event);
71
72 event.sender.send('service-id', serviceData.id);
38}); 73});
39 74
40// initSpellche
41 75
42document.addEventListener('DOMContentLoaded', () => { 76document.addEventListener('DOMContentLoaded', () => {
43 ipcRenderer.sendToHost('hello'); 77 ipcRenderer.sendToHost('hello');
@@ -47,7 +81,7 @@ document.addEventListener('DOMContentLoaded', () => {
47const originalWindowOpen = window.open; 81const originalWindowOpen = window.open;
48 82
49window.open = (url, frameName, features) => { 83window.open = (url, frameName, features) => {
50 // We need to differentiate if the link should be opened in a popup or in the systems default browser 84 // We need to differentiate if the link should be opened in a popup or in the systems default browser
51 if (!frameName && !features) { 85 if (!frameName && !features) {
52 return ipcRenderer.sendToHost('new-window', url); 86 return ipcRenderer.sendToHost('new-window', url);
53 } 87 }
diff --git a/src/webview/spellchecker.js b/src/webview/spellchecker.js
index a504a4039..b0192b7ef 100644
--- a/src/webview/spellchecker.js
+++ b/src/webview/spellchecker.js
@@ -1,63 +1,92 @@
1import { SpellCheckHandler } from 'electron-spellchecker'; 1import { webFrame } from 'electron';
2import fs from 'fs';
3import path from 'path';
4import { SpellCheckerProvider } from 'electron-hunspell';
2 5
3import { isMac } from '../environment'; 6import { DICTIONARY_PATH } from '../config';
4 7
5export default class Spellchecker { 8const debug = require('debug')('Franz:spellchecker');
6 isInitialized = false;
7 handler = null;
8 initRetries = 0;
9 DOMCheckInterval = null;
10 9
11 get inputs() { 10let provider;
12 return document.querySelectorAll('input[type="text"], [contenteditable="true"], textarea'); 11let currentDict;
13 } 12let _isEnabled = false;
14 13
15 initialize() { 14async function loadDictionaries() {
16 this.handler = new SpellCheckHandler(); 15 const rawList = fs.readdirSync(DICTIONARY_PATH);
17 16
18 if (!isMac) { 17 const dicts = rawList.filter(item => !item.startsWith('.') && fs.lstatSync(path.join(DICTIONARY_PATH, item)).isDirectory());
19 this.attach(); 18
20 } else { 19 debug('Found dictionaries', dicts);
21 this.isInitialized = true; 20
22 } 21 for (let i = 0; i < dicts.length; i += 1) {
22 const fileLocation = `${DICTIONARY_PATH}/${dicts[i]}/${dicts[i]}`;
23 debug('Trying to load', fileLocation);
24 // eslint-disable-next-line
25 await provider.loadDictionary(dicts[i], `${fileLocation}.dic`, `${fileLocation}.aff`);
23 } 26 }
27}
28
29export async function switchDict(locale) {
30 try {
31 debug('Trying to load dictionary', locale);
24 32
25 attach() { 33 if (!provider.availableDictionaries.includes(locale)) {
26 let initFailed = false; 34 console.warn('Dict not available', locale);
27 35
28 if (this.initRetries > 3) {
29 console.error('Could not initialize spellchecker');
30 return; 36 return;
31 } 37 }
32 38
33 try { 39 if (!provider) {
34 this.handler.attachToInput(); 40 console.warn('SpellcheckProvider not initialized');
35 this.handler.switchLanguage(navigator.language); 41
36 } catch (err) { 42 return;
37 initFailed = true;
38 this.initRetries = +1;
39 setTimeout(() => { this.attach(); console.warn('Spellchecker init failed, trying again in 5s'); }, 5000);
40 } 43 }
41 44
42 if (!initFailed) { 45 if (locale === currentDict) {
43 this.isInitialized = true; 46 console.warn('Dictionary is already used', currentDict);
47
48 return;
44 } 49 }
45 }
46 50
47 toggleSpellchecker(enable = false) { 51 provider.switchDictionary(locale);
48 this.inputs.forEach((input) => {
49 input.setAttribute('spellcheck', enable);
50 });
51 52
52 this.intervalHandler(enable); 53 debug('Switched dictionary to', locale);
54
55 currentDict = locale;
56 _isEnabled = true;
57 } catch (err) {
58 console.error(err);
53 } 59 }
60}
54 61
55 intervalHandler(enable) { 62export default async function initialize(languageCode = 'en-us') {
56 clearInterval(this.DOMCheckInterval); 63 try {
64 provider = new SpellCheckerProvider();
65 const locale = languageCode.toLowerCase();
57 66
58 if (enable) { 67 debug('Init spellchecker');
59 this.DOMCheckInterval = setInterval(() => this.toggleSpellchecker(enable), 30000); 68 await provider.initialize();
60 } 69 await loadDictionaries();
70
71 debug('Available spellchecker dictionaries', provider.availableDictionaries);
72
73 switchDict(locale);
74
75 return provider;
76 } catch (err) {
77 console.error(err);
78 return false;
61 } 79 }
62} 80}
63 81
82export function isEnabled() {
83 return _isEnabled;
84}
85
86export function disable() {
87 if (isEnabled()) {
88 webFrame.setSpellCheckProvider(currentDict, true, { spellCheck: () => true });
89 _isEnabled = false;
90 currentDict = null;
91 }
92}