Compare commits

...

62 Commits

Author SHA1 Message Date
Anders Kaseorg
c45c9537d1 release: New release v5.11.0.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-03-22 16:19:52 -07:00
Anders Kaseorg
0eb4c9236e Upgrade dependencies, including Electron 29.1.5.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-03-22 16:12:34 -07:00
Anders Kaseorg
47366b7617 xo: Fix unicorn/prevent-abbreviations.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-03-22 16:07:32 -07:00
Anders Kaseorg
86e28f5b00 xo: Fix import/no-duplicates.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-03-22 15:33:00 -07:00
Anders Kaseorg
7072a41e01 Remove dialog for certificate errors on subresources.
Fixes #1119.  Closes #1277.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-03-22 14:56:23 -07:00
enesonus
79f6f13008 Allow hiding the window from full screen mode on macOS.
Fixes #1187.
2024-03-22 14:39:48 -07:00
Anders Kaseorg
70f0170f1d webview: Enable zooming with the mouse wheel.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-03-21 15:32:52 -07:00
Anders Kaseorg
bc75eba2bd webview: Use an exponential scale for zooming.
This matches the native Electron behavior.

Fixes part of #1360 by removing the separate zoomFactor state
variable.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-03-21 15:31:56 -07:00
Anders Kaseorg
af7272a439 release: New release v5.10.5.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-25 17:02:14 -08:00
Anders Kaseorg
9d08a13e64 Set a restrictive Content-Security-Policy for the app UI.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-25 15:39:05 -08:00
Anders Kaseorg
f98d6d7037 Upgrade dependencies, including Electron 28.2.0.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-25 14:05:37 -08:00
Anders Kaseorg
da1cad9dff autoupdater: Use a separate electron-log instance.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-23 16:09:20 -08:00
Anders Kaseorg
955a2eb6c7 Use process-specific electron-log modules.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-23 16:09:20 -08:00
Anders Kaseorg
1cf822a2b5 Use process-specific @sentry/electron modules.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-23 16:09:20 -08:00
Anders Kaseorg
b9baf140eb release: New release v5.10.4.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-08 17:12:08 -08:00
Anders Kaseorg
727c2335f6 electron-bridge: Fix unicorn/prefer-node-protocol.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-08 17:10:37 -08:00
Anders Kaseorg
e8173919f8 Upgrade dependencies, including Electron 28.1.1.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-08 17:10:37 -08:00
Anders Kaseorg
cf2f4fe9c9 Avoid deprecated ipcRenderer.sendTo.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2024-01-08 16:02:14 -08:00
Anders Kaseorg
47cdd5fa8b release: New release v5.10.3.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-29 23:38:26 -07:00
Anders Kaseorg
90e76fab6e Upgrade dependencies, including Electron 25.8.4.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-29 23:38:22 -07:00
Anders Kaseorg
193adb1901 Fix gatemaker TypeError with Electron 25.
This had been breaking our download notifications.  Fixes #1333.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-29 23:25:32 -07:00
Anders Kaseorg
b520e12492 release: New release v5.10.2.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-14 10:31:05 -07:00
Anders Kaseorg
ae642bc7ba Downgrade Electron from 26.2.1 to 25.8.1 to avoid renderer crash.
https://github.com/electron/electron/issues/39775

Fixes #1327.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-14 10:30:50 -07:00
Anders Kaseorg
e90f3732c5 release: New release v5.10.1.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-13 23:22:25 -07:00
Anders Kaseorg
6b31a8a0c4 workflows: Update actions/checkout to v4.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-13 23:22:25 -07:00
Anders Kaseorg
f8758fa303 Use electron fetch API.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-13 23:22:25 -07:00
Anders Kaseorg
d2de965106 translations: Update translations from Transifex.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-13 23:19:31 -07:00
Anders Kaseorg
a32119b55d Upgrade dependencies, including Electron 26.2.1.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-13 23:19:31 -07:00
Anders Kaseorg
58049a91c4 Upgrade xo and prettier.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-13 22:47:15 -07:00
Anders Kaseorg
9810d69c3b renderer: Compensate for Chrome’s removal of overflow: overlay.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-13 22:47:15 -07:00
Anders Kaseorg
d2f949d683 Use Electron Event type.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-13 19:15:08 -07:00
Anders Kaseorg
a8c283a50b renderer: Remove unused reloadView argument.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-09-13 19:15:08 -07:00
nooblag
dab29d4720 renderer: Improve GIF loading spinner with new SVG. 2023-09-13 19:15:08 -07:00
Anders Kaseorg
7fba8cfae9 release: New release v5.10.0.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 16:15:08 -07:00
Anders Kaseorg
32301656cc Upgrade dependencies, including Electron 24.2.0.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 16:15:04 -07:00
Anders Kaseorg
0e16283a37 stylelint: Fix declaration-block-no-redundant-longhand-properties.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 16:15:04 -07:00
Anders Kaseorg
d86482a804 stylelint: Fix media-feature-range-notation.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 16:15:04 -07:00
Anders Kaseorg
3af350e4dc translations: Update translations from Transifex.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 16:14:26 -07:00
Anders Kaseorg
39fc2053c5 translations: Update en.json.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 16:10:46 -07:00
Anders Kaseorg
044f1fd0f9 preference: Fix server icon display in connected organizations list.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 15:30:51 -07:00
Anders Kaseorg
10fb0a82f9 preload: Drop compatibility code for Zulip Server < 4.0.
The server was updated in bfd9999cf874e506592fda254dfe0fe06b5b2738
(4.0-rc1~2192) to expose a proper API for this functionality, so we
don’t need to trigger fake click events to access it.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:41:25 -07:00
Anders Kaseorg
123bd5b2c0 preload: Drop compatibility injected JS for Zulip Server < 3.0.
The server was updated in a6fee2f18ef9d2ef6ac248e9ed82d580daff1a07
(3.0-dev~1674) and e701f208619b8b9b28a85f84ee16cf8d8df82b72
(3.0-dev~1667) to avoid relying on this wrapper.  We no longer support
servers older than 3.0, so we can delete it.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:39:41 -07:00
Anders Kaseorg
ad771c3da8 Display a banner for unsupported Zulip Server versions.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:37:32 -07:00
Anders Kaseorg
4c58bc3aa3 webview: Add a wrapper pane around the real <webview>.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:35:14 -07:00
Anders Kaseorg
9a8680d209 webview: Use private methods.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:35:14 -07:00
Anders Kaseorg
1569890f4d webview: Use private members.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:35:14 -07:00
Anders Kaseorg
2ed400c23c webview: Add destroy method.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:35:14 -07:00
Anders Kaseorg
70621431dc translations: Update translations from Transifex.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:32:11 -07:00
Anders Kaseorg
55b7e09796 tx: Migrate configuration to current Transifex CLI.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:28:06 -07:00
Anders Kaseorg
de2829a968 translations: Update en.json.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:23:21 -07:00
Anders Kaseorg
296de41779 translation-util: Expose the full functionality of __.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:23:21 -07:00
Anders Kaseorg
8b9ebeee25 Fix more typos.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-05 14:23:21 -07:00
Anders Kaseorg
76e81ca337 Fix updating of server names and icons at startup.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-04 15:12:18 -07:00
Anders Kaseorg
2e7a9bb4ed server-tab: Encapsulate setName and setIcon.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-05-04 15:12:18 -07:00
Anders Kaseorg
77638f6287 Fix handling of server icon updates and errors.
Fixes #1283.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-04-21 15:37:28 -07:00
Anders Kaseorg
6e8fe36876 Fix typos.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-04-19 13:50:40 -07:00
Anders Kaseorg
2eea4a32a5 preference: Fix CSS in Vite dev mode.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-04-18 14:21:06 -07:00
Anders Kaseorg
677dfe425c xo: Remove redundant exclusion of unicorn/prefer-json-parse-buffer.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-04-18 14:03:45 -07:00
Anders Kaseorg
1da3ec545a Don’t show visual notifications when they’re turned off.
Fixes #1299.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-04-18 13:13:12 -07:00
Anders Kaseorg
3cb6ea4694 Handle exceptions when reading server icons.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-04-18 12:49:09 -07:00
Anders Kaseorg
0cb7297017 preference: Fix spellchecker languages dropdown positioning.
Apparently the Tagify defaults don’t work inside a shadow root.

Fixes #1286.  Closes #1290.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-04-04 15:24:22 -07:00
Anders Kaseorg
b8d7003446 Use Zod 3 style for importing Zod.
Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-03-04 00:23:00 -08:00
127 changed files with 9210 additions and 6102 deletions

View File

@@ -10,6 +10,6 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- run: npm ci
- run: npm test

View File

