From 651c9bd29db7db9aef3ee3d8fb9879f80ccf2987 Mon Sep 17 00:00:00 2001 From: marlon-erler Date: Fri, 9 Oct 2026 16:14:32 +0200 Subject: [PATCH] add button to share chat, add VDMDI tag, fixes --- dist/index.css | 2 +- dist/index.js | 74 +- dist/styles.css | 2 +- dist/sw.js | 2 +- dist/vdmdi-logo.png | Bin 0 -> 67097 bytes dist/version.txt | 2 +- src/View/ChatPages/settingsPage.tsx | 10 +- src/View/Modals/settingsModal.tsx | 21 +- src/View/translations.ts | 1796 ++++++++++++----------- src/ViewModel/Chat/chatListViewModel.ts | 3 + src/ViewModel/Chat/chatViewModel.ts | 6 + src/ViewModel/Global/coreViewModel.ts | 5 + src/index.tsx | 3 +- 13 files changed, 1012 insertions(+), 914 deletions(-) create mode 100644 dist/vdmdi-logo.png diff --git a/dist/index.css b/dist/index.css index f1183254..4435b4f8 100644 --- a/dist/index.css +++ b/dist/index.css @@ -445,7 +445,7 @@ body[showing-chat] #chat-page-wrapper { justify-content: space-between; } #chat-page > div > #ribbon > span { - overflowx: hidden; + overflow-x: hidden; flex-direction: column; justify-content: end; } diff --git a/dist/index.js b/dist/index.js index a9a11824..e331f0a3 100644 --- a/dist/index.js +++ b/dist/index.js @@ -348,7 +348,7 @@ greeting: (name) => `Hi ${name}`, /// serverAddress: "Server address", - serverAddressPlaceholder: "wss://udn-s1.onrender.com", + serverAddressPlaceholder: "wss://udn.vdpr.org", connectAudioLabel: "connect to server", disconnectAudioLabel: "disconnect from server", manageConnectionsAudioLabel: "manage connections", @@ -385,7 +385,9 @@ }, about: { version: "Version", - checkUpdatesButton: "Check for updates" + checkUpdatesButton: "Check for updates", + brand: "Developed by VDMDI", + brandDescription: "Code available on Viridian Public Resources (VDPR)" } }, onboarding: { @@ -472,6 +474,7 @@ settingsHeadline: "Settings", nameLabel: "Chat name", setNameButtonAudioLabel: "set name", + transferLabel: "Share chat", newSecondaryChannelPlaceholder: "Add secondary channel", newSecondaryChannelAudioLabel: "name of new secondary channel", addSecondaryChannelButtonAudioLabel: "add secondary channel", @@ -623,7 +626,7 @@ appName: "Coordination Tool", greeting: (name) => `Hallo ${name}`, serverAddress: "Serveradresse", - serverAddressPlaceholder: "wss://udn-s1.onrender.com", + serverAddressPlaceholder: "wss://udn.vdpr.org", connectAudioLabel: "mit Server verbinden", disconnectAudioLabel: "vom Server trennen", manageConnectionsAudioLabel: "Verbindungen verwalten", @@ -659,7 +662,9 @@ }, about: { version: "Version", - checkUpdatesButton: "Nach Updates suchen" + checkUpdatesButton: "Nach Updates suchen", + brand: "Software von VDMDI", + brandDescription: "Code verf\xFCgbar auf Viridian Public Resources (VDPR)" } }, onboarding: { @@ -740,13 +745,14 @@ settingsHeadline: "Einstellungen", nameLabel: "Name", setNameButtonAudioLabel: "namen festlegen", + transferLabel: "Chat teilen", newSecondaryChannelPlaceholder: "Sekund\xE4ren Kanal hinzuf\xFCgen", newSecondaryChannelAudioLabel: "Name des neuen sekund\xE4ren Kanals", addSecondaryChannelButtonAudioLabel: "Sekund\xE4ren Kanal hinzuf\xFCgen", encryptionKeyLabel: "Schl\xFCssel", setEncryptionKeyButtonAudioLabel: "Schl\xFCssel festlegen", showEncryptionKey: "Schl\xFCssel anzeigen", - randomizeKey: "Zuf\xE4llig generieren", + randomizeKey: "Generieren", setColorButtonAudioLabel: "Farbe festlegen", deleteChatButton: "Gesamten Chat l\xF6schen", deleteChatHeadline: "Gesamten Chat l\xF6schen?", @@ -795,7 +801,7 @@ filterTasksButtonAudioLabel: "Aufgaben filtern", createTaskButtonAudioLabel: "Neue Aufgabe erstellen", boardSettingsHeadline: "Board-Einstellungen", - boardNameInputLabel: "Boardname", + boardNameInputLabel: "Name", deleteBoardButton: "Board und alle Aufgaben l\xF6schen", taskSettingsHeadline: "Aufgabe bearbeiten", taskNameLabel: "Titel", @@ -878,7 +884,7 @@ appName: "Coordination Tool", greeting: (name) => `Hola ${name}`, serverAddress: "Direcci\xF3n del servidor", - serverAddressPlaceholder: "wss://udn-s1.onrender.com", + serverAddressPlaceholder: "wss://udn.vdpr.org", connectAudioLabel: "conectar al servidor", disconnectAudioLabel: "desconectar del servidor", manageConnectionsAudioLabel: "gestionar conexiones", @@ -914,7 +920,9 @@ }, about: { version: "Versi\xF3n", - checkUpdatesButton: "Buscar actualisaciones" + checkUpdatesButton: "Buscar actualisaciones", + brand: "Software de VDMDI", + brandDescription: "Code desponible en Viridian Public Resources (VDPR)" } }, onboarding: { @@ -995,6 +1003,7 @@ settingsHeadline: "Configuraci\xF3n", nameLabel: "Nombre del chat", setNameButtonAudioLabel: "establecer nombre", + transferLabel: "Compartir chat", newSecondaryChannelPlaceholder: "A\xF1adir canal secundario", newSecondaryChannelAudioLabel: "nombre del nuevo canal secundario", addSecondaryChannelButtonAudioLabel: "a\xF1adir canal secundario", @@ -1530,6 +1539,10 @@ window.location.reload(); }, 500); }; + // VDPR + this.openVDPR = () => { + window.open("https://vdpr.org/VDMDI/CT"); + }; this.translations = allTranslations[settingsModel2.language] || allTranslations.en; this.latestVersion.subscribe((latestVersion) => { this.updateText.value = this.translations.homePage.updateButton(latestVersion); @@ -5150,7 +5163,7 @@ // src/ViewModel/Chat/chatViewModel.ts var ChatViewModel6 = class extends ContextHost { // init - constructor(coreViewModel2, chatModel, settingsViewModel2, notificationViewModel, connectionViewModel2, chatListViewModel2, contactListViewModel2) { + constructor(coreViewModel2, chatModel, settingsViewModel2, notificationViewModel, connectionViewModel2, chatListViewModel2, contactListViewModel2, fileTransferViewModel2) { super("chat", coreViewModel2); this.coreViewModel = coreViewModel2; this.chatModel = chatModel; @@ -5159,6 +5172,7 @@ this.connectionViewModel = connectionViewModel2; this.chatListViewModel = chatListViewModel2; this.contactListViewModel = contactListViewModel2; + this.fileTransferViewModel = fileTransferViewModel2; // state this.displayedColor = new State("standard" /* Standard */); this.selectedPage = new State( @@ -5191,6 +5205,9 @@ const index = this.chatListViewModel.chatIndexManager.getIndex(this); this.index.value = index; }; + this.share = () => { + this.fileTransferViewModel.showDirectionSelectionModal(); + }; // load this.loadPageSelection = () => { const path = StorageModel.getPath( @@ -5390,11 +5407,12 @@ // src/ViewModel/Chat/chatListViewModel.ts var ChatListViewModel = class { // init - constructor(coreViewModel2, settingsViewModel2, connectionViewModel2, contactListViewModel2) { + constructor(coreViewModel2, settingsViewModel2, connectionViewModel2, contactListViewModel2, fileTransferViewModel2) { this.coreViewModel = coreViewModel2; this.settingsViewModel = settingsViewModel2; this.connectionViewModel = connectionViewModel2; this.contactListViewModel = contactListViewModel2; + this.fileTransferViewModel = fileTransferViewModel2; // data this.chatIndexManager = new IndexManager( (chatViewModel) => chatViewModel.settingsPageViewModel.name.value @@ -5434,7 +5452,8 @@ this.notificationViewModel, this.connectionViewModel, this, - this.contactListViewModel + this.contactListViewModel, + this.fileTransferViewModel ); }; this.updateIndices = () => { @@ -6731,7 +6750,15 @@ } ); }; - return /* @__PURE__ */ createElement("div", { id: "settings-page" }, /* @__PURE__ */ createElement("div", { class: "pane-wrapper" }, /* @__PURE__ */ createElement("div", { class: "pane" }, /* @__PURE__ */ createElement("div", { class: "toolbar" }, /* @__PURE__ */ createElement("span", { class: "title" }, coreViewModel2.translations.chatPage.settings.settingsHeadline)), /* @__PURE__ */ createElement("div", { class: "content" }, /* @__PURE__ */ createElement("label", { class: "tile flex-no" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "forum"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, coreViewModel2.translations.chatPage.settings.nameLabel), /* @__PURE__ */ createElement( + return /* @__PURE__ */ createElement("div", { id: "settings-page" }, /* @__PURE__ */ createElement("div", { class: "pane-wrapper" }, /* @__PURE__ */ createElement("div", { class: "pane" }, /* @__PURE__ */ createElement("div", { class: "toolbar" }, /* @__PURE__ */ createElement("span", { class: "title" }, coreViewModel2.translations.chatPage.settings.settingsHeadline)), /* @__PURE__ */ createElement("div", { class: "content" }, /* @__PURE__ */ createElement( + "button", + { + class: "standard width-input", + "on:click": settingsPageViewModel.chatViewModel.share + }, + /* @__PURE__ */ createElement("span", null, coreViewModel2.translations.chatPage.settings.transferLabel), + /* @__PURE__ */ createElement("span", { class: "icon" }, "share") + ), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("label", { class: "tile flex-no" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "forum"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, coreViewModel2.translations.chatPage.settings.nameLabel), /* @__PURE__ */ createElement( "input", { "bind:value": settingsPageViewModel.nameInput, @@ -7978,7 +8005,23 @@ }, /* @__PURE__ */ createElement("span", { "subscribe:innerText": coreViewModel2.updateText }), /* @__PURE__ */ createElement("span", { class: "icon" }, "update") - ), /* @__PURE__ */ createElement("button", { class: "standard", "on:click": coreViewModel2.checkUpdates }, coreViewModel2.translations.settings.about.checkUpdatesButton))); + ), /* @__PURE__ */ createElement("button", { class: "standard", "on:click": coreViewModel2.checkUpdates }, coreViewModel2.translations.settings.about.checkUpdatesButton), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement( + "img", + { + class: "width-100", + style: "max-width: 256px", + src: "/vdmdi-logo.png" + } + ), /* @__PURE__ */ createElement( + "button", + { + class: "tile flex-row", + "on:click": coreViewModel2.openVDPR + }, + /* @__PURE__ */ createElement("span", { class: "icon" }, "code"), + /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("b", null, coreViewModel2.translations.settings.about.brand), /* @__PURE__ */ createElement("span", { class: "secondary" }, coreViewModel2.translations.settings.about.brandDescription)), + /* @__PURE__ */ createElement("span", { class: "icon" }, "open_in_new") + ))); } function SettingsRegionalPane(coreViewModel2, settingsViewModel2) { return /* @__PURE__ */ createElement("div", { class: "slide-up" }, /* @__PURE__ */ createElement("h2", null, coreViewModel2.translations.settings.pages.regional), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("h3", null, coreViewModel2.translations.settings.regional.language), OptionButtonList( @@ -9317,13 +9360,14 @@ settingsViewModel ); var connectionViewModel = new ConnectionViewModel(coreViewModel); + var fileTransferViewModel = new FileTransferViewModel(coreViewModel); var chatListViewModel = new ChatListViewModel( coreViewModel, settingsViewModel, connectionViewModel, - contactListViewModel + contactListViewModel, + fileTransferViewModel ); - var fileTransferViewModel = new FileTransferViewModel(coreViewModel); var onboardingViewModel = new OnboardingViewModel( connectionViewModel, fileTransferViewModel, diff --git a/dist/styles.css b/dist/styles.css index 257db030..9ec60440 100644 --- a/dist/styles.css +++ b/dist/styles.css @@ -280,7 +280,7 @@ SIZES body { /* gap */ --gap-between-tiles: 4px; - --gap-in-controls: 7px; + --gap-in-controls: 9px; --gap-in-tab-links: 1rem; --text-gap: 1.2rem; --large-gap: 2rem; diff --git a/dist/sw.js b/dist/sw.js index a0f8c162..369a2070 100644 --- a/dist/sw.js +++ b/dist/sw.js @@ -1,4 +1,4 @@ -const VERSION = "2610 Beta 22" +const VERSION = "2610 Beta 25" function processUrl(event) { const url = event.request.url; diff --git a/dist/vdmdi-logo.png b/dist/vdmdi-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f710cc95f203b1c42526fec16c3ae8d6d63fc0e9 GIT binary patch literal 67097 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 -
+
+ +
); diff --git a/src/View/translations.ts b/src/View/translations.ts index 404de4d2..5b507e24 100644 --- a/src/View/translations.ts +++ b/src/View/translations.ts @@ -1,381 +1,385 @@ const englishTranslations = { updater: { - migrated: "Migrated", + migrated: "Migrated", }, general: { - deleteItemButtonAudioLabel: "delete item", - searchButtonAudioLabel: "search", - searchButtonClearAudioLabel: "clear search query", + deleteItemButtonAudioLabel: "delete item", + searchButtonAudioLabel: "search", + searchButtonClearAudioLabel: "clear search query", - abortButton: "Abort", - applyButton: "Apply", - backButton: "Back", - cancelButton: "Cancel", - confirmButton: "Confirm", - continueButton: "Continue", - closeButton: "Close", - deleteButton: "Delete", - exitButton: "Exit", - fullscreenButton: "Fullscreen", - refreshButton: "Refresh", - saveButton: "Save", - setButton: "Set", + abortButton: "Abort", + applyButton: "Apply", + backButton: "Back", + cancelButton: "Cancel", + confirmButton: "Confirm", + continueButton: "Continue", + closeButton: "Close", + deleteButton: "Delete", + exitButton: "Exit", + fullscreenButton: "Fullscreen", + refreshButton: "Refresh", + saveButton: "Save", + setButton: "Set", - selectAllLabel: "Select all", + selectAllLabel: "Select all", - filterOrCreateLabel: (type: string) => `Search or create ${type}`, - createLabel: (query: string) => `Create "${query}"`, + filterOrCreateLabel: (type: string) => `Search or create ${type}`, + createLabel: (query: string) => `Create "${query}"`, - reloadAppButton: "Reload App", + reloadAppButton: "Reload App", - fileVersionLabel: "Version", - searchLabel: "Search", - searchSuggestionsLabel: "Recent searches", - waitingLabel: "Waiting...", + fileVersionLabel: "Version", + searchLabel: "Search", + searchSuggestionsLabel: "Recent searches", + waitingLabel: "Waiting...", - restoreConnection: "Restore connection", + restoreConnection: "Restore connection", - noPageSelected: "No page selected", + noPageSelected: "No page selected", }, regional: { - weekdays: { - full: [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - ], - abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - }, + weekdays: { + full: [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + ], + abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + }, }, homePage: { - appName: "Coordination Tool", - greeting: (name: string) => `Hi ${name}`, + appName: "Coordination Tool", + greeting: (name: string) => `Hi ${name}`, - /// + /// - serverAddress: "Server address", - serverAddressPlaceholder: "wss://udn-s1.onrender.com", - connectAudioLabel: "connect to server", - disconnectAudioLabel: "disconnect from server", - manageConnectionsAudioLabel: "manage connections", + serverAddress: "Server address", + serverAddressPlaceholder: "wss://udn.vdpr.org", + connectAudioLabel: "connect to server", + disconnectAudioLabel: "disconnect from server", + manageConnectionsAudioLabel: "manage connections", - settingsButton: "Settings", - manageStorageButton: "Manage storage", - transferDataButton: "Transfer or export data", + settingsButton: "Settings", + manageStorageButton: "Manage storage", + transferDataButton: "Transfer or export data", - updateButton: (version: string) => `Update to ${version}`, + updateButton: (version: string) => `Update to ${version}`, - /// + /// - typeChat: "chat", - noChatsPlaceholder: "No chats", + typeChat: "chat", + noChatsPlaceholder: "No chats", }, settings: { - pages: { - appearance: "Appearance", - account: "Account", - regional: "Language & Region", - info: "About CT", - }, - themes: { - dynamic: "Dynamic", - dark: "Dark", - light: "Light", - system: "Device theme", - black: "Black", - }, - account: { - yourNameLabel: "Your name", - yourNamePlaceholder: "Jane Doe", - setNameButtonAudioLabel: "set name", - }, - regional: { - language: "Language", - firstDayOfWeekLabel: "First day of week", - }, - about: { - version: "Version", - checkUpdatesButton: "Check for updates", - }, + pages: { + appearance: "Appearance", + account: "Account", + regional: "Language & Region", + info: "About CT", + }, + themes: { + dynamic: "Dynamic", + dark: "Dark", + light: "Light", + system: "Device theme", + black: "Black", + }, + account: { + yourNameLabel: "Your name", + yourNamePlaceholder: "Jane Doe", + setNameButtonAudioLabel: "set name", + }, + regional: { + language: "Language", + firstDayOfWeekLabel: "First day of week", + }, + about: { + version: "Version", + checkUpdatesButton: "Check for updates", + brand: "Developed by VDMDI", + brandDescription: "Code available on Viridian Public Resources (VDPR)" + }, }, onboarding: { - connectionHeadline: "Connect to UDN", - connectionDescription: - "To transfer files and send messages, connect to the Universal Decentralized Network (UDN).", - connectButton: "Connect", - connectionNextButton: (isConnected: boolean): string => - isConnected ? "Continue" : "Set up without UDN", + connectionHeadline: "Connect to UDN", + connectionDescription: + "To transfer files and send messages, connect to the Universal Decentralized Network (UDN).", + connectButton: "Connect", + connectionNextButton: (isConnected: boolean): string => + isConnected ? "Continue" : "Set up without UDN", - /// + /// - transferOptionsHeadline: "Copy Your Data", - transferOptionsDescription: - "If you already use the Coordination Tool on another device, copy your identity here. You can use both devices at the same time.", - transferOptionTransfer: "Copy my data here", - transferOptionNew: "Set up as new device", + transferOptionsHeadline: "Copy Your Data", + transferOptionsDescription: + "If you already use the Coordination Tool on another device, copy your identity here. You can use both devices at the same time.", + transferOptionTransfer: "Copy my data here", + transferOptionNew: "Set up as new device", - // + // - nameHeadline: "Your Name", - nameDescription: - "This is what others see when you send messages. You can always change your name in settings.", + nameHeadline: "Your Name", + nameDescription: + "This is what others see when you send messages. You can always change your name in settings.", - // + // - transferHeadline: "Data Transfer", - transferDescription: - "On your other device, prepare to transfer your identity and personal data alongside any chats you wish to copy. Then, enter the displayed data here. You can find the data transfer on the home screen of the other device.", - transferButton: "Copy data", + transferHeadline: "Data Transfer", + transferDescription: + "On your other device, prepare to transfer your identity and personal data alongside any chats you wish to copy. Then, enter the displayed data here. You can find the data transfer on the home screen of the other device.", + transferButton: "Copy data", }, connectionModal: { - connectionModalHeadline: "Manage Connections", + connectionModalHeadline: "Manage Connections", - /// + /// - connectButtonAudioLabel: "connect", + connectButtonAudioLabel: "connect", }, dataTransferModal: { - transferDataHeadline: "Data Transfer", - sendHeadline: "Transfer to other device", - receiveHeadline: "Transfer to This Device", - exportHeadline: "Export Data", - importHeadline: "Import Data", - selectionDescription: "Select the data that you want to transfer.", - exportSelectionDescription: "Select the data that you want to export.", - dataEntryDescription: "Enter this data on the other device.", - dataEntryInputDescription: - "Enter the data displayed on the other device.", + transferDataHeadline: "Data Transfer", + sendHeadline: "Transfer to other device", + receiveHeadline: "Transfer to This Device", + exportHeadline: "Export Data", + importHeadline: "Import Data", + selectionDescription: "Select the data that you want to transfer.", + exportSelectionDescription: "Select the data that you want to export.", + dataEntryDescription: "Enter this data on the other device.", + dataEntryInputDescription: + "Enter the data displayed on the other device.", - /// + /// - fromThisDeviceButton: "Send to other device", - toThisDeviceButton: "Send to this device", - exportButton: "Export to file", - importButton: "Import from file", + fromThisDeviceButton: "Send to other device", + toThisDeviceButton: "Send to this device", + exportButton: "Export to file", + importButton: "Import from file", - /// + /// - generalHeadline: "General", + generalHeadline: "General", - connectionData: "Connection data", - settingsData: "Identity & personal data", + connectionData: "Connection data", + settingsData: "Identity & personal data", - chatsHeadline: "Chats", - noChatsPlaceholder: "No chats", + chatsHeadline: "Chats", + noChatsPlaceholder: "No chats", - /// + /// - transferChannelHeadline: "Transfer Chanel", - transferKeyHeadline: "Transfer Encryption Key", + transferChannelHeadline: "Transfer Chanel", + transferKeyHeadline: "Transfer Encryption Key", - sendButton: "Send", - sendAgainButton: "Send again", + sendButton: "Send", + sendAgainButton: "Send again", - /// + /// - filesSentProgress: (progress: number, total: number) => - `Sent ${progress} of ${total} files`, - filesReceivedProgress: (progress: number, total: number) => - `Received ${progress} of ${total} files`, + filesSentProgress: (progress: number, total: number) => + `Sent ${progress} of ${total} files`, + filesReceivedProgress: (progress: number, total: number) => + `Received ${progress} of ${total} files`, - // + // - exportKey: "Encryption key", - exportKeyConfirmation: "Confirm", - downloadFileButton: "Download", - importFileButton: "Import", - decryptImportButton: "Decrypt", - incorrectPassphraseError: "The encryption key is incorrect", + exportKey: "Encryption key", + exportKeyConfirmation: "Confirm", + downloadFileButton: "Download", + importFileButton: "Import", + decryptImportButton: "Decrypt", + incorrectPassphraseError: "The encryption key is incorrect", }, storage: { - noItemSelected: "No item selected", - notAFile: "(not a file)", - contentEmpty: "(empty)", + noItemSelected: "No item selected", + notAFile: "(not a file)", + contentEmpty: "(empty)", - usageLabel: "Usage", - usageVauleLabel: (used: number, max: number) => `${used} of ${max} MB`, + usageLabel: "Usage", + usageVauleLabel: (used: number, max: number) => `${used} of ${max} MB`, - path: "Path", - content: "Content", + path: "Path", + content: "Content", - deleteItem: "Delete item", + deleteItem: "Delete item", - removeJunkButton: "Delete junk files", + removeJunkButton: "Delete junk files", }, chatPage: { - closeChatAudioLabe: "close chat", - chatSettingsAudioLabel: "chat settings", + closeChatAudioLabe: "close chat", + chatSettingsAudioLabel: "chat settings", - pages: { - settings: "Settings", - messages: "Messages", - tasks: "Tasks", - calendar: "Calendar", - }, + pages: { + settings: "Settings", + messages: "Messages", + tasks: "Tasks", + calendar: "Calendar", + }, - settings: { - settingsHeadline: "Settings", + settings: { + settingsHeadline: "Settings", - nameLabel: "Chat name", - setNameButtonAudioLabel: "set name", + nameLabel: "Chat name", + setNameButtonAudioLabel: "set name", - newSecondaryChannelPlaceholder: "Add secondary channel", - newSecondaryChannelAudioLabel: "name of new secondary channel", - addSecondaryChannelButtonAudioLabel: "add secondary channel", + transferLabel: "Share chat", - encryptionKeyLabel: "Encryption key", - setEncryptionKeyButtonAudioLabel: "set encryption key", - showEncryptionKey: "Show encryption key", - randomizeKey: "Randomize", + newSecondaryChannelPlaceholder: "Add secondary channel", + newSecondaryChannelAudioLabel: "name of new secondary channel", + addSecondaryChannelButtonAudioLabel: "add secondary channel", - setColorButtonAudioLabel: "set color", + encryptionKeyLabel: "Encryption key", + setEncryptionKeyButtonAudioLabel: "set encryption key", + showEncryptionKey: "Show encryption key", + randomizeKey: "Randomize", - deleteChatButton: "Delete entire chat", - deleteChatHeadline: "Delete chat?", - deleteChatDescription: - "This will delete all messages, tasks, and other data related to this chat from device.", - }, + setColorButtonAudioLabel: "set color", - message: { - messagesHeadline: "Messages", + deleteChatButton: "Delete entire chat", + deleteChatHeadline: "Delete chat?", + deleteChatDescription: + "This will delete all messages, tasks, and other data related to this chat from device.", + }, - messageFilterHeadline: "Filter messages", - messageFilterReactionsHadline: "Reactions", - messageFilterAllReactionsButton: "Show all", + message: { + messagesHeadline: "Messages", - /// + messageFilterHeadline: "Filter messages", + messageFilterReactionsHadline: "Reactions", + messageFilterAllReactionsButton: "Show all", - composerInputPlaceholder: "Type a message...", - sendMessageButtonAudioLabel: "send message", - filterMessagesButtonAudioLabel: "filter messages", + /// - /// + composerInputPlaceholder: "Type a message...", + sendMessageButtonAudioLabel: "send message", + filterMessagesButtonAudioLabel: "filter messages", - showMessageInfoButtonAudioLabel: "show message info", - messageInfoHeadline: "Message Info", - cancelReplyAudioLabel: "cancel reply", + /// - sentBy: "Sent by", - timeSent: "Time sent", - channel: "Channel", - messageContent: "Message content", + showMessageInfoButtonAudioLabel: "show message info", + messageInfoHeadline: "Message Info", + cancelReplyAudioLabel: "cancel reply", - copyMessageButton: "Copy message", - resendMessageButton: "Resend message", - decryptMessageButton: "Decrypt message", - replyToMessageButton: "Reply to message", - deleteMessageButton: "Delete message", + sentBy: "Sent by", + timeSent: "Time sent", + channel: "Channel", + messageContent: "Message content", - // + copyMessageButton: "Copy message", + resendMessageButton: "Resend message", + decryptMessageButton: "Decrypt message", + replyToMessageButton: "Reply to message", + deleteMessageButton: "Delete message", - thumbsUpReaction: "Reaction: thumbs up", - checkReaction: "Reaction: check", - stopReaction: "Reaction: stop sign", - attentionReaction: "Reaction: exclamation mark", - doubleAttentionReaction: "Reaction: double exclamation mark", - questionReaction: "Reaction: question mark", + // - // + thumbsUpReaction: "Reaction: thumbs up", + checkReaction: "Reaction: check", + stopReaction: "Reaction: stop sign", + attentionReaction: "Reaction: exclamation mark", + doubleAttentionReaction: "Reaction: double exclamation mark", + questionReaction: "Reaction: question mark", - replyPrefixLabel: "Replies: ", - replyHeaderLabel: (message: string) => `Replies to "${message}"`, - }, + // - task: { - noBoardSelected: "No board selected", - boardNotFound: "Board not found", + replyPrefixLabel: "Replies: ", + replyHeaderLabel: (message: string) => `Replies to "${message}"`, + }, - typeBoard: "board", + task: { + noBoardSelected: "No board selected", + boardNotFound: "Board not found", - /// + typeBoard: "board", - closeBoardButtonAudioLabel: "close board", - toggleBoardButtonAudioLabel: "toggle board list", - showBoardSettingsButtonAudioLabel: "show board settigns", + /// - listViewButtonAudioLabel: "list view", - kanbanViewButtonAudioLabel: "kanban view", - statusViewButtonAudioLabel: "status grid view", + closeBoardButtonAudioLabel: "close board", + toggleBoardButtonAudioLabel: "toggle board list", + showBoardSettingsButtonAudioLabel: "show board settigns", - filterTasksButtonAudioLabel: "filter tasks", - createTaskButtonAudioLabel: "create new task", + listViewButtonAudioLabel: "list view", + kanbanViewButtonAudioLabel: "kanban view", + statusViewButtonAudioLabel: "status grid view", - /// + filterTasksButtonAudioLabel: "filter tasks", + createTaskButtonAudioLabel: "create new task", - boardSettingsHeadline: "Board Settings", - boardNameInputLabel: "Board name", - deleteBoardButton: "Delete board and all tasks", + /// - /// + boardSettingsHeadline: "Board Settings", + boardNameInputLabel: "Board name", + deleteBoardButton: "Delete board and all tasks", - taskSettingsHeadline: "Edit Task", + /// - taskNameLabel: "Title", - taskBoardLabel: "Board", + taskSettingsHeadline: "Edit Task", - taskCategoryLabel: "Category", - taskStatusLabel: "Status", - taskPriorityLabel: "Priority", + taskNameLabel: "Title", + taskBoardLabel: "Board", - taskDescriptionLabel: "Description", + taskCategoryLabel: "Category", + taskStatusLabel: "Status", + taskPriorityLabel: "Priority", - taskDateLabel: "Date", - taskTimeLabel: "Time", + taskDescriptionLabel: "Description", - deleteTaskButton: "Delete task", + taskDateLabel: "Date", + taskTimeLabel: "Time", - /// + deleteTaskButton: "Delete task", - filterTasksHeadline: "Filter Tasks", + /// - /// + filterTasksHeadline: "Filter Tasks", - renameCategoryInputPlaceholder: "Rename category", - renameStatusInputPlaceholder: "Rename status", - }, + /// - calendar: { - eventsBoard: "Events", + renameCategoryInputPlaceholder: "Rename category", + renameStatusInputPlaceholder: "Rename status", + }, - /// + calendar: { + eventsBoard: "Events", - todayButtonAudioLabel: "go to today", + /// - previousMonthButtonAudioLabel: "previous month", - nextMonthButtonAudioLabel: "next month", + todayButtonAudioLabel: "go to today", - yearInputAudioLabel: "year", - monthInputAudioLabel: "month", + previousMonthButtonAudioLabel: "previous month", + nextMonthButtonAudioLabel: "next month", - yearInputPlaceholder: "2000", - monthInputPlaceholder: "01", + yearInputAudioLabel: "year", + monthInputAudioLabel: "month", - /// + yearInputPlaceholder: "2000", + monthInputPlaceholder: "01", - searchEventsHeadline: "Search Events", + /// - /// + searchEventsHeadline: "Search Events", - events: "Events", - noEvents: "No events", + /// - // + events: "Events", + noEvents: "No events", - eventNext: "Up next", - }, + // + + eventNext: "Up next", + }, }, }; @@ -385,707 +389,715 @@ export const allTranslations: { en: englishTranslations, de: { - updater: { - migrated: "Migriert", - }, - - general: { - deleteItemButtonAudioLabel: "element löschen", - searchButtonAudioLabel: "suchen", - searchButtonClearAudioLabel: "suche zurücksetzen", - - abortButton: "Abbrechen", - applyButton: "Anwenden", - backButton: "Zurück", - cancelButton: "Abbrechen", - continueButton: "Weiter", - confirmButton: "Bestätigen", - closeButton: "Schließen", - deleteButton: "Löschen", - exitButton: "Schließen", - fullscreenButton: "Vollbild", - refreshButton: "Aktualisieren", - saveButton: "Speichern", - setButton: "OK", - - selectAllLabel: "Alle auswählen", - - filterOrCreateLabel: (type: string) => - `${type} suchen oder erstellen`, - createLabel: (query: string) => `"${query}" erstellen`, - - reloadAppButton: "Neu laden", - - fileVersionLabel: "Version", - searchLabel: "Suche", - searchSuggestionsLabel: "Vorherige Suchen", - waitingLabel: "Warten...", - - restoreConnection: "Verbindung wiederherstellen", - - noPageSelected: "Keine Seite ausgewählt", - }, - - regional: { - weekdays: { - full: [ - "Sonntag", - "Montag", - "Dienstag", - "Mittwoch", - "Donnerstag", - "Freitag", - "Samstag", - ], - abbreviated: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], - }, - }, - - homePage: { - appName: "Coordination Tool", - greeting: (name: string) => `Hallo ${name}`, - - serverAddress: "Serveradresse", - serverAddressPlaceholder: "wss://udn-s1.onrender.com", - connectAudioLabel: "mit Server verbinden", - disconnectAudioLabel: "vom Server trennen", - manageConnectionsAudioLabel: "Verbindungen verwalten", - - settingsButton: "Einstellungen", - manageStorageButton: "Daten verwalten", - transferDataButton: "Daten übertragen", - - updateButton: (version: string) => `Aktualisieren: ${version}`, - - typeChat: "Chat", - noChatsPlaceholder: "Keine Chats", - }, - - settings: { - pages: { - appearance: "Erscheinungsbild", - account: "Konto", - regional: "Sprache & Region", - info: "Über CT", - }, - themes: { - dynamic: "Dynamisch", - dark: "Dunkel", - light: "Hell", - system: "Geräteeinstellung", - black: "Schwarz", - }, - account: { - yourNameLabel: "Dein Name", - yourNamePlaceholder: "Max Mustermann", - setNameButtonAudioLabel: "Namen festlegen", - }, - regional: { - language: "Sprache", - firstDayOfWeekLabel: "Erster Wochentag", - }, - about: { - version: "Version", - checkUpdatesButton: "Nach Updates suchen", - }, - }, - - onboarding: { - connectionHeadline: "Mit UDN verbinden", - connectionDescription: - "Um Daten und Nachichten zu verschicken, verbinde dich mit dem Universellen Dezentralen Netzwerk (UDN).", - connectButton: "Verbinden", - connectionNextButton: (isConnected: boolean) => - isConnected ? "Weiter" : "Ohne UDN einrichten", - - /// - - transferOptionsHeadline: "Deine Daten kopieren", - transferOptionsDescription: - "Wenn du Coordination Tool bereits auf einem anderen Gerät verwendest, kopiere deine Kontodaten. Du kannst beide Geräte gleichzeitig verwenden.", - transferOptionTransfer: "Daten übertragen", - transferOptionNew: "Als neues Gerät enrichten", - - // - - nameHeadline: "Dein Name", - nameDescription: - "Diesen Namen sehen andere, wenn du Nachrichten versendest. Du kannst deinen Namen jederzeit in den Einstellungen ändern.", - - // - - transferHeadline: "Datenübertragung", - transferDescription: - "Verwende die Funktion zur Datenübertragung auf deinem anderen Getät, um deine Identität und persönlichen Daten zu kopieren. Gib die dazu angezeigten Daten unten ein. Du findest die Datenübertragung auf der Startseite des anderen Geräts.", - transferButton: "Daten kopieren", - }, - - connectionModal: { - connectionModalHeadline: "Verbindungen verwalten", - - connectButtonAudioLabel: "verbinden", - }, - - dataTransferModal: { - transferDataHeadline: "Datenübertragung", - sendHeadline: "An anderes Gerät senden", - receiveHeadline: "An dieses Gerät senden", - exportHeadline: "Daten exportieren", - importHeadline: "Daten importieren", - selectionDescription: - "Wähle die Daten aus, die du übertragen möchtest.", - exportSelectionDescription: - "Wähle die Daten aus, die du exportieren möchtest.", - dataEntryDescription: - "Gib diese Informationen auf dem anderen Gerät ein.", - dataEntryInputDescription: - "Gib die auf dem anderen Gerät angezeigten Informationen ein.", - - fromThisDeviceButton: "An anderes Gerät senden", - toThisDeviceButton: "An dieses Gerät senden", - exportButton: "Als Datei exportieren", - importButton: "Aus Datei importieren", - - generalHeadline: "Allgemein", - - connectionData: "Verbindungsdaten", - settingsData: "Identität und persönliche Daten", - - chatsHeadline: "Chats", - noChatsPlaceholder: "Keine Chats", - - transferChannelHeadline: "Übertragungskanal", - transferKeyHeadline: "Schlüssel", - - sendButton: "Senden", - sendAgainButton: "Erneut senden", - - filesSentProgress: (progress: number, total: number) => - `${progress} von ${total} Dateien gesendet`, - filesReceivedProgress: (progress: number, total: number) => - `${progress} von ${total} Dateien empfangen`, - - exportKey: "Schlüssel", - exportKeyConfirmation: "Schlüssel bestätigen", - downloadFileButton: "Herunterladen", - importFileButton: "Importieren", - decryptImportButton: "Entschlüsseln", - incorrectPassphraseError: "Der Schlüssel ist nicht korrekt", - }, - - storage: { - noItemSelected: "Kein Element ausgewählt", - notAFile: "(keine Datei)", - contentEmpty: "(leer)", - - usageLabel: "Speicher", - usageVauleLabel: (used: number, max: number) => - `${used} von ${max} MB belegt`, - - path: "Pfad", - content: "Inhalt", - - deleteItem: "Element löschen", - - removeJunkButton: "Datenmüll löschen", - }, - - chatPage: { - closeChatAudioLabe: "Chat schließen", - chatSettingsAudioLabel: "Chateinstellungen", - - pages: { - settings: "Einstellungen", - messages: "Nachrichten", - tasks: "Aufgaben", - calendar: "Kalender", - }, - - settings: { - settingsHeadline: "Einstellungen", + updater: { + migrated: "Migriert", + }, + + general: { + deleteItemButtonAudioLabel: "element löschen", + searchButtonAudioLabel: "suchen", + searchButtonClearAudioLabel: "suche zurücksetzen", + + abortButton: "Abbrechen", + applyButton: "Anwenden", + backButton: "Zurück", + cancelButton: "Abbrechen", + continueButton: "Weiter", + confirmButton: "Bestätigen", + closeButton: "Schließen", + deleteButton: "Löschen", + exitButton: "Schließen", + fullscreenButton: "Vollbild", + refreshButton: "Aktualisieren", + saveButton: "Speichern", + setButton: "OK", + + selectAllLabel: "Alle auswählen", + + filterOrCreateLabel: (type: string) => + `${type} suchen oder erstellen`, + createLabel: (query: string) => `"${query}" erstellen`, + + reloadAppButton: "Neu laden", + + fileVersionLabel: "Version", + searchLabel: "Suche", + searchSuggestionsLabel: "Vorherige Suchen", + waitingLabel: "Warten...", + + restoreConnection: "Verbindung wiederherstellen", + + noPageSelected: "Keine Seite ausgewählt", + }, + + regional: { + weekdays: { + full: [ + "Sonntag", + "Montag", + "Dienstag", + "Mittwoch", + "Donnerstag", + "Freitag", + "Samstag", + ], + abbreviated: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"], + }, + }, + + homePage: { + appName: "Coordination Tool", + greeting: (name: string) => `Hallo ${name}`, + + serverAddress: "Serveradresse", + serverAddressPlaceholder: "wss://udn.vdpr.org", + connectAudioLabel: "mit Server verbinden", + disconnectAudioLabel: "vom Server trennen", + manageConnectionsAudioLabel: "Verbindungen verwalten", + + settingsButton: "Einstellungen", + manageStorageButton: "Daten verwalten", + transferDataButton: "Daten übertragen", + + updateButton: (version: string) => `Aktualisieren: ${version}`, + + typeChat: "Chat", + noChatsPlaceholder: "Keine Chats", + }, + + settings: { + pages: { + appearance: "Erscheinungsbild", + account: "Konto", + regional: "Sprache & Region", + info: "Über CT", + }, + themes: { + dynamic: "Dynamisch", + dark: "Dunkel", + light: "Hell", + system: "Geräteeinstellung", + black: "Schwarz", + }, + account: { + yourNameLabel: "Dein Name", + yourNamePlaceholder: "Max Mustermann", + setNameButtonAudioLabel: "Namen festlegen", + }, + regional: { + language: "Sprache", + firstDayOfWeekLabel: "Erster Wochentag", + }, + about: { + version: "Version", + checkUpdatesButton: "Nach Updates suchen", + brand: "Software von VDMDI", + brandDescription: "Code verfügbar auf Viridian Public Resources (VDPR)" + }, + }, + + onboarding: { + connectionHeadline: "Mit UDN verbinden", + connectionDescription: + "Um Daten und Nachichten zu verschicken, verbinde dich mit dem Universellen Dezentralen Netzwerk (UDN).", + connectButton: "Verbinden", + connectionNextButton: (isConnected: boolean) => + isConnected ? "Weiter" : "Ohne UDN einrichten", + + /// + + transferOptionsHeadline: "Deine Daten kopieren", + transferOptionsDescription: + "Wenn du Coordination Tool bereits auf einem anderen Gerät verwendest, kopiere deine Kontodaten. Du kannst beide Geräte gleichzeitig verwenden.", + transferOptionTransfer: "Daten übertragen", + transferOptionNew: "Als neues Gerät enrichten", + + // + + nameHeadline: "Dein Name", + nameDescription: + "Diesen Namen sehen andere, wenn du Nachrichten versendest. Du kannst deinen Namen jederzeit in den Einstellungen ändern.", + + // + + transferHeadline: "Datenübertragung", + transferDescription: + "Verwende die Funktion zur Datenübertragung auf deinem anderen Getät, um deine Identität und persönlichen Daten zu kopieren. Gib die dazu angezeigten Daten unten ein. Du findest die Datenübertragung auf der Startseite des anderen Geräts.", + transferButton: "Daten kopieren", + }, + + connectionModal: { + connectionModalHeadline: "Verbindungen verwalten", + + connectButtonAudioLabel: "verbinden", + }, + + dataTransferModal: { + transferDataHeadline: "Datenübertragung", + sendHeadline: "An anderes Gerät senden", + receiveHeadline: "An dieses Gerät senden", + exportHeadline: "Daten exportieren", + importHeadline: "Daten importieren", + selectionDescription: + "Wähle die Daten aus, die du übertragen möchtest.", + exportSelectionDescription: + "Wähle die Daten aus, die du exportieren möchtest.", + dataEntryDescription: + "Gib diese Informationen auf dem anderen Gerät ein.", + dataEntryInputDescription: + "Gib die auf dem anderen Gerät angezeigten Informationen ein.", + + fromThisDeviceButton: "An anderes Gerät senden", + toThisDeviceButton: "An dieses Gerät senden", + exportButton: "Als Datei exportieren", + importButton: "Aus Datei importieren", + + generalHeadline: "Allgemein", + + connectionData: "Verbindungsdaten", + settingsData: "Identität und persönliche Daten", + + chatsHeadline: "Chats", + noChatsPlaceholder: "Keine Chats", + + transferChannelHeadline: "Übertragungskanal", + transferKeyHeadline: "Schlüssel", + + sendButton: "Senden", + sendAgainButton: "Erneut senden", + + filesSentProgress: (progress: number, total: number) => + `${progress} von ${total} Dateien gesendet`, + filesReceivedProgress: (progress: number, total: number) => + `${progress} von ${total} Dateien empfangen`, + + exportKey: "Schlüssel", + exportKeyConfirmation: "Schlüssel bestätigen", + downloadFileButton: "Herunterladen", + importFileButton: "Importieren", + decryptImportButton: "Entschlüsseln", + incorrectPassphraseError: "Der Schlüssel ist nicht korrekt", + }, + + storage: { + noItemSelected: "Kein Element ausgewählt", + notAFile: "(keine Datei)", + contentEmpty: "(leer)", + + usageLabel: "Speicher", + usageVauleLabel: (used: number, max: number) => + `${used} von ${max} MB belegt`, + + path: "Pfad", + content: "Inhalt", + + deleteItem: "Element löschen", + + removeJunkButton: "Datenmüll löschen", + }, + + chatPage: { + closeChatAudioLabe: "Chat schließen", + chatSettingsAudioLabel: "Chateinstellungen", + + pages: { + settings: "Einstellungen", + messages: "Nachrichten", + tasks: "Aufgaben", + calendar: "Kalender", + }, + + settings: { + settingsHeadline: "Einstellungen", + + nameLabel: "Name", + setNameButtonAudioLabel: "namen festlegen", + + transferLabel: "Chat teilen", + + newSecondaryChannelPlaceholder: "Sekundären Kanal hinzufügen", + newSecondaryChannelAudioLabel: + "Name des neuen sekundären Kanals", + addSecondaryChannelButtonAudioLabel: + "Sekundären Kanal hinzufügen", + + encryptionKeyLabel: "Schlüssel", + setEncryptionKeyButtonAudioLabel: "Schlüssel festlegen", + showEncryptionKey: "Schlüssel anzeigen", + randomizeKey: "Generieren", - nameLabel: "Name", - setNameButtonAudioLabel: "namen festlegen", + setColorButtonAudioLabel: "Farbe festlegen", - newSecondaryChannelPlaceholder: "Sekundären Kanal hinzufügen", - newSecondaryChannelAudioLabel: - "Name des neuen sekundären Kanals", - addSecondaryChannelButtonAudioLabel: - "Sekundären Kanal hinzufügen", + deleteChatButton: "Gesamten Chat löschen", + deleteChatHeadline: "Gesamten Chat löschen?", + deleteChatDescription: + "Dies löscht alle Nachrichten, Aufgaben und alle anderen Daten, die zu diesem Chat gehören.", + }, - encryptionKeyLabel: "Schlüssel", - setEncryptionKeyButtonAudioLabel: "Schlüssel festlegen", - showEncryptionKey: "Schlüssel anzeigen", - randomizeKey: "Zufällig generieren", + message: { + messagesHeadline: "Nachrichten", - setColorButtonAudioLabel: "Farbe festlegen", + messageFilterHeadline: "Nachrichten filtern", + messageFilterReactionsHadline: "Reaktionen", + messageFilterAllReactionsButton: "Alle anzeigen", - deleteChatButton: "Gesamten Chat löschen", - deleteChatHeadline: "Gesamten Chat löschen?", - deleteChatDescription: - "Dies löscht alle Nachrichten, Aufgaben und alle anderen Daten, die zu diesem Chat gehören.", - }, + composerInputPlaceholder: "Schreib eine Nachricht...", + sendMessageButtonAudioLabel: "nachricht senden", + filterMessagesButtonAudioLabel: "nachrichten filtern", - message: { - messagesHeadline: "Nachrichten", + showMessageInfoButtonAudioLabel: "nachrichteninfo anzeigen", + messageInfoHeadline: "Nachrichteninfo", + cancelReplyAudioLabel: "antwort abbrechen", - messageFilterHeadline: "Nachrichten filtern", - messageFilterReactionsHadline: "Reaktionen", - messageFilterAllReactionsButton: "Alle anzeigen", + sentBy: "Gesendet von", + timeSent: "Sendezeit", + channel: "Kanal", + messageContent: "Nachrichteninhalt", - composerInputPlaceholder: "Schreib eine Nachricht...", - sendMessageButtonAudioLabel: "nachricht senden", - filterMessagesButtonAudioLabel: "nachrichten filtern", + copyMessageButton: "Nachricht kopieren", + resendMessageButton: "Nachricht erneut senden", + decryptMessageButton: "Nachricht entschlüsseln", + replyToMessageButton: "Auf Nachricht antworten", + deleteMessageButton: "Nachricht löschen", - showMessageInfoButtonAudioLabel: "nachrichteninfo anzeigen", - messageInfoHeadline: "Nachrichteninfo", - cancelReplyAudioLabel: "antwort abbrechen", + // - sentBy: "Gesendet von", - timeSent: "Sendezeit", - channel: "Kanal", - messageContent: "Nachrichteninhalt", + thumbsUpReaction: "Reaktion: Daumen hoch", + checkReaction: "Reaktion: Haken", + stopReaction: "Reaktion: Stopp", + attentionReaction: "Reaktion: Ausrufezeichen", + doubleAttentionReaction: "Reaktion: doppeltes Ausrufezeichen", + questionReaction: "Reaktion: Fragezeichen", - copyMessageButton: "Nachricht kopieren", - resendMessageButton: "Nachricht erneut senden", - decryptMessageButton: "Nachricht entschlüsseln", - replyToMessageButton: "Auf Nachricht antworten", - deleteMessageButton: "Nachricht löschen", + replyPrefixLabel: "Antworten: ", + replyHeaderLabel: (message: string) => + `Antworten an "${message}"`, + }, - // + task: { + noBoardSelected: "Kein Board ausgewählt", + boardNotFound: "Board nicht gefunden", - thumbsUpReaction: "Reaktion: Daumen hoch", - checkReaction: "Reaktion: Haken", - stopReaction: "Reaktion: Stopp", - attentionReaction: "Reaktion: Ausrufezeichen", - doubleAttentionReaction: "Reaktion: doppeltes Ausrufezeichen", - questionReaction: "Reaktion: Fragezeichen", + typeBoard: "Board", - replyPrefixLabel: "Antworten: ", - replyHeaderLabel: (message: string) => - `Antworten an "${message}"`, - }, + closeBoardButtonAudioLabel: "board schließen", + toggleBoardButtonAudioLabel: "board-liste ein/ausblenden", + showBoardSettingsButtonAudioLabel: + "Board-Einstellungen anzeigen", - task: { - noBoardSelected: "Kein Board ausgewählt", - boardNotFound: "Board nicht gefunden", + listViewButtonAudioLabel: "Listenansicht", + kanbanViewButtonAudioLabel: "Kanban-Ansicht", + statusViewButtonAudioLabel: "Statusrasteransicht", - typeBoard: "Board", + filterTasksButtonAudioLabel: "Aufgaben filtern", + createTaskButtonAudioLabel: "Neue Aufgabe erstellen", - closeBoardButtonAudioLabel: "board schließen", - toggleBoardButtonAudioLabel: "board-liste ein/ausblenden", - showBoardSettingsButtonAudioLabel: - "Board-Einstellungen anzeigen", + boardSettingsHeadline: "Board-Einstellungen", + boardNameInputLabel: "Name", + deleteBoardButton: "Board und alle Aufgaben löschen", - listViewButtonAudioLabel: "Listenansicht", - kanbanViewButtonAudioLabel: "Kanban-Ansicht", - statusViewButtonAudioLabel: "Statusrasteransicht", + taskSettingsHeadline: "Aufgabe bearbeiten", - filterTasksButtonAudioLabel: "Aufgaben filtern", - createTaskButtonAudioLabel: "Neue Aufgabe erstellen", + taskNameLabel: "Titel", + taskBoardLabel: "Board", - boardSettingsHeadline: "Board-Einstellungen", - boardNameInputLabel: "Boardname", - deleteBoardButton: "Board und alle Aufgaben löschen", + taskCategoryLabel: "Kategorie", + taskStatusLabel: "Status", + taskPriorityLabel: "Priorität", - taskSettingsHeadline: "Aufgabe bearbeiten", + taskDescriptionLabel: "Beschreibung", - taskNameLabel: "Titel", - taskBoardLabel: "Board", + taskDateLabel: "Datum", + taskTimeLabel: "Uhrzeit", - taskCategoryLabel: "Kategorie", - taskStatusLabel: "Status", - taskPriorityLabel: "Priorität", + deleteTaskButton: "Aufgabe löschen", - taskDescriptionLabel: "Beschreibung", + filterTasksHeadline: "Aufgaben filtern", - taskDateLabel: "Datum", - taskTimeLabel: "Uhrzeit", + renameCategoryInputPlaceholder: "Kategorie umbenennen", + renameStatusInputPlaceholder: "Status umbenennen", + }, - deleteTaskButton: "Aufgabe löschen", + calendar: { + eventsBoard: "Ereignisse", - filterTasksHeadline: "Aufgaben filtern", + /// - renameCategoryInputPlaceholder: "Kategorie umbenennen", - renameStatusInputPlaceholder: "Status umbenennen", - }, + todayButtonAudioLabel: "gehe zu heute", - calendar: { - eventsBoard: "Ereignisse", + previousMonthButtonAudioLabel: "vorheriger monat", + nextMonthButtonAudioLabel: "nächster monat", - /// + yearInputAudioLabel: "Jahr", + monthInputAudioLabel: "Monat", - todayButtonAudioLabel: "gehe zu heute", + yearInputPlaceholder: "2000", + monthInputPlaceholder: "01", - previousMonthButtonAudioLabel: "vorheriger monat", - nextMonthButtonAudioLabel: "nächster monat", + searchEventsHeadline: "Ereignisse suchen", - yearInputAudioLabel: "Jahr", - monthInputAudioLabel: "Monat", + events: "Ereignisse", + noEvents: "Keine Ereignisse", - yearInputPlaceholder: "2000", - monthInputPlaceholder: "01", - - searchEventsHeadline: "Ereignisse suchen", - - events: "Ereignisse", - noEvents: "Keine Ereignisse", - - eventNext: "Als nächstes", - }, - }, + eventNext: "Als nächstes", + }, + }, }, es: { - updater: { - migrated: "Migrado", - }, - - general: { - deleteItemButtonAudioLabel: "eliminar elemento", - searchButtonAudioLabel: "buscar", - searchButtonClearAudioLabel: "borrar büsqueda", - - abortButton: "Abortar", - applyButton: "Guardar", - backButton: "Atrás", - cancelButton: "Cancelar", - continueButton: "Continuar", - confirmButton: "Confirmar", - closeButton: "Cerrar", - deleteButton: "Borrar", - exitButton: "Salir", - fullscreenButton: "Pantalla completa", - refreshButton: "Actualizar", - saveButton: "Guardar", - setButton: "OK", - - selectAllLabel: "Seleccionar todos", - - filterOrCreateLabel: (type: string) => `Buscar o crear ${type}`, - createLabel: (query: string) => `Crear "${query}"`, - - reloadAppButton: "Recargar app", - - fileVersionLabel: "Versión", - searchLabel: "Buscar", - searchSuggestionsLabel: "Búsquedas anteriores", - waitingLabel: "Esperando...", - - restoreConnection: "Conectar de nuevo", - - noPageSelected: "No página seleccionada", - }, - - regional: { - weekdays: { - full: [ - "Domingo", - "Lunes", - "Martes", - "Miércoles", - "Jueves", - "Viernes", - "Sábado", - ], - abbreviated: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"], - }, - }, - - homePage: { - appName: "Coordination Tool", - greeting: (name: string) => `Hola ${name}`, - - serverAddress: "Dirección del servidor", - serverAddressPlaceholder: "wss://udn-s1.onrender.com", - connectAudioLabel: "conectar al servidor", - disconnectAudioLabel: "desconectar del servidor", - manageConnectionsAudioLabel: "gestionar conexiones", - - settingsButton: "Ajustes", - manageStorageButton: "Gestionar almacenamiento", - transferDataButton: "Enviar o exportar archivos", - - updateButton: (version: string) => `Actualizar a ${version}`, - - typeChat: "chat", - noChatsPlaceholder: "No hay chats", - }, - - settings: { - pages: { - appearance: "Aspecto", - account: "Cuenta", - regional: "Idioma y Región", - info: "Sobre CT", - }, - themes: { - dynamic: "Dinámico", - dark: "Oscuro", - light: "Claro", - system: "Según dispositivo", - black: "Negro", - }, - account: { - yourNameLabel: "Tu nombre", - yourNamePlaceholder: "Juan Pérez", - setNameButtonAudioLabel: "establecer nombre", - }, - regional: { - language: "Idioma", - firstDayOfWeekLabel: "Primer día de la semana", - }, - about: { - version: "Versión", - checkUpdatesButton: "Buscar actualisaciones", - }, - }, - - onboarding: { - connectionHeadline: "Conectar al UDN", - connectionDescription: - "Para transferir datos y enviar mensajes, conéctate a la Red Descentralizada Universal (UDN).", - connectButton: "Conectar", - connectionNextButton: (isConnected: boolean): string => - isConnected ? "Continuar" : "Configurar sin UDN", - - /// - - transferOptionsHeadline: "Copiar tus datos", - transferOptionsDescription: - "Si ya usas el Coordination Tool en otro disposistivo, copia tu idantidad aquí. Puedes usar ambos dispositivos al mismo tiempo.", - transferOptionTransfer: "Copiar mis datos aquí", - transferOptionNew: "Configurar como dispositivo nuevo", - - // - - nameHeadline: "Tu nombre", - nameDescription: - "Esto es lo que ven otros cuando envías menajes. Siempre lo puedes cambiar en las ajustes.", - - // - - transferHeadline: "Transferencia de datos", - transferDescription: - "En el otro dispositivo, prepara la transferencia de tu identidad y datos personales. Ingresa los datos que se muestran a continuación. La opción de la transferencia de datos se encuentra en la pantalla inicial en el otro dispositivo.", - transferButton: "Copiar datos", - }, - - connectionModal: { - connectionModalHeadline: "Gestionar Conexiones", - - connectButtonAudioLabel: "conectar", - }, - - dataTransferModal: { - transferDataHeadline: "Transferencia de datos", - sendHeadline: "Enviar a otro dispositivo", - receiveHeadline: "Enviar a este dispositivo", - exportHeadline: "Exportar archivo", - importHeadline: "Importar archivo", - selectionDescription: - "Selecciona los datos que quieres transferir.", - exportSelectionDescription: - "Selecciona los datos que quieres exportar.", - dataEntryDescription: - "Introduce estos datos en el otro dispositivo.", - dataEntryInputDescription: - "Introduce los datos mostrados en el otro dispositivo.", - - fromThisDeviceButton: "Enviar a otro dispositivo", - toThisDeviceButton: "Enviar a este dispositivo", - exportButton: "Exportar archivo", - importButton: "Importar archivo", - - generalHeadline: "General", - - connectionData: "Datos de conexión", - settingsData: "Identidad y datos personales", - - chatsHeadline: "Chats", - noChatsPlaceholder: "No hay chats", - - transferChannelHeadline: "Canal de Transferencia", - transferKeyHeadline: "Clave de encriptación de transferencia", - - sendButton: "Enviar", - sendAgainButton: "Enviar otra vez", - - filesSentProgress: (progress: number, total: number) => - `${progress} de ${total} enviados`, - filesReceivedProgress: (progress: number, total: number) => - `${progress} de ${total} recibidos`, - - exportKey: "Clave de encriptación", - exportKeyConfirmation: "Confirmar clave", - downloadFileButton: "Descargar", - importFileButton: "Importar", - decryptImportButton: "Descifrar", - incorrectPassphraseError: "La clave no es correcta", - }, - - storage: { - noItemSelected: "Ningún elemento seleccionado", - notAFile: "(no es un archivo)", - contentEmpty: "(vacío)", - - usageLabel: "Almacenamiento", - usageVauleLabel: (used: number, max: number) => - `${used} de ${max} MB en uso`, - - path: "Ruta", - content: "Contenido", - - deleteItem: "Eliminar elemento", - - removeJunkButton: "Eliminar archivos basura", - }, - - chatPage: { - closeChatAudioLabe: "cerrar chat", - chatSettingsAudioLabel: "configuración del chat", - - pages: { - settings: "Configuración", - messages: "Mensajes", - tasks: "Tareas", - calendar: "Calendario", - }, - - settings: { - settingsHeadline: "Configuración", - - nameLabel: "Nombre del chat", - setNameButtonAudioLabel: "establecer nombre", - - newSecondaryChannelPlaceholder: "Añadir canal secundario", - newSecondaryChannelAudioLabel: - "nombre del nuevo canal secundario", - addSecondaryChannelButtonAudioLabel: "añadir canal secundario", + updater: { + migrated: "Migrado", + }, + + general: { + deleteItemButtonAudioLabel: "eliminar elemento", + searchButtonAudioLabel: "buscar", + searchButtonClearAudioLabel: "borrar büsqueda", + + abortButton: "Abortar", + applyButton: "Guardar", + backButton: "Atrás", + cancelButton: "Cancelar", + continueButton: "Continuar", + confirmButton: "Confirmar", + closeButton: "Cerrar", + deleteButton: "Borrar", + exitButton: "Salir", + fullscreenButton: "Pantalla completa", + refreshButton: "Actualizar", + saveButton: "Guardar", + setButton: "OK", + + selectAllLabel: "Seleccionar todos", + + filterOrCreateLabel: (type: string) => `Buscar o crear ${type}`, + createLabel: (query: string) => `Crear "${query}"`, + + reloadAppButton: "Recargar app", + + fileVersionLabel: "Versión", + searchLabel: "Buscar", + searchSuggestionsLabel: "Búsquedas anteriores", + waitingLabel: "Esperando...", + + restoreConnection: "Conectar de nuevo", + + noPageSelected: "No página seleccionada", + }, + + regional: { + weekdays: { + full: [ + "Domingo", + "Lunes", + "Martes", + "Miércoles", + "Jueves", + "Viernes", + "Sábado", + ], + abbreviated: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"], + }, + }, + + homePage: { + appName: "Coordination Tool", + greeting: (name: string) => `Hola ${name}`, + + serverAddress: "Dirección del servidor", + serverAddressPlaceholder: "wss://udn.vdpr.org", + connectAudioLabel: "conectar al servidor", + disconnectAudioLabel: "desconectar del servidor", + manageConnectionsAudioLabel: "gestionar conexiones", + + settingsButton: "Ajustes", + manageStorageButton: "Gestionar almacenamiento", + transferDataButton: "Enviar o exportar archivos", + + updateButton: (version: string) => `Actualizar a ${version}`, + + typeChat: "chat", + noChatsPlaceholder: "No hay chats", + }, + + settings: { + pages: { + appearance: "Aspecto", + account: "Cuenta", + regional: "Idioma y Región", + info: "Sobre CT", + }, + themes: { + dynamic: "Dinámico", + dark: "Oscuro", + light: "Claro", + system: "Según dispositivo", + black: "Negro", + }, + account: { + yourNameLabel: "Tu nombre", + yourNamePlaceholder: "Juan Pérez", + setNameButtonAudioLabel: "establecer nombre", + }, + regional: { + language: "Idioma", + firstDayOfWeekLabel: "Primer día de la semana", + }, + about: { + version: "Versión", + checkUpdatesButton: "Buscar actualisaciones", + brand: "Software de VDMDI", + brandDescription: "Code desponible en Viridian Public Resources (VDPR)" + }, + }, + + onboarding: { + connectionHeadline: "Conectar al UDN", + connectionDescription: + "Para transferir datos y enviar mensajes, conéctate a la Red Descentralizada Universal (UDN).", + connectButton: "Conectar", + connectionNextButton: (isConnected: boolean): string => + isConnected ? "Continuar" : "Configurar sin UDN", + + /// + + transferOptionsHeadline: "Copiar tus datos", + transferOptionsDescription: + "Si ya usas el Coordination Tool en otro disposistivo, copia tu idantidad aquí. Puedes usar ambos dispositivos al mismo tiempo.", + transferOptionTransfer: "Copiar mis datos aquí", + transferOptionNew: "Configurar como dispositivo nuevo", + + // + + nameHeadline: "Tu nombre", + nameDescription: + "Esto es lo que ven otros cuando envías menajes. Siempre lo puedes cambiar en las ajustes.", + + // + + transferHeadline: "Transferencia de datos", + transferDescription: + "En el otro dispositivo, prepara la transferencia de tu identidad y datos personales. Ingresa los datos que se muestran a continuación. La opción de la transferencia de datos se encuentra en la pantalla inicial en el otro dispositivo.", + transferButton: "Copiar datos", + }, + + connectionModal: { + connectionModalHeadline: "Gestionar Conexiones", + + connectButtonAudioLabel: "conectar", + }, + + dataTransferModal: { + transferDataHeadline: "Transferencia de datos", + sendHeadline: "Enviar a otro dispositivo", + receiveHeadline: "Enviar a este dispositivo", + exportHeadline: "Exportar archivo", + importHeadline: "Importar archivo", + selectionDescription: + "Selecciona los datos que quieres transferir.", + exportSelectionDescription: + "Selecciona los datos que quieres exportar.", + dataEntryDescription: + "Introduce estos datos en el otro dispositivo.", + dataEntryInputDescription: + "Introduce los datos mostrados en el otro dispositivo.", + + fromThisDeviceButton: "Enviar a otro dispositivo", + toThisDeviceButton: "Enviar a este dispositivo", + exportButton: "Exportar archivo", + importButton: "Importar archivo", + + generalHeadline: "General", + + connectionData: "Datos de conexión", + settingsData: "Identidad y datos personales", + + chatsHeadline: "Chats", + noChatsPlaceholder: "No hay chats", + + transferChannelHeadline: "Canal de Transferencia", + transferKeyHeadline: "Clave de encriptación de transferencia", + + sendButton: "Enviar", + sendAgainButton: "Enviar otra vez", + + filesSentProgress: (progress: number, total: number) => + `${progress} de ${total} enviados`, + filesReceivedProgress: (progress: number, total: number) => + `${progress} de ${total} recibidos`, + + exportKey: "Clave de encriptación", + exportKeyConfirmation: "Confirmar clave", + downloadFileButton: "Descargar", + importFileButton: "Importar", + decryptImportButton: "Descifrar", + incorrectPassphraseError: "La clave no es correcta", + }, + + storage: { + noItemSelected: "Ningún elemento seleccionado", + notAFile: "(no es un archivo)", + contentEmpty: "(vacío)", + + usageLabel: "Almacenamiento", + usageVauleLabel: (used: number, max: number) => + `${used} de ${max} MB en uso`, + + path: "Ruta", + content: "Contenido", + + deleteItem: "Eliminar elemento", + + removeJunkButton: "Eliminar archivos basura", + }, + + chatPage: { + closeChatAudioLabe: "cerrar chat", + chatSettingsAudioLabel: "configuración del chat", + + pages: { + settings: "Configuración", + messages: "Mensajes", + tasks: "Tareas", + calendar: "Calendario", + }, + + settings: { + settingsHeadline: "Configuración", + + nameLabel: "Nombre del chat", + setNameButtonAudioLabel: "establecer nombre", + + transferLabel: "Compartir chat", + + newSecondaryChannelPlaceholder: "Añadir canal secundario", + newSecondaryChannelAudioLabel: + "nombre del nuevo canal secundario", + addSecondaryChannelButtonAudioLabel: "añadir canal secundario", + + encryptionKeyLabel: "Clave de encriptación", + setEncryptionKeyButtonAudioLabel: + "establecer clave de encriptación", + showEncryptionKey: "Mostrar clave de encriptación", + randomizeKey: "Aleatorizar", - encryptionKeyLabel: "Clave de encriptación", - setEncryptionKeyButtonAudioLabel: - "establecer clave de encriptación", - showEncryptionKey: "Mostrar clave de encriptación", - randomizeKey: "Aleatorizar", + setColorButtonAudioLabel: "establecer color", - setColorButtonAudioLabel: "establecer color", + deleteChatButton: "Eliminar todo el chat", + deleteChatHeadline: "¿Eliminar chat?", + deleteChatDescription: + "¿Quieres borrar todas las mensajes, tareas y otros datos que pertenecen a este chat?", + }, - deleteChatButton: "Eliminar todo el chat", - deleteChatHeadline: "¿Eliminar chat?", - deleteChatDescription: - "¿Quieres borrar todas las mensajes, tareas y otros datos que pertenecen a este chat?", - }, + message: { + messagesHeadline: "Mensajes", - message: { - messagesHeadline: "Mensajes", + messageFilterHeadline: "Filtrar mensajes", + messageFilterReactionsHadline: "Reacciones", + messageFilterAllReactionsButton: "Mostrar todas", - messageFilterHeadline: "Filtrar mensajes", - messageFilterReactionsHadline: "Reacciones", - messageFilterAllReactionsButton: "Mostrar todas", + composerInputPlaceholder: "Escribe un mensaje...", + sendMessageButtonAudioLabel: "enviar mensaje", + filterMessagesButtonAudioLabel: "filtrar mensajes", - composerInputPlaceholder: "Escribe un mensaje...", - sendMessageButtonAudioLabel: "enviar mensaje", - filterMessagesButtonAudioLabel: "filtrar mensajes", + showMessageInfoButtonAudioLabel: + "mostrar información del mensaje", + messageInfoHeadline: "Información del Mensaje", + cancelReplyAudioLabel: "abortar la respuesta", - showMessageInfoButtonAudioLabel: - "mostrar información del mensaje", - messageInfoHeadline: "Información del Mensaje", - cancelReplyAudioLabel: "abortar la respuesta", + sentBy: "Enviado por", + timeSent: "Hora de envío", + channel: "Canal", + messageContent: "Contenido del mensaje", - sentBy: "Enviado por", - timeSent: "Hora de envío", - channel: "Canal", - messageContent: "Contenido del mensaje", + copyMessageButton: "Copiar mensaje", + resendMessageButton: "Reenviar mensaje", + decryptMessageButton: "Desencriptar mensaje", + replyToMessageButton: "Responder al mensaje", + deleteMessageButton: "Eliminar mensaje", - copyMessageButton: "Copiar mensaje", - resendMessageButton: "Reenviar mensaje", - decryptMessageButton: "Desencriptar mensaje", - replyToMessageButton: "Responder al mensaje", - deleteMessageButton: "Eliminar mensaje", + // - // + thumbsUpReaction: "Reacción: pulgar hacia arriba", + checkReaction: "Reacción: marca de verificación", + stopReaction: "Reacción: signo de parada", + attentionReaction: "Reaccion: signo de atención", + doubleAttentionReaction: "Reaccion: signo de atención doble", + questionReaction: "Reaccion: signo de interrogación", - thumbsUpReaction: "Reacción: pulgar hacia arriba", - checkReaction: "Reacción: marca de verificación", - stopReaction: "Reacción: signo de parada", - attentionReaction: "Reaccion: signo de atención", - doubleAttentionReaction: "Reaccion: signo de atención doble", - questionReaction: "Reaccion: signo de interrogación", + replyPrefixLabel: "Respuestas: ", + replyHeaderLabel: (message: string) => + `Respuestas a "${message}"`, + }, - replyPrefixLabel: "Respuestas: ", - replyHeaderLabel: (message: string) => - `Respuestas a "${message}"`, - }, + task: { + noBoardSelected: "Ningún tablero seleccionado", + boardNotFound: "Tablero no encontrado", - task: { - noBoardSelected: "Ningún tablero seleccionado", - boardNotFound: "Tablero no encontrado", + typeBoard: "board", - typeBoard: "board", + closeBoardButtonAudioLabel: "cerrar tablero", + toggleBoardButtonAudioLabel: + "mostrar o ocultar lista de tableros", + showBoardSettingsButtonAudioLabel: + "mostrar configuración del tablero", - closeBoardButtonAudioLabel: "cerrar tablero", - toggleBoardButtonAudioLabel: - "mostrar o ocultar lista de tableros", - showBoardSettingsButtonAudioLabel: - "mostrar configuración del tablero", + listViewButtonAudioLabel: "vista de lista", + kanbanViewButtonAudioLabel: "vista kanban", + statusViewButtonAudioLabel: "vista de cuadrícula de estado", - listViewButtonAudioLabel: "vista de lista", - kanbanViewButtonAudioLabel: "vista kanban", - statusViewButtonAudioLabel: "vista de cuadrícula de estado", + filterTasksButtonAudioLabel: "filtrar tareas", + createTaskButtonAudioLabel: "crear nueva tarea", - filterTasksButtonAudioLabel: "filtrar tareas", - createTaskButtonAudioLabel: "crear nueva tarea", + boardSettingsHeadline: "Configuración del Tablero", + boardNameInputLabel: "Nombre del tablero", + deleteBoardButton: "Eliminar tablero y todas las tareas", - boardSettingsHeadline: "Configuración del Tablero", - boardNameInputLabel: "Nombre del tablero", - deleteBoardButton: "Eliminar tablero y todas las tareas", + taskSettingsHeadline: "Editar Tarea", - taskSettingsHeadline: "Editar Tarea", + taskNameLabel: "Título", + taskBoardLabel: "Tablero", - taskNameLabel: "Título", - taskBoardLabel: "Tablero", + taskCategoryLabel: "Categoría", + taskStatusLabel: "Estado", + taskPriorityLabel: "Prioridad", - taskCategoryLabel: "Categoría", - taskStatusLabel: "Estado", - taskPriorityLabel: "Prioridad", + taskDescriptionLabel: "Descripción", - taskDescriptionLabel: "Descripción", + taskDateLabel: "Fecha", + taskTimeLabel: "Hora", - taskDateLabel: "Fecha", - taskTimeLabel: "Hora", + deleteTaskButton: "Eliminar tarea", - deleteTaskButton: "Eliminar tarea", + filterTasksHeadline: "Filtrar Tareas", - filterTasksHeadline: "Filtrar Tareas", + renameCategoryInputPlaceholder: "Renombrar categoría", + renameStatusInputPlaceholder: "Renombrar estado", + }, - renameCategoryInputPlaceholder: "Renombrar categoría", - renameStatusInputPlaceholder: "Renombrar estado", - }, + calendar: { + eventsBoard: "Eventos", - calendar: { - eventsBoard: "Eventos", + /// - /// + todayButtonAudioLabel: "ir a hoy", - todayButtonAudioLabel: "ir a hoy", + previousMonthButtonAudioLabel: "mes anterior", + nextMonthButtonAudioLabel: "mes siguiente", - previousMonthButtonAudioLabel: "mes anterior", - nextMonthButtonAudioLabel: "mes siguiente", + yearInputAudioLabel: "año", + monthInputAudioLabel: "mes", - yearInputAudioLabel: "año", - monthInputAudioLabel: "mes", + yearInputPlaceholder: "2000", + monthInputPlaceholder: "01", - yearInputPlaceholder: "2000", - monthInputPlaceholder: "01", + searchEventsHeadline: "Buscar Eventos", - searchEventsHeadline: "Buscar Eventos", + events: "Eventos", + noEvents: "No hay eventos", - events: "Eventos", - noEvents: "No hay eventos", - - eventNext: "A continuación", - }, - }, + eventNext: "A continuación", + }, + }, }, }; diff --git a/src/ViewModel/Chat/chatListViewModel.ts b/src/ViewModel/Chat/chatListViewModel.ts index 31dbd62f..53453e2b 100644 --- a/src/ViewModel/Chat/chatListViewModel.ts +++ b/src/ViewModel/Chat/chatListViewModel.ts @@ -7,6 +7,7 @@ import ConnectionViewModel from "../Global/connectionViewModel"; import * as React from "../../react"; import implementFilter, { IndexManager } from "../../Model/Utility/utility"; import ChatModel from "../../Model/Chat/chatModel"; +import FileTransferViewModel from "../Global/fileTransferViewModel"; export default class ChatListViewModel { notificationViewModel: NotificationViewModel; @@ -62,6 +63,7 @@ export default class ChatListViewModel { this.connectionViewModel, this, this.contactListViewModel, + this.fileTransferViewModel ); }; @@ -99,6 +101,7 @@ export default class ChatListViewModel { public readonly settingsViewModel: SettingsViewModel, public readonly connectionViewModel: ConnectionViewModel, public readonly contactListViewModel: ContactListViewModel, + public readonly fileTransferViewModel: FileTransferViewModel, ) { this.notificationViewModel = new NotificationViewModel( this, diff --git a/src/ViewModel/Chat/chatViewModel.ts b/src/ViewModel/Chat/chatViewModel.ts index f37b0122..b568c396 100644 --- a/src/ViewModel/Chat/chatViewModel.ts +++ b/src/ViewModel/Chat/chatViewModel.ts @@ -22,6 +22,7 @@ import ChatModel, { ChatMessage, ChatMessageReaction, } from "../../Model/Chat/chatModel"; +import FileTransferViewModel from "../Global/fileTransferViewModel"; export default class ChatViewModel extends ContextHost { calendarViewModel: CalendarPageViewModel; @@ -81,6 +82,10 @@ export default class ChatViewModel extends ContextHost { this.index.value = index; }; + share = (): void => { + this.fileTransferViewModel.showDirectionSelectionModal(); + } + // load loadPageSelection = (): void => { const path: string[] = StorageModel.getPath( @@ -151,6 +156,7 @@ export default class ChatViewModel extends ContextHost { public readonly connectionViewModel: ConnectionViewModel, public readonly chatListViewModel: ChatListViewModel, public readonly contactListViewModel: ContactListViewModel, + public readonly fileTransferViewModel: FileTransferViewModel, ) { super("chat", coreViewModel); diff --git a/src/ViewModel/Global/coreViewModel.ts b/src/ViewModel/Global/coreViewModel.ts index 2db92ce2..ae35effa 100644 --- a/src/ViewModel/Global/coreViewModel.ts +++ b/src/ViewModel/Global/coreViewModel.ts @@ -153,6 +153,11 @@ export default class CoreViewModel { }, 500); }; + // VDPR + openVDPR = (): void => { + window.open("https://vdpr.org/VDMDI/CT"); + } + // init constructor( public readonly storageModel: StorageModel, diff --git a/src/index.tsx b/src/index.tsx index 9d5694dc..4490a634 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -54,13 +54,14 @@ const contactListViewModel = new ContactListViewModel( settingsViewModel, ); const connectionViewModel = new ConnectionViewModel(coreViewModel); +const fileTransferViewModel = new FileTransferViewModel(coreViewModel); const chatListViewModel = new ChatListViewModel( coreViewModel, settingsViewModel, connectionViewModel, contactListViewModel, + fileTransferViewModel ); -const fileTransferViewModel = new FileTransferViewModel(coreViewModel); const onboardingViewModel = new OnboardingViewModel( connectionViewModel, fileTransferViewModel,