From 2aa97cf134a84b7d949d1280df44bfced5d69627 Mon Sep 17 00:00:00 2001 From: 10G Meow <10gmeow@gmail.com> Date: Sun, 26 Nov 2023 13:51:15 +0200 Subject: [PATCH 01/68] POC: Mobile notification via periodicSync --- public/sw.js | 16 ++++++- src/plugins/notificationAndServiceWorker.js | 51 ++++++++++++++++++++- src/plugins/utils.js | 17 +++++-- 3 files changed, 78 insertions(+), 6 deletions(-) diff --git a/public/sw.js b/public/sw.js index 494d828..08572fd 100644 --- a/public/sw.js +++ b/public/sw.js @@ -19,4 +19,18 @@ self.addEventListener("notificationclick", (e) => { .then((windowClient) => (windowClient ? windowClient.focus() : null)); }), ); -}); \ No newline at end of file +}); + +async function checkNewMessages() { + const cachedCredentials = await caches.open('cachedCredentials'); + // Todo... +} + +self.addEventListener('periodicsync', (event) => { + if (event.tag === 'check-new-messages') { + // Test if periodicSync notification triggers in Mobile app(created via add to homescreen) + self.registration.showNotification("Notification via periodicSync"); + + event.waitUntil(checkNewMessages()); + } +}); diff --git a/src/plugins/notificationAndServiceWorker.js b/src/plugins/notificationAndServiceWorker.js index 117c97d..52c3e65 100644 --- a/src/plugins/notificationAndServiceWorker.js +++ b/src/plugins/notificationAndServiceWorker.js @@ -1,6 +1,53 @@ +import { isMobileOrTabletBrowser } from './utils' + +const registerPeriodicBackgroundSync = async (registration) => { + // Check if periodicSync is supported + if ('periodicSync' in registration) { + // Request permission + const status = await navigator.permissions.query({ + name: 'periodic-background-sync', + }); + if (status.state === 'granted') { + console.log('PBS registered and granted') + + try { + // Register the periodic background sync. + await registration.periodicSync.register('check-new-messages', { + // minInterval is one day + minInterval: 24 * 60 * 60 * 1000, + }); + console.log('Periodic background sync registered!'); + console.log(registration.periodicSync.getTags()) + + // List registered periodic background sync tags. + const tags = await registration.periodicSync.getTags(); + if (tags.length) { + tags.forEach((tag) => { + console.log('tag') + console.log(tag) + }); + } + } catch(e) { + console.log(`Periodic background sync failed: ${e}`); + } + } else { + console.log('Periodic background sync is not granted.'); + } + } else { + console.log('Periodic background sync is not supported.'); + } +} + export function registerServiceWorker() { - if("serviceWorker" in navigator) { - navigator.serviceWorker.register("/sw.js"); + if ('serviceWorker' in navigator) { + window.addEventListener('load', async () => { + const registration = await navigator.serviceWorker.register("/sw.js"); + console.log('Service worker registered for scope', registration.scope); + + if(isMobileOrTabletBrowser) { + await registerPeriodicBackgroundSync(registration); + } + }); } else { console.log("No Service Worker support!"); } diff --git a/src/plugins/utils.js b/src/plugins/utils.js index 939fd16..4575e87 100644 --- a/src/plugins/utils.js +++ b/src/plugins/utils.js @@ -486,7 +486,7 @@ class Util { /** * Return what "mode" to use for the given room. - * + * * The default value is given by the room itself (as state events, see roomTypeMixin). * This method just returns if the user has overridden this in room settings (this * fact will be persisted as a user specific tag on the room). Note: currently override @@ -515,7 +515,7 @@ class Util { /** * Return the room type for the current room - * @param {*} roomOrNull + * @param {*} roomOrNull */ roomDisplayTypeToQueryParam(roomOrNull, roomDisplayType) { const roomType = this.roomDisplayTypeOverride(roomOrNull) || roomDisplayType; @@ -898,7 +898,7 @@ class Util { } downloadableTypes() { - return ['m.video','m.audio','m.image','m.file']; + return ['m.video','m.audio','m.image','m.file']; } download(matrixClient, event) { @@ -921,6 +921,17 @@ class Util { console.log("Failed to fetch attachment: ", err); }); } + + isMobileOrTabletBrowser() { + // Regular expression to match common mobile and tablet browser user agent strings + const mobileTabletPattern = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Tablet|Mobile|CriOS/i; + + // Get the user agent string + const userAgent = navigator.userAgent; + + // Check if the user agent matches the pattern for mobile or tablet browsers + return mobileTabletPattern.test(userAgent); + } } export default new Util(); From 3ad766fe1226a9be27cec29833400b452ec924e9 Mon Sep 17 00:00:00 2001 From: 10G Meow <10gmeow@gmail.com> Date: Thu, 7 Dec 2023 20:53:24 +0200 Subject: [PATCH 02/68] Profile settings: add global Notification toggle --- src/App.vue | 6 +- src/assets/translations/en.json | 6 +- src/components/ActionRow.vue | 11 +- src/components/Chat.vue | 61 +---------- src/components/ChatHeader.vue | 5 - src/components/Profile.vue | 108 +++++++++++++++++++- src/plugins/notificationAndServiceWorker.js | 6 +- src/store/index.js | 4 + 8 files changed, 128 insertions(+), 79 deletions(-) diff --git a/src/App.vue b/src/App.vue index e174786..fde972f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -33,6 +33,7 @@ import stickers from "./plugins/stickers"; import { registerServiceWorker, notificationCount, windowNotificationPermission } from "./plugins/notificationAndServiceWorker.js" import logoMixin from "./components/logoMixin"; +import { mapState } from 'vuex' export default { name: "App", @@ -175,13 +176,16 @@ export default { } return favicon; }, + ...mapState([ + 'globalNotification' + ]) }, watch: { notificationCount: { handler(nCount) { // windowNotificationPermission // return value: 'granted', 'default', 'denied' - if (nCount > 0 && this.windowNotificationPermission() === "granted") { + if (this.globalNotification && nCount > 0 && this.windowNotificationPermission() === "granted") { this.showNotification() } } diff --git a/src/assets/translations/en.json b/src/assets/translations/en.json index c4398ae..84f83f7 100644 --- a/src/assets/translations/en.json +++ b/src/assets/translations/en.json @@ -218,7 +218,8 @@ "password_new": "New password", "password_repeat": "Repeat new password", "display_name": "Display name", - "display_name_required": "Display name is required" + "display_name_required": "Display name is required", + "notification_label": "Notification" }, "profile_info_popup": { "you_are": "You are", @@ -382,7 +383,8 @@ "body": "Never miss a message or important conversation again! Be notified whenever someone sends you a message or replies to your chat.", "enable": "Enable" }, - "blocked_message": "Notifications blocked. Please reset the permissions" + "blocked_message": "Notification is blocked. Go to your device or browser settings to enable Notification", + "not_supported": "Notification is not yet supported in Mobile" }, "emoji": { "search": "Search...", diff --git a/src/components/ActionRow.vue b/src/components/ActionRow.vue index c175c7d..25e64da 100644 --- a/src/components/ActionRow.vue +++ b/src/components/ActionRow.vue @@ -4,18 +4,16 @@ no-gutters align-content="center" v-on="$listeners" - v-show="icon === 'notifications_active' ? this.windowNotificationPermission() !== 'granted' : true" > - + {{ icon }} - {{ text }} + {{ text }} + diff --git a/src/components/Chat.vue b/src/components/Chat.vue index 857ae52..c9a5fb0 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -3,12 +3,10 @@ - - -
- notifications_active -

- {{ $t("notification.dialog.title") }} -

-
{{ $t("notification.dialog.body") }}
- - - - {{ $t("global.close") }} - - - {{ $t("notification.dialog.enable") }} - - - -
-
@@ -388,7 +347,6 @@ import chatMixin from "./chatMixin"; import sendAttachmentsMixin from "./sendAttachmentsMixin"; import AudioLayout from "./AudioLayout.vue"; import FileDropLayout from "./file_mode/FileDropLayout"; -import { requestNotificationPermission, windowNotificationPermission } from "../plugins/notificationAndServiceWorker.js" import roomTypeMixin from "./roomTypeMixin"; import roomMembersMixin from "./roomMembersMixin"; @@ -525,7 +483,6 @@ export default { Places: this.$t("emoji.categories.places") } }, - notificationDialog: false }; }, @@ -914,18 +871,6 @@ export default { this.initialLoadDone = true; console.log("Loading finished!"); }, - windowNotificationPermission, - onNotificationDialog() { - if(this.windowNotificationPermission() === 'denied') { - alert(this.$t("notification.blocked_message")); - } else if(this.windowNotificationPermission() === 'default') { - this.notificationDialog = true; - } - }, - onNotifyRequest() { - requestNotificationPermission() - this.notificationDialog = false; - }, onRoomJoined(initialEventId) { // Listen to events this.$matrix.on("Room.timeline", this.onEvent); @@ -1157,7 +1102,7 @@ export default { this.onLayoutChange(fn, element); } else { fn(); - } + } } else { fn(); } diff --git a/src/components/ChatHeader.vue b/src/components/ChatHeader.vue index f54610f..c9b4f8d 100644 --- a/src/components/ChatHeader.vue +++ b/src/components/ChatHeader.vue @@ -177,11 +177,6 @@ export default { this.$emit("view-room-details", { event: this.event }); } }); - items.push({ - icon: 'notifications_active', text: this.$t('global.notify'), handler: () => { - this.$emit("notify"); - } - }); items.push({ icon: '$vuetify.icons.ic_member-leave', text: this.$t('leave.leave'), handler: () => { this.leaveRoom(); diff --git a/src/components/Profile.vue b/src/components/Profile.vue index 88caea1..e5d8dba 100644 --- a/src/components/Profile.vue +++ b/src/components/Profile.vue @@ -89,6 +89,16 @@ :icon="'$vuetify.icons.globe'" :text="$t('profile.select_language')" /> + + + @@ -197,6 +207,45 @@ v-model="showSelectLanguageDialog" v-on:close="showSelectLanguageDialog = false" /> + + +
+ notifications_active +

+ {{ $t("notification.dialog.title") }} +

+
{{ $t("notification.dialog.body") }}
+ + + + {{ $t("global.close") }} + + + {{ $t("notification.dialog.enable") }} + + + +
+
@@ -207,6 +256,8 @@ import util from "../plugins/utils"; import profileInfoMixin from "./profileInfoMixin"; import LogoutRoomDialog from './LogoutRoomDialog.vue'; import CopyLink from "./CopyLink.vue" +import { requestNotificationPermission, windowNotificationPermission } from "../plugins/notificationAndServiceWorker.js" +import { mapState } from 'vuex' export default { name: "Profile", @@ -234,7 +285,8 @@ export default { passwordErrorMessage: null, isAvatarLoaded: true, loadValue: 0, - newPasswordHasError: false + newPasswordHasError: false, + notificationDialog: false }; }, @@ -252,7 +304,13 @@ export default { this.newPassword2 && this.newPassword1 == this.newPassword2 ); - } + }, + notificationIcon() { + return this.globalNotification ? 'notifications_active' : 'notifications_off'; + }, + ...mapState([ + 'globalNotification' + ]) }, methods: { @@ -306,7 +364,53 @@ export default { console.log("Progress: " + JSON.stringify(progress)); }); }, + updateGlobalNotificationStore(flag) { + this.$store.commit('setGlobalNotification', flag); + }, + windowNotificationPermission, + onUpdateGlobalNotification(showAlertOrDialog = true) { + const permission = this.windowNotificationPermission(); + + switch (permission) { + case 'denied': + this.updateGlobalNotificationStore(false); + if (showAlertOrDialog) { + alert(this.$t("notification.blocked_message")); + } + break; + case 'granted': + this.updateGlobalNotificationStore(!this.globalNotification); + break; + case 'default': + if (showAlertOrDialog) { + this.notificationDialog = true; + } + this.updateGlobalNotificationStore(!this.globalNotification); + break; + default: + alert(this.$t("notification.not_supported")); + } + }, + async onNotifyDialog() { + const permission = await requestNotificationPermission() + if(permission === 'denied') { + this.updateGlobalNotificationStore(false); + alert(this.$t("notification.blocked_message")); + } else { + this.updateGlobalNotificationStore(true); + } + this.notificationDialog = false; + }, + onNotifyDialogClosed() { + this.updateGlobalNotificationStore(false); + this.notificationDialog = false; + } }, + mounted() { + if(this.globalNotification && this.windowNotificationPermission() !== 'granted') { + this.onUpdateGlobalNotification(false); + } + } }; diff --git a/src/plugins/notificationAndServiceWorker.js b/src/plugins/notificationAndServiceWorker.js index 117c97d..b97af51 100644 --- a/src/plugins/notificationAndServiceWorker.js +++ b/src/plugins/notificationAndServiceWorker.js @@ -6,16 +6,16 @@ export function registerServiceWorker() { } } -export function requestNotificationPermission() { +export async function requestNotificationPermission() { if("PushManager" in window) { - window.Notification.requestPermission(); + return Notification?.requestPermission().then((permission) => permission); } else { console.log("No Push API Support!"); } } export function windowNotificationPermission() { - return window.Notification.permission + return window?.Notification?.permission ?? 'Not_supported' } export function notificationCount() { diff --git a/src/store/index.js b/src/store/index.js index 9024acc..4da7ecc 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -41,6 +41,7 @@ const vuexPersistLocalStorage = new VuexPersist({ language: state.language, currentRoomId: state.currentRoomId, hasShownMissedItemsHint: state.hasShownMissedItemsHint, + globalNotification: state.globalNotification, }; } else { return {}; @@ -98,6 +99,9 @@ export default new Vuex.Store({ }, setHasShownMissedItemsHint(state, flag) { state.hasShownMissedItemsHint = flag; + }, + setGlobalNotification(state, flag) { + state.globalNotification = flag; } }, actions: { From db04080463d01323e4eb41bf8689c59a0797b43b Mon Sep 17 00:00:00 2001 From: N-Pex Date: Mon, 27 Nov 2023 16:38:43 +0100 Subject: [PATCH 03/68] Add .apk, .ipa and .zip as allowed file type(s) for media uploads. --- src/components/Chat.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Chat.vue b/src/components/Chat.vue index c9a5fb0..a49466e 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -213,7 +213,7 @@ + accept="image/*, audio/*, video/*, .pdf, .apk, .ipa, .zip" class="d-none" multiple/>
From 324ccd70b3c9efecc844e3f0b9c3a5b9250c312b Mon Sep 17 00:00:00 2001 From: N-Pex Date: Mon, 4 Dec 2023 11:29:23 +0100 Subject: [PATCH 04/68] file types and exports --- package-lock.json | 14 ++-- package.json | 2 +- src/assets/css/chat.scss | 13 +++- src/components/Chat.vue | 3 +- src/components/RoomExport.vue | 38 ++++++++-- src/components/chatMixin.js | 11 +++ src/components/file_mode/ThumbnailView.vue | 31 +++++++- .../messages/MessageIncomingFile.vue | 10 +-- .../messages/MessageIncomingVideo.vue | 9 +++ .../messages/MessageOutgoingFile.vue | 10 +-- .../messages/MessageOutgoingVideo.vue | 14 ++++ src/components/messages/attachmentMixin.js | 18 ++++- .../export/MessageIncomingAudioExport.vue | 6 +- .../export/MessageIncomingFileExport.vue | 51 +++++++++++++ .../export/MessageIncomingVideoExport.vue | 6 +- .../export/MessageOutgoingAudioExport.vue | 6 +- .../export/MessageOutgoingFileExport.vue | 51 +++++++++++++ .../export/MessageOutgoingVideoExport.vue | 6 +- .../export/exportedAttachmentMixin.js | 17 +++++ src/components/sendAttachmentsMixin.js | 2 +- src/plugins/utils.js | 76 +++++++++++++++++-- 21 files changed, 339 insertions(+), 55 deletions(-) create mode 100644 src/components/messages/export/MessageIncomingFileExport.vue create mode 100644 src/components/messages/export/MessageOutgoingFileExport.vue create mode 100644 src/components/messages/export/exportedAttachmentMixin.js diff --git a/package-lock.json b/package-lock.json index a3fe23c..beb2548 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "jszip": "^3.9.1", "linkify-html": "^4.1.0", "linkifyjs": "^4.1.0", - "material-design-icons-iconfont": "^6.1", + "material-design-icons-iconfont": "^6.7.0", "matrix-js-sdk": "^23.4.0", "md-gum-polyfill": "^1.0.0", "mic-recorder-to-mp3": "^2.2.2", @@ -9936,9 +9936,9 @@ } }, "node_modules/material-design-icons-iconfont": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-6.1.0.tgz", - "integrity": "sha512-wRJtOo1v1ch+gN8PRsj0IGJznk+kQ8mz13ds/nuhLI+Qyf/931ZlRpd92oq0IRPpZIb+bhX8pRjzIVdcPDKmiQ==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-6.7.0.tgz", + "integrity": "sha512-lSj71DgVv20kO0kGbs42icDzbRot61gEDBLQACzkUuznRQBUYmbxzEkGU6dNBb5fRWHMaScYlAXX96HQ4/cJWA==" }, "node_modules/matrix-events-sdk": { "version": "0.0.1", @@ -24023,9 +24023,9 @@ } }, "material-design-icons-iconfont": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-6.1.0.tgz", - "integrity": "sha512-wRJtOo1v1ch+gN8PRsj0IGJznk+kQ8mz13ds/nuhLI+Qyf/931ZlRpd92oq0IRPpZIb+bhX8pRjzIVdcPDKmiQ==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-6.7.0.tgz", + "integrity": "sha512-lSj71DgVv20kO0kGbs42icDzbRot61gEDBLQACzkUuznRQBUYmbxzEkGU6dNBb5fRWHMaScYlAXX96HQ4/cJWA==" }, "matrix-events-sdk": { "version": "0.0.1", diff --git a/package.json b/package.json index ee3deaa..86de8c5 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "jszip": "^3.9.1", "linkify-html": "^4.1.0", "linkifyjs": "^4.1.0", - "material-design-icons-iconfont": "^6.1", + "material-design-icons-iconfont": "^6.7.0", "matrix-js-sdk": "^23.4.0", "md-gum-polyfill": "^1.0.0", "mic-recorder-to-mp3": "^2.2.2", diff --git a/src/assets/css/chat.scss b/src/assets/css/chat.scss index 984a969..acd71e7 100644 --- a/src/assets/css/chat.scss +++ b/src/assets/css/chat.scss @@ -783,12 +783,23 @@ body { width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.4); - align-items: center; display: flex; + flex-direction: column; + align-items: center; + justify-content: center; .download-text { width: 100%; color: white; } + .download-size { + font-size: 70%; + color: white; + } + .download-icon { + width: 32px; + height: 32px; + color: white; + } } .room-name, diff --git a/src/components/Chat.vue b/src/components/Chat.vue index a49466e..a34378b 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -213,7 +213,7 @@ + accept="image/*,audio/*,video/*,.pdf,application/pdf,.apk,application/vnd.android.package-archive,.ipa,.zip,application/zip,application/x-zip-compressed,multipart/x-zip" class="d-none" multiple/>
@@ -1545,6 +1545,7 @@ export default { }, download(event) { + console.error("DOWNLOAD!!!"); if ((event.isThreadRoot || event.isMxThread) && this.timelineSet) { const children = this.timelineSet.relations.getAllChildEventsForEvent(event.getId()).filter(e => util.downloadableTypes().includes(e.getContent().msgtype)); children.forEach(child => util.download(this.$matrix.matrixClient, child)); diff --git a/src/components/RoomExport.vue b/src/components/RoomExport.vue index 769af2a..6f7b872 100644 --- a/src/components/RoomExport.vue +++ b/src/components/RoomExport.vue @@ -287,6 +287,7 @@ export default { var imageFolder = zip.folder("images"); var audioFolder = zip.folder("audio"); var videoFolder = zip.folder("video"); + var filesFolder = zip.folder("files"); var downloadPromises = []; let components = this.$refs.exportedEvent; @@ -321,7 +322,8 @@ export default { for (let imageIndex = 0; imageIndex < images.length; imageIndex++) { const img = images[imageIndex]; img.onerror = undefined; - img.src = './avatars/' + fileName; + img.removeAttribute("src"); + img.setAttribute("data-exported-src", './avatars/' + fileName); } } } @@ -421,13 +423,15 @@ export default { var extension = ".mp3"; let fileName = comp.event.getId() + extension; audioFolder.file(fileName, blob); // TODO calc bytes + //this.$nextTick(() => { let elements = comp.$el.getElementsByTagName("audio"); let element = elements && elements[0]; if (element) { - element.src = "./audio/" + fileName; + element.setAttribute("data-exported-src", "./audio/" + fileName); } this.processedEvents += 1; resolve(true); + //}); }); } }) @@ -449,13 +453,36 @@ export default { var extension = ".mp4"; let fileName = comp.event.getId() + extension; videoFolder.file(fileName, blob); // TODO calc bytes +// comp.src = "./video/" + fileName; let elements = comp.$el.getElementsByTagName("video"); let element = elements && elements[0]; if (element) { - element.src = "./video/" + fileName; + element.setAttribute("data-exported-src", "./video/" + fileName); } this.processedEvents += 1; - + resolve(true); + }); + } + }) + .catch((ignoredErr) => { + this.processedEvents += 1; + }) + ); + break; + case "MessageIncomingFileExport": + case "MessageOutgoingFileExport": + downloadPromises.push( + util + .getAttachment(this.$matrix.matrixClient, comp.event, null, true) + .then((blob) => { + if (currentMediaSize + blob.size <= maxMediaSize) { + currentMediaSize += blob.size; + return new Promise((resolve, ignoredReject) => { + var extension = util.getFileExtension(comp.event); + let fileName = comp.event.getId() + extension; + filesFolder.file(fileName, blob); + comp.href="./files/" + fileName; + this.processedEvents += 1; resolve(true); }); } @@ -504,7 +531,8 @@ export default { getCssRules(root); this.$nextTick(() => { - doc += this.$refs.exportRoot.outerHTML; + const contentHtml = this.$refs.exportRoot.outerHTML; + doc += contentHtml.replaceAll("data-exported-src=", "src="); doc += "
"; zip.file("chat.html", doc); diff --git a/src/components/chatMixin.js b/src/components/chatMixin.js index c5a4c2a..ce4b85b 100644 --- a/src/components/chatMixin.js +++ b/src/components/chatMixin.js @@ -19,10 +19,12 @@ import MessageIncomingImageExport from "./messages/export/MessageIncomingImageEx import MessageIncomingAudioExport from "./messages/export/MessageIncomingAudioExport"; import MessageIncomingVideoExport from "./messages/export/MessageIncomingVideoExport"; import MessageIncomingThreadExport from "./messages/export/MessageIncomingThreadExport"; +import MessageIncomingFileExport from "./messages/export/MessageIncomingFileExport"; import MessageOutgoingImageExport from "./messages/export/MessageOutgoingImageExport"; import MessageOutgoingAudioExport from "./messages/export/MessageOutgoingAudioExport"; import MessageOutgoingVideoExport from "./messages/export/MessageOutgoingVideoExport"; import MessageOutgoingThreadExport from "./messages/export/MessageOutgoingThreadExport"; +import MessageOutgoingFileExport from "./messages/export/MessageOutgoingFileExport"; import ContactJoin from "./messages/ContactJoin.vue"; import ContactLeave from "./messages/ContactLeave.vue"; import ContactInvited from "./messages/ContactInvited.vue"; @@ -172,6 +174,9 @@ export default { event.getContent().info.mimetype && event.getContent().info.mimetype.startsWith("image/svg") ) { + if (isForExport) { + return MessageIncomingFileExport; + } return MessageIncomingFile; } if (isForExport) { @@ -189,6 +194,9 @@ export default { } return MessageIncomingVideo; } else if (event.getContent().msgtype == "m.file") { + if (isForExport) { + return MessageIncomingFileExport; + } return MessageIncomingFile; } else if (stickers.isStickerShortcode(event.getContent().body)) { return MessageIncomingSticker; @@ -223,6 +231,9 @@ export default { } return MessageOutgoingVideo; } else if (event.getContent().msgtype == "m.file") { + if (isForExport) { + return MessageOutgoingFileExport; + } return MessageOutgoingFile; } else if (stickers.isStickerShortcode(event.getContent().body)) { return MessageOutgoingSticker; diff --git a/src/components/file_mode/ThumbnailView.vue b/src/components/file_mode/ThumbnailView.vue index 59a5e76..12003b9 100644 --- a/src/components/file_mode/ThumbnailView.vue +++ b/src/components/file_mode/ThumbnailView.vue @@ -1,19 +1,22 @@ diff --git a/src/components/messages/MessageIncomingFile.vue b/src/components/messages/MessageIncomingFile.vue index 81b25c4..ef34564 100644 --- a/src/components/messages/MessageIncomingFile.vue +++ b/src/components/messages/MessageIncomingFile.vue @@ -10,12 +10,7 @@
- {{ $t('message.file_prefix') }} - + {{ $t('message.edited') }} @@ -25,11 +20,12 @@ diff --git a/src/components/messages/MessageIncomingVideo.vue b/src/components/messages/MessageIncomingVideo.vue index 180d53d..c7af6d8 100644 --- a/src/components/messages/MessageIncomingVideo.vue +++ b/src/components/messages/MessageIncomingVideo.vue @@ -10,6 +10,15 @@ {{ $t('message.download_progress',{percentage: downloadProgress}) }}
+
+
+ {{ fileName }} +
+
+ {{ fileSize }} +
+ download +
diff --git a/src/components/messages/MessageOutgoingFile.vue b/src/components/messages/MessageOutgoingFile.vue index cb13085..87e8e6d 100644 --- a/src/components/messages/MessageOutgoingFile.vue +++ b/src/components/messages/MessageOutgoingFile.vue @@ -11,12 +11,7 @@
- {{ $t('message.file_prefix') }} - + {{ $t('message.edited') }} @@ -26,11 +21,12 @@ diff --git a/src/components/messages/export/MessageIncomingVideoExport.vue b/src/components/messages/export/MessageIncomingVideoExport.vue index 3727ae8..1716a36 100644 --- a/src/components/messages/export/MessageIncomingVideoExport.vue +++ b/src/components/messages/export/MessageIncomingVideoExport.vue @@ -2,7 +2,7 @@
- @@ -11,14 +11,14 @@ diff --git a/src/components/messages/export/MessageOutgoingAudioExport.vue b/src/components/messages/export/MessageOutgoingAudioExport.vue index b0f6906..f32c19a 100644 --- a/src/components/messages/export/MessageOutgoingAudioExport.vue +++ b/src/components/messages/export/MessageOutgoingAudioExport.vue @@ -1,18 +1,18 @@ diff --git a/src/components/messages/export/MessageOutgoingFileExport.vue b/src/components/messages/export/MessageOutgoingFileExport.vue new file mode 100644 index 0000000..0bcaa6f --- /dev/null +++ b/src/components/messages/export/MessageOutgoingFileExport.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/components/messages/export/MessageOutgoingVideoExport.vue b/src/components/messages/export/MessageOutgoingVideoExport.vue index be07c5d..8faf38f 100644 --- a/src/components/messages/export/MessageOutgoingVideoExport.vue +++ b/src/components/messages/export/MessageOutgoingVideoExport.vue @@ -2,7 +2,7 @@
- @@ -11,14 +11,14 @@ diff --git a/src/components/messages/export/exportedAttachmentMixin.js b/src/components/messages/export/exportedAttachmentMixin.js new file mode 100644 index 0000000..e3b72b6 --- /dev/null +++ b/src/components/messages/export/exportedAttachmentMixin.js @@ -0,0 +1,17 @@ +import util from "../../../plugins/utils"; + +export default { + data() { + return { + src: null, + } + }, + computed: { + fileName() { + return util.getFileName(this.event); + }, + fileSize() { + return util.getFileSizeFormatted(this.event); + } + }, +} \ No newline at end of file diff --git a/src/components/sendAttachmentsMixin.js b/src/components/sendAttachmentsMixin.js index 3503a11..25b603b 100644 --- a/src/components/sendAttachmentsMixin.js +++ b/src/components/sendAttachmentsMixin.js @@ -74,7 +74,7 @@ export default { if (item.status !== this.sendStatuses.INITIAL) { return getItemPromise(++index); } - const itemPromise = util.sendImage(this.$matrix.matrixClient, this.room.roomId, item.attachment, ({ loaded, total }) => { + const itemPromise = util.sendFile(this.$matrix.matrixClient, this.room.roomId, item.attachment, ({ loaded, total }) => { if (loaded == total) { item.progress = 100; } else if (total > 0) { diff --git a/src/plugins/utils.js b/src/plugins/utils.js index f5dcf15..5e5d3e4 100644 --- a/src/plugins/utils.js +++ b/src/plugins/utils.js @@ -4,6 +4,7 @@ import dataUriToBuffer from "data-uri-to-buffer"; import ImageResize from "image-resize"; import { AutoDiscovery } from 'matrix-js-sdk'; import User from '../models/user'; +const prettyBytes = require("pretty-bytes"); export const STATE_EVENT_ROOM_DELETION_NOTICE = "im.keanu.room_deletion_notice"; export const STATE_EVENT_ROOM_DELETED = "im.keanu.room_deleted"; @@ -159,7 +160,7 @@ class Util { // true // ); url = matrixClient.mxcUrlToHttp(file.url); - } else if (content.file && content.file.url) { + } else if (content.file && content.file.url && this.getMimeType(event).startsWith("image/")) { // No thumb, use real url file = content.file; url = matrixClient.mxcUrlToHttp(file.url); @@ -348,7 +349,7 @@ class Util { }); } - sendImage(matrixClient, roomId, file, onUploadProgress, threadRoot) { + sendFile(matrixClient, roomId, file, onUploadProgress, threadRoot) { const uploadPromise = new UploadPromise(undefined); uploadPromise.wrappedPromise = new Promise((resolve, reject) => { var reader = new FileReader(); @@ -371,13 +372,13 @@ class Util { } var description = file.name; - var msgtype = 'm.image'; - if (file.type.startsWith("audio/")) { + var msgtype = 'm.file'; + if (file.type.startsWith("image/")) { + msgtype = 'm.image'; + } else if (file.type.startsWith("audio/")) { msgtype = 'm.audio'; } else if (file.type.startsWith("video/")) { msgtype = 'm.video'; - } else if (file.type.startsWith("application/pdf")) { - msgtype = 'm.file'; } const opts = { @@ -913,7 +914,6 @@ class Util { link.download = event.getContent().body || this.$t("fallbacks.download_name"); document.body.appendChild(link); link.click(); - setTimeout(function () { document.body.removeChild(link); URL.revokeObjectURL(url); @@ -951,6 +951,68 @@ class Util { } return Promise.resolve(config.defaultBaseUrl); } + + getMimeType(event) { + const content = event.getContent(); + return (content.info && content.info.mimetype) ? content.info.mimetype : (content.file && content.file.mimetype) ? content.file.mimetype : ""; + } + + getFileName(event) { + const content = event.getContent(); + return (content.body || content.filename || "").toLowerCase(); + } + + getFileExtension(event) { + const fileName = this.getFileName(event); + const parts = fileName.split("."); + if (parts.length > 1) { + return "." + parts[parts.length - 1].toLowerCase(); + } + return ""; + } + + getFileSize(event) { + const content = event.getContent(); + if (content.info) { + return content.info.size; + } + return 0; + } + + getFileSizeFormatted(event) { + return prettyBytes(this.getFileSize(event)); + } + + isFileTypeAPK(event) { + const mime = this.getMimeType(event); + if (mime === "application/vnd.android.package-archive" || this.getFileName(event).endsWith(".apk")) { + return true; + } + return false; + } + + isFileTypeIPA(event) { + if (this.getFileName(event).endsWith(".ipa")) { + return true; + } + return false; + } + + isFileTypePDF(event) { + const mime = this.getMimeType(event); + if (mime === "application/pdf" || this.getFileName(event).endsWith(".pdf")) { + return true; + } + return false; + } + + isFileTypeZip(event) { + const mime = this.getMimeType(event); + if (["application/zip", "application/x-zip-compressed", "multipart/x-zip"].includes(mime) || this.getFileName(event).endsWith(".zip")) { + return true; + } + return false; + } } export default new Util(); From db517fbd9c2b78c0949a375897fe61cddef2bb74 Mon Sep 17 00:00:00 2001 From: N-Pex Date: Mon, 4 Dec 2023 15:28:03 +0100 Subject: [PATCH 05/68] Add maxSizeAutoDownloads with default set to 10Mb --- README.md | 1 + src/components/Chat.vue | 2 +- src/components/messages/MessageIncomingImage.vue | 2 +- src/components/messages/MessageIncomingThread.vue | 2 +- src/components/messages/MessageOutgoingImage.vue | 2 +- src/components/messages/MessageOutgoingThread.vue | 2 +- src/components/messages/attachmentMixin.js | 2 +- src/plugins/utils.js | 4 ++-- src/services/config.service.js | 3 +++ 9 files changed, 12 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 72b3262..2292d13 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ The app loads runtime configutation from the server at "./config.json" and merge * **logo** - An url or base64-encoded image data url that represents the app logotype. * **accentColor** - The accent color of the app UI. Use a HTML-style color value string, like "#ff0080". * **show_status_messages** - Whether to show only user joins/leaves and display name updates, or the full range of room status updates. Possible values are "never" (only the above), "moderators" (moderators will see all status updates) or "always" (everyone will see all status updates). Defaults to "always". +* **maxSizeAutoDownloads** - Attachments smaller than this will be auto downloaded. Default is 10Mb. ### Sticker short codes - To enable sticker short codes, follow these steps: diff --git a/src/components/Chat.vue b/src/components/Chat.vue index a34378b..5aa0489 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -1507,7 +1507,7 @@ export default { setReplyToImage(event) { util - .getThumbnail(this.$matrix.matrixClient, event) + .getThumbnail(this.$matrix.matrixClient, event, this.$config) .then((url) => { this.replyToImg = url; }) diff --git a/src/components/messages/MessageIncomingImage.vue b/src/components/messages/MessageIncomingImage.vue index b73752f..732c584 100644 --- a/src/components/messages/MessageIncomingImage.vue +++ b/src/components/messages/MessageIncomingImage.vue @@ -39,7 +39,7 @@ export default { const width = this.$refs.image.$el.clientWidth; const height = (width * 9) / 16; util - .getThumbnail(this.$matrix.matrixClient, this.event, width, height) + .getThumbnail(this.$matrix.matrixClient, this.event, this.$config, width, height) .then((url) => { const info = this.event.getContent().info; // JPEGs use cover, PNG and GIF ect contain. This is because PNG and GIF are expected to diff --git a/src/components/messages/MessageIncomingThread.vue b/src/components/messages/MessageIncomingThread.vue index 85ffc0e..2bab13b 100644 --- a/src/components/messages/MessageIncomingThread.vue +++ b/src/components/messages/MessageIncomingThread.vue @@ -80,7 +80,7 @@ export default { }; ret.promise = util - .getThumbnail(this.$matrix.matrixClient, e, 100, 100) + .getThumbnail(this.$matrix.matrixClient, e, this.$config, 100, 100) .then((url) => { ret.src = url; }) diff --git a/src/components/messages/MessageOutgoingImage.vue b/src/components/messages/MessageOutgoingImage.vue index e9e5c29..3035c71 100644 --- a/src/components/messages/MessageOutgoingImage.vue +++ b/src/components/messages/MessageOutgoingImage.vue @@ -38,7 +38,7 @@ export default { const width = this.$refs.image.$el.clientWidth; const height = (width * 9) / 16; util - .getThumbnail(this.$matrix.matrixClient, this.event, width, height) + .getThumbnail(this.$matrix.matrixClient, this.event, this.$config, width, height) .then((url) => { const info = this.event.getContent().info; // JPEGs use cover, PNG and GIF ect contain. This is because PNG and GIF are expected to diff --git a/src/components/messages/MessageOutgoingThread.vue b/src/components/messages/MessageOutgoingThread.vue index ca1cda5..ebcf953 100644 --- a/src/components/messages/MessageOutgoingThread.vue +++ b/src/components/messages/MessageOutgoingThread.vue @@ -81,7 +81,7 @@ export default { }; ret.promise = util - .getThumbnail(this.$matrix.matrixClient, e, 100, 100) + .getThumbnail(this.$matrix.matrixClient, e, this.$config, 100, 100) .then((url) => { ret.src = url; }) diff --git a/src/components/messages/attachmentMixin.js b/src/components/messages/attachmentMixin.js index df6f4af..0fed50b 100644 --- a/src/components/messages/attachmentMixin.js +++ b/src/components/messages/attachmentMixin.js @@ -39,7 +39,7 @@ export default { } if (event) { const fileSize = util.getFileSize(event); - if (!userInitiated && (fileSize == 0 || fileSize > 1000000)) { + if (!userInitiated && (fileSize == 0 || fileSize > this.$config.maxSizeAutoDownloads)) { this.userInitiatedDownloadsOnly = true; return; } diff --git a/src/plugins/utils.js b/src/plugins/utils.js index 5e5d3e4..c1b2057 100644 --- a/src/plugins/utils.js +++ b/src/plugins/utils.js @@ -130,7 +130,7 @@ class Util { }); } - getThumbnail(matrixClient, event, ignoredw, ignoredh) { + getThumbnail(matrixClient, event, config, ignoredw, ignoredh) { return new Promise((resolve, reject) => { const content = event.getContent(); if (content.url != null) { @@ -160,7 +160,7 @@ class Util { // true // ); url = matrixClient.mxcUrlToHttp(file.url); - } else if (content.file && content.file.url && this.getMimeType(event).startsWith("image/")) { + } else if (content.file && content.file.url && this.getFileSize(event) > 0 && this.getFileSize(event) < config.maxSizeAutoDownloads) { // No thumb, use real url file = content.file; url = matrixClient.mxcUrlToHttp(file.url); diff --git a/src/services/config.service.js b/src/services/config.service.js index 56dd7aa..1885a0d 100644 --- a/src/services/config.service.js +++ b/src/services/config.service.js @@ -26,6 +26,9 @@ export default { if (json.useFullyQualifiedDMLinks == undefined) { Vue.set(config, "useFullyQualifiedDMLinks", true); // Default to true } + if (!json.maxSizeAutoDownloads) { + Vue.set(config, "maxSizeAutoDownloads", 10 * 1024 * 1024); + } Vue.set(config, "loaded", true); // Tell callback we are done loading runtime config From 55e94cee3a354ea916de2b1b935f074ee3b621ad Mon Sep 17 00:00:00 2001 From: N-Pex Date: Tue, 9 Jan 2024 10:38:14 +0100 Subject: [PATCH 06/68] New file type icons --- src/assets/icons/ic_apk.vue | 8 ++++++++ src/assets/icons/ic_ipa.vue | 8 ++++++++ src/assets/icons/ic_pdf.vue | 8 ++++++++ src/assets/icons/ic_zip.vue | 8 ++++++++ src/components/file_mode/ThumbnailView.vue | 8 ++++---- 5 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 src/assets/icons/ic_apk.vue create mode 100644 src/assets/icons/ic_ipa.vue create mode 100644 src/assets/icons/ic_pdf.vue create mode 100644 src/assets/icons/ic_zip.vue diff --git a/src/assets/icons/ic_apk.vue b/src/assets/icons/ic_apk.vue new file mode 100644 index 0000000..71d7fa2 --- /dev/null +++ b/src/assets/icons/ic_apk.vue @@ -0,0 +1,8 @@ + diff --git a/src/assets/icons/ic_ipa.vue b/src/assets/icons/ic_ipa.vue new file mode 100644 index 0000000..07419d1 --- /dev/null +++ b/src/assets/icons/ic_ipa.vue @@ -0,0 +1,8 @@ + diff --git a/src/assets/icons/ic_pdf.vue b/src/assets/icons/ic_pdf.vue new file mode 100644 index 0000000..9e2fcb2 --- /dev/null +++ b/src/assets/icons/ic_pdf.vue @@ -0,0 +1,8 @@ + diff --git a/src/assets/icons/ic_zip.vue b/src/assets/icons/ic_zip.vue new file mode 100644 index 0000000..a58cdeb --- /dev/null +++ b/src/assets/icons/ic_zip.vue @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/src/components/file_mode/ThumbnailView.vue b/src/components/file_mode/ThumbnailView.vue index 12003b9..1756151 100644 --- a/src/components/file_mode/ThumbnailView.vue +++ b/src/components/file_mode/ThumbnailView.vue @@ -38,13 +38,13 @@ export default { computed: { fileTypeIcon() { if (util.isFileTypeAPK(this.item.event)) { - return "phone_android"; + return "$vuetify.icons.ic_apk"; } else if (util.isFileTypeIPA(this.item.event)) { - return "phone_iphone"; + return "$vuetify.icons.ic_ipa"; } else if (util.isFileTypePDF(this.item.event)) { - return "picture_as_pdf"; + return "$vuetify.icons.ic_pdf"; } else if (util.isFileTypeZip(this.item.event)) { - return "folder_zip"; + return "$vuetify.icons.ic_zip"; } return "description" }, From 6454931848ed8f496d683a4746e24a4de16da4dc Mon Sep 17 00:00:00 2001 From: N-Pex Date: Tue, 9 Jan 2024 10:52:16 +0100 Subject: [PATCH 07/68] Remove debug message --- src/components/Chat.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Chat.vue b/src/components/Chat.vue index 5aa0489..e384cdc 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -1545,7 +1545,6 @@ export default { }, download(event) { - console.error("DOWNLOAD!!!"); if ((event.isThreadRoot || event.isMxThread) && this.timelineSet) { const children = this.timelineSet.relations.getAllChildEventsForEvent(event.getId()).filter(e => util.downloadableTypes().includes(e.getContent().msgtype)); children.forEach(child => util.download(this.$matrix.matrixClient, child)); From ca35c770c3b3d453299e9657f7a11a8f4090a267 Mon Sep 17 00:00:00 2001 From: Lhasa heaven on earth Date: Wed, 1 Nov 2023 11:49:03 +0000 Subject: [PATCH 08/68] Translated using Weblate (Tibetan) Currently translated at 80.6% (280 of 347 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/bo/ --- src/assets/translations/bo.json | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/assets/translations/bo.json b/src/assets/translations/bo.json index bcb373b..e01747e 100644 --- a/src/assets/translations/bo.json +++ b/src/assets/translations/bo.json @@ -202,7 +202,7 @@ "reply_poll": "བསམ་ཚུལ་བསྡུ་ལེན།", "not_allowed_to_send": "དོ་དམ་པ་དང་གཙོ་སྐྱོང་བ་ཁོ་ནས་མ་གཏོགས་ཁ་བརྡ་ཁང་དུ་གཏོང་མི་ཆོག", "user_was_kicked_by_you": "ཁྱེད་ཀྱིས་{user}་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", - "user_was_kicked": "{user} ་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་ཟིན།", + "user_was_kicked": "{user} ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་ཟིན།", "user_was_kicked_you": "ཁྱེད་རང་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", "user_was_banned": "{user}་འདི་ཁ་བརྡའི་ཁོངས་ནས་བཀག་སྡོམ་བྱས་ཏེ་སྒོར་ཕུད་ཟིན།", "user_was_banned_by_you": "ཁྱེད་ཀྱིས་{user} ་འདི་ཁ་བརྡའི་ཁོངས་ནས་བཀག་སྡོམ་བྱས་ཏེ་སྒོར་ཕུད་ཟིན།", @@ -282,11 +282,19 @@ "global": { "save": "ཉར་ཚགས།", "password_didnot_match": "གསང་ཚིག་མཐུན་གྱི་མི་འདུག", - "password_hint": "ཉུང་མཐར་ཡང་ཡིག་འབྲུ་༡༢་དགོས་ལ། དེའི་ནང་དུ་ཨང་གྲངས་གཅིག་དང་། ཡིག་ཆེན་གཅིག ཡིག་ཆུང་གཅིག་ངེས་པར་དུ་ཚང་དགོས།", + "password_hint": "ཉུང་མཐར་ཡང་ཡིག་འབྲུ་༡༢་ཀྱི་ཁོངས་སུ། ཨང་གྲངས་གཅིག་དང་། ཡིག་ཆེན་གཅིག ཡིག་ཆུང་གཅིག་ངེས་པར་དུ་ཚང་དགོས།", "add_reaction": "ཡ་ལན་ཁ་སྣོན།", "click_to_remove": "བསྣུན་ཏེ་མེད་པར་བཟོས།", "show_less": "ཉུང་བ་སྟོན།", - "show_more": "མང་བ་སྟོན།" + "show_more": "མང་བ་སྟོན།", + "time": { + "hours": "ཆུ་ཚོད་གཅིག་གི་སྔོན། | ཆུ་ཚོད {n} སྔོན་ལ།", + "minutes": "སྐར་མ་གཅིག་གི་སྔོན། | སྐར་མ {n} སྔོན་ལ།", + "days": "ཉིན་གཅིག་གི་གོང་། | ཉིན{n}གོང་ལ།", + "recently": "ད་ལྟ་རང་།" + }, + "notify": "བརྡ་ཁྱབ་གཏོང་བ།", + "close": "སྒོ་རྒྱོབ།" }, "logout": { "confirm_text": "ཁྱེད་རང་ཁ་བརྡ་ཁང་ནས་ཕྱི་རུ་ཐོན་རྒྱུ་ཡིན་ནམ།" From 7dd6e48e066336317be33c72719beece27e27e7b Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Wed, 1 Nov 2023 11:55:37 +0000 Subject: [PATCH 09/68] Translated using Weblate (Tibetan) Currently translated at 80.6% (280 of 347 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/bo/ --- src/assets/translations/bo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/translations/bo.json b/src/assets/translations/bo.json index e01747e..6fbd257 100644 --- a/src/assets/translations/bo.json +++ b/src/assets/translations/bo.json @@ -202,7 +202,7 @@ "reply_poll": "བསམ་ཚུལ་བསྡུ་ལེན།", "not_allowed_to_send": "དོ་དམ་པ་དང་གཙོ་སྐྱོང་བ་ཁོ་ནས་མ་གཏོགས་ཁ་བརྡ་ཁང་དུ་གཏོང་མི་ཆོག", "user_was_kicked_by_you": "ཁྱེད་ཀྱིས་{user}་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", - "user_was_kicked": "{user} ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་ཟིན།", + "user_was_kicked": "{སྤྱོད་མཁན} ་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་ཟིན།", "user_was_kicked_you": "ཁྱེད་རང་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", "user_was_banned": "{user}་འདི་ཁ་བརྡའི་ཁོངས་ནས་བཀག་སྡོམ་བྱས་ཏེ་སྒོར་ཕུད་ཟིན།", "user_was_banned_by_you": "ཁྱེད་ཀྱིས་{user} ་འདི་ཁ་བརྡའི་ཁོངས་ནས་བཀག་སྡོམ་བྱས་ཏེ་སྒོར་ཕུད་ཟིན།", From 65d5f68efd9cfb4f89a69161b2d89ca8aa0a4f82 Mon Sep 17 00:00:00 2001 From: Lhasa heaven on earth Date: Thu, 2 Nov 2023 16:56:19 +0000 Subject: [PATCH 10/68] Translated using Weblate (Chinese (Simplified)) Currently translated at 80.6% (280 of 347 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/zh_Hans/ --- src/assets/translations/zh_Hans.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/translations/zh_Hans.json b/src/assets/translations/zh_Hans.json index 1ff9865..d0592f0 100644 --- a/src/assets/translations/zh_Hans.json +++ b/src/assets/translations/zh_Hans.json @@ -282,7 +282,7 @@ "global": { "save": "保存", "password_didnot_match": "密码不匹配", - "password_hint": "至少 12 个字符,包含至少一个数字、一个大写字母和一个小写字母", + "password_hint": "至少 12 个字符,包含一个数字、一个大写字母和一个小写字母", "show_less": "显示较少", "show_more": "展示更多", "add_reaction": "添加反应", From 5abefb45814401c5d4286e397190fc4c3d67868d Mon Sep 17 00:00:00 2001 From: Lhasa heaven on earth Date: Thu, 2 Nov 2023 11:59:05 +0000 Subject: [PATCH 11/68] Translated using Weblate (Tibetan) Currently translated at 100.0% (347 of 347 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/bo/ --- src/assets/translations/bo.json | 89 ++++++++++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 6 deletions(-) diff --git a/src/assets/translations/bo.json b/src/assets/translations/bo.json index 6fbd257..835f6ac 100644 --- a/src/assets/translations/bo.json +++ b/src/assets/translations/bo.json @@ -34,7 +34,16 @@ "voice_mode": "སྐད་སྒྲའི་རྣམ་པ།", "voice_mode_info": "ཁ་བརྡའི་འབྲེལ་མཐུད་དེ་ཉན་པ་དང་སྒྲ་ཕབ་ཀྱི་རྣམ་པའི་ནང་དུ་བསྒྱུར།", "download_chat": "ཁ་བརྡ་ཕབ་ལེན།", - "read_only_room": "ཁ་བརྡ་ཁང་དུ་ཀློག་མ་གཏོགས་མི་ཆོག" + "read_only_room": "ཁ་བརྡ་ཁང་དུ་ཀློག་མ་གཏོགས་མི་ཆོག", + "direct_link": "ང་དང་ཐད་ཀར་ཁ་བརྡ་བྱེད་སའི་འབྲེལ་ཐག", + "make_public_warning": "ཉེན་བརྡ།: ཆ་འཕྲིན་གྱི་ལོ་རྒྱུས་ཡོངས་རྫོགས་འཛུལ་ཞུགས་པ་གསར་པ་ཚོས་མཐོང་ཐུབ།", + "room_type": "ཁ་བརྡ་ཁང་གི་དབྱེ་བ།", + "file_mode_info": "གླེང་མོལ་གྱི་མཐུད་ངོས་ཡིག་ཆ་བརྒྱུད་གཏོང་གི་རྣམ་པར་བསྒྱུར།", + "room_type_default": "སྔར་ཡོད།", + "file_mode": "ཡིག་ཆའི་རྣམ་པ།", + "direct_link_desc": "བརྒྱུད་སྐུར་བྱེད་པར་གྲ་སྒྲིག་ཡིན། མི་ཞིག་གིས་འབྲེལ་ཐག་དེ་ཁ་འབྱེད་ཐེངས་རེར། ང་དང་ཐད་ཀར་གླེང་མོལ་བྱ་སའི་ཁ་བརྡ་ཁང་ཞིག་གི་སྒོ་འབྱེད་ངེས།", + "copy_link": "འབྲེལ་ཐག་པར་བཤུས་རྒྱོབས།", + "make_public": "ཡོངས་ཁྱབ་བཟོས།" }, "invite": { "done": "ལེགས་འགྲུབ།", @@ -60,7 +69,10 @@ "send_verification": "ར་སྤྲོད་ཡིག་ཟམ་ཐོངས།", "no_supported_flow": "བཀོལ་ཆས་འདི་སྤྲད་ཡོད་པའི་དྲ་བའི་ཞབས་ཞུ་ཆས་ནང་དུ་འཛུལ་ཐུབ་ཀྱི་མི་འདུག", "sent_verification": "{email}ཡིག་ཟམ་ཁ་བྱང་འདིའི་ཐོག་ཏུ་འཕྲིན་པ་ཞིག་བཏང་ཡོད། ཡིག་ཟམ་ནང་འཛུལ་ཏེ་སོ་སོའི་ཡིག་ཟམ་ཁ་བྱང་ར་སྤྲོད་བྱེད་རོགས།", - "email_not_valid": "ཡིག་ཟམ་ཁ་བྱང་བེད་མེད་རེད་འདུག" + "email_not_valid": "ཡིག་ཟམ་ཁ་བྱང་བེད་མེད་རེད་འདུག", + "registration_token": "ཐོ་འགོད་མཚོན་རྟགས་གཏགས་རོགས།", + "token_not_valid": "མཚོན་རྟགས་རྩིས་མེད།", + "send_token": "མཚོན་རྟགས་ཐོངས།" }, "new_room": { "next": "རྗེས་མ།", @@ -140,7 +152,10 @@ "got_it": "ཧ་གོ་སོང་།", "room_history_joined": "ཚོགས་མི་ཁག་ཁ་བརྡ་ཁང་དུ་ཞུགས་པའི་རྗེས་སུ། ད་གཟོད་དེའི་ནང་དུ་བཏང་ཡོད་པའི་འཕྲིན་ཐུང་ཁག་མཐོང་ཐུབ།", "room_history_is": "ཁ་བརྡ་ཁང་གི་ཟིན་ཐོ་ཁག {type}.", - "encrypted": "འཕྲིན་ཐུང་ཁག་ལ་སྣེ་གཉིས་བར་གྱི་གསང་སྡོམ་བྱས་ཡོད།" + "encrypted": "འཕྲིན་ཐུང་ཁག་ལ་སྣེ་གཉིས་བར་གྱི་གསང་སྡོམ་བྱས་ཡོད།", + "no_past_messages": "དགའ་བསུ་ཞུ། ཁྱེད་ཀྱི་བདེ་འཇགས་ཀྱི་ཆེད་དུ། སྔོན་གྱི་ཆ་འཕྲིན་ཁག་ལྟ་ཀློག་མི་ཐུབ།", + "direct_info": "བཀྲ་ཤིས་བདེ་ལེགས། {you} ཁྱེད་རང་{user}་དང་སྒེར་གྱི་ཁ་བརྡ་བྱེད་བཞིན་ཡོད།", + "direct_private_chat": "ཐད་ཀའི་འཕྲིན་ཐུང་།" }, "room": { "leave": "ཕྱིར་ཐོན།", @@ -208,7 +223,17 @@ "user_was_banned_by_you": "ཁྱེད་ཀྱིས་{user} ་འདི་ཁ་བརྡའི་ཁོངས་ནས་བཀག་སྡོམ་བྱས་ཏེ་སྒོར་ཕུད་ཟིན།", "time_ago": "དེ་རིང་། | ཁ་སང་། | ཉིན་གྲངས་{count} གོང་།", "outgoing_message_deleted_text": "ཁྱེད་ཀྱིས་ཆ་འཕྲིན་འདི་བསུབས་སོང་།", - "reaction_count_more": "{reactionCount} མང་བ།" + "reaction_count_more": "{reactionCount} མང་བ།", + "images": "པར་རིས།", + "send_attachements_dialog_title": "ཁྱེད་ཀྱིས་གཤམ་གྱི་ཟུར་སྣོན་འདི་དག་གཏོང་འདོད་དམ།", + "preparing_to_upload": "ཡར་འཇུག་བྱེད་པར་གྲ་སྒྲིག་བྱེད་བཞིན་པ...", + "seen_by": "མཐོང་མཁན།", + "seen_by_count": "ཚོགས་མི་སུས་ཀྱང་མཐོང་མི་འདུག| ཚོགས་མི་གཅིག་གིས་མཐོང་འདུག ཚོགས་མི་{count}་མཐོང་འདུག", + "files": "ཡིག་ཆ་ཁག", + "download_all": "ཆ་ཚང་ཕབ་ལེན།", + "file": "ཡིག་ཆ།", + "upload_file_too_large": "ཡར་འཇུག་བྱ་འདོད་ཀྱི་ཡིག་ཆ་ཆེ་དྲགས་འདུག", + "upload_exceeded_file_limit": "({configFormattedUploadSize}) ་ཡི་ཡིག་ཆ་ཆེ་ཤོས་ཀྱི་ཆེ་ཆུང་གི་ཚད་གཞི་ལས་བརྒལ་འདུག " }, "power_level": { "moderator": "མདོ་འཛིན་པ།", @@ -261,7 +286,8 @@ "join_user": "ཁ་བརྡ་འགོ་རྩོམ།", "enter_room_user": "ཁ་བརྡ་འགོ་རྩོམ།", "choose_name": "མིང་ཞིག་འདེམས་ཏེ་བཀོལ།", - "title_user": "དགའ་བསུ་ཞུ། ཁྱེད་རང་ཁ་བརྡ་བྱེད་པར་གདན་ཞུ་གནང་སོང་།" + "title_user": "དགའ་བསུ་ཞུ། ཁྱེད་རང་ཁ་བརྡ་བྱེད་པར་གདན་ཞུ་གནང་སོང་།", + "you_have_been_banned": "ཁྱེད་རང་ཚོགས་པ་འདིའི་ནང་ནས་བཀག་འདུག" }, "profile_info_popup": { "powered_by": "ཁ་བརྡ་ཁང་འདི་{product} ནུས་ཤུགས་བསྩལ་ཡོད། {productLink} ནས་དེ་ལས་མང་བ་སྦྱོང་ཆོག་ལ། མདུན་དུ་བསྐྱོད་དེ་ཁ་བརྡ་ཁང་གཞན་ཞིག་བསྐྲུན་ཆོག", @@ -329,6 +355,57 @@ "export": { "exported_date": "{date} ཉིན་ལ་ཕྱིར་འདྲེན་བྱས།", "export_filename": "{date} ཉིན་ཕྱིར་འདྲེན་བྱས་པའི་ཁ་བརྡ།", - "processed_n_of_total_events": "བྱུང་བ་{total}ཁོངས་ནས་ལས་སྣོན་བྱས་ཟིན་པའི་སྨྱན་སྦྱོར་གྱི་གྲངས {count}" + "processed_n_of_total_events": "བྱུང་བ་{total}ཁོངས་ནས་ལས་སྣོན་བྱས་ཟིན་པའི་སྨྱན་སྦྱོར་གྱི་གྲངས {count}", + "fetched_n_of_total_events": "གནས་ཚུལ་{total} ནང་ནས་{count} བཏོན་གནང་།", + "fetched_n_events": "བཏོན་གནང་བའི་གནས་ཚུལ{count}" + }, + "file_mode": { + "add_a_message": "འཕྲིན་ཐུང་ཞིག་ཁ་སྣོན་བྱོས།", + "send_more_files": "ཡིག་ཆ་དེ་ལས་མང་བ་ཐོངས།", + "choose_files": "ཡིག་ཆ་འདེམས།", + "secure_file_send": "བདེ་འཇགས་ཡིག་ཆ་བརྒྱུད་གཏོང་།", + "sending": "གཏོང་བཞིན་པ།", + "files": "ཡིག་ཆ་ཁག", + "sending_progress": "གཏོང་བཞིན་པ...", + "any_file_format_accepted": "ཡིག་ཆའི་རྣམ་བཞག་ཆ་ཚང་ངོས་ལེན་བྱེད།", + "files_sent_with_note": "མཆན་ཞིག་དང་མཉམ་དུ་ཡིག་ཆ་1་བཏང་ཟིན། མཆན་ཞིག་དང་མཉམ་དུ་ཡིག་ཆ {count} བཏང་ཟིན།", + "close": "སྒོ་རྒྱོབ།", + "files_sent": "ཡིག་ཆ1 བཏང་ཟིན། |ཡིག་ཆ{count}བཏང་ཟིན།" + }, + "notification": { + "dialog": { + "body": "འཕྲིན་ཐུང་དང་ཁ་བརྡ་གལ་ཆེན་གཅིག་ཀྱང་མ་ཤོར་བ་བྱོས། མི་ཞིག་གིས་ཁྱེད་ལ་འཕྲིན་ཐུང་གཏོང་སྐབས་སམ། ཁྱེད་ཀྱི་ཁ་བརྡ་ལ་ལན་འདེབས་གནང་སྐབས་བརྡ་ཁྱབ་གཏོང་ངེས།", + "title": "གླེང་མོལ་བརྡ་ཁྱབ་ལ་འབྲེལ་མཐུད་རྒྱུན་འཁྱོངས་བྱོས།", + "enable": "ནུས་ཡོད་བཟོ་བ།" + }, + "title": "འཕྲིན་ཐུང་གསར་པ་འབྱོར་སོང་།", + "blocked_message": "བརྡ་ཁྱབ་བཀག་འདུག ཆོག་མཆན་ཁག་བསྐྱར་སྒྲིག་བྱེད་རོགས།" + }, + "emoji": { + "categories": { + "nature": "རང་བྱུང་།", + "places": "ས་ཆ།", + "activity": "བྱེད་སྒོ།", + "flags": "དར་ཆ་ཁག", + "foods": "ཞལ་ཟས།", + "objects": "བྱ་དངོས།", + "peoples": "མི་མང་།", + "symbols": "མཚོན་རྟགས།", + "frequently": "རྒྱུན་དུ་སྤྱོད་བཞིན་པ།" + }, + "search": "འཚོལ..." + }, + "getlink": { + "title": "ཐད་ཀར་འབྲེལ་ཐག་ཐོབ་པར་བྱོས།", + "info": "ཐད་ཀར་ཁ་བརྡ་བྱེད་སྤྱད་ཀྱི་འབྲེལ་ཐག་གིས་ཁྱེད་དང་མི་གཞན་གྱི་བར་ལ་བདེ་འཇགས་ཀྱི་འཕྲིན་གཏོང་སྐུད་ལམ་ཞིག་མཁོ་སྤྲོད་བྱེད། འགོ་འཛུགས་བྱེད་པར། མི་ཚོས་ཁྱེད་ལ་ཁ་བརྡ་བྱེད་པར་སླེབས་དུས། འཆར་མིང་ཞིག་འདེམས་ཏེ་སྟོན།", + "share_qr": "བཤེར་རིས་བརྒྱུད་སྐུར་བྱོས།", + "next": "རྗེས་མ།", + "scan_title": "བཤེར་རིས་འདི་བཤེར་ཏེ་ཐད་ཀར་ཁ་བརྡ་ཞིག་འགོ་རྩོམ།", + "continue": "མུ་མཐུད།", + "ready_to_share": "བརྒྱུད་སྐུར་བྱེད་པར་གྲ་སྒྲིག་ཡིན། མི་ཞིག་གིས་འབྲེལ་ཐག་དེ་ཁ་འབྱེད་ཐེངས་རེར། ཐད་ཀར་གླེང་མོལ་བྱ་སའི་ཁ་བརྡ་ཁང་ཞིག་ཁ་འབྱེད་ངེས།", + "qr_image_copied": "འབྲེག་པང་གི་སྟེང་དུ་པར་རིས་འདྲ་བཤུས་བྱས་ཚར།", + "hello": "ཁམས་བཟང་། {user},\nའདི་ཐད་ཀར་ཁ་བརྡ་བྱེད་སའི་ཁྱེད་ཀྱི་འབྲེལ་ཐག་ཡིན།", + "username": "འཆར་མིང་ཞིག་གཏགས། (དཔེར་ན།: waku)", + "different_link": "འབྲེལ་ཐག་གཞན་པ་ཞིག་རག་པར་བྱོས།" } } From b20e1a616804e4525539df28baf48c29e2dd16c6 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Wed, 1 Nov 2023 12:05:14 +0000 Subject: [PATCH 12/68] Translated using Weblate (Tibetan) Currently translated at 100.0% (347 of 347 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/bo/ --- src/assets/translations/bo.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/bo.json b/src/assets/translations/bo.json index 835f6ac..963a18a 100644 --- a/src/assets/translations/bo.json +++ b/src/assets/translations/bo.json @@ -163,7 +163,7 @@ "room_list_rooms": "ཁ་བརྡ་ཁང་།", "room_list_invites": "གདན་ཞུ་ཁག", "purge_failed": "ཁ་བརྡ་ཁང་བཤིག་ཐུབ་མ་སོང་།", - "purge_removing_members": "ཚོགས་མི་ཁག་ཕྱིར་འདོན། ({total}་ཀྱི་({count})", + "purge_removing_members": "ཚོགས་མི་ཁག་ཕྱིར་འདོན། {total})་ཀྱི་({members}", "purge_redacting_events": "ཁ་བརྡ་གཙང་གསུབ། {total})་ཀྱི་({count}", "purge_set_room_state": "ཁ་བརྡ་ཁང་གི་རྣམ་པ་སྒྲིག་འགོད།", "room_list_new_messages": "{count} ཆ་འཕྲིན་གསར་པ།", @@ -216,7 +216,7 @@ "incoming_message_deleted_text": "ཆ་འཕྲིན་འདི་བསུབས་ཟིན།", "reply_poll": "བསམ་ཚུལ་བསྡུ་ལེན།", "not_allowed_to_send": "དོ་དམ་པ་དང་གཙོ་སྐྱོང་བ་ཁོ་ནས་མ་གཏོགས་ཁ་བརྡ་ཁང་དུ་གཏོང་མི་ཆོག", - "user_was_kicked_by_you": "ཁྱེད་ཀྱིས་{user}་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", + "user_was_kicked_by_you": "ཁྱེད་ཀྱིས་{སྤྱོད་མཁན}་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", "user_was_kicked": "{སྤྱོད་མཁན} ་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་ཟིན།", "user_was_kicked_you": "ཁྱེད་རང་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", "user_was_banned": "{user}་འདི་ཁ་བརྡའི་ཁོངས་ནས་བཀག་སྡོམ་བྱས་ཏེ་སྒོར་ཕུད་ཟིན།", From cd825db2e4687a2f0e89a52d1c4b920cddc05860 Mon Sep 17 00:00:00 2001 From: Lhasa heaven on earth Date: Thu, 2 Nov 2023 20:30:08 +0000 Subject: [PATCH 13/68] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (347 of 347 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/zh_Hans/ --- src/assets/translations/zh_Hans.json | 93 +++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 7 deletions(-) diff --git a/src/assets/translations/zh_Hans.json b/src/assets/translations/zh_Hans.json index d0592f0..30da12a 100644 --- a/src/assets/translations/zh_Hans.json +++ b/src/assets/translations/zh_Hans.json @@ -34,7 +34,16 @@ "read_only_room_info": "只允许管理员和版主发送到聊天室", "export_room": "导出聊天", "user_moderator": "版主", - "experimental_features": "实验功能" + "experimental_features": "实验功能", + "direct_link": "我的直接链接", + "make_public_warning": "警告:新参与者将可见完整的信息历史记录", + "room_type": "聊天室种类", + "file_mode_info": "将聊天界面切换到“文件投送”模式", + "room_type_default": "默认", + "file_mode": "文件模式", + "direct_link_desc": "已准备好分享了! 每次有人打开链接时,会打开一个新的直接聊天室。", + "copy_link": "复制链接", + "make_public": "公开" }, "leave": { "leave": "离开", @@ -63,7 +72,10 @@ "email_not_valid": "电子邮件地址无效", "terms": "主服务器要求您查看并接受以下政策:", "accept_terms": "接受", - "email": "您需要验证您的电子邮件地址" + "email": "您需要验证您的电子邮件地址", + "registration_token": "请输入注册令牌", + "token_not_valid": "令牌无效", + "send_token": "发送令牌" }, "device_list": { "title": "设备", @@ -137,7 +149,17 @@ "outgoing_message_deleted_text": "你删除了这条信息。", "incoming_message_deleted_text": "这条信息已删除。", "not_allowed_to_send": "只允许管理员和版主发送到聊天室", - "reaction_count_more": "{reactionCount} 更多" + "reaction_count_more": "{reactionCount} 更多", + "images": "图片", + "send_attachements_dialog_title": "您想发送以下附件吗?", + "preparing_to_upload": "准备上传...", + "seen_by": "查看者", + "seen_by_count": "没有被群成员看到 |已被 1 位成员查看 | 已被 {count} 位成员查看", + "files": "文件", + "download_all": "全部下载", + "file": "文件", + "upload_file_too_large": "文件太大, 无法上传!", + "upload_exceeded_file_limit": "超出 ({configFormattedUploadSize}) 的最大文件大小。 " }, "menu": { "login": "登录", @@ -211,7 +233,8 @@ "title_user": "欢迎您被邀请聊天", "join_user": "开始聊天", "enter_room_user": "开始聊天", - "choose_name": "选择要使用的名称" + "choose_name": "选择要使用的名称", + "you_have_been_banned": "您已被禁止进入该聊天室。" }, "profile": { "display_name": "显示名称", @@ -261,7 +284,10 @@ "join_public": "任何人都可以加入通过打开此链接: {link}。", "room_history_joined": "只有加入后,人们才可以看到发送的信息。", "room_history_is": "聊天室纪录是{type}.", - "encrypted": "信息是端到端加密的。" + "encrypted": "信息是端到端加密的。", + "no_past_messages": "欢迎! 为了您的安全,过去的信息不提供。", + "direct_info": "你好,{you}.正在与 {user} 进行私人聊天。", + "direct_private_chat": "私信" }, "profile_info_popup": { "new_room": "新的聊天室", @@ -288,9 +314,13 @@ "add_reaction": "添加反应", "click_to_remove": "点击删除", "time": { - "recently": "刚才" + "recently": "刚才", + "hours": "1小时前| {n}小时前", + "minutes": "1 分钟前 | {n} 分钟前", + "days": "1天前| {n}天前" }, - "close": "关闭" + "close": "关闭", + "notify": "通知" }, "logout": { "confirm_text": "您确定要注销吗?" @@ -328,5 +358,54 @@ "fetched_n_of_total_events": "已获取 {count} 个事件,共 {total} 个事件", "processed_n_of_total_events": "已处理 {count} 个事件的媒体,共 {total} 个事件", "export_filename": "导出的聊天 {date}" + }, + "file_mode": { + "add_a_message": "添加留言", + "send_more_files": "发送更多文件", + "choose_files": "地方", + "secure_file_send": "安全文件发送", + "sending": "发送中", + "files": "文件", + "sending_progress": "正在发送...", + "any_file_format_accepted": "接受任何文件格式", + "files_sent_with_note": "发送 1 个文件并附有备注! | 已发送 {count} 个文件并附有备注!", + "close": "关闭", + "files_sent": "已发送 1 个文件! | 已发送 {count} 个文件!" + }, + "notification": { + "dialog": { + "body": "再也不要错过任何信息或重要对话! 每当有人向您发送信息或回复您的聊天时,您会收到通知。", + "title": "通过聊天通知保持联系!", + "enable": "启用" + }, + "title": "收到新信息", + "blocked_message": "通知被屏蔽。 请重置权限" + }, + "emoji": { + "categories": { + "nature": "自然", + "places": "地方", + "activity": "活动", + "flags": "旗帜", + "foods": "食品", + "objects": "物体", + "peoples": "人民", + "symbols": "符号", + "frequently": "常用的" + }, + "search": "搜索..." + }, + "getlink": { + "title": "获取直接链接", + "info": "直接链接为人们与您提供安全的沟通渠道。首先,选择当人们与您聊天时显示的屏幕名称。", + "share_qr": "扫描二维码", + "next": "下一步", + "scan_title": "扫描此二维码即可直接聊天", + "continue": "继续", + "ready_to_share": "已准备好分享了! 每次有人打开链接时,会打开一个新的直接聊天室。", + "qr_image_copied": "图片已复制到剪贴板", + "hello": "你好{user},\n这是您的直接链接", + "username": "输入屏幕名称(例如:waku)", + "different_link": "获取其它链接" } } From 0be1203c352a043138d858459e99b4839d79763e Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 8 Nov 2023 21:25:00 +0000 Subject: [PATCH 14/68] Translated using Weblate (Spanish) Currently translated at 100.0% (347 of 347 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/es/ --- src/assets/translations/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/es.json b/src/assets/translations/es.json index 8dfc88f..2163938 100644 --- a/src/assets/translations/es.json +++ b/src/assets/translations/es.json @@ -148,7 +148,8 @@ "create": "Crear", "room_topic": "Añade una descripción si quieres", "options": "Opciones", - "room_name_limit_error_msg": "50 caracteres como máximo" + "room_name_limit_error_msg": "50 caracteres como máximo", + "colon_not_allowed": "Colon no está permitido" }, "room_welcome": { "join_public": "Cualquiera puede unirse abriendo este vínculo: {link}.", From 2d5e4190b6cc02ce8896f8192e72b6bc27094c80 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Thu, 9 Nov 2023 12:11:42 +0000 Subject: [PATCH 15/68] Translated using Weblate (Spanish) Currently translated at 100.0% (349 of 349 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/es/ --- src/assets/translations/es.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/es.json b/src/assets/translations/es.json index 2163938..3a32441 100644 --- a/src/assets/translations/es.json +++ b/src/assets/translations/es.json @@ -240,7 +240,9 @@ "user_was_kicked_by_you": "Has expulsado a {user} del chat.", "upload_file_too_large": "¡El archivo es demasiado grande para subirlo!", "time_ago": "Hoy | Ayer | Hace {count} días", - "upload_exceeded_file_limit": "Se ha superado el tamaño máximo para el archivo ({configFormattedUploadSize}). " + "upload_exceeded_file_limit": "Se ha superado el tamaño máximo para el archivo ({configFormattedUploadSize}). ", + "someone": "Alguien", + "sent_media": "Enviados {count} elementos multimedia." }, "menu": { "login": "Iniciar sesión", From 715326ff8194fd8476bdf62dede147b955017706 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Thu, 9 Nov 2023 08:56:44 +0000 Subject: [PATCH 16/68] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (349 of 349 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/pt_BR/ --- src/assets/translations/pt_BR.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/pt_BR.json b/src/assets/translations/pt_BR.json index bc50eb7..5b437e7 100644 --- a/src/assets/translations/pt_BR.json +++ b/src/assets/translations/pt_BR.json @@ -119,7 +119,8 @@ "files": "Arquivos", "download_all": "Baixar tudo", "upload_exceeded_file_limit": "O tamanho máximo do arquivo ({configFormattedUploadSize}) foi excedido. ", - "preparing_to_upload": "Preparando para enviar..." + "preparing_to_upload": "Preparando para enviar...", + "someone": "Alguém" }, "room": { "members": "sem membros | 1 membro | {count} membros", From 826adb58f2786d29a098889f5663b6542bffc2b6 Mon Sep 17 00:00:00 2001 From: Wellington Terumi Uemura Date: Thu, 9 Nov 2023 08:58:04 +0000 Subject: [PATCH 17/68] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (349 of 349 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/pt_BR/ --- src/assets/translations/pt_BR.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/pt_BR.json b/src/assets/translations/pt_BR.json index 5b437e7..ad3fb1e 100644 --- a/src/assets/translations/pt_BR.json +++ b/src/assets/translations/pt_BR.json @@ -120,7 +120,8 @@ "download_all": "Baixar tudo", "upload_exceeded_file_limit": "O tamanho máximo do arquivo ({configFormattedUploadSize}) foi excedido. ", "preparing_to_upload": "Preparando para enviar...", - "someone": "Alguém" + "someone": "Alguém", + "sent_media": "Enviou {count} itens de mídia." }, "room": { "members": "sem membros | 1 membro | {count} membros", From 660a126c0e4e0a86e798e917b69bb870d649127a Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Sat, 13 Jan 2024 08:50:59 +0000 Subject: [PATCH 18/68] Translated using Weblate (German) Currently translated at 63.3% (221 of 349 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/de/ --- src/assets/translations/de.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/assets/translations/de.json b/src/assets/translations/de.json index 89523dd..36cdf8c 100644 --- a/src/assets/translations/de.json +++ b/src/assets/translations/de.json @@ -262,5 +262,9 @@ "processed_n_of_total_events": "Medien für {count} von {total} Ereignissen verarbeitet", "fetched_n_events": "{count} Ereignisse geladen", "export_filename": "Chat exportiert: {date}" + }, + "global": { + "save": "Speichern", + "show_more": "Mehr anzeigen" } } From 053c82f44bedf2ddbc11d6d086a9b3cb7cb67569 Mon Sep 17 00:00:00 2001 From: Ettore Atalan Date: Sat, 13 Jan 2024 08:51:35 +0000 Subject: [PATCH 19/68] Translated using Weblate (German) Currently translated at 63.3% (221 of 349 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/de/ --- src/assets/translations/de.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/de.json b/src/assets/translations/de.json index 36cdf8c..79bcc65 100644 --- a/src/assets/translations/de.json +++ b/src/assets/translations/de.json @@ -265,6 +265,9 @@ }, "global": { "save": "Speichern", - "show_more": "Mehr anzeigen" + "show_more": "Mehr anzeigen", + "password_didnot_match": "Passwort stimmt nicht überein", + "add_reaction": "Reaktion hinzufügen", + "show_less": "Weniger anzeigen" } } From e67eccb4a891061fb50744163579d75bc8bee663 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sun, 14 Jan 2024 14:09:58 +0000 Subject: [PATCH 20/68] Translated using Weblate (Spanish) Currently translated at 100.0% (352 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/es/ --- src/assets/translations/es.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/assets/translations/es.json b/src/assets/translations/es.json index 3a32441..cb49075 100644 --- a/src/assets/translations/es.json +++ b/src/assets/translations/es.json @@ -45,7 +45,7 @@ "info": "Todos los miembros y mensajes serán eliminados. Esta acción no se puede deshacer.", "title": "¿Borrar la sala?", "n_seconds": "{seconds} segundos", - "self_destruct": "La habitación se autodestruirá en segundos.", + "self_destruct": "Tu sala se autodestruirá en segundos.", "deleting": "Borrando la sala:", "notified": "Hemos avisado a los miembros.", "room_deletion_notice": "¡Es hora de decir adiós! Esta sala ha sido eliminada por {user}. Se autodestruirá en segundos." @@ -98,7 +98,8 @@ "language_description": "Convine esta disponible en varios Idiomas.", "dont_see_yours": "¿No ves el tuyo?", "tell_us": "Dinos.", - "display_name_required": "El nombre para mostrar es obligatorio" + "display_name_required": "El nombre para mostrar es obligatorio", + "notification_label": "Notificación" }, "login": { "login": "Iniciar sesión", @@ -266,7 +267,8 @@ "user_kick_and_ban": "Expulsar y banear a este usuario", "user_make_moderator": "Hacer moderador", "user_make_admin": "Hacer administrador", - "user_revoke_moderator": "Revocar al moderador" + "user_revoke_moderator": "Revocar al moderador", + "delete_now": "Elimina ahora" }, "fallbacks": { "download_name": "Descargar", @@ -398,7 +400,8 @@ "title": "¡Manténgase conectado con las notificaciones para el chat!" }, "title": "Nuevo mensaje recibido", - "blocked_message": "Notificaciones bloqueadas. Por favor, restablezca los permisos" + "blocked_message": "La notificación está bloqueada. Vaya a la configuración de su dispositivo o navegador para habilitar la Notificación", + "not_supported": "La notificación aún no es compatible con dispositivos móviles" }, "export": { "fetched_n_of_total_events": "{count} de {total} eventos recuperados", From c80295816e328dff54ce46d3a6276eab1e2ec943 Mon Sep 17 00:00:00 2001 From: Wellington Terumi Uemura Date: Sun, 14 Jan 2024 13:12:49 +0000 Subject: [PATCH 21/68] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (352 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/pt_BR/ --- src/assets/translations/pt_BR.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/assets/translations/pt_BR.json b/src/assets/translations/pt_BR.json index ad3fb1e..564d8c1 100644 --- a/src/assets/translations/pt_BR.json +++ b/src/assets/translations/pt_BR.json @@ -56,7 +56,8 @@ "user_make_moderator": "Tornar moderador", "user_kick_and_ban": "Expulsar e banir este usuário", "user_make_admin": "Tornar administrador", - "user_revoke_moderator": "Revogar moderador" + "user_revoke_moderator": "Revogar moderador", + "delete_now": "Excluir agora" }, "message": { "you": "Você", @@ -217,7 +218,8 @@ "password_new": "Nova senha", "password_repeat": "Repita a nova senha", "display_name": "Nome de exibição", - "display_name_required": "O nome de exibição é obrigatório" + "display_name_required": "O nome de exibição é obrigatório", + "notification_label": "Notificação" }, "profile_info_popup": { "you_are": "Você é", @@ -263,7 +265,7 @@ "info": "Todos os membros e as mensagens serão excluídos. Essa ação não pode ser desfeita.", "button": "Excluir", "n_seconds": "{seconds} segundos", - "self_destruct": "A sala se autodestruirá em segundos.", + "self_destruct": "A sua sala se autodestruirá em segundos.", "deleting": "Excluindo a sala:", "notified": "Nós notificamos os membros.", "room_deletion_notice": "Hora de dizer adeus! Esta sala foi excluída pelo {user}. Ela se autodestruirá em segundos." @@ -395,7 +397,8 @@ "title": "Manter-se conectado com as notificações do chat!", "enable": "Ativar" }, - "blocked_message": "Notificações bloqueadas. Redefina as permissões" + "blocked_message": "A notificação está bloqueada. Vá para as configurações do dispositivo ou do navegador para ativar a notificação", + "not_supported": "A notificação ainda não é suportada no mobile" }, "getlink": { "title": "Obter um link direto", From 4b087d6e13475aca396e599502af516c64b72908 Mon Sep 17 00:00:00 2001 From: 10G Meow <10gmeow@gmail.com> Date: Mon, 15 Jan 2024 17:38:37 +0200 Subject: [PATCH 22/68] file path fix for: sw.js, /icons and manifest.json --- public/index.html | 18 +++++++++--------- src/plugins/notificationAndServiceWorker.js | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/index.html b/public/index.html index 89b189c..370dc29 100644 --- a/public/index.html +++ b/public/index.html @@ -7,15 +7,15 @@ <%= htmlWebpackPlugin.options.title %> - - - - - - - - - + + + + + + + + + diff --git a/src/components/RoomInfo.vue b/src/components/RoomInfo.vue index 0ce0939..abc4280 100644 --- a/src/components/RoomInfo.vue +++ b/src/components/RoomInfo.vue @@ -159,6 +159,14 @@ v-model="readOnlyRoom" > + +
+
{{ $t('room_info.message_retention') }}
+
{{ $t('room_info.message_retention_info') }}
+
+
{{ messageRetention }}
+ edit +
@@ -261,6 +269,12 @@ @close="showPurgeConfirmation = false" /> + +
@@ -268,6 +282,7 @@ + + \ No newline at end of file diff --git a/src/components/RoomInfo.vue b/src/components/RoomInfo.vue index c7b3beb..236b753 100644 --- a/src/components/RoomInfo.vue +++ b/src/components/RoomInfo.vue @@ -189,6 +189,14 @@ v-model="readOnlyRoom" > + +
+
{{ $t('room_info.message_retention') }}
+
{{ $t('room_info.message_retention_info') }}
+
+
{{ messageRetention }}
+ edit +
@@ -196,69 +204,48 @@ >{{ $t("room_info.members") }}
{{ members.length }}
- - - -
- - - {{ - member.name.substring(0, 1).toUpperCase() - }} - - - {{ - member.userId == $matrix.currentUserId - ? $t("room_info.user_you", { - user: member.user ? member.user.displayName : member.name, - }) - : $t("room_info.user", { - user: member.user ? member.user.displayName : member.name, - }) - }} - - - {{ $t("room_info.user_admin") }} - - - {{ $t("room_info.user_moderator") }} - -
-
- - - {{ $t("menu.actions") }} - {{$t('device_list.title')}} - - -
- {{ $t("menu.start_private_chat") }} -
-
{{ String.fromCharCode(160) }}
- {{ $t("menu.user_kick") }} - {{ $t("menu.user_kick_and_ban") }} -
-
{{ String.fromCharCode(160) }}
- {{ $t("menu.user_make_admin") }} - {{ $t("menu.user_make_moderator") }} - {{ $t("menu.user_revoke_moderator") }} -
-
- - - - -
-
-
-
+ + + + +
{{ showAllMembers ? $t("room_info.hide_all") : $t("room_info.show_all") }}
@@ -279,6 +266,13 @@ {{ $t("room_info.version_info", { version: buildVersion }) }}
+ + rp.value===retention) this.messageRetention = retentionPeriodsFound.text + }, + onListItemClick(member) { + this.activeMember = member + this.showMemberActionConfirmation = true }, onEvent(event) { if (this.room && this.room.roomId == event.getRoomId()) { @@ -490,19 +490,6 @@ export default { } }, - memberAvatar(member) { - if (member) { - return member.getAvatarUrl( - this.$matrix.matrixClient.getHomeserverUrl(), - 40, - 40, - "scale", - true - ); - } - return null; - }, - viewProfile() { this.$navigation.push({ name: "Profile" }, 1); }, @@ -551,49 +538,11 @@ export default { this.updatingJoinRule = false; }); }, - startPrivateChat(userId) { - this.$matrix - .getOrCreatePrivateChat(userId) - .then((room) => { - this.$nextTick(() => { - this.$navigation.push( - { - name: "Chat", - params: { - roomId: util.sanitizeRoomId( - room.getCanonicalAlias() || room.roomId - ), - }, - }, - -1 - ); - }); - }) - .catch((err) => { - console.error(err); - }); - }, exportRoom() { if (this.room) { this.exporting = true; } }, - canKickUser(member) { - if (this.room) { - const myUserId = this.$matrix.currentUserId; - const me = this.room.getMember(myUserId); - return me && me.powerLevel > member.powerLevel && this.room.currentState && this.room.currentState.hasSufficientPowerLevelFor("kick", me.powerLevel); - } - return false; - }, - canBanUser(member) { - if (this.room) { - const myUserId = this.$matrix.currentUserId; - const me = this.room.getMember(myUserId); - return me && me.powerLevelNorm > member.powerLevelNorm && this.room.currentState && this.room.currentState.hasSufficientPowerLevelFor("ban", me.powerLevel); - } - return false; - }, /** * Return true if we can change power levels in the room, i.e. make read only room */ @@ -610,76 +559,6 @@ export default { } return false; }, - // TODO - following power level comparisons assume that default power levels are used in the room! - isAdmin(member) { - return member.powerLevelNorm > 50; - }, - isModerator(member) { - return member.powerLevelNorm > 0 && member.powerLevelNorm <= 50; - }, - /** - * Return true if WE can make the member an admin - * @param member - */ - canMakeAdmin(ignoredmember) { - if (this.room) { - const myUserId = this.$matrix.currentUserId; - const me = this.room.getMember(myUserId); - return me && this.isAdmin(me); - } - return false; - }, - - /** - * Return true if WE can make the member a moderator - * @param member - */ - canMakeModerator(ignoredmember) { - if (this.room) { - const myUserId = this.$matrix.currentUserId; - const me = this.room.getMember(myUserId); - return me && this.isAdmin(me); - } - return false; - }, - /** - * Return true if WE can "unmake" the member a moderator - * @param member - */ - canRevokeModerator(member) { - if (this.room) { - const myUserId = this.$matrix.currentUserId; - const me = this.room.getMember(myUserId); - return me && this.isAdmin(me) && me.powerLevel > member.powerLevel; - } - return false; - }, - makeAdmin(member) { - if (this.room) { - this.$matrix.makeAdmin(this.room.roomId, member.userId) - } - }, - makeModerator(member) { - if (this.room) { - this.$matrix.makeModerator(this.room.roomId, member.userId) - } - }, - revokeModerator(member) { - if (this.room) { - this.$matrix.revokeModerator(this.room.roomId, member.userId) - } - }, - kickUser(member) { - if (this.room) { - this.$matrix.kickUser(this.room.roomId, member.userId) - } - }, - banUser(member) { - if (this.room) { - this.$matrix.banUser(this.room.roomId, member.userId) - } - }, - /** * Go back to previous page, or if none on the stack, go back to current room view. */ diff --git a/src/components/roomInfoMixin.js b/src/components/roomInfoMixin.js index 2a5c08c..5497406 100644 --- a/src/components/roomInfoMixin.js +++ b/src/components/roomInfoMixin.js @@ -159,6 +159,25 @@ export default { }, }, methods: { + memberAvatar(member) { + if (member) { + return member.getAvatarUrl( + this.$matrix.matrixClient.getHomeserverUrl(), + 40, + 40, + "scale", + true + ); + } + return null; + }, + // TODO - following power level comparisons assume that default power levels are used in the room! + isAdmin(member) { + return member.powerLevelNorm > 50; + }, + isModerator(member) { + return member.powerLevelNorm > 0 && member.powerLevelNorm <= 50; + }, /** * Get a string describing current room retention setting. * Can be "None", "1 week", "1 hour" etc... From 87a3fc287dd1ddaf77fe48fae7027b97ee173571 Mon Sep 17 00:00:00 2001 From: 10G Meow <10gmeow@gmail.com> Date: Sun, 3 Mar 2024 21:27:51 +0200 Subject: [PATCH 32/68] remove console --- src/components/MemberActionDialog.vue | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/MemberActionDialog.vue b/src/components/MemberActionDialog.vue index dbeffb3..7fde120 100644 --- a/src/components/MemberActionDialog.vue +++ b/src/components/MemberActionDialog.vue @@ -187,9 +187,6 @@ export default { }, banUser(member) { if (this.room) { - console.log(this.$matrix) - console.log(member.userId) - console.log(this.room.roomId) this.$matrix.banUser(this.room.roomId, member.userId) this.showDialog = false; } From c8f16f669ac6e3375c28ae2f02dccb072705e57e Mon Sep 17 00:00:00 2001 From: 10G Meow <10gmeow@gmail.com> Date: Mon, 4 Mar 2024 17:36:30 +0200 Subject: [PATCH 33/68] update icon --- src/assets/icons/kickout.vue | 8 ++++++++ src/assets/icons/make_admin.vue | 4 +++- src/assets/icons/make_moderator.vue | 5 ++--- src/assets/icons/{kick_out.vue => revoke.vue} | 0 src/components/MemberActionDialog.vue | 4 ++-- 5 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 src/assets/icons/kickout.vue rename src/assets/icons/{kick_out.vue => revoke.vue} (100%) diff --git a/src/assets/icons/kickout.vue b/src/assets/icons/kickout.vue new file mode 100644 index 0000000..e69e435 --- /dev/null +++ b/src/assets/icons/kickout.vue @@ -0,0 +1,8 @@ + diff --git a/src/assets/icons/make_admin.vue b/src/assets/icons/make_admin.vue index 9537742..d22467a 100644 --- a/src/assets/icons/make_admin.vue +++ b/src/assets/icons/make_admin.vue @@ -1,5 +1,7 @@ \ No newline at end of file diff --git a/src/assets/icons/make_moderator.vue b/src/assets/icons/make_moderator.vue index 0d7db64..7527061 100644 --- a/src/assets/icons/make_moderator.vue +++ b/src/assets/icons/make_moderator.vue @@ -1,6 +1,5 @@ diff --git a/src/assets/icons/kick_out.vue b/src/assets/icons/revoke.vue similarity index 100% rename from src/assets/icons/kick_out.vue rename to src/assets/icons/revoke.vue diff --git a/src/components/MemberActionDialog.vue b/src/components/MemberActionDialog.vue index 7fde120..a2f4f52 100644 --- a/src/components/MemberActionDialog.vue +++ b/src/components/MemberActionDialog.vue @@ -40,7 +40,7 @@
- $vuetify.icons.kick_out {{ $t("menu.user_kick_and_ban") }} + $vuetify.icons.kickout {{ $t("menu.user_kick_and_ban") }}
@@ -50,7 +50,7 @@ $vuetify.icons.make_moderator {{ $t("menu.user_make_moderator") }} - $vuetify.icons.kick_out {{ $t("menu.user_revoke_moderator") }} + $vuetify.icons.revoke {{ $t("menu.user_revoke_moderator") }}
From 69b2f974642309883e6cc48b0a66d5fce648c244 Mon Sep 17 00:00:00 2001 From: 10G Meow <10gmeow@gmail.com> Date: Mon, 18 Mar 2024 12:50:18 +0200 Subject: [PATCH 34/68] Members dialog: show other room a person is with you --- src/assets/translations/en.json | 4 +++- src/components/MemberActionDialog.vue | 30 +++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/assets/translations/en.json b/src/assets/translations/en.json index 2423754..84c2c60 100644 --- a/src/assets/translations/en.json +++ b/src/assets/translations/en.json @@ -324,7 +324,9 @@ "make_public": "Make Public", "make_public_warning": "warning: Full message history will be visible to new participants", "direct_link": "My Direct Link", - "direct_link_desc": "It's ready to share! A new direct room will open each time someone opens the link." + "direct_link_desc": "It's ready to share! A new direct room will open each time someone opens the link.", + "shared_room_number": "You share {count} rooms with {name}", + "shared_room_number_more": "You share more than {count} rooms with {name}" }, "room_info_sheet": { "this_room": "This room", diff --git a/src/components/MemberActionDialog.vue b/src/components/MemberActionDialog.vue index a2f4f52..fb02f08 100644 --- a/src/components/MemberActionDialog.vue +++ b/src/components/MemberActionDialog.vue @@ -18,10 +18,10 @@ {{ activeMember.userId == $matrix.currentUserId ? $t("room_info.user_you", { - user: activeMember.user ? activeMember.user.displayName : activeMember.name, + user: activeMemberName(activeMember) }) : $t("room_info.user", { - user: activeMember.user ? activeMember.user.displayName : activeMember.name, + user: activeMemberName(activeMember) }) }} @@ -32,6 +32,11 @@ {{ $t("room_info.user_moderator") }} +
@@ -83,6 +88,24 @@ export default { showDialog: false }; }, + computed: { + joinedMembersByRoomId() { + const joinedRooms = this.$matrix.joinedRooms.filter(room => !this.$matrix.isDirectRoom(room)) || []; + return joinedRooms.map(room => ({ + roomId: room.roomId, + roomName: room.name, + memberIds: room.getJoinedMembers().map(({ userId }) => userId) + })); + }, + sharedRooms() { + return this.joinedMembersByRoomId.reduce((sharedRooms, room) => { + if (room.roomId !== this.room.roomId && room.memberIds.includes(this.activeMember.userId)) { + sharedRooms.push(room.roomName); + } + return sharedRooms; + }, []); + } + }, watch: { show: { handler(newVal, ignoredOldVal) { @@ -97,6 +120,9 @@ export default { }, methods: { + activeMemberName(activeMember) { + return activeMember.user ? activeMember.user.displayName : activeMember.name + }, startPrivateChat(userId) { this.$matrix .getOrCreatePrivateChat(userId) From 009dc20915f7771b14254fc3b2e948f5dee94c32 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Mon, 18 Mar 2024 19:01:51 +0000 Subject: [PATCH 35/68] Translated using Weblate (Chinese (Simplified)) Currently translated at 98.5% (347 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/zh_Hans/ --- src/assets/translations/zh_Hans.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/zh_Hans.json b/src/assets/translations/zh_Hans.json index 048d919..cbea3a8 100644 --- a/src/assets/translations/zh_Hans.json +++ b/src/assets/translations/zh_Hans.json @@ -159,7 +159,8 @@ "download_all": "全部下载", "file": "文件", "upload_file_too_large": "文件太大, 无法上传!", - "upload_exceeded_file_limit": "超出 ({configFormattedUploadSize}) 的最大文件大小。 " + "upload_exceeded_file_limit": "超出 ({configFormattedUploadSize}) 的最大文件大小。 ", + "someone": "某人" }, "menu": { "login": "登录", @@ -249,7 +250,8 @@ "language_description": "Convene 提供多种语言.", "dont_see_yours": "看不到你的?", "tell_us": "告诉我们。", - "display_name_required": "显示名称是必需的" + "display_name_required": "显示名称是必需的", + "notification_label": "通知" }, "new_room": { "status_avatar": "正在上传头像:{count}", From 6bfaef21e82a4a697920758f09891165b4c92360 Mon Sep 17 00:00:00 2001 From: emma peel Date: Mon, 18 Mar 2024 17:32:49 +0000 Subject: [PATCH 36/68] Translated using Weblate (Tibetan) Currently translated at 98.0% (345 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/bo/ --- src/assets/translations/bo.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/bo.json b/src/assets/translations/bo.json index 356bd16..2453ebc 100644 --- a/src/assets/translations/bo.json +++ b/src/assets/translations/bo.json @@ -214,8 +214,8 @@ "incoming_message_deleted_text": "ཆ་འཕྲིན་འདི་བསུབས་ཟིན།", "reply_poll": "བསམ་ཚུལ་བསྡུ་ལེན།", "not_allowed_to_send": "དོ་དམ་པ་དང་གཙོ་སྐྱོང་བ་ཁོ་ནས་མ་གཏོགས་ཁ་བརྡ་ཁང་དུ་གཏོང་མི་ཆོག", - "user_was_kicked_by_you": "ཁྱེད་ཀྱིས་{སྤྱོད་མཁན}་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", - "user_was_kicked": "{སྤྱོད་མཁན} ་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་ཟིན།", + "user_was_kicked_by_you": "ཁྱེད་ཀྱིས་{user}་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", + "user_was_kicked": "{user} ་འདི་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་ཟིན།", "user_was_kicked_you": "ཁྱེད་རང་ཁ་བརྡའི་ཁོངས་ནས་སྒོར་ཕུད་སོང་།", "user_was_banned": "{user}་འདི་ཁ་བརྡའི་ཁོངས་ནས་བཀག་སྡོམ་བྱས་ཏེ་སྒོར་ཕུད་ཟིན།", "user_was_banned_by_you": "ཁྱེད་ཀྱིས་{user} ་འདི་ཁ་བརྡའི་ཁོངས་ནས་བཀག་སྡོམ་བྱས་ཏེ་སྒོར་ཕུད་ཟིན།", From c731d31a8f21877f16b19a00d81891860ca0c3cd Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Mon, 18 Mar 2024 18:37:59 +0000 Subject: [PATCH 37/68] Translated using Weblate (Uyghur) Currently translated at 49.4% (174 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/ug/ --- src/assets/translations/ug.json | 61 +++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/assets/translations/ug.json b/src/assets/translations/ug.json index 4f34c95..fa2b695 100644 --- a/src/assets/translations/ug.json +++ b/src/assets/translations/ug.json @@ -18,7 +18,8 @@ "send": "يوللاش", "cancel": "ئەمەلدىن قالدۇرۇڭ", "reply": "جاۋاب", - "start_private_chat": "قوللانغۇچى بىلەن شەخسى ئۇچۇرلاشماق" + "start_private_chat": "قوللانغۇچى بىلەن شەخسى ئۇچۇرلاشماق", + "done": "تامام" }, "message": { "upload_progress_with_total": "{count} نىڭ {total} يۈكلەندى", @@ -40,7 +41,27 @@ "room_history_joined": "ئەزالار قاتناشقاندىن باشلاپ ئوقۇغىلى بولىدۇ", "room_history_invited": "ئەزالار تەكلىپ قىلىنغان ۋاقىتتىن باشلاپ ئوقۇغىلى بولىدۇ", "room_history_shared": "مۇنازىرەخانىدىكى ھەركىم ئوقۇيالايدۇ", - "room_history_world_readable": "ھەركىم ئوقۇيالايدۇ" + "room_history_world_readable": "ھەركىم ئوقۇيالايدۇ", + "user_powerlevel_change_from_to": "قوللانغۇچى بۇرۇنقى دەرىجىسىدىن يېڭى دەرىجىسىگە كۆتۈرىلدى", + "user_aliased_room": "مۇنازىرە ئۆيىنىڭ ئىسمى ئۆزگەرتىلدى", + "user_encrypted_room": "قوللانغۇچى مۇنازىرە-خانىنى سىفىرلاشتۇردى", + "reply_image": "رەسىم", + "user_changed_room_history": "قوللانغۇچى» مۇنازىرەخانىنىڭ تارىخىنى قۇردى»", + "user_joined": "قوللانغۇچى مۇنازىرىغا قاتناشتى", + "user_changed_guest_access_open": "قوللانغۇچى ئەزالارنىڭ مۇنازىرەخانىغا قوشۇلىشىغا رۇخسەت قىلدى", + "user_changed_avatar": "قوللانغۇچى كۆرىنىشىنى ئۆزگەرتتى", + "user_changed_room_avatar": "قوللانغۇچى مۇنازىرە-خانىدىكى كۆرىنىشىنى ئۆزگەرتتى", + "user_was_invited": "قوللانغۇچى مۇنازىرە ئۆيىگە تەكلىپ قىلىندى...", + "user_created_room": "يېڭى مۇنازىرە ئۆيى قۇرۇلدى", + "user_left": "قوللانغۇچى مۇنازىرىدىن چېكىندى", + "someone": "بىرەيلەن", + "user_changed_join_rules": "قوللانغۇچى مۇنازىرەخانىنى مەلۇم تىپقا ئۆزگەرتتى", + "user_changed_room_name": "قوللانغۇچى مۇنازىرەخانىنىڭ ئىسمىنى ئۆزگەرتتى", + "user_changed_room_topic": "قوللانغۇچى مۇنازىرەخانىنىڭ تېمىسىنى ئۆزگەرتتى", + "user_changed_guest_access_closed": "قوللانغۇچى ئەزالارنىڭ مۇنازىرەخانىغا قوشۇلۇشتىن رەت قىلىندى", + "reply_video": "سىن", + "file": "ھۆججەت", + "files": "ھۆججەت" }, "language_display_name": "ئۇيغۇرچە", "new_room": { @@ -61,7 +82,8 @@ "name_room": "مۇنازىرەخانىغا ئىسىم قويۇڭ", "next": "كېيىنكى", "create": "قۇرۇش", - "new_room": "يېڭى مۇنازىرەخانا" + "new_room": "يېڭى مۇنازىرەخانا", + "options": "تاللانمىلار" }, "room": { "purge_failed": "مۇنازىرەخانىنى يۇيۇش مەغلۇب بولدى!", @@ -143,7 +165,8 @@ "join_invite": "پەقەت كىشىلەر قوشۇلدى", "permissions": "ئىجازەتكە قوشۇلۇڭ", "created_by": "{ئىشلەتكۈچى قۇرغان", - "title": "ياتاق تەپسىلاتلىرى" + "title": "ياتاق تەپسىلاتلىرى", + "room_type_default": "كۆڭۈلدىكى" }, "goodbye": { "view_other_rooms": "باشقا ئۆيلەرنى كۆرۈڭ", @@ -187,7 +210,8 @@ "change_name": "ئىسىم ئۆزگەرتىش", "set_password": "پارول بەلگىلەڭ", "temporary_identity": "بۇ كىملىك ۋاقىتلىق. قايتا ئىشلىتىش ئۈچۈن پارول بەلگىلەڭ", - "title": "مېنىڭ ئارخىپىم" + "title": "مېنىڭ ئارخىپىم", + "notification_label": "ئۇقتۇرۇش" }, "login": { "login": "‎كىرىش", @@ -195,12 +219,37 @@ "username_required": "قوللانغۇچى ئىسمى تەلەپ قىلىنىدۇ", "password": "پارول كىرگۈزۈڭ", "username": "قوللانغۇچى ئىسمى (مەسىلەن: marta)", - "title": "كىرىش" + "title": "كىرىش", + "accept_terms": "قوشۇل" }, "device_list": { "not_verified": "دەلىللەنمىدى", "verified": "دەلىللەندى", "blocked": "چەكلەنگەن", "title": "ئۈسكۈنىلەر" + }, + "global": { + "save": "ساقلاش", + "close": "ياپماق" + }, + "emoji": { + "categories": { + "places": "ئورۇن تاللىغۇچ", + "activity": "مەشغۇلات", + "flags": "تاللانمىلار" + } + }, + "file_mode": { + "close": "يېپىش", + "files": "ھۆججەت" + }, + "getlink": { + "next": "كېيىنكى", + "continue": "Continue" + }, + "notification": { + "dialog": { + "enable": "قوزغات" + } } } From 7c841c9bb45531b1272b871075f55636fa6f6ef7 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Mon, 18 Mar 2024 19:01:46 +0000 Subject: [PATCH 38/68] Translated using Weblate (Sinhala) Currently translated at 19.0% (67 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/si/ --- src/assets/translations/si.json | 97 +++++++++++++++++++++++++++++++-- 1 file changed, 92 insertions(+), 5 deletions(-) diff --git a/src/assets/translations/si.json b/src/assets/translations/si.json index 2cfbdbf..9de8c57 100644 --- a/src/assets/translations/si.json +++ b/src/assets/translations/si.json @@ -10,19 +10,106 @@ "start_private_chat": "මෙම පරිශීලක සමඟ පුද්ගලික සංවාදය", "undo": "පෙරසේ", "new_room": "නව කාමරය", - "logout": "නික්මෙන්න", - "login": "පිවිසෙන්න", + "logout": "ඉවත් වන්න", + "login": "Login", "back": "ආපසු", "send": "යවන්න", - "cancel": "අවලංගු කරන්න" + "cancel": "අවලංගු කරන්න", + "delete": "මකන්න", + "done": "අහවරයි" }, "language_display_name": "ඉංග්‍රීසි", "message": { "download_progress": "{percentage}% බාගත වී ඇත", "file_prefix": "ගොනුව: ", - "you": "ඔබ" + "you": "ඔබ", + "reply_video": "දෘශ්‍යකය", + "reply_poll": "මතවිමසුම", + "file": "ගොනුව", + "files": "ගොනු" }, "room_info": { - "user": "{user}" + "user": "{user}", + "leave_room": "හැරයන්න", + "user_admin": "Administrator", + "user_moderator": "Moderator", + "room_type_default": "පෙරනිමිය", + "hide_all": "සඟවන්න", + "copy_link": "Copy link" + }, + "leave": { + "go_back": "Go back", + "leave": "හැරයන්න", + "title_invite": "ඔබට හැරයාමට වුවමනා ද?" + }, + "join": { + "join": "කාමරයට එක්වන්න", + "user_name_label": "පරිශීලක නාමය" + }, + "new_room": { + "new_room": "නව කාමරය", + "create": "සාදන්න", + "next": "ඊලග", + "options": "විකල්ප" + }, + "device_list": { + "blocked": "Blocked", + "not_verified": "අසත්‍යාපිත", + "verified": "සත්‍යාපිත" + }, + "profile": { + "select_language": "භාෂාව", + "password_new": "නව මුරපදය", + "display_name": "දර්ශන නාමය", + "change_password": "මුරපදය වෙනස් කරන්න" + }, + "global": { + "save": "සුරකින්න", + "notify": "දැනුම්දීම්" + }, + "poll_create": { + "create": "ප්‍රකාශයට පත්කරන්න", + "poll_submit": "Submit", + "answer_label_n": "පිළිතුර" + }, + "login": { + "login": "Login", + "title": "Login", + "accept_terms": "පිළිගන්න" + }, + "profile_info_popup": { + "edit_profile": "පැතිකඩ සංස්කරණය", + "logout": "ඉවත් වන්න" + }, + "invite": { + "done": "අහවරයි" + }, + "purge_room": { + "button": "මකන්න" + }, + "room": { + "leave": "හැරයන්න" + }, + "getlink": { + "next": "ඊලග", + "continue": "ඉදිරියට" + }, + "fallbacks": { + "download_name": "බාගන්න" + }, + "emoji": { + "categories": { + "flags": "කොඩි", + "activity": "ක්‍රියාකාරිත්වය" + } + }, + "file_mode": { + "close": "වසන්න", + "files": "ගොනු" + }, + "notification": { + "dialog": { + "enable": "සක්‍රිය කරන්න" + } } } From 1f47e88b14d3270be597a51782dbdeab9f64c501 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Mon, 18 Mar 2024 18:36:54 +0000 Subject: [PATCH 39/68] Translated using Weblate (Romanian) Currently translated at 62.5% (220 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/ro/ --- src/assets/translations/ro.json | 60 ++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/src/assets/translations/ro.json b/src/assets/translations/ro.json index ce0089a..b496fc7 100644 --- a/src/assets/translations/ro.json +++ b/src/assets/translations/ro.json @@ -56,7 +56,11 @@ "join_invite": "Numai persoane adăugate", "permissions": "Permisiuni de aderare", "created_by": "Creat de {user}", - "title": "Detalii despre cameră" + "title": "Detalii despre cameră", + "user_admin": "Administrator", + "copy_link": "Copiază link-ul", + "user_moderator": "Moderator", + "room_type_default": "Predefinit" }, "goodbye": { "view_other_rooms": "Vezi alte camere", @@ -125,7 +129,8 @@ "change_name": "Schimbă numele", "set_password": "Setați parola", "temporary_identity": "Această identitate este temporară. Setați o parolă pentru a o utiliza din nou", - "title": "Profilul meu" + "title": "Profilul meu", + "notification_label": "Notificare" }, "login": { "login": "Autentificare", @@ -136,7 +141,8 @@ "title": "Autentificare", "create_room": "Înregistrare și creare cameră", "or": "SAU", - "invalid_message": "Nume de utilizator sau parolă invalidă" + "invalid_message": "Nume de utilizator sau parolă invalidă", + "accept_terms": "Acceptă" }, "device_list": { "not_verified": "Nu a fost verificat", @@ -162,7 +168,8 @@ "name_room": "Nume cameră", "next": "Următorul", "create": "Creați", - "new_room": "Cameră nouă" + "new_room": "Cameră nouă", + "options": "Opțiuni" }, "room_welcome": { "got_it": "L-am prins", @@ -223,7 +230,12 @@ "you": "Tu", "reply_image": "Imagine", "reply_audio_message": "Mesaj audio", - "reply_video": "Videoclip" + "reply_video": "Videoclip", + "reply_poll": "Poll", + "files": "Fișiere", + "images": "Imagini", + "file": "Fişier", + "download_all": "Descărcați tot" }, "language_display_name": "Engleză", "fallbacks": { @@ -231,5 +243,43 @@ "original_text": "", "video_file": "Fișier video", "audio_file": "Fișier audio" + }, + "global": { + "save": "Salvează", + "notify": "Notifică", + "show_less": "Arată mai puține", + "show_more": "Arată mai multe", + "time": { + "recently": "chiar acum" + } + }, + "emoji": { + "categories": { + "symbols": "Simboluri", + "places": "Locuri", + "nature": "Natura", + "activity": "Activitate", + "flags": "Indicatoare", + "objects": "Obiecte" + } + }, + "poll_create": { + "answer_label_n": "Răspuns", + "create": "Publica", + "poll_submit": "Trimiteți" + }, + "getlink": { + "next": "Următor", + "continue": "Continue" + }, + "file_mode": { + "sending_progress": "Se trimite...", + "close": "Închideți", + "files": "Fișiere" + }, + "notification": { + "dialog": { + "enable": "Activează" + } } } From 856045ec434c18a15844ea4da656ce784260c193 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Mon, 18 Mar 2024 19:04:12 +0000 Subject: [PATCH 40/68] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 44.6% (157 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/nb_NO/ --- src/assets/translations/nb_NO.json | 96 ++++++++++++++++++++++++++---- 1 file changed, 83 insertions(+), 13 deletions(-) diff --git a/src/assets/translations/nb_NO.json b/src/assets/translations/nb_NO.json index 6f5ab6f..f14d977 100644 --- a/src/assets/translations/nb_NO.json +++ b/src/assets/translations/nb_NO.json @@ -27,7 +27,14 @@ "file_prefix": "Fil: ", "user_said": "{user} sa:", "user_created_room": "{user} opprettet rommet", - "you": "Deg" + "you": "Deg", + "reply_video": "Video", + "download_all": "Last ned alt", + "reply_image": "Bilde", + "reply_poll": "Avstemming", + "file": "Fil", + "files": "Filer", + "images": "Bilder" }, "device_list": { "title": "Enheter", @@ -38,7 +45,8 @@ "fallbacks": { "original_text": "", "video_file": "Videofil", - "audio_file": "Lydfil" + "audio_file": "Lydfil", + "download_name": "Last ned" }, "power_level": { "restricted": "begrenset", @@ -47,7 +55,8 @@ "admin": "administrator" }, "voice_recorder": { - "release_to_cancel": "Slipp for å avbryte" + "release_to_cancel": "Slipp for å avbryte", + "not_supported_title": "Ikke støttet" }, "room_info_sheet": { "this_room": "Denne gruppen", @@ -61,7 +70,12 @@ "copy_invite_link": "Kopier invitasjonslenke", "created_by": "Opprettet av {user}", "title": "Romdetaljer", - "user": "{user}" + "user": "{user}", + "leave_room": "Forlat", + "room_type_default": "Default", + "user_admin": "administrator", + "user_moderator": "Moderator", + "copy_link": "Kopier link" }, "goodbye": { "view_other_rooms": "Vis andre rom", @@ -71,7 +85,9 @@ "title": "Velkommen til {roomName}", "join": "Ta del i rom", "status_logging_in": "Logger inn …", - "status_joining": "Tar del i rom…" + "status_joining": "Tar del i rom…", + "user_name_label": "Brukernavn", + "remember_me": "Husk meg" }, "profile_info_popup": { "identity_temporary": "{displayName}", @@ -89,20 +105,28 @@ "set_password": "Sett passord", "title": "Min profil", "display_name": "Visningsnavn", - "password_repeat": "Gjenta nytt passord" + "password_repeat": "Gjenta nytt passord", + "notification_label": "Merknad" }, "login": { "password_required": "Passord kreves", "username_required": "Brukernavn kreves", - "password": "Passord", - "username": "Brukernavn" + "password": "Skriv inn passord", + "username": "Brukernavn", + "login": "Logg inn", + "title": "Logg inn", + "token_not_valid": "Ugyldig symbol", + "resend_verification": "Send e-post for bekreftelse på ny", + "invalid_message": "Ugyldig brukernavn eller passord", + "accept_terms": "Aksepter" }, "new_room": { "add_people": "Legg til folk", "link_copied": "Lenke kopiert.", "next": "Neste", "create": "Opprett", - "new_room": "Nytt rom" + "new_room": "Nytt rom", + "options": "Valg" }, "room_welcome": { "room_history_is": "Romhistorikken er {type}.", @@ -124,7 +148,9 @@ "leave": { "go_back": "Gå tilbake", "create_account": "opprett en konto", - "title_public": "Adjø, {user}" + "title_public": "Adjø, {user}", + "title_invite": "Er du sikker på at du vil forlate?", + "leave": "Forlat" }, "invite": { "status_inviting": "Inviterer venn {index} av {count}", @@ -140,13 +166,57 @@ "new_room": "Nytt rom", "login": "Logg inn", "send": "Send", - "ok": "OK", + "ok": "Ok", "cancel": "Avbryt", "download": "last ned", "delete": "Slett", "edit": "Rediger", "reply": "Svar", - "start_private_chat": "Privat sludring med denne brukeren" + "start_private_chat": "Privat sludring med denne brukeren", + "join": "Ta del", + "ignore": "Ignorer", + "done": "Ferdig" }, - "language_display_name": "Norsk" + "language_display_name": "Norsk", + "global": { + "save": "Lagre", + "time": { + "recently": "akkurat nå" + }, + "notify": "Send merknad", + "show_less": "Vis mindre", + "show_more": "Vis mer" + }, + "poll_create": { + "create": "Publiser", + "answer_label_n": "Svar", + "poll_submit": "Send inn" + }, + "file_mode": { + "sending_progress": "Sender…", + "sending": "Sender", + "close": "Lukk", + "files": "Filer" + }, + "emoji": { + "categories": { + "places": "Steder", + "activity": "Aktivitet", + "flags": "Flagg", + "frequently": "Ofte brukt", + "objects": "Objekter", + "nature": "Natur", + "symbols": "Symboler" + }, + "search": "Søk …" + }, + "notification": { + "dialog": { + "enable": "Skru på" + } + }, + "getlink": { + "next": "Neste", + "continue": "Fortsett" + } } From f5ffce61121b80fff16abeee5597e56b812e5428 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Mon, 18 Mar 2024 18:35:36 +0000 Subject: [PATCH 41/68] Translated using Weblate (German) Currently translated at 72.4% (255 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/de/ --- src/assets/translations/de.json | 63 +++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/src/assets/translations/de.json b/src/assets/translations/de.json index 79bcc65..6b53811 100644 --- a/src/assets/translations/de.json +++ b/src/assets/translations/de.json @@ -59,7 +59,14 @@ "reply_image": "Bild", "reply_audio_message": "Sprachnachricht", "reply_video": "Video", - "time_ago": "Heute | Gestern | Vor {count} Tagen" + "time_ago": "Heute | Gestern | Vor {count} Tagen", + "reply_poll": "Umfrage", + "seen_by": "Gesehen von", + "images": "Bilder", + "someone": "Jemand", + "file": "Datei", + "files": "Dateien", + "download_all": "Alle herunterladen" }, "room": { "leave": "Verlassen", @@ -101,7 +108,8 @@ "next": "Nächste", "name_room": "Raum benennen", "room_topic": "Füge eine Beschreibung hinzu, wenn du möchtest", - "room_name_limit_error_msg": "Maximal 50 Zeichen erlaubt" + "room_name_limit_error_msg": "Maximal 50 Zeichen erlaubt", + "options": "Optionen" }, "device_list": { "title": "GERÄTE", @@ -118,7 +126,10 @@ "login": "Anmelden", "create_room": "Registrieren und Raum erstellen", "or": "ODER", - "invalid_message": "Benutzername oder Passwort falsch" + "invalid_message": "Benutzername oder Passwort falsch", + "send_verification": "Sende Bestätigungs-E-Mail", + "resend_verification": "Bestätigungsmail erneut senden", + "accept_terms": "Akzeptiere." }, "profile": { "title": "Mein Profil", @@ -133,7 +144,8 @@ "display_name": "Anzeigename", "set_language": "Stelle deine Sprache ein", "language_description": "Convene ist in vielen Sprachen verfügbar.", - "tell_us": "Teile uns mit." + "tell_us": "Teile uns mit.", + "notification_label": "Benachrichtigung" }, "profile_info_popup": { "you_are": "Du bist", @@ -206,7 +218,11 @@ "leave_room": "Verlassen", "version_info": "Angetrieben von Guardian Project. Version: {version}", "scan_code": "Scannen, um den Raum zu betreten", - "export_room": "Chat exportieren" + "export_room": "Chat exportieren", + "user_moderator": "Moderator*innen", + "room_type_default": "Vorgabe", + "user_admin": "Administrator", + "copy_link": "Link kopieren" }, "room_info_sheet": { "this_room": "Dieser Raum", @@ -254,7 +270,9 @@ "poll_status_open": "Umfrage ist offen", "poll_status_disclosed": "Ergebnisse werden angezeigt, sobald die Umfrage geschlossen wurde.", "poll_status_open_not_voted": "Umfrage ist offen – stimme ab, um die Ergebnisse zu sehen", - "close_poll": "Umfrage schließen" + "close_poll": "Umfrage schließen", + "answer_label_n": "Antwort", + "view_results": "Ergebnisse ansehen" }, "export": { "fetched_n_of_total_events": "{count} von {total} Ereignissen geladen", @@ -268,6 +286,37 @@ "show_more": "Mehr anzeigen", "password_didnot_match": "Passwort stimmt nicht überein", "add_reaction": "Reaktion hinzufügen", - "show_less": "Weniger anzeigen" + "show_less": "Weniger anzeigen", + "time": { + "recently": "im Moment" + }, + "notify": "Benachrichtigung", + "close": "schlieen" + }, + "emoji": { + "categories": { + "nature": "Natur", + "activity": "Aktivität", + "flags": "Kennzeichnungen", + "objects": "Objekte", + "symbols": "Symbole", + "places": "Orte" + }, + "search": "Suche ..." + }, + "file_mode": { + "sending": "Sende", + "sending_progress": "Senden…", + "close": "Schließen", + "files": "Dateien" + }, + "notification": { + "dialog": { + "enable": "Aktiviere" + } + }, + "getlink": { + "next": "Nächster", + "continue": "Fortfahren" } } From 461c35bc373b4a1dd0e03e71b9a734c86a3d2a6e Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Mon, 18 Mar 2024 18:57:55 +0000 Subject: [PATCH 42/68] Translated using Weblate (French) Currently translated at 63.0% (222 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/fr/ --- src/assets/translations/fr.json | 81 ++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 7 deletions(-) diff --git a/src/assets/translations/fr.json b/src/assets/translations/fr.json index 0cd40a5..19cbbb0 100644 --- a/src/assets/translations/fr.json +++ b/src/assets/translations/fr.json @@ -15,7 +15,8 @@ "loading": "Chargement de {appName}", "reply": "Répondre", "download": "Télécharger", - "delete": "Supprimer" + "delete": "Supprimer", + "done": "Terminé" }, "language_display_name": "français", "message": { @@ -53,7 +54,16 @@ "room_joinrule_public": "public", "unread_messages": "Messages non lus", "users_are_typing": "{count} membres écrivent", - "room_powerlevel_change": "{user} a changé le statut de {changes}" + "room_powerlevel_change": "{user} a changé le statut de {changes}", + "reply_video": "Vidéo", + "reply_poll": "Sondage", + "reply_image": "Image", + "file": "Fichier", + "seen_by": "Vu par", + "download_all": "Télécharger tout", + "someone": "Quelqu'un", + "files": "Fichier", + "images": "Images" }, "room": { "members": "aucun membre | 1 membre | {count} membres", @@ -93,7 +103,8 @@ "get_link": "Obtenir le lien", "public_info": "Quiconque avec un lien", "join_permissions_info": "Ces autorisations déterminent comment les personnes peuvent rejoindre le salon et avec quelle facilité d’autres personnes peuvent être invitées. Elles peuvent être modifiées à tout moment.", - "status_creating": "Création du salon" + "status_creating": "Création du salon", + "options": "Options" }, "device_list": { "title": "APPAREILS", @@ -109,7 +120,12 @@ "password_required": "Le mot de passe est obligatoire", "create_room": "S’inscrire et créer un salon", "or": "OU", - "login": "Se connecter" + "login": "Se connecter", + "invalid_message": "Nom d'utilisateur ou mot de passe invalide", + "token_not_valid": "Token invalide", + "accept_terms": "Accept.", + "send_verification": "Envoyer un email de vérification", + "resend_verification": "Renvoyer le courriel de vérification" }, "profile": { "temporary_identity": "Cette identité est temporaire. Définissez un mot de passe pour l’utiliser à nouveau", @@ -121,7 +137,8 @@ "display_name": "Nom d’affichage", "title": "Mon profil", "set_password": "Définir un mot de passe", - "password_new": "Nouveau mot de passe" + "password_new": "Nouveau mot de passe", + "notification_label": "Notification" }, "profile_info_popup": { "you_are": "Vous êtes", @@ -140,7 +157,9 @@ "join": "Rejoindre le salon", "status_logging_in": "Connexion en cours…", "status_joining": "Adhésion au salon…", - "join_failed": "Impossible de rejoindre le salon." + "join_failed": "Impossible de rejoindre le salon.", + "enter_room": "Entrer dans le salon", + "remember_me": "Rester connecté·e" }, "invite": { "title": "Ajouter des amis", @@ -190,7 +209,11 @@ "scan_code": "Scanner pour rejoindre le salon", "user": "{user}", "title": "Détails du salon", - "members": "Membres" + "members": "Membres", + "room_type_default": "Défaut", + "user_admin": "Administrator", + "copy_link": "Copy link", + "user_moderator": "Modérateur⋅ice" }, "room_info_sheet": { "this_room": "Ce salon", @@ -215,5 +238,49 @@ "video_file": "Fichier vidéo", "download_name": "Téléchargement", "original_text": "" + }, + "global": { + "time": { + "recently": "à l’instant" + }, + "close": "fermer", + "notify": "Notifier", + "show_less": "Afficher moins", + "show_more": "Afficher plus", + "save": "Sauvegarder" + }, + "poll_create": { + "create_poll_menu_option": "Créer le sondage", + "create": "Publier", + "answer_label_n": "Réponse", + "view_results": "Voir les résultats", + "poll_submit": "Envoyer" + }, + "emoji": { + "categories": { + "objects": "Objets", + "symbols": "Symboles", + "places": "Places", + "activity": "Activité", + "flags": "Fanions", + "frequently": "Fréquemment utilisé", + "nature": "Nature" + }, + "search": "Recherche..." + }, + "notification": { + "dialog": { + "enable": "Activer" + } + }, + "getlink": { + "continue": "Continuer", + "next": "Suivant" + }, + "file_mode": { + "sending_progress": "Envoi...", + "sending": "Envoi", + "close": "Fermer", + "files": "Fichier" } } From efc3edf246b1be819a0882ea59eb4c3e708f3ff5 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Mon, 18 Mar 2024 18:39:30 +0000 Subject: [PATCH 43/68] Translated using Weblate (Italian) Currently translated at 62.2% (219 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/it/ --- src/assets/translations/it.json | 77 ++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/src/assets/translations/it.json b/src/assets/translations/it.json index 8338d23..1f37070 100644 --- a/src/assets/translations/it.json +++ b/src/assets/translations/it.json @@ -34,7 +34,16 @@ "room_history_world_readable": "leggibile da chiunque", "room_history_shared": "leggibile da tutti i membri nella stanza", "user_is_typing": "{user} sta scrivendo", - "users_are_typing": "{count} membri stanno scrivendo" + "users_are_typing": "{count} membri stanno scrivendo", + "reply_image": "Immagine", + "reply_poll": "Sondaggio", + "file": "File", + "files": "Files", + "images": "Immagini", + "seen_by": "Visto da", + "download_all": "Scarica tutto", + "someone": "Qualcuno", + "reply_video": "Video" }, "room": { "purge_removing_members": "Rimozione di membri", @@ -62,7 +71,8 @@ "cancel": "Annulla", "logout": "Esci", "new_room": "Nuova stanza", - "loading": "Caricamento di {appName}" + "loading": "Caricamento di {appName}", + "done": "Fatto" }, "room_welcome": { "info": "Benvenuto/a! Ecco alcune cose da sapere sulla tua stanza:", @@ -92,7 +102,8 @@ "new_room": "Nuova stanza", "invite_info": "Solo le persone aggiunte", "join_permissions_info": "Questi permessi determinano come le persone possono entrare nella stanza e quanto facilmente gli altri possono essere invitati. Possono essere cambiati in qualsiasi momento.", - "public_info": "Chiunque abbia un collegamento" + "public_info": "Chiunque abbia un collegamento", + "options": "Opzioni" }, "device_list": { "title": "DISPOSITIVI", @@ -108,7 +119,11 @@ "login": "Accedi", "create_room": "Registrati e crea una stanza", "or": "O", - "username_required": "Il nome utente è richiesto" + "username_required": "Il nome utente è richiesto", + "send_verification": "Invia email di verifica", + "invalid_message": "Nome utente o password non validi", + "accept_terms": "Accetto", + "resend_verification": "Rispedisci email di verifica" }, "profile": { "title": "Il mio profilo", @@ -120,7 +135,8 @@ "display_name": "Nome visualizzato", "change_name": "Cambia il nome", "change_password": "Cambia la password", - "password_new": "Nuova password" + "password_new": "Nuova password", + "notification_label": "Notifiche" }, "profile_info_popup": { "you_are": "Sei", @@ -139,7 +155,9 @@ "join": "Unisciti alla stanza", "status_logging_in": "Accesso in corso…", "status_joining": "Unendosi alla stanza…", - "join_failed": "Impossibile unirsi alla stanza." + "join_failed": "Impossibile unirsi alla stanza.", + "remember_me": "Ricordami", + "enter_room": "Unirsi alla stanza" }, "invite": { "title": "Aggiungi amici", @@ -189,7 +207,11 @@ "leave_room": "Lascia", "scan_code": "Scansiona per entrare nella stanza", "version_info": "Realizzato da Guardian Project. Versione: {version}", - "copy_invite_link": "Copia il collegamento di invito" + "copy_invite_link": "Copia il collegamento di invito", + "user_admin": "Amministratore", + "copy_link": "Copy link", + "user_moderator": "Moderatore/Moderatrice", + "room_type_default": "Predefinito" }, "voice_recorder": { "failed_to_record": "Impossibile registrare l’audio", @@ -218,5 +240,46 @@ }, "project": { "name": "Convene" + }, + "poll_create": { + "create": "Pubblicare", + "create_poll_menu_option": "Crea il sondaggio", + "answer_label_n": "Rispondi", + "poll_submit": "Invia" + }, + "global": { + "save": "Salva", + "time": { + "recently": "proprio ora" + }, + "notify": "Notifica", + "show_less": "Mostra meno", + "show_more": "Mostra altro" + }, + "emoji": { + "search": "Cerca...", + "categories": { + "flags": "Flag", + "symbols": "Simboli", + "places": "Luoghi", + "activity": "Attività", + "objects": "Oggetti", + "nature": "Natura" + } + }, + "notification": { + "dialog": { + "enable": "Abilita" + } + }, + "file_mode": { + "close": "Chiudi", + "sending_progress": "Invio in corso...", + "sending": "Invio", + "files": "Files" + }, + "getlink": { + "next": "Prossimo", + "continue": "Continua" } } From 54d0921cd604b7ec4d9590849a0240054dce303f Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Mon, 18 Mar 2024 18:59:50 +0000 Subject: [PATCH 44/68] Translated using Weblate (Finnish) Currently translated at 45.1% (159 of 352 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/fi/ --- src/assets/translations/fi.json | 79 +++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 9 deletions(-) diff --git a/src/assets/translations/fi.json b/src/assets/translations/fi.json index 9f67595..611df45 100644 --- a/src/assets/translations/fi.json +++ b/src/assets/translations/fi.json @@ -15,7 +15,8 @@ "new_room": "Uusi huone", "undo": "Kumoa", "join": "Liity", - "loading": "{appName} ladataan" + "loading": "{appName} ladataan", + "done": "Valmis" }, "new_room": { "create": "Luo", @@ -27,7 +28,8 @@ "room_topic": "Lisää kuvaus, jos haluat", "add_people": "Lisää ihmisiä", "link_copied": "Linkki kopioitu!", - "public_info": "Kuka tahansa, jolla on linkki" + "public_info": "Kuka tahansa, jolla on linkki", + "options": "Asetukset" }, "purge_room": { "n_seconds": "{seconds} sekuntia", @@ -60,7 +62,8 @@ "login": "Kirjaudu sisään", "password": "Anna salasana", "password_required": "Salasana vaaditaan", - "create_room": "Rekisteröidy ja luo huone" + "create_room": "Rekisteröidy ja luo huone", + "accept_terms": "Hyväksy" }, "join": { "title": "Tervetuloa huoneen {roomName}", @@ -69,7 +72,9 @@ "join": "Liity huoneeseen", "status_logging_in": "Kirjautuminen sisään…", "status_joining": "Liittyminen huoneeseen…", - "join_failed": "Huoneeseen liittyminen epäonnistui." + "join_failed": "Huoneeseen liittyminen epäonnistui.", + "remember_me": "Muista minut", + "enter_room": "Siirry huoneeseen" }, "leave": { "title_public": "Näkemiin, {user}", @@ -92,11 +97,20 @@ "user_joined": "{user} liittyi keskusteluun", "file_prefix": "Tiedosto: ", "edited": "(muokattu)", - "users_are_typing": "{count} jäsentä kirjoitavat" + "users_are_typing": "{count} jäsentä kirjoitavat", + "reply_image": "Kuva", + "reply_video": "Video", + "files": "Tiedostot", + "download_all": "Lataa kaikki", + "reply_poll": "Kysely", + "file": "Tiedosto", + "someone": "Joku", + "images": "Kuvat" }, "room": { "leave": "Poistu", - "room_list_rooms": "Huoneet" + "room_list_rooms": "Huoneet", + "room_list_invites": "Kutsut" }, "room_welcome": { "room_history_is": "Huoneen historia on {type}.", @@ -115,7 +129,8 @@ "set_password": "Aseta salasana", "select_language": "Kieli", "password_old": "Vanha salasana", - "display_name": "Näyttönimi" + "display_name": "Näyttönimi", + "notification_label": "Ilmoitus" }, "profile_info_popup": { "want_more": "Haluatko lisää?", @@ -144,10 +159,17 @@ "user": "{user}", "user_you": "{user} (sinä)", "hide_all": "Piilota", - "show_all": "Näytä kaikki >" + "show_all": "Näytä kaikki >", + "link_copied": "Linkki kopioitu!", + "room_type_default": "Oletusasetus", + "join_public": "Kuka tahansa, jolla on linkki", + "copy_link": "Kopioi linkki", + "user_admin": "Ylläpitäjä", + "user_moderator": "Moderaattori" }, "power_level": { - "restricted": "rajoitettu" + "restricted": "rajoitettu", + "default": "oletus" }, "room_info_sheet": { "this_room": "Tämä huone", @@ -156,5 +178,44 @@ "voice_recorder": { "swipe_to_cancel": "Peruuta pyyhkäisemällä", "not_supported_title": "Ei tuettu" + }, + "global": { + "save": "Tallenna", + "time": { + "recently": "juuri nyt" + }, + "notify": "Ilmoitus", + "show_less": "Näytä vähemmän", + "show_more": "Näytä lisää" + }, + "poll_create": { + "create": "Julkaise", + "answer_label_n": "Vastaus", + "poll_submit": "Lähetä" + }, + "emoji": { + "categories": { + "objects": "Kohteet", + "nature": "Tyyppi", + "symbols": "Symbolit", + "activity": "Aktiviteetti", + "flags": "Liput", + "places": "Sijainnit" + }, + "search": "Etsi..." + }, + "getlink": { + "next": "Seuraava", + "continue": "Jatka" + }, + "notification": { + "dialog": { + "enable": "Ota käyttöön" + } + }, + "file_mode": { + "sending_progress": "Lähetetään…", + "close": "Sulje", + "files": "Tiedostot" } } From 043d2ff9c2aae43aece03e14cba2ba9969c9e1ee Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 19 Mar 2024 19:02:12 +0100 Subject: [PATCH 45/68] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/ --- src/assets/translations/bo.json | 3 +-- src/assets/translations/de.json | 1 - src/assets/translations/es.json | 3 +-- src/assets/translations/fi.json | 1 - src/assets/translations/fr.json | 1 - src/assets/translations/it.json | 1 - src/assets/translations/nb_NO.json | 1 - src/assets/translations/pt_BR.json | 1 - src/assets/translations/ro.json | 3 +-- src/assets/translations/ug.json | 3 +-- src/assets/translations/zh_Hans.json | 1 - 11 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/assets/translations/bo.json b/src/assets/translations/bo.json index 2453ebc..4bfc96a 100644 --- a/src/assets/translations/bo.json +++ b/src/assets/translations/bo.json @@ -139,8 +139,7 @@ "device_list": { "not_verified": "ར་སྤྲོད་བྱས་མི་འདུག", "verified": "ར་སྤྲོད་བྱས་ཟིན།", - "blocked": "བཀག་ཚར།", - "title": "ཡོ་ཆས་ཁག" + "blocked": "བཀག་ཚར།" }, "room_welcome": { "info_permissions": "ཁྱེད་ཀྱིས་ག་དུས་ཡིན་ཡང་སྒྲིག་བཀོད་ཀྱི་ཁོངས་ནས་ཁ་བརྡ་ཁང་གི་'ནང་འཛུལ་གྱི་ཆོག་མཆན'ལ་འགྱུར་བ་གཏོང་ཆོག", diff --git a/src/assets/translations/de.json b/src/assets/translations/de.json index 6b53811..472943e 100644 --- a/src/assets/translations/de.json +++ b/src/assets/translations/de.json @@ -112,7 +112,6 @@ "options": "Optionen" }, "device_list": { - "title": "GERÄTE", "blocked": "Blockiert", "verified": "Verifiziert", "not_verified": "Nicht verifiziert" diff --git a/src/assets/translations/es.json b/src/assets/translations/es.json index bf2e25c..92e66ae 100644 --- a/src/assets/translations/es.json +++ b/src/assets/translations/es.json @@ -126,8 +126,7 @@ "device_list": { "not_verified": "No ha sido Verificado", "verified": "Verificado", - "blocked": "Bloqueado", - "title": "DISPOSITIVOS" + "blocked": "Bloqueado" }, "new_room": { "status_avatar": "Subiendo avatar: {count}", diff --git a/src/assets/translations/fi.json b/src/assets/translations/fi.json index 611df45..1f6cab8 100644 --- a/src/assets/translations/fi.json +++ b/src/assets/translations/fi.json @@ -50,7 +50,6 @@ "language_display_name": "suomi", "device_list": { "verified": "Vahvistettu", - "title": "LAITTEET", "blocked": "Estetty", "not_verified": "Ei vahvistettu" }, diff --git a/src/assets/translations/fr.json b/src/assets/translations/fr.json index 19cbbb0..2ef576b 100644 --- a/src/assets/translations/fr.json +++ b/src/assets/translations/fr.json @@ -107,7 +107,6 @@ "options": "Options" }, "device_list": { - "title": "APPAREILS", "not_verified": "Non vérifié", "blocked": "Bloqué", "verified": "Vérifié" diff --git a/src/assets/translations/it.json b/src/assets/translations/it.json index 1f37070..b3e581b 100644 --- a/src/assets/translations/it.json +++ b/src/assets/translations/it.json @@ -106,7 +106,6 @@ "options": "Opzioni" }, "device_list": { - "title": "DISPOSITIVI", "blocked": "Bloccato", "verified": "Verificato", "not_verified": "Non verificato" diff --git a/src/assets/translations/nb_NO.json b/src/assets/translations/nb_NO.json index f14d977..359e5e6 100644 --- a/src/assets/translations/nb_NO.json +++ b/src/assets/translations/nb_NO.json @@ -37,7 +37,6 @@ "images": "Bilder" }, "device_list": { - "title": "Enheter", "not_verified": "Ikke bekreftet", "verified": "Bekreftet", "blocked": "Blokkert" diff --git a/src/assets/translations/pt_BR.json b/src/assets/translations/pt_BR.json index d5e71a1..ee61997 100644 --- a/src/assets/translations/pt_BR.json +++ b/src/assets/translations/pt_BR.json @@ -174,7 +174,6 @@ "options": "Opções" }, "device_list": { - "title": "DISPOSITIVOS", "blocked": "Bloqueado", "verified": "Verificado", "not_verified": "Não verificado" diff --git a/src/assets/translations/ro.json b/src/assets/translations/ro.json index b496fc7..02b0c34 100644 --- a/src/assets/translations/ro.json +++ b/src/assets/translations/ro.json @@ -147,8 +147,7 @@ "device_list": { "not_verified": "Nu a fost verificat", "verified": "Verificat", - "blocked": "Blocat", - "title": "DEVICES" + "blocked": "Blocat" }, "new_room": { "status_avatar": "Încărcarea avatarului: {count}", diff --git a/src/assets/translations/ug.json b/src/assets/translations/ug.json index fa2b695..599862c 100644 --- a/src/assets/translations/ug.json +++ b/src/assets/translations/ug.json @@ -225,8 +225,7 @@ "device_list": { "not_verified": "دەلىللەنمىدى", "verified": "دەلىللەندى", - "blocked": "چەكلەنگەن", - "title": "ئۈسكۈنىلەر" + "blocked": "چەكلەنگەن" }, "global": { "save": "ساقلاش", diff --git a/src/assets/translations/zh_Hans.json b/src/assets/translations/zh_Hans.json index cbea3a8..5d5d87a 100644 --- a/src/assets/translations/zh_Hans.json +++ b/src/assets/translations/zh_Hans.json @@ -78,7 +78,6 @@ "send_token": "发送令牌" }, "device_list": { - "title": "设备", "not_verified": "未验证", "verified": "已验证", "blocked": "被封锁" From 38cf24dd85074ff46fb20e9246eae462099446ef Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:04:55 +0000 Subject: [PATCH 46/68] Translated using Weblate (Tibetan) Currently translated at 94.4% (342 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/bo/ --- src/assets/translations/bo.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/bo.json b/src/assets/translations/bo.json index 4bfc96a..88591bc 100644 --- a/src/assets/translations/bo.json +++ b/src/assets/translations/bo.json @@ -43,7 +43,8 @@ "file_mode": "ཡིག་ཆའི་རྣམ་པ།", "direct_link_desc": "བརྒྱུད་སྐུར་བྱེད་པར་གྲ་སྒྲིག་ཡིན། མི་ཞིག་གིས་འབྲེལ་ཐག་དེ་ཁ་འབྱེད་ཐེངས་རེར། ང་དང་ཐད་ཀར་གླེང་མོལ་བྱ་སའི་ཁ་བརྡ་ཁང་ཞིག་གི་སྒོ་འབྱེད་ངེས།", "copy_link": "འབྲེལ་ཐག་པར་བཤུས་རྒྱོབས།", - "make_public": "ཡོངས་ཁྱབ་བཟོས།" + "make_public": "ཡོངས་ཁྱབ་བཟོས།", + "message_retention_1_hour": "ཆུ་ཚོད་ ༡" }, "invite": { "done": "ལེགས་འགྲུབ།", From 808bb2b6be33946def02b04f089e269d3f5f07c6 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:05:59 +0000 Subject: [PATCH 47/68] Translated using Weblate (Uyghur) Currently translated at 48.0% (174 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/ug/ --- src/assets/translations/ug.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/ug.json b/src/assets/translations/ug.json index 599862c..7f3c373 100644 --- a/src/assets/translations/ug.json +++ b/src/assets/translations/ug.json @@ -166,7 +166,8 @@ "permissions": "ئىجازەتكە قوشۇلۇڭ", "created_by": "{ئىشلەتكۈچى قۇرغان", "title": "ياتاق تەپسىلاتلىرى", - "room_type_default": "كۆڭۈلدىكى" + "room_type_default": "كۆڭۈلدىكى", + "message_retention_none": "تاقاق" }, "goodbye": { "view_other_rooms": "باشقا ئۆيلەرنى كۆرۈڭ", From 992d0736d4728b292205b44ac0ad6771fb406a1d Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:07:47 +0000 Subject: [PATCH 48/68] Translated using Weblate (Spanish) Currently translated at 96.1% (348 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/es/ --- src/assets/translations/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/es.json b/src/assets/translations/es.json index 92e66ae..f7e9888 100644 --- a/src/assets/translations/es.json +++ b/src/assets/translations/es.json @@ -265,7 +265,8 @@ "user_make_moderator": "Hacer moderador", "user_make_admin": "Hacer administrador", "user_revoke_moderator": "Revocar al moderador", - "delete_now": "Elimina ahora" + "delete_now": "Elimina ahora", + "user_kick_and_ban": "Expulsar" }, "fallbacks": { "download_name": "Descargar", From 6774ce993238b2a415888369cfa212994831206d Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:04:49 +0000 Subject: [PATCH 49/68] Translated using Weblate (Romanian) Currently translated at 61.3% (222 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/ro/ --- src/assets/translations/ro.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/ro.json b/src/assets/translations/ro.json index 02b0c34..07cc552 100644 --- a/src/assets/translations/ro.json +++ b/src/assets/translations/ro.json @@ -60,7 +60,10 @@ "user_admin": "Administrator", "copy_link": "Copiază link-ul", "user_moderator": "Moderator", - "room_type_default": "Predefinit" + "room_type_default": "Predefinit", + "message_retention_none": "Dezactivat", + "message_retention_1_day": "1 zi", + "message_retention_1_hour": "O oră" }, "goodbye": { "view_other_rooms": "Vezi alte camere", From dcdc459e823db6a114b981a71707a2c96efc758f Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:02:29 +0000 Subject: [PATCH 50/68] Translated using Weblate (Portuguese (Brazil)) Currently translated at 98.3% (356 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/pt_BR/ --- src/assets/translations/pt_BR.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/pt_BR.json b/src/assets/translations/pt_BR.json index ee61997..245d3cb 100644 --- a/src/assets/translations/pt_BR.json +++ b/src/assets/translations/pt_BR.json @@ -55,7 +55,9 @@ "user_make_moderator": "Tornar moderador", "user_make_admin": "Tornar administrador", "user_revoke_moderator": "Revogar moderador", - "delete_now": "Excluir agora" + "delete_now": "Excluir agora", + "direct_chat": "Conversa direta", + "user_kick_and_ban": "Expulsar" }, "message": { "you": "Você", @@ -306,7 +308,13 @@ "room_type_default": "Padrão", "file_mode": "Modo de arquivo", "direct_link": "Meu link direto", - "direct_link_desc": "Ele está pronto para ser compartilhado! Uma nova sala com contato direto com você será aberta sempre que alguém abrir o link." + "direct_link_desc": "Ele está pronto para ser compartilhado! Uma nova sala com contato direto com você será aberta sempre que alguém abrir o link.", + "message_retention_1_day": "1 dia", + "message_retention_none": "Não", + "message_retention_2_week": "2 semanas", + "message_retention_1_week": "1 semana", + "message_retention_8_hours": "8 horas", + "message_retention_1_hour": "1 hora" }, "room_info_sheet": { "this_room": "Esta sala", From 5479fbb4ad891e5eaca48ed887c5889f5e166d89 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:03:34 +0000 Subject: [PATCH 51/68] Translated using Weblate (German) Currently translated at 72.0% (261 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/de/ --- src/assets/translations/de.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/de.json b/src/assets/translations/de.json index 472943e..1bf5e4b 100644 --- a/src/assets/translations/de.json +++ b/src/assets/translations/de.json @@ -17,7 +17,9 @@ "join": "Beitreten", "ignore": "Ignorieren", "loading": "{appName} wird geladen", - "done": "Fertig" + "done": "Fertig", + "user_kick_and_ban": "Hinauswerfen", + "direct_chat": "Privater Chat" }, "message": { "you": "Du", @@ -221,7 +223,12 @@ "user_moderator": "Moderator*innen", "room_type_default": "Vorgabe", "user_admin": "Administrator", - "copy_link": "Link kopieren" + "copy_link": "Link kopieren", + "message_retention_2_week": "2 Wochen", + "message_retention_1_week": "1 Woche", + "message_retention_1_day": "1 Tag", + "message_retention_8_hours": "8 Stunden", + "message_retention_1_hour": "1 Stunde" }, "room_info_sheet": { "this_room": "Dieser Raum", From 00dee5b33cee601353aafc74ae9c7dc5ab26756d Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:07:24 +0000 Subject: [PATCH 52/68] Translated using Weblate (Italian) Currently translated at 61.8% (224 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/it/ --- src/assets/translations/it.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/it.json b/src/assets/translations/it.json index b3e581b..0fda653 100644 --- a/src/assets/translations/it.json +++ b/src/assets/translations/it.json @@ -72,7 +72,9 @@ "logout": "Esci", "new_room": "Nuova stanza", "loading": "Caricamento di {appName}", - "done": "Fatto" + "done": "Fatto", + "user_kick_and_ban": "Espelli", + "direct_chat": "Chat diretta" }, "room_welcome": { "info": "Benvenuto/a! Ecco alcune cose da sapere sulla tua stanza:", @@ -210,7 +212,11 @@ "user_admin": "Amministratore", "copy_link": "Copy link", "user_moderator": "Moderatore/Moderatrice", - "room_type_default": "Predefinito" + "room_type_default": "Predefinito", + "message_retention_none": "Off", + "message_retention_1_day": "1 giorno", + "message_retention_8_hours": "8 ore", + "message_retention_1_hour": "1 ora" }, "voice_recorder": { "failed_to_record": "Impossibile registrare l’audio", From aa237dc15bb965019e2ca6c6c2c78c126f3720af Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:26:21 +0000 Subject: [PATCH 53/68] Translated using Weblate (Chinese (Simplified)) Currently translated at 96.4% (349 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/zh_Hans/ --- src/assets/translations/zh_Hans.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/zh_Hans.json b/src/assets/translations/zh_Hans.json index 5d5d87a..7f53100 100644 --- a/src/assets/translations/zh_Hans.json +++ b/src/assets/translations/zh_Hans.json @@ -43,7 +43,11 @@ "file_mode": "文件模式", "direct_link_desc": "已准备好分享了! 每次有人打开链接时,会打开一个新的直接聊天室。", "copy_link": "复制链接", - "make_public": "公开" + "make_public": "公开", + "message_retention_none": "关闭", + "message_retention_1_day": "1 天", + "message_retention_8_hours": "8 小时", + "message_retention_1_hour": "1 小时" }, "leave": { "leave": "离开", @@ -181,7 +185,9 @@ "undo": "撤销", "user_make_admin": "设为管理员", "user_make_moderator": "设为版主", - "user_revoke_moderator": "撤销版主身份" + "user_revoke_moderator": "撤销版主身份", + "direct_chat": "私聊", + "user_kick_and_ban": "退出" }, "power_level": { "restricted": "被限制", From 30400807600313f704b7ef55dd73def55526c6da Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:07:51 +0000 Subject: [PATCH 54/68] Translated using Weblate (Spanish) Currently translated at 100.0% (362 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/es/ --- src/assets/translations/es.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/es.json b/src/assets/translations/es.json index f7e9888..e618c55 100644 --- a/src/assets/translations/es.json +++ b/src/assets/translations/es.json @@ -38,7 +38,13 @@ "download_chat": "Descargar el chat", "make_public": "Hacer público", "voice_mode_info": "Cambia la interfaz del chat al modo \"escuchar y grabar\"", - "export_room": "Exportar el chat" + "export_room": "Exportar el chat", + "message_retention_none": "Apagado", + "message_retention_2_week": "2 semanas", + "message_retention_1_week": "1 semana", + "message_retention_1_day": "1 día", + "message_retention_8_hours": "8 horas", + "message_retention_1_hour": "Una hora" }, "purge_room": { "button": "Borrar", @@ -266,7 +272,8 @@ "user_make_admin": "Hacer administrador", "user_revoke_moderator": "Revocar al moderador", "delete_now": "Elimina ahora", - "user_kick_and_ban": "Expulsar" + "user_kick_and_ban": "Expulsar", + "direct_chat": "Chat directo" }, "fallbacks": { "download_name": "Descargar", From b4df087c3bc0fa8f7fb7622a3f78fed5a9f4ca29 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Tue, 19 Mar 2024 20:44:41 +0000 Subject: [PATCH 55/68] Translated using Weblate (Spanish) Currently translated at 100.0% (362 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/es/ --- src/assets/translations/es.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/es.json b/src/assets/translations/es.json index e618c55..78aa6bc 100644 --- a/src/assets/translations/es.json +++ b/src/assets/translations/es.json @@ -44,7 +44,12 @@ "message_retention_1_week": "1 semana", "message_retention_1_day": "1 día", "message_retention_8_hours": "8 horas", - "message_retention_1_hour": "Una hora" + "message_retention_1_hour": "Una hora", + "message_retention_4_week": "4 semanas", + "shared_room_number": "Compartes {count} salas con {name}", + "shared_room_number_more": "Compartes más de {count} y salas con {name}", + "message_retention": "Historial de mensajes", + "message_retention_info": "Los mensajes enviados dentro de este plazo pueden ser vistos por cualquiera que tenga el enlace." }, "purge_room": { "button": "Borrar", From d5d66935a53673f8d4edfbf37deb4ba873185067 Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:26:11 +0000 Subject: [PATCH 56/68] Translated using Weblate (Sinhala) Currently translated at 19.0% (69 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/si/ --- src/assets/translations/si.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/translations/si.json b/src/assets/translations/si.json index 9de8c57..da64fdd 100644 --- a/src/assets/translations/si.json +++ b/src/assets/translations/si.json @@ -35,7 +35,9 @@ "user_moderator": "Moderator", "room_type_default": "පෙරනිමිය", "hide_all": "සඟවන්න", - "copy_link": "Copy link" + "copy_link": "Copy link", + "message_retention_none": "ඕෆ් කරන්න", + "message_retention_1_day": "දවස් 1" }, "leave": { "go_back": "Go back", From da73b993dc29f6980e1408df8e80be924cd9b3ff Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:28:14 +0000 Subject: [PATCH 57/68] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 45.0% (163 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/nb_NO/ --- src/assets/translations/nb_NO.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/nb_NO.json b/src/assets/translations/nb_NO.json index 359e5e6..9bfb2aa 100644 --- a/src/assets/translations/nb_NO.json +++ b/src/assets/translations/nb_NO.json @@ -74,7 +74,13 @@ "room_type_default": "Default", "user_admin": "administrator", "user_moderator": "Moderator", - "copy_link": "Kopier link" + "copy_link": "Kopier link", + "message_retention_none": "Av", + "message_retention_2_week": "To uker", + "message_retention_1_week": "1 uke", + "message_retention_1_day": "1 dag", + "message_retention_8_hours": "åtte timer", + "message_retention_1_hour": "Én time" }, "goodbye": { "view_other_rooms": "Vis andre rom", @@ -174,7 +180,8 @@ "start_private_chat": "Privat sludring med denne brukeren", "join": "Ta del", "ignore": "Ignorer", - "done": "Ferdig" + "done": "Ferdig", + "user_kick_and_ban": "Kast ut" }, "language_display_name": "Norsk", "global": { From e1864c983d5ec6a69f21a97097c1f0747ff76c4d Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:22:24 +0000 Subject: [PATCH 58/68] Translated using Weblate (French) Currently translated at 63.2% (229 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/fr/ --- src/assets/translations/fr.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/fr.json b/src/assets/translations/fr.json index 2ef576b..7c44359 100644 --- a/src/assets/translations/fr.json +++ b/src/assets/translations/fr.json @@ -16,7 +16,9 @@ "reply": "Répondre", "download": "Télécharger", "delete": "Supprimer", - "done": "Terminé" + "done": "Terminé", + "user_kick_and_ban": "Exclure", + "user_make_admin": "Rendre administrateur" }, "language_display_name": "français", "message": { @@ -212,7 +214,13 @@ "room_type_default": "Défaut", "user_admin": "Administrator", "copy_link": "Copy link", - "user_moderator": "Modérateur⋅ice" + "user_moderator": "Modérateur⋅ice", + "message_retention_none": "Inactif", + "message_retention_2_week": "2 semaines", + "message_retention_1_week": "1 semaine", + "message_retention_1_day": "1 jour", + "message_retention_8_hours": "8 heures", + "message_retention_1_hour": "1 heure" }, "room_info_sheet": { "this_room": "Ce salon", From 9660b3528e1acb6cd0d645607805cf6594b7df2e Mon Sep 17 00:00:00 2001 From: Weblate Translation Memory Date: Tue, 19 Mar 2024 18:24:15 +0000 Subject: [PATCH 59/68] Translated using Weblate (Finnish) Currently translated at 45.3% (164 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/fi/ --- src/assets/translations/fi.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/fi.json b/src/assets/translations/fi.json index 1f6cab8..f930350 100644 --- a/src/assets/translations/fi.json +++ b/src/assets/translations/fi.json @@ -16,7 +16,9 @@ "undo": "Kumoa", "join": "Liity", "loading": "{appName} ladataan", - "done": "Valmis" + "done": "Valmis", + "direct_chat": "Yksityiskeskustelu", + "user_kick_and_ban": "Poista" }, "new_room": { "create": "Luo", @@ -164,7 +166,11 @@ "join_public": "Kuka tahansa, jolla on linkki", "copy_link": "Kopioi linkki", "user_admin": "Ylläpitäjä", - "user_moderator": "Moderaattori" + "user_moderator": "Moderaattori", + "message_retention_none": "Pois päältä", + "message_retention_1_day": "1 päivä", + "message_retention_8_hours": "8 tuntia", + "message_retention_1_hour": "1 tunti" }, "power_level": { "restricted": "rajoitettu", From b5821ba809ad493bcacf7d9c15d49ea991bb1e24 Mon Sep 17 00:00:00 2001 From: Wellington Terumi Uemura Date: Fri, 22 Mar 2024 23:52:09 +0000 Subject: [PATCH 60/68] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (362 of 362 strings) Translation: Guardian Project/Keanu Weblite Translate-URL: https://hosted.weblate.org/projects/guardianproject/keanu-weblite/pt_BR/ --- src/assets/translations/pt_BR.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/assets/translations/pt_BR.json b/src/assets/translations/pt_BR.json index 245d3cb..b1ae3d4 100644 --- a/src/assets/translations/pt_BR.json +++ b/src/assets/translations/pt_BR.json @@ -53,7 +53,7 @@ "ignore": "Ignore", "loading": "Carregando {appName}", "user_make_moderator": "Tornar moderador", - "user_make_admin": "Tornar administrador", + "user_make_admin": "Tornar admin", "user_revoke_moderator": "Revogar moderador", "delete_now": "Excluir agora", "direct_chat": "Conversa direta", @@ -314,7 +314,12 @@ "message_retention_2_week": "2 semanas", "message_retention_1_week": "1 semana", "message_retention_8_hours": "8 horas", - "message_retention_1_hour": "1 hora" + "message_retention_1_hour": "1 hora", + "message_retention": "Histórico da mensagem", + "message_retention_info": "As mensagens enviadas dentro desse período podem ser visualizadas por qualquer pessoa que tenha o link.", + "message_retention_4_week": "4 semanas", + "shared_room_number": "Você compartilha {count} quartos com {name}", + "shared_room_number_more": "Você compartilha mais de {count} quartos com {name}" }, "room_info_sheet": { "this_room": "Esta sala", From e3df54159274c260b065833a3edf738c3e2e91ab Mon Sep 17 00:00:00 2001 From: 10G Meow <10gmeow@gmail.com> Date: Sun, 24 Mar 2024 11:35:05 +0200 Subject: [PATCH 61/68] drop AvatarOperations and use UserProfileDialog in Chat view --- src/assets/css/chat.scss | 13 +-- src/components/Chat.vue | 93 ++++--------------- src/components/ChatHeader.vue | 20 ---- src/components/RoomExport.vue | 4 +- src/components/RoomInfo.vue | 6 +- ...ActionDialog.vue => UserProfileDialog.vue} | 71 +++++++++----- src/components/chatMixin.js | 2 - src/components/messages/AvatarOperations.vue | 37 -------- 8 files changed, 75 insertions(+), 171 deletions(-) rename src/components/{MemberActionDialog.vue => UserProfileDialog.vue} (74%) delete mode 100644 src/components/messages/AvatarOperations.vue diff --git a/src/assets/css/chat.scss b/src/assets/css/chat.scss index f47a278..3822fdf 100644 --- a/src/assets/css/chat.scss +++ b/src/assets/css/chat.scss @@ -740,8 +740,7 @@ body { } } -.message-operations-strut, -.avatar-operations-strut { +.message-operations-strut { position: relative; height: 0px; z-index: 10; @@ -757,16 +756,6 @@ body { white-space: nowrap; } -.avatar-operations { - position: absolute; - width: fit-content; - background-color: white; - height: 40px; - border-radius: 20px; - padding: 0px 20px; - box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.15); -} - .send-options { z-index: 11; // Above mic button } diff --git a/src/components/Chat.vue b/src/components/Chat.vue index 3ea47df..074a15c 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -46,14 +46,6 @@ />
-
- -
- @@ -324,6 +316,12 @@ + @@ -332,7 +330,6 @@ import Vue from "vue"; import { TimelineWindow, EventTimeline } from "matrix-js-sdk"; import util, { ROOM_TYPE_VOICE_MODE, ROOM_TYPE_FILE_MODE } from "../plugins/utils"; import MessageOperations from "./messages/MessageOperations.vue"; -import AvatarOperations from "./messages/AvatarOperations.vue"; import ChatHeader from "./ChatHeader"; import ChatHeaderPrivate from "./ChatHeaderPrivate.vue"; import VoiceRecorder from "./VoiceRecorder"; @@ -342,6 +339,7 @@ import DirectChatWelcomeHeader from "./DirectChatWelcomeHeader"; import NoHistoryRoomWelcomeHeader from "./NoHistoryRoomWelcomeHeader.vue"; import MessageOperationsBottomSheet from "./MessageOperationsBottomSheet"; import StickerPickerBottomSheet from "./StickerPickerBottomSheet"; +import UserProfileDialog from "./UserProfileDialog.vue" import BottomSheet from "./BottomSheet.vue"; import ImageResize from "image-resize"; import CreatePollDialog from "./CreatePollDialog.vue"; @@ -399,10 +397,10 @@ export default { MessageOperationsBottomSheet, StickerPickerBottomSheet, BottomSheet, - AvatarOperations, CreatePollDialog, AudioLayout, - FileDropLayout + FileDropLayout, + UserProfileDialog }, data() { @@ -432,8 +430,6 @@ export default { showNoRecordingAvailableDialog: false, showContextMenu: false, showContextMenuAnchor: null, - showAvatarMenu: false, - showAvatarMenuAnchor: null, initialLoadDone: false, loading: false, // Set this to true during long operations to show a "spinner" overlay showRecorder: false, @@ -489,7 +485,8 @@ export default { /** * A timer to handle message retention/auto deletion */ - retentionTimer: null + retentionTimer: null, + showProfileDialog: false }; }, @@ -521,7 +518,7 @@ export default { if (this.retentionTimer) { clearInterval(this.retentionTimer); this.retentionTimer = null; - } + } }, destroyed() { @@ -530,6 +527,10 @@ export default { }, computed: { + compActiveMember() { + const currentUserId= this.selectedEvent?.sender.userId || this.$matrix.currentUserId + return this.joinedAndInvitedMembers.find(({userId}) => userId === currentUserId) + }, nonImageFiles() { return this.isCurrentFileInputsAnArray && this.currentFileInputs.filter(file => !file?.type.includes("image/")) }, @@ -615,30 +616,6 @@ export default { showMessageOperations() { return this.selectedEvent && this.showContextMenu; }, - avatarOpStyle() { - // Calculate where to show the context menu. - // - const ref = this.selectedEvent && this.$refs[this.selectedEvent.getId()]; - var top = 0; - var left = "unset"; - var right = "unset"; - if (ref && ref[0]) { - if (this.showAvatarMenuAnchor) { - var rectAnchor = this.showAvatarMenuAnchor.getBoundingClientRect(); - var rectChat = this.$refs.avatarOperationsStrut.getBoundingClientRect(); - top = rectAnchor.top - rectChat.top; - if (this.$vuetify.rtl) { - right = (rectAnchor.right - rectChat.right)+ "px"; - } else { - left = (rectAnchor.left - rectChat.left) + "px"; - } - // if (left + 250 > rectChat.right) { - // left = rectChat.right - 250; // Pretty ugly, but we want to make sure it does not escape the screen, and we don't have the exakt width of it (yet)! - // } - } - } - return "top:" + top + "px;left:" + left + ";right:" + right; - }, canRecordAudio() { return util.browserCanRecordAudio(); }, @@ -910,7 +887,7 @@ export default { if (this.retentionTimer) { clearInterval(this.retentionTimer); this.retentionTimer = null; - } + } }, removeTimedOutEvents(events) { @@ -921,7 +898,7 @@ export default { } return events.filter((e) => { if (maxLifetime > 0 && !e.isState()) { // Keep all state events - return e.getLocalAge() < maxLifetime; + return e.getLocalAge() < maxLifetime; } return true; }); @@ -1700,50 +1677,20 @@ export default { showAvatarMenuForEvent(e) { const event = e.event; this.selectedEvent = event; - this.showAvatarMenu = true; - this.showAvatarMenuAnchor = e.anchor; + + this.showProfileDialog = true }, viewProfile() { this.$navigation.push({ name: "Profile" }, 1); }, - startPrivateChat(e) { - this.loading = true; - this.$matrix - .getOrCreatePrivateChat(e.event.getSender()) - .then((room) => { - this.$nextTick(() => { - this.$navigation.push( - { - name: "Chat", - params: { - roomId: util.sanitizeRoomId(room.getCanonicalAlias() || room.roomId), - }, - }, - -1 - ); - }); - }) - .catch((err) => { - console.error(err); - }) - .finally(() => { - this.loading = false; - }); - }, - closeContextMenusIfOpen(e) { if (this.showContextMenu) { this.showContextMenu = false; this.showContextMenuAnchor = null; e.preventDefault(); } - if (this.showAvatarMenu) { - this.showAvatarMenu = false; - this.showAvatarMenuAnchor = null; - e.preventDefault(); - } }, /** Stop Read Receipt timer */ diff --git a/src/components/ChatHeader.vue b/src/components/ChatHeader.vue index c9b4f8d..e075d06 100644 --- a/src/components/ChatHeader.vue +++ b/src/components/ChatHeader.vue @@ -120,26 +120,6 @@ export default { room() { return this.$matrix.currentRoom; }, - memberAvatar() { - let roomMember; - if (this.room) { - this.room.getMembers().forEach(member => { - if (this.room.name === member.name) { - roomMember = member; - } - }); - if (roomMember) { - return roomMember.getAvatarUrl( - this.$matrix.matrixClient.getHomeserverUrl(), - 40, - 40, - "scale", - true - ); - } - } - return null; - }, notifications() { return this.$matrix.joinedRooms.some(r => (r.roomId !== this.$matrix.currentRoomId && r.getCanonicalAlias() !== this.$matrix.currentRoomId) && r.getUnreadNotificationCount("total") > 0) || this.$matrix.invites.length > 0; diff --git a/src/components/RoomExport.vue b/src/components/RoomExport.vue index 6f7b872..865954c 100644 --- a/src/components/RoomExport.vue +++ b/src/components/RoomExport.vue @@ -84,7 +84,6 @@ import RoomEncrypted from "./messages/RoomEncrypted.vue"; import RoomDeletionNotice from "./messages/RoomDeletionNotice.vue"; import DebugEvent from "./messages/DebugEvent.vue"; import MessageOperations from "./messages/MessageOperations.vue"; -import AvatarOperations from "./messages/AvatarOperations.vue"; import ChatHeader from "./ChatHeader.vue"; import VoiceRecorder from "./VoiceRecorder.vue"; import RoomInfoBottomSheet from "./RoomInfoBottomSheet.vue"; @@ -141,7 +140,6 @@ export default { MessageOperationsBottomSheet, StickerPickerBottomSheet, BottomSheet, - AvatarOperations, CreatePollDialog, }, props: { @@ -264,7 +262,7 @@ export default { if (parentEvent) { Vue.set(parentEvent, "isMxThread", true); Vue.set(event, "parentThread", parentEvent); - } + } }); this.events.filter(event => (event.replyEventId && !event.replyEvent)).forEach(event => { const parentEvent = this.timelineSet.findEventById(event.replyEventId) || this.room.findEventById(event.replyEventId); diff --git a/src/components/RoomInfo.vue b/src/components/RoomInfo.vue index 236b753..ea19a15 100644 --- a/src/components/RoomInfo.vue +++ b/src/components/RoomInfo.vue @@ -266,7 +266,7 @@ {{ $t("room_info.version_info", { version: buildVersion }) }} -
- - {{ - activeMember.name.substring(0, 1).toUpperCase() - }} + + {{ firstLetterUserName }}
{{ - activeMember.userId == $matrix.currentUserId + isCurrentUser ? $t("room_info.user_you", { - user: activeMemberName(activeMember) + user: activeMemberNameComp }) : $t("room_info.user", { - user: activeMemberName(activeMember) + user: activeMemberNameComp }) }} - + {{ $t("room_info.user_admin") }} - + {{ $t("room_info.user_moderator") }}
@@ -43,18 +42,18 @@ $vuetify.icons.direct_chat {{ $t("menu.direct_chat") }} -
- +
+ $vuetify.icons.kickout {{ $t("menu.user_kick_and_ban") }}
- + $vuetify.icons.make_admin {{ $t("menu.user_make_admin") }} - + $vuetify.icons.make_moderator {{ $t("menu.user_make_moderator") }} - + $vuetify.icons.revoke {{ $t("menu.user_revoke_moderator") }}
@@ -67,7 +66,7 @@ import DeviceList from "../components/DeviceList"; import util from "../plugins/utils"; export default { - name: "MemberActionDialog", + name: "UserProfileDialog", mixins: [roomInfoMixin], components: { DeviceList @@ -80,7 +79,10 @@ export default { }, }, activeMember: { - type: Object + type: Object, + default: function () { + return null; + } } }, data() { @@ -89,6 +91,36 @@ export default { }; }, computed: { + canRevokeModeratorComp () { + return this.canRevokeModerator(this.activeMember) + }, + isModeratorComp() { + return this.isModerator(this.activeMember) + }, + canMakeModeratorComp() { + return this.canMakeModerator(this.activeMember) + }, + canMakeAdminComp() { + return this.canMakeAdmin(this.activeMember) + }, + canBanUserComp() { + return this.canBanUser(this.activeMember) + }, + isAdminComp() { + return this.isAdmin(this.activeMember) + }, + activeMemberNameComp() { + return this.activeMember.user ? this.activeMember.user.displayName : this.activeMember.name + }, + isCurrentUser() { + return this.activeMember.userId == this.$matrix.currentUserId + }, + firstLetterUserName() { + return this.activeMember.name.substring(0, 1).toUpperCase() + }, + memberAvatarComp() { + return this.memberAvatar(this.activeMember) + }, joinedMembersByRoomId() { const joinedRooms = this.$matrix.joinedRooms.filter(room => !this.$matrix.isDirectRoom(room)) || []; return joinedRooms.map(room => ({ @@ -120,9 +152,6 @@ export default { }, methods: { - activeMemberName(activeMember) { - return activeMember.user ? activeMember.user.displayName : activeMember.name - }, startPrivateChat(userId) { this.$matrix .getOrCreatePrivateChat(userId) diff --git a/src/components/chatMixin.js b/src/components/chatMixin.js index ce4b85b..95e3e7f 100644 --- a/src/components/chatMixin.js +++ b/src/components/chatMixin.js @@ -38,7 +38,6 @@ import RoomTopicChanged from "./messages/RoomTopicChanged.vue"; import RoomAvatarChanged from "./messages/RoomAvatarChanged.vue"; import RoomHistoryVisibility from "./messages/RoomHistoryVisibility.vue"; import MessageOperations from "./messages/MessageOperations.vue"; -import AvatarOperations from "./messages/AvatarOperations.vue"; import ChatHeader from "./ChatHeader"; import VoiceRecorder from "./VoiceRecorder"; import RoomInfoBottomSheet from "./RoomInfoBottomSheet"; @@ -100,7 +99,6 @@ export default { MessageOperationsBottomSheet, StickerPickerBottomSheet, BottomSheet, - AvatarOperations, CreatePollDialog, }, methods: { diff --git a/src/components/messages/AvatarOperations.vue b/src/components/messages/AvatarOperations.vue deleted file mode 100644 index 509ce2d..0000000 --- a/src/components/messages/AvatarOperations.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - \ No newline at end of file From 9f93aa6bad9ad1beadc750c6933c5db33983e80b Mon Sep 17 00:00:00 2001 From: 10G Meow <10gmeow@gmail.com> Date: Sun, 24 Mar 2024 12:23:15 +0200 Subject: [PATCH 62/68] Add badges to the member list for moderators and admin --- src/assets/css/chat.scss | 13 +++++++++++++ src/components/RoomInfo.vue | 17 +++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/assets/css/chat.scss b/src/assets/css/chat.scss index 3822fdf..0e7541e 100644 --- a/src/assets/css/chat.scss +++ b/src/assets/css/chat.scss @@ -993,6 +993,19 @@ body { } } + .user-icon-with-badge { + display: inline; + + .user-badge { + border: 0.5px solid rgba(0, 0, 0, 0.1); + position: absolute; + left: 35px; + top: 30px; + background: #FFFFFF; + padding: 10px; + } + } + .show-all { color: black; font-size: 14 * $chat-text-size; diff --git a/src/components/RoomInfo.vue b/src/components/RoomInfo.vue index ea19a15..59ec98d 100644 --- a/src/components/RoomInfo.vue +++ b/src/components/RoomInfo.vue @@ -214,12 +214,17 @@ @click="onListItemClick(member)" >
- - - {{ - member.name.substring(0, 1).toUpperCase() - }} - +
+ + + {{ + member.name.substring(0, 1).toUpperCase() + }} + + + {{ `$vuetify.icons.${isAdmin(member)? 'make_admin' : 'make_moderator'}` }} + +
{{ member.userId == $matrix.currentUserId From 73561b84086f7e7092ad97d5f048d32fd0a9a8c3 Mon Sep 17 00:00:00 2001 From: 10G Meow <10gmeow@gmail.com> Date: Sun, 24 Mar 2024 13:58:05 +0200 Subject: [PATCH 63/68] UserProfileDialog padding top and profile view background alignment --- src/assets/css/_variables.scss | 1 + src/assets/css/chat.scss | 5 +++-- src/components/UserProfileDialog.vue | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/assets/css/_variables.scss b/src/assets/css/_variables.scss index bb3aa64..ea510aa 100644 --- a/src/assets/css/_variables.scss +++ b/src/assets/css/_variables.scss @@ -4,6 +4,7 @@ $app-background: #f6f6f6; $main-desktop-width: 900px; $dialog-desktop-width: 940px; $very-very-purple: #536dfe; +$lighter-gray: #FDFBF9; $chat-background: $background; $chat-standard-padding: 32px; diff --git a/src/assets/css/chat.scss b/src/assets/css/chat.scss index 0e7541e..7a9d668 100644 --- a/src/assets/css/chat.scss +++ b/src/assets/css/chat.scss @@ -911,7 +911,7 @@ body { } .room-info { - background-color: #FDFBF9; + background-color: $lighter-gray; height: 100%; .chat-header { @@ -1090,7 +1090,7 @@ body { } .profile { - background-color: #e8e8e8; + background-color: $lighter-gray; height: 100%; .chat-header { background-color: transparent; @@ -1100,6 +1100,7 @@ body { .v-card { background-color: white; border-radius: 20px; + box-shadow: 0px 0px 6px 0px rgba(0, 0, 0, 0.05) !important; } .user-info { diff --git a/src/components/UserProfileDialog.vue b/src/components/UserProfileDialog.vue index 6c8e316..deaf0ed 100644 --- a/src/components/UserProfileDialog.vue +++ b/src/components/UserProfileDialog.vue @@ -7,7 +7,7 @@ :width="$vuetify.breakpoint.smAndUp ? '688px' : '95%'" >
-
+
{{ firstLetterUserName }} From 0dc449feaa4c114855044edf9ee5f0c6d350e238 Mon Sep 17 00:00:00 2001 From: N-Pex Date: Wed, 3 Apr 2024 09:34:24 +0200 Subject: [PATCH 64/68] Add "createchannel" endpoint --- src/assets/css/{getlink.scss => create.scss} | 27 +- src/assets/translations/en.json | 13 +- src/components/CreateChannel.vue | 280 +++++++++++++++++++ src/components/GetLink.vue | 23 +- src/components/roomTypeMixin.js | 4 +- src/plugins/utils.js | 1 + src/router/index.js | 8 +- 7 files changed, 331 insertions(+), 25 deletions(-) rename src/assets/css/{getlink.scss => create.scss} (88%) create mode 100644 src/components/CreateChannel.vue diff --git a/src/assets/css/getlink.scss b/src/assets/css/create.scss similarity index 88% rename from src/assets/css/getlink.scss rename to src/assets/css/create.scss index e923559..5e696f8 100644 --- a/src/assets/css/getlink.scss +++ b/src/assets/css/create.scss @@ -1,16 +1,16 @@ @import "@/assets/css/main.scss"; -.getlink-root { +.create-root { background-color: $background; - .getlink-loggedin { + .create-loggedin { text-align: center; button { min-width: 200px !important; } } - .getlink-image { + .create-image { text-align: center; max-width: 325px; max-height: 257px; @@ -21,7 +21,18 @@ } } - .getlink-title { + .create-image-small { + text-align: center; + max-width: 72px; + max-height: 72px; + width: 100%; + .v-icon__component { + width: unset; + height: unset; + } + } + + .create-title { color: #000; text-align: center; font-family: "Poppins"; @@ -34,7 +45,7 @@ margin-top: 50px; } - .getlink-info { + .create-info { color: #000; text-align: center; font-feature-settings: "clig" off, "liga" off; @@ -47,7 +58,7 @@ margin: 15px 9px 40px 9px; } - .getlink-subtitle { + .create-subtitle { color: #000; text-align: center; font-feature-settings: "clig" off, "liga" off; @@ -95,7 +106,7 @@ color: black; } - .getlink-share { + .create-share { color: #161616; text-align: center; font-family: "Inter"; @@ -118,7 +129,7 @@ } } - .getlink-buttons { + .create-buttons { display: flex; align-items: center; flex-direction: column; diff --git a/src/assets/translations/en.json b/src/assets/translations/en.json index 84c2c60..fc99ded 100644 --- a/src/assets/translations/en.json +++ b/src/assets/translations/en.json @@ -137,7 +137,10 @@ "got_it": "Got it", "no_past_messages": "Welcome! For your security, past messages are not available.", "direct_info": "Hi, {you}. You’re in a private chat with {user}.", - "direct_private_chat": "Direct Message" + "direct_private_chat": "Direct Message", + "join_channel": "All set! Invite people to join you: {link}", + "info_retention": "🕓 Messages sent within {time} are viewable by anyone with the link.", + "change": "Change" }, "new_room": { "new_room": "New Room", @@ -202,6 +205,14 @@ "share_qr": "Share QR", "qr_image_copied": "Image copied to clipboard" }, + "createchannel": { + "title": "Create a Channel", + "info": "Broadcast news or knowledge in any format—video, podcast, text, pictures or PDFs.", + "channel_name": "Name your channel", + "channel_topic": "Describe it", + "name_required": "Channel name is required", + "error_channel": "Failed to create channel" + }, "profile": { "title": "My Profile", "temporary_identity": "This identity is temporary. Set a password to use it again", diff --git a/src/components/CreateChannel.vue b/src/components/CreateChannel.vue new file mode 100644 index 0000000..bcedf7b --- /dev/null +++ b/src/components/CreateChannel.vue @@ -0,0 +1,280 @@ + + + + + \ No newline at end of file diff --git a/src/components/GetLink.vue b/src/components/GetLink.vue index d062129..f78b884 100644 --- a/src/components/GetLink.vue +++ b/src/components/GetLink.vue @@ -1,9 +1,9 @@