@@ -1,5 +1,5 @@
{
"extends": ["stylelint-config-standard", "stylelint-config-prettier"],
"extends": ["stylelint-config-standard"],
"rules": {
"color-named": "never",
"color-no-hex": true,

View File

@@ -1,7 +1,7 @@
[main]
host = https://www.transifex.com
[zulip.desktopjson]
[o:zulip:p:zulip:r:desktopjson]
file_filter = public/translations/<lang>.json
minimum_perc = 0
source_file = public/translations/en.json

View File

@@ -10,7 +10,7 @@ Zulip-Desktop app is built on top of [Electron](http://electron.atom.io/). If yo
## Community
- The whole Zulip documentation, such as setting up a development environment, setting up with the Zulip webapp project, and testing, can be read [here](https://zulip.readthedocs.io).
- The whole Zulip documentation, such as setting up a development environment, setting up with the Zulip web app project, and testing, can be read [here](https://zulip.readthedocs.io).
- If you have any questions regarding zulip-desktop, open an [issue](https://github.com/zulip/zulip-desktop/issues/new/) or ask it on [chat.zulip.org](https://chat.zulip.org/#narrow/stream/16-desktop).

View File

@@ -24,9 +24,9 @@ Please see the [installation guide](https://zulip.com/help/desktop-app-install-g
# Reporting issues
This desktop client shares most of its code with the Zulip webapp.
This desktop client shares most of its code with the Zulip web app.
Issues in an individual organization's Zulip window should be reported
in the [Zulip server and webapp
in the [Zulip server and web app
project](https://github.com/zulip/zulip/issues/new). Other
issues in the desktop app and its settings should be reported [in this
project](https://github.com/zulip/zulip-desktop/issues/new).

View File

@@ -1,4 +1,4 @@
import * as z from "zod";
import {z} from "zod";
export const dndSettingsSchemata = {
showNotification: z.boolean(),

View File

@@ -1,10 +1,10 @@
import fs from "node:fs";
import path from "node:path";
import * as Sentry from "@sentry/electron";
import * as Sentry from "@sentry/core";
import {JsonDB} from "node-json-db";
import {DataError} from "node-json-db/dist/lib/Errors";
import type * as z from "zod";
import type {z} from "zod";
import {app, dialog} from "zulip:remote";
import {configSchemata} from "./config-schemata.js";
@@ -19,23 +19,23 @@ const logger = new Logger({
file: "config-util.log",
});
let db: JsonDB;
let database: JsonDB;
reloadDb();
reloadDatabase();
export function getConfigItem<Key extends keyof Config>(
key: Key,
defaultValue: Config[Key],
): z.output<(typeof configSchemata)[Key]> {
try {
db.reload();
database.reload();
} catch (error: unknown) {
logger.error("Error while reloading settings.json: ");
logger.error(error);
}
try {
return configSchemata[key].parse(db.getObject<unknown>(`/${key}`));
return configSchemata[key].parse(database.getObject<unknown>(`/${key}`));
} catch (error: unknown) {
if (!(error instanceof DataError)) throw error;
setConfigItem(key, defaultValue);
@@ -46,13 +46,13 @@ export function getConfigItem<Key extends keyof Config>(
// This function returns whether a key exists in the configuration file (settings.json)
export function isConfigItemExists(key: string): boolean {
try {
db.reload();
database.reload();
} catch (error: unknown) {
logger.error("Error while reloading settings.json: ");
logger.error(error);
}
return db.exists(`/${key}`);
return database.exists(`/${key}`);
}
export function setConfigItem<Key extends keyof Config>(
@@ -66,16 +66,16 @@ export function setConfigItem<Key extends keyof Config>(
}
configSchemata[key].parse(value);
db.push(`/${key}`, value, true);
db.save();
database.push(`/${key}`, value, true);
database.save();
}
export function removeConfigItem(key: string): void {
db.delete(`/${key}`);
db.save();
database.delete(`/${key}`);
database.save();
}
function reloadDb(): void {
function reloadDatabase(): void {
const settingsJsonPath = path.join(
app.getPath("userData"),
"/config/settings.json",
@@ -96,5 +96,5 @@ function reloadDb(): void {
}
}
db = new JsonDB(settingsJsonPath, true, true);
database = new JsonDB(settingsJsonPath, true, true);
}

View File

@@ -4,30 +4,30 @@ import {app} from "zulip:remote";
let setupCompleted = false;
const zulipDir = app.getPath("userData");
const logDir = `${zulipDir}/Logs/`;
const configDir = `${zulipDir}/config/`;
const zulipDirectory = app.getPath("userData");
const logDirectory = `${zulipDirectory}/Logs/`;
const configDirectory = `${zulipDirectory}/config/`;
export const initSetUp = (): void => {
// If it is the first time the app is running
// create zulip dir in userData folder to
// avoid errors
if (!setupCompleted) {
if (!fs.existsSync(zulipDir)) {
fs.mkdirSync(zulipDir);
if (!fs.existsSync(zulipDirectory)) {
fs.mkdirSync(zulipDirectory);
}
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir);
if (!fs.existsSync(logDirectory)) {
fs.mkdirSync(logDirectory);
}
// Migrate config files from app data folder to config folder inside app
// data folder. This will be done once when a user updates to the new version.
if (!fs.existsSync(configDir)) {
fs.mkdirSync(configDir);
const domainJson = `${zulipDir}/domain.json`;
const settingsJson = `${zulipDir}/settings.json`;
const updatesJson = `${zulipDir}/updates.json`;
const windowStateJson = `${zulipDir}/window-state.json`;
if (!fs.existsSync(configDirectory)) {
fs.mkdirSync(configDirectory);
const domainJson = `${zulipDirectory}/domain.json`;
const settingsJson = `${zulipDirectory}/settings.json`;
const updatesJson = `${zulipDirectory}/updates.json`;
const windowStateJson = `${zulipDirectory}/window-state.json`;
const configData = [
{
path: domainJson,
@@ -44,7 +44,7 @@ export const initSetUp = (): void => {
];
for (const data of configData) {
if (fs.existsSync(data.path)) {
fs.copyFileSync(data.path, configDir + data.fileName);
fs.copyFileSync(data.path, configDirectory + data.fileName);
fs.unlinkSync(data.path);
}
}

View File

@@ -1,6 +1,6 @@
import process from "node:process";
import type * as z from "zod";
import type {z} from "zod";
import type {dndSettingsSchemata} from "./config-schemata.js";
import * as ConfigUtil from "./config-util.js";

View File

@@ -2,7 +2,7 @@ import fs from "node:fs";
import path from "node:path";
import process from "node:process";
import * as z from "zod";
import {z} from "zod";
import {enterpriseConfigSchemata} from "./config-schemata.js";
import Logger from "./logger-util.js";
@@ -20,9 +20,9 @@ const logger = new Logger({
let enterpriseSettings: Partial<EnterpriseConfig>;
let configFile: boolean;
reloadDb();
reloadDatabase();
function reloadDb(): void {
function reloadDatabase(): void {
let enterpriseFile = "/etc/zulip-desktop-config/global_config.json";
if (process.platform === "win32") {
enterpriseFile =
@@ -56,7 +56,7 @@ export function getConfigItem<Key extends keyof EnterpriseConfig>(
key: Key,
defaultValue: EnterpriseConfig[Key],
): EnterpriseConfig[Key] {
reloadDb();
reloadDatabase();
if (!configFile) {
return defaultValue;
}
@@ -66,7 +66,7 @@ export function getConfigItem<Key extends keyof EnterpriseConfig>(
}
export function configItemExists(key: keyof EnterpriseConfig): boolean {
reloadDb();
reloadDatabase();
if (!configFile) {
return false;
}

View File

@@ -11,12 +11,12 @@ export async function openBrowser(url: URL): Promise<void> {
} else {
// For security, indirect links to non-whitelisted protocols
// through a real web browser via a local HTML file.
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "zulip-redirect-"));
const file = path.join(dir, "redirect.html");
const directory = fs.mkdtempSync(path.join(os.tmpdir(), "zulip-redirect-"));
const file = path.join(directory, "redirect.html");
fs.writeFileSync(
file,
html`
<!DOCTYPE html>
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
@@ -37,7 +37,7 @@ export async function openBrowser(url: URL): Promise<void> {
await shell.openPath(file);
setTimeout(() => {
fs.unlinkSync(file);
fs.rmdirSync(dir);
fs.rmdirSync(directory);
}, 15_000);
}
}

View File

@@ -13,7 +13,7 @@ type LoggerOptions = {
initSetUp();
const logDir = `${app.getPath("userData")}/Logs`;
const logDirectory = `${app.getPath("userData")}/Logs`;
type Level = "log" | "debug" | "info" | "warn" | "error";
@@ -23,7 +23,7 @@ export default class Logger {
constructor(options: LoggerOptions = {}) {
let {file = "console.log"} = options;
file = `${logDir}/${file}`;
file = `${logDirectory}/${file}`;
// Trim log according to type of process
if (process.type === "renderer") {
@@ -38,31 +38,31 @@ export default class Logger {
this.nodeConsole = nodeConsole;
}
_log(type: Level, ...args: unknown[]): void {
args.unshift(this.getTimestamp() + " |\t");
args.unshift(type.toUpperCase() + " |");
this.nodeConsole[type](...args);
console[type](...args);
_log(type: Level, ...arguments_: unknown[]): void {
arguments_.unshift(this.getTimestamp() + " |\t");
arguments_.unshift(type.toUpperCase() + " |");
this.nodeConsole[type](...arguments_);
console[type](...arguments_);
}
log(...args: unknown[]): void {
this._log("log", ...args);
log(...arguments_: unknown[]): void {
this._log("log", ...arguments_);
}
debug(...args: unknown[]): void {
this._log("debug", ...args);
debug(...arguments_: unknown[]): void {
this._log("debug", ...arguments_);
}
info(...args: unknown[]): void {
this._log("info", ...args);
info(...arguments_: unknown[]): void {
this._log("info", ...arguments_);
}
warn(...args: unknown[]): void {
this._log("warn", ...args);
warn(...arguments_: unknown[]): void {
this._log("warn", ...arguments_);
}
error(...args: unknown[]): void {
this._log("error", ...args);
error(...arguments_: unknown[]): void {
this._log("error", ...arguments_);
}
getTimestamp(): string {

View File

@@ -11,9 +11,6 @@ i18n.configure({
});
/* Fetches the current appLocale from settings.json */
const appLocale = ConfigUtil.getConfigItem("appLanguage", "en");
i18n.setLocale(ConfigUtil.getConfigItem("appLanguage", "en") ?? "en");
/* If no locale present in the json, en is set default */
export function __(phrase: string): string {
return i18n.__({phrase, locale: appLocale ?? "en"});
}
export {__} from "i18n";

View File

@@ -1,5 +1,5 @@
import type {DndSettings} from "./dnd-util.js";
import type {MenuProps, ServerConf} from "./types.js";
import type {MenuProperties, ServerConfig} from "./types.js";
export type MainMessage = {
"clear-app-settings": () => void;
@@ -7,7 +7,6 @@ export type MainMessage = {
"fetch-user-agent": () => string;
"focus-app": () => void;
"focus-this-webview": () => void;
"get-injected-js": () => string;
"new-clipboard-key": () => {key: Uint8Array; sig: Uint8Array};
"permission-callback": (permissionCallbackId: number, grant: boolean) => void;
"quit-app": () => void;
@@ -22,15 +21,15 @@ export type MainMessage = {
toggleAutoLauncher: (AutoLaunchValue: boolean) => void;
"unread-count": (unreadCount: number) => void;
"update-badge": (messageCount: number) => void;
"update-menu": (props: MenuProps) => void;
"update-menu": (properties: MenuProperties) => void;
"update-taskbar-icon": (data: string, text: string) => void;
};
export type MainCall = {
"get-server-settings": (domain: string) => ServerConf;
"get-server-settings": (domain: string) => ServerConfig;
"is-online": (url: string) => boolean;
"poll-clipboard": (key: Uint8Array, sig: Uint8Array) => string | undefined;
"save-server-icon": (iconURL: string) => string;
"save-server-icon": (iconURL: string) => string | null;
};
export type RendererMessage = {
@@ -75,9 +74,9 @@ export type RendererMessage = {
"toggle-silent": (state: boolean) => void;
"toggle-tray": (state: boolean) => void;
toggletray: () => void;
tray: (arg: number) => void;
tray: (argument: number) => void;
"update-realm-icon": (serverURL: string, iconURL: string) => void;
"update-realm-name": (serveRURL: string, realmName: string) => void;
"update-realm-name": (serverURL: string, realmName: string) => void;
"webview-reload": () => void;
zoomActualSize: () => void;
zoomIn: () => void;

View File

@@ -1,20 +1,22 @@
export type MenuProps = {
export type MenuProperties = {
tabs: TabData[];
activeTabIndex?: number;
enableMenu?: boolean;
};
export type NavItem =
export type NavigationItem =
| "General"
| "Network"
| "AddServer"
| "Organizations"
| "Shortcuts";
export type ServerConf = {
export type ServerConfig = {
url: string;
alias: string;
icon: string;
zulipVersion: string;
zulipFeatureLevel: number;
};
export type TabRole = "server" | "function";

View File

@@ -2,9 +2,12 @@ import {shell} from "electron/common";
import {app, dialog, session} from "electron/main";
import process from "node:process";
import log from "electron-log";
import type {UpdateDownloadedEvent, UpdateInfo} from "electron-updater";
import {autoUpdater} from "electron-updater";
import log from "electron-log/main";
import {
type UpdateDownloadedEvent,
type UpdateInfo,
autoUpdater,
} from "electron-updater";
import * as ConfigUtil from "../common/config-util.js";
@@ -30,10 +33,11 @@ export async function appUpdater(updateFromMenu = false): Promise<void> {
let updateAvailable = false;
// Log whats happening
log.transports.file.fileName = "updates.log";
log.transports.file.level = "info";
autoUpdater.logger = log;
// Log what's happening
const updateLogger = log.create({logId: "updates"});
updateLogger.transports.file.fileName = "updates.log";
updateLogger.transports.file.level = "info";
autoUpdater.logger = updateLogger;
// Handle auto updates for beta/pre releases
const isBetaUpdate = ConfigUtil.getConfigItem("betaUpdate", false);

View File

@@ -1,6 +1,5 @@
import {nativeImage} from "electron/common";
import type {BrowserWindow} from "electron/main";
import {app} from "electron/main";
import {type BrowserWindow, app} from "electron/main";
import process from "node:process";
import * as ConfigUtil from "../common/config-util.js";

View File

@@ -1,10 +1,11 @@
import {shell} from "electron/common";
import type {
HandlerDetails,
SaveDialogOptions,
WebContents,
import {type Event, shell} from "electron/common";
import {
type HandlerDetails,
Notification,
type SaveDialogOptions,
type WebContents,
app,
} from "electron/main";
import {Notification, app} from "electron/main";
import fs from "node:fs";
import path from "node:path";
@@ -31,7 +32,7 @@ function downloadFile({
failed(state: string): void;
}) {
contents.downloadURL(url);
contents.session.once("will-download", async (_event: Event, item) => {
contents.session.once("will-download", async (_event, item) => {
if (ConfigUtil.getConfigItem("promptDownload", false)) {
const showDialogOptions: SaveDialogOptions = {
defaultPath: path.join(downloadPath, item.getFilename()),
@@ -86,7 +87,7 @@ function downloadFile({
};
item.on("updated", updatedListener);
item.once("done", async (_event: Event, state) => {
item.once("done", async (_event, state) => {
if (state === "completed") {
await completed(item.getSavePath(), path.basename(item.getSavePath()));
} else {

View File

@@ -1,9 +1,16 @@
import {clipboard} from "electron/common";
import type {IpcMainEvent, WebContents} from "electron/main";
import {BrowserWindow, app, dialog, powerMonitor, session} from "electron/main";
import {
BrowserWindow,
type IpcMainEvent,
type WebContents,
app,
dialog,
powerMonitor,
session,
webContents,
} from "electron/main";
import {Buffer} from "node:buffer";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import process from "node:process";
@@ -13,7 +20,7 @@ import windowStateKeeper from "electron-window-state";
import * as ConfigUtil from "../common/config-util.js";
import {bundlePath, bundleUrl, publicPath} from "../common/paths.js";
import type {RendererMessage} from "../common/typed-ipc.js";
import type {MenuProps} from "../common/types.js";
import type {MenuProperties} from "../common/types.js";
import {appUpdater, shouldQuitForUpdate} from "./autoupdater.js";
import * as BadgeSettings from "./badge-settings.js";
@@ -103,7 +110,14 @@ function createMainWindow(): BrowserWindow {
event.preventDefault();
if (process.platform === "darwin") {
app.hide();
if (win.isFullScreen()) {
win.setFullScreen(false);
win.once("leave-full-screen", () => {
app.hide();
});
} else {
app.hide();
}
} else {
win.hide();
}
@@ -171,7 +185,7 @@ function createMainWindow(): BrowserWindow {
ipcMain.on(
"permission-callback",
(event: Event, permissionCallbackId: number, grant: boolean) => {
(event, permissionCallbackId: number, grant: boolean) => {
permissionCallbacks.get(permissionCallbackId)?.(grant);
permissionCallbacks.delete(permissionCallbackId);
},
@@ -182,7 +196,7 @@ function createMainWindow(): BrowserWindow {
mainWindow.show();
});
app.on("web-contents-created", (_event: Event, contents: WebContents) => {
app.on("web-contents-created", (_event, contents: WebContents) => {
contents.setWindowOpenHandler((details) => {
handleExternalLink(contents, details, page);
return {action: "deny"};
@@ -206,13 +220,6 @@ function createMainWindow(): BrowserWindow {
configureSpellChecker();
ipcMain.on("configure-spell-checker", configureSpellChecker);
ipcMain.on("get-injected-js", (event) => {
event.returnValue = fs.readFileSync(
path.join(bundlePath, "injected.js"),
"utf8",
);
});
const clipboardSigKey = crypto.randomBytes(32);
ipcMain.on("new-clipboard-key", (event) => {
@@ -299,18 +306,24 @@ function createMainWindow(): BrowserWindow {
app.on(
"certificate-error",
(
event: Event,
webContents: WebContents,
urlString: string,
error: string,
event,
webContents,
urlString,
error,
certificate,
callback,
isMainFrame,
// eslint-disable-next-line max-params
) => {
const url = new URL(urlString);
dialog.showErrorBox(
"Certificate error",
`The server presented an invalid certificate for ${url.origin}:
if (isMainFrame) {
const url = new URL(urlString);
dialog.showErrorBox(
"Certificate error",
`The server presented an invalid certificate for ${url.origin}:
${error}`,
);
);
}
},
);
@@ -369,24 +382,21 @@ ${error}`,
BadgeSettings.updateBadge(badgeCount, mainWindow);
});
ipcMain.on("toggle-menubar", (_event: IpcMainEvent, showMenubar: boolean) => {
ipcMain.on("toggle-menubar", (_event, showMenubar: boolean) => {
mainWindow.autoHideMenuBar = showMenubar;
mainWindow.setMenuBarVisibility(!showMenubar);
send(page, "toggle-autohide-menubar", showMenubar, true);
});
ipcMain.on("update-badge", (_event: IpcMainEvent, messageCount: number) => {
ipcMain.on("update-badge", (_event, messageCount: number) => {
badgeCount = messageCount;
BadgeSettings.updateBadge(badgeCount, mainWindow);
send(page, "tray", messageCount);
});
ipcMain.on(
"update-taskbar-icon",
(_event: IpcMainEvent, data: string, text: string) => {
BadgeSettings.updateTaskbarIcon(data, text, mainWindow);
},
);
ipcMain.on("update-taskbar-icon", (_event, data: string, text: string) => {
BadgeSettings.updateTaskbarIcon(data, text, mainWindow);
});
ipcMain.on(
"forward-message",
@@ -399,40 +409,52 @@ ${error}`,
},
);
ipcMain.on("update-menu", (_event: IpcMainEvent, props: MenuProps) => {
AppMenu.setMenu(props);
if (props.activeTabIndex !== undefined) {
const activeTab = props.tabs[props.activeTabIndex];
ipcMain.on(
"forward-to",
<Channel extends keyof RendererMessage>(
_event: IpcMainEvent,
webContentsId: number,
listener: Channel,
...parameters: Parameters<RendererMessage[Channel]>
) => {
const contents = webContents.fromId(webContentsId);
if (contents !== undefined) {
send(contents, listener, ...parameters);
}
},
);
ipcMain.on("update-menu", (_event, properties: MenuProperties) => {
AppMenu.setMenu(properties);
if (properties.activeTabIndex !== undefined) {
const activeTab = properties.tabs[properties.activeTabIndex];
mainWindow.setTitle(`Zulip - ${activeTab.name}`);
}
});
ipcMain.on(
"toggleAutoLauncher",
async (_event: IpcMainEvent, AutoLaunchValue: boolean) => {
await setAutoLaunch(AutoLaunchValue);
},
);
ipcMain.on("toggleAutoLauncher", async (_event, AutoLaunchValue: boolean) => {
await setAutoLaunch(AutoLaunchValue);
});
ipcMain.on(
"realm-name-changed",
(_event: IpcMainEvent, serverURL: string, realmName: string) => {
(_event, serverURL: string, realmName: string) => {
send(page, "update-realm-name", serverURL, realmName);
},
);
ipcMain.on(
"realm-icon-changed",
(_event: IpcMainEvent, serverURL: string, iconURL: string) => {
(_event, serverURL: string, iconURL: string) => {
send(page, "update-realm-icon", serverURL, iconURL);
},
);
ipcMain.on("save-last-tab", (_event: IpcMainEvent, index: number) => {
ipcMain.on("save-last-tab", (_event, index: number) => {
ConfigUtil.setConfigItem("lastActiveTab", index);
});
ipcMain.on("focus-this-webview", (event: IpcMainEvent) => {
ipcMain.on("focus-this-webview", (event) => {
send(page, "focus-webview-with-id", event.sender.id);
mainWindow.show();
});

View File

@@ -11,18 +11,18 @@ const logger = new Logger({
file: "linux-update-util.log",
});
let db: JsonDB;
let database: JsonDB;
reloadDb();
reloadDatabase();
export function getUpdateItem(
key: string,
defaultValue: true | null = null,
): true | null {
reloadDb();
reloadDatabase();
let value: unknown;
try {
value = db.getObject<unknown>(`/${key}`);
value = database.getObject<unknown>(`/${key}`);
} catch (error: unknown) {
if (!(error instanceof DataError)) throw error;
}
@@ -36,16 +36,16 @@ export function getUpdateItem(
}
export function setUpdateItem(key: string, value: true | null): void {
db.push(`/${key}`, value, true);
reloadDb();
database.push(`/${key}`, value, true);
reloadDatabase();
}
export function removeUpdateItem(key: string): void {
db.delete(`/${key}`);
reloadDb();
database.delete(`/${key}`);
reloadDatabase();
}
function reloadDb(): void {
function reloadDatabase(): void {
const linuxUpdateJsonPath = path.join(
app.getPath("userData"),
"/config/updates.json",
@@ -65,5 +65,5 @@ function reloadDb(): void {
}
}
db = new JsonDB(linuxUpdateJsonPath, true, true);
database = new JsonDB(linuxUpdateJsonPath, true, true);
}

View File

@@ -1,15 +1,12 @@
import type {Session} from "electron/main";
import {Notification, app, net} from "electron/main";
import {Notification, type Session, app} from "electron/main";
import getStream from "get-stream";
import * as semver from "semver";
import * as z from "zod";
import {z} from "zod";
import * as ConfigUtil from "../common/config-util.js";
import Logger from "../common/logger-util.js";
import * as LinuxUpdateUtil from "./linux-update-util.js";
import {fetchResponse} from "./request.js";
const logger = new Logger({
file: "linux-update-util.log",
@@ -20,13 +17,13 @@ export async function linuxUpdateNotification(session: Session): Promise<void> {
url = ConfigUtil.getConfigItem("betaUpdate", false) ? url : url + "/latest";
try {
const response = await fetchResponse(net.request({url, session}));
if (response.statusCode !== 200) {
logger.log("Linux update response status: ", response.statusCode);
const response = await session.fetch(url);
if (!response.ok) {
logger.log("Linux update response status: ", response.status);
return;
}
const data: unknown = JSON.parse(await getStream(response));
const data: unknown = await response.json();
/* eslint-disable @typescript-eslint/naming-convention */
const latestVersion = ConfigUtil.getConfigItem("betaUpdate", false)
? z.array(z.object({tag_name: z.string()})).parse(data)[0].tag_name

View File

@@ -1,6 +1,10 @@
import {shell} from "electron/common";
import type {MenuItemConstructorOptions} from "electron/main";
import {BrowserWindow, Menu, app} from "electron/main";
import {
BrowserWindow,
Menu,
type MenuItemConstructorOptions,
app,
} from "electron/main";
import process from "node:process";
import AdmZip from "adm-zip";
@@ -9,7 +13,7 @@ import * as ConfigUtil from "../common/config-util.js";
import * as DNDUtil from "../common/dnd-util.js";
import * as t from "../common/translation-util.js";
import type {RendererMessage} from "../common/typed-ipc.js";
import type {MenuProps, TabData} from "../common/types.js";
import type {MenuProperties, TabData} from "../common/types.js";
import {appUpdater} from "./autoupdater.js";
import {send} from "./typed-ipc-main.js";
@@ -66,7 +70,7 @@ function getToolsSubmenu(): MenuItemConstructorOptions[] {
click() {
const zip = new AdmZip();
const date = new Date();
const dateString = date.toLocaleDateString().replace(/\//g, "-");
const dateString = date.toLocaleDateString().replaceAll("/", "-");
// Create a zip file of all the logs and config data
zip.addLocalFolder(`${app.getPath("appData")}/${appName}/Logs`);
@@ -368,8 +372,10 @@ function getWindowSubmenu(
return initialSubmenu;
}
function getDarwinTpl(props: MenuProps): MenuItemConstructorOptions[] {
const {tabs, activeTabIndex, enableMenu = false} = props;
function getDarwinTpl(
properties: MenuProperties,
): MenuItemConstructorOptions[] {
const {tabs, activeTabIndex, enableMenu = false} = properties;
return [
{
@@ -533,8 +539,8 @@ function getDarwinTpl(props: MenuProps): MenuItemConstructorOptions[] {
];
}
function getOtherTpl(props: MenuProps): MenuItemConstructorOptions[] {
const {tabs, activeTabIndex, enableMenu = false} = props;
function getOtherTpl(properties: MenuProperties): MenuItemConstructorOptions[] {
const {tabs, activeTabIndex, enableMenu = false} = properties;
return [
{
label: t.__("File"),
@@ -683,7 +689,7 @@ function getOtherTpl(props: MenuProps): MenuItemConstructorOptions[] {
function sendAction<Channel extends keyof RendererMessage>(
channel: Channel,
...args: Parameters<RendererMessage[Channel]>
...arguments_: Parameters<RendererMessage[Channel]>
): void {
const win = BrowserWindow.getAllWindows()[0];
@@ -691,7 +697,7 @@ function sendAction<Channel extends keyof RendererMessage>(
win.restore();
}
send(win.webContents, channel, ...args);
send(win.webContents, channel, ...arguments_);
}
async function checkForUpdate(): Promise<void> {
@@ -714,9 +720,11 @@ function getPreviousServer(tabs: TabData[], activeTabIndex: number): number {
return activeTabIndex;
}
export function setMenu(props: MenuProps): void {
export function setMenu(properties: MenuProperties): void {
const tpl =
process.platform === "darwin" ? getDarwinTpl(props) : getOtherTpl(props);
process.platform === "darwin"
? getDarwinTpl(properties)
: getOtherTpl(properties);
const menu = Menu.buildFromTemplate(tpl);
Menu.setApplicationMenu(menu);
}

View File

@@ -1,43 +1,25 @@
import type {ClientRequest, IncomingMessage, Session} from "electron/main";
import {app, net} from "electron/main";
import {type Session, app} from "electron/main";
import fs from "node:fs";
import path from "node:path";
import stream from "node:stream";
import util from "node:util";
import {Readable} from "node:stream";
import {pipeline} from "node:stream/promises";
import type {ReadableStream} from "node:stream/web";
import * as Sentry from "@sentry/electron";
import getStream from "get-stream";
import * as z from "zod";
import * as Sentry from "@sentry/electron/main";
import {z} from "zod";
import Logger from "../common/logger-util.js";
import * as Messages from "../common/messages.js";
import type {ServerConf} from "../common/types.js";
export async function fetchResponse(
request: ClientRequest,
): Promise<IncomingMessage> {
return new Promise((resolve, reject) => {
request.on("response", resolve);
request.on("abort", () => {
reject(new Error("Request aborted"));
});
request.on("error", reject);
request.end();
});
}
const pipeline = util.promisify(stream.pipeline);
import type {ServerConfig} from "../common/types.js";
/* Request: domain-util */
const defaultIconUrl = "../renderer/img/icon.png";
const logger = new Logger({
file: "domain-util.log",
});
const generateFilePath = (url: string): string => {
const dir = `${app.getPath("userData")}/server-icons`;
const directory = `${app.getPath("userData")}/server-icons`;
const extension = path.extname(url).split("?")[0];
let hash = 5381;
@@ -49,35 +31,38 @@ const generateFilePath = (url: string): string => {
}
// Create 'server-icons' directory if not existed
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
if (!fs.existsSync(directory)) {
fs.mkdirSync(directory);
}
// eslint-disable-next-line no-bitwise
return `${dir}/${hash >>> 0}${extension}`;
return `${directory}/${hash >>> 0}${extension}`;
};
export const _getServerSettings = async (
domain: string,
session: Session,
): Promise<ServerConf> => {
const response = await fetchResponse(
net.request({
url: domain + "/api/v1/server_settings",
session,
}),
);
if (response.statusCode !== 200) {
): Promise<ServerConfig> => {
const response = await session.fetch(domain + "/api/v1/server_settings");
if (!response.ok) {
throw new Error(Messages.invalidZulipServerError(domain));
}
const data: unknown = JSON.parse(await getStream(response));
const data: unknown = await response.json();
/* eslint-disable @typescript-eslint/naming-convention */
const {realm_name, realm_uri, realm_icon} = z
const {
realm_name,
realm_uri,
realm_icon,
zulip_version,
zulip_feature_level,
} = z
.object({
realm_name: z.string(),
realm_uri: z.string(),
realm_uri: z.string().url(),
realm_icon: z.string(),
zulip_version: z.string().default("unknown"),
zulip_feature_level: z.number().default(0),
})
.parse(data);
/* eslint-enable @typescript-eslint/naming-convention */
@@ -88,28 +73,33 @@ export const _getServerSettings = async (
icon: realm_icon.startsWith("/") ? realm_uri + realm_icon : realm_icon,
url: realm_uri,
alias: realm_name,
zulipVersion: zulip_version,
zulipFeatureLevel: zulip_feature_level,
};
};
export const _saveServerIcon = async (
url: string,
session: Session,
): Promise<string> => {
): Promise<string | null> => {
try {
const response = await fetchResponse(net.request({url, session}));
if (response.statusCode !== 200) {
const response = await session.fetch(url);
if (!response.ok) {
logger.log("Could not get server icon.");
return defaultIconUrl;
return null;
}
const filePath = generateFilePath(url);
await pipeline(response, fs.createWriteStream(filePath));
await pipeline(
Readable.fromWeb(response.body as ReadableStream<Uint8Array>),
fs.createWriteStream(filePath),
);
return filePath;
} catch (error: unknown) {
logger.log("Could not get server icon.");
logger.log(error);
Sentry.captureException(error);
return defaultIconUrl;
return null;
}
};
@@ -120,16 +110,10 @@ export const _isOnline = async (
session: Session,
): Promise<boolean> => {
try {
const response = await fetchResponse(
net.request({
method: "HEAD",
url: `${url}/api/v1/server_settings`,
session,
}),
);
const isValidResponse =
response.statusCode >= 200 && response.statusCode < 400;
return isValidResponse;
const response = await session.fetch(`${url}/api/v1/server_settings`, {
method: "HEAD",
});
return response.ok;
} catch (error: unknown) {
logger.log(error);
return false;

View File

@@ -1,6 +1,6 @@
import {app} from "electron/main";
import * as Sentry from "@sentry/electron/main"; // eslint-disable-line n/file-extension-in-import
import * as Sentry from "@sentry/electron/main";
import {getConfigItem} from "../common/config-util.js";

View File

@@ -1,9 +1,7 @@
import type {
IpcMainEvent,
IpcMainInvokeEvent,
WebContents,
} from "electron/main";
import {
type IpcMainEvent,
type IpcMainInvokeEvent,
type WebContents,
ipcMain as untypedIpcMain, // eslint-disable-line no-restricted-imports
} from "electron/main";
@@ -14,14 +12,20 @@ import type {
} from "../common/typed-ipc.js";
type MainListener<Channel extends keyof MainMessage> =
MainMessage[Channel] extends (...args: infer Args) => infer Return
? (event: IpcMainEvent & {returnValue: Return}, ...args: Args) => void
MainMessage[Channel] extends (...arguments_: infer Arguments) => infer Return
? (
event: IpcMainEvent & {returnValue: Return},
...arguments_: Arguments
) => void
: never;
type MainHandler<Channel extends keyof MainCall> = MainCall[Channel] extends (
...args: infer Args
...arguments_: infer Arguments
) => infer Return
? (event: IpcMainInvokeEvent, ...args: Args) => Return | Promise<Return>
? (
event: IpcMainInvokeEvent,
...arguments_: Arguments
) => Return | Promise<Return>
: never;
export const ipcMain: {
@@ -30,7 +34,16 @@ export const ipcMain: {
listener: <Channel extends keyof RendererMessage>(
event: IpcMainEvent,
channel: Channel,
...args: Parameters<RendererMessage[Channel]>
...arguments_: Parameters<RendererMessage[Channel]>
) => void,
): void;
on(
channel: "forward-to",
listener: <Channel extends keyof RendererMessage>(
event: IpcMainEvent,
webContentsId: number,
channel: Channel,
...arguments_: Parameters<RendererMessage[Channel]>
) => void,
): void;
on<Channel extends keyof MainMessage>(
@@ -60,16 +73,16 @@ export const ipcMain: {
export function send<Channel extends keyof RendererMessage>(
contents: WebContents,
channel: Channel,
...args: Parameters<RendererMessage[Channel]>
...arguments_: Parameters<RendererMessage[Channel]>
): void {
contents.send(channel, ...args);
contents.send(channel, ...arguments_);
}
export function sendToFrame<Channel extends keyof RendererMessage>(
contents: WebContents,
frameId: number | [number, number],
channel: Channel,
...args: Parameters<RendererMessage[Channel]>
...arguments_: Parameters<RendererMessage[Channel]>
): void {
contents.sendToFrame(frameId, channel, ...args);
contents.sendToFrame(frameId, channel, ...arguments_);
}

View File

@@ -1,4 +1,4 @@
<!DOCTYPE html>
<!doctype html>
<meta charset="UTF-8" />
<link rel="stylesheet" href="css/about.css" />

View File

@@ -2,7 +2,9 @@
font-family: "Material Icons";
font-style: normal;
font-weight: 400;
src: local("Material Icons"), local("MaterialIcons-Regular"),
src:
local("Material Icons"),
local("MaterialIcons-Regular"),
url("../fonts/MaterialIcons-Regular.ttf") format("truetype");
}

View File

@@ -44,6 +44,7 @@ body {
#view-controls-container {
height: calc(100% - 208px);
scrollbar-gutter: stable both-edges;
overflow-y: hidden;
}
@@ -52,16 +53,15 @@ body {
}
#view-controls-container::-webkit-scrollbar-track {
box-shadow: inset 0 0 6px rgb(0 0 0 / 30%);
background-color: rgb(0 0 0 / 30%);
}
#view-controls-container::-webkit-scrollbar-thumb {
background-color: rgb(169 169 169 / 100%);
outline: 1px solid rgb(169 169 169 / 100%);
}
#view-controls-container:hover {
overflow-y: overlay;
overflow-y: scroll;
}
/*******************
@@ -290,7 +290,9 @@ body {
content: "";
position: absolute;
z-index: 1;
background: rgb(255 255 255 / 100%) url("../img/ic_loading.gif") no-repeat;
/* Spinner is released under loading.io free License: https://loading.io/license/#free-license */
background: rgb(255 255 255 / 100%) url("../img/ic_loading.svg") no-repeat;
background-size: 60px 60px;
background-position: center;
width: 100%;
@@ -303,7 +305,7 @@ body {
visibility: hidden;
}
webview,
.webview-pane,
.functional-view {
position: absolute;
width: 100%;
@@ -312,7 +314,16 @@ webview,
visibility: hidden;
}
webview.active,
.webview-pane {
display: flex;
flex-direction: column;
}
.webview-pane > webview {
flex: 1;
}
.webview-pane.active,
.functional-view.active {
z-index: 1;
visibility: visible;
@@ -322,6 +333,30 @@ webview.focus {
outline: 0 solid transparent;
}
.webview-unsupported {
background: rgb(254 243 199);
border: 1px solid rgb(253 230 138);
color: rgb(69 26 3);
font-family: system-ui;
font-size: 14px;
display: flex;
}
.webview-unsupported[hidden] {
display: none;
}
.webview-unsupported-message {
padding: 0.3em;
flex: 1;
text-align: center;
}
.webview-unsupported-dismiss {
padding: 0.3em;
cursor: pointer;
}
/* Tooltip styling */
#loading-tooltip,

View File

@@ -1,3 +1,5 @@
@import url("@yaireo/tagify/dist/tagify.css");
:host {
contain: strict;
display: flow-root;
@@ -10,6 +12,11 @@
letter-spacing: -0.08px;
line-height: 18px;
color: rgb(139 142 143 / 100%);
/* Copied from https://github.com/yairEO/tagify/blob/v4.17.7/src/tagify.scss#L4-L8 */
--tagify-dd-color-primary: rgb(53 149 246);
--tagify-dd-bg-color: rgb(255 255 255);
--tagify-dd-item-pad: 0.3em 0.5em;
}
kbd {
@@ -300,7 +307,9 @@ img.server-info-icon {
}
.settings-card:hover {
box-shadow: 0 2px 5px 0 rgb(0 0 0 / 16%), 0 2px 0 0 rgb(0 0 0 / 12%);
box-shadow:
0 2px 5px 0 rgb(0 0 0 / 16%),
0 2px 0 0 rgb(0 0 0 / 12%);
}
.hidden {
@@ -475,10 +484,7 @@ input.toggle-round + label::after {
input.toggle-round + label::before {
background-color: rgb(241 241 241 / 100%);
border-radius: 25px;
top: 0;
right: 0;
left: 0;
bottom: 0;
inset: 0;
}
input.toggle-round + label::after {
@@ -490,10 +496,7 @@ input.toggle-round + label::after {
input.toggle-round:checked + label::before {
background-color: rgb(78 191 172 / 100%);
top: 0;
right: 0;
left: 0;
bottom: 0;
inset: 0;
}
input.toggle-round:checked + label::after {
@@ -651,7 +654,7 @@ i.open-network-button {
}
/* responsive grid */
@media (min-width: 500px) and (max-width: 720px) {
@media (width >= 500px) and (width <= 720px) {
#new-server-container {
padding-left: 0;
width: 60vw;
@@ -663,7 +666,7 @@ i.open-network-button {
}
}
@media (max-width: 500px) {
@media (width <= 500px) {
#new-server-container {
padding-left: 0;
width: 54%;
@@ -674,7 +677,7 @@ i.open-network-button {
}
}
@media (max-width: 650px) {
@media (width <= 650px) {
.selected-css-path,
.download-folder-path {
margin-right: 15px;
@@ -689,7 +692,7 @@ i.open-network-button {
}
}
@media (max-width: 720px) {
@media (width <= 720px) {
.modal-container {
width: 60vw;
padding: 40px;
@@ -712,7 +715,7 @@ i.open-network-button {
}
}
@media (max-width: 600px) {
@media (width <= 600px) {
.divider {
margin-left: 4%;
}
@@ -724,7 +727,7 @@ i.open-network-button {
}
}
@media (max-width: 900px) {
@media (width <= 900px) {
.settings-card {
flex-direction: column;
align-items: center;
@@ -760,3 +763,9 @@ i.open-network-button {
top: 0;
bottom: 0;
}
.settings-tagify-dropdown {
position: relative;
z-index: 9999;
height: 0;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin: auto; background: rgba(0, 0, 0, 0) none repeat scroll 0% 0%; display: block; shape-rendering: auto; animation-play-state: running; animation-delay: 0s;" width="150px" height="150px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
<circle cx="50" cy="50" fill="none" stroke="#759ed4" stroke-width="10" r="42" stroke-dasharray="197.92033717615698 67.97344572538566" style="animation-play-state: running; animation-delay: 0s;">
<animateTransform attributeName="transform" type="rotate" repeatCount="indefinite" dur="1s" values="0 50 50;360 50 50" keyTimes="0;1" style="animation-play-state: running; animation-delay: 0s;"></animateTransform>
</circle>
<!-- Created with loading.io (https://loading.io/spinner/rolling/-bar-circle-curve-round-rotate) -->
<!-- "The Rolling spinner is released under loading.io free License." (https://loading.io/license/#free-license) -->
</svg>

After

Width:  |  Height:  |  Size: 1018 B

View File

@@ -20,7 +20,7 @@ export type ClipboardDecrypter = {
pasted: Promise<string>;
};
export class ClipboardDecrypterImpl implements ClipboardDecrypter {
export class ClipboardDecrypterImplementation implements ClipboardDecrypter {
version: number;
key: Uint8Array;
pasted: Promise<string>;

View File

@@ -1,4 +1,4 @@
import {clipboard} from "electron/common";
import {type Event, clipboard} from "electron/common";
import type {WebContents} from "electron/main";
import type {
ContextMenuParams,
@@ -13,11 +13,11 @@ import * as t from "../../../common/translation-util.js";
export const contextMenu = (
webContents: WebContents,
event: Event,
props: ContextMenuParams,
properties: ContextMenuParams,
) => {
const isText = props.selectionText !== "";
const isLink = props.linkURL !== "";
const linkUrl = isLink ? new URL(props.linkURL) : undefined;
const isText = properties.selectionText !== "";
const isLink = properties.linkURL !== "";
const linkUrl = isLink ? new URL(properties.linkURL) : undefined;
const makeSuggestion = (suggestion: string) => ({
label: suggestion,
@@ -30,19 +30,21 @@ export const contextMenu = (
let menuTemplate: MenuItemConstructorOptions[] = [
{
label: t.__("Add to Dictionary"),
visible: props.isEditable && isText && props.misspelledWord.length > 0,
visible:
properties.isEditable && isText && properties.misspelledWord.length > 0,
click(_item) {
webContents.session.addWordToSpellCheckerDictionary(
props.misspelledWord,
properties.misspelledWord,
);
},
},
{
type: "separator",
visible: props.isEditable && isText && props.misspelledWord.length > 0,
visible:
properties.isEditable && isText && properties.misspelledWord.length > 0,
},
{
label: `${t.__("Look Up")} "${props.selectionText}"`,
label: `${t.__("Look Up")} "${properties.selectionText}"`,
visible: process.platform === "darwin" && isText,
click(_item) {
webContents.showDefinitionForSelection();
@@ -55,7 +57,7 @@ export const contextMenu = (
{
label: t.__("Cut"),
visible: isText,
enabled: props.isEditable,
enabled: properties.isEditable,
accelerator: "CommandOrControl+X",
click(_item) {
webContents.cut();
@@ -64,7 +66,7 @@ export const contextMenu = (
{
label: t.__("Copy"),
accelerator: "CommandOrControl+C",
enabled: props.editFlags.canCopy,
enabled: properties.editFlags.canCopy,
click(_item) {
webContents.copy();
},
@@ -72,7 +74,7 @@ export const contextMenu = (
{
label: t.__("Paste"), // Bug: Paste replaces text
accelerator: "CommandOrControl+V",
enabled: props.isEditable,
enabled: properties.isEditable,
click() {
webContents.paste();
},
@@ -88,32 +90,34 @@ export const contextMenu = (
visible: isLink,
click(_item) {
clipboard.write({
bookmark: props.linkText,
bookmark: properties.linkText,
text:
linkUrl?.protocol === "mailto:" ? linkUrl.pathname : props.linkURL,
linkUrl?.protocol === "mailto:"
? linkUrl.pathname
: properties.linkURL,
});
},
},
{
label: t.__("Copy Image"),
visible: props.mediaType === "image",
visible: properties.mediaType === "image",
click(_item) {
webContents.copyImageAt(props.x, props.y);
webContents.copyImageAt(properties.x, properties.y);
},
},
{
label: t.__("Copy Image URL"),
visible: props.mediaType === "image",
visible: properties.mediaType === "image",
click(_item) {
clipboard.write({
bookmark: props.srcURL,
text: props.srcURL,
bookmark: properties.srcURL,
text: properties.srcURL,
});
},
},
{
type: "separator",
visible: isLink || props.mediaType === "image",
visible: isLink || properties.mediaType === "image",
},
{
label: t.__("Services"),
@@ -122,10 +126,10 @@ export const contextMenu = (
},
];
if (props.misspelledWord) {
if (props.dictionarySuggestions.length > 0) {
if (properties.misspelledWord) {
if (properties.dictionarySuggestions.length > 0) {
const suggestions: MenuItemConstructorOptions[] =
props.dictionarySuggestions.map((suggestion: string) =>
properties.dictionarySuggestions.map((suggestion: string) =>
makeSuggestion(suggestion),
);
menuTemplate = [...suggestions, ...menuTemplate];
@@ -137,7 +141,7 @@ export const contextMenu = (
}
}
// Hide the invisible separators on Linux and Windows
// Electron has a bug which ignores visible: false parameter for separator menuitems. So we remove them here.
// Electron has a bug which ignores visible: false parameter for separator menu items. So we remove them here.
// https://github.com/electron/electron/issues/5869
// https://github.com/electron/electron/issues/6906

View File

@@ -1,26 +1,24 @@
import type {Html} from "../../../common/html.js";
import {html} from "../../../common/html.js";
import {type Html, html} from "../../../common/html.js";
import {generateNodeFromHtml} from "./base.js";
import type {TabProps} from "./tab.js";
import Tab from "./tab.js";
import Tab, {type TabProperties} from "./tab.js";
export type FunctionalTabProps = {
export type FunctionalTabProperties = {
$view: Element;
} & TabProps;
} & TabProperties;
export default class FunctionalTab extends Tab {
$view: Element;
$el: Element;
$closeButton?: Element;
constructor({$view, ...props}: FunctionalTabProps) {
super(props);
constructor({$view, ...properties}: FunctionalTabProperties) {
super(properties);
this.$view = $view;
this.$el = generateNodeFromHtml(this.templateHtml());
if (this.props.name !== "Settings") {
this.props.$root.append(this.$el);
if (this.properties.name !== "Settings") {
this.properties.$root.append(this.$el);
this.$closeButton = this.$el.querySelector(".server-tab-badge")!;
this.registerListeners();
}
@@ -43,12 +41,12 @@ export default class FunctionalTab extends Tab {
templateHtml(): Html {
return html`
<div class="tab functional-tab" data-tab-id="${this.props.tabIndex}">
<div class="tab functional-tab" data-tab-id="${this.properties.tabIndex}">
<div class="server-tab-badge close-button">
<i class="material-icons">close</i>
</div>
<div class="server-tab">
<i class="material-icons">${this.props.materialIcon}</i>
<i class="material-icons">${this.properties.materialIcon}</i>
</div>
</div>
`;
@@ -65,8 +63,8 @@ export default class FunctionalTab extends Tab {
this.$closeButton?.classList.remove("active");
});
this.$closeButton?.addEventListener("click", (event: Event) => {
this.props.onDestroy?.();
this.$closeButton?.addEventListener("click", (event) => {
this.properties.onDestroy?.();
event.stopPropagation();
});
}

View File

@@ -1,30 +1,32 @@
import process from "node:process";
import type {Html} from "../../../common/html.js";
import {html} from "../../../common/html.js";
import {type Html, html} from "../../../common/html.js";
import {ipcRenderer} from "../typed-ipc-renderer.js";
import {generateNodeFromHtml} from "./base.js";
import type {TabProps} from "./tab.js";
import Tab from "./tab.js";
import Tab, {type TabProperties} from "./tab.js";
import type WebView from "./webview.js";
export type ServerTabProps = {
export type ServerTabProperties = {
webview: Promise<WebView>;
} & TabProps;
} & TabProperties;
export default class ServerTab extends Tab {
webview: Promise<WebView>;
$el: Element;
$name: Element;
$icon: HTMLImageElement;
$badge: Element;
constructor({webview, ...props}: ServerTabProps) {
super(props);
constructor({webview, ...properties}: ServerTabProperties) {
super(properties);
this.webview = webview;
this.$el = generateNodeFromHtml(this.templateHtml());
this.props.$root.append(this.$el);
this.properties.$root.append(this.$el);
this.registerListeners();
this.$name = this.$el.querySelector(".server-tooltip")!;
this.$icon = this.$el.querySelector(".server-icons")!;
this.$badge = this.$el.querySelector(".server-tab-badge")!;
}
@@ -40,24 +42,34 @@ export default class ServerTab extends Tab {
override async destroy(): Promise<void> {
await super.destroy();
(await this.webview).$el.remove();
(await this.webview).destroy();
}
templateHtml(): Html {
return html`
<div class="tab" data-tab-id="${this.props.tabIndex}">
<div class="tab" data-tab-id="${this.properties.tabIndex}">
<div class="server-tooltip" style="display:none">
${this.props.name}
${this.properties.name}
</div>
<div class="server-tab-badge"></div>
<div class="server-tab">
<img class="server-icons" src="${this.props.icon}" />
<img class="server-icons" src="${this.properties.icon}" />
</div>
<div class="server-tab-shortcut">${this.generateShortcutText()}</div>
</div>
`;
}
setName(name: string): void {
this.properties.name = name;
this.$name.textContent = name;
}
setIcon(icon: string): void {
this.properties.icon = icon;
this.$icon.src = icon;
}
updateBadge(count: number): void {
this.$badge.textContent = count > 999 ? "1K+" : count.toString();
this.$badge.classList.toggle("active", count > 0);
@@ -65,11 +77,11 @@ export default class ServerTab extends Tab {
generateShortcutText(): string {
// Only provide shortcuts for server [0..9]
if (this.props.index >= 9) {
if (this.properties.index >= 9) {
return "";
}
const shownIndex = this.props.index + 1;
const shownIndex = this.properties.index + 1;
// Array index == Shown index - 1
ipcRenderer.send("switch-server-tab", shownIndex - 1);

View File

@@ -1,6 +1,6 @@
import type {TabRole} from "../../../common/types.js";
export type TabProps = {
export type TabProperties = {
role: TabRole;
icon?: string;
name: string;
@@ -17,17 +17,17 @@ export type TabProps = {
export default abstract class Tab {
abstract $el: Element;
constructor(readonly props: TabProps) {}
constructor(readonly properties: TabProperties) {}
registerListeners(): void {
this.$el.addEventListener("click", this.props.onClick);
this.$el.addEventListener("click", this.properties.onClick);
if (this.props.onHover !== undefined) {
this.$el.addEventListener("mouseover", this.props.onHover);
if (this.properties.onHover !== undefined) {
this.$el.addEventListener("mouseover", this.properties.onHover);
}
if (this.props.onHoverOut !== undefined) {
this.$el.addEventListener("mouseout", this.props.onHoverOut);
if (this.properties.onHoverOut !== undefined) {
this.$el.addEventListener("mouseout", this.properties.onHoverOut);
}
}

View File

@@ -6,11 +6,10 @@ import * as remote from "@electron/remote";
import {app, dialog} from "@electron/remote";
import * as ConfigUtil from "../../../common/config-util.js";
import type {Html} from "../../../common/html.js";
import {html} from "../../../common/html.js";
import {type Html, html} from "../../../common/html.js";
import type {RendererMessage} from "../../../common/typed-ipc.js";
import type {TabRole} from "../../../common/types.js";
import preloadCss from "../../css/preload.css?raw"; // eslint-disable-line n/file-extension-in-import
import preloadCss from "../../css/preload.css?raw";
import {ipcRenderer} from "../typed-ipc-renderer.js";
import * as SystemUtil from "../utils/system-util.js";
@@ -19,7 +18,7 @@ import {contextMenu} from "./context-menu.js";
const shouldSilentWebview = ConfigUtil.getConfigItem("silent", false);
type WebViewProps = {
type WebViewProperties = {
$root: Element;
rootWebContents: WebContents;
index: number;
@@ -32,32 +31,45 @@ type WebViewProps = {
preload?: string;
onTitleChange: () => void;
hasPermission?: (origin: string, permission: string) => boolean;
unsupportedMessage?: string;
};
export default class WebView {
static templateHtml(props: WebViewProps): Html {
static templateHtml(properties: WebViewProperties): Html {
return html`
<webview
data-tab-id="${props.tabIndex}"
src="${props.url}"
${props.preload === undefined
? html``
: html`preload="${props.preload}"`}
partition="persist:webviewsession"
allowpopups
>
</webview>
<div class="webview-pane">
<div
class="webview-unsupported"
${properties.unsupportedMessage === undefined ? html`hidden` : html``}
>
<span class="webview-unsupported-message"
>${properties.unsupportedMessage ?? ""}</span
>
<span class="webview-unsupported-dismiss">×</span>
</div>
<webview
data-tab-id="${properties.tabIndex}"
src="${properties.url}"
${properties.preload === undefined
? html``
: html`preload="${properties.preload}"`}
partition="persist:webviewsession"
allowpopups
>
</webview>
</div>
`;
}
static async create(props: WebViewProps): Promise<WebView> {
const $element = generateNodeFromHtml(
WebView.templateHtml(props),
static async create(properties: WebViewProperties): Promise<WebView> {
const $pane = generateNodeFromHtml(
WebView.templateHtml(properties),
) as HTMLElement;
props.$root.append($element);
properties.$root.append($pane);
const $webview: HTMLElement = $pane.querySelector(":scope > webview")!;
await new Promise<void>((resolve) => {
$element.addEventListener(
$webview.addEventListener(
"did-attach",
() => {
resolve();
@@ -77,165 +89,69 @@ export default class WebView {
}
const selector = `webview[data-tab-id="${CSS.escape(
`${props.tabIndex}`,
`${properties.tabIndex}`,
)}"]`;
const webContentsId: unknown =
await props.rootWebContents.executeJavaScript(
await properties.rootWebContents.executeJavaScript(
`(${getWebContentsIdFunction.toString()})(${JSON.stringify(selector)})`,
);
if (typeof webContentsId !== "number") {
throw new TypeError("Failed to get WebContents ID");
}
return new WebView(props, $element, webContentsId);
return new WebView(properties, $pane, $webview, webContentsId);
}
zoomFactor: number;
badgeCount: number;
loading: boolean;
customCss: string | false | null;
$webviewsContainer: DOMTokenList;
$el: HTMLElement;
webContentsId: number;
badgeCount = 0;
loading = true;
private customCss: string | false | null;
private readonly $webviewsContainer: DOMTokenList;
private readonly $unsupported: HTMLElement;
private readonly $unsupportedMessage: HTMLElement;
private readonly $unsupportedDismiss: HTMLElement;
private unsupportedDismissed = false;
private constructor(
readonly props: WebViewProps,
$element: HTMLElement,
webContentsId: number,
readonly properties: WebViewProperties,
private readonly $pane: HTMLElement,
private readonly $webview: HTMLElement,
readonly webContentsId: number,
) {
this.zoomFactor = 1;
this.loading = true;
this.badgeCount = 0;
this.customCss = ConfigUtil.getConfigItem("customCSS", null);
this.$webviewsContainer = document.querySelector(
"#webviews-container",
)!.classList;
this.$el = $element;
this.webContentsId = webContentsId;
this.$unsupported = $pane.querySelector(".webview-unsupported")!;
this.$unsupportedMessage = $pane.querySelector(
".webview-unsupported-message",
)!;
this.$unsupportedDismiss = $pane.querySelector(
".webview-unsupported-dismiss",
)!;
this.registerListeners();
}
destroy(): void {
this.$pane.remove();
}
getWebContents(): WebContents {
return remote.webContents.fromId(this.webContentsId);
}
registerListeners(): void {
const webContents = this.getWebContents();
if (shouldSilentWebview) {
webContents.setAudioMuted(true);
}
webContents.on("page-title-updated", (_event, title) => {
this.badgeCount = this.getBadgeCount(title);
this.props.onTitleChange();
});
this.$el.addEventListener("did-navigate-in-page", () => {
this.canGoBackButton();
});
this.$el.addEventListener("did-navigate", () => {
this.canGoBackButton();
});
webContents.on("page-favicon-updated", (_event, favicons) => {
// This returns a string of favicons URL. If there is a PM counts in unread messages then the URL would be like
// https://chat.zulip.org/static/images/favicon/favicon-pms.png
if (
favicons[0].indexOf("favicon-pms") > 0 &&
process.platform === "darwin"
) {
// This api is only supported on macOS
app.dock.setBadge("●");
// Bounce the dock
if (ConfigUtil.getConfigItem("dockBouncing", true)) {
app.dock.bounce();
}
}
});
webContents.addListener("context-menu", (event, menuParameters) => {
contextMenu(webContents, event, menuParameters);
});
this.$el.addEventListener("dom-ready", () => {
this.loading = false;
this.props.switchLoading(false, this.props.url);
this.show();
});
webContents.on("did-fail-load", (_event, _errorCode, errorDescription) => {
const hasConnectivityError =
SystemUtil.connectivityError.includes(errorDescription);
if (hasConnectivityError) {
console.error("error", errorDescription);
if (!this.props.url.includes("network.html")) {
this.props.onNetworkError(this.props.index);
}
}
});
this.$el.addEventListener("did-start-loading", () => {
this.props.switchLoading(true, this.props.url);
});
this.$el.addEventListener("did-stop-loading", () => {
this.props.switchLoading(false, this.props.url);
});
}
getBadgeCount(title: string): number {
const messageCountInTitle = /^\((\d+)\)/.exec(title);
return messageCountInTitle ? Number(messageCountInTitle[1]) : 0;
return remote.webContents.fromId(this.webContentsId)!;
}
showNotificationSettings(): void {
this.send("show-notification-settings");
}
show(): void {
// Do not show WebView if another tab was selected and this tab should be in background.
if (!this.props.isActive()) {
return;
}
// To show or hide the loading indicator in the the active tab
this.$webviewsContainer.toggle("loaded", !this.loading);
this.$el.classList.add("active");
this.focus();
this.props.onTitleChange();
// Injecting preload css in webview to override some css rules
(async () => this.getWebContents().insertCSS(preloadCss))();
// Get customCSS again from config util to avoid warning user again
const customCss = ConfigUtil.getConfigItem("customCSS", null);
this.customCss = customCss;
if (customCss) {
if (!fs.existsSync(customCss)) {
this.customCss = null;
ConfigUtil.setConfigItem("customCSS", null);
const errorMessage = "The custom css previously set is deleted!";
dialog.showErrorBox("custom css file deleted!", errorMessage);
return;
}
(async () =>
this.getWebContents().insertCSS(fs.readFileSync(customCss, "utf8")))();
}
}
focus(): void {
this.$el.focus();
this.$webview.focus();
// Work around https://github.com/electron/electron/issues/31918
this.$el.shadowRoot?.querySelector("iframe")?.focus();
this.$webview.shadowRoot?.querySelector("iframe")?.focus();
}
hide(): void {
this.$el.classList.remove("active");
this.$pane.classList.remove("active");
}
load(): void {
@@ -243,18 +159,15 @@ export default class WebView {
}
zoomIn(): void {
this.zoomFactor += 0.1;
this.getWebContents().setZoomFactor(this.zoomFactor);
this.getWebContents().zoomLevel += 0.5;
}
zoomOut(): void {
this.zoomFactor -= 0.1;
this.getWebContents().setZoomFactor(this.zoomFactor);
this.getWebContents().zoomLevel -= 0.5;
}
zoomActualSize(): void {
this.zoomFactor = 1;
this.getWebContents().setZoomFactor(this.zoomFactor);
this.getWebContents().zoomLevel = 0;
}
logOut(): void {
@@ -294,14 +207,134 @@ export default class WebView {
// Shows the loading indicator till the webview is reloaded
this.$webviewsContainer.remove("loaded");
this.loading = true;
this.props.switchLoading(true, this.props.url);
this.properties.switchLoading(true, this.properties.url);
this.getWebContents().reload();
}
setUnsupportedMessage(unsupportedMessage: string | undefined) {
this.$unsupported.hidden =
unsupportedMessage === undefined || this.unsupportedDismissed;
this.$unsupportedMessage.textContent = unsupportedMessage ?? "";
}
send<Channel extends keyof RendererMessage>(
channel: Channel,
...args: Parameters<RendererMessage[Channel]>
...arguments_: Parameters<RendererMessage[Channel]>
): void {
ipcRenderer.sendTo(this.webContentsId, channel, ...args);
ipcRenderer.send("forward-to", this.webContentsId, channel, ...arguments_);
}
private registerListeners(): void {
const webContents = this.getWebContents();
if (shouldSilentWebview) {
webContents.setAudioMuted(true);
}
webContents.on("page-title-updated", (_event, title) => {
this.badgeCount = this.getBadgeCount(title);
this.properties.onTitleChange();
});
this.$webview.addEventListener("did-navigate-in-page", () => {
this.canGoBackButton();
});
this.$webview.addEventListener("did-navigate", () => {
this.canGoBackButton();
});
webContents.on("page-favicon-updated", (_event, favicons) => {
// This returns a string of favicons URL. If there is a PM counts in unread messages then the URL would be like
// https://chat.zulip.org/static/images/favicon/favicon-pms.png
if (
favicons[0].indexOf("favicon-pms") > 0 &&
process.platform === "darwin"
) {
// This api is only supported on macOS
app.dock.setBadge("●");
// Bounce the dock
if (ConfigUtil.getConfigItem("dockBouncing", true)) {
app.dock.bounce();
}
}
});
webContents.addListener("context-menu", (event, menuParameters) => {
contextMenu(webContents, event, menuParameters);
});
this.$webview.addEventListener("dom-ready", () => {
this.loading = false;
this.properties.switchLoading(false, this.properties.url);
this.show();
});
webContents.on("did-fail-load", (_event, _errorCode, errorDescription) => {
const hasConnectivityError =
SystemUtil.connectivityError.includes(errorDescription);
if (hasConnectivityError) {
console.error("error", errorDescription);
if (!this.properties.url.includes("network.html")) {
this.properties.onNetworkError(this.properties.index);
}
}
});
this.$webview.addEventListener("did-start-loading", () => {
this.properties.switchLoading(true, this.properties.url);
});
this.$webview.addEventListener("did-stop-loading", () => {
this.properties.switchLoading(false, this.properties.url);
});
this.$unsupportedDismiss.addEventListener("click", () => {
this.unsupportedDismissed = true;
this.$unsupported.hidden = true;
});
webContents.on("zoom-changed", (event, zoomDirection) => {
if (zoomDirection === "in") this.zoomIn();
else if (zoomDirection === "out") this.zoomOut();
});
}
private getBadgeCount(title: string): number {
const messageCountInTitle = /^\((\d+)\)/.exec(title);
return messageCountInTitle ? Number(messageCountInTitle[1]) : 0;
}
private show(): void {
// Do not show WebView if another tab was selected and this tab should be in background.
if (!this.properties.isActive()) {
return;
}
// To show or hide the loading indicator in the active tab
this.$webviewsContainer.toggle("loaded", !this.loading);
this.$pane.classList.add("active");
this.focus();
this.properties.onTitleChange();
// Injecting preload css in webview to override some css rules
(async () => this.getWebContents().insertCSS(preloadCss))();
// Get customCSS again from config util to avoid warning user again
const customCss = ConfigUtil.getConfigItem("customCSS", null);
this.customCss = customCss;
if (customCss) {
if (!fs.existsSync(customCss)) {
this.customCss = null;
ConfigUtil.setConfigItem("customCSS", null);
const errorMessage = "The custom css previously set is deleted!";
dialog.showErrorBox("custom css file deleted!", errorMessage);
return;
}
(async () =>
this.getWebContents().insertCSS(fs.readFileSync(customCss, "utf8")))();
}
}
}

View File

@@ -1,15 +1,17 @@
import {EventEmitter} from "events"; // eslint-disable-line unicorn/prefer-node-protocol
import {EventEmitter} from "node:events";
import type {ClipboardDecrypter} from "./clipboard-decrypter.js";
import {ClipboardDecrypterImpl} from "./clipboard-decrypter.js";
import type {NotificationData} from "./notification/index.js";
import {newNotification} from "./notification/index.js";
import {
type ClipboardDecrypter,
ClipboardDecrypterImplementation,
} from "./clipboard-decrypter.js";
import {type NotificationData, newNotification} from "./notification/index.js";
import {ipcRenderer} from "./typed-ipc-renderer.js";
type ListenerType = (...args: any[]) => void;
type ListenerType = (...arguments_: any[]) => void;
/* eslint-disable @typescript-eslint/naming-convention */
export type ElectronBridge = {
send_event: (eventName: string | symbol, ...args: unknown[]) => boolean;
send_event: (eventName: string | symbol, ...arguments_: unknown[]) => boolean;
on_event: (eventName: string, listener: ListenerType) => void;
new_notification: (
title: string,
@@ -22,6 +24,7 @@ export type ElectronBridge = {
set_send_notification_reply_message_supported: (value: boolean) => void;
decrypt_clipboard: (version: number) => ClipboardDecrypter;
};
/* eslint-enable @typescript-eslint/naming-convention */
let notificationReplySupported = false;
// Indicates if the user is idle or not
@@ -29,12 +32,12 @@ let idle = false;
// Indicates the time at which user was last active
let lastActive = Date.now();
export const bridgeEvents = new EventEmitter();
export const bridgeEvents = new EventEmitter(); // eslint-disable-line unicorn/prefer-event-target
/* eslint-disable @typescript-eslint/naming-convention */
const electron_bridge: ElectronBridge = {
send_event: (eventName: string | symbol, ...args: unknown[]): boolean =>
bridgeEvents.emit(eventName, ...args),
send_event: (eventName: string | symbol, ...arguments_: unknown[]): boolean =>
bridgeEvents.emit(eventName, ...arguments_),
on_event(eventName: string, listener: ListenerType): void {
bridgeEvents.on(eventName, listener);
@@ -58,7 +61,7 @@ const electron_bridge: ElectronBridge = {
},
decrypt_clipboard: (version: number): ClipboardDecrypter =>
new ClipboardDecrypterImpl(version),
new ClipboardDecrypterImplementation(version),
};
/* eslint-enable @typescript-eslint/naming-convention */
@@ -105,7 +108,7 @@ ipcRenderer.on("set-idle", () => {
// This follows node's idiomatic implementation of event
// emitters to make event handling more simpler instead of using
// functions zulip side will emit event using ElectronBrigde.send_event
// functions zulip side will emit event using ElectronBridge.send_event
// which is alias of .emit and on this side we can handle the data by adding
// a listener for the event.
export default electron_bridge;

View File

@@ -1,113 +0,0 @@
"use strict";
type ElectronBridge = import("./electron-bridge.js").ElectronBridge;
type CompatElectronBridge = {
readonly idle_on_system: boolean;
readonly last_active_on_system: number;
send_notification_reply_message_supported: boolean;
} & ElectronBridge;
(() => {
const zulipWindow = window as typeof window & {
electron_bridge: CompatElectronBridge;
raw_electron_bridge: ElectronBridge;
};
/* eslint-disable @typescript-eslint/naming-convention */
const electron_bridge: CompatElectronBridge = {
...zulipWindow.raw_electron_bridge,
get idle_on_system(): boolean {
return this.get_idle_on_system();
},
get last_active_on_system(): number {
return this.get_last_active_on_system();
},
get send_notification_reply_message_supported(): boolean {
return this.get_send_notification_reply_message_supported();
},
set send_notification_reply_message_supported(value: boolean) {
this.set_send_notification_reply_message_supported(value);
},
};
/* eslint-enable @typescript-eslint/naming-convention */
zulipWindow.electron_bridge = electron_bridge;
function attributeListener<T extends EventTarget>(
type: string,
): PropertyDescriptor {
const handlers = new WeakMap<T, (event: Event) => unknown>();
function listener(this: T, event: Event): void {
if (handlers.get(this)!.call(this, event) === false) {
event.preventDefault();
}
}
return {
configurable: true,
enumerable: true,
get(this: T) {
return handlers.get(this);
},
set(this: T, value: unknown) {
if (typeof value === "function") {
if (!handlers.has(this)) {
this.addEventListener(type, listener);
}
handlers.set(this, value as (event: Event) => unknown);
} else if (handlers.has(this)) {
this.removeEventListener(type, listener);
handlers.delete(this);
}
},
};
}
// eslint-disable-next-line @typescript-eslint/naming-convention
const NativeNotification = Notification;
class InjectedNotification extends EventTarget {
static get permission(): NotificationPermission {
return NativeNotification.permission;
}
static async requestPermission(
callback?: NotificationPermissionCallback,
): Promise<NotificationPermission> {
if (callback) {
callback(await Promise.resolve(NativeNotification.permission));
}
return NativeNotification.permission;
}
constructor(title: string, options: NotificationOptions = {}) {
super();
Object.assign(
this,
electron_bridge.new_notification(
title,
options,
(type: string, eventInit: EventInit) =>
this.dispatchEvent(new Event(type, eventInit)),
),
);
}
}
Object.defineProperties(InjectedNotification.prototype, {
onclick: attributeListener("click"),
onclose: attributeListener("close"),
onerror: attributeListener("error"),
onshow: attributeListener("show"),
});
window.Notification = InjectedNotification as unknown as typeof Notification;
})();

View File

@@ -1,12 +1,11 @@
import {clipboard} from "electron/common";
import fs from "node:fs";
import path from "node:path";
import process from "node:process";
import url from "node:url";
import {Menu, app, dialog, session} from "@electron/remote";
import * as remote from "@electron/remote";
import * as Sentry from "@sentry/electron";
import * as Sentry from "@sentry/electron/renderer";
import type {Config} from "../../common/config-util.js";
import * as ConfigUtil from "../../common/config-util.js";
@@ -17,7 +16,12 @@ import * as LinkUtil from "../../common/link-util.js";
import Logger from "../../common/logger-util.js";
import * as Messages from "../../common/messages.js";
import {bundlePath, bundleUrl} from "../../common/paths.js";
import type {NavItem, ServerConf, TabData} from "../../common/types.js";
import type {
NavigationItem,
ServerConfig,
TabData,
} from "../../common/types.js";
import defaultIcon from "../img/icon.png";
import FunctionalTab from "./components/functional-tab.js";
import ServerTab from "./components/server-tab.js";
@@ -156,12 +160,12 @@ export class ServerManagerView {
ConfigUtil.getConfigItem("useSystemProxy", false)
? {mode: "system"}
: ConfigUtil.getConfigItem("useManualProxy", false)
? {
pacScript: ConfigUtil.getConfigItem("proxyPAC", ""),
proxyRules: ConfigUtil.getConfigItem("proxyRules", ""),
proxyBypassRules: ConfigUtil.getConfigItem("proxyBypass", ""),
}
: {mode: "direct"},
? {
pacScript: ConfigUtil.getConfigItem("proxyPAC", ""),
proxyRules: ConfigUtil.getConfigItem("proxyRules", ""),
proxyBypassRules: ConfigUtil.getConfigItem("proxyBypass", ""),
}
: {mode: "direct"},
);
}
@@ -248,8 +252,8 @@ export class ServerManagerView {
// promise of addition resolves in both cases, but we consider it rejected
// if the resolved value is false
try {
const serverConf = await DomainUtil.checkDomain(domain);
await DomainUtil.addDomain(serverConf);
const serverConfig = await DomainUtil.checkDomain(domain);
await DomainUtil.addDomain(serverConfig);
return true;
} catch (error: unknown) {
logger.error(error);
@@ -323,7 +327,18 @@ export class ServerManagerView {
const servers = DomainUtil.getDomains();
if (servers.length > 0) {
for (const [i, server] of servers.entries()) {
this.initServer(server, i);
const tab = this.initServer(server, i);
(async () => {
const serverConfig = await DomainUtil.updateSavedServer(
server.url,
i,
);
tab.setName(serverConfig.alias);
tab.setIcon(DomainUtil.iconAsUrl(serverConfig.icon));
(await tab.webview).setUnsupportedMessage(
DomainUtil.getUnsupportedMessage(serverConfig),
);
})();
}
// Open last active tab
@@ -332,11 +347,7 @@ export class ServerManagerView {
lastActiveTab = 0;
}
// `checkDomain()` and `webview.load()` for lastActiveTab before the others
await DomainUtil.updateSavedServer(
servers[lastActiveTab].url,
lastActiveTab,
);
// `webview.load()` for lastActiveTab before the others
await this.activateTab(lastActiveTab);
await Promise.all(
servers.map(async (server, i) => {
@@ -346,7 +357,6 @@ export class ServerManagerView {
return;
}
await DomainUtil.updateSavedServer(server.url, i);
const tab = this.tabs[i];
if (tab instanceof ServerTab) (await tab.webview).load();
}),
@@ -361,54 +371,54 @@ export class ServerManagerView {
}
}
initServer(server: ServerConf, index: number): void {
initServer(server: ServerConfig, index: number): ServerTab {
const tabIndex = this.getTabIndex();
this.tabs.push(
new ServerTab({
role: "server",
icon: `data:application/octet-stream;base64,${fs.readFileSync(
server.icon,
"base64",
)}`,
name: server.alias,
$root: this.$tabsContainer,
onClick: this.activateLastTab.bind(this, index),
const tab = new ServerTab({
role: "server",
icon: DomainUtil.iconAsUrl(server.icon),
name: server.alias,
$root: this.$tabsContainer,
onClick: this.activateLastTab.bind(this, index),
index,
tabIndex,
onHover: this.onHover.bind(this, index),
onHoverOut: this.onHoverOut.bind(this, index),
webview: WebView.create({
$root: this.$webviewsContainer,
rootWebContents,
index,
tabIndex,
onHover: this.onHover.bind(this, index),
onHoverOut: this.onHoverOut.bind(this, index),
webview: WebView.create({
$root: this.$webviewsContainer,
rootWebContents,
index,
tabIndex,
url: server.url,
role: "server",
hasPermission: (origin: string, permission: string) =>
origin === server.url && permission === "notifications",
isActive: () => index === this.activeTabIndex,
switchLoading: async (loading: boolean, url: string) => {
if (loading) {
this.loading.add(url);
} else {
this.loading.delete(url);
}
url: server.url,
role: "server",
hasPermission: (origin: string, permission: string) =>
origin === server.url &&
permission === "notifications" &&
ConfigUtil.getConfigItem("showNotification", true),
isActive: () => index === this.activeTabIndex,
switchLoading: async (loading: boolean, url: string) => {
if (loading) {
this.loading.add(url);
} else {
this.loading.delete(url);
}
const tab = this.tabs[this.activeTabIndex];
this.showLoading(
tab instanceof ServerTab &&
this.loading.has((await tab.webview).props.url),
);
},
onNetworkError: async (index: number) => {
await this.openNetworkTroubleshooting(index);
},
onTitleChange: this.updateBadge.bind(this),
preload: url.pathToFileURL(path.join(bundlePath, "preload.js")).href,
}),
const tab = this.tabs[this.activeTabIndex];
this.showLoading(
tab instanceof ServerTab &&
this.loading.has((await tab.webview).properties.url),
);
},
onNetworkError: async (index: number) => {
await this.openNetworkTroubleshooting(index);
},
onTitleChange: this.updateBadge.bind(this),
preload: url.pathToFileURL(path.join(bundlePath, "preload.js")).href,
unsupportedMessage: DomainUtil.getUnsupportedMessage(server),
}),
);
});
this.tabs.push(tab);
this.loading.add(server.url);
return tab;
}
initActions(): void {
@@ -422,7 +432,7 @@ export class ServerManagerView {
document.querySelectorAll(".server-icons");
for (const [index, $serverImg] of $serverImgs.entries()) {
this.addContextMenu($serverImg, index);
if ($serverImg.src.includes("img/icon.png")) {
if ($serverImg.src === defaultIcon) {
this.displayInitialCharLogo($serverImg, index);
}
@@ -478,7 +488,7 @@ export class ServerManagerView {
async getCurrentActiveServer(): Promise<string> {
const tab = this.tabs[this.activeTabIndex];
return tab instanceof ServerTab ? (await tab.webview).props.url : "";
return tab instanceof ServerTab ? (await tab.webview).properties.url : "";
}
displayInitialCharLogo($img: HTMLImageElement, index: number): void {
@@ -496,7 +506,7 @@ export class ServerManagerView {
const realmName = $webview.getAttribute("name");
if (realmName === null) {
$img.src = "/img/icon.png";
$img.src = defaultIcon;
return;
}
@@ -547,36 +557,36 @@ export class ServerManagerView {
this.$serverIconTooltip[index].style.display = "none";
}
async openFunctionalTab(tabProps: {
async openFunctionalTab(tabProperties: {
name: string;
materialIcon: string;
makeView: () => Promise<Element>;
destroyView: () => void;
}): Promise<void> {
if (this.functionalTabs.has(tabProps.name)) {
await this.activateTab(this.functionalTabs.get(tabProps.name)!);
if (this.functionalTabs.has(tabProperties.name)) {
await this.activateTab(this.functionalTabs.get(tabProperties.name)!);
return;
}
const index = this.tabs.length;
this.functionalTabs.set(tabProps.name, index);
this.functionalTabs.set(tabProperties.name, index);
const tabIndex = this.getTabIndex();
const $view = await tabProps.makeView();
const $view = await tabProperties.makeView();
this.$webviewsContainer.append($view);
this.tabs.push(
new FunctionalTab({
role: "function",
materialIcon: tabProps.materialIcon,
name: tabProps.name,
materialIcon: tabProperties.materialIcon,
name: tabProperties.name,
$root: this.$tabsContainer,
index,
tabIndex,
onClick: this.activateTab.bind(this, index),
onDestroy: async () => {
await this.destroyTab(tabProps.name, index);
tabProps.destroyView();
await this.destroyTab(tabProperties.name, index);
tabProperties.destroyView();
},
$view,
}),
@@ -586,10 +596,12 @@ export class ServerManagerView {
// closed when the functional tab DOM is ready, handled in webview.js
this.$webviewsContainer.classList.remove("loaded");
await this.activateTab(this.functionalTabs.get(tabProps.name)!);
await this.activateTab(this.functionalTabs.get(tabProperties.name)!);
}
async openSettings(nav: NavItem = "General"): Promise<void> {
async openSettings(
navigationItem: NavigationItem = "General",
): Promise<void> {
await this.openFunctionalTab({
name: "Settings",
materialIcon: "settings",
@@ -604,7 +616,7 @@ export class ServerManagerView {
},
});
this.$settingsButton.classList.add("active");
this.preferenceView!.handleNavigation(nav);
this.preferenceView!.handleNavigation(navigationItem);
}
async openAbout(): Promise<void> {
@@ -643,13 +655,13 @@ export class ServerManagerView {
// Returns this.tabs in an way that does
// not crash app when this.tabs is passed into
// ipcRenderer. Something about webview, and props.webview
// ipcRenderer. Something about webview, and properties.webview
// properties in ServerTab causes the app to crash.
get tabsForIpc(): TabData[] {
return this.tabs.map((tab) => ({
role: tab.props.role,
name: tab.props.name,
index: tab.props.index,
role: tab.properties.role,
name: tab.properties.name,
index: tab.properties.index,
}));
}
@@ -667,8 +679,8 @@ export class ServerManagerView {
if (hideOldTab) {
// If old tab is functional tab Settings, remove focus from the settings icon at sidebar bottom
if (
this.tabs[this.activeTabIndex].props.role === "function" &&
this.tabs[this.activeTabIndex].props.name === "Settings"
this.tabs[this.activeTabIndex].properties.role === "function" &&
this.tabs[this.activeTabIndex].properties.name === "Settings"
) {
this.$settingsButton.classList.remove("active");
}
@@ -692,7 +704,7 @@ export class ServerManagerView {
this.showLoading(
tab instanceof ServerTab &&
this.loading.has((await tab.webview).props.url),
this.loading.has((await tab.webview).properties.url),
);
ipcRenderer.send("update-menu", {
@@ -701,7 +713,7 @@ export class ServerManagerView {
tabs: this.tabsForIpc,
activeTabIndex: this.activeTabIndex,
// Following flag controls whether a menu item should be enabled or not
enableMenu: tab.props.role === "server",
enableMenu: tab.properties.role === "server",
});
}
@@ -718,7 +730,7 @@ export class ServerManagerView {
await tab.destroy();
delete this.tabs[index];
delete this.tabs[index]; // eslint-disable-line @typescript-eslint/no-array-delete
this.functionalTabs.delete(name);
// Issue #188: If the functional tab was not focused, do not activate another tab.
@@ -743,7 +755,7 @@ export class ServerManagerView {
async reloadView(): Promise<void> {
// Save and remember the index of last active tab so that we can use it later
const lastActiveTab = this.tabs[this.activeTabIndex].props.index;
const lastActiveTab = this.tabs[this.activeTabIndex].properties.index;
ConfigUtil.setConfigItem("lastActiveTab", lastActiveTab);
// Destroy the current view and re-initiate it
@@ -921,7 +933,7 @@ export class ServerManagerView {
ipcRenderer.on(
"permission-request",
async (
event: Event,
event,
{
webContentsId,
origin,
@@ -943,7 +955,7 @@ export class ServerManagerView {
const webview = await tab.webview;
return (
webview.webContentsId === webContentsId &&
webview.props.hasPermission?.(origin, permission)
webview.properties.hasPermission?.(origin, permission)
);
}),
)
@@ -970,10 +982,7 @@ export class ServerManagerView {
await LinkUtil.openBrowser(new URL("https://zulip.com/help/"));
});
ipcRenderer.on(
"reload-viewer",
this.reloadView.bind(this, this.tabs[this.activeTabIndex].props.index),
);
ipcRenderer.on("reload-viewer", this.reloadView.bind(this));
ipcRenderer.on("reload-current-viewer", this.reloadCurrentView.bind(this));
@@ -981,7 +990,7 @@ export class ServerManagerView {
ipcRenderer.send("reload-full-app");
});
ipcRenderer.on("switch-server-tab", async (event: Event, index: number) => {
ipcRenderer.on("switch-server-tab", async (event, index: number) => {
await this.activateLastTab(index);
});
@@ -989,7 +998,7 @@ export class ServerManagerView {
await this.openSettings("AddServer");
});
ipcRenderer.on("reload-proxy", async (event: Event, showAlert: boolean) => {
ipcRenderer.on("reload-proxy", async (event, showAlert: boolean) => {
await this.loadProxy();
if (showAlert) {
await dialog.showMessageBox({
@@ -1000,12 +1009,12 @@ export class ServerManagerView {
}
});
ipcRenderer.on("toggle-sidebar", async (event: Event, show: boolean) => {
ipcRenderer.on("toggle-sidebar", async (event, show: boolean) => {
// Toggle the left sidebar
this.toggleSidebar(show);
});
ipcRenderer.on("toggle-silent", async (event: Event, state: boolean) =>
ipcRenderer.on("toggle-silent", async (event, state: boolean) =>
Promise.all(
this.tabs.map(async (tab) => {
if (tab instanceof ServerTab)
@@ -1016,7 +1025,7 @@ export class ServerManagerView {
ipcRenderer.on(
"toggle-autohide-menubar",
async (event: Event, autoHideMenubar: boolean, updateMenu: boolean) => {
async (event, autoHideMenubar: boolean, updateMenu: boolean) => {
if (updateMenu) {
ipcRenderer.send("update-menu", {
tabs: this.tabsForIpc,
@@ -1028,11 +1037,7 @@ export class ServerManagerView {
ipcRenderer.on(
"toggle-dnd",
async (
event: Event,
state: boolean,
newSettings: Partial<DndSettings>,
) => {
async (event, state: boolean, newSettings: Partial<DndSettings>) => {
this.toggleDndButton(state);
ipcRenderer.send(
"forward-message",
@@ -1044,16 +1049,11 @@ export class ServerManagerView {
ipcRenderer.on(
"update-realm-name",
(event: Event, serverURL: string, realmName: string) => {
(event, serverURL: string, realmName: string) => {
for (const [index, domain] of DomainUtil.getDomains().entries()) {
if (domain.url.includes(serverURL)) {
const serverTooltipSelector = ".tab .server-tooltip";
const serverTooltips = document.querySelectorAll(
serverTooltipSelector,
);
serverTooltips[index].textContent = realmName;
this.tabs[index].props.name = realmName;
if (domain.url === serverURL) {
const tab = this.tabs[index];
if (tab instanceof ServerTab) tab.setName(realmName);
domain.alias = realmName;
DomainUtil.updateDomain(index, domain);
// Update the realm name also on the Window menu
@@ -1068,18 +1068,15 @@ export class ServerManagerView {
ipcRenderer.on(
"update-realm-icon",
async (event: Event, serverURL: string, iconURL: string) => {
async (event, serverURL: string, iconURL: string) => {
await Promise.all(
DomainUtil.getDomains().map(async (domain, index) => {
if (domain.url.includes(serverURL)) {
const localIconUrl: string = await DomainUtil.saveServerIcon(
iconURL,
);
const serverImgsSelector = ".tab .server-icons";
const serverImgs: NodeListOf<HTMLImageElement> =
document.querySelectorAll(serverImgsSelector);
serverImgs[index].src = localIconUrl;
domain.icon = localIconUrl;
if (domain.url === serverURL) {
const localIconPath = await DomainUtil.saveServerIcon(iconURL);
const tab = this.tabs[index];
if (tab instanceof ServerTab)
tab.setIcon(DomainUtil.iconAsUrl(localIconPath));
domain.icon = localIconPath;
DomainUtil.updateDomain(index, domain);
}
}),
@@ -1096,61 +1093,56 @@ export class ServerManagerView {
this.$fullscreenPopup.classList.remove("show");
});
ipcRenderer.on(
"focus-webview-with-id",
async (event: Event, webviewId: number) =>
Promise.all(
this.tabs.map(async (tab) => {
if (
tab instanceof ServerTab &&
(await tab.webview).webContentsId === webviewId
) {
const concurrentTab: HTMLButtonElement = document.querySelector(
`div[data-tab-id="${CSS.escape(`${tab.props.tabIndex}`)}"]`,
)!;
concurrentTab.click();
}
}),
),
ipcRenderer.on("focus-webview-with-id", async (event, webviewId: number) =>
Promise.all(
this.tabs.map(async (tab) => {
if (
tab instanceof ServerTab &&
(await tab.webview).webContentsId === webviewId
) {
const concurrentTab: HTMLButtonElement = document.querySelector(
`div[data-tab-id="${CSS.escape(`${tab.properties.tabIndex}`)}"]`,
)!;
concurrentTab.click();
}
}),
),
);
ipcRenderer.on(
"render-taskbar-icon",
(event: Event, messageCount: number) => {
// Create a canvas from unread messagecounts
function createOverlayIcon(messageCount: number): HTMLCanvasElement {
const canvas = document.createElement("canvas");
canvas.height = 128;
canvas.width = 128;
canvas.style.letterSpacing = "-5px";
const ctx = canvas.getContext("2d")!;
ctx.fillStyle = "#f42020";
ctx.beginPath();
ctx.ellipse(64, 64, 64, 64, 0, 0, 2 * Math.PI);
ctx.fill();
ctx.textAlign = "center";
ctx.fillStyle = "white";
if (messageCount > 99) {
ctx.font = "65px Helvetica";
ctx.fillText("99+", 64, 85);
} else if (messageCount < 10) {
ctx.font = "90px Helvetica";
ctx.fillText(String(Math.min(99, messageCount)), 64, 96);
} else {
ctx.font = "85px Helvetica";
ctx.fillText(String(Math.min(99, messageCount)), 64, 90);
}
return canvas;
ipcRenderer.on("render-taskbar-icon", (event, messageCount: number) => {
// Create a canvas from unread message counts
function createOverlayIcon(messageCount: number): HTMLCanvasElement {
const canvas = document.createElement("canvas");
canvas.height = 128;
canvas.width = 128;
canvas.style.letterSpacing = "-5px";
const context = canvas.getContext("2d")!;
context.fillStyle = "#f42020";
context.beginPath();
context.ellipse(64, 64, 64, 64, 0, 0, 2 * Math.PI);
context.fill();
context.textAlign = "center";
context.fillStyle = "white";
if (messageCount > 99) {
context.font = "65px Helvetica";
context.fillText("99+", 64, 85);
} else if (messageCount < 10) {
context.font = "90px Helvetica";
context.fillText(String(Math.min(99, messageCount)), 64, 96);
} else {
context.font = "85px Helvetica";
context.fillText(String(Math.min(99, messageCount)), 64, 90);
}
ipcRenderer.send(
"update-taskbar-icon",
createOverlayIcon(messageCount).toDataURL(),
String(messageCount),
);
},
);
return canvas;
}
ipcRenderer.send(
"update-taskbar-icon",
createOverlayIcon(messageCount).toDataURL(),
String(messageCount),
);
});
ipcRenderer.on("copy-zulip-url", async () => {
clipboard.writeText(await this.getCurrentActiveServer());

View File

@@ -18,10 +18,10 @@ export function newNotification(
): NotificationData {
const notification = new Notification(title, {...options, silent: true});
for (const type of ["click", "close", "error", "show"]) {
notification.addEventListener(type, (ev: Event) => {
notification.addEventListener(type, (event) => {
if (type === "click") ipcRenderer.send("focus-this-webview");
if (!dispatch(type, ev)) {
ev.preventDefault();
if (!dispatch(type, event)) {
event.preventDefault();
}
});
}

View File

@@ -1,17 +1,16 @@
import type {Html} from "../../../../common/html.js";
import {html} from "../../../../common/html.js";
import {type Html, html} from "../../../../common/html.js";
import {generateNodeFromHtml} from "../../components/base.js";
import {ipcRenderer} from "../../typed-ipc-renderer.js";
type BaseSectionProps = {
type BaseSectionProperties = {
$element: HTMLElement;
disabled?: boolean;
value: boolean;
clickHandler: () => void;
};
export function generateSettingOption(props: BaseSectionProps): void {
const {$element, disabled, value, clickHandler} = props;
export function generateSettingOption(properties: BaseSectionProperties): void {
const {$element, disabled, value, clickHandler} = properties;
$element.textContent = "";
@@ -30,8 +29,7 @@ export function generateOptionHtml(
disabled?: boolean,
): Html {
const labelHtml = disabled
? // eslint-disable-next-line unicorn/template-indent
html`<label
? html`<label
class="disallowed"
title="Setting locked by system administrator."
></label>`

View File

@@ -7,13 +7,13 @@ import {reloadApp} from "./base-section.js";
import {initFindAccounts} from "./find-accounts.js";
import {initServerInfoForm} from "./server-info-form.js";
type ConnectedOrgSectionProps = {
type ConnectedOrgSectionProperties = {
$root: Element;
};
export function initConnectedOrgSection({
$root,
}: ConnectedOrgSectionProps): void {
}: ConnectedOrgSectionProperties): void {
$root.textContent = "";
const servers = DomainUtil.getDomains();
@@ -21,7 +21,7 @@ export function initConnectedOrgSection({
<div class="settings-pane" id="server-settings-pane">
<div class="page-title">${t.__("Connected organizations")}</div>
<div class="title" id="existing-servers">
${t.__("All the connected orgnizations will appear here.")}
${t.__("All the connected organizations will appear here.")}
</div>
<div id="server-info-container"></div>
<div id="new-org-button">
@@ -42,7 +42,9 @@ export function initConnectedOrgSection({
"#find-accounts-container",
)!;
const noServerText = t.__("All the connected orgnizations will appear here");
const noServerText = t.__(
"All the connected organizations will appear here.",
);
// Show noServerText if no servers are there otherwise hide it
$existingServers.textContent = servers.length === 0 ? noServerText : "";

View File

@@ -3,7 +3,7 @@ import * as LinkUtil from "../../../../common/link-util.js";
import * as t from "../../../../common/translation-util.js";
import {generateNodeFromHtml} from "../../components/base.js";
type FindAccountsProps = {
type FindAccountsProperties = {
$root: Element;
};
@@ -19,7 +19,7 @@ async function findAccounts(url: string): Promise<void> {
await LinkUtil.openBrowser(new URL("/accounts/find", url));
}
export function initFindAccounts(props: FindAccountsProps): void {
export function initFindAccounts(properties: FindAccountsProperties): void {
const $findAccounts = generateNodeFromHtml(html`
<div class="settings-card certificate-card">
<div class="certificate-input">
@@ -33,7 +33,7 @@ export function initFindAccounts(props: FindAccountsProps): void {
</div>
</div>
`);
props.$root.append($findAccounts);
properties.$root.append($findAccounts);
const $findAccountsButton = $findAccounts.querySelector(
"#find-accounts-button",
)!;

View File

@@ -7,7 +7,7 @@ import * as remote from "@electron/remote";
import {app, dialog, session} from "@electron/remote";
import Tagify from "@yaireo/tagify";
import ISO6391 from "iso-639-1";
import * as z from "zod";
import {z} from "zod";
import supportedLocales from "../../../../../public/translations/supported-locales.json";
import * as ConfigUtil from "../../../../common/config-util.js";
@@ -20,11 +20,11 @@ import {generateSelectHtml, generateSettingOption} from "./base-section.js";
const currentBrowserWindow = remote.getCurrentWindow();
type GeneralSectionProps = {
type GeneralSectionProperties = {
$root: Element;
};
export function initGeneralSection({$root}: GeneralSectionProps): void {
export function initGeneralSection({$root}: GeneralSectionProperties): void {
$root.innerHTML = html`
<div class="settings-pane">
<div class="title">${t.__("Appearance")}</div>
@@ -356,7 +356,8 @@ export function initGeneralSection({$root}: GeneralSectionProps): void {
const newValue = !ConfigUtil.getConfigItem("silent", true);
ConfigUtil.setConfigItem("silent", newValue);
updateSilentOption();
ipcRenderer.sendTo(
ipcRenderer.send(
"forward-to",
currentBrowserWindow.webContents.id,
"toggle-silent",
newValue,
@@ -460,9 +461,8 @@ export function initGeneralSection({$root}: GeneralSectionProps): void {
filters: [{name: "CSS file", extensions: ["css"]}],
};
const {filePaths, canceled} = await dialog.showOpenDialog(
showDialogOptions,
);
const {filePaths, canceled} =
await dialog.showOpenDialog(showDialogOptions);
if (!canceled) {
ConfigUtil.setConfigItem("customCSS", filePaths[0]);
ipcRenderer.send("forward-message", "hard-reload");
@@ -529,9 +529,8 @@ export function initGeneralSection({$root}: GeneralSectionProps): void {
properties: ["openDirectory"],
};
const {filePaths, canceled} = await dialog.showOpenDialog(
showDialogOptions,
);
const {filePaths, canceled} =
await dialog.showOpenDialog(showDialogOptions);
if (!canceled) {
ConfigUtil.setConfigItem("downloadsPath", filePaths[0]);
const downloadFolderPath: HTMLElement = $root.querySelector(
@@ -592,7 +591,7 @@ export function initGeneralSection({$root}: GeneralSectionProps): void {
}
function initSpellChecker(): void {
// The elctron API is a no-op on macOS and macOS default spellchecker is used.
// The Electron API is a no-op on macOS and macOS default spellchecker is used.
if (process.platform === "darwin") {
const note: HTMLElement = $root.querySelector("#note")!;
note.append(t.__("On macOS, the OS spellchecker is used."));
@@ -610,7 +609,9 @@ export function initGeneralSection({$root}: GeneralSectionProps): void {
const spellDiv: HTMLElement = $root.querySelector("#spellcheck-langs")!;
spellDiv.innerHTML += html`
<div class="setting-description">${t.__("Spellchecker Languages")}</div>
<input name="spellcheck" placeholder="Enter Languages" />
<div id="spellcheck-langs-value">
<input name="spellcheck" placeholder="Enter Languages" />
</div>
`.html;
const availableLanguages = session.fromPartition(
@@ -652,8 +653,20 @@ export function initGeneralSection({$root}: GeneralSectionProps): void {
maxItems: Number.POSITIVE_INFINITY,
closeOnSelect: false,
highlightFirst: true,
position: "manual",
classname: "settings-tagify-dropdown",
},
});
tagify.DOM.input.addEventListener("focus", () => {
tagify.dropdown.show();
$root
.querySelector("#spellcheck-langs-value")!
.append(tagify.DOM.dropdown);
});
tagify.DOM.input.addEventListener("blur", () => {
tagify.dropdown.hide(true);
tagify.DOM.dropdown.remove();
});
const configuredLanguages: string[] = (
ConfigUtil.getConfigItem("spellcheckerLanguages", null) ?? []

View File

@@ -1,19 +1,18 @@
import type {Html} from "../../../../common/html.js";
import {html} from "../../../../common/html.js";
import {type Html, html} from "../../../../common/html.js";
import * as t from "../../../../common/translation-util.js";
import type {NavItem} from "../../../../common/types.js";
import type {NavigationItem} from "../../../../common/types.js";
import {generateNodeFromHtml} from "../../components/base.js";
type PreferenceNavProps = {
type PreferenceNavigationProperties = {
$root: Element;
onItemSelected: (navItem: NavItem) => void;
onItemSelected: (navigationItem: NavigationItem) => void;
};
export default class PreferenceNav {
navItems: NavItem[];
export default class PreferenceNavigation {
navigationItems: NavigationItem[];
$el: Element;
constructor(private readonly props: PreferenceNavProps) {
this.navItems = [
constructor(private readonly properties: PreferenceNavigationProperties) {
this.navigationItems = [
"General",
"Network",
"AddServer",
@@ -22,15 +21,17 @@ export default class PreferenceNav {
];
this.$el = generateNodeFromHtml(this.templateHtml());
this.props.$root.append(this.$el);
this.properties.$root.append(this.$el);
this.registerListeners();
}
templateHtml(): Html {
const navItemsHtml = html``.join(
this.navItems.map(
(navItem) => html`
<div class="nav" id="nav-${navItem}">${t.__(navItem)}</div>
const navigationItemsHtml = html``.join(
this.navigationItems.map(
(navigationItem) => html`
<div class="nav" id="nav-${navigationItem}">
${t.__(navigationItem)}
</div>
`,
),
);
@@ -38,37 +39,39 @@ export default class PreferenceNav {
return html`
<div>
<div id="settings-header">${t.__("Settings")}</div>
<div id="nav-container">${navItemsHtml}</div>
<div id="nav-container">${navigationItemsHtml}</div>
</div>
`;
}
registerListeners(): void {
for (const navItem of this.navItems) {
const $item = this.$el.querySelector(`#nav-${CSS.escape(navItem)}`)!;
for (const navigationItem of this.navigationItems) {
const $item = this.$el.querySelector(
`#nav-${CSS.escape(navigationItem)}`,
)!;
$item.addEventListener("click", () => {
this.props.onItemSelected(navItem);
this.properties.onItemSelected(navigationItem);
});
}
}
select(navItemToSelect: NavItem): void {
for (const navItem of this.navItems) {
if (navItem === navItemToSelect) {
this.activate(navItem);
select(navigationItemToSelect: NavigationItem): void {
for (const navigationItem of this.navigationItems) {
if (navigationItem === navigationItemToSelect) {
this.activate(navigationItem);
} else {
this.deactivate(navItem);
this.deactivate(navigationItem);
}
}
}
activate(navItem: NavItem): void {
const $item = this.$el.querySelector(`#nav-${CSS.escape(navItem)}`)!;
activate(navigationItem: NavigationItem): void {
const $item = this.$el.querySelector(`#nav-${CSS.escape(navigationItem)}`)!;
$item.classList.add("active");
}
deactivate(navItem: NavItem): void {
const $item = this.$el.querySelector(`#nav-${CSS.escape(navItem)}`)!;
deactivate(navigationItem: NavigationItem): void {
const $item = this.$el.querySelector(`#nav-${CSS.escape(navigationItem)}`)!;
$item.classList.remove("active");
}
}

View File

@@ -5,11 +5,11 @@ import {ipcRenderer} from "../../typed-ipc-renderer.js";
import {generateSettingOption} from "./base-section.js";
type NetworkSectionProps = {
type NetworkSectionProperties = {
$root: Element;
};
export function initNetworkSection({$root}: NetworkSectionProps): void {
export function initNetworkSection({$root}: NetworkSectionProperties): void {
$root.innerHTML = html`
<div class="settings-pane">
<div class="title">${t.__("Proxy")}</div>

View File

@@ -7,12 +7,15 @@ import {generateNodeFromHtml} from "../../components/base.js";
import {ipcRenderer} from "../../typed-ipc-renderer.js";
import * as DomainUtil from "../../utils/domain-util.js";
type NewServerFormProps = {
type NewServerFormProperties = {
$root: Element;
onChange: () => void;
};
export function initNewServerForm({$root, onChange}: NewServerFormProps): void {
export function initNewServerForm({
$root,
onChange,
}: NewServerFormProperties): void {
const $newServerForm = generateNodeFromHtml(html`
<div class="server-input-container">
<div class="title">${t.__("Organization URL")}</div>
@@ -58,9 +61,9 @@ export function initNewServerForm({$root, onChange}: NewServerFormProps): void {
async function submitFormHandler(): Promise<void> {
$saveServerButton.textContent = "Connecting...";
let serverConf;
let serverConfig;
try {
serverConf = await DomainUtil.checkDomain($newServerUrl.value.trim());
serverConfig = await DomainUtil.checkDomain($newServerUrl.value.trim());
} catch (error: unknown) {
$saveServerButton.textContent = "Connect";
await dialog.showMessageBox({
@@ -74,7 +77,7 @@ export function initNewServerForm({$root, onChange}: NewServerFormProps): void {
return;
}
await DomainUtil.addDomain(serverConf);
await DomainUtil.addDomain(serverConfig);
onChange();
}

View File

@@ -1,8 +1,9 @@
import type {IpcRendererEvent} from "electron/renderer";
import process from "node:process";
import type {DndSettings} from "../../../../common/dnd-util.js";
import {bundleUrl} from "../../../../common/paths.js";
import type {NavItem} from "../../../../common/types.js";
import type {NavigationItem} from "../../../../common/types.js";
import {ipcRenderer} from "../../typed-ipc-renderer.js";
import {initConnectedOrgSection} from "./connected-org-section.js";
@@ -25,7 +26,7 @@ export class PreferenceView {
private readonly $shadow: ShadowRoot;
private readonly $settingsContainer: Element;
private readonly nav: Nav;
private navItem: NavItem = "General";
private navigationItem: NavigationItem = "General";
private constructor(templateHtml: string) {
this.$view = document.createElement("div");
@@ -46,13 +47,13 @@ export class PreferenceView {
ipcRenderer.on("toggle-autohide-menubar", this.handleToggleMenubar);
ipcRenderer.on("toggle-dnd", this.handleToggleDnd);
this.handleNavigation(this.navItem);
this.handleNavigation(this.navigationItem);
}
handleNavigation = (navItem: NavItem): void => {
this.navItem = navItem;
this.nav.select(navItem);
switch (navItem) {
handleNavigation = (navigationItem: NavigationItem): void => {
this.navigationItem = navigationItem;
this.nav.select(navigationItem);
switch (navigationItem) {
case "AddServer": {
initServersSection({
$root: this.$settingsContainer,
@@ -87,13 +88,9 @@ export class PreferenceView {
});
break;
}
default: {
((n: never) => n)(navItem);
}
}
window.location.hash = `#${navItem}`;
window.location.hash = `#${navigationItem}`;
};
handleToggleTray(state: boolean) {
@@ -115,16 +112,22 @@ export class PreferenceView {
}
}
private readonly handleToggleSidebar = (_event: Event, state: boolean) => {
private readonly handleToggleSidebar = (
_event: IpcRendererEvent,
state: boolean,
) => {
this.handleToggle("sidebar-option", state);
};
private readonly handleToggleMenubar = (_event: Event, state: boolean) => {
private readonly handleToggleMenubar = (
_event: IpcRendererEvent,
state: boolean,
) => {
this.handleToggle("menubar-option", state);
};
private readonly handleToggleDnd = (
_event: Event,
_event: IpcRendererEvent,
_state: boolean,
newSettings: Partial<DndSettings>,
) => {

View File

@@ -3,32 +3,35 @@ import {dialog} from "@electron/remote";
import {html} from "../../../../common/html.js";
import * as Messages from "../../../../common/messages.js";
import * as t from "../../../../common/translation-util.js";
import type {ServerConf} from "../../../../common/types.js";
import type {ServerConfig} from "../../../../common/types.js";
import {generateNodeFromHtml} from "../../components/base.js";
import {ipcRenderer} from "../../typed-ipc-renderer.js";
import * as DomainUtil from "../../utils/domain-util.js";
type ServerInfoFormProps = {
type ServerInfoFormProperties = {
$root: Element;
server: ServerConf;
server: ServerConfig;
index: number;
onChange: () => void;
};
export function initServerInfoForm(props: ServerInfoFormProps): void {
export function initServerInfoForm(properties: ServerInfoFormProperties): void {
const $serverInfoForm = generateNodeFromHtml(html`
<div class="settings-card">
<div class="server-info-left">
<img class="server-info-icon" src="${props.server.icon}" />
<img
class="server-info-icon"
src="${DomainUtil.iconAsUrl(properties.server.icon)}"
/>
<div class="server-info-row">
<span class="server-info-alias">${props.server.alias}</span>
<span class="server-info-alias">${properties.server.alias}</span>
<i class="material-icons open-tab-button">open_in_new</i>
</div>
</div>
<div class="server-info-right">
<div class="server-info-row server-url">
<span class="server-url-info" title="${props.server.url}"
>${props.server.url}</span
<span class="server-url-info" title="${properties.server.url}"
>${properties.server.url}</span
>
</div>
<div class="server-info-row">
@@ -45,7 +48,7 @@ export function initServerInfoForm(props: ServerInfoFormProps): void {
".server-delete-action",
)!;
const $openServerButton = $serverInfoForm.querySelector(".open-tab-button")!;
props.$root.append($serverInfoForm);
properties.$root.append($serverInfoForm);
$deleteServerButton.addEventListener("click", async () => {
const {response} = await dialog.showMessageBox({
@@ -55,11 +58,11 @@ export function initServerInfoForm(props: ServerInfoFormProps): void {
message: t.__("Are you sure you want to disconnect this organization?"),
});
if (response === 0) {
if (DomainUtil.removeDomain(props.index)) {
if (DomainUtil.removeDomain(properties.index)) {
ipcRenderer.send("reload-full-app");
} else {
const {title, content} = Messages.orgRemovalError(
DomainUtil.getDomain(props.index).url,
DomainUtil.getDomain(properties.index).url,
);
dialog.showErrorBox(title, content);
}
@@ -67,14 +70,14 @@ export function initServerInfoForm(props: ServerInfoFormProps): void {
});
$openServerButton.addEventListener("click", () => {
ipcRenderer.send("forward-message", "switch-server-tab", props.index);
ipcRenderer.send("forward-message", "switch-server-tab", properties.index);
});
$serverInfoAlias.addEventListener("click", () => {
ipcRenderer.send("forward-message", "switch-server-tab", props.index);
ipcRenderer.send("forward-message", "switch-server-tab", properties.index);
});
$serverIcon.addEventListener("click", () => {
ipcRenderer.send("forward-message", "switch-server-tab", props.index);
ipcRenderer.send("forward-message", "switch-server-tab", properties.index);
});
}

View File

@@ -4,11 +4,11 @@ import * as t from "../../../../common/translation-util.js";
import {reloadApp} from "./base-section.js";
import {initNewServerForm} from "./new-server-form.js";
type ServersSectionProps = {
type ServersSectionProperties = {
$root: Element;
};
export function initServersSection({$root}: ServersSectionProps): void {
export function initServersSection({$root}: ServersSectionProperties): void {
$root.innerHTML = html`
<div class="add-server-modal">
<div class="modal-container">

View File

@@ -4,12 +4,14 @@ import {html} from "../../../../common/html.js";
import * as LinkUtil from "../../../../common/link-util.js";
import * as t from "../../../../common/translation-util.js";
type ShortcutsSectionProps = {
type ShortcutsSectionProperties = {
$root: Element;
};
// eslint-disable-next-line complexity
export function initShortcutsSection({$root}: ShortcutsSectionProps): void {
export function initShortcutsSection({
$root,
}: ShortcutsSectionProperties): void {
const cmdOrCtrl = process.platform === "darwin" ? "⌘" : "Ctrl";
$root.innerHTML = html`

View File

@@ -1,67 +1,21 @@
import {contextBridge, webFrame} from "electron/renderer";
import {contextBridge} from "electron/renderer";
import electron_bridge, {bridgeEvents} from "./electron-bridge.js";
import * as NetworkError from "./pages/network.js";
import {ipcRenderer} from "./typed-ipc-renderer.js";
contextBridge.exposeInMainWorld("raw_electron_bridge", electron_bridge);
contextBridge.exposeInMainWorld("electron_bridge", electron_bridge);
ipcRenderer.on("logout", () => {
if (bridgeEvents.emit("logout")) {
return;
}
// Create the menu for the below
const dropdown: HTMLElement = document.querySelector(".dropdown-toggle")!;
dropdown.click();
const nodes: NodeListOf<HTMLElement> = document.querySelectorAll(
".dropdown-menu li:last-child a",
);
nodes[nodes.length - 1].click();
bridgeEvents.emit("logout");
});
ipcRenderer.on("show-keyboard-shortcuts", () => {
if (bridgeEvents.emit("show-keyboard-shortcuts")) {
return;
}
// Create the menu for the below
const node: HTMLElement = document.querySelector(
"a[data-overlay-trigger=keyboard-shortcuts]",
)!;
// Additional check
if (node.textContent!.trim().toLowerCase() === "keyboard shortcuts (?)") {
node.click();
} else {
// Atleast click the dropdown
const dropdown: HTMLElement = document.querySelector(".dropdown-toggle")!;
dropdown.click();
}
bridgeEvents.emit("show-keyboard-shortcuts");
});
ipcRenderer.on("show-notification-settings", () => {
if (bridgeEvents.emit("show-notification-settings")) {
return;
}
// Create the menu for the below
const dropdown: HTMLElement = document.querySelector(".dropdown-toggle")!;
dropdown.click();
const nodes: NodeListOf<HTMLElement> = document.querySelectorAll(
".dropdown-menu li a",
);
nodes[2].click();
const notificationItem: NodeListOf<HTMLElement> = document.querySelectorAll(
".normal-settings-list li div",
);
// Wait until the notification dom element shows up
setTimeout(() => {
notificationItem[2].click();
}, 100);
bridgeEvents.emit("show-notification-settings");
});
window.addEventListener("load", () => {
@@ -73,6 +27,3 @@ window.addEventListener("load", () => {
const $settingsButton = document.querySelector("#settings")!;
NetworkError.init($reconnectButton, $settingsButton);
});
(async () =>
webFrame.executeJavaScript(ipcRenderer.sendSync("get-injected-js")))();

View File

@@ -1,5 +1,4 @@
import type {NativeImage} from "electron/common";
import {nativeImage} from "electron/common";
import {type NativeImage, nativeImage} from "electron/common";
import type {Tray as ElectronTray} from "electron/main";
import path from "node:path";
import process from "node:process";
@@ -64,8 +63,8 @@ const config = {
thick: process.platform === "win32",
};
const renderCanvas = function (arg: number): HTMLCanvasElement {
config.unreadCount = arg;
const renderCanvas = function (argument: number): HTMLCanvasElement {
config.unreadCount = argument;
const size = config.size * config.pixelRatio;
const padding = size * 0.05;
@@ -79,30 +78,34 @@ const renderCanvas = function (arg: number): HTMLCanvasElement {
const canvas = document.createElement("canvas");
canvas.width = size;
canvas.height = size;
const ctx = canvas.getContext("2d")!;
const context = canvas.getContext("2d")!;
// Circle
// If (!config.thick || config.thick && hasCount) {
ctx.beginPath();
ctx.arc(center, center, size / 2 - padding, 0, 2 * Math.PI, false);
ctx.fillStyle = backgroundColor;
ctx.fill();
ctx.lineWidth = size / (config.thick ? 10 : 20);
ctx.strokeStyle = backgroundColor;
ctx.stroke();
context.beginPath();
context.arc(center, center, size / 2 - padding, 0, 2 * Math.PI, false);
context.fillStyle = backgroundColor;
context.fill();
context.lineWidth = size / (config.thick ? 10 : 20);
context.strokeStyle = backgroundColor;
context.stroke();
// Count or Icon
if (hasCount) {
ctx.fillStyle = color;
ctx.textAlign = "center";
context.fillStyle = color;
context.textAlign = "center";
if (config.unreadCount > 99) {
ctx.font = `${config.thick ? "bold " : ""}${size * 0.4}px Helvetica`;
ctx.fillText("99+", center, center + size * 0.15);
context.font = `${config.thick ? "bold " : ""}${size * 0.4}px Helvetica`;
context.fillText("99+", center, center + size * 0.15);
} else if (config.unreadCount < 10) {
ctx.font = `${config.thick ? "bold " : ""}${size * 0.5}px Helvetica`;
ctx.fillText(String(config.unreadCount), center, center + size * 0.2);
context.font = `${config.thick ? "bold " : ""}${size * 0.5}px Helvetica`;
context.fillText(String(config.unreadCount), center, center + size * 0.2);
} else {
ctx.font = `${config.thick ? "bold " : ""}${size * 0.5}px Helvetica`;
ctx.fillText(String(config.unreadCount), center, center + size * 0.15);
context.font = `${config.thick ? "bold " : ""}${size * 0.5}px Helvetica`;
context.fillText(
String(config.unreadCount),
center,
center + size * 0.15,
);
}
}
@@ -114,12 +117,12 @@ const renderCanvas = function (arg: number): HTMLCanvasElement {
* @param arg: Unread count
* @return the native image
*/
const renderNativeImage = function (arg: number): NativeImage {
const renderNativeImage = function (argument: number): NativeImage {
if (process.platform === "win32") {
return nativeImage.createFromPath(winUnreadTrayIconPath());
}
const canvas = renderCanvas(arg);
const canvas = renderCanvas(argument);
const pngData = nativeImage
.createFromDataURL(canvas.toDataURL("image/png"))
.toPNG();
@@ -130,7 +133,7 @@ const renderNativeImage = function (arg: number): NativeImage {
function sendAction<Channel extends keyof RendererMessage>(
channel: Channel,
...args: Parameters<RendererMessage[Channel]>
...arguments_: Parameters<RendererMessage[Channel]>
): void {
const win = BrowserWindow.getAllWindows()[0];
@@ -138,7 +141,7 @@ function sendAction<Channel extends keyof RendererMessage>(
win.restore();
}
ipcRenderer.sendTo(win.webContents.id, channel, ...args);
ipcRenderer.send("forward-to", win.webContents.id, channel, ...arguments_);
}
const createTray = function (): void {
@@ -176,7 +179,7 @@ const createTray = function (): void {
};
export function initializeTray(serverManagerView: ServerManagerView) {
ipcRenderer.on("destroytray", (_event: Event) => {
ipcRenderer.on("destroytray", () => {
if (!tray) {
return;
}
@@ -189,22 +192,22 @@ export function initializeTray(serverManagerView: ServerManagerView) {
}
});
ipcRenderer.on("tray", (_event: Event, arg: number): void => {
ipcRenderer.on("tray", (_event, argument: number): void => {
if (!tray) {
return;
}
// We don't want to create tray from unread messages on macOS since it already has dock badges.
if (process.platform === "linux" || process.platform === "win32") {
if (arg === 0) {
unread = arg;
if (argument === 0) {
unread = argument;
tray.setImage(iconPath());
tray.setToolTip("No unread messages");
} else {
unread = arg;
const image = renderNativeImage(arg);
unread = argument;
const image = renderNativeImage(argument);
tray.setImage(image);
tray.setToolTip(`${arg} unread messages`);
tray.setToolTip(`${argument} unread messages`);
}
}
});

View File

@@ -1,5 +1,5 @@
import type {IpcRendererEvent} from "electron/renderer";
import {
type IpcRendererEvent,
ipcRenderer as untypedIpcRenderer, // eslint-disable-line no-restricted-imports
} from "electron/renderer";
@@ -10,8 +10,8 @@ import type {
} from "../../common/typed-ipc.js";
type RendererListener<Channel extends keyof RendererMessage> =
RendererMessage[Channel] extends (...args: infer Args) => void
? (event: IpcRendererEvent, ...args: Args) => void
RendererMessage[Channel] extends (...arguments_: infer Arguments) => void
? (event: IpcRendererEvent, ...arguments_: Arguments) => void
: never;
export const ipcRenderer: {
@@ -35,19 +35,25 @@ export const ipcRenderer: {
send<Channel extends keyof RendererMessage>(
channel: "forward-message",
rendererChannel: Channel,
...args: Parameters<RendererMessage[Channel]>
...arguments_: Parameters<RendererMessage[Channel]>
): void;
send<Channel extends keyof RendererMessage>(
channel: "forward-to",
webContentsId: number,
rendererChannel: Channel,
...arguments_: Parameters<RendererMessage[Channel]>
): void;
send<Channel extends keyof MainMessage>(
channel: Channel,
...args: Parameters<MainMessage[Channel]>
...arguments_: Parameters<MainMessage[Channel]>
): void;
invoke<Channel extends keyof MainCall>(
channel: Channel,
...args: Parameters<MainCall[Channel]>
...arguments_: Parameters<MainCall[Channel]>
): Promise<ReturnType<MainCall[Channel]>>;
sendSync<Channel extends keyof MainMessage>(
channel: Channel,
...args: Parameters<MainMessage[Channel]>
...arguments_: Parameters<MainMessage[Channel]>
): ReturnType<MainMessage[Channel]>;
postMessage<Channel extends keyof MainMessage>(
channel: Channel,
@@ -56,13 +62,8 @@ export const ipcRenderer: {
: never,
transfer?: MessagePort[],
): void;
sendTo<Channel extends keyof RendererMessage>(
webContentsId: number,
channel: Channel,
...args: Parameters<RendererMessage[Channel]>
): void;
sendToHost<Channel extends keyof RendererMessage>(
channel: Channel,
...args: Parameters<RendererMessage[Channel]>
...arguments_: Parameters<RendererMessage[Channel]>
): void;
} = untypedIpcRenderer;

View File

@@ -2,68 +2,78 @@ import fs from "node:fs";
import path from "node:path";
import {app, dialog} from "@electron/remote";
import * as Sentry from "@sentry/electron";
import * as Sentry from "@sentry/electron/renderer";
import {JsonDB} from "node-json-db";
import {DataError} from "node-json-db/dist/lib/Errors";
import * as z from "zod";
import {z} from "zod";
import * as EnterpriseUtil from "../../../common/enterprise-util.js";
import Logger from "../../../common/logger-util.js";
import * as Messages from "../../../common/messages.js";
import type {ServerConf} from "../../../common/types.js";
import * as t from "../../../common/translation-util.js";
import type {ServerConfig} from "../../../common/types.js";
import defaultIcon from "../../img/icon.png";
import {ipcRenderer} from "../typed-ipc-renderer.js";
const logger = new Logger({
file: "domain-util.log",
});
const defaultIconUrl = "../renderer/img/icon.png";
// For historical reasons, we store this string in domain.json to denote a
// missing icon; it does not change with the actual icon location.
export const defaultIconSentinel = "../renderer/img/icon.png";
const serverConfSchema = z.object({
url: z.string(),
const serverConfigSchema = z.object({
url: z.string().url(),
alias: z.string(),
icon: z.string(),
zulipVersion: z.string().default("unknown"),
zulipFeatureLevel: z.number().default(0),
});
let db!: JsonDB;
let database!: JsonDB;
reloadDb();
reloadDatabase();
// Migrate from old schema
try {
const oldDomain = db.getObject<unknown>("/domain");
const oldDomain = database.getObject<unknown>("/domain");
if (typeof oldDomain === "string") {
(async () => {
await addDomain({
alias: "Zulip",
url: oldDomain,
});
db.delete("/domain");
database.delete("/domain");
})();
}
} catch (error: unknown) {
if (!(error instanceof DataError)) throw error;
}
export function getDomains(): ServerConf[] {
reloadDb();
export function getDomains(): ServerConfig[] {
reloadDatabase();
try {
return serverConfSchema.array().parse(db.getObject<unknown>("/domains"));
return serverConfigSchema
.array()
.parse(database.getObject<unknown>("/domains"));
} catch (error: unknown) {
if (!(error instanceof DataError)) throw error;
return [];
}
}
export function getDomain(index: number): ServerConf {
reloadDb();
return serverConfSchema.parse(db.getObject<unknown>(`/domains[${index}]`));
export function getDomain(index: number): ServerConfig {
reloadDatabase();
return serverConfigSchema.parse(
database.getObject<unknown>(`/domains[${index}]`),
);
}
export function updateDomain(index: number, server: ServerConf): void {
reloadDb();
serverConfSchema.parse(server);
db.push(`/domains[${index}]`, server, true);
export function updateDomain(index: number, server: ServerConfig): void {
reloadDatabase();
serverConfigSchema.parse(server);
database.push(`/domains[${index}]`, server, true);
}
export async function addDomain(server: {
@@ -74,20 +84,20 @@ export async function addDomain(server: {
if (server.icon) {
const localIconUrl = await saveServerIcon(server.icon);
server.icon = localIconUrl;
serverConfSchema.parse(server);
db.push("/domains[]", server, true);
reloadDb();
serverConfigSchema.parse(server);
database.push("/domains[]", server, true);
reloadDatabase();
} else {
server.icon = defaultIconUrl;
serverConfSchema.parse(server);
db.push("/domains[]", server, true);
reloadDb();
server.icon = defaultIconSentinel;
serverConfigSchema.parse(server);
database.push("/domains[]", server, true);
reloadDatabase();
}
}
export function removeDomains(): void {
db.delete("/domains");
reloadDb();
database.delete("/domains");
reloadDatabase();
}
export function removeDomain(index: number): boolean {
@@ -95,8 +105,8 @@ export function removeDomain(index: number): boolean {
return false;
}
db.delete(`/domains[${index}]`);
reloadDb();
database.delete(`/domains[${index}]`);
reloadDatabase();
return true;
}
@@ -109,7 +119,7 @@ export function duplicateDomain(domain: string): boolean {
export async function checkDomain(
domain: string,
silent = false,
): Promise<ServerConf> {
): Promise<ServerConfig> {
if (!silent && duplicateDomain(domain)) {
// Do not check duplicate in silent mode
throw new Error("This server has been added.");
@@ -124,36 +134,43 @@ export async function checkDomain(
}
}
async function getServerSettings(domain: string): Promise<ServerConf> {
async function getServerSettings(domain: string): Promise<ServerConfig> {
return ipcRenderer.invoke("get-server-settings", domain);
}
export async function saveServerIcon(iconURL: string): Promise<string> {
return ipcRenderer.invoke("save-server-icon", iconURL);
return (
(await ipcRenderer.invoke("save-server-icon", iconURL)) ??
defaultIconSentinel
);
}
export async function updateSavedServer(
url: string,
index: number,
): Promise<void> {
): Promise<ServerConfig> {
// Does not promise successful update
const oldIcon = getDomain(index).icon;
const serverConfig = getDomain(index);
const oldIcon = serverConfig.icon;
try {
const newServerConf = await checkDomain(url, true);
const localIconUrl = await saveServerIcon(newServerConf.icon);
if (!oldIcon || localIconUrl !== "../renderer/img/icon.png") {
newServerConf.icon = localIconUrl;
updateDomain(index, newServerConf);
reloadDb();
const newServerConfig = await checkDomain(url, true);
const localIconUrl = await saveServerIcon(newServerConfig.icon);
if (!oldIcon || localIconUrl !== defaultIconSentinel) {
newServerConfig.icon = localIconUrl;
updateDomain(index, newServerConfig);
reloadDatabase();
}
return newServerConfig;
} catch (error: unknown) {
logger.log("Could not update server icon.");
logger.log(error);
Sentry.captureException(error);
return serverConfig;
}
}
function reloadDb(): void {
function reloadDatabase(): void {
const domainJsonPath = path.join(
app.getPath("userData"),
"config/domain.json",
@@ -175,7 +192,7 @@ function reloadDb(): void {
}
}
db = new JsonDB(domainJsonPath, true, true);
database = new JsonDB(domainJsonPath, true, true);
}
export function formatUrl(domain: string): string {
@@ -189,3 +206,30 @@ export function formatUrl(domain: string): string {
return `https://${domain}`;
}
export function getUnsupportedMessage(
server: ServerConfig,
): string | undefined {
if (server.zulipFeatureLevel < 65 /* Zulip Server 4.0 */) {
const realm = new URL(server.url).hostname;
return t.__(
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.",
{server: realm, version: server.zulipVersion},
);
}
return undefined;
}
export function iconAsUrl(iconPath: string): string {
if (iconPath === defaultIconSentinel) return defaultIcon;
try {
return `data:application/octet-stream;base64,${fs.readFileSync(
iconPath,
"base64",
)}`;
} catch {
return defaultIcon;
}
}

View File

@@ -15,7 +15,7 @@ export default class ReconnectUtil {
fibonacciBackoff: backoff.Backoff;
constructor(webview: WebView) {
this.url = webview.props.url;
this.url = webview.properties.url;
this.alreadyReloaded = false;
this.fibonacciBackoff = backoff.fibonacci({
initialDelay: 5000,

View File

@@ -1,7 +1,11 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en" class="responsive desktop">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta
http-equiv="Content-Security-Policy"
content="default-src 'none'; connect-src 'self'; font-src 'self'; img-src 'self' data:; script-src 'self'; style-src 'self' 'unsafe-inline'"
/>
<meta name="viewport" content="width=device-width" />
<title>Zulip</title>
<link rel="stylesheet" href="css/fonts.css" />

View File

@@ -1,7 +1,11 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en" class="responsive desktop">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta
http-equiv="Content-Security-Policy"
content="default-src 'none'; connect-src 'self'; img-src 'self'; script-src 'self'; style-src 'self'"
/>
<meta name="viewport" content="width=device-width" />
<title>Zulip - Network Troubleshooting</title>
<link

View File

@@ -1,10 +1,7 @@
<!DOCTYPE html>
<!doctype html>
<meta charset="UTF-8" />
<link rel="stylesheet" href="css/fonts.css" />
<link rel="stylesheet" href="css/preference.css" />
<script type="module">
import "@yaireo/tagify/dist/tagify.css";
</script>
<!-- Initially hidden to prevent FOUC -->
<div id="content" hidden>

View File

@@ -2,6 +2,76 @@
All notable changes to the Zulip desktop app are documented in this file.
### v5.11.0 --2024-03-22
**Fixes**:
- Removed the popup dialog for certificate errors when loading subresources such as images.
- Allowed hiding the window from full screen mode on macOS.
**Enhancements**:
- Enabled zooming with Ctrl+mouse wheel on Linux and Windows.
**Dependencies**:
- Upgraded all dependencies, including Electron 29.1.5.
### v5.10.5 --2024-01-25
**Dependencies**:
- Upgraded all dependencies, including Electron 28.2.0.
**Enhancements**:
- Improved security hardening by setting a Content-Security-Policy for the app UI.
### v5.10.4 --2024-01-09
**Dependencies**:
- Upgraded all dependencies, including Electron 28.1.1.
### v5.10.3 --2023-09-30
**Fixes**:
- Fixed an error in the third-party `gatemaker` library that broke the display of notifications for completed downloads.
**Dependencies**:
- Upgraded all dependencies, including Electron 25.8.4.
### v5.10.2 --2023-09-14
**Dependencies**:
- Downgraded Electron to 25.8.1 to avoid a renderer process crash on Linux.
### v5.10.1 --2023-09-13
**Dependencies**:
- Upgraded all dependencies, including Electron 26.2.1.
### v5.10.0 --2023-05-05
**Removed features**:
- Removed support for Windows 8.1 and earlier, which reached end-of-life earlier this year and are [no longer supported](https://www.electronjs.org/blog/windows-7-to-8-1-deprecation-notice) by Electron.
- Removed support for Zulip Server 3.x and earlier, which have been obsolete for more than 18 months, in accordance with our [release lifecycle](https://zulip.readthedocs.io/en/latest/overview/release-lifecycle.html). A notice will now be displayed when connecting to a server with an unsupported version.
**Fixes**:
- Fixed display of the dropdown for the spellchecker languages setting.
- Fixed various bugs related to displaying and updating organization icons.
- Fixed settings to disable visual display of notifications.
**Dependencies**:
- Upgraded all dependencies, including Electron 24.2.0.
### v5.9.5 --2023-02-06
**Fixes**:
@@ -193,10 +263,10 @@ All notable changes to the Zulip desktop app are documented in this file.
**New features**:
- Add a cancel button in the report-issue modal.
- macOS: Use electron API to get dark tray icon instead of the green icon for the light theme.
- macOS: Use Electron API to get dark tray icon instead of the green icon for the light theme.
- Remove 'Reset App Data' option. Factory Reset option has been moved to Settings → General.
- Support pkg installer on macOS.
- Use electron 8 built-in spellchecker. Linux and Windows users can now choose upto three spellchecker languages from Settings → General. On macOS, default spellchecker is used.
- Use Electron 8 built-in spellchecker. Linux and Windows users can now choose up to three spellchecker languages from Settings → General. On macOS, default spellchecker is used.
- Setup Transifex for better synchronization of translations. The application now supports 41 languages instead of 21.
**Dependencies**:
@@ -304,7 +374,7 @@ All notable changes to the Zulip desktop app are documented in this file.
- Document enterprise configuration features.
- Update the Electron tutorial guide.
- Explicitly address where to report bugs in `README.md`.
- Fix typo in the link to server/webapp repository in `README.md`.
- Fix typo in the link to server/web app repository in `README.md`.
- Add documentation for translation.
### v4.0.0 --2019-08-08
@@ -355,7 +425,7 @@ All notable changes to the Zulip desktop app are documented in this file.
**Development**:
- Migrate codebase to TypeScript.
- Set the indent_size in `.editconfig` to 4.
- Set the indent_size in `.editorconfig` to 4.
- Use `.env` file for reading Sentry DSN.
**Documentation**:
@@ -424,7 +494,7 @@ All notable changes to the Zulip desktop app are documented in this file.
- Fix typo in network error message.
- Fix context menu not working on adding new org.
- Fix reply from notification.
- Fix shorcut section horizontal alignment.
- Fix shortcut section horizontal alignment.
- Fix broken link in docs.
- Fix grammatical errors.
- Fix typo error in issue template.
@@ -463,7 +533,7 @@ All notable changes to the Zulip desktop app are documented in this file.
- Auto hide menubar on Windows/Linux. Add a setting option for the same.
- Improve design of setting page.
- Toggle app on clicking the tray icon (Linux).
- Update sidebar realm name when it's changed in webapp.
- Update sidebar realm name when it's changed in web app.
- left-sidebar: Add initial character of realm name instead of default icon.
**Fixes**:
@@ -500,7 +570,7 @@ All notable changes to the Zulip desktop app are documented in this file.
**Fixes**:
- Fix youtube video not playing in lightbox.
- Fix YouTube video not playing in lightbox.
- Fix realm name not escaped properly.
<hr>
@@ -510,7 +580,7 @@ All notable changes to the Zulip desktop app are documented in this file.
**New features**:
- Add a setting option to show downloaded file in file manager.
- Added electron bridge to communicate with webapp in real time.
- Added Electron bridge to communicate with web app in real time.
**Fixes**:
@@ -623,7 +693,7 @@ electron-updater - `v2.21.8`
- Add an option to download the file attachments instead of opening it in the browser
- Open image link in webapp lightbox
- Open image link in web app lightbox
- Add scrollbar for list of organizations on overflow
@@ -660,7 +730,7 @@ electron-updater - `v2.21.8`
- Some users wanted to change the look of the Zulip. Now you have the power. Feel free to add your own CSS using the all-new setting option **Add Custom CSS**
- Added i18n locale helper script. Internalization is coming in the next release
- Added i18n locale helper script. Internationalization is coming in the next release
- Added **What's new** in `help` submenu so that you can see all the latest changes in the app
@@ -1102,7 +1172,7 @@ Minor improvements
- Using two package.json structure
- Node integration disabled in main window due to jquery error
- Node integration disabled in main window due to jQuery error
- Now using electron-builder for packaging instead of electron-packager

View File

@@ -49,7 +49,7 @@ If [NPM](https://www.npmjs.com/get-npm) and [node-gyp](https://github.com/nodejs
[node-windows]: https://nodejs.org/en/download/package-manager/#windows
- Also, install install Windows-Build-Tools to compile native node modules by using
- Also, install Windows-Build-Tools to compile native node modules by using
```sh
$ npm install --global windows-build-tools
```

View File

@@ -5,13 +5,13 @@
- [Git](http://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
- [Node.js](https://nodejs.org) >= v6.9.0
- [python](https://www.python.org/downloads/release/python-2713/) (v2.7.x recommended)
- [node-gyp](https://github.com/nodejs/node-gyp#installation) (installed via powershell)
- [node-gyp](https://github.com/nodejs/node-gyp#installation) (installed via PowerShell)
## System specific dependencies
- use only 32bit or 64bit for all of the installers, do not mix architectures
- install using default settings
- open Windows Powershell as Admin
- open Windows PowerShell as Admin
```powershell
C:\Windows\system32> npm install --global --production windows-build-tools

7824
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{
"name": "zulip",
"productName": "Zulip",
"version": "5.9.5",
"version": "5.11.0",
"main": "./dist-electron",
"description": "Zulip Desktop App",
"license": "Apache-2.0",
@@ -28,7 +28,7 @@
"lint-css": "stylelint \"app/**/*.css\"",
"lint-html": "htmlhint \"app/**/*.html\"",
"lint-js": "xo",
"prettier-non-js": "prettier --check --loglevel=warn . \"!**/*.{js,ts}\"",
"prettier-non-js": "prettier --check --log-level=warn . \"!**/*.{js,ts}\"",
"test": "tsc && npm run lint-html && npm run lint-css && npm run lint-js && npm run prettier-non-js",
"test-e2e": "vite build && tape \"tests/**/*.js\"",
"pack": "vite build && electron-builder --dir",
@@ -39,7 +39,6 @@
"test"
],
"build": {
"afterSign": "./scripts/notarize.js",
"appId": "org.zulip.zulip-electron",
"asar": true,
"asarUnpack": [
@@ -68,7 +67,10 @@
}
],
"darkModeSupport": true,
"artifactName": "${productName}-${version}-${arch}.${ext}"
"artifactName": "${productName}-${version}-${arch}.${ext}",
"notarize": {
"teamId": "66KHCWMEYB"
}
},
"linux": {
"category": "Chat;GNOME;GTK;Network;InstantMessaging",
@@ -141,49 +143,46 @@
"InstantMessaging"
],
"dependencies": {
"gatemaker": "^1.0.0"
"gatemaker": "https://github.com/andersk/gatemaker/archive/d31890ae1cb293faabcb1e4e465c673458f6eed2.tar.gz"
},
"devDependencies": {
"@electron/notarize": "^1.2.3",
"@electron/remote": "^2.0.8",
"@sentry/core": "^7.94.1",
"@sentry/electron": "^4.1.2",
"@types/adm-zip": "^0.5.0",
"@types/auto-launch": "^5.0.2",
"@types/backoff": "^2.5.2",
"@types/i18n": "^0.13.1",
"@types/node": "^16.11.26",
"@types/node": "^20.11.30",
"@types/requestidlecallback": "^0.3.4",
"@types/yaireo__tagify": "^4.3.2",
"@yaireo/tagify": "^4.5.0",
"adm-zip": "^0.5.5",
"auto-launch": "^5.0.5",
"backoff": "^2.5.0",
"dotenv": "^16.0.0",
"electron": "^22.0.0",
"electron-builder": "^23.0.3",
"electron-log": "^4.3.5",
"electron-updater": "^5.0.1",
"electron": "^29.1.5",
"electron-builder": "^24.6.4",
"electron-log": "^5.0.3",
"electron-updater": "^6.1.4",
"electron-window-state": "^5.0.3",
"escape-goat": "^4.0.0",
"get-stream": "^6.0.1",
"htmlhint": "^1.1.2",
"i18n": "^0.15.1",
"iso-639-1": "^2.1.9",
"iso-639-1": "^3.1.0",
"medium": "^1.2.0",
"node-json-db": "^1.3.0",
"playwright-core": "^1.30.0-alpha-jan-3-2023",
"playwright-core": "^1.41.0-alpha-jan-9-2024",
"pre-commit": "^1.2.2",
"prettier": "^2.3.2",
"rimraf": "^4.1.2",
"prettier": "^3.0.3",
"rimraf": "^5.0.0",
"semver": "^7.3.5",
"stylelint": "^14.5.3",
"stylelint-config-prettier": "^9.0.3",
"stylelint-config-standard": "^29.0.0",
"stylelint": "^16.1.0",
"stylelint-config-standard": "^36.0.0",
"tape": "^5.2.2",
"typescript": "^4.3.5",
"vite": "^4.1.1",
"vite-plugin-electron": "^0.11.1",
"xo": "^0.53.1",
"typescript": "^5.0.4",
"vite": "^5.0.11",
"vite-plugin-electron": "^0.28.0",
"xo": "^0.58.0",
"zod": "^3.5.1"
},
"prettier": {
@@ -241,6 +240,10 @@
"error",
{
"paths": [
{
"name": "@sentry/electron",
"message": "Use @sentry/electron/main, @sentry/electron/renderer, or @sentry/core."
},
{
"name": "electron",
"message": "Use electron/main, electron/renderer, or electron/common."
@@ -258,6 +261,10 @@
"ipcRenderer"
],
"message": "Use typed-ipc-renderer."
},
{
"name": "electron-log",
"message": "Use electron-log/main or electron-log/renderer."
}
]
}
@@ -270,7 +277,6 @@
}
],
"strict": "error",
"unicorn/prefer-json-parse-buffer": "off",
"unicorn/prefer-module": "off",
"unicorn/prefer-top-level-await": "off"
},
@@ -303,7 +309,6 @@
},
{
"files": [
"app/renderer/js/injected.ts",
"scripts/notarize.js",
"tests/**/*.js"
],

View File

@@ -1,45 +1,49 @@
{
"About Zulip": "حول \"زوليب\"",
"Actual Size": "الحجم الفعلي",
"Add Custom Certificates": "إضافة رخصة معدلة",
"Add Organization": "إضافة منظمة",
"Add a Zulip organization": "إضافة منظمة \"زوليب\"",
"Add custom CSS": صافة CSS معدلة",
"Add custom CSS": ضافة CSS معدلة",
"AddServer": "AddServer",
"Advanced": "متقدم",
"All the connected organizations will appear here": "جميع المنظمات المتصلة تعرض هنا",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "دائماً إبدأ بالقليل",
"App Updates": "تحديث التطبيق",
"App Updates": "تحديثات التطبيق",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "المظهر",
"Application Shortcuts": "إختصارات التطبيق",
"Are you sure you want to disconnect this organization?": "هل أنت متأكد من فصل هذة المنظمة؟",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "أخف القائمة تلقائياً",
"Auto hide menu bar (Press Alt key to display)": "أخف القائمة تلقائياً (إضغط Alt لعرض القائمة)",
"Back": "رجوع",
"Bounce dock on new private message": "أخرج المنصة في حال رسالة خاصة جديدة",
"Certificate file": "ملف الشهادة",
"Change": "تغيير",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "التحقق من التحديثات",
"Close": "اغلاق",
"Close": "إغلاق",
"Connect": "اتصال",
"Connect to another organization": "التوصيل مع منظمة أخرى",
"Connected organizations": "المنظمات المتصلة",
"Copy": "نسخ",
"Copy Zulip URL": "نسخ رابط زوليب",
"Create a new organization": "Create a new organization",
"Create a new organization": "إنشاء منظمة جديدة",
"Cut": "قص",
"Default download location": "موقع التحميل الافتراضي",
"Delete": "حذف",
"Desktop App Settings": "إعدادت تطبيق سطح المكتب",
"Desktop Notifications": "إشعارات سطح المكتب",
"Desktop Settings": "إعدادات سطح المكتب",
"Disconnect": "قطع الاتصال",
"Download App Logs": "تنزيل سجلات التطبيق",
"Edit": "تعديل",
"Edit Shortcuts": "تعديل الاختصارات",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "تفعيل التحديثات التلقائية",
"Enable error reporting (requires restart)": "تفعيل تقارير الأخطاء (يتطلب إعادة التشغيل)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "إعادة ضبط المصنع",
"Factory Reset Data": "Factory Reset Data",
"File": "ملف",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
@@ -51,6 +55,9 @@
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
@@ -106,29 +118,10 @@
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

127
public/translations/be.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "Пра Zulip",
"Actual Size": "Сапраўдны памер",
"Add Organization": "Дадаць арганізацыю",
"Add a Zulip organization": "Дадаць арганізацыю Zulip",
"Add custom CSS": "Дадаць свой CSS",
"AddServer": "Дадаць сэрвер",
"Advanced": "Пашыраныя",
"All the connected organizations will appear here.": "Тут з'явяцца ўсе звязаныя арганізацыі.",
"Always start minimized": "Заўсёды адкрываць згорнутым",
"App Updates": "Абнаўленні праграмы",
"App language (requires restart)": "Мова праграмы (патрабуецца перазапуск)",
"Appearance": "Выгляд",
"Application Shortcuts": "Спалучэнні клавішаў",
"Are you sure you want to disconnect this organization?": "Вы ўпэўненыя, што хочаце адключыць гэту арганізацыю?",
"Ask where to save files before downloading": "Спытаць, куды захоўваць файлы перад сцягваннем",
"Auto hide Menu bar": "Аўтаматычна хаваць радок меню",
"Auto hide menu bar (Press Alt key to display)": "Аўтаматычна хаваць радок меню (для выявы націсніце клавішу Alt)",
"Back": "Назад",
"Bounce dock on new private message": "Подпрыгваючы dock пры новым асабістым паведамленні",
"Change": "Змяніць",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Змяніце мову ў: Сістэмныя налады → Клавіятура → Тэкст → Правапіс.",
"Check for Updates": "Праверыць наяўнасць абнаўленняў",
"Close": "Закрыць",
"Connect": "Падлучыць",
"Connect to another organization": "Падлучыць да іншай арганізацыі",
"Connected organizations": "Падлучаныя арганізацыі",
"Copy": "Капіяваць",
"Copy Zulip URL": "Капіяваць Zulip URL",
"Create a new organization": "Стварыць новую арганізацыю",
"Cut": "Выразаць",
"Default download location": "Месца сцягвання па змаўчанні",
"Delete": "Выдаліць",
"Desktop Notifications": "Апавяшчэнні для ПК",
"Desktop Settings": "Налады для ПК",
"Disconnect": "Адлучыць",
"Download App Logs": "Сцягнуць журналы праграмаў",
"Edit": "Рэдагаваць",
"Edit Shortcuts": "Рэдагаваць cпалучэнні клавішаў",
"Emoji & Symbols": "Эмодзі і сімвалы",
"Enable auto updates": "Увамкнуць аўтаматычнае абнаўленне",
"Enable error reporting (requires restart)": "Увамкнуць справаздачу аб памылках (патрабуецца перазапуск)",
"Enable spellchecker (requires restart)": "Увамкнуць праверку правапісу (патрабуецца перазапуск)",
"Enter Full Screen": "Пераход у поўнаэкранны рэжым",
"Factory Reset": "Аднаўленне заводскіх наладаў",
"Factory Reset Data": "Аднаўленне даных да заводскіх наладаў",
"File": "Файл",
"Find accounts": "Знайсці ўліковыя запісы",
"Find accounts by email": "Знайсці ўліковыя запісы паводле email",
"Flash taskbar on new message": "Успыхваць на панэлі заданняў пры новым асабістым паведамленні ",
"Forward": "Пераадрасаваць",
"Functionality": "Функцыянальнасць",
"General": "Агульныя",
"Get beta updates": "Атрымлівць бэта-абнаўленні",
"Hard Reload": "Апаратнае пераладаванне",
"Help": "Даведка",
"Help Center": "Цэнтр даведак",
"Hide": "Схаваць",
"Hide Others": "Схаваць іншыя",
"Hide Zulip": "Схаваць Zulip",
"History": "Гісторыя",
"History Shortcuts": "Гісторыя cпалучэнняў клавішаў",
"Keyboard Shortcuts": "Спалучэнні клавішаў",
"Log Out": "Выйсці з уліковага запісу",
"Log Out of Organization": "Выйсці з уліковага запісу арганізацыі",
"Manual proxy configuration": "Ручная налада проксі",
"Minimize": "Згарнуць",
"Mute all sounds from Zulip": "Адключыць усе гукі з Zulip",
"NO": "NO",
"Network": "Сетка",
"Network and Proxy Settings": "Налады сеткі і проксі",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "У macOS выкарыстоўваецца сістэмная праверка правапісу.",
"Organization URL": "URL арганізацыі",
"Organizations": "Арганізацыі",
"Paste": "Уставіць",
"Paste and Match Style": "Уставіць і ўзгадніць стыль",
"Proxy": "Проксі",
"Proxy bypass rules": "Правілы абыходу проксі",
"Proxy rules": "Правілы проксі",
"Quit": "Выйсці",
"Quit Zulip": "Выйсці з Zulip",
"Quit when the window is closed": "Выйсці, калі акно зачыненае",
"Redo": "Узнавіць",
"Release Notes": "Заўвагі да выпуску",
"Reload": "Пераладаваць",
"Report an Issue": "Паведаміць аб праблеме",
"Reset App Settings": "Скінуць налады праграмы",
"Reset the application, thus deleting all the connected organizations and accounts.": "Скінуць усю праграму, выдаліўшы такім чынам усе звязаныя арганізацыі і ўліковыя запісы.",
"Save": "Захаваць",
"Select All": "Выбраць усё",
"Services": "Сэрвісы",
"Settings": "Налады",
"Shortcuts": "Спалучэнні клавішаў",
"Show app icon in system tray": "Паказаць значок праграмы ў вобласці паведамленняў",
"Show app unread badge": "Паказваць значок непрачытаных паведамленняў",
"Show desktop notifications": "Паказваць апавяшчэнні на працоўным стале",
"Show sidebar": "Паказваць бакавую панэль",
"Spellchecker Languages": "Мовы для праверкі правапісу",
"Start app at login": "Запусціць праграму пры ўваходзе ва ўліковы запіс",
"Switch to Next Organization": "Пераключыцца на наступную арганізацыю",
"Switch to Previous Organization": "Пераключыцца на папярэднюю арганізацыю",
"These desktop app shortcuts extend the Zulip webapp's": "Гэтыя спалучэнні клавішаў пашыраюць магчымасці Zulip",
"Tip": "Парада",
"Toggle DevTools for Active Tab": "Увамкнуць DevTools для актыўнай укладкі",
"Toggle DevTools for Zulip App": "Перамкнуць DevTools для праграмы Zulip",
"Toggle Do Not Disturb": "Перамкнуць рэжым \"Не турбаваць\"",
"Toggle Full Screen": "Перамкнуць \"На ўвесь экран\"",
"Toggle Sidebar": "Перамкнуць бакавую панэль",
"Toggle Tray Icon": "Перамкнуць значок у вобласці паведамленняў",
"Tools": "Інструменты",
"Undo": "Адрабіць",
"Unhide": "Зрабіць бачным",
"Upload": "Заладаваць",
"Use system proxy settings (requires restart)": "Выкарыстоўваць сістэмныя налады проксі (патрабуе перазапуск)",
"View": "Прагляд",
"View Shortcuts": "Спалучэнні клавішаў прагляду",
"Window": "Акно",
"Window Shortcuts": "Спалучэнні клавішаў акна",
"YES": "ТАК",
"You can select a maximum of 3 languages for spellchecking.": "Вы можаце выбраць максімум 3 мовы для праверкі правапісу.",
"Zoom In": "Павялічыць",
"Zoom Out": "Паменшыць",
"keyboard shortcuts": "спалучэнні клавішаў",
"script": "скрыпт",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "На {{{server}}} працуе састарэлая версія сервера Zulip {{{version}}}. У гэтай праграме ён можа працаваць часткова."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "Относно Zulip",
"Actual Size": "Действителен размер",
"Add Custom Certificates": "Добавяне на персонализирани сертификати",
"Add Organization": "Добавяне на организация",
"Add a Zulip organization": "Добавете организация Zulip",
"Add custom CSS": "Добавете персонализиран CSS",
"AddServer": "AddServer",
"Advanced": "напреднал",
"All the connected organizations will appear here": "Всички свързани организации ще се появят тук",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Винаги започвайте да минимизирате",
"App Updates": "Актуализации на приложения",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Външен вид",
"Application Shortcuts": "Клавишни комбинации за приложения",
"Are you sure you want to disconnect this organization?": "Наистина ли искате да прекъснете връзката с тази организация?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Автоматично скриване на лентата с менюта",
"Auto hide menu bar (Press Alt key to display)": "Автоматично скриване на лентата с менюта (натиснете клавиша Alt за показване)",
"Back": "обратно",
"Bounce dock on new private message": "Прескочи док в новото лично съобщение",
"Certificate file": "Файл за сертификат",
"Change": "промяна",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Провери за обновления",
"Close": "Близо",
"Connect": "Свържете",
@@ -29,17 +31,19 @@
"Cut": "Разрез",
"Default download location": "Място на изтегляне по подразбиране",
"Delete": "Изтрий",
"Desktop App Settings": "Настройки на приложението за работния плот",
"Desktop Notifications": "Известия за работния плот",
"Desktop Settings": "Настройки на работния плот",
"Disconnect": "Прекъсване на връзката",
"Download App Logs": "Изтеглете регистрационни файлове на приложенията",
"Edit": "редактиране",
"Edit Shortcuts": "Редактиране на преки пътища",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Активиране на автоматичните актуализации",
"Enable error reporting (requires restart)": "Активиране на отчитането за грешки (изисква се рестартиране)",
"Enable spellchecker (requires restart)": "Активиране на проверката на правописа (изисква се рестартиране)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Фабрично нулиране",
"Factory Reset Data": "Factory Reset Data",
"File": "досие",
"Find accounts": "Намерете профили",
"Find accounts by email": "Намерете профили по имейл",
@@ -51,6 +55,9 @@
"Hard Reload": "Hard Reload",
"Help": "Помогне",
"Help Center": "Помощен център",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "история",
"History Shortcuts": "Преки пътища в историята",
"Keyboard Shortcuts": "Комбинация от клавиши",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Заглуши всички звуци от Zulip",
"NO": "НЕ",
"Network": "мрежа",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "ИЛИ",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "URL адрес на организацията",
"Organizations": "организации",
"Paste": "паста",
@@ -71,25 +80,27 @@
"Proxy rules": "Прокси правила",
"Quit": "напускам",
"Quit Zulip": "Прекрати Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "ремонтирам",
"Release Notes": "Бележки към изданието",
"Reload": "Презареди",
"Report an Issue": "Подаване на сигнал за проблем",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Запази",
"Select All": "Избери всички",
"Services": "Services",
"Settings": "Настройки",
"Shortcuts": "Shortcuts",
"Show App Logs": "Показване на регистрационните файлове на приложенията",
"Show app icon in system tray": "Показване на иконата на приложението в системната област",
"Show app unread badge": "Показване на непрочетената значка на приложението",
"Show desktop notifications": "Показване на известията на работния плот",
"Show downloaded files in file manager": "Показване на изтеглените файлове във файловия мениджър",
"Show sidebar": "Показване на страничната лента",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Стартирайте приложението при влизане",
"Switch to Next Organization": "Превключване към следваща организация",
"Switch to Previous Organization": "Превключване към предишна организация",
"These desktop app shortcuts extend the Zulip webapp's": "Тези клавишни комбинации за настолни приложения разширяват webapp на Zulip",
"This will delete all application data including all added accounts and preferences": "Това ще изтрие всички данни за приложения, включително всички добавени акаунти и предпочитания",
"Tip": "Бакшиш",
"Toggle DevTools for Active Tab": "Превключете DevTools за Active Tab",
"Toggle DevTools for Zulip App": "Превключете DevTools за Zulip App",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Превключете иконата на тава",
"Tools": "Инструменти",
"Undo": "премахвам",
"Unhide": "Unhide",
"Upload": "Качи",
"Use system proxy settings (requires restart)": "Използване на системните прокси настройки (изисква рестартиране)",
"View": "изглед",
@@ -106,29 +118,10 @@
"Window": "прозорец",
"Window Shortcuts": "Клавишни комбинации",
"YES": "ДА",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Увеличавам",
"Zoom Out": "Отдалечавам",
"Zulip Help": "Помощ за Zulip",
"keyboard shortcuts": "комбинация от клавиши",
"script": "писменост",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

127
public/translations/bn.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "যুলিপ সম্পর্কে ",
"Actual Size": "প্রকৃত সাইজ ",
"Add Organization": "সংস্থা যুক্ত করুন",
"Add a Zulip organization": "একটি যুলিপ প্রতিষ্ঠান যুক্ত করুন",
"Add custom CSS": "কাস্টম সিএসএস যুক্ত করুন",
"AddServer": "এড সার্ভার ",
"Advanced": "অগ্রসর ",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "সব সময় মিনিমাইজড ভাবে শুরু করুন ",
"App Updates": "অ্যাপ আপডেট",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "প্রকাশ",
"Application Shortcuts": "অ্যাপ্লিকেশান শর্টকাট ",
"Are you sure you want to disconnect this organization?": "আপনি কি নিশ্চিত যে আপনি এই সংস্থার সংযোগ বিচ্ছিন্ন করতে চান ?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "অটো মেনুবার হাইড করুন ",
"Auto hide menu bar (Press Alt key to display)": "অটো মেনুবার হাইড করুন (দেখার জন্য অল্টার কি চাপুন)",
"Back": "পেছন",
"Bounce dock on new private message": "ব্যাক্তিগত মেসেজে ডক বাউন্স করুন ",
"Change": "পরিবর্তন",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "ভাষা পরিবর্তন করতে সিস্টেম প্রেফারেন্স → কীবোর্ড → টেক্সট → স্পেলিং এ যান ",
"Check for Updates": "আপডেট চেক করুন",
"Close": "বন্ধ করুন",
"Connect": "সংযুক্ত করুন",
"Connect to another organization": "অন্য একটি সংস্থার সাথে সংযুক্ত করুন",
"Connected organizations": "সংযুক্ত সংস্থা সমূহ ",
"Copy": "কপি",
"Copy Zulip URL": "যুলিপ ইউআরএল কপি করুন ",
"Create a new organization": "নতুন সংস্থা তৈরি করুন ",
"Cut": "কাট ",
"Default download location": "Default download location",
"Delete": "ডিলিট",
"Desktop Notifications": "ডেস্কটপ নোটিফিকেশান ",
"Desktop Settings": "ডেস্কটপ সেটিংস",
"Disconnect": "সংযোগ বিছিন্ন করুন",
"Download App Logs": "অ্যাপ লগ ডাউনলোড করুন ",
"Edit": "এডিট",
"Edit Shortcuts": "শর্টকাটগুলো এডিট করুন ",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "অটো আপডেট চালু করুন",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "ফ্যাক্টরি রিসেট",
"Factory Reset Data": "Factory Reset Data",
"File": "ফাইল",
"Find accounts": "অ্যাকাউন্ট খুজুন",
"Find accounts by email": "ইমেইল ব্যাবহার করে অ্যাকাউন্ট খুজুন",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "ফরওয়ার্ড",
"Functionality": "Functionality",
"General": "সাধারন",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Help": "সাহায্য",
"Help Center": "সাহায্য কেন্দ্র",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "ইতিহাস",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "লগ আউট",
"Log Out of Organization": "সংস্থা থেকে লগ আউট করুন",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "ছোট করুন",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "না",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "অথবা",
"On macOS, the OS spellchecker is used.": "ম্যাক ওএস এ , ওএস এর স্পেলচেকার ব্যাবহার করা হয় ।",
"Organization URL": "Organization URL",
"Organizations": "সংস্থাসমূহ",
"Paste": "Paste",
"Paste and Match Style": "Paste and Match Style",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "সেভ",
"Select All": "Select All",
"Services": "Services",
"Settings": "সেটিংস",
"Shortcuts": "শর্টকাট সমূহ",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"Tip": "টিপ",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "অ্যান্ডু ",
"Unhide": "Unhide",
"Upload": "আপলোড",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
"View Shortcuts": "View Shortcuts",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "হ্যাঁ",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "জুম আউট",
"keyboard shortcuts": "keyboard shortcuts",
"script": "স্ক্রিপ্ট ",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -0,0 +1,127 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Change": "ālêštkâri",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "bastên",
"Connect": "Connect",
"Connect to another organization": "Connect to another organization",
"Connected organizations": "Connected organizations",
"Copy": "Copy",
"Copy Zulip URL": "Copy Zulip URL",
"Create a new organization": "Create a new organization",
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "pāk kerdên",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "ālêšt",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "fāyl",
"Find accounts": "jostên hêsāvā mêntori",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Functionality": "Functionality",
"General": "General",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out of Organization",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
"Paste and Match Style": "Paste and Match Style",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "zaft kerdên",
"Select All": "Select All",
"Services": "Services",
"Settings": "sāmovā",
"Shortcuts": "Shortcuts",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
"View Shortcuts": "View Shortcuts",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "Quant a Zulip",
"Actual Size": "Actual Size",
"Add Custom Certificates": "Add Custom Certificates",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here": "All the connected organizations will appear here",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certificate file",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Tancar",
"Connect": "Connect",
@@ -29,17 +31,19 @@
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Elimina",
"Desktop App Settings": "Configuració de l'aplicació d'escriptori",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Configuració d'escriptori",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edita",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "Fitxer",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
@@ -48,20 +52,25 @@
"Functionality": "Functionality",
"General": "General",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Hard Reload": "Recàrrega forçada",
"Help": "Help",
"Help Center": "Centre d'ajuda",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "Historial",
"History Shortcuts": "Dreceres d'historial",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out of Organization",
"Log Out": "Tanca la sessió",
"Log Out of Organization": "Tanca la sessió de l'organització",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Silencia tots els sons de Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "URL d'organització",
"Organizations": "Organizations",
"Paste": "Paste",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Reload": "Recarrega",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reinicia la configuració de l'aplicació",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Guardar",
"Select All": "Select All",
"Services": "Services",
"Settings": "Configuració",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Mostrar una marca en la icona si hi ha missatges no llegits",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Pujada",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
@@ -106,29 +118,10 @@
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "O Zulipu",
"Actual Size": "Skutečná velikost",
"Add Custom Certificates": "Přidat vlastní certifikáty",
"Add Organization": "Přidat organizaci",
"Add a Zulip organization": "Přidat organizaci Zulip",
"Add custom CSS": "Přidat vlastní CSS",
"AddServer": "Přidat server",
"Advanced": "Rozšířené",
"All the connected organizations will appear here": "Všechny připojené organizace se objeví zde",
"All the connected organizations will appear here.": "Všechny připojené organizace se objeví zde.",
"Always start minimized": "Vždy spouštět minimalizované",
"App Updates": "Aktualizace aplikace",
"App language (requires restart)": "Jazyk programu (vyžaduje opětovné spuštění programu)",
"Appearance": "Vzhled",
"Application Shortcuts": "Zkratky programu",
"Are you sure you want to disconnect this organization?": "Opravdu chcete odpojit tuto organizaci?",
"Ask where to save files before downloading": "Před stažením se zeptat kam uložit soubory",
"Auto hide Menu bar": "Automaticky skrývat menu",
"Auto hide menu bar (Press Alt key to display)": "Automaticky skrývat menu (pro zobrazení stiskněte klávesu Alt)",
"Back": "Zpět",
"Bounce dock on new private message": "Poskakování ikony v docku po obdržení nové soukromé zprávy",
"Certificate file": "Soubor s certifikátem",
"Change": "Změnit",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Změnit jazyk v Nastavení systému → Klávesnice → Text → Kontrola pravopisu.",
"Check for Updates": "Zkontrolovat aktualizace",
"Close": "Zavřít",
"Connect": "Připojit se",
@@ -29,17 +31,19 @@
"Cut": "Vyjmout",
"Default download location": "Výchozí umístění stahování",
"Delete": "Smazat",
"Desktop App Settings": "Nastavení desktopové aplikace",
"Desktop Notifications": "Oznámení na ploše",
"Desktop Settings": "Nastavení plochy",
"Disconnect": "Odpojit",
"Download App Logs": "Stáhnout záznamy programu",
"Edit": "Upravit",
"Edit Shortcuts": "Upravit zkratky",
"Emoji & Symbols": "Obrázečky a zvláštní znaky",
"Enable auto updates": "Povolit automatické aktualizace",
"Enable error reporting (requires restart)": "Povolit hlášení chyb (vyžaduje opětovné spuštění programu)",
"Enable spellchecker (requires restart)": "Povolit kontrolu pravopisu (vyžaduje opětovné spuštění programu)",
"Enter Full Screen": "Vstoupit na celou obrazovku",
"Factory Reset": "Obnovení do továrního nastavení",
"Factory Reset Data": "Obnovení dat do továrního nastavení",
"File": "Soubor",
"Find accounts": "Najít účty",
"Find accounts by email": "Najít účty podle adresy elektronické pošty",
@@ -51,6 +55,9 @@
"Hard Reload": "Tvrdé znovunahrání",
"Help": "Nápověda",
"Help Center": "Centrum nápovědy",
"Hide": "Skrýt",
"Hide Others": "Skrýt jiné",
"Hide Zulip": "Skrýt Zulip",
"History": "Historie",
"History Shortcuts": "Zkratky pro historii",
"Keyboard Shortcuts": "Klávesové zkratky",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Ztlumit všechny zvuky ze Zulipu",
"NO": "NE",
"Network": "Síť",
"Network and Proxy Settings": "Nastavení sítě a proxy serveru",
"OR": "NEBO",
"On macOS, the OS spellchecker is used.": "Na macOS se používá kontrola pravopisu OS.",
"Organization URL": "Adresa organizace",
"Organizations": "Organizace",
"Paste": "Vložit",
@@ -71,25 +80,27 @@
"Proxy rules": "Pravidla Proxy",
"Quit": "Ukončit",
"Quit Zulip": "Ukončit Zulip",
"Quit when the window is closed": "Ukončit, když je okno zavřeno",
"Redo": "Znovu",
"Release Notes": "Poznámky k této verzi",
"Reload": "Nahrát znovu",
"Report an Issue": "Nahlásit problém",
"Reset App Settings": "Obnovit výchozí nastavení programu",
"Reset the application, thus deleting all the connected organizations and accounts.": "Obnovit program do výchozího nastavení. čili smazat všechny připojené organizace a účty.",
"Save": "Uložit",
"Select All": "Vybrat vše",
"Services": "Služby",
"Settings": "Nastavení",
"Shortcuts": "Zkratky",
"Show App Logs": "Zobrazit záznamy programu",
"Show app icon in system tray": "Zobrazovat ikonu programu v oznamovací oblasti panelu",
"Show app unread badge": "Zobrazovat u ikony aplikace symbol nepřečteno",
"Show desktop notifications": "Zobrazovat oznámení na ploše",
"Show downloaded files in file manager": "Zobrazit stažené soubory ve správci souborů",
"Show sidebar": "Zobrazovat postranní panel",
"Spellchecker Languages": "Kontrola pravopisu jazyků",
"Start app at login": "Spustit program při přihlášení",
"Switch to Next Organization": "Přepnout na další organizaci",
"Switch to Previous Organization": "Přepnout na předchozí organizaci",
"These desktop app shortcuts extend the Zulip webapp's": "Tyto zkratky rozšiřují webovou aplikaci Zulipu",
"This will delete all application data including all added accounts and preferences": "Toto smaže všechna data programu včetně všech přidaných účtů a nastavení",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Přepnout vývojářské nástroje pro aktivní kartu",
"Toggle DevTools for Zulip App": "Přepnout vývojářské nástroje pro program Zulip",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Přepnout ikonu v oznamovací oblasti panelu",
"Tools": "Nástroje",
"Undo": "Zpět",
"Unhide": "Zobrazit",
"Upload": "Nahrát",
"Use system proxy settings (requires restart)": "Použít systémová nastavení proxy (vyžaduje opětovné spuštění programu)",
"View": "Zobrazení",
@@ -106,29 +118,10 @@
"Window": "Okno",
"Window Shortcuts": "Zkratky pro okno",
"YES": "ANO",
"You can select a maximum of 3 languages for spellchecking.": "Pro kontrolu pravopisu můžete vybrat nejvíce 3 jazyky.",
"Zoom In": "Přiblížit",
"Zoom Out": "Oddálit",
"Zulip Help": "Nápověda Zulipu",
"keyboard shortcuts": "klávesové zkratky",
"script": "skript",
"Quit when the window is closed": "Ukončit, když je okno zavřeno",
"Ask where to save files before downloading": "Před stažením se zeptat kam uložit soubory",
"Services": "Služby",
"Hide": "Skrýt",
"Hide Others": "Skrýt jiné",
"Unhide": "Zobrazit",
"AddServer": "Přidat server",
"App language (requires restart)": "Jazyk programu (vyžaduje opětovné spuštění programu)",
"Factory Reset Data": "Obnovení dat do továrního nastavení",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Obnovit program do výchozího nastavení. čili smazat všechny připojené organizace, účty a certifikáty.",
"On macOS, the OS spellchecker is used.": "Na macOS se používá kontrola pravopisu OS.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Změnit jazyk v Nastavení systému → Klávesnice → Text → Kontrola pravopisu.",
"Copy Link": "Kopírovat odkaz",
"Copy Image": "Kopírovat obrázek",
"Copy Image URL": "Kopírovat adresu (URL) obrázku",
"No Suggestion Found": "Nenalezen žádný návrh",
"You can select a maximum of 3 languages for spellchecking.": "Pro kontrolu pravopisu můžete vybrat nejvíce 3 jazyky.",
"Spellchecker Languages": "Kontrola pravopisu jazyků",
"Add to Dictionary": "Přidat do slovníku",
"Look Up": "Vyhledat"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} používá zastaralou verzi serveru Zulip {{{verze}}}. V této aplikaci nemusí plně pracovat."
}

127
public/translations/cy.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "Am Zulip",
"Actual Size": "Maint Gwirioneddol",
"Add Organization": "Ychwanegu Sefydliad",
"Add a Zulip organization": "Ychwanegwch sefydliad Zulip",
"Add custom CSS": "Ychwanegwch CSS wedi'i ddylunio'n benodol",
"AddServer": "AddServer",
"Advanced": "Uwch",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Dechreuwch gyn lleied â phosibl bob amser",
"App Updates": "Diweddariadau Ap",
"App language (requires restart)": "Iaith ap (angen ailgychwyn)",
"Appearance": "Ymddangosiad",
"Application Shortcuts": "Llwybrau Byr yr Ap",
"Are you sure you want to disconnect this organization?": "Ydych chi'n siŵr eich bod chi am ddatgysylltu'r sefydliad hwn?",
"Ask where to save files before downloading": "Gofynnwch ble i arbed ffeiliau cyn eu lawrlwytho",
"Auto hide Menu bar": "Cuddiwch y bar dewislen yn awtomatig",
"Auto hide menu bar (Press Alt key to display)": "Cuddiwch y bar dewislen yn awtomatig (Pwyswch Alt i'w harddangos)",
"Back": "Yn ôl",
"Bounce dock on new private message": "Sbonciwch doc ar neges breifat newydd",
"Change": "Newid",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Newid yr iaith o Dewisiadau System → Bysellfwrdd → Testun → Sillafu.",
"Check for Updates": "Chwiliwch am Ddiweddariadau",
"Close": "Cau",
"Connect": "Cysylltu",
"Connect to another organization": "Cysylltu â sefydliad arall",
"Connected organizations": "Sefydliadau cysylltiedig",
"Copy": "Copi",
"Copy Zulip URL": "Copïwch URL Zulip",
"Create a new organization": "Creu sefydliad newydd",
"Cut": "Torri",
"Default download location": "Lleoliad lawrlwytho diofyn",
"Delete": "Dileu",
"Desktop Notifications": "Hysbysiadau Penbwrdd",
"Desktop Settings": "Gosodiadau Penbwrdd",
"Disconnect": "Datgysylltwch",
"Download App Logs": "Lawrlwythwch Logiau Ap",
"Edit": "Golygu",
"Edit Shortcuts": "Golygu Llwybrau Byr",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Galluogi diweddariadau yn awtomatig",
"Enable error reporting (requires restart)": "Galluogi adrodd am wallau (angen ailgychwyn)",
"Enable spellchecker (requires restart)": "Galluogi gwiriwr sillafu (angen ailgychwyn)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Ailosod Ffatri",
"Factory Reset Data": "Ailosod Data Ffatri",
"File": "Ffeil",
"Find accounts": "Dewch o hyd i gyfrifon",
"Find accounts by email": "Dewch o hyd i gyfrifon trwy e-bost",
"Flash taskbar on new message": "Fflachia'r bar tasgau ar neges newydd",
"Forward": "Ymlaen",
"Functionality": "Ymarferoldeb",
"General": "Cyffredinol",
"Get beta updates": "Cael diweddariadau beta",
"Hard Reload": "Ail-lwytho Caled",
"Help": "Cymorth",
"Help Center": "Canolfan Gymorth",
"Hide": "Cuddio",
"Hide Others": "Cuddio Eraill",
"Hide Zulip": "Hide Zulip",
"History": "Hanes",
"History Shortcuts": "Hanes Llwybrau Byr ",
"Keyboard Shortcuts": "Llwybrau Byr Bysellfwrdd",
"Log Out": "Allgofnodi",
"Log Out of Organization": "Allgofnodi Sefydliad",
"Manual proxy configuration": "Cyfluniad dirprwy â llaw",
"Minimize": "Lleihau",
"Mute all sounds from Zulip": "Tawelwch pob sain o Zulip",
"NO": "NA",
"Network": "Rhwydwaith",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "NEU",
"On macOS, the OS spellchecker is used.": "Ar macOS, defnyddir gwiriwr sillafu OS.",
"Organization URL": "URL y sefydliad",
"Organizations": "Sefydliadau",
"Paste": "Gludo",
"Paste and Match Style": "Arddull Gludo a Paru ",
"Proxy": "Dirprwy",
"Proxy bypass rules": "Rheolau ffordd osgoi dirprwy",
"Proxy rules": "Rheolau dirprwy",
"Quit": "Ymadael",
"Quit Zulip": "Ymadael Zulip",
"Quit when the window is closed": "Cau pan fydd y ffenestr ar gau",
"Redo": "Ail-wneud",
"Release Notes": "Nodiadau ar y datganiad hwn",
"Reload": "Ail-lwytho",
"Report an Issue": "Adroddiwch mater",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Cadw",
"Select All": "Dewiswch Bobeth",
"Services": "Gwasanaethau",
"Settings": "Gosodiadau",
"Shortcuts": "Llwybrau byr",
"Show app icon in system tray": "Dangos eicon ap yn yr hambwrdd system",
"Show app unread badge": "Dangos bathodyn heb ei ddarllen ",
"Show desktop notifications": "Dangos hysbysiadau bwrdd gwaith",
"Show sidebar": "Dangos bar ochr",
"Spellchecker Languages": "Ieithoedd Sillafu",
"Start app at login": "Dechreuwch yr ap wrth fewngofnodi",
"Switch to Next Organization": "Newid i'r Sefydliad Nesaf",
"Switch to Previous Organization": "Newid i Sefydliad Blaenorol",
"These desktop app shortcuts extend the Zulip webapp's": "Mae'r llwybrau byr ap bwrdd gwaith hyn yn ymestyn y webap-iau Zulip",
"Tip": "Awgrym",
"Toggle DevTools for Active Tab": "Toglo DevTools ar gyfer Tab Gweithredol",
"Toggle DevTools for Zulip App": "Toglo DevTools ar gyfer Ap Zulip Ap",
"Toggle Do Not Disturb": "Toglo Peidiwch â Tharfu",
"Toggle Full Screen": "Toglo Sgrin Lawn",
"Toggle Sidebar": "Toglo Bar Ochr",
"Toggle Tray Icon": "Toglo Eicon Hambwrdd",
"Tools": "Offer",
"Undo": "Dadwneud",
"Unhide": "Dad-guddio",
"Upload": "Fyny-lwytho",
"Use system proxy settings (requires restart)": "Defnyddiwch osodiadau dirprwy system (angen ailgychwyn)",
"View": "Gweld",
"View Shortcuts": "Gweld y Llwybrau Byr",
"Window": "Ffenestr",
"Window Shortcuts": "Llwybrau Byr Ffenestri",
"YES": "YDY",
"You can select a maximum of 3 languages for spellchecking.": "Gallwch ddewis uchafswm o 3 iaith ar gyfer gwirio sillafu.",
"Zoom In": "Chwyddo Mewn",
"Zoom Out": "Chwyddo allan",
"keyboard shortcuts": "llwybrau byr bysellfwrdd",
"script": "sgript",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "Om Zulip",
"Actual Size": "Faktisk størrelse",
"Add Custom Certificates": "Tilføj egne certifikater",
"Add Organization": "Opret organisation",
"Add a Zulip organization": "Opret en Zulip organisation",
"Add custom CSS": "Tilføj egen CSS",
"AddServer": "AddServer",
"Advanced": "Avanceret",
"All the connected organizations will appear here": "Alle de tilsluttede organisationer vil blive vist her",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Start altid minimeret",
"App Updates": "App-opdateringer",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Udseende",
"Application Shortcuts": "Genveje",
"Are you sure you want to disconnect this organization?": "Er du sikker på du vil frakoble denne organisation? ",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Skjul menu automatisk",
"Auto hide menu bar (Press Alt key to display)": "Skjul menu automatisk (tryk på Alt-tasten for at vise)",
"Back": "Tilbage",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certifikat-fil",
"Bounce dock on new private message": "Animér dock ved ny privat meddelelse",
"Change": "Skift",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Tjek for opdateringer",
"Close": "Luk",
"Connect": "Tilslut",
@@ -29,28 +31,33 @@
"Cut": "Klip",
"Default download location": "Default download placering",
"Delete": "Slet",
"Desktop App Settings": "Desktop app-indstillinger",
"Desktop Notifications": "Desktop-notifikationer",
"Desktop Settings": "Desktop-indstillinger",
"Disconnect": "Frakobl",
"Download App Logs": "Download app-logfiler",
"Edit": "Redigér",
"Edit Shortcuts": "Redigér genveje",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Aktivér auto-opdateringer",
"Enable error reporting (requires restart)": "Aktivér fejlrapportering (kræver genstart)",
"Enable spellchecker (requires restart)": "Aktivér stavekontrol (kræver genstart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Nulstil til fabriksindstillinger",
"Factory Reset Data": "Factory Reset Data",
"File": "Fil",
"Find accounts": "Find konti",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Find accounts by email": "Find konti via email-adresse",
"Flash taskbar on new message": "Animér proceslinjen ved ny besked",
"Forward": "Vidersend",
"Functionality": "Funktionalitet",
"General": "Generelt",
"Get beta updates": "Få beta opdateringer",
"Hard Reload": "Hård reload",
"Help": "Hjælp",
"Help Center": "Hjælpecenter",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "Historik",
"History Shortcuts": "Historik genveje",
"Keyboard Shortcuts": "Tastatur genveje",
@@ -58,10 +65,12 @@
"Log Out of Organization": "Log ud af organisation",
"Manual proxy configuration": "Manuel proxy opsætning",
"Minimize": "Minimér",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"Mute all sounds from Zulip": "Dæmp alle lyde fra Zulip",
"NO": "NEJ",
"Network": "Netværk",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "ELLER",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organisation URL",
"Organizations": "Organisationer",
"Paste": "Indsæt",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy regler",
"Quit": "Luk",
"Quit Zulip": "Luk Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
@@ -106,29 +118,10 @@
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "Über Zulip",
"Actual Size": "Tatsächliche Größe",
"Add Custom Certificates": "Eigene Zertifikate hinzufügen",
"Add Organization": "Organisation hinzufügen",
"Add a Zulip organization": "Zulip-Organisation hinzufügen",
"Add custom CSS": "Eigenes CSS hinzufügen",
"AddServer": "ServerHinzufügen",
"Advanced": "Erweitert",
"All the connected organizations will appear here": "Alle verbundenen Organisationen erscheinen hier",
"All the connected organizations will appear here.": "Alle verbundenen Organisationen werden hier angezeigt.",
"Always start minimized": "Immer minimiert öffnen",
"App Updates": "App Updates",
"App language (requires restart)": "Sprache der App (benötigt Neustart)",
"Appearance": "Erscheinungsbild",
"Application Shortcuts": "App-Verknüpfungen",
"Are you sure you want to disconnect this organization?": "Bist du dir sicher, dass du die Verbindung zur Organisation trennen möchtest?",
"Ask where to save files before downloading": "Fragen, wo heruntergeladene Dateien gespeichert werden sollen",
"Auto hide Menu bar": "Menü automatisch verstecken",
"Auto hide menu bar (Press Alt key to display)": "Menü automatisch verstecken (zum Anzeigen die Alt-Taste drücken)",
"Back": "Zurück",
"Bounce dock on new private message": "Im Dock hüpfen, wenn neue private Nachrichten eingehen",
"Certificate file": "Zertifikatsdatei",
"Change": "Ändern",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Ändere die Spracheinstellung über Systemeinstellungen → Tastatur → Text → Rechtschreibung.",
"Check for Updates": "Auf Updates prüfen",
"Close": "Schließen",
"Connect": "Verbinden",
@@ -29,17 +31,19 @@
"Cut": "Ausschneiden",
"Default download location": "Voreingestelltes Ziel für Downloads",
"Delete": "Löschen",
"Desktop App Settings": "Einstellungen für Desktop-App",
"Desktop Notifications": "Desktopbenachrichtigungen",
"Desktop Settings": "Desktop-Einstellungen",
"Disconnect": "Verbindung trennen",
"Download App Logs": "Logdateien der App herunterladen",
"Edit": "Bearbeiten",
"Edit Shortcuts": "Tastenkürzel bearbeiten",
"Emoji & Symbols": "Emoji & Symbole",
"Enable auto updates": "Automatisch aktualisieren",
"Enable error reporting (requires restart)": "Fehlerberichte aktivieren (erfordert Neustart)",
"Enable spellchecker (requires restart)": "Rechtschreibprüfung aktivieren (erfordert Neustart)",
"Enter Full Screen": "Vollbildschirm aktivieren",
"Factory Reset": "Alle Einstellungen auf Standardwerte zurücksetzen",
"Factory Reset Data": "Auf Werkseinstellung zurücksetzen",
"File": "Datei",
"Find accounts": "Accounts finden",
"Find accounts by email": "Accounts anhand E-Mail-Adresse finden",
@@ -51,6 +55,9 @@
"Hard Reload": "Komplett neu laden",
"Help": "Hilfe",
"Help Center": "Hilfe-Zentrum",
"Hide": "Verbergen",
"Hide Others": "Andere verbergen",
"Hide Zulip": "Zulip verbergen",
"History": "Verlauf",
"History Shortcuts": "Kurzbefehle für Verlauf",
"Keyboard Shortcuts": "Tastenkürzel",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Alle Zulip-Klänge stummschalten",
"NO": "NEIN",
"Network": "Netzwerk",
"Network and Proxy Settings": "Netzwerk- und Proxy-Einstellungen",
"OR": "ODER",
"On macOS, the OS spellchecker is used.": "In macOS wird die OS Rechtschreibprüfung verwendet.",
"Organization URL": "URL der Organisation",
"Organizations": "Organisationen",
"Paste": "Einfügen",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy-Regeln",
"Quit": "Beenden",
"Quit Zulip": "Zulip beenden",
"Quit when the window is closed": "Beim Schließen des Fensters beenden",
"Redo": "Wiederholen",
"Release Notes": "Hinweise zur Versionsfreigabe",
"Reload": "Neu laden",
"Report an Issue": "Ein Problem melden",
"Reset App Settings": "Einstellungen der App zurücksetzen",
"Reset the application, thus deleting all the connected organizations and accounts.": "Die Anwendung zurücksetzen. Dabei werden alle verbundenen Organisationen und Konten gelöscht.",
"Save": "Speichern",
"Select All": "Alles auswählen",
"Services": "Dienste",
"Settings": "Einstellungen",
"Shortcuts": "Kurzbefehle",
"Show App Logs": "Logdateien der App anzeigen",
"Show app icon in system tray": "App-Icon in Systemleiste anzeigen",
"Show app unread badge": "Anzahl ungelesener Nachrichten in App-Icon einblenden",
"Show desktop notifications": "Desktopbenachrichtigungen anzeigen",
"Show downloaded files in file manager": "Heruntergeladene Dateien in Dateimanager anzeigen",
"Show sidebar": "Seitenleiste anzeigen",
"Spellchecker Languages": "Sprachen für die Rechtschreibprüfung",
"Start app at login": "App beim Login automatisch starten",
"Switch to Next Organization": "Zur nächsten Organisation wechseln",
"Switch to Previous Organization": "Zur vorhergehenden Organisation wechseln",
"These desktop app shortcuts extend the Zulip webapp's": "Dies sind zusätzliche Kurzbefehle in der Desktop-App gegenüber der Web-App",
"This will delete all application data including all added accounts and preferences": "Hiermit werden alle Anwendungsdaten einschließlich aller Accounts und Einstellungen gelöscht",
"Tip": "Tipp",
"Toggle DevTools for Active Tab": "Entwickler-Tools für aktiven Tab umschalten",
"Toggle DevTools for Zulip App": "Entwickler-Tools für Zulip-App umschalten",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Tray-Icon umschalten",
"Tools": "Extras",
"Undo": "Rückgängig",
"Unhide": "Nicht mehr verbergen",
"Upload": "Hochladen",
"Use system proxy settings (requires restart)": "Systemweite Proxy-Einstellungen verwenden (erfordert Neustart)",
"View": "Ansicht",
@@ -106,29 +118,10 @@
"Window": "Fenster",
"Window Shortcuts": "Kurzbefehle für Fenster",
"YES": "JA",
"You can select a maximum of 3 languages for spellchecking.": "Du kannst höchstens 3 Sprachen für die Rechtschreibprüfung auswählen.",
"Zoom In": "Vergrößern",
"Zoom Out": "Verkleinern",
"Zulip Help": "Hilfe zu Zulip",
"keyboard shortcuts": "Tastenkürzel",
"script": "Skript",
"Quit when the window is closed": "Beim Schließen des Fensters beenden",
"Ask where to save files before downloading": "Fragen, wo heruntergeladene Dateien gespeichert werden sollen",
"Services": "Dienste",
"Hide": "Verbergen",
"Hide Others": "Andere verbergen",
"Unhide": "Nicht mehr verbergen",
"AddServer": "ServerHinzufügen",
"App language (requires restart)": "Sprache der App (benötigt Neustart)",
"Factory Reset Data": "Auf Werkseinstellung zurücksetzen",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Die App wird zurückgesetzt, somit werden alle verbundenen Organisationen, Konten und Zertifikate gelöscht.",
"On macOS, the OS spellchecker is used.": "In macOS wird die OS Rechtschreibprüfung verwendet.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Ändere die Spracheinstellung über Systemeinstellungen → Tastatur → Text → Rechtschreibung.",
"Copy Link": "Link kopieren",
"Copy Image": "Bild kopieren",
"Copy Image URL": "Bild-URL kopieren",
"No Suggestion Found": "Keine Vorschläge gefunden",
"You can select a maximum of 3 languages for spellchecking.": "Du kannst höchstens 3 Sprachen für die Rechtschreibprüfung auswählen.",
"Spellchecker Languages": "Sprachen für die Rechtschreibprüfung",
"Add to Dictionary": "Zum Wörterbuch hinzufügen",
"Look Up": "Nachschlagen"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "Auf {{{server}}} läuft die nicht mehr aktuelle Version {{{version}}} von Zulip Server. Es kann sein, dass diese Anwendung damit nicht vollständig funktioniert."
}

View File

@@ -1,134 +1,127 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Custom Certificates": "Add Custom Certificates",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"Advanced": "Advanced",
"All the connected organizations will appear here": "All the connected organizations will appear here",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certificate file",
"Change": "Change",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
"Connect to another organization": "Connect to another organization",
"Connected organizations": "Connected organizations",
"Copy": "Copy",
"Copy Zulip URL": "Copy Zulip URL",
"Create a new organization": "Create a new organization",
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop App Settings": "Desktop App Settings",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Factory Reset": "Factory Reset",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Functionality": "Functionality",
"General": "General",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out of Organization",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"About Zulip": "Σχετικά με το Zulip",
"Actual Size": "Πραγματικό μέγεθος",
"Add Organization": "Προσθήκη Οργανισμού",
"Add a Zulip organization": "Προσθήκη οργανισμού Zulip",
"Add custom CSS": "Προσθήκη χειροποίητης CSS.",
"AddServer": ροσθήκηServer",
"Advanced": "Για προχωρημένους",
"All the connected organizations will appear here.": "Όλοι οι συνδεδεμένοι οργανισμοί θα εμφανίζονται εδώ.",
"Always start minimized": "Να ξεκινά πάντα ελαχιστοποιημένο",
"App Updates": "Ενημερώσεις Εφαρμογής",
"App language (requires restart)": "Γλώσσα εφαρμογής (χρειάζεται επανεκκίνηση)",
"Appearance": "Εμφάνιση",
"Application Shortcuts": "Συντομεύσεις εφαρμογής",
"Are you sure you want to disconnect this organization?": "Είστε σίγουροι ότι θέλετε να αποσυνδέσετε αυτό τον οργανισμό;",
"Ask where to save files before downloading": "Να ερωτούμαι πού να αποθηκευτούν τα αρχεία προτού κατεβούν.",
"Auto hide Menu bar": "Αυτόματη απόκρυψη γραμμής Μενού",
"Auto hide menu bar (Press Alt key to display)": "Αυτόματη απόκρυψη γραμμής Μενού (Πατήστε Alt για να εμφανιστεί)",
"Back": "Πίσω",
"Bounce dock on new private message": "Να χοροπηδάει το σχετικό εικονίδιο κατά τη λήψη ιδιωτικού μηνύματος",
"Change": "Αλλαγή",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Αλλάξτε τη γλώσσα από τις Επιλογές Συστήματος → Πληκτρολόγιο → Κείμενο → Γραφή",
"Check for Updates": "Έλεγχος για Ενημερώσεις",
"Close": "Κλείσιμο",
"Connect": "Σύνδεση",
"Connect to another organization": "Σύνδεση με άλλο οργανισμό",
"Connected organizations": "Συνδεδεμένοι οργανισμοί",
"Copy": "Αντιγραφή",
"Copy Zulip URL": "Αντιγραφή διεύθυνσης URL Zulip",
"Create a new organization": "Δημιουργία νέου οργανισμού",
"Cut": "Αποκοπή",
"Default download location": "Προεπιλεγμένη τοποθεσία λήψης",
"Delete": "Διαγραφή",
"Desktop Notifications": "Ειδοποιήσεις στην Επιφάνεια Εργασίας",
"Desktop Settings": "Ρυθμίσεις Επιφάνειας Εργασίας",
"Disconnect": "Αποσύνδεση",
"Download App Logs": "Λήψη Logs Εφαρμογής",
"Edit": "Τροποποίηση",
"Edit Shortcuts": "Τροποποίηση Συντομεύσεων",
"Emoji & Symbols": "Φατσούλες Ιμότζι και Σύμβολα",
"Enable auto updates": "Ενεργοποίηση αυτόματων ενημερώσεων",
"Enable error reporting (requires restart)": "Ενεργοποίηση αναφοράς λαθών (χρειάζεται επανεκκίνηση)",
"Enable spellchecker (requires restart)": "Ενεργοποίηση ελέγχου ορθογραφίας (χρειάζεται επανεκκίνηση)",
"Enter Full Screen": "Μετάβαση σε Πλήρη Οθόνη",
"Factory Reset": "Επαναφορά Εργοστασιακών Ρυθμίσεων",
"Factory Reset Data": "Επαναφορά εργοστασιακών ρυθμίσεων - Δεδομένα",
"File": "Αρχείο",
"Find accounts": "Εϋρεση λογαριασμών",
"Find accounts by email": "Εύρεση λογαριασμών βάσει email",
"Flash taskbar on new message": "Αναλαμπή γραμμής εργασιών κατά τη λήψη νέου μηνύματος",
"Forward": "Μπροστά",
"Functionality": "Λειτουργία",
"General": "Γενικά",
"Get beta updates": "Λήψη beta - δοκιμαστικών ενημερώσεων",
"Hard Reload": "Ολική επαναφόρτωση",
"Help": "Βοήθεια",
"Help Center": "Κέντρο Βοήθειας",
"Hide": "Απόκρυψη",
"Hide Others": "Απόκρυψη των υπολοίπων",
"Hide Zulip": "Απόκρυψη του Zulip",
"History": "Ιστορικό",
"History Shortcuts": "Συντομεύσεις Ιστορικού",
"Keyboard Shortcuts": "Συντομεύσεις Πληκτρολογίου",
"Log Out": "Αποσύνδεση",
"Log Out of Organization": "Αποσύνδεση από Οργανισμό",
"Manual proxy configuration": "Χειροκίνητη παραμετροποίηση proxy",
"Minimize": "Ελαχιστοποίηση",
"Mute all sounds from Zulip": "Σίγαση όλων των ήχων του Zulip",
"NO": "ΟΧΙ",
"Network": "Δίκτυο",
"Network and Proxy Settings": "Ρυθμίσεις Δικτύου και Proxy",
"OR": "OR",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
"Paste and Match Style": "Paste and Match Style",
"On macOS, the OS spellchecker is used.": "Στο macOS, χρησιμοποιείται ο έμφυτος έλεγχος ορθογραφίας του.",
"Organization URL": "URL Οργανισμού",
"Organizations": "Οργανισμοί",
"Paste": "Επικόλληση",
"Paste and Match Style": "Επικόλληση και υιοθέτηση στυλ προορισμού",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Save": "Save",
"Select All": "Select All",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"Proxy bypass rules": "Κανόνες παράκαμψης Proxy",
"Proxy rules": "Κανόνες Proxy",
"Quit": "Έξοδος",
"Quit Zulip": "Έξοδος από Zulip",
"Quit when the window is closed": "Έξοδος όταν κλείνει το παράθυρο",
"Redo": "Ακύρωση αναίρεσης",
"Release Notes": "Σημειώσεις έκδοσης",
"Reload": "Επαναφόρτωση",
"Report an Issue": "Αναφορά ενός προβλήματος",
"Reset App Settings": "Επαναφορά Ρυθμίσεων Εφαρμογής",
"Reset the application, thus deleting all the connected organizations and accounts.": "Επαναφορά της εφαρμογής, με διαγραφή όλων των συνδεδεμένων οργανισμών και λογαριασμών.",
"Save": "Αποθήκευση",
"Select All": "Επιλογή Όλων",
"Services": "Υπηρεσίες",
"Settings": "Ρυθμίσεις",
"Shortcuts": "Συντομεύσεις",
"Show app icon in system tray": "Εμφάνιση εικονιδίου στη γραμμή εργασιών",
"Show app unread badge": "Εμφάνιση ένδειξης μη αναγνωσμένων μηνυμάτων",
"Show desktop notifications": "Εμφάνιση ειδοποιήσεων στην Επιφάνεια Εργασίας",
"Show sidebar": "Εμφάνιση πλευρικής γραμμής εργαλείων",
"Spellchecker Languages": "Γλώσσες Ορθογραφικού Ελέγχου",
"Start app at login": "Έναρξη εφαρμογής κατά τη σύνδεση",
"Switch to Next Organization": "Μετάβαση σε Επόμενο Οργανισμό",
"Switch to Previous Organization": "Μετάβαση σε Προηγούμενο Οργανισμό",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Tip": "Συμβουλή",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
"View Shortcuts": "View Shortcuts",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"Toggle Full Screen": "Ενεργοποίηση/ Απενεργοποίηση Πλήρους Οθόνης",
"Toggle Sidebar": "Εμφάνιση/Απόκρυψη πλευρικής γραμμής εργαλείων",
"Toggle Tray Icon": "Εμφάνιση/Απόκρυψη εικονιδίου γραμμής εργασιών",
"Tools": "Εργαλεία",
"Undo": "Αναίρεση",
"Unhide": "Επανεμφάνιση",
"Upload": "Ανέβασμα",
"Use system proxy settings (requires restart)": "Χρήση ρυθμίσεων proxy συστήματος (χρειάζεται επανεκκίνηση)",
"View": "Προβολή",
"View Shortcuts": "Εμφάνιση Συντομεύσεων",
"Window": "Παράθυρο",
"Window Shortcuts": "Συντομεύσεις Παραθύρου",
"YES": "ΝΑΙ",
"You can select a maximum of 3 languages for spellchecking.": "Μπορούν να επιλεγούν μέχρι 3 γλώσσες ορθογραφικού ελέγχου.",
"Zoom In": "Ζουμ εγγύτερα",
"Zoom Out": "Ζουμ μακρύτερα",
"keyboard shortcuts": "συντομεύσεις πληκτρολογίου",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Custom Certificates": "Add Custom Certificates",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here": "All the connected organizations will appear here",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certificate file",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
@@ -29,17 +31,19 @@
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop App Settings": "Desktop App Settings",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
@@ -51,6 +55,9 @@
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
@@ -106,29 +118,10 @@
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Custom Certificates": "Add Custom Certificates",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here": "All the connected organizations will appear here",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certificate file",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
@@ -29,17 +31,19 @@
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop App Settings": "Desktop App Settings",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
@@ -51,6 +55,9 @@
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
@@ -71,28 +80,27 @@
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Data": "Reset App Data",
"Reset App Settings": "Reset App Settings",
"Reset Application Data": "Reset Application Data",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
@@ -102,6 +110,7 @@
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
@@ -109,11 +118,10 @@
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Custom Certificates": "Add Custom Certificates",
"Add Organization": "Add Organisation",
"Add a Zulip organization": "Add a Zulip organisation",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here": "All the connected organisations will appear here",
"All the connected organizations will appear here.": "All the connected organisations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organisation?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certificate file",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
@@ -29,17 +31,19 @@
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop App Settings": "Desktop App Settings",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
@@ -51,6 +55,9 @@
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organisation URL",
"Organizations": "Organisations",
"Paste": "Paste",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organisations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organisation",
"Switch to Previous Organization": "Switch to Previous Organisation",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
@@ -106,29 +118,10 @@
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organisations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

127
public/translations/eo.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
"Connect to another organization": "Connect to another organization",
"Connected organizations": "Connected organizations",
"Copy": "Copy",
"Copy Zulip URL": "Copy Zulip URL",
"Create a new organization": "Create a new organization",
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Functionality": "Functionality",
"General": "General",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out of Organization",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
"Paste and Match Style": "Paste and Match Style",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
"View Shortcuts": "View Shortcuts",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "Acerca de Zulip",
"Actual Size": "Tamaño actual",
"Add Custom Certificates": "Añadir certificados personalizados",
"Add Organization": "Añadir organización",
"Add a Zulip organization": "Añadir una organización de Zulip",
"Add custom CSS": "Añadir CSS personalizado",
"AddServer": "AddServer",
"Advanced": "Avanzado",
"All the connected organizations will appear here": "Todas las organizaciones conectadas aparecerán aquí",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Iniciar siempre minimizado",
"App Updates": "Actualizaciones de la aplicación",
"App language (requires restart)": "Idioma de la aplicación (requiere reinicio)",
"Appearance": "Apariencia",
"Application Shortcuts": "Atajos de la aplicación",
"Are you sure you want to disconnect this organization?": "Estas seguro de desconectar esta organización?",
"Ask where to save files before downloading": "Preguntar dónde guardar los archivos antes de descargar",
"Auto hide Menu bar": "Ocultar la barra de menú automáticamente",
"Auto hide menu bar (Press Alt key to display)": "Ocultar la barra de menú automáticamente (mantén tecla Alt para mostrar)",
"Back": "Atrás",
"Bounce dock on new private message": "Rebotar dock cuando se reciba un nuevo mensaje privado",
"Certificate file": "Archivo de certificado",
"Change": "Cambiar",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Modifica el idioma en Preferencias del sistema → Teclado → Texto → Ortografía.",
"Check for Updates": "Comprobar actualizaciones",
"Close": "Cerrar",
"Connect": "Conectar",
@@ -29,17 +31,19 @@
"Cut": "Cortar",
"Default download location": "Ubicación por defecto de descargas",
"Delete": "Eliminar",
"Desktop App Settings": "Ajustes de la aplicación de escritorio",
"Desktop Notifications": "Notificaciones de escritorio",
"Desktop Settings": "Ajustes de escritorio",
"Disconnect": "Desconectar",
"Download App Logs": "Descargar registros de la aplicación",
"Edit": "Editar",
"Edit Shortcuts": "Editar atajos",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Activar actualizaciones automáticas",
"Enable error reporting (requires restart)": "Activar reporte de fallos (necesita reinicio)",
"Enable spellchecker (requires restart)": "Activar corrector ortográfico (necesita reinicio)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Reinicio de fábrica",
"Factory Reset Data": "Factory Reset Data",
"File": "Archivo",
"Find accounts": "Encontrar cuentas",
"Find accounts by email": "Encontrar cuentas por correo electrónico",
@@ -51,6 +55,9 @@
"Hard Reload": "Recarga forzosa",
"Help": "Ayuda",
"Help Center": "Centro de ayuda",
"Hide": "Ocultar",
"Hide Others": "Ocultar otros",
"Hide Zulip": "Hide Zulip",
"History": "Historial",
"History Shortcuts": "Atajos del historial",
"Keyboard Shortcuts": "Atajos de teclado",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Silenciar todos los sonidos de Zulip",
"NO": "NO",
"Network": "Red",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "O",
"On macOS, the OS spellchecker is used.": "En macOS se utiliza la verificación ortográfica del sistema operativo.",
"Organization URL": "URL de la organización",
"Organizations": "Organizaciones",
"Paste": "Pegar",
@@ -71,25 +80,27 @@
"Proxy rules": "Reglas del proxy",
"Quit": "Cerrar",
"Quit Zulip": "Cerrar Zulip",
"Quit when the window is closed": "Salir cuando la ventana se cierre",
"Redo": "Rehacer",
"Release Notes": "Notas de la versión",
"Reload": "Recargar",
"Report an Issue": "Informar de un error",
"Reset App Settings": "Reiniciar ajustes de la aplicación",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Guardar",
"Select All": "Seleccionar todo",
"Services": "Servicios",
"Settings": "Ajustes",
"Shortcuts": "Atajos de teclado",
"Show App Logs": "Mostrar registros de la aplicación",
"Show app icon in system tray": "Mostrar un icono de la aplicación en la bandeja del sistema",
"Show app unread badge": "Mostrar un globo en el icono si hay mensajes sin leer",
"Show desktop notifications": "Mostrar notificaciones de escritorio",
"Show downloaded files in file manager": "Mostrar archivos descargados en el explorador",
"Show sidebar": "Mostrar barra lateral",
"Spellchecker Languages": "Idiomas de verificación ortográfica",
"Start app at login": "Lanzar aplicación al inicio",
"Switch to Next Organization": "Cambiar a la siguiente organización",
"Switch to Previous Organization": "Cambiar a la anterior organización",
"These desktop app shortcuts extend the Zulip webapp's": "Estos atajos de la aplicación de escritorio extienden los ya existentes en Zulip",
"This will delete all application data including all added accounts and preferences": "Esto borrará todos los datos de la aplicación, incluyendo cuentas añadidas y preferencia",
"Tip": "Consej",
"Toggle DevTools for Active Tab": "Activar/desactivar herramientas de desarrollador para la pestaña activa",
"Toggle DevTools for Zulip App": "Activar/desactivar herramientas de desarrollador para la aplicación de Zulip",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Activar/desactivar icono en bandeja del sistema",
"Tools": "Herramientas",
"Undo": "Deshacer",
"Unhide": "Dejar de ocultar",
"Upload": "Subir",
"Use system proxy settings (requires restart)": "Usar ajustes de proxy del sistema (necesita reinicio)",
"View": "Ver",
@@ -106,29 +118,10 @@
"Window": "Ventana",
"Window Shortcuts": "Atajos de ventana",
"YES": "SÍ",
"You can select a maximum of 3 languages for spellchecking.": "Puedes elegir un máximo de 3 idiomas para la verificación ortográfica.",
"Zoom In": "Aumentar zoom",
"Zoom Out": "Reducir zoom",
"Zulip Help": "Ayuda sobre Zulip",
"keyboard shortcuts": "atajos de teclado",
"script": "script",
"Quit when the window is closed": "Salir cuando la ventana se cierre",
"Ask where to save files before downloading": "Preguntar dónde guardar los archivos antes de descargar",
"Services": "Servicios",
"Hide": "Ocultar",
"Hide Others": "Ocultar otros",
"Unhide": "Dejar de ocultar",
"AddServer": "AddServer",
"App language (requires restart)": "Idioma de la aplicación (requiere reinicio)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reinicia la aplicación, borrando todas las organizaciones, cuentas y certificados conectados.",
"On macOS, the OS spellchecker is used.": "En macOS se utiliza la verificación ortográfica del sistema operativo.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Modifica el idioma en Preferencias del sistema → Teclado → Texto → Ortografía.",
"Copy Link": "Copiar enlace",
"Copy Image": "Copiar imagen",
"Copy Image URL": "Copiar URL de la imagen",
"No Suggestion Found": "No se encontró ninguna sugerencia",
"You can select a maximum of 3 languages for spellchecking.": "Puedes elegir un máximo de 3 idiomas para la verificación ortográfica.",
"Spellchecker Languages": "Idiomas de verificación ortográfica",
"Add to Dictionary": "Añadir al diccionario",
"Look Up": "Consultar"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,134 +1,127 @@
{
"About Zulip": "درباره Zulip ",
"Actual Size": "اندازه واقعی",
"Add Custom Certificates": "اضافه کردن مجوز دلخواه",
"Add Organization": "اضافه کردن سازمان",
"Add a Zulip organization": "اضافه کردن سازمان Zulip",
"Add custom CSS": "اضافه کردن CSS دلخواه",
"AddServer": "افزودن سرور",
"Advanced": "پیشرفته",
"All the connected organizations will appear here": "همه سازمان‌های متصل شده اینجا نمایش داده می‌شوند",
"All the connected organizations will appear here.": "همه سازمان‌های مرتبط در اینجا ظاهر می‌شوند.",
"Always start minimized": "همواره به صورت کوچک شده اجرا شو",
"App Updates": "به‌روزرسانی‌های برنامه",
"App language (requires restart)": "زبان برنامه (نیاز به راه اندازی مجدد)",
"Appearance": "شمایل",
"Application Shortcuts": "میانبرهای برنامه",
"Are you sure you want to disconnect this organization?": "آیا از قطع ارتباط از سازمان اطمینان دارید؟",
"Ask where to save files before downloading": "قبل از دانلود بپرس که کجا ذخیره شود.",
"Auto hide Menu bar": "مخفی‌سازی خودکار نوار منو",
"Auto hide menu bar (Press Alt key to display)": "مخفی‌سازی خودکار نوار منو (برای نمایش دکمه Alt را بزنید)",
"Back": "عقب",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "فایل مجوز",
"Bounce dock on new private message": "جهش پرش در پیام خصوصی جدید",
"Change": "تغییر دادن",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "زبان را از تنظیمات سیستم ← صفحه کلید ← متن ← املا تغییر دهید.",
"Check for Updates": "بررسی برای به‌روز‌رسانی",
"Close": "بستن",
"Connect": "اتصال",
"Connect to another organization": "اتصال به یک سازمان دیگر",
"Connected organizations": "سازمان‌های وصل شده",
"Copy": "رونوشت",
"Copy Zulip URL": "رونوشت از Zulip URL",
"Copy Zulip URL": "کپی از Zulip URL",
"Create a new organization": "ایجاد سازمان جدید",
"Cut": "بریدن",
"Default download location": "محل پیش‌فرض دانلود",
"Delete": "حذف",
"Desktop App Settings": "Desktop App Settings",
"Desktop Notifications": "اطلاع‌رسانی‌های دسکتاپ",
"Desktop Settings": "تنظیمات دسکتاپ",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Disconnect": "قطع اتصال",
"Download App Logs": "دانلود لاگ های اپلیکیشن",
"Edit": "ویرایش",
"Edit Shortcuts": "ویرایش میانبرها",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Factory Reset": "Factory Reset",
"Emoji & Symbols": "ایموجی ها و نمادها",
"Enable auto updates": "فعال کردن بروزرسانی خودکار",
"Enable error reporting (requires restart)": "فعال کردن گزارش خطا (نیاز به راه اندازی مجدد)",
"Enable spellchecker (requires restart)": "فعال کردن غلط‌گیر املا (نیاز به راه‌اندازی مجدد)",
"Enter Full Screen": "ورود به حالت تمام صفحه",
"Factory Reset": "تنظیم مجدد کارخانه",
"Factory Reset Data": "بازگشت به تنظیمات کارخانه",
"File": "فایل",
"Find accounts": "پیدا کردن حساب های کاربری ",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Functionality": "Functionality",
"Find accounts by email": "اکانت ها را از طریق ایمیل پیدا کنید",
"Flash taskbar on new message": "فلش نوار وظیفه در پیام جدید",
"Forward": "فوروارد",
"Functionality": "عملکرد",
"General": "عمومی",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Get beta updates": "دریافت بروز رسانی بتا",
"Hard Reload": "بارگذاری مجدد",
"Help": "کمک",
"Help Center": "مرکز کمک",
"Hide": "مخفی کردن",
"Hide Others": "پنهان کردن دیگران",
"Hide Zulip": "پنهان کردن زولیپ",
"History": "تاریخچه ",
"History Shortcuts": "تاریخچه میانبرها",
"Keyboard Shortcuts": "میانبرهای صفحه‌کلید",
"Log Out": "خروج",
"Log Out of Organization": "Log Out of Organization",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Log Out of Organization": "خروج از سازمان",
"Manual proxy configuration": "پیکربندی دستی پروکسی",
"Minimize": "کوچک کردن",
"Mute all sounds from Zulip": "غیرفعال کردن همه صداها در زولیپ",
"NO": "خیر",
"Network": "شبکه",
"Network and Proxy Settings": "تنظیمات شبکه و پروکسی",
"OR": "یا",
"On macOS, the OS spellchecker is used.": "در macOS از غلط‌گیر املای سیستم‌عامل استفاده می‌شود.",
"Organization URL": "URL سازمان",
"Organizations": "Organizations",
"Paste": "Paste",
"Paste and Match Style": "Paste and Match Style",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Organizations": "سازمان ها",
"Paste": "جایگذاری",
"Paste and Match Style": "جایگذاری و تطابق استایل",
"Proxy": "پروکسی",
"Proxy bypass rules": "قوانین دور زدن پروکسی",
"Proxy rules": "قوانین پروکسی",
"Quit": "خروج",
"Quit Zulip": "خروج از زولیپ",
"Quit when the window is closed": "وقتی پنجره بسته است از آن خارج شوید",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Release Notes": "یادداشت های انتشار",
"Reload": "بارگذاری مجدد",
"Report an Issue": "گزارش یک مشکل",
"Reset App Settings": "بازنشانی تنظیمات برنامه",
"Reset the application, thus deleting all the connected organizations and accounts.": "برنامه را بازنشانی کنید، بنابراین تمام سازمان ها و حساب های متصل حذف می شوند.",
"Save": "ذخیره",
"Select All": "Select All",
"Select All": "انتخاب همه",
"Services": "خدمات",
"Settings": "تنظیمات",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Shortcuts": "میانبرها",
"Show app icon in system tray": "نمایش نماد برنامه در ناحیه اعلان سیستم",
"Show app unread badge": "نشان برنامه خوانده نشده نمایش داده شود",
"Show desktop notifications": "نمایش اعلان های دسکتاپ",
"Show sidebar": "نمایش ستون کناری",
"Spellchecker Languages": "غلط یاب املایی زبان ها",
"Start app at login": "برنامه را در هنگام ورود شروع کنید",
"Switch to Next Organization": "جابجایی به سازمان بعدی",
"Switch to Previous Organization": "جابجایی به سازمان قبلی",
"These desktop app shortcuts extend the Zulip webapp's": "این میانبرهای برنامه دسکتاپ، برنامه وب Zulip را گسترش می دهند",
"Tip": "نکته",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Sidebar": "تغییر نوار کناری",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
"View Shortcuts": "View Shortcuts",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Tools": "ابزارها",
"Undo": "بازگشت به عقب",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"Upload": "آپلود",
"Use system proxy settings (requires restart)": "استفاده از تنظیمات پراکسی سیستم (نیاز به راه اندازی مجدد)",
"View": "مشاهده",
"View Shortcuts": "مشاهده میانبرها",
"Window": "پنجره",
"Window Shortcuts": "میانبرهای پنجره",
"YES": "بله",
"You can select a maximum of 3 languages for spellchecking.": "شما می توانید حداکثر 3 زبان را برای بررسی املا انتخاب کنید.",
"Zoom In": "بزرگنمایی",
"Zoom Out": "کوچک نمایی",
"keyboard shortcuts": "میانبرهای صفحه کلید",
"script": "script",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} نسخه {{{version}}} سرور Zulip قدیمی را اجرا می‌کند. ممکن است به طور کامل در این برنامه کار نکند."
}

View File

@@ -1,134 +1,127 @@
{
"About Zulip": "Tietoa Zulipista",
"Actual Size": "Varsinainen koko",
"Add Custom Certificates": "Lisää omia sertifikaatteja",
"Actual Size": "Alkuperäinen koko",
"Add Organization": "Lisää organisaatio",
"Add a Zulip organization": "Lisää Zulip-organisaatio",
"Add custom CSS": "Lisää oma CSS",
"Advanced": "Edistynyt",
"All the connected organizations will appear here": "All the connected organizations will appear here",
"AddServer": "AddServer",
"Advanced": "Lisäasetukset",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Aloita aina pienennettynä",
"App Updates": "Sovellspäivitykset",
"App Updates": "Sovelluspäivitykset",
"App language (requires restart)": "Sovelluksen kieli (uudelleenkäynnistys tarvitaan)",
"Appearance": "Ulkonäkö",
"Application Shortcuts": "Sovellusoikotiet",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Application Shortcuts": "Sovelluksen pikanäppäimet",
"Are you sure you want to disconnect this organization?": "Oletko varma että haluat katkaista yhteyden tähän organisaatioon?",
"Ask where to save files before downloading": "Kysy ennen lataamista, minne tiedostot tallennetaan",
"Auto hide Menu bar": "Piilota automaattisesti Menu-valikko",
"Auto hide menu bar (Press Alt key to display)": "Piilota automaattisesti Menu-valikko (Näytä painamalla Alt-näppäintä)",
"Back": "Takaisin",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certificate file",
"Change": "Muuta",
"Check for Updates": "Check for Updates",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Tarkista päivitykset",
"Close": "Sulje",
"Connect": "Yhdistä",
"Connect to another organization": "Connect to another organization",
"Connected organizations": "Connected organizations",
"Connect to another organization": "Yhdistä toiseen organisaatioon",
"Connected organizations": "Yhdistetyt organisaatiot",
"Copy": "Kopioi",
"Copy Zulip URL": "Kopioi Zulip-URL",
"Create a new organization": "Luo uusi organisaatio",
"Cut": "Leikkaa",
"Default download location": "Default download location",
"Default download location": "Tallennuksen oletushakemisto",
"Delete": "Poista",
"Desktop App Settings": "Desktop App Settings",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Katkaise",
"Download App Logs": "Download App Logs",
"Desktop Notifications": "Työpöydän ilmoitukset",
"Desktop Settings": "Työpöytä asetukset",
"Disconnect": "Katkaise yhteys",
"Download App Logs": "Lataushistoria",
"Edit": "Muokkaa",
"Edit Shortcuts": "Edit Shortcuts",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Factory Reset": "Factory Reset",
"Edit Shortcuts": "Muokkauksen pikanäppäimet",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Salli automaattiset päivitykset",
"Enable error reporting (requires restart)": "Ota virheraportointi käyttöön (uudelleenkäynnistys tarvitaan) ",
"Enable spellchecker (requires restart)": "Ota oikoluku käyttöön (uudelleenkäynnistys tarvitaan)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Tehdasasetusten palautus",
"Factory Reset Data": "Tehdasasetusten palautustiedot",
"File": "Tiedosto",
"Find accounts": "Löydä tilit",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Functionality": "Functionality",
"General": "General",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Find accounts": "Etsi tilejä",
"Find accounts by email": "Etsi tilejä sähköpostilla",
"Flash taskbar on new message": "Vilkuta tehtäväpalkkia uuden viestin saapuessa",
"Forward": "Eteenpäin",
"Functionality": "Ominaisuus",
"General": "Yleiset",
"Get beta updates": "Tilaa beta-päivitykset",
"Hard Reload": "Täysi uudelleenlataus",
"Help": "Ohje",
"Help Center": "Tukikeskus",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out of Organization",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"Hide": "Piilota",
"Hide Others": "Piilota muut",
"Hide Zulip": "Hide Zulip",
"History": "Historia",
"History Shortcuts": "Historian pikanäppäimet",
"Keyboard Shortcuts": "Pikanäppäimet",
"Log Out": "Kirjaudu ulos",
"Log Out of Organization": "Kirjaudu ulos organisaatiosta",
"Manual proxy configuration": "Manualiset välityspalvelin-asetukset",
"Minimize": "Pienennä",
"Mute all sounds from Zulip": "Mykistä kaikki Zulip-äänet",
"NO": "EI",
"Network": "Network",
"Network": "Verkko",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "TAI",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organisaation URL",
"Organizations": "Organisaatiot",
"Paste": "Liitä",
"Paste and Match Style": "Liitä ja täsmää tyylit",
"Proxy": "Välipalvelin",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Proxy": "Välityspalvelin",
"Proxy bypass rules": "Välityspalvelimen ohituksen säännöt",
"Proxy rules": "Välityspalvelimen-säännöt",
"Quit": "Lopeta",
"Quit Zulip": "Lopeta Zulip",
"Redo": "Toista",
"Release Notes": "Release Notes",
"Quit when the window is closed": "Sulje sovellus, kun ikkuna suljetaan",
"Redo": "Tee uudelleen",
"Release Notes": "Julkaisutiedot",
"Reload": "Lataa uudelleen",
"Report an Issue": "Report an Issue",
"Report an Issue": "Raportoi ongelmasta",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Tallenna",
"Select All": "Valitse kaikki",
"Services": "Services",
"Settings": "Asetukset",
"Shortcuts": "Oikopolut",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Show app icon in system tray": "Näytä sovellus ilmoituspaneelissa",
"Show app unread badge": "Näytä lukemattomien määrä -merkki",
"Show desktop notifications": "Näytä työpöytäilmoitukset",
"Show sidebar": "Näytä sivupaneeli",
"Spellchecker Languages": "Oikoluvun kielet",
"Start app at login": "Käynnistä sovellus sisäänkirjauduttaessa",
"Switch to Next Organization": "Vaihda seuraavaan organisaatioon",
"Switch to Previous Organization": "Vaihda edelliseen organisaatioon",
"These desktop app shortcuts extend the Zulip webapp's": "Nämä työpöytäsovelluksen pikanäppäimet laajentavat Zulip web-sovelluksen ",
"Tip": "Vinkki",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Toggle DevTools for Active Tab": "Kehitystyökalut / aktiivinen ikkuna",
"Toggle DevTools for Zulip App": "Kehitystyökalut / Zulip sovellus",
"Toggle Do Not Disturb": "Vaihda Älä häiritse -tilaa",
"Toggle Full Screen": "Vaihda koko ruudun tilaa",
"Toggle Sidebar": "Näytä/piilota sivupalkki",
"Toggle Tray Icon": "Vaihda Tray-kuvaketta",
"Tools": "Työkalut",
"Undo": "Peru",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"Unhide": "Näytä",
"Upload": "Lähetä tiedosto",
"Use system proxy settings (requires restart)": "Käytä järjestelmän välityspalvelimen asetuksia (uudelleenkäynnistys tarvitaan)",
"View": "Näytä",
"View Shortcuts": "View Shortcuts",
"View Shortcuts": "Katselun pikanäppäimet",
"Window": "Ikkuna",
"Window Shortcuts": "Window Shortcuts",
"Window Shortcuts": "Näkymän pikanäppäimet",
"YES": "KYLLÄ",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"You can select a maximum of 3 languages for spellchecking.": "Voit valita oikolukua varten enintään 3 kieltä.",
"Zoom In": "Lähennä",
"Zoom Out": "Loitonna",
"keyboard shortcuts": "Pikanäppäimet",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "À propos de Zulip",
"Actual Size": "Taille actuelle",
"Add Custom Certificates": "Ajouter un certificat spécifique",
"Add Organization": "Ajouter une organisation",
"Add a Zulip organization": "Ajouter une organisation Zulip",
"Add custom CSS": "Ajouter un CSS spécifique",
"AddServer": "AjouterServeur",
"Advanced": "Avancé",
"All the connected organizations will appear here": "Toutes les organisations connectées apparaîtront ici",
"Always start minimized": "Toujours démarrer minimisé",
"App Updates": "Mise à jour de l'application",
"All the connected organizations will appear here.": "Toutes les organisations connectées apparaitront ici.",
"Always start minimized": "Toujours démarrer en fenêtre réduite",
"App Updates": "Mises à jour de l'application",
"App language (requires restart)": "Langue de l'application (nécessite redémarrage)",
"Appearance": "Apparence",
"Application Shortcuts": "Raccourcis de l'application",
"Are you sure you want to disconnect this organization?": "Êtes-vous certain de vouloir déconnecter cette organisation?",
"Ask where to save files before downloading": "Demander où sauvegarder les fichiers avant de télécharger",
"Auto hide Menu bar": "Cacher automatiquement la barre de menu",
"Auto hide menu bar (Press Alt key to display)": "Cacher automatiquement la barre de menu (Appuyez sur la touche Alt pour l'afficher)",
"Back": "Précédent",
"Bounce dock on new private message": "Animer l'horloge à la réception d'un nouveau message privé",
"Certificate file": "Fichier de certificat",
"Change": "Changer",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Modifier la langue à partir des Préférences Système → Clavier → Text → Orthographe.",
"Check for Updates": "Vérifier les mises à jour",
"Close": "Fermer",
"Connect": "Connecter",
@@ -29,17 +31,19 @@
"Cut": "Couper",
"Default download location": "Destination de téléchargement par défaut",
"Delete": "Supprimer",
"Desktop App Settings": "Paramètres de l'application de bureau",
"Desktop Notifications": "Notifications de bureau",
"Desktop Settings": "Paramètres de bureau",
"Disconnect": "Déconnecter",
"Download App Logs": "Télécharger le journal de l'application",
"Edit": "Modifier",
"Edit Shortcuts": "Modifier les raccourcis",
"Emoji & Symbols": "Emojis & symboles",
"Enable auto updates": "Activer la mise à jour automatique",
"Enable error reporting (requires restart)": "Activer le rapport d'erreur (redémarrage nécessaire)",
"Enable spellchecker (requires restart)": "Activer le correcteur orthographique (redémarrage nécessaire)",
"Enter Full Screen": "Accéder au plein écran",
"Factory Reset": "Réinitialiser aux paramètres par défaut",
"Factory Reset Data": "Factory Reset Data",
"File": "Fichier",
"Find accounts": "Rechercher un compte",
"Find accounts by email": "Rechercher un compte par adresse courriel",
@@ -51,6 +55,9 @@
"Hard Reload": "Forcer un rechargement",
"Help": "Aide",
"Help Center": "Centre d'aide",
"Hide": "Masquer",
"Hide Others": "Masquer les autres",
"Hide Zulip": "Cacher Zulip",
"History": "Historique",
"History Shortcuts": "Historique des raccourcis",
"Keyboard Shortcuts": "Raccourcis clavier",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Couper tous les sons de Zulip",
"NO": "Non",
"Network": "Réseau",
"Network and Proxy Settings": "Paramètres réseau et proxy",
"OR": "OU",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "URL de l'organisation",
"Organizations": "Organisations",
"Paste": "Coller",
@@ -71,25 +80,27 @@
"Proxy rules": "Règles du proxy",
"Quit": "Quitter",
"Quit Zulip": "Quitter Zulip",
"Quit when the window is closed": "Quitter l'application lors de la fermeture de la fenêtre",
"Redo": "Refaire",
"Release Notes": "Notes sur la version",
"Reload": "Recharger",
"Report an Issue": "Rapporter un problème",
"Reset App Settings": "Réinitialiser les paramètres de l'application",
"Reset the application, thus deleting all the connected organizations and accounts.": "Réinitialiser l'application, supprimant ainsi toutes les organisations et tous les comptes connectés.",
"Save": "Sauvegarder",
"Select All": "Sélectionner tout",
"Services": "Services",
"Settings": "Paramètres",
"Shortcuts": "Raccourcis",
"Show App Logs": "Afficher le journal de l'application",
"Show app icon in system tray": "Afficher l'icone de l'application dans la barre d'état",
"Show app unread badge": "Afficher un badge lors d'un message non lu",
"Show desktop notifications": "Afficher les notifications sur le bureau",
"Show downloaded files in file manager": "Afficher les fichiers téléchargés dans le gestionnaire de fichiers",
"Show sidebar": "Afficher la barre latérale",
"Spellchecker Languages": "Langues du vérificateur orthographique",
"Start app at login": "Démarrer l'application à l'ouverture",
"Switch to Next Organization": "Basculer à l'organisation suivante",
"Switch to Previous Organization": "Basculer à l'organisation précédente",
"These desktop app shortcuts extend the Zulip webapp's": "Ces raccourcis d'application vont au-delà de l'application web Zulip",
"This will delete all application data including all added accounts and preferences": "Ceci supprimera toutes les données de l'application, incluant les comptes et préférences",
"Tip": "Conseil",
"Toggle DevTools for Active Tab": "Activer les outils de développement dans l'onglet actif",
"Toggle DevTools for Zulip App": "Activer les outils de développement dans l'application Zulip",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Activer l'icone dans la barre d'état",
"Tools": "Outils",
"Undo": "Annuler",
"Unhide": "Démasquer",
"Upload": "Envoyer",
"Use system proxy settings (requires restart)": "Utiliser les paramètres de proxy du système (exige un redémarrage)",
"View": "Affichage",
@@ -106,29 +118,10 @@
"Window": "Fenêtre",
"Window Shortcuts": "Raccourcis fenêtre",
"YES": "Oui",
"You can select a maximum of 3 languages for spellchecking.": "Vous pouvez sélectionner au maximum 3 langues pour la vérification orthographique.",
"Zoom In": "Zoom avant",
"Zoom Out": "Zoom arrière",
"Zulip Help": "Aide sur Zulip",
"keyboard shortcuts": "Raccourcis clavier",
"script": "Script",
"Quit when the window is closed": "Quitter l'application lors de la fermeture de la fenêtre",
"Ask where to save files before downloading": "Demander où sauvegarder les fichiers avant de télécharger",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"script": "scénario",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Custom Certificates": "Add Custom Certificates",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here": "All the connected organizations will appear here",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certificate file",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
@@ -29,17 +31,19 @@
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop App Settings": "Desktop App Settings",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Editar",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
@@ -51,6 +55,9 @@
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Gardar",
"Select All": "Select All",
"Services": "Services",
"Settings": "Configuración",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
@@ -106,29 +118,10 @@
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

127
public/translations/gu.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
"Connect to another organization": "Connect to another organization",
"Connected organizations": "Connected organizations",
"Copy": "Copy",
"Copy Zulip URL": "Copy Zulip URL",
"Create a new organization": "Create a new organization",
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Functionality": "Functionality",
"General": "General",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out of Organization",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
"Paste and Match Style": "Paste and Match Style",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
"View Shortcuts": "View Shortcuts",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "जूलिप के बारे में",
"Actual Size": "वास्तविक आकार",
"Add Custom Certificates": "कस्टम प्रमाण पत्र जोड़ें",
"Add Organization": "संगठन जोड़ें",
"Add a Zulip organization": "एक जूलिप संगठन जोड़ें",
"Add custom CSS": "कस्टम CSS जोड़ें",
"AddServer": "AddServer",
"Advanced": "उन्नत",
"All the connected organizations will appear here": "सभी जुड़े संगठन यहां दिखाई देंगे",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "हमेशा कम से कम शुरू करें",
"App Updates": "ऐप अपडेट",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "दिखावट",
"Application Shortcuts": "आवेदन शॉर्टकट",
"Are you sure you want to disconnect this organization?": "क्या आप वाकई इस संगठन को डिस्कनेक्ट करना चाहते हैं?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "ऑटो मेनू मेनू छुपाएँ",
"Auto hide menu bar (Press Alt key to display)": "ऑटो छिपाने मेनू बार (प्रेस Alt कुंजी प्रदर्शित करने के लिए)",
"Back": "वापस",
"Bounce dock on new private message": "नए निजी संदेश पर बाउंस डॉक",
"Certificate file": "प्रमाणपत्र फ़ाइल",
"Change": "परिवर्तन",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "अद्यतन के लिए जाँच",
"Close": "बंद करे",
"Connect": "जुडिये",
@@ -29,17 +31,19 @@
"Cut": "कट गया",
"Default download location": "डिफ़ॉल्ट डाउनलोड स्थान",
"Delete": "हटाना",
"Desktop App Settings": "डेस्कटॉप ऐप सेटिंग्स",
"Desktop Notifications": "डेस्कटॉप सूचनाएं",
"Desktop Settings": "डेस्कटॉप सेटिंग्स",
"Disconnect": "डिस्कनेक्ट",
"Download App Logs": "ऐप लॉग डाउनलोड करें",
"Edit": "संपादित करें",
"Edit Shortcuts": "शॉर्टकट संपादित करें",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "ऑटो अपडेट सक्षम करें",
"Enable error reporting (requires restart)": "त्रुटि रिपोर्टिंग सक्षम करें (पुनरारंभ की आवश्यकता है)",
"Enable spellchecker (requires restart)": "वर्तनी जाँचक सक्षम करें (पुनः आरंभ करने की आवश्यकता है)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "नए यंत्र जैसी सेटिंग",
"Factory Reset Data": "Factory Reset Data",
"File": "फ़ाइल",
"Find accounts": "खाते ढूंढे",
"Find accounts by email": "ईमेल द्वारा खाते ढूंढें",
@@ -51,6 +55,9 @@
"Hard Reload": "हार्ड रीलोड",
"Help": "मदद",
"Help Center": "सहायता केंद्र",
"Hide": "छिपाना",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "इतिहास",
"History Shortcuts": "इतिहास शॉर्टकट",
"Keyboard Shortcuts": "कुंजीपटल अल्प मार्ग",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "ज़ूलिप से सभी ध्वनियों को म्यूट करें",
"NO": "नहीं",
"Network": "नेटवर्क",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "या",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "संगठन का URL",
"Organizations": "संगठन",
"Paste": "चिपकाएं",
@@ -70,26 +79,28 @@
"Proxy bypass rules": "प्रॉक्सी बायपास नियम",
"Proxy rules": "प्रॉक्सी नियम",
"Quit": "छोड़ना",
"Quit Zulip": "ज़ुल्फ़ छोड़",
"Quit Zulip": "जूलिप छोड़ दें",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "फिर से करना",
"Release Notes": "रिलीज नोट्स",
"Reload": "सीमा से अधिक लादना",
"Reload": "पुनः लोड करें",
"Report an Issue": "मामले की रिपोर्ट करें",
"Save": "बचाना",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "बचाना / सहेजें",
"Select All": "सभी का चयन करे",
"Services": "Services",
"Settings": "सेटिंग्स",
"Shortcuts": "शॉर्टकट",
"Show App Logs": "ऐप लॉग दिखाएं",
"Show app icon in system tray": "सिस्टम ट्रे में ऐप आइकन दिखाएं",
"Show app unread badge": "ऐप अपठित बैज दिखाएं",
"Show desktop notifications": "डेस्कटॉप सूचनाएं दिखाएं",
"Show downloaded files in file manager": "फ़ाइल प्रबंधक में डाउनलोड की गई फ़ाइलें दिखाएं",
"Show sidebar": "साइडबार दिखाओ",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "लॉगिन पर ऐप शुरू करें",
"Switch to Next Organization": "अगला संगठन पर स्विच करें",
"Switch to Previous Organization": "पिछले संगठन पर स्विच करें",
"These desktop app shortcuts extend the Zulip webapp's": "ये डेस्कटॉप ऐप शॉर्टकट Zulip webapp's का विस्तार करते हैं",
"This will delete all application data including all added accounts and preferences": "यह सभी जोड़े गए खातों और वरीयताओं सहित सभी एप्लिकेशन डेटा को हटा देगा",
"Tip": "टिप",
"Toggle DevTools for Active Tab": "सक्रिय टैब के लिए DevTools टॉगल करें",
"Toggle DevTools for Zulip App": "Zulip App के लिए DevTools टॉगल करें",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "टॉगल ट्रे आइकन",
"Tools": "उपकरण",
"Undo": "पूर्ववत करें",
"Unhide": "प्रकट करें",
"Upload": "अपलोड",
"Use system proxy settings (requires restart)": "सिस्टम प्रॉक्सी सेटिंग्स का उपयोग करें (पुनः आरंभ करने की आवश्यकता है)",
"View": "राय",
@@ -106,29 +118,10 @@
"Window": "खिड़की",
"Window Shortcuts": "विंडो शॉर्टकट",
"YES": "हाँ",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "ज़ूम इन",
"Zoom Out": "ज़ूम आउट",
"Zulip Help": "Zulip मदद",
"keyboard shortcuts": "कुंजीपटल अल्प मार्ग",
"script": "लिपि",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Custom Certificates": "Add Custom Certificates",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here": "All the connected organizations will appear here",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certificate file",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
@@ -29,17 +31,19 @@
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop App Settings": "Desktop App Settings",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
@@ -51,6 +55,9 @@
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
@@ -106,29 +118,10 @@
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "A Zulip-ról",
"Actual Size": "Alapértelmezett méret",
"Add Custom Certificates": "Saját tanúsítvány hozzáadása",
"Add Organization": "Szervezet hozzáadása",
"Add a Zulip organization": "Zulip szervezet hozzáadása",
"Add custom CSS": "Saját CSS hozzáadása",
"AddServer": "Szerver hozzáadás",
"Advanced": "Haladó",
"All the connected organizations will appear here": "Itt jelennek meg a kapcsolódó szervezetek",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Mindig kis méretben induljon",
"App Updates": "Alkalmazásfrissítések",
"App language (requires restart)": "Alkalmazás nyelve (újraindítást igényel)",
"Appearance": "Megjelenés",
"Application Shortcuts": "Gyorsbillentyűk",
"Are you sure you want to disconnect this organization?": "Biztosan kilép ebből a szervezetből?",
"Ask where to save files before downloading": "Letöltés előtt kérdezze meg a mentés helyét",
"Auto hide Menu bar": "Menüsáv automatikus rejtése",
"Auto hide menu bar (Press Alt key to display)": "Menüsáv automatikus rejtése (Alt megnyomására megjelenik)",
"Back": "Vissza",
"Bounce dock on new private message": "Ugráló dokk ikon új privát üzenet esetén",
"Certificate file": "Tanúsítvány állomány",
"Change": "Változtatás",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "A nyelv a Rendszerbeállítások → Billentyűzet → Szöveg → Helyesírás pontban változtatható meg.",
"Check for Updates": "Frissítések keresése",
"Close": "Bezár",
"Connect": "Kapcsolódás",
@@ -29,17 +31,19 @@
"Cut": "Kivágás",
"Default download location": "Alapértelmezett letöltési hely",
"Delete": "Törlés",
"Desktop App Settings": "Asztali alkalmazás beállításai",
"Desktop Notifications": "Asztali értesítések",
"Desktop Settings": "Asztali beállítások",
"Disconnect": "Szétkapcsolás",
"Download App Logs": "Alkalmazásnaplók letöltése",
"Edit": "Szerkesztés",
"Edit Shortcuts": "Gyorsbillentyűk szerkesztése",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Automatikus frissítés engedélyezése",
"Enable error reporting (requires restart)": "Hibajelentés engedélyezése (újraindítást igényel)",
"Enable spellchecker (requires restart)": "Helyesírásellenőrzés engedélyezése (újraindítást igényel)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Gyári beállítások visszaállítása",
"Factory Reset Data": "Gyári adatok visszaállítása",
"File": "Fájl",
"Find accounts": "Fiókok keresése",
"Find accounts by email": "Fiók keresés e-mail alapján",
@@ -51,6 +55,9 @@
"Hard Reload": "Teljes újratöltés",
"Help": "Súgó",
"Help Center": "Súgóközpont",
"Hide": "Elrejtés",
"Hide Others": "A többi elrejtése",
"Hide Zulip": "Hide Zulip",
"History": "Előzmények",
"History Shortcuts": "Előzmények gyorsbillentyűi",
"Keyboard Shortcuts": "Gyorsbillentyűk",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Az összes Zulip hang némítása",
"NO": "NEM",
"Network": "Hálózat",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "VAGY",
"On macOS, the OS spellchecker is used.": "MacOS rendszereken az operációs rendszer helyesírásellenőrzőjét használjuk.",
"Organization URL": "Szervezet URL-je",
"Organizations": "Szervezetek",
"Paste": "Beillesztése",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy szabályok",
"Quit": "Kilépés",
"Quit Zulip": "Kilépés a Zulip-ból",
"Quit when the window is closed": "Kilépés az ablak bezárásakor",
"Redo": "Újra",
"Release Notes": "Kiadási megjegyzések",
"Reload": "Újratöltés",
"Report an Issue": "Hiba bejelentése",
"Reset App Settings": "App beállítások törlése",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Mentés",
"Select All": "Mindet kijelöl",
"Services": "Szolgáltatások",
"Settings": "Beállítások",
"Shortcuts": "Gyorsbillentyűk",
"Show App Logs": "Alkalmazásnaplók megtekintése",
"Show app icon in system tray": "Ikon megjelenítése a tálcán",
"Show app unread badge": "Az alkalmazás olvasatlan jelvényének megjelenítése",
"Show desktop notifications": "Az asztali értesítések megjelenítése",
"Show downloaded files in file manager": "Letöltött állományok megjelenítése a fájlkezelőben",
"Show sidebar": "Oldalsáv megjelenítése",
"Spellchecker Languages": "Helyesírásellenőrzés nyelvei",
"Start app at login": "Indítsa el az alkalmazást bejelentkezéskor",
"Switch to Next Organization": "Váltás a következő szervezetre",
"Switch to Previous Organization": "Váltás az előző szervezetre",
"These desktop app shortcuts extend the Zulip webapp's": "Az alábbi asztali gyorsbillentyűk kiegészítik a Zulip webapp gyorsbillentyűket.",
"This will delete all application data including all added accounts and preferences": "Minden alkalmazásadat, hozzáadott fiók és beállítás törlése",
"Tip": "Tipp",
"Toggle DevTools for Active Tab": "DevTools bekapcsolása az aktív fülön",
"Toggle DevTools for Zulip App": "DevTools bekapcsolása a Zulip App számára",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Tálca ikon bekapcsolása",
"Tools": "Eszközök",
"Undo": "Visszavonás",
"Unhide": "Felfedés",
"Upload": "Feltöltés",
"Use system proxy settings (requires restart)": "A rendszer proxybeállításainak használata (újraindítást igényel)",
"View": "Nézet",
@@ -106,29 +118,10 @@
"Window": "Ablak",
"Window Shortcuts": "Ablak gyorsbillentyűk",
"YES": "IGEN",
"You can select a maximum of 3 languages for spellchecking.": "Maximum 3 nyelv választható ki helyesírásellenőrzéshez.",
"Zoom In": "Nagyítása",
"Zoom Out": "Kicsinyítés",
"Zulip Help": "Zulip Súgó",
"keyboard shortcuts": "gyorsbillentyűk",
"script": "parancsfájl",
"Quit when the window is closed": "Kilépés az ablak bezárásakor",
"Ask where to save files before downloading": "Letöltés előtt kérdezze meg a mentés helyét",
"Services": "Szolgáltatások",
"Hide": "Elrejtés",
"Hide Others": "A többi elrejtése",
"Unhide": "Felfedés",
"AddServer": "Szerver hozzáadás",
"App language (requires restart)": "Alkalmazás nyelve (újraindítást igényel)",
"Factory Reset Data": "Gyári adatok visszaállítása",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Alkalmazásadatok törlése - törlődnek a csatlakoztatott szervezetek, fiókok és tanúsítványok is.",
"On macOS, the OS spellchecker is used.": "MacOS rendszereken az operációs rendszer helyesírásellenőrzőjét használjuk.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "A nyelv a Rendszerbeállítások → Billentyűzet → Szöveg → Helyesírás pontban változtatható meg.",
"Copy Link": "Hivatkozás másolása",
"Copy Image": "Kép másolása",
"Copy Image URL": "Kép címének másolása",
"No Suggestion Found": "Nem találtunk javaslatot",
"You can select a maximum of 3 languages for spellchecking.": "Maximum 3 nyelv választható ki helyesírásellenőrzéshez.",
"Spellchecker Languages": "Helyesírásellenőrzés nyelvei",
"Add to Dictionary": "Hozzáadás a szótárhoz",
"Look Up": "Keresés"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

127
public/translations/id.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "Tentang Zulip",
"Actual Size": "Actual Size",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Change": "Ubah",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Tutup",
"Connect": "Connect",
"Connect to another organization": "Connect to another organization",
"Connected organizations": "Connected organizations",
"Copy": "Copy",
"Copy Zulip URL": "Copy Zulip URL",
"Create a new organization": "Create a new organization",
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Temukan akun",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Functionality": "Functionality",
"General": "General",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out of Organization",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "URL Organisasi",
"Organizations": "Organizations",
"Paste": "Paste",
"Paste and Match Style": "Paste and Match Style",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Simpan",
"Select All": "Select All",
"Services": "Services",
"Settings": "Pengaturan",
"Shortcuts": "Shortcuts",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
"View Shortcuts": "View Shortcuts",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "A proposito di Zulip",
"Actual Size": "Dimensione Attuale",
"Add Custom Certificates": "Aggiungi Certificati Personali",
"Add Organization": "Aggiungi Organizzazione",
"Add a Zulip organization": "Aggiungi organizzazione a Zulip",
"Add custom CSS": "Aggiungi codice CSS personale",
"Add custom CSS": "Aggiungi codice CSS personalizzato",
"AddServer": "AddServer",
"Advanced": "Avanzate",
"All the connected organizations will appear here": "Tutte le organizzazioni connesse appariranno qui",
"All the connected organizations will appear here.": "Tutte le organizzazioni collegate appariranno qui.",
"Always start minimized": "Avvia sempre minimizzato",
"App Updates": "Aggiornamenti App",
"App language (requires restart)": "Lingua applicazione (richiede riavvio)",
"Appearance": "Aspetto",
"Application Shortcuts": "Scorciatoia Applicazione",
"Application Shortcuts": "Scorciatoie Applicazione",
"Are you sure you want to disconnect this organization?": "Sei sicuro di volerti scollegare da questa organizzazione?",
"Ask where to save files before downloading": "Chiedi dove salvare i file prima di scaricarli",
"Auto hide Menu bar": "Nascondi automaticamente la barra del Menù",
"Auto hide menu bar (Press Alt key to display)": "Nascondi automaticamente la barra del menù (Premi il tasto Alt per visualizzarlo)",
"Back": "Indietro",
"Bounce dock on new private message": "Lampeggia icona sula barra alla ricezione di un nuovo messaggio privato",
"Certificate file": "File Certificato",
"Change": "Modifica",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Cambia la lingua in Preferenze di Sistema → Tastiera → Testo → Ortografia.",
"Check for Updates": "Controlla aggiornamenti",
"Close": "Chiudi",
"Connect": "Connetti",
@@ -29,17 +31,19 @@
"Cut": "Taglia",
"Default download location": "Percorso predefinito di download",
"Delete": "Cancella",
"Desktop App Settings": "Impostazioni App Desktop",
"Desktop Notifications": "Notifiche Desktop",
"Desktop Settings": "Impostazioni Desktop",
"Disconnect": "Disconnetti",
"Download App Logs": "Scarica Log Applicativi",
"Edit": "Modifica",
"Edit Shortcuts": "Edita Scorciatoie",
"Emoji & Symbols": "Emoji e simboli",
"Enable auto updates": "Abilita aggiornamenti automatici",
"Enable error reporting (requires restart)": "Abilita segnalazione errori (richiede riavvio)",
"Enable spellchecker (requires restart)": "Abilita correttore ortografico (richiede riavvio)",
"Enter Full Screen": "Accedi a Schermo intero",
"Factory Reset": "Reset di fabbrica",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Trova account",
"Find accounts by email": "Trova account tramite email",
@@ -51,17 +55,22 @@
"Hard Reload": "Forza Ricarica",
"Help": "Aiuto",
"Help Center": "Centro di aiuto",
"Hide": "Nascondi",
"Hide Others": "Nascondi gli altri",
"Hide Zulip": "Nascondi Zulip",
"History": "Storico",
"History Shortcuts": "Cronologia Scorciatoie",
"Keyboard Shortcuts": "Scorciatoie Tastiera",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out dall'organizzazione",
"Log Out": "Esci",
"Log Out of Organization": "Esci dall'organizzazione",
"Manual proxy configuration": "Configurazione proxy manuale",
"Minimize": "Minimizza",
"Mute all sounds from Zulip": "Silenzia tutti i suoni di Zulip",
"NO": "NO",
"Network": "Rete",
"Network and Proxy Settings": "Impostazioni di rete e proxy",
"OR": "O",
"On macOS, the OS spellchecker is used.": "Su macOS, è usato il correttore ortografico di sistema.",
"Organization URL": "URL dell'organizzazione",
"Organizations": "Organizzazioni",
"Paste": "Incolla",
@@ -71,26 +80,28 @@
"Proxy rules": "Regole Proxy",
"Quit": "Esci",
"Quit Zulip": "Esci da Zulip",
"Quit when the window is closed": "Esci quando la finestra è chiusa",
"Redo": "Rifare",
"Release Notes": "Note di Rilascio",
"Reload": "Ricarica",
"Report an Issue": "Segnala Un Problema",
"Reset App Settings": "Resetta Impostazioni Applicazione",
"Reset the application, thus deleting all the connected organizations and accounts.": "Ripristina l'applicazione, eliminando così tutte le organizzazioni e gli account collegati.",
"Save": "Salva",
"Select All": "Seleziona Tutto",
"Services": "Servizi",
"Settings": "Impostazioni",
"Shortcuts": "Scorciatoie",
"Show App Logs": "Mostra i Log Applicativi",
"Show app icon in system tray": "Mostra icona applicazione nella barra di sistema",
"Show app unread badge": "Mostra icona notifiche non lette",
"Show desktop notifications": "Mostra notifiche desktop",
"Show downloaded files in file manager": "Mostra i file scaricati nel file manager",
"Show sidebar": "Mostra barra laterale",
"Start app at login": "Avvia l'applicazione alla login",
"Spellchecker Languages": "Lingue correttore ortografico",
"Start app at login": "Avvia l'applicazione all'avvio",
"Switch to Next Organization": "Passa alla Prossima Organizzazione",
"Switch to Previous Organization": "Passa alla Precedente Organizzazione",
"These desktop app shortcuts extend the Zulip webapp's": "Queste scorciatoie per l'app desktop, estendono le webapp di Zulip",
"This will delete all application data including all added accounts and preferences": "Questo cancellerà tutti i dati applicativi inclusi tutti gli account e le preferenze",
"Tip": "Mancia",
"Tip": "Consiglio",
"Toggle DevTools for Active Tab": "Attiva/Disattiva Tool di Sviluppo per il Tab Attivo",
"Toggle DevTools for Zulip App": "Attiva/Disattiva Tool di Sviluppo per l'applicazione Zulip",
"Toggle Do Not Disturb": "Attiva/Disattiva il Non Disturbare",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Abilita/Disabilita Icona nella Tray Bar",
"Tools": "Strumenti",
"Undo": "Annulla",
"Unhide": "Mostra",
"Upload": "Carica",
"Use system proxy settings (requires restart)": "Usa impostazioni proxy di sistema (richiede riavvio)",
"View": "Visualizza",
@@ -106,29 +118,10 @@
"Window": "Finestra",
"Window Shortcuts": "Scorciatoie Finestra",
"YES": "SI",
"You can select a maximum of 3 languages for spellchecking.": "Puoi selezionare fino ad un massimo di 3 lingue per il correttore ortografico",
"Zoom In": "Ingrandisci",
"Zoom Out": "Riduci",
"Zulip Help": "Guida di Zulip",
"keyboard shortcuts": "scorciatoie tastiera",
"script": "script",
"Quit when the window is closed": "Esci quando la finestra è chiusa",
"Ask where to save files before downloading": "Chiedi dove salvare i file prima di scaricarli",
"Services": "Servizi",
"Hide": "Nascondi",
"Hide Others": "Nascondi gli altri",
"Unhide": "Mostra",
"AddServer": "AddServer",
"App language (requires restart)": "Lingua applicazione (richiede riavvio)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "Su macOS, è usato il correttore ortografico di sistema.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copia link",
"Copy Image": "Copia immagine",
"Copy Image URL": "Copia URL dell'immagine",
"No Suggestion Found": "Nessun suggerimento trovato",
"You can select a maximum of 3 languages for spellchecking.": "Puoi selezionare fino ad un massimo di 3 lingue per il correttore ortografico",
"Spellchecker Languages": "Lingue correttore ortografico",
"Add to Dictionary": "Aggiungi al dizionario",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} esegue una versione obsoleta di Zulip Server {{{version}}}. Potrebbe non funzionare completamente in questa app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "Zulip について",
"Actual Size": "実際のサイズ",
"Add Custom Certificates": "カスタム証明書を追加",
"Actual Size": "サイズを元に戻す",
"Add Organization": "組織を追加",
"Add a Zulip organization": "新しいZulip組織を追加",
"Add custom CSS": "カスタムCSSを追加",
"AddServer": "AddServer",
"Advanced": "その他",
"All the connected organizations will appear here": "接続済みの組織はすべてここに表示されます",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "常に最小化して起動",
"App Updates": "アプリのアップデート",
"App language (requires restart)": "アプリの言語設定 (再起動が必要です)",
"Appearance": "外観",
"Application Shortcuts": "アプリケーションのショートカット",
"Are you sure you want to disconnect this organization?": "本当にこの組織から脱退しますか?",
"Ask where to save files before downloading": "ダウンロード時にファイルの保存先を指定する",
"Auto hide Menu bar": "メニューバーを自動的に隠す",
"Auto hide menu bar (Press Alt key to display)": "メニューバーを自動的に隠す Altキーを押すと表示",
"Back": "戻る",
"Bounce dock on new private message": "新しいプライベートメッセージがあると Dock アイコンが跳ねる",
"Certificate file": "証明書ファイル",
"Change": "変更",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "アップデートを確認",
"Close": "閉じる",
"Connect": "接続",
@@ -26,20 +28,22 @@
"Copy": "コピー",
"Copy Zulip URL": "Zulip URL をコピー",
"Create a new organization": "新しい組織を作成",
"Cut": "カット",
"Cut": "切り取り",
"Default download location": "デフォルトのダウンロードフォルダ",
"Delete": "削除",
"Desktop App Settings": "デスクトップアプリの設定",
"Desktop Notifications": "デスクトップ通知",
"Desktop Settings": "デスクトップ設定",
"Disconnect": "切断",
"Download App Logs": "アプリログをダウンロード",
"Edit": "編集",
"Edit Shortcuts": "ショートカットを編集",
"Emoji & Symbols": "絵文字と記号",
"Enable auto updates": "自動更新を有効にする",
"Enable error reporting (requires restart)": "エラー報告を有効にする再起動が必要",
"Enable spellchecker (requires restart)": "スペルチェッカーを有効にする再起動が必要",
"Enable error reporting (requires restart)": "エラー報告を有効にする (再起動が必要です)",
"Enable spellchecker (requires restart)": "スペルチェッを有効にする (再起動が必要です)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "ファクトリーリセット",
"Factory Reset Data": "Factory Reset Data",
"File": "ファイル",
"Find accounts": "アカウントを探す",
"Find accounts by email": "メールでアカウントを探す",
@@ -51,6 +55,9 @@
"Hard Reload": "ハードリロード",
"Help": "ヘルプ",
"Help Center": "ヘルプセンター",
"Hide": "非表示",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "履歴",
"History Shortcuts": "履歴ショートカット",
"Keyboard Shortcuts": "キーボードショートカット",
@@ -61,74 +68,60 @@
"Mute all sounds from Zulip": "Zulip からのすべてのサウンドをミュート",
"NO": "いいえ",
"Network": "ネットワーク",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "または",
"On macOS, the OS spellchecker is used.": "macOSでは、OSのスペルチェックが使用されます。",
"Organization URL": "組織のURL",
"Organizations": "組織",
"Paste": "ペースト",
"Paste and Match Style": "ペーストしてスタイルをわせ",
"Paste": "貼り付け",
"Paste and Match Style": "スタイルをわせて貼り付け",
"Proxy": "プロキシ",
"Proxy bypass rules": "プロキシバイパスルール",
"Proxy rules": "プロキシルール",
"Quit": "退出",
"Quit": "終了",
"Quit Zulip": "Zulip を終了",
"Quit when the window is closed": "ウインドウを閉じるときに自動的に退出",
"Redo": "やり直す",
"Release Notes": "リリースノート",
"Reload": "リロード",
"Report an Issue": "問題を報告する",
"Reset App Settings": "アプリの設定をリセット",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "保存",
"Select All": "すべて選択",
"Services": "サービス",
"Settings": "設定",
"Shortcuts": "ショートカット",
"Show App Logs": "アプリログを表示する",
"Show app icon in system tray": "システムトレイにアプリアイコンを表示する",
"Show app unread badge": "アプリの未読バッジを表示する",
"Show desktop notifications": "デスクトップ通知を表示する",
"Show downloaded files in file manager": "ダウンロードしたファイルをファイルマネージャに表示する",
"Show sidebar": "サイドバーを表示",
"Spellchecker Languages": "スペルチェックの言語",
"Start app at login": "ログイン時にアプリを起動する",
"Switch to Next Organization": "次の組織に切り替える",
"Switch to Previous Organization": "前の組織に切り替える",
"These desktop app shortcuts extend the Zulip webapp's": "これらのデスクトップアプリのショートカットは Zulip Web アプリケーションのショートカットを拡張します。",
"This will delete all application data including all added accounts and preferences": "これにより、追加されたすべてのアカウントと設定を含むすべてのアプリケーションデータが削除されます",
"Tip": "ヒント",
"Toggle DevTools for Active Tab": "アクティブなタブの DevTools を切り替え",
"Toggle DevTools for Zulip App": "Zulip App の DevTools を切り替え",
"Toggle Do Not Disturb": "サイレントモードの切り替え",
"Toggle Full Screen": "フルスクリーン切り替え",
"Toggle Full Screen": "フルスクリーン切り替え",
"Toggle Sidebar": "サイドバーの切り替え",
"Toggle Tray Icon": "トレイアイコンの切り替え",
"Tools": "ツール",
"Undo": "アンドゥ",
"Undo": "元に戻す",
"Unhide": "表示",
"Upload": "アップロード",
"Use system proxy settings (requires restart)": "システムのプロキシ設定を使用する再起動が必要",
"Use system proxy settings (requires restart)": "システムのプロキシ設定を使用する (再起動が必要です)",
"View": "表示",
"View Shortcuts": "ショートカットを表示",
"Window": "ウインドウ",
"Window Shortcuts": "ウィンドウショートカット",
"YES": "はい",
"You can select a maximum of 3 languages for spellchecking.": "最大で3つの言語のスペルチェックを選択できます。",
"Zoom In": "拡大",
"Zoom Out": "縮小",
"Zulip Help": "Zulip ヘルプ",
"keyboard shortcuts": "キーボードショートカット",
"script": "スクリプト",
"Quit when the window is closed": "ウインドウを閉じるときに自動的に退出",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,45 +1,49 @@
{
"About Zulip": "Zulip에 대해",
"Actual Size": "실제 크기",
"Add Custom Certificates": "사용자 지정 인증서 추가",
"Add Organization": "조직 추가",
"Add a Zulip organization": "새로운 Zulip 조직 추가",
"Add custom CSS": "맞춤 CSS 추가",
"AddServer": "서버추가",
"Advanced": "많은",
"All the connected organizations will appear here": "연결된 모든 조직이 여기에 표시됩니다.",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "항상 최소화 된 상태로 시작하십시오.",
"App Updates": "앱 업데이트",
"App language (requires restart)": "앱 언어 (재시작 필요함)",
"Appearance": "외관",
"Application Shortcuts": "애플리케이션 단축키",
"Are you sure you want to disconnect this organization?": "이 조직의 연결을 해제 하시겠습니까?",
"Ask where to save files before downloading": "다운로드 전에 어디에 파일을 저장할지 묻기",
"Auto hide Menu bar": "메뉴 바 자동 숨기기",
"Auto hide menu bar (Press Alt key to display)": "메뉴 바 자동 숨기기 (표시하려면 Alt 키를 누릅니다)",
"Back": "뒤로가기",
"Bounce dock on new private message": "새로운 비공개 메시지에 바운스 독",
"Certificate file": "인증서 파일",
"Change": "변화",
"Change": "변경",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "시스템 환경설정 → 키보드 → 텍스트 → 맞춤법에서 언어를 바꾸세요.",
"Check for Updates": "업데이트 확인",
"Close": "닫기",
"Connect": "잇다",
"Connect": "연결",
"Connect to another organization": "다른 조직에 연결",
"Connected organizations": "연결된 조직",
"Copy": "복사",
"Copy Zulip URL": "Zulip URL 복사",
"Create a new organization": "새 조직 만들기",
"Cut": "절단",
"Cut": "잘라내기",
"Default download location": "기본 다운로드 위치",
"Delete": "삭제",
"Desktop App Settings": "데스크톱 앱 설정",
"Desktop Notifications": "데스크톱 알림",
"Desktop Settings": "데스크톱 설정",
"Disconnect": "연결 끊기",
"Download App Logs": "앱 로그 다운로드",
"Edit": "편집하다",
"Edit Shortcuts": "바로 가기 편집",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "자동 업데이트 사용",
"Enable error reporting (requires restart)": "오류보고 사용 (재시작 필요)",
"Enable spellchecker (requires restart)": "맞춤법 검사기 사용 (재시작 필요)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "공장 초기화",
"Factory Reset Data": "공장 초기화 정보",
"File": "파일",
"Find accounts": "계정 찾기",
"Find accounts by email": "이메일을 통한 계정 찾기",
@@ -51,45 +55,52 @@
"Hard Reload": "하드 다시로드",
"Help": "도움",
"Help Center": "지원 센터",
"History": "역사",
"History Shortcuts": "연혁 단축키",
"Hide": "숨기기",
"Hide Others": "나머지 숨기기",
"Hide Zulip": "Hide Zulip",
"History": "히스토리",
"History Shortcuts": "히스토리 단축키",
"Keyboard Shortcuts": "키보드 단축키",
"Log Out": "로그 아웃",
"Log Out of Organization": "조직에서 로그 아웃",
"Manual proxy configuration": "수동 프록시 구성",
"Minimize": "최소화",
"Mute all sounds from Zulip": "튤립에서 모든 소리를 음소거합니다.",
"NO": "아니",
"Network": "회로망",
"Mute all sounds from Zulip": "Zulip에서 모든 소리를 음소거합니다.",
"NO": "아니",
"Network": "네트워크",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "또는",
"On macOS, the OS spellchecker is used.": "macOS에서는 운영체제의 맞춤법 검사기가 사용됩니다.",
"Organization URL": "조직 URL",
"Organizations": "단체",
"Organizations": "조직",
"Paste": "붙여넣기",
"Paste and Match Style": "붙여 넣기 및 스타일 일치",
"Proxy": "대리",
"Paste and Match Style": "스타일 일치시켜 붙여넣기",
"Proxy": "프록시",
"Proxy bypass rules": "프록시 우회 규칙",
"Proxy rules": "프록시 규칙",
"Quit": "떠나다",
"Quit Zulip": "Zulip 을 종료하십시오.",
"Redo": "다시 하다",
"Quit": "종료",
"Quit Zulip": "Zulip 을 종료합니다.",
"Quit when the window is closed": "윈도우가 닫히면 종료",
"Redo": "다시실행",
"Release Notes": "릴리즈 노트",
"Reload": "다시로드",
"Reload": "새로고침",
"Report an Issue": "문제 신고",
"Save": "구하다",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "저장",
"Select All": "모두 선택",
"Services": "서비스들",
"Settings": "설정",
"Shortcuts": "바로 가기",
"Show App Logs": "앱 로그 보기",
"Show app icon in system tray": "시스템 트레이에 앱 아이콘 표시",
"Show app unread badge": "앱에 읽지 않은 배지 표시",
"Show desktop notifications": "바탕 화면 알림 표시",
"Show downloaded files in file manager": "파일 관리자에서 다운로드 한 파일 표시",
"Show sidebar": "사이드 바 표시",
"Spellchecker Languages": "맞춤법 검사기 언어",
"Start app at login": "로그인시 앱 시작",
"Switch to Next Organization": "다음 조직으로 전환",
"Switch to Previous Organization": "이전 조직으로 전환",
"These desktop app shortcuts extend the Zulip webapp's": "이러한 데스크톱 앱 바로 가기 Zulip 웹 앱을 확장합니다.",
"This will delete all application data including all added accounts and preferences": "이렇게하면 추가 된 모든 계정 및 환경 설정을 포함한 모든 응용 프로그램 데이터가 삭제됩니다.",
"These desktop app shortcuts extend the Zulip webapp's": "데스크톱 앱 바로 가기들은 Zulip 웹 앱을 확장합니다.",
"Tip": "팁",
"Toggle DevTools for Active Tab": "DevTools for Active Tab 토글",
"Toggle DevTools for Zulip App": "Zulip App 용 DevTools 토글",
@@ -98,37 +109,19 @@
"Toggle Sidebar": "사이드 바 전환",
"Toggle Tray Icon": "트레이 아이콘 토글",
"Tools": "도구들",
"Undo": "끄르다",
"Upload": "업로드",
"Undo": "되돌리기",
"Unhide": "나타내기",
"Upload": "올리기",
"Use system proxy settings (requires restart)": "시스템 프록시 설정 사용 (다시 시작해야 함)",
"View": "전망",
"View Shortcuts": "바로 가기보기",
"Window": "창",
"View": "보기",
"View Shortcuts": "바로가기 보기",
"Window": "창",
"Window Shortcuts": "창 바로 가기",
"YES": "예",
"You can select a maximum of 3 languages for spellchecking.": "최대 3개 언어에 대한 맞춤법 검사기를 선택할수 있습니다.",
"Zoom In": "확대",
"Zoom Out": "축소",
"Zulip Help": "Zulip 도움말",
"keyboard shortcuts": "키보드 단축키",
"script": "스크립트",
"Quit when the window is closed": "윈도우가 닫히면 종료",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Custom Certificates": "Add Custom Certificates",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here": "All the connected organizations will appear here",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Certificate file": "Certificate file",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Uždaryti",
"Connect": "Connect",
@@ -29,17 +31,19 @@
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop App Settings": "Desktop App Settings",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
@@ -51,6 +55,9 @@
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Nustatymai",
"Shortcuts": "Shortcuts",
"Show App Logs": "Show App Logs",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show downloaded files in file manager": "Show downloaded files in file manager",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"This will delete all application data including all added accounts and preferences": "This will delete all application data including all added accounts and preferences",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
@@ -106,29 +118,10 @@
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

127
public/translations/lv.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "Par Zulip",
"Actual Size": "Patiesais izmērs",
"Add Organization": "Pievienot Organizāciju",
"Add a Zulip organization": "Pievienot Zulip organizāciju",
"Add custom CSS": "Pievienot pielāgotu CSS",
"AddServer": "Pievienot serveri",
"Advanced": "Papildus",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Vienmēr palaist samazinātu",
"App Updates": "Programmas atjauninājumi",
"App language (requires restart)": "Programmas valoda (nepieciešama restartēšana)",
"Appearance": "Izskats",
"Application Shortcuts": "Programmas īsinājumtaustiņi",
"Are you sure you want to disconnect this organization?": "Vai tiešām vēlaties atvienoties no šīs organizācijas?",
"Ask where to save files before downloading": "Pirms lejupielādes jautāt, kur saglabāt failus",
"Auto hide Menu bar": "Automātiski slēpt izvēļņu joslu",
"Auto hide menu bar (Press Alt key to display)": "Automātiski slēpt izvēļņu joslu (lai parādītu, nospiediet taustiņu Alt)",
"Back": "Atpakaļ",
"Bounce dock on new private message": "Tirināt doka ikonu, kad saņemts jauns privāts ziņojums",
"Change": "Mainīt",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Mainīt valodu var zem System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Pārbaudīt, vai ir pieejami atjauninājumi",
"Close": "Aizvērt",
"Connect": "Pievienoties",
"Connect to another organization": "Pievienoties citai organizācijai",
"Connected organizations": "Organizācijas, kurā esmu pievienojies",
"Copy": "Kopēt",
"Copy Zulip URL": "Kopēt Zulip URL",
"Create a new organization": "Izveidot jaunu organizāciju",
"Cut": "Izgriezt",
"Default download location": "Noklusētā lejupielādes mape",
"Delete": "Dzēst",
"Desktop Notifications": "Darbvirsmas paziņojumi",
"Desktop Settings": "Darbvirsmas iestatījumi",
"Disconnect": "Atvienot",
"Download App Logs": "Lejupielādēt programmas žurnālus",
"Edit": "Rediģēt",
"Edit Shortcuts": "Rediģēt īsinājumtaustiņi",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Iespējot automātisko atjaunināšanu",
"Enable error reporting (requires restart)": "Iespējot kļūdu ziņošanu (nepieciešama restartēšana)",
"Enable spellchecker (requires restart)": "Iespējot pareizrakstības pārbaudi (nepieciešama restartēšana)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Atiestatīt programmu",
"Factory Reset Data": "Programmas datu atiestatīšana",
"File": "Fails",
"Find accounts": "Meklēt kontus",
"Find accounts by email": "Meklēt kontus, izmantojot e-pastu",
"Flash taskbar on new message": "Zibsnīt uzdevumjoslu, kad saņemts jauns ziņojums",
"Forward": "Uz priekšu",
"Functionality": "Funkcionalitāte",
"General": "Vispārīgie",
"Get beta updates": "Saņemt beta atjauninājumus",
"Hard Reload": "Pārlādēt piespiedu",
"Help": "Palīgs",
"Help Center": "Palīdzības centrs",
"Hide": "Paslēpt",
"Hide Others": "Paslēpt pārējos",
"Hide Zulip": "Hide Zulip",
"History": "Vēsture",
"History Shortcuts": "Vēstures īsinājumtaustiņi",
"Keyboard Shortcuts": "Tastatūras īsinājumtaustiņi",
"Log Out": "Atteikties",
"Log Out of Organization": "Atteikties no organizācijas",
"Manual proxy configuration": "Manuālā starpniekservera konfigurācija",
"Minimize": "Minimizēt",
"Mute all sounds from Zulip": "Izslēgt visas Zulip skaņas",
"NO": "NĒ",
"Network": "Tīkls",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "VAI",
"On macOS, the OS spellchecker is used.": "Operētājsistēmā macOS tiek izmantota OS pareizrakstības pārbaude.",
"Organization URL": "Organizācijas URL",
"Organizations": "Organizācijas",
"Paste": "Ielīmēt",
"Paste and Match Style": "Ielīmēt un saskaņot stilu",
"Proxy": "Starpniekserveris",
"Proxy bypass rules": "Starpniekservera apiešanas noteikumi",
"Proxy rules": "Starpniekservera noteikumi",
"Quit": "Aizvērt",
"Quit Zulip": "Aizvērt Zulip programmu",
"Quit when the window is closed": "Aizvērt programmu, kad logs tiek aizvērts",
"Redo": "Atsaukt atsaukto",
"Release Notes": "Izlaiduma piezīmes - Izmaiņu žurnāls",
"Reload": "Pārlādēt",
"Report an Issue": "Ziņot par problēmu",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Saglabāt",
"Select All": "Atlasīt visu",
"Services": "Pakalpojumi",
"Settings": "Iestatījumi",
"Shortcuts": "Īsinājumtaustiņi",
"Show app icon in system tray": "Rādīt programmas ikonu sistēmas teknē",
"Show app unread badge": "Rādīt programmas nelasīto emblēmu",
"Show desktop notifications": "Rādīt darbvirsmas paziņojumus",
"Show sidebar": "Rādīt sānjoslu",
"Spellchecker Languages": "Pareizrakstības pārbaudes valodas",
"Start app at login": "Palaist programmu pie pieteikšanās",
"Switch to Next Organization": "Pārslēgties uz nākamo organizāciju",
"Switch to Previous Organization": "Pārslēgties uz iepriekšējo organizāciju",
"These desktop app shortcuts extend the Zulip webapp's": "Šie darbvirsmas programmu īsinājumtaustiņi paplašina Zulip tīmekļa lietotnes",
"Tip": "Padoms",
"Toggle DevTools for Active Tab": "Paslēpt/Parādīt Izstrādātāja rīkus aktīvājā cilnē",
"Toggle DevTools for Zulip App": "Paslēpt/Parādīt Izstrādātāja rīkus Zulip programmā",
"Toggle Do Not Disturb": "Pārslēgt Netraucēt mani",
"Toggle Full Screen": "Pārslēgties uz/Iziet no pilnekrāna režīmu",
"Toggle Sidebar": "Paslēpt/Parādīt sānjoslu",
"Toggle Tray Icon": "Paslēpt/Parādīt teknes ikonu",
"Tools": "Rīki",
"Undo": "Atsaukt",
"Unhide": "Parādīt",
"Upload": "Augšupielādēt",
"Use system proxy settings (requires restart)": "Izmantot sistēmas starpniekservera iestatījumus (nepieciešama restartēšana)",
"View": "Skatīt",
"View Shortcuts": "Skatīt īsinājumtaustiņi",
"Window": "Logs",
"Window Shortcuts": "Logu īsinājumtaustiņi",
"YES": "JĀ",
"You can select a maximum of 3 languages for spellchecking.": "Pareizrakstības pārbaudei varat atlasīt ne vairāk kā 3 valodas.",
"Zoom In": "Pietuvināt",
"Zoom Out": "Attālināt",
"keyboard shortcuts": "īsinājumtaustiņus",
"script": "skripts",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "സുലിപ്പിനെക്കുറിച്ച്",
"Actual Size": "യഥാർത്ഥ വലുപ്പം",
"Add Custom Certificates": "ഇഷ്‌ടാനുസൃത സർട്ടിഫിക്കറ്റുകൾ ചേർക്കുക",
"Add Organization": "ഓർഗനൈസേഷൻ ചേർക്കുക",
"Add a Zulip organization": "ഒരു സുലിപ്പ് ഓർഗനൈസേഷൻ ചേർക്കുക",
"Add custom CSS": "ഇഷ്‌ടാനുസൃത CSS ചേർക്കുക",
"AddServer": "AddServer",
"Advanced": "വിപുലമായത്",
"All the connected organizations will appear here": "ബന്ധിപ്പിച്ച എല്ലാ ഓർ‌ഗനൈസേഷനുകളും ഇവിടെ ദൃശ്യമാകും",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "എല്ലായ്പ്പോഴും ചെറുതാക്കാൻ ആരംഭിക്കുക",
"App Updates": "അപ്ലിക്കേഷൻ അപ്‌ഡേറ്റുകൾ",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "രൂപം",
"Application Shortcuts": "അപ്ലിക്കേഷൻ കുറുക്കുവഴികൾ",
"Are you sure you want to disconnect this organization?": "ഈ ഓർഗനൈസേഷൻ വിച്ഛേദിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "യാന്ത്രികമായി മറയ്‌ക്കുക മെനു ബാർ",
"Auto hide menu bar (Press Alt key to display)": "യാന്ത്രികമായി മറയ്‌ക്കുക മെനു ബാർ (പ്രദർശിപ്പിക്കുന്നതിന് Alt കീ അമർത്തുക)",
"Back": "തിരികെ",
"Bounce dock on new private message": "പുതിയ സ്വകാര്യ സന്ദേശത്തിൽ ഡോക്ക് ബൗൺസ് ചെയ്യുക",
"Certificate file": "സർട്ടിഫിക്കറ്റ് ഫയൽ",
"Change": "മാറ്റുക",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കുക",
"Close": "അടയ്‌ക്കുക",
"Connect": "ബന്ധിപ്പിക്കുക",
@@ -29,17 +31,19 @@
"Cut": "മുറിക്കുക",
"Default download location": "സ്ഥിരസ്ഥിതി ഡ download ൺ‌ലോഡ് സ്ഥാനം",
"Delete": "ഇല്ലാതാക്കുക",
"Desktop App Settings": "ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷൻ ക്രമീകരണങ്ങൾ",
"Desktop Notifications": "ഡെസ്ക്ടോപ്പ് അറിയിപ്പുകൾ",
"Desktop Settings": "ഡെസ്ക്ടോപ്പ് ക്രമീകരണങ്ങൾ",
"Disconnect": "വിച്ഛേദിക്കുക",
"Download App Logs": "അപ്ലിക്കേഷൻ ലോഗുകൾ ഡൗൺലോഡുചെയ്യുക",
"Edit": "എഡിറ്റുചെയ്യുക",
"Edit Shortcuts": "കുറുക്കുവഴികൾ എഡിറ്റുചെയ്യുക",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "യാന്ത്രിക അപ്‌ഡേറ്റുകൾ പ്രവർത്തനക്ഷമമാക്കുക",
"Enable error reporting (requires restart)": "പിശക് റിപ്പോർട്ടിംഗ് പ്രാപ്തമാക്കുക (പുനരാരംഭിക്കേണ്ടതുണ്ട്)",
"Enable spellchecker (requires restart)": "അക്ഷരത്തെറ്റ് പരിശോധന പ്രാപ്തമാക്കുക (പുനരാരംഭിക്കേണ്ടതുണ്ട്)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "ഫാക്ടറി പുന .സജ്ജമാക്കുക",
"Factory Reset Data": "Factory Reset Data",
"File": "ഫയൽ",
"Find accounts": "അക്കൗണ്ടുകൾ കണ്ടെത്തുക",
"Find accounts by email": "ഇമെയിൽ വഴി അക്കൗണ്ടുകൾ കണ്ടെത്തുക",
@@ -51,6 +55,9 @@
"Hard Reload": "ഹാർഡ് റീലോഡ്",
"Help": "സഹായിക്കൂ",
"Help Center": "സഹായകേന്ദ്രം",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "ചരിത്രം",
"History Shortcuts": "ചരിത്രം കുറുക്കുവഴികൾ",
"Keyboard Shortcuts": "കീബോർഡ് കുറുക്കുവഴികൾ",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "സുലിപ്പിൽ നിന്നുള്ള എല്ലാ ശബ്ദങ്ങളും നിശബ്ദമാക്കുക",
"NO": "ഇല്ല",
"Network": "നെറ്റ്‌വർക്ക്",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "അഥവാ",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "ഓർ‌ഗനൈസേഷൻ‌ URL",
"Organizations": "ഓർഗനൈസേഷനുകൾ",
"Paste": "പേസ്റ്റ്",
@@ -71,25 +80,27 @@
"Proxy rules": "പ്രോക്സി നിയമങ്ങൾ",
"Quit": "ഉപേക്ഷിക്കുക",
"Quit Zulip": "സുലിപ്പ് ഉപേക്ഷിക്കുക",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "വീണ്ടും ചെയ്യുക",
"Release Notes": "പ്രകാശന കുറിപ്പുകൾ",
"Reload": "വീണ്ടും ലോഡുചെയ്യുക",
"Report an Issue": "ഒരു പ്രശ്നം റിപ്പോർട്ട് ചെയ്യുക",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "രക്ഷിക്കും",
"Select All": "എല്ലാം തിരഞ്ഞെടുക്കുക",
"Services": "Services",
"Settings": "ക്രമീകരണങ്ങൾ",
"Shortcuts": "കുറുക്കുവഴികൾ",
"Show App Logs": "അപ്ലിക്കേഷൻ ലോഗുകൾ കാണിക്കുക",
"Show app icon in system tray": "സിസ്റ്റം ട്രേയിൽ അപ്ലിക്കേഷൻ ഐക്കൺ കാണിക്കുക",
"Show app unread badge": "അപ്ലിക്കേഷൻ വായിക്കാത്ത ബാഡ്ജ് കാണിക്കുക",
"Show desktop notifications": "ഡെസ്ക്ടോപ്പ് അറിയിപ്പുകൾ കാണിക്കുക",
"Show downloaded files in file manager": "ഫയൽ മാനേജറിൽ ഡ download ൺലോഡ് ചെയ്ത ഫയലുകൾ കാണിക്കുക",
"Show sidebar": "സൈഡ്‌ബാർ കാണിക്കുക",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "ലോഗിൻ ചെയ്യുമ്പോൾ അപ്ലിക്കേഷൻ ആരംഭിക്കുക",
"Switch to Next Organization": "അടുത്ത ഓർഗനൈസേഷനിലേക്ക് മാറുക",
"Switch to Previous Organization": "മുമ്പത്തെ ഓർഗനൈസേഷനിലേക്ക് മാറുക",
"These desktop app shortcuts extend the Zulip webapp's": "ഈ ഡെസ്ക്ടോപ്പ് അപ്ലിക്കേഷൻ കുറുക്കുവഴികൾ സുലിപ് വെബ്‌അപ്പിനെ വിപുലീകരിക്കുന്നു",
"This will delete all application data including all added accounts and preferences": "ചേർത്ത എല്ലാ അക്കൗണ്ടുകളും മുൻ‌ഗണനകളും ഉൾപ്പെടെ എല്ലാ ആപ്ലിക്കേഷൻ ഡാറ്റയും ഇത് ഇല്ലാതാക്കും",
"Tip": "നുറുങ്ങ്",
"Toggle DevTools for Active Tab": "സജീവ ടാബിനായി DevTools ടോഗിൾ ചെയ്യുക",
"Toggle DevTools for Zulip App": "Zulip അപ്ലിക്കേഷനായി DevTools ടോഗിൾ ചെയ്യുക",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "ട്രേ ഐക്കൺ ടോഗിൾ ചെയ്യുക",
"Tools": "ഉപകരണങ്ങൾ",
"Undo": "പഴയപടിയാക്കുക",
"Unhide": "Unhide",
"Upload": "അപ്‌ലോഡുചെയ്യുക",
"Use system proxy settings (requires restart)": "സിസ്റ്റം പ്രോക്സി ക്രമീകരണങ്ങൾ ഉപയോഗിക്കുക (പുനരാരംഭിക്കേണ്ടതുണ്ട്)",
"View": "കാണുക",
@@ -106,29 +118,10 @@
"Window": "ജാലകം",
"Window Shortcuts": "വിൻഡോ കുറുക്കുവഴികൾ",
"YES": "അതെ",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "വലുതാക്കുക",
"Zoom Out": "സൂം .ട്ട് ചെയ്യുക",
"Zulip Help": "സുലിപ് സഹായം",
"keyboard shortcuts": "കീബോർഡ് കുറുക്കുവഴികൾ",
"script": "സ്ക്രിപ്റ്റ്",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

127
public/translations/mn.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "Тухай",
"Actual Size": "Багтаамж",
"Add Organization": "Бүлэг нэмэх",
"Add a Zulip organization": "Чат бүлэг нэмэх",
"Add custom CSS": "Нэмэлт CSS нэмэх",
"AddServer": "Сервер нэмэх",
"Advanced": "Нарийвчилсан",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Minimized байдлаар эхлэнэ",
"App Updates": "App шинэчлэлт",
"App language (requires restart)": "Хэл (Унтрааж асаах шаарлагатай)",
"Appearance": "Харагдах байдал",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Та энэ бүлгээс гарахдаа итгэлтэй байна уу?",
"Ask where to save files before downloading": "Файл хаана татагдахыг асуух",
"Auto hide Menu bar": "Цэс автоматаар нуух",
"Auto hide menu bar (Press Alt key to display)": "Цэс автоматаар нуух ( Alt товч даран харна уу)",
"Back": "Буцах",
"Bounce dock on new private message": "Bounce dock on new private message",
"Change": "Өөрчлөа",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Хэл солих бол System preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Шинэчлэлт шалгах",
"Close": "Хаах",
"Connect": "Холбогдох",
"Connect to another organization": "Өөр бүлэгт Холбогдох",
"Connected organizations": "Холбогдсон бүлгүүд",
"Copy": "Хуулах",
"Copy Zulip URL": "Оффис чатын холбоос хуулах",
"Create a new organization": "Шинэ бүлэг үүсгэх",
"Cut": "Бүр мөсөн хуулах",
"Default download location": "Үндсэн татах байршил",
"Delete": "Устгах",
"Desktop Notifications": "Desktop Мэдэгдэл",
"Desktop Settings": "Desktop тохиргоо",
"Disconnect": "Холболт салгах",
"Download App Logs": "Download App Лог",
"Edit": "Засах",
"Edit Shortcuts": "Холбоос засах",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Авто шинэчлэлт идэвхижүүлэх",
"Enable error reporting (requires restart)": "Алдаа мэдэгдэгч идэвхижүүлэх (Унтрааж асаах шаарлагатай)",
"Enable spellchecker (requires restart)": "Дүрэм шалгагч идэвхижүүлэх (Унтрааж асаах шаарлагатай)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Бүх датаг цэвэрлэж дахин эхлүүлэх",
"Factory Reset Data": "Бүх датаг цэвэрлэж дахин эхлүүлэх",
"File": "файл",
"Find accounts": "Хаяг хайх",
"Find accounts by email": "Имэйлээр нь хайх",
"Flash taskbar on new message": "Мэссэж мэдэгдэх",
"Forward": "Дамжуулах",
"Functionality": "Үйлдэлүүд",
"General": "Үндсэн",
"Get beta updates": "Бэта шинэчлэлт авах",
"Hard Reload": "Дахин ачааллуулах",
"Help": "Тусламж",
"Help Center": "Тусламжийн хэсэн",
"Hide": "Нуух",
"Hide Others": "Бусдаас нуух",
"Hide Zulip": "Hide Zulip",
"History": "Ашиглалтийн түүх",
"History Shortcuts": "Холбоосын түүх",
"Keyboard Shortcuts": "Keyboard холбоос",
"Log Out": "Гарах",
"Log Out of Organization": "Бүлгээс гарах",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Бүх дууг хаах",
"NO": "NO",
"Network": "Сүлжээ",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": ".",
"Organization URL": "Бүлгийн холбоос",
"Organizations": "Бүлгүүд",
"Paste": "Хуулж тавих",
"Paste and Match Style": "Хуулж тавих",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass дүрмүүд",
"Proxy rules": "Proxy дүрмүүд",
"Quit": "Хаах",
"Quit Zulip": "Чатыг хаах",
"Quit when the window is closed": "Цонх хаагдахад гарах",
"Redo": "Дахин хийх",
"Release Notes": "Release Notes",
"Reload": "Дахин ачааллах",
"Report an Issue": "Алдааг мэдэгдэх",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Хадгалах",
"Select All": "Бүгдийн идэвхижүүлэх",
"Services": "Үйлчилгээ",
"Settings": "Тохиргоо",
"Shortcuts": "Холбоос",
"Show app icon in system tray": "Жижиг icon харуулах",
"Show app unread badge": "Уншаагүй мэдэгдэл харуулах",
"Show desktop notifications": "Мэдэгдэл харуулах",
"Show sidebar": "Хажуугын цэсийг харуулах",
"Spellchecker Languages": "Дүрэм шалгах хэлүүд",
"Start app at login": "Нэвтрэхэд ачааллуулах",
"Switch to Next Organization": "Дараагийн бүлэг",
"Switch to Previous Organization": "Өмнөх бүлэг",
"These desktop app shortcuts extend the Zulip webapp's": "Browser-оор холбогдох холбоос",
"Tip": "зөвлөгөө",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Үйлдэлээ буцаах",
"Unhide": "Нуухаа болих",
"Upload": "Файл хуулах",
"Use system proxy settings (requires restart)": "Proxy систем ашиглах (Унтрааж асаах шаарлагатай)",
"View": "Харах",
"View Shortcuts": "Холбоос харах",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "Хамгийн ихдээ 3 хэл дүрэм шалгахад ашиглана.",
"Zoom In": "Сунгах",
"Zoom Out": "Жижигрүүлэх",
"keyboard shortcuts": "keyboard холбоос",
"script": "script",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

127
public/translations/my.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
"Connect to another organization": "Connect to another organization",
"Connected organizations": "Connected organizations",
"Copy": "Copy",
"Copy Zulip URL": "Copy Zulip URL",
"Create a new organization": "Create a new organization",
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Functionality": "Functionality",
"General": "General",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out of Organization",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
"Paste and Match Style": "Paste and Match Style",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
"View Shortcuts": "View Shortcuts",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

View File

@@ -1,23 +1,25 @@
{
"About Zulip": "Over Zulip",
"Actual Size": "Ware grootte",
"Add Custom Certificates": "Aangepaste certificaten toevoegen",
"Add Organization": "Voeg organisatie toe",
"Add a Zulip organization": "Voeg een Zulip-organisatie toe",
"Add custom CSS": "Voeg aangepaste CSS toe",
"AddServer": "AddServer",
"Advanced": "gevorderd",
"All the connected organizations will appear here": "Alle verbonden organisaties verschijnen hier",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Begin altijd geminimaliseerd",
"App Updates": "App-updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Verschijning",
"Application Shortcuts": "Applicatiesnelkoppelingen",
"Are you sure you want to disconnect this organization?": "Weet je zeker dat je deze organisatie wilt ontkoppelen?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Menubalk automatisch verbergen",
"Auto hide menu bar (Press Alt key to display)": "Menubalk automatisch verbergen (druk op de Alt-toets om weer te geven)",
"Back": "Terug",
"Bounce dock on new private message": "Bounce dock op nieuw privébericht",
"Certificate file": "Certificaatbestand",
"Change": "Verandering",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Controleer op updates",
"Close": "Dichtbij",
"Connect": "Aansluiten",
@@ -29,17 +31,19 @@
"Cut": "Besnoeiing",
"Default download location": "Standaard downloadlocatie",
"Delete": "Verwijder",
"Desktop App Settings": "Desktop-app-instellingen",
"Desktop Notifications": "Bureaublad notificaties",
"Desktop Settings": "Desktop-instellingen",
"Disconnect": "Loskoppelen",
"Download App Logs": "Applogs downloaden",
"Edit": "Bewerk",
"Edit Shortcuts": "Bewerk snelkoppelingen",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Schakel automatische updates in",
"Enable error reporting (requires restart)": "Foutrapportage inschakelen (opnieuw opstarten vereist)",
"Enable spellchecker (requires restart)": "Spellingcontrole inschakelen (opnieuw opstarten vereist)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Fabrieksinstellingen",
"Factory Reset Data": "Factory Reset Data",
"File": "het dossier",
"Find accounts": "Vind accounts",
"Find accounts by email": "Vind accounts per e-mail",
@@ -51,6 +55,9 @@
"Hard Reload": "Harde herladen",
"Help": "Helpen",
"Help Center": "Helpcentrum",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "Geschiedenis",
"History Shortcuts": "Geschiedenis Sneltoetsen",
"Keyboard Shortcuts": "Toetsenbord sneltoetsen",
@@ -61,7 +68,9 @@
"Mute all sounds from Zulip": "Demp alle geluiden van Zulip",
"NO": "NEE",
"Network": "Netwerk",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OF",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organisatie-URL",
"Organizations": "organisaties",
"Paste": "Pasta",
@@ -71,25 +80,27 @@
"Proxy rules": "Proxy-regels",
"Quit": "ophouden",
"Quit Zulip": "Sluit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Opnieuw doen",
"Release Notes": "Releaseopmerkingen",
"Reload": "vernieuwen",
"Report an Issue": "Een probleem melden",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Opslaan",
"Select All": "Selecteer alles",
"Services": "Services",
"Settings": "instellingen",
"Shortcuts": "shortcuts",
"Show App Logs": "App-logs weergeven",
"Show app icon in system tray": "App-pictogram weergeven in systeemvak",
"Show app unread badge": "App ongelezen badge weergeven",
"Show desktop notifications": "Toon bureaubladmeldingen",
"Show downloaded files in file manager": "Laat gedownloade bestanden zien in bestandsbeheer",
"Show sidebar": "Toon zijbalk",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start de app bij inloggen",
"Switch to Next Organization": "Schakel over naar volgende organisatie",
"Switch to Previous Organization": "Schakel over naar vorige organisatie",
"These desktop app shortcuts extend the Zulip webapp's": "Deze sneltoetsen voor bureaubladapp breiden de Zulip-webapp's uit",
"This will delete all application data including all added accounts and preferences": "Hiermee worden alle applicatiegegevens verwijderd, inclusief alle toegevoegde accounts en voorkeuren",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "DevTools voor actieve tabblad omschakelen",
"Toggle DevTools for Zulip App": "DevTools voor Zulip-app omschakelen",
@@ -99,6 +110,7 @@
"Toggle Tray Icon": "Pictogram Lade wisselen",
"Tools": "Hulpmiddelen",
"Undo": "ongedaan maken",
"Unhide": "Unhide",
"Upload": "Uploaden",
"Use system proxy settings (requires restart)": "Systeem proxy-instellingen gebruiken (opnieuw opstarten vereist)",
"View": "Uitzicht",
@@ -106,29 +118,10 @@
"Window": "Venster",
"Window Shortcuts": "Venster snelkoppelingen",
"YES": "JA",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "In zoomen",
"Zoom Out": "Uitzoomen",
"Zulip Help": "Zulip Help",
"keyboard shortcuts": "Toetsenbord sneltoetsen",
"script": "script",
"Quit when the window is closed": "Quit when the window is closed",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Services": "Services",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Unhide": "Unhide",
"AddServer": "AddServer",
"App language (requires restart)": "App language (requires restart)",
"Factory Reset Data": "Factory Reset Data",
"Reset the application, thus deleting all the connected organizations, accounts, and certificates.": "Reset the application, thus deleting all the connected organizations, accounts, and certificates.",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Copy Link": "Copy Link",
"Copy Image": "Copy Image",
"Copy Image URL": "Copy Image URL",
"No Suggestion Found": "No Suggestion Found",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Spellchecker Languages": "Spellchecker Languages",
"Add to Dictionary": "Add to Dictionary",
"Look Up": "Look Up"
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

127
public/translations/no.json Normal file
View File

@@ -0,0 +1,127 @@
{
"About Zulip": "About Zulip",
"Actual Size": "Actual Size",
"Add Organization": "Add Organization",
"Add a Zulip organization": "Add a Zulip organization",
"Add custom CSS": "Add custom CSS",
"AddServer": "AddServer",
"Advanced": "Advanced",
"All the connected organizations will appear here.": "All the connected organizations will appear here.",
"Always start minimized": "Always start minimized",
"App Updates": "App Updates",
"App language (requires restart)": "App language (requires restart)",
"Appearance": "Appearance",
"Application Shortcuts": "Application Shortcuts",
"Are you sure you want to disconnect this organization?": "Are you sure you want to disconnect this organization?",
"Ask where to save files before downloading": "Ask where to save files before downloading",
"Auto hide Menu bar": "Auto hide Menu bar",
"Auto hide menu bar (Press Alt key to display)": "Auto hide menu bar (Press Alt key to display)",
"Back": "Back",
"Bounce dock on new private message": "Bounce dock on new private message",
"Change": "Change",
"Change the language from System Preferences → Keyboard → Text → Spelling.": "Change the language from System Preferences → Keyboard → Text → Spelling.",
"Check for Updates": "Check for Updates",
"Close": "Close",
"Connect": "Connect",
"Connect to another organization": "Connect to another organization",
"Connected organizations": "Connected organizations",
"Copy": "Copy",
"Copy Zulip URL": "Copy Zulip URL",
"Create a new organization": "Create a new organization",
"Cut": "Cut",
"Default download location": "Default download location",
"Delete": "Delete",
"Desktop Notifications": "Desktop Notifications",
"Desktop Settings": "Desktop Settings",
"Disconnect": "Disconnect",
"Download App Logs": "Download App Logs",
"Edit": "Edit",
"Edit Shortcuts": "Edit Shortcuts",
"Emoji & Symbols": "Emoji & Symbols",
"Enable auto updates": "Enable auto updates",
"Enable error reporting (requires restart)": "Enable error reporting (requires restart)",
"Enable spellchecker (requires restart)": "Enable spellchecker (requires restart)",
"Enter Full Screen": "Enter Full Screen",
"Factory Reset": "Factory Reset",
"Factory Reset Data": "Factory Reset Data",
"File": "File",
"Find accounts": "Find accounts",
"Find accounts by email": "Find accounts by email",
"Flash taskbar on new message": "Flash taskbar on new message",
"Forward": "Forward",
"Functionality": "Functionality",
"General": "General",
"Get beta updates": "Get beta updates",
"Hard Reload": "Hard Reload",
"Help": "Help",
"Help Center": "Help Center",
"Hide": "Hide",
"Hide Others": "Hide Others",
"Hide Zulip": "Hide Zulip",
"History": "History",
"History Shortcuts": "History Shortcuts",
"Keyboard Shortcuts": "Keyboard Shortcuts",
"Log Out": "Log Out",
"Log Out of Organization": "Log Out of Organization",
"Manual proxy configuration": "Manual proxy configuration",
"Minimize": "Minimize",
"Mute all sounds from Zulip": "Mute all sounds from Zulip",
"NO": "NO",
"Network": "Network",
"Network and Proxy Settings": "Network and Proxy Settings",
"OR": "OR",
"On macOS, the OS spellchecker is used.": "On macOS, the OS spellchecker is used.",
"Organization URL": "Organization URL",
"Organizations": "Organizations",
"Paste": "Paste",
"Paste and Match Style": "Paste and Match Style",
"Proxy": "Proxy",
"Proxy bypass rules": "Proxy bypass rules",
"Proxy rules": "Proxy rules",
"Quit": "Quit",
"Quit Zulip": "Quit Zulip",
"Quit when the window is closed": "Quit when the window is closed",
"Redo": "Redo",
"Release Notes": "Release Notes",
"Reload": "Reload",
"Report an Issue": "Report an Issue",
"Reset App Settings": "Reset App Settings",
"Reset the application, thus deleting all the connected organizations and accounts.": "Reset the application, thus deleting all the connected organizations and accounts.",
"Save": "Save",
"Select All": "Select All",
"Services": "Services",
"Settings": "Settings",
"Shortcuts": "Shortcuts",
"Show app icon in system tray": "Show app icon in system tray",
"Show app unread badge": "Show app unread badge",
"Show desktop notifications": "Show desktop notifications",
"Show sidebar": "Show sidebar",
"Spellchecker Languages": "Spellchecker Languages",
"Start app at login": "Start app at login",
"Switch to Next Organization": "Switch to Next Organization",
"Switch to Previous Organization": "Switch to Previous Organization",
"These desktop app shortcuts extend the Zulip webapp's": "These desktop app shortcuts extend the Zulip webapp's",
"Tip": "Tip",
"Toggle DevTools for Active Tab": "Toggle DevTools for Active Tab",
"Toggle DevTools for Zulip App": "Toggle DevTools for Zulip App",
"Toggle Do Not Disturb": "Toggle Do Not Disturb",
"Toggle Full Screen": "Toggle Full Screen",
"Toggle Sidebar": "Toggle Sidebar",
"Toggle Tray Icon": "Toggle Tray Icon",
"Tools": "Tools",
"Undo": "Undo",
"Unhide": "Unhide",
"Upload": "Upload",
"Use system proxy settings (requires restart)": "Use system proxy settings (requires restart)",
"View": "View",
"View Shortcuts": "View Shortcuts",
"Window": "Window",
"Window Shortcuts": "Window Shortcuts",
"YES": "YES",
"You can select a maximum of 3 languages for spellchecking.": "You can select a maximum of 3 languages for spellchecking.",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"keyboard shortcuts": "keyboard shortcuts",
"script": "script",
"{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app.": "{{{server}}} runs an outdated Zulip Server version {{{version}}}. It may not fully work in this app."
}

Some files were not shown because too many files have changed in this diff Show More