mirror of
https://github.com/bulwarkmail/webmail.git
synced 2026-11-04 16:14:07 +00:00
feat: add a developer tools switch to the desktop app's troubleshooting settings
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
import { act, fireEvent, render, screen } from '@testing-library/react';
|
||||
import { afterEach, describe, expect, it, vi } from 'vitest';
|
||||
import type { BulwarkDesktopBridge, DesktopDevToolsState } from '@/lib/desktop/types';
|
||||
|
||||
vi.mock('next-intl', () => ({
|
||||
useTranslations: () => (key: string, values?: Record<string, unknown>) => (values ? `${key}:${JSON.stringify(values)}` : key),
|
||||
}));
|
||||
|
||||
const { DesktopDevToolsSettings } = await import('../desktop-devtools-settings');
|
||||
|
||||
function setBridge(state: DesktopDevToolsState | null, platform: 'win32' | 'darwin' = 'win32') {
|
||||
const listeners = new Set<(next: DesktopDevToolsState) => void>();
|
||||
const set = vi.fn(async (on: boolean) => ({ ...state!, on }));
|
||||
window.bulwarkDesktop = (state
|
||||
? {
|
||||
version: 1,
|
||||
platform,
|
||||
devTools: {
|
||||
get: async () => state,
|
||||
set,
|
||||
onChange: (listener: (next: DesktopDevToolsState) => void) => {
|
||||
listeners.add(listener);
|
||||
return () => listeners.delete(listener);
|
||||
},
|
||||
},
|
||||
}
|
||||
: { version: 1, platform }) as unknown as BulwarkDesktopBridge;
|
||||
return { set, emit: (next: DesktopDevToolsState) => listeners.forEach((listener) => listener(next)) };
|
||||
}
|
||||
|
||||
afterEach(() => {
|
||||
window.bulwarkDesktop = undefined;
|
||||
});
|
||||
|
||||
describe('the developer tools setting', () => {
|
||||
it('is not there in a browser or on a shell without it', () => {
|
||||
const { container } = render(<DesktopDevToolsSettings />);
|
||||
expect(container.innerHTML).toBe('');
|
||||
setBridge(null);
|
||||
const second = render(<DesktopDevToolsSettings />);
|
||||
expect(second.container.innerHTML).toBe('');
|
||||
});
|
||||
|
||||
it('is off by default, names the shortcut, and asks main to turn it on', async () => {
|
||||
const { set } = setBridge({ on: false, forcedOff: false, locked: false });
|
||||
render(<DesktopDevToolsSettings />);
|
||||
const toggle = await screen.findByTestId('desktop-devtools-toggle');
|
||||
expect(toggle.getAttribute('aria-checked')).toBe('false');
|
||||
expect(screen.getByText('label:{"shortcut":"Ctrl+Shift+I"}')).toBeTruthy();
|
||||
fireEvent.click(toggle);
|
||||
expect(set).toHaveBeenCalledWith(true);
|
||||
});
|
||||
|
||||
it('a Mac names its own keys', async () => {
|
||||
setBridge({ on: false, forcedOff: false, locked: false }, 'darwin');
|
||||
render(<DesktopDevToolsSettings />);
|
||||
expect(await screen.findByText('label:{"shortcut":"Cmd+Option+I"}')).toBeTruthy();
|
||||
});
|
||||
|
||||
it('a policy locks it off, and the app lock stops changes', async () => {
|
||||
const { emit } = setBridge({ on: false, forcedOff: true, locked: false });
|
||||
render(<DesktopDevToolsSettings />);
|
||||
const toggle = await screen.findByTestId('desktop-devtools-toggle');
|
||||
expect(toggle.hasAttribute('disabled')).toBe(true);
|
||||
expect(screen.getByText('forced_off')).toBeTruthy();
|
||||
act(() => emit({ on: false, forcedOff: false, locked: true }));
|
||||
expect(screen.getByText('locked')).toBeTruthy();
|
||||
expect(screen.getByTestId('desktop-devtools-toggle').hasAttribute('disabled')).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,51 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
import { useTranslations } from "next-intl";
|
||||
import { getDesktopBridge } from "@/lib/desktop/bridge";
|
||||
import type { DesktopDevToolsState } from "@/lib/desktop/types";
|
||||
import { SettingItem, SettingsSection, ToggleSwitch } from "./settings-section";
|
||||
|
||||
/**
|
||||
* Troubleshooting in the desktop app: Chromium's developer tools on a key, off until the
|
||||
* user turns them on. Main keeps the switch and asks with a native warning, so a page or
|
||||
* plugin can't turn it on by itself. A browser never shows this.
|
||||
*/
|
||||
export function DesktopDevToolsSettings() {
|
||||
const t = useTranslations("desktopDevTools");
|
||||
const bridge = getDesktopBridge();
|
||||
const devTools = bridge?.devTools;
|
||||
const [state, setState] = useState<DesktopDevToolsState | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
if (!devTools) return;
|
||||
let stale = false;
|
||||
void devTools.get().then((next) => {
|
||||
if (!stale) setState(next);
|
||||
}, () => {});
|
||||
const stop = devTools.onChange((next) => {
|
||||
if (!stale) setState(next);
|
||||
});
|
||||
return () => {
|
||||
stale = true;
|
||||
stop();
|
||||
};
|
||||
}, [devTools]);
|
||||
|
||||
if (!devTools || !state) return null;
|
||||
const shortcut = bridge?.platform === "darwin" ? "Cmd+Option+I" : "Ctrl+Shift+I";
|
||||
const description = state.forcedOff ? t("forced_off") : state.locked ? t("locked") : t("description", { shortcut });
|
||||
|
||||
return (
|
||||
<SettingsSection id="desktop-troubleshooting" title={t("section_title")}>
|
||||
<SettingItem label={t("label", { shortcut })} description={description} locked={state.forcedOff}>
|
||||
<ToggleSwitch
|
||||
checked={state.on}
|
||||
disabled={state.forcedOff || state.locked}
|
||||
testId="desktop-devtools-toggle"
|
||||
onChange={(on) => void devTools.set(on).then(setState, () => {})}
|
||||
/>
|
||||
</SettingItem>
|
||||
</SettingsSection>
|
||||
);
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import { PlayCircle } from '@/components/icons';
|
||||
import { IS_LITE } from '@/lib/lite';
|
||||
import { DesktopUpdateSettings } from './desktop-update-settings';
|
||||
import { DesktopWindowSettings } from './desktop-window-settings';
|
||||
import { DesktopDevToolsSettings } from './desktop-devtools-settings';
|
||||
|
||||
/**
|
||||
* The General page: language and time, which links the browser hands to
|
||||
@@ -61,6 +62,7 @@ export function GeneralSettings({ supportsCalendar }: { supportsCalendar: boolea
|
||||
</SettingsSection>
|
||||
|
||||
{!IS_LITE && <DesktopUpdateSettings />}
|
||||
<DesktopDevToolsSettings />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
<category name="Bulwark_Desktop_security" displayName="$(string.Category_security)"><parentCategory ref="Bulwark_Desktop"/></category>
|
||||
<category name="Bulwark_Desktop_privacy" displayName="$(string.Category_privacy)"><parentCategory ref="Bulwark_Desktop"/></category>
|
||||
<category name="Bulwark_Desktop_signIn" displayName="$(string.Category_signIn)"><parentCategory ref="Bulwark_Desktop"/></category>
|
||||
<category name="Bulwark_Desktop_system" displayName="$(string.Category_system)"><parentCategory ref="Bulwark_Desktop"/></category>
|
||||
</categories>
|
||||
<policies>
|
||||
<policy name="InstanceUrl" class="Both" displayName="$(string.InstanceUrl)" explainText="$(string.InstanceUrl_Explain)" presentation="$(presentation.InstanceUrl)" key="Software\Policies\Bulwark\Desktop">
|
||||
@@ -234,5 +235,18 @@
|
||||
<text id="WipeOfflineData_Value" valueName="WipeOfflineData" required="true" maxLength="128"/>
|
||||
</elements>
|
||||
</policy>
|
||||
<policy name="OpenWithEnabled" class="Both" displayName="$(string.OpenWithEnabled)" explainText="$(string.OpenWithEnabled_Explain)" key="Software\Policies\Bulwark\Desktop" valueName="OpenWithEnabled">
|
||||
<parentCategory ref="Bulwark_Desktop_system"/>
|
||||
<supportedOn ref="SUPPORTED_Bulwark_Desktop"/>
|
||||
<enabledValue><decimal value="1"/></enabledValue>
|
||||
<disabledValue><decimal value="0"/></disabledValue>
|
||||
</policy>
|
||||
<policy name="DeveloperToolsAvailability" class="Both" displayName="$(string.DeveloperToolsAvailability)" explainText="$(string.DeveloperToolsAvailability_Explain)" presentation="$(presentation.DeveloperToolsAvailability)" key="Software\Policies\Bulwark\Desktop">
|
||||
<parentCategory ref="Bulwark_Desktop_system"/>
|
||||
<supportedOn ref="SUPPORTED_Bulwark_Desktop"/>
|
||||
<elements>
|
||||
<decimal id="DeveloperToolsAvailability_Value" valueName="DeveloperToolsAvailability" required="true" minValue="0" maxValue="2"/>
|
||||
</elements>
|
||||
</policy>
|
||||
</policies>
|
||||
</policyDefinitions>
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
<string id="Category_security">Offline-E-Mails und App-Sperre</string>
|
||||
<string id="Category_privacy">Datenschutz</string>
|
||||
<string id="Category_signIn">Anmeldung und Zertifikate</string>
|
||||
<string id="Category_system">Systemintegration und Fehlerbehebung</string>
|
||||
<string id="InstanceUrl">Bulwark-Server</string>
|
||||
<string id="InstanceUrl_Explain">Die Adresse Ihres Bulwark-Servers, beginnend mit https://. Wenn erzwungen, öffnet sich die App auf diesem Server, die Serverauswahl ist ausgeblendet und das Fenster bleibt auf diesem Server. Eine ungültige Adresse zeigt eine Fehlerseite mit dem Namen dieser Richtlinie, und die App weicht auf nichts anderes aus. Als Standardwert öffnet sich die App auf diesem Server, bis der Benutzer etwas anderes wählt.</string>
|
||||
<string id="AllowStandalone">Direkte Verbindungen zu Mailservern zulassen</string>
|
||||
@@ -62,6 +63,10 @@
|
||||
<string id="BrowserSignIn_Explain">Wenn aktiviert oder nicht konfiguriert, bietet die Anmeldeseite „Mit Ihrem Browser anmelden“ an, damit Benutzer dort ihren Passwort-Manager, Passkeys und Ihr Single Sign-on verwenden können. Wenn deaktiviert, fehlt die Schaltfläche und die App lehnt den Vorgang ab. Das Formular in der App bleibt, sofern der Server nicht nur OAuth erlaubt.</string>
|
||||
<string id="WipeOfflineData">Auf dem Gerät behaltene E-Mails löschen</string>
|
||||
<string id="WipeOfflineData_Explain">Setzen Sie dies auf einen neuen Wert, etwa das heutige Datum, um alles zu löschen, was die App für alle Server und Konten auf dem Gerät behält: E-Mails, Schlüssel und Anmeldungen, Benutzer melden sich also neu an. Jeder Wert löscht einmal: Die App merkt sich, welche sie schon ausgeführt hat, ein Wert kann also stehen bleiben. Verwenden Sie einen neuen Wert, um erneut zu löschen.</string>
|
||||
<string id="OpenWithEnabled">App unter „Öffnen mit“ und „Senden an“ anbieten</string>
|
||||
<string id="OpenWithEnabled_Explain">Wenn aktiviert oder nicht konfiguriert, trägt sich die App unter Windows in die Liste „Öffnen mit“ für gängige Dokumente und Bilder und in das Menü „Senden an“ ein, damit Benutzer eine Datei aus dem Dateimanager an eine neue Nachricht anhängen können. Sie wird nie zum Standardprogramm für diese Dateien. Wenn deaktiviert, entfernt die App diese Einträge für den Benutzer. Mail-Links und .eml-, .ics- und .vcf-Dateien sind nicht betroffen.</string>
|
||||
<string id="DeveloperToolsAvailability">Entwicklertools</string>
|
||||
<string id="DeveloperToolsAvailability_Explain">Dieselben Werte wie die gleichnamige Richtlinie von Chrome. 2: Die Entwicklertools sind aus und die Einstellung ist gesperrt. 0 oder 1 oder nicht konfiguriert: Benutzer können sie nach einer Warnung in den Einstellungen einschalten. Mit den Entwicklertools kann jeder an der Tastatur alles lesen, was die App enthält, auch E-Mails und Passwörter im Speicher.</string>
|
||||
</stringTable>
|
||||
<presentationTable>
|
||||
<presentation id="InstanceUrl"><textBox refId="InstanceUrl_Value"><label>Adresse des Bulwark-Servers</label></textBox></presentation>
|
||||
@@ -80,6 +85,7 @@
|
||||
<presentation id="AutoSelectCertificateForUrls"><listBox refId="AutoSelectCertificateForUrls_Value">Regeln</listBox></presentation>
|
||||
<presentation id="KeystoreAllowedOrigins"><listBox refId="KeystoreAllowedOrigins_Value">Adressen</listBox></presentation>
|
||||
<presentation id="WipeOfflineData"><textBox refId="WipeOfflineData_Value"><label>Löschcode</label></textBox></presentation>
|
||||
<presentation id="DeveloperToolsAvailability"><decimalTextBox refId="DeveloperToolsAvailability_Value" defaultValue="2">Wert (0, 1 oder 2)</decimalTextBox></presentation>
|
||||
</presentationTable>
|
||||
</resources>
|
||||
</policyDefinitionResources>
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
<string id="Category_security">Offline mail and app lock</string>
|
||||
<string id="Category_privacy">Privacy</string>
|
||||
<string id="Category_signIn">Sign-in and certificates</string>
|
||||
<string id="Category_system">System integration and troubleshooting</string>
|
||||
<string id="InstanceUrl">Bulwark server</string>
|
||||
<string id="InstanceUrl_Explain">The address of your Bulwark server, starting with https://. When forced, the app opens on this server, the choice of server is hidden, and the window stays on it. An invalid address shows an error page that names this policy, and the app does not fall back to anything else. As a default, the app opens on this server until the user picks something else.</string>
|
||||
<string id="AllowStandalone">Allow direct connections to mail servers</string>
|
||||
@@ -62,6 +63,10 @@
|
||||
<string id="BrowserSignIn_Explain">When enabled or not configured, the login page offers "Sign in with your browser", so people can use their password manager, passkeys and your single sign-on there. When disabled, the button is gone and the app refuses the flow. The form in the app stays, unless the server only allows OAuth.</string>
|
||||
<string id="WipeOfflineData">Delete mail kept on the device</string>
|
||||
<string id="WipeOfflineData_Explain">Set this to a new value, such as today's date, to delete everything the app keeps on the device for every server and account: mail, keys, and sign-ins, so people sign in again. Each value deletes once: the app remembers the ones it has acted on, so it stays safe to leave a value in place. Use a new value to delete again.</string>
|
||||
<string id="OpenWithEnabled">Offer the app in "Open with" and "Send to"</string>
|
||||
<string id="OpenWithEnabled_Explain">When enabled or not configured, the app adds itself to the "Open with" list for common documents and pictures and to the "Send to" menu on Windows, so people can attach a file to a new message from the file manager. It never becomes the default program for those files. When disabled, the app removes these entries for the user. Mail links and .eml, .ics and .vcf files are not affected.</string>
|
||||
<string id="DeveloperToolsAvailability">Developer tools</string>
|
||||
<string id="DeveloperToolsAvailability_Explain">The same values as Chrome's policy of this name. 2: developer tools are off and the setting is locked. 0 or 1, or not configured: people can turn them on under Settings, after a warning. Developer tools let anyone at the keyboard read everything the app holds, mail and passwords in memory included.</string>
|
||||
</stringTable>
|
||||
<presentationTable>
|
||||
<presentation id="InstanceUrl"><textBox refId="InstanceUrl_Value"><label>Address of the Bulwark server</label></textBox></presentation>
|
||||
@@ -80,6 +85,7 @@
|
||||
<presentation id="AutoSelectCertificateForUrls"><listBox refId="AutoSelectCertificateForUrls_Value">Rules</listBox></presentation>
|
||||
<presentation id="KeystoreAllowedOrigins"><listBox refId="KeystoreAllowedOrigins_Value">Addresses</listBox></presentation>
|
||||
<presentation id="WipeOfflineData"><textBox refId="WipeOfflineData_Value"><label>Wipe code</label></textBox></presentation>
|
||||
<presentation id="DeveloperToolsAvailability"><decimalTextBox refId="DeveloperToolsAvailability_Value" defaultValue="2">Value (0, 1 or 2)</decimalTextBox></presentation>
|
||||
</presentationTable>
|
||||
</resources>
|
||||
</policyDefinitionResources>
|
||||
|
||||
@@ -65,6 +65,10 @@
|
||||
</array>
|
||||
<key>BrowserSignIn</key>
|
||||
<true/>
|
||||
<key>OpenWithEnabled</key>
|
||||
<true/>
|
||||
<key>DeveloperToolsAvailability</key>
|
||||
<integer>2</integer>
|
||||
<key>Recommended</key>
|
||||
<dict>
|
||||
<key>UpdateChannel</key>
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
"https://mail.example.com"
|
||||
],
|
||||
"BrowserSignIn": true,
|
||||
"OpenWithEnabled": true,
|
||||
"DeveloperToolsAvailability": 2,
|
||||
"Recommended": {
|
||||
"UpdateChannel": "stable"
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ describe('the schema', () => {
|
||||
'PluginsMode', 'PluginAllowlist', 'OfflineEnabled', 'AppLockRequired', 'AppLockTimeoutMinutes', 'TelemetryAllowed',
|
||||
'CrashReportsAllowed', 'QuickComposeShortcut', 'AuthServerAllowlist', 'AuthNegotiateDelegateAllowlist',
|
||||
'AutoSelectCertificateForUrls', 'KeystoreEnabled', 'KeystoreAllowedOrigins', 'BrowserSignIn', 'WipeOfflineData',
|
||||
'OpenWithEnabled', 'DeveloperToolsAvailability',
|
||||
]);
|
||||
for (const key of POLICY_KEYS) {
|
||||
const { title, description } = POLICY_SCHEMA[key];
|
||||
@@ -40,6 +41,22 @@ describe('the schema', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('developer tools and Open with', () => {
|
||||
it("takes Chrome values for developer tools, forced only, and a value nobody can read locks them off", () => {
|
||||
expect(resolvePolicies(layers({ forcedMachine: { DeveloperToolsAvailability: 2 } })).DeveloperToolsAvailability).toMatchObject({ value: 2, locked: true });
|
||||
expect(resolvePolicies(layers({ recommendedMachine: { DeveloperToolsAvailability: 2 } })).DeveloperToolsAvailability).toMatchObject({ value: null, locked: false });
|
||||
// Not 0 or 1: the shell reads a locked entry that isn't an explicit yes as off.
|
||||
expect(resolvePolicies(layers({ forcedUser: { DeveloperToolsAvailability: 7 } })).DeveloperToolsAvailability).toMatchObject({ value: null, locked: true });
|
||||
});
|
||||
|
||||
it('turn Open with off only by force, and a value nobody can read leaves it off', () => {
|
||||
expect(resolvePolicies(layers({})).OpenWithEnabled).toMatchObject({ value: true, locked: false });
|
||||
expect(resolvePolicies(layers({ recommendedUser: { OpenWithEnabled: 0 } })).OpenWithEnabled).toMatchObject({ value: true, locked: false });
|
||||
expect(resolvePolicies(layers({ forcedMachine: { OpenWithEnabled: 0 } })).OpenWithEnabled).toMatchObject({ value: false, locked: true });
|
||||
expect(resolvePolicies(layers({ forcedMachine: { OpenWithEnabled: 'maybe' } })).OpenWithEnabled).toMatchObject({ value: false, locked: true });
|
||||
});
|
||||
});
|
||||
|
||||
describe('precedence', () => {
|
||||
it('forced machine > forced user > recommended machine > recommended user > default', () => {
|
||||
const all = {
|
||||
|
||||
@@ -99,6 +99,7 @@ export function shellLabels(t: (key: string, values?: Record<string, string>) =>
|
||||
menuZoomOut: t('desktopUi.menu.zoom_out'),
|
||||
menuZoomReset: t('desktopUi.menu.zoom_reset'),
|
||||
menuFullScreen: t('desktopUi.menu.full_screen'),
|
||||
menuToggleDevTools: t('desktopDevTools.menu_toggle'),
|
||||
menuReply: t('context_menu.reply'),
|
||||
menuReplyAll: t('context_menu.reply_all'),
|
||||
menuForward: t('context_menu.forward'),
|
||||
|
||||
@@ -29,7 +29,7 @@ export const POLICY_MAX_FILE_BYTES = 1024 * 1024;
|
||||
|
||||
export type PolicyText = { en: string; de: string };
|
||||
|
||||
export type PolicyCategory = 'connection' | 'updates' | 'plugins' | 'security' | 'privacy' | 'signIn';
|
||||
export type PolicyCategory = 'connection' | 'updates' | 'plugins' | 'security' | 'privacy' | 'signIn' | 'system';
|
||||
|
||||
export const POLICY_CATEGORIES: Record<PolicyCategory, PolicyText> = {
|
||||
connection: { en: 'Connection', de: 'Verbindung' },
|
||||
@@ -38,6 +38,7 @@ export const POLICY_CATEGORIES: Record<PolicyCategory, PolicyText> = {
|
||||
security: { en: 'Offline mail and app lock', de: 'Offline-E-Mails und App-Sperre' },
|
||||
privacy: { en: 'Privacy', de: 'Datenschutz' },
|
||||
signIn: { en: 'Sign-in and certificates', de: 'Anmeldung und Zertifikate' },
|
||||
system: { en: 'System integration and troubleshooting', de: 'Systemintegration und Fehlerbehebung' },
|
||||
};
|
||||
|
||||
export interface CertificateName {
|
||||
@@ -79,6 +80,8 @@ export interface PolicyValues {
|
||||
KeystoreAllowedOrigins: string[];
|
||||
BrowserSignIn: boolean;
|
||||
WipeOfflineData: string | null;
|
||||
OpenWithEnabled: boolean;
|
||||
DeveloperToolsAvailability: number | null;
|
||||
}
|
||||
|
||||
export type PolicyKey = keyof PolicyValues;
|
||||
@@ -426,6 +429,34 @@ export const POLICY_SCHEMA: Record<PolicyKey, PolicyDefinition> = {
|
||||
de: 'Setzen Sie dies auf einen neuen Wert, etwa das heutige Datum, um alles zu löschen, was die App für alle Server und Konten auf dem Gerät behält: E-Mails, Schlüssel und Anmeldungen, Benutzer melden sich also neu an. Jeder Wert löscht einmal: Die App merkt sich, welche sie schon ausgeführt hat, ein Wert kann also stehen bleiben. Verwenden Sie einen neuen Wert, um erneut zu löschen.',
|
||||
},
|
||||
},
|
||||
OpenWithEnabled: {
|
||||
category: 'system',
|
||||
type: 'boolean',
|
||||
default: true,
|
||||
onInvalid: false,
|
||||
forcedOnly: true,
|
||||
sample: true,
|
||||
title: { en: 'Offer the app in "Open with" and "Send to"', de: 'App unter „Öffnen mit“ und „Senden an“ anbieten' },
|
||||
description: {
|
||||
en: 'When enabled or not configured, the app adds itself to the "Open with" list for common documents and pictures and to the "Send to" menu on Windows, so people can attach a file to a new message from the file manager. It never becomes the default program for those files. When disabled, the app removes these entries for the user. Mail links and .eml, .ics and .vcf files are not affected.',
|
||||
de: 'Wenn aktiviert oder nicht konfiguriert, trägt sich die App unter Windows in die Liste „Öffnen mit“ für gängige Dokumente und Bilder und in das Menü „Senden an“ ein, damit Benutzer eine Datei aus dem Dateimanager an eine neue Nachricht anhängen können. Sie wird nie zum Standardprogramm für diese Dateien. Wenn deaktiviert, entfernt die App diese Einträge für den Benutzer. Mail-Links und .eml-, .ics- und .vcf-Dateien sind nicht betroffen.',
|
||||
},
|
||||
},
|
||||
DeveloperToolsAvailability: {
|
||||
category: 'system',
|
||||
type: 'integer',
|
||||
default: null,
|
||||
min: 0,
|
||||
max: 2,
|
||||
forcedOnly: true,
|
||||
unit: { en: 'Value (0, 1 or 2)', de: 'Wert (0, 1 oder 2)' },
|
||||
sample: 2,
|
||||
title: { en: 'Developer tools', de: 'Entwicklertools' },
|
||||
description: {
|
||||
en: 'The same values as Chrome\'s policy of this name. 2: developer tools are off and the setting is locked. 0 or 1, or not configured: people can turn them on under Settings, after a warning. Developer tools let anyone at the keyboard read everything the app holds, mail and passwords in memory included.',
|
||||
de: 'Dieselben Werte wie die gleichnamige Richtlinie von Chrome. 2: Die Entwicklertools sind aus und die Einstellung ist gesperrt. 0 oder 1 oder nicht konfiguriert: Benutzer können sie nach einer Warnung in den Einstellungen einschalten. Mit den Entwicklertools kann jeder an der Tastatur alles lesen, was die App enthält, auch E-Mails und Passwörter im Speicher.',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export const POLICY_KEYS = Object.keys(POLICY_SCHEMA) as PolicyKey[];
|
||||
@@ -857,6 +888,8 @@ export const POLICY_CONSUMERS: Record<PolicyKey, PolicyConsumer> = {
|
||||
KeystoreEnabled: { repo: 'shell', file: 'src/main/features/policies.ts' },
|
||||
KeystoreAllowedOrigins: { repo: 'shell', file: 'src/main/features/policies.ts' },
|
||||
BrowserSignIn: { repo: 'shell', file: 'src/main/features/browser-sign-in.ts' },
|
||||
OpenWithEnabled: { repo: 'shell', file: 'src/main/features/os-default-app.ts' },
|
||||
DeveloperToolsAvailability: { repo: 'shell', file: 'src/main/features/dev-tools.ts' },
|
||||
};
|
||||
|
||||
/** The part the embedded server enforces. Sent to it by message. */
|
||||
|
||||
@@ -675,6 +675,23 @@ export interface DesktopPrivacyBridge {
|
||||
onChange: (listener: (state: DesktopPrivacyState) => void) => () => void;
|
||||
}
|
||||
|
||||
/** `forcedOff`: the DeveloperToolsAvailability policy says no. `locked`: the app lock is on, so nothing changes. */
|
||||
export interface DesktopDevToolsState {
|
||||
on: boolean;
|
||||
forcedOff: boolean;
|
||||
locked: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Chromium's developer tools on Ctrl+Shift+I and F12, off by default. Main keeps the switch.
|
||||
* Turning it on takes a real click and a native warning; the app lock turns it off again.
|
||||
*/
|
||||
export interface DesktopDevToolsBridge {
|
||||
get: () => Promise<DesktopDevToolsState>;
|
||||
set: (on: boolean) => Promise<DesktopDevToolsState>;
|
||||
onChange: (listener: (state: DesktopDevToolsState) => void) => () => void;
|
||||
}
|
||||
|
||||
/** An attachment copied to a private folder and open in its default program. */
|
||||
export interface DesktopEditSession {
|
||||
id: string;
|
||||
@@ -793,6 +810,8 @@ export interface BulwarkDesktopBridge {
|
||||
localImport?: DesktopLocalImportBridge;
|
||||
privacy?: DesktopPrivacyBridge;
|
||||
edit?: DesktopEditBridge;
|
||||
/** Absent on older shells. */
|
||||
devTools?: DesktopDevToolsBridge;
|
||||
}
|
||||
|
||||
declare global {
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "تكتب هذه المفاتيح حرفًا على لوحة مفاتيحك، وسيتوقف عن العمل في كل التطبيقات. جرّب مفاتيح أخرى.",
|
||||
"reserved": "يستخدم النظام أو معظم التطبيقات هذه المفاتيح. جرّب مفاتيح أخرى."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "استكشاف الأخطاء وإصلاحها",
|
||||
"label": "أدوات المطورين ({shortcut})",
|
||||
"description": "يتيح لـ {shortcut} وF12 فتح أدوات المطورين للنافذة التي أنت فيها. يتوقف مرة أخرى عند قفل التطبيق.",
|
||||
"forced_off": "أوقفته مؤسستك.",
|
||||
"locked": "ألغِ قفل التطبيق لتغيير هذا.",
|
||||
"menu_toggle": "إظهار أدوات المطورين أو إخفاؤها"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "أفلت الملفات",
|
||||
"overlay_title": "إلى أين تذهب الملفات؟",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Aquestes tecles escriuen un caràcter al teu teclat, i deixaria de funcionar a totes les aplicacions. Prova altres tecles.",
|
||||
"reserved": "El sistema o la majoria d'aplicacions fan servir aquestes tecles. Prova altres tecles."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Resolució de problemes",
|
||||
"label": "Eines per a desenvolupadors ({shortcut})",
|
||||
"description": "Permet que {shortcut} i F12 obrin les eines per a desenvolupadors a la finestra on ets. Es desactiva quan l'app es bloqueja.",
|
||||
"forced_off": "Desactivat per la teva organització.",
|
||||
"locked": "Desbloqueja l'app per canviar-ho.",
|
||||
"menu_toggle": "Mostra o amaga les eines per a desenvolupadors"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Deixa anar fitxers",
|
||||
"overlay_title": "On han d'anar els fitxers?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Tyto klávesy na vaší klávesnici píší znak, který by pak nefungoval v žádné aplikaci. Zkuste jiné klávesy.",
|
||||
"reserved": "Tyto klávesy používá systém nebo většina aplikací. Zkuste jiné klávesy."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Řešení potíží",
|
||||
"label": "Nástroje pro vývojáře ({shortcut})",
|
||||
"description": "Umožní, aby {shortcut} a F12 otevřely nástroje pro vývojáře v okně, kde jste. Vypne se, když se aplikace zamkne.",
|
||||
"forced_off": "Vypnuto vaší organizací.",
|
||||
"locked": "Pro změnu aplikaci odemkněte.",
|
||||
"menu_toggle": "Zobrazit nebo skrýt nástroje pro vývojáře"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Pustit soubory",
|
||||
"overlay_title": "Kam mají soubory jít?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Disse taster skriver et tegn på dit tastatur, og det ville holde op med at virke i alle apps. Prøv andre taster.",
|
||||
"reserved": "Dit system eller de fleste apps bruger disse taster. Prøv andre taster."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Fejlfinding",
|
||||
"label": "Udviklerværktøjer ({shortcut})",
|
||||
"description": "Lader {shortcut} og F12 åbne udviklerværktøjerne for det vindue, du er i. Slås fra igen, når appen låses.",
|
||||
"forced_off": "Slået fra af din organisation.",
|
||||
"locked": "Lås appen op for at ændre dette.",
|
||||
"menu_toggle": "Vis eller skjul udviklerværktøjer"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Slip filer",
|
||||
"overlay_title": "Hvor skal filerne hen?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Diese Tasten erzeugen auf Ihrer Tastatur ein Zeichen, das dann in keiner App mehr funktionieren würde. Versuchen Sie andere Tasten.",
|
||||
"reserved": "Ihr System oder die meisten Apps verwenden diese Tasten. Versuchen Sie andere Tasten."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Fehlerbehebung",
|
||||
"label": "Entwicklertools ({shortcut})",
|
||||
"description": "Mit {shortcut} und F12 öffnen sich die Entwicklertools für das Fenster, in dem Sie sind. Schaltet sich wieder aus, wenn die App gesperrt wird.",
|
||||
"forced_off": "Von Ihrer Organisation ausgeschaltet.",
|
||||
"locked": "Entsperren Sie die App, um das zu ändern.",
|
||||
"menu_toggle": "Entwicklertools ein- oder ausblenden"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Dateien ablegen",
|
||||
"overlay_title": "Wohin sollen die Dateien?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "These keys type a character on your keyboard, and it would stop working in every app. Try other keys.",
|
||||
"reserved": "Your system or most apps use these keys. Try other keys."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Troubleshooting",
|
||||
"label": "Developer tools ({shortcut})",
|
||||
"description": "Lets {shortcut} and F12 open developer tools for the window you are in. Turns off again when the app locks.",
|
||||
"forced_off": "Turned off by your organisation.",
|
||||
"locked": "Unlock the app to change this.",
|
||||
"menu_toggle": "Toggle developer tools"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Drop files",
|
||||
"overlay_title": "Where should the files go?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Estas teclas escriben un carácter en tu teclado, y dejaría de funcionar en todas las aplicaciones. Prueba otras teclas.",
|
||||
"reserved": "Tu sistema o la mayoría de las aplicaciones usan estas teclas. Prueba otras teclas."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Solución de problemas",
|
||||
"label": "Herramientas para desarrolladores ({shortcut})",
|
||||
"description": "Permite que {shortcut} y F12 abran las herramientas para desarrolladores en la ventana en la que estás. Se desactiva al bloquearse la app.",
|
||||
"forced_off": "Desactivado por tu organización.",
|
||||
"locked": "Desbloquea la app para cambiar esto.",
|
||||
"menu_toggle": "Mostrar u ocultar herramientas para desarrolladores"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Soltar archivos",
|
||||
"overlay_title": "¿Dónde van los archivos?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Need klahvid kirjutavad teie klaviatuuril märgi, mis lakkaks kõigis rakendustes töötamast. Proovige teisi klahve.",
|
||||
"reserved": "Neid klahve kasutab süsteem või enamik rakendusi. Proovige teisi klahve."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Tõrkeotsing",
|
||||
"label": "Arendaja tööriistad ({shortcut})",
|
||||
"description": "Laseb klahvidel {shortcut} ja F12 avada arendaja tööriistad aknas, kus sa oled. Lülitub välja, kui rakendus lukustub.",
|
||||
"forced_off": "Teie organisatsioon on selle välja lülitanud.",
|
||||
"locked": "Selle muutmiseks ava rakenduse lukk.",
|
||||
"menu_toggle": "Näita või peida arendaja tööriistad"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Lohista failid siia",
|
||||
"overlay_title": "Kuhu failid lähevad?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "این کلیدها روی صفحهکلید شما نویسهای مینویسند و آن نویسه دیگر در هیچ برنامهای کار نمیکند. کلیدهای دیگری را امتحان کنید.",
|
||||
"reserved": "سیستم یا بیشتر برنامهها از این کلیدها استفاده میکنند. کلیدهای دیگری را امتحان کنید."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "عیبیابی",
|
||||
"label": "ابزارهای توسعهدهنده ({shortcut})",
|
||||
"description": "با {shortcut} و F12 ابزارهای توسعهدهنده برای پنجرهای که در آن هستید باز میشود. وقتی برنامه قفل شود دوباره خاموش میشود.",
|
||||
"forced_off": "سازمان شما این را خاموش کرده است.",
|
||||
"locked": "برای تغییر این، قفل برنامه را باز کنید.",
|
||||
"menu_toggle": "نمایش یا پنهان کردن ابزارهای توسعهدهنده"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "رها کردن فایلها",
|
||||
"overlay_title": "فایلها کجا بروند؟",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Ces touches produisent un caractère sur votre clavier, et il ne fonctionnerait plus dans aucune application. Essayez d'autres touches.",
|
||||
"reserved": "Votre système ou la plupart des applications utilisent ces touches. Essayez d'autres touches."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Dépannage",
|
||||
"label": "Outils de développement ({shortcut})",
|
||||
"description": "{shortcut} et F12 ouvrent les outils de développement pour la fenêtre où vous êtes. Se désactive quand l'app se verrouille.",
|
||||
"forced_off": "Désactivé par votre organisation.",
|
||||
"locked": "Déverrouillez l'app pour modifier ce réglage.",
|
||||
"menu_toggle": "Afficher ou masquer les outils de développement"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Déposer des fichiers",
|
||||
"overlay_title": "Où mettre les fichiers ?",
|
||||
|
||||
@@ -7059,6 +7059,14 @@
|
||||
"types_character": "המקשים האלה מקלידים תו במקלדת שלכם, והוא יפסיק לעבוד בכל האפליקציות. נסו מקשים אחרים.",
|
||||
"reserved": "המערכת או רוב האפליקציות משתמשות במקשים האלה. נסו מקשים אחרים."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "פתרון בעיות",
|
||||
"label": "כלים למפתחים ({shortcut})",
|
||||
"description": "מאפשר ל־{shortcut} ול־F12 לפתוח את הכלים למפתחים בחלון שבו אתם נמצאים. נכבה שוב כשהאפליקציה ננעלת.",
|
||||
"forced_off": "הארגון שלכם כיבה את זה.",
|
||||
"locked": "בטלו את נעילת האפליקציה כדי לשנות זאת.",
|
||||
"menu_toggle": "הצגה או הסתרה של הכלים למפתחים"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "שחררו קבצים",
|
||||
"overlay_title": "לאן הקבצים ילכו?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Ezek a billentyűk karaktert írnak az Ön billentyűzetén, amely többé egyik alkalmazásban sem működne. Próbáljon más billentyűket.",
|
||||
"reserved": "Ezeket a billentyűket a rendszer vagy a legtöbb alkalmazás használja. Próbáljon más billentyűket."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Hibaelhárítás",
|
||||
"label": "Fejlesztői eszközök ({shortcut})",
|
||||
"description": "A(z) {shortcut} és az F12 megnyitja a fejlesztői eszközöket abban az ablakban, ahol éppen van. Kikapcsol, amikor az alkalmazás zárolódik.",
|
||||
"forced_off": "A szervezete kikapcsolta.",
|
||||
"locked": "A módosításhoz oldja fel az alkalmazást.",
|
||||
"menu_toggle": "Fejlesztői eszközök megjelenítése vagy elrejtése"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Fájlok ejtése",
|
||||
"overlay_title": "Hová kerüljenek a fájlok?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Questi tasti scrivono un carattere sulla tua tastiera, che smetterebbe di funzionare in tutte le app. Prova altri tasti.",
|
||||
"reserved": "Il sistema o la maggior parte delle app usano questi tasti. Prova altri tasti."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Risoluzione dei problemi",
|
||||
"label": "Strumenti per sviluppatori ({shortcut})",
|
||||
"description": "{shortcut} e F12 aprono gli strumenti per sviluppatori nella finestra in cui ti trovi. Si disattiva quando l'app si blocca.",
|
||||
"forced_off": "Disattivato dalla tua organizzazione.",
|
||||
"locked": "Sblocca l'app per modificare questa opzione.",
|
||||
"menu_toggle": "Mostra o nascondi strumenti per sviluppatori"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Rilascia file",
|
||||
"overlay_title": "Dove vanno i file?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "このキーはお使いのキーボードで文字を入力します。割り当てると、すべてのアプリでその文字を入力できなくなります。別のキーをお試しください。",
|
||||
"reserved": "このキーはシステムまたは多くのアプリが使用しています。別のキーをお試しください。"
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "トラブルシューティング",
|
||||
"label": "デベロッパー ツール ({shortcut})",
|
||||
"description": "{shortcut} と F12 で、今いるウィンドウのデベロッパー ツールを開けるようにします。アプリがロックされるとオフに戻ります。",
|
||||
"forced_off": "組織によってオフにされています。",
|
||||
"locked": "変更するにはアプリのロックを解除してください。",
|
||||
"menu_toggle": "デベロッパー ツールの表示/非表示"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "ファイルをドロップ",
|
||||
"overlay_title": "ファイルをどこに入れますか?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "이 키는 사용 중인 키보드에서 문자를 입력하며, 지정하면 모든 앱에서 그 문자를 입력할 수 없게 됩니다. 다른 키를 사용해 보세요.",
|
||||
"reserved": "시스템 또는 대부분의 앱이 이 키를 사용합니다. 다른 키를 사용해 보세요."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "문제 해결",
|
||||
"label": "개발자 도구 ({shortcut})",
|
||||
"description": "{shortcut} 및 F12로 현재 창의 개발자 도구를 열 수 있게 합니다. 앱이 잠기면 다시 꺼집니다.",
|
||||
"forced_off": "조직에서 이 기능을 껐습니다.",
|
||||
"locked": "변경하려면 앱 잠금을 해제하세요.",
|
||||
"menu_toggle": "개발자 도구 표시/숨기기"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "파일 놓기",
|
||||
"overlay_title": "파일을 어디에 둘까요?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Šie taustiņi jūsu tastatūrā raksta rakstzīmi, kas pārstātu darboties visās lietotnēs. Izmēģiniet citus taustiņus.",
|
||||
"reserved": "Šos taustiņus izmanto sistēma vai lielākā daļa lietotņu. Izmēģiniet citus taustiņus."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Problēmu novēršana",
|
||||
"label": "Izstrādātāju rīki ({shortcut})",
|
||||
"description": "Ļauj {shortcut} un F12 atvērt izstrādātāju rīkus logā, kurā esat. Izslēdzas, kad lietotne tiek bloķēta.",
|
||||
"forced_off": "Jūsu organizācija to ir izslēgusi.",
|
||||
"locked": "Atbloķējiet lietotni, lai to mainītu.",
|
||||
"menu_toggle": "Rādīt vai paslēpt izstrādātāju rīkus"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Nometiet failus",
|
||||
"overlay_title": "Kur likt failus?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Эдгээр товч таны гар дээр тэмдэгт бичдэг тул тэр тэмдэгт бүх аппад ажиллахаа болино. Өөр товч туршина уу.",
|
||||
"reserved": "Систем эсвэл ихэнх апп эдгээр товчийг ашигладаг. Өөр товч туршина уу."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Алдаа засах",
|
||||
"label": "Хөгжүүлэгчийн хэрэгсэл ({shortcut})",
|
||||
"description": "{shortcut} болон F12 дарахад таны байгаа цонхонд хөгжүүлэгчийн хэрэгсэл нээгдэнэ. Апп түгжигдэхэд дахин унтарна.",
|
||||
"forced_off": "Танай байгууллага унтраасан.",
|
||||
"locked": "Үүнийг өөрчлөхийн тулд аппын түгжээг тайлна уу.",
|
||||
"menu_toggle": "Хөгжүүлэгчийн хэрэгслийг харуулах эсвэл нуух"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Файл буулгах",
|
||||
"overlay_title": "Файлуудыг хаана хийх вэ?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Disse tastene skriver et tegn på tastaturet ditt, og det ville slutte å virke i alle apper. Prøv andre taster.",
|
||||
"reserved": "Systemet ditt eller de fleste apper bruker disse tastene. Prøv andre taster."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Feilsøking",
|
||||
"label": "Utviklerverktøy ({shortcut})",
|
||||
"description": "Lar {shortcut} og F12 åpne utviklerverktøyene for vinduet du er i. Slås av igjen når appen låses.",
|
||||
"forced_off": "Slått av av organisasjonen din.",
|
||||
"locked": "Lås opp appen for å endre dette.",
|
||||
"menu_toggle": "Vis eller skjul utviklerverktøy"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Slipp filer",
|
||||
"overlay_title": "Hvor skal filene?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Deze toetsen typen een teken op je toetsenbord, en dat zou in geen enkele app meer werken. Probeer andere toetsen.",
|
||||
"reserved": "Je systeem of de meeste apps gebruiken deze toetsen. Probeer andere toetsen."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Probleemoplossing",
|
||||
"label": "Ontwikkelaarstools ({shortcut})",
|
||||
"description": "Met {shortcut} en F12 openen de ontwikkelaarstools voor het venster waarin je bent. Gaat weer uit als de app vergrendelt.",
|
||||
"forced_off": "Uitgezet door je organisatie.",
|
||||
"locked": "Ontgrendel de app om dit te wijzigen.",
|
||||
"menu_toggle": "Ontwikkelaarstools tonen of verbergen"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Bestanden neerzetten",
|
||||
"overlay_title": "Waar moeten de bestanden heen?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Te klawisze wpisują znak na Twojej klawiaturze i przestałby on działać we wszystkich aplikacjach. Wypróbuj inne klawisze.",
|
||||
"reserved": "Te klawisze są używane przez system lub większość aplikacji. Wypróbuj inne klawisze."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Rozwiązywanie problemów",
|
||||
"label": "Narzędzia dla deweloperów ({shortcut})",
|
||||
"description": "Pozwala, by {shortcut} i F12 otwierały narzędzia dla deweloperów w oknie, w którym jesteś. Wyłącza się, gdy aplikacja się zablokuje.",
|
||||
"forced_off": "Wyłączone przez Twoją organizację.",
|
||||
"locked": "Odblokuj aplikację, aby to zmienić.",
|
||||
"menu_toggle": "Pokaż lub ukryj narzędzia dla deweloperów"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Upuść pliki",
|
||||
"overlay_title": "Gdzie mają trafić pliki?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Estas teclas escrevem um carácter no seu teclado, e ele deixaria de funcionar em todas as aplicações. Experimente outras teclas.",
|
||||
"reserved": "O seu sistema ou a maioria das aplicações usam estas teclas. Experimente outras teclas."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Resolução de problemas",
|
||||
"label": "Ferramentas de programador ({shortcut})",
|
||||
"description": "Permite que {shortcut} e F12 abram as ferramentas de programador na janela em que está. Desliga-se quando a app bloqueia.",
|
||||
"forced_off": "Desligado pela sua organização.",
|
||||
"locked": "Desbloqueie a app para alterar isto.",
|
||||
"menu_toggle": "Mostrar ou ocultar ferramentas de programador"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Soltar arquivos",
|
||||
"overlay_title": "Para onde vão os arquivos?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Aceste taste scriu un caracter pe tastatura ta, iar el n-ar mai funcționa în nicio aplicație. Încearcă alte taste.",
|
||||
"reserved": "Sistemul sau majoritatea aplicațiilor folosesc aceste taste. Încearcă alte taste."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Depanare",
|
||||
"label": "Instrumente pentru dezvoltatori ({shortcut})",
|
||||
"description": "Permite ca {shortcut} și F12 să deschidă instrumentele pentru dezvoltatori în fereastra în care sunteți. Se oprește când aplicația se blochează.",
|
||||
"forced_off": "Oprit de organizația dvs.",
|
||||
"locked": "Deblocați aplicația pentru a schimba asta.",
|
||||
"menu_toggle": "Afișați sau ascundeți instrumentele pentru dezvoltatori"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Plasați fișiere",
|
||||
"overlay_title": "Unde merg fișierele?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "На вашей клавиатуре эти клавиши вводят символ, и он перестал бы работать во всех приложениях. Попробуйте другие клавиши.",
|
||||
"reserved": "Эти клавиши использует система или большинство приложений. Попробуйте другие клавиши."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Устранение неполадок",
|
||||
"label": "Инструменты разработчика ({shortcut})",
|
||||
"description": "{shortcut} и F12 открывают инструменты разработчика для окна, в котором вы находитесь. Выключается при блокировке приложения.",
|
||||
"forced_off": "Отключено вашей организацией.",
|
||||
"locked": "Разблокируйте приложение, чтобы изменить это.",
|
||||
"menu_toggle": "Показать или скрыть инструменты разработчика"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Перетащите файлы",
|
||||
"overlay_title": "Куда отправить файлы?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Tieto klávesy na vašej klávesnici píšu znak, ktorý by potom nefungoval v žiadnej aplikácii. Skúste iné klávesy.",
|
||||
"reserved": "Tieto klávesy používa systém alebo väčšina aplikácií. Skúste iné klávesy."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Riešenie problémov",
|
||||
"label": "Nástroje pre vývojárov ({shortcut})",
|
||||
"description": "Umožní, aby {shortcut} a F12 otvorili nástroje pre vývojárov v okne, kde ste. Vypne sa, keď sa aplikácia zamkne.",
|
||||
"forced_off": "Vypnuté vašou organizáciou.",
|
||||
"locked": "Na zmenu aplikáciu odomknite.",
|
||||
"menu_toggle": "Zobraziť alebo skryť nástroje pre vývojárov"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Pustiť súbory",
|
||||
"overlay_title": "Kam majú súbory ísť?",
|
||||
|
||||
@@ -7066,6 +7066,14 @@
|
||||
"types_character": "ปุ่มเหล่านี้พิมพ์อักขระบนแป้นพิมพ์ของคุณ และอักขระนั้นจะใช้ไม่ได้ในทุกแอป ลองใช้ปุ่มอื่น",
|
||||
"reserved": "ระบบหรือแอปส่วนใหญ่ใช้ปุ่มเหล่านี้ ลองใช้ปุ่มอื่น"
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "การแก้ไขปัญหา",
|
||||
"label": "เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ ({shortcut})",
|
||||
"description": "ให้ {shortcut} และ F12 เปิดเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ของหน้าต่างที่คุณอยู่ จะปิดอีกครั้งเมื่อแอปล็อก",
|
||||
"forced_off": "องค์กรของคุณปิดสิ่งนี้แล้ว",
|
||||
"locked": "ปลดล็อกแอปเพื่อเปลี่ยนการตั้งค่านี้",
|
||||
"menu_toggle": "แสดงหรือซ่อนเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "วางไฟล์",
|
||||
"overlay_title": "จะให้ไฟล์ไปที่ไหน",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "Bu tuşlar klavyenizde bir karakter yazar ve bu karakter hiçbir uygulamada çalışmaz olur. Başka tuşlar deneyin.",
|
||||
"reserved": "Bu tuşları sisteminiz veya çoğu uygulama kullanıyor. Başka tuşlar deneyin."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Sorun giderme",
|
||||
"label": "Geliştirici araçları ({shortcut})",
|
||||
"description": "{shortcut} ve F12 ile bulunduğunuz pencere için geliştirici araçları açılır. Uygulama kilitlenince yeniden kapanır.",
|
||||
"forced_off": "Kuruluşunuz tarafından kapatıldı.",
|
||||
"locked": "Bunu değiştirmek için uygulamanın kilidini açın.",
|
||||
"menu_toggle": "Geliştirici araçlarını göster veya gizle"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Dosyaları bırakın",
|
||||
"overlay_title": "Dosyalar nereye gitsin?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "На вашій клавіатурі ці клавіші вводять символ, і він перестав би працювати в усіх застосунках. Спробуйте інші клавіші.",
|
||||
"reserved": "Ці клавіші використовує система або більшість застосунків. Спробуйте інші клавіші."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Усунення несправностей",
|
||||
"label": "Інструменти розробника ({shortcut})",
|
||||
"description": "{shortcut} і F12 відкривають інструменти розробника для вікна, у якому ви є. Вимикається, коли застосунок блокується.",
|
||||
"forced_off": "Вимкнено вашою організацією.",
|
||||
"locked": "Розблокуйте застосунок, щоб змінити це.",
|
||||
"menu_toggle": "Показати або сховати інструменти розробника"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Перетягніть файли",
|
||||
"overlay_title": "Куди надіслати файли?",
|
||||
|
||||
@@ -7070,6 +7070,14 @@
|
||||
"types_character": "Các phím này gõ một ký tự trên bàn phím của bạn, và ký tự đó sẽ không dùng được trong mọi ứng dụng. Hãy thử phím khác.",
|
||||
"reserved": "Hệ thống hoặc hầu hết ứng dụng dùng các phím này. Hãy thử phím khác."
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "Khắc phục sự cố",
|
||||
"label": "Công cụ cho nhà phát triển ({shortcut})",
|
||||
"description": "Cho phép {shortcut} và F12 mở công cụ cho nhà phát triển của cửa sổ bạn đang dùng. Tự tắt lại khi ứng dụng khóa.",
|
||||
"forced_off": "Tổ chức của bạn đã tắt mục này.",
|
||||
"locked": "Hãy mở khóa ứng dụng để thay đổi.",
|
||||
"menu_toggle": "Hiện hoặc ẩn công cụ cho nhà phát triển"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "Thả tệp",
|
||||
"overlay_title": "Đưa tệp đi đâu?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "這些鍵在您的鍵盤上會輸入一個字元,占用後該字元在所有應用程式中都無法輸入。請試試其他按鍵。",
|
||||
"reserved": "系統或大多數應用程式正在使用這些鍵。請試試其他按鍵。"
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "疑難排解",
|
||||
"label": "開發人員工具({shortcut})",
|
||||
"description": "允許 {shortcut} 和 F12 為您所在的視窗開啟開發人員工具。應用程式鎖定時會再次關閉。",
|
||||
"forced_off": "您的組織已關閉此功能。",
|
||||
"locked": "請解除鎖定應用程式以變更此設定。",
|
||||
"menu_toggle": "顯示或隱藏開發人員工具"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "放開檔案",
|
||||
"overlay_title": "要把檔案放到哪裡?",
|
||||
|
||||
@@ -7058,6 +7058,14 @@
|
||||
"types_character": "这些键在您的键盘上会输入一个字符,占用后该字符在所有应用中都无法输入。请试试其他按键。",
|
||||
"reserved": "系统或大多数应用在使用这些键。请试试其他按键。"
|
||||
},
|
||||
"desktopDevTools": {
|
||||
"section_title": "故障排除",
|
||||
"label": "开发者工具({shortcut})",
|
||||
"description": "允许 {shortcut} 和 F12 为您所在的窗口打开开发者工具。应用锁定时会再次关闭。",
|
||||
"forced_off": "您的组织已关闭此功能。",
|
||||
"locked": "请解锁应用以更改此设置。",
|
||||
"menu_toggle": "显示或隐藏开发者工具"
|
||||
},
|
||||
"fileDrop": {
|
||||
"overlay_label": "放下文件",
|
||||
"overlay_title": "要把文件放到哪里?",
|
||||
|
||||
Reference in New Issue
Block a